Selaa lähdekoodia

IntroToRx 2nd edition (#2071)

* IntroToRx 2nd edition

---------

Co-authored-by: Howard van Rooijen <[email protected]>
Ian Griffiths 1 vuosi sitten
vanhempi
sitoutus
b9de686f6e
75 muutettua tiedostoa jossa 15790 lisäystä ja 11628 poistoa
  1. 22 2
      README.md
  2. 54 185
      Rx.NET/Documentation/IntroToRx/00_Foreword.md
  3. 122 241
      Rx.NET/Documentation/IntroToRx/01_WhyRx.md
  4. 584 488
      Rx.NET/Documentation/IntroToRx/02_KeyTypes.md
  5. 1300 0
      Rx.NET/Documentation/IntroToRx/03_CreatingObservableSequences.md
  6. 0 415
      Rx.NET/Documentation/IntroToRx/03_LifetimeManagement.md
  7. 0 874
      Rx.NET/Documentation/IntroToRx/04_CreatingObservableSequences.md
  8. 13 0
      Rx.NET/Documentation/IntroToRx/04_Part2.md
  9. 428 505
      Rx.NET/Documentation/IntroToRx/05_Filtering.md
  10. 0 404
      Rx.NET/Documentation/IntroToRx/06_Inspection.md
  11. 185 0
      Rx.NET/Documentation/IntroToRx/06_Transformation.md
  12. 475 525
      Rx.NET/Documentation/IntroToRx/07_Aggregation.md
  13. 499 0
      Rx.NET/Documentation/IntroToRx/08_Partitioning.md
  14. 0 777
      Rx.NET/Documentation/IntroToRx/08_Transformation.md
  15. 885 0
      Rx.NET/Documentation/IntroToRx/09_CombiningSequences.md
  16. 0 540
      Rx.NET/Documentation/IntroToRx/09_SideEffects.md
  17. 0 533
      Rx.NET/Documentation/IntroToRx/10_LeavingTheMonad.md
  18. 7 0
      Rx.NET/Documentation/IntroToRx/10_Part3.md
  19. 0 491
      Rx.NET/Documentation/IntroToRx/11_AdvancedErrorHandling.md
  20. 1047 0
      Rx.NET/Documentation/IntroToRx/11_SchedulingAndThreading.md
  21. 0 846
      Rx.NET/Documentation/IntroToRx/12_CombiningSequences.md
  22. 305 0
      Rx.NET/Documentation/IntroToRx/12_Timing.md
  23. 500 0
      Rx.NET/Documentation/IntroToRx/13_LeavingIObservable.md
  24. 0 1100
      Rx.NET/Documentation/IntroToRx/13_TimeShiftedSequences.md
  25. 210 0
      Rx.NET/Documentation/IntroToRx/14_ErrorHandlingOperators.md
  26. 0 510
      Rx.NET/Documentation/IntroToRx/14_HotAndColdObservables.md
  27. 403 0
      Rx.NET/Documentation/IntroToRx/15_PublishingOperators.md
  28. 0 1362
      Rx.NET/Documentation/IntroToRx/15_SchedulingAndThreading.md
  29. 717 846
      Rx.NET/Documentation/IntroToRx/16_TestingRx.md
  30. 0 653
      Rx.NET/Documentation/IntroToRx/17_SequencesOfCoincidence.md
  31. 0 74
      Rx.NET/Documentation/IntroToRx/18_UsageGuidelines.md
  32. 0 101
      Rx.NET/Documentation/IntroToRx/19_DispellingMyths.md
  33. 0 156
      Rx.NET/Documentation/IntroToRx/20_Disposables.md
  34. 25 0
      Rx.NET/Documentation/IntroToRx/A_IoStreams.md
  35. 93 0
      Rx.NET/Documentation/IntroToRx/B_Disposables.md
  36. 22 0
      Rx.NET/Documentation/IntroToRx/C_UsageGuidelines.md
  37. 593 0
      Rx.NET/Documentation/IntroToRx/D_AlgebraicUnderpinnings.md
  38. 152 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-Input-And-Output.svg
  39. 479 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-On-Offs.svg
  40. 108 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-Outstanding-Value.svg
  41. 142 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-Outstanding.svg
  42. 35 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles.ai
  43. 35 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Creating-Marbles.ai
  44. 18 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Sequence-CreateWrappers.ai
  45. 21 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Sequence-CreateWrappers.md
  46. 1950 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Sequence-CreateWrappers.svg
  47. 295 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch06-Transformation-Marbles-Select-Many-Marbles-Delay.svg
  48. 262 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch06-Transformation-Marbles-Select-Many-Marbles.svg
  49. 35 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch06-Transformation-Marbles.ai
  50. 127 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch08-Partitioning-Marbles-Buffer-Marbles.svg
  51. 715 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch08-Partitioning-Marbles-Status-Changes.svg
  52. 35 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch08-Partitioning-Marbles.ai
  53. 120 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles.svg
  54. 118 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles2.svg
  55. 78 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles3.svg
  56. 24 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Artboard 26.svg
  57. 123 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-CombineLatest-Marbles.svg
  58. 184 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles-SourceAndSub.svg
  59. 116 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles-SubOnly.svg
  60. 124 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles.svg
  61. 158 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles-Cold-Twice.svg
  62. 86 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles-Three.svg
  63. 114 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles.svg
  64. 422 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-GroupJoin-Marbles.svg
  65. 239 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Join-Marbles1.svg
  66. 172 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Join-Marbles2.svg
  67. 86 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Merge-Marbles-Multi.svg
  68. 98 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Merge-Marbles.svg
  69. 238 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Switch-Marbles-Bad-Merge.svg
  70. 213 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Switch-Marbles.svg
  71. 110 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Zip-Marbles.svg
  72. 35 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles.ai
  73. 34 0
      Rx.NET/Documentation/IntroToRx/GraphicsIntro/Marbles-Swatch.ai
  74. BIN
      Rx.NET/Resources/Artwork/title_page.png
  75. BIN
      Rx.NET/Resources/Artwork/title_page_sm.png

+ 22 - 2
README.md

@@ -10,6 +10,20 @@ This repository contains four libraries which are conceptually related in that t
 
 Each will be described later in this README.
 
+## FREE Introduction to Rx.NET 2nd Edition eBook
+
+<a href="https://introtorx.com/"><img align="left" alt="Introduction to Rx.NET 2nd Edition book cover." src="Rx.NET/Resources/Artwork/title_page_sm.png"/></a>
+
+Reactive programming provides clarity when our code needs to respond to events. The Rx.NET libraries were designed to enable cloud-native applications to process live data in reliable, predictable ways.
+
+We've written a FREE book which explains the vital abstractions that underpin Rx, and shows how to exploit the powerful and extensive functionality built into the Rx.NET libraries. 
+
+Based on Lee Campbell's 2010 book (kindly donated to the project), it has been re-written to bring it up to date with Rx.NET v6.0, .NET 8.0, and modern cloud native use cases such as IoT and real-time stream data processing.
+
+Introduction to Rx.NET is available [Online](https://introtorx.com/), [on GitHub](Rx.NET/Documentation/IntroToRx/), as [PDF](https://endjincdn.blob.core.windows.net/assets/ebooks/introduction-to-rx-dotnet/introduction-to-rx-dotnet-2nd-edition.pdf), and [EPUB](https://endjincdn.blob.core.windows.net/assets/ebooks/introduction-to-rx-dotnet/introduction-to-rx-dotnet-2nd-edition.epub).
+
+<br clear="left"/>
+
 ## Getting the bits
 
 Channel  | Rx | AsyncRx | Ix | System.Linq.Async
@@ -26,7 +40,6 @@ For nightly builds, configure NuGet to use this feed: `https://pkgs.dev.azure.co
 
 Catch us in the #rxnet channel over at http://reactiveui.net/slack
 
-
 ## A Brief Introduction to Rx
 
 In this digital age, live data streams are ubiquitous. Financial applications depend on a swift response to timely information. Computer networks have always been able to provide extensive information about their health and operation. Utility companies such as water providers have vast numbers of devices monitoring their operations. User interface and game building frameworks report user interactions in great detail. Delivery vans continuously report their progress. Aircraft provide performance telemetry to detect potential maintenance issues before they become serious problems, and cars are now starting to do the same. Many of us wear or carry devices that track our physical activity and even [vital signs](https://www.youtube.com/watch?v=6yjl_h7-WYA&t=2443s). And the improvements in machine learning have enriched the insights that can be derived from the ever-increasing volume and variety of live data.
@@ -60,7 +73,7 @@ The two key features of Rx are:
 
 Rx has been particularly successfully applied in user interfaces. (This is also true outside of .NET—[RxJS](https://rxjs.dev/) is a JavaScript spin-off of Rx, and it is very popular in user interface code.) The https://github.com/reactiveui/reactiveui makes deep use of Rx to support .NET UI development.
 
-To learn more, see this [Rx playlist](https://www.youtube.com/playlist?list=PLJt9xcgQpM60Fz20FIXBvj6ku4a7WOLGb).
+Ian Griffiths presented a concise 60 minute overview of [Reactive Extensions for .NET](https://endjin.com/what-we-think/talks/reactive-extensions-for-dotnet) at the dotnetsheff meetup in 2020. More videos are available on the [Rx playlist](https://www.youtube.com/playlist?list=PLJt9xcgQpM60Fz20FIXBvj6ku4a7WOLGb).
 
 ## AsyncRx.Net
 
@@ -140,6 +153,13 @@ Rx has been around for roughly a decade and a half, so we owe a great deal to it
 
 ## Roadmap
 
+As part of .NET Conf 2023, Ian Griffiths provided an update on the efforts to [modernize Rx.NET for v6.0 and the plans to for v7.0](https://endjin.com/what-we-think/talks/modernizing-reactive-extensions-for-dotnet). 
+
+For more information, see the following discussions:
+
+- [Future Rx.NET Packaging](https://github.com/dotnet/reactive/discussions/2038)
+- [Rx.NET v6.0 & v7.0 high-level plan](https://github.com/dotnet/reactive/discussions/1868)
+
 We have set out a [roadmap](Rx.NET/Documentation/Rx-Roadmap-2023.md) explaining our medium term plans for ongoing development of Rx. This diagram illustrates our view of the platforms on which Rx is used, and the planned support lifecycles for these various targets:
 
 ![The support lifecycle for various .NET platforms, represented as a set of timelines, showing the published plans for widely used versions that are current as of 2023, with a particular focus on which versions will be current as of November 2023. The top section of the diagram shows .NET releases starting with .NET 6.0 being released in November 2021, and shows for each subsequent release occurring in November of each subsequent year, up as far as .NET 13.0 in November 2028. It also shows that even-numbered releases are Long Term Support (LTS for short) releases, supported for 3 years, while odd-numbered releases are supported only for 18 months. The section beneath this shows that .NET Framework versions 4.7.2, 4.8.0, and 4.8.1 will all be in support as of November 2023, and will continue to be in support beyond the timescale covered by this diagram, i.e., beyond November 2028. The section beneath this shows the release plan for MAUI, starting with version 8.0 on November 2023, and subsequent releases at the same time each subsequent year, up to version 13.0 in November 2028. The diagram shows that each of these versions is supported for only 18 months. Beneath this is are two lines showing Xamarin iOS 16.0, and Xamarin Android 13.0 support being active on November 2023, and running for 18 months. Beneath this is a line showing UWP version 10.0.16299 support being active on November 2023, and running beyond the timescale covered by the diagram. Beneath this is a section showing that Unity 2021 was released in 2021, and will go out of support near the end of 2023, and it shows a Unity 2022 release labelled as "Release soon," with a release date somewhere in the middle of 2023. The bottom of the diagram shows the endjin logo, and endjin's corporate motto: "we help small teams achieve big things."](Rx.NET/Documentation/RX-Platform-Support-Roadmap.png ".NET Platform Support Roadmap")

+ 54 - 185
Rx.NET/Documentation/IntroToRx/00_Foreword.md

@@ -1,185 +1,54 @@
----
-title : Foreword
----
-
-#Introduction to Rx {#IntroductiontoRx .ignoreToc .kindleOnly}
-##Lee Campbell		{.ignoreToc .kindleOnly text-align=center}
-   
----
-
-#Preface {#Preface .SectionHeader}
-
-Reactive programming is not a new concept. I remember studying my first Event Driven
-module for Visual Basic 5 in 2000. Even then the technology (Visual Basic 5) was
-already considered somewhat dated. Long before VB5 and the turn of the millennium,
-we have seen languages supporting events. Over time languages like Smalltalk, Delphi
-and the .NET languages have popularized reactive or event-driven programming paradigms.
-This not to say that events are pass&eacute;: current trends such as CEP (Complex
-Event Processing), CQRS (Command Query Responsibility Segregation) and rich immersive
-GUIs, all have events as a fundamental part of their makeup.
-
-The event driven paradigm allows for code to be invoked without the need for breaking
-encapsulation or applying expensive polling techniques. This is commonly implemented
-with the Observer pattern, events exposed directly in the language (e.g. C#) or
-other forms of callback via delegate registration. The Reactive Extensions extend
-the callback metaphor with LINQ to enable querying sequences of events and managing
-concurrency.
-
-The Reactive Extensions are effectively a library of implementations of the `IObservable<T>`
-and `IObserver<T>` interfaces for .NET, Silverlight and Windows Phone7. 
-The libraries are also available in JavaScript. As a dynamic language, JavaScript
-had no need for the two interfaces so the JavaScript implementation could have been
-written long before .NET 4 was released. This book will introduce Rx via C#. Users
-of VB.NET, F# and other .NET languages hopefully will be able to extract the concepts
-and translate them to their particular language. JavaScript users should be able
-to gather the concepts from this book and apply them to their language. JavaScript
-users may however find some features are not supported, and some concepts, such
-as scheduling do not transcend platforms.
-
-As Rx is just a library, the team at Microsoft delivering Rx was able to isolate
-themselves from the release schedule of the .NET Framework. This proved important
-as the libraries saw fairly constant evolution since late 2009 through to their
-official release in mid 2011. This evolution has been largely enabled by the openness
-of the team and their ability to take onboard criticisms, suggestions and feature
-requests from the brave community of pre-release users.
-
-While Rx is _just a library_, it is a significant and bold move forward for
-the team at Microsoft and for any consumers of the library. Rx _will_ change
-the way you design and build software for the following reasons:
-
-  *  The way that it tackles the Observer pattern is a divorce from .NET events toward a Java-style interface pattern but far more refined.
-  *  The way it tackles concurrency is quite a shift how many .NET developers would have done it before.
-  * The abundance of (extension) methods in the library.
-  * The way in which it integrates with LINQ to leverage LINQ's composability &amp;	declarative style, makes Rx very usable and discoverable to those already familiar with LINQ and `IEnumerable<T>`.
-  * The way it can help any .NET developer that works with event driven and/or asynchronous programs. Developers of Rich Clients, Web Clients and Services alike can all benefit from Rx.
-  * The future plans seem even grander, but that is a different book for some time in the future :-)
-
-This book aims to teach you:
-
-  * about the new types that Rx will provide 
-  * about the extension methods and how to use them
-  * how to manage subscriptions to "sequences" of data
-  * how to visualize "sequences" of data and sketch your solution before coding it
-  * how to deal with concurrency to your advantage and avoid common pitfalls
-  * how to compose, aggregate and transform streams
-  * how to test your Rx code
-  * some guidance on best practices when using Rx.
-    
-The best way to learn Rx is to use it. Reading the theory from this book will only
-help you be familiar with Rx, but will not really enable you to fully understand
-Rx. You can download the latest version of Rx from the Microsoft Data Developer
-site (<http://msdn.microsoft.com/en-us/data/gg577609>)
-or if you use NuGet you can just download Rx via that.
-
-
-My experience with Rx is straight from the trenches. I worked on a team of exceptional
-developers on a project that was an early adopter of Rx (late 2009). The project
-was a financial services application that started off life as a Silverlight project
-then expanded into an integration project. We used Rx everywhere; client side in
-Silverlight 3/4, and server side in .NET 3.5/4.0. We used Rx eagerly and sometimes
-too eagerly. We were past leading edge, we were _bleeding_ edge. We were finding
-bugs in the early releases and posting proposed fixes to the guys at Microsoft.
-We were constantly updating to the latest version. It cost the project to be early
-adopters, but in time the payment was worth it. Rx allowed us to massively simplify
-an application that was inherently asynchronous, highly concurrent and targeted
-low latencies. Similar workflows that I had written in previous projects were pages
-of code long; now with Rx were several lines of LINQ. Trying to test asynchronous
-code on clients (WPF/Win Forms/Silverlight) was a constant challenge, but Rx solved
-that too. Today if you ask a question on the Rx Forums, you will most likely be
-answered by someone from that team (or Dave Sexton).
-
-
-
-#Acknowledgements	{#Acknowledgements}
-
-I would like to take this quick pause to recognize the people that made this book
-possible. First is my poor wife for losing a husband to a dark room for several
-months. Her understanding and tolerance is much appreciated. To my old team "Alpha
-Alumni"; every developer on that team has helped me in some way to better myself
-as a developer. Specific mention goes to 
-[James Miles](http://enumeratethis.com/), 
-[Matt Barrett](http://weareadaptive.com/blog/), 
-[John Marks](http://johnhmarks.wordpress.com/), 
-Duncan Mole, 
-Cathal Golden, 
-[Keith Woods](http://keith-woods.com), 
-[Ray Booysen](http://nondestructiveme.com) &amp; 
-[Olivier DeHeurles](http://odeheurles.com/) 
-for all the deep dive sessions, emails, forum banter, BBM exchanges, lunch breaks 
-and pub sessions spent trying to get our heads around Rx. To 
-[Matt Davey](http://mdavey.wordpress.com) 
-for being brave enough to support us in using Rx back in 2009.
-To the team at Microsoft that did the hard work and brought us Rx; 
-[Jeffrey Van Gogh](http://blogs.msdn.com/b/jeffva/), 
-[Wes Dyer](http://blogs.msdn.com/b/wesdyer/), 
-[Erik Meijer](http://www.applied-duality.com/) &amp; 
-[Bart De Smet](http://blogs.bartdesmet.net/bart/). 
-Extra special mention to Bart, there is just something about the 
-[content](http://channel9.msdn.com/Tags/bart+de+smet) that Bart 
-[produces](http://www.infoq.com/author/Bart-De-Smet) that clicks with me. 
-Finally to the guys that helped edit the book; 
-[Joe Albahari](http://www.albahari.com/) 
-and Gregory Andrien. Joe is a veteran author of books such
-as the C# in a nutshell, C# pocket reference and LINQ pocket reference, and managed
-to find time to help out on this project while also releasing the latest versions
-of these books. For Gregory and I, this was a first for both of us, as editor and
-author respectively. Gregory committed many late nights to helping complete this
-project. There is also some sweet irony in having a French person as the editor.
-Even though English is not his native tongue, he clearly has a better grasp of it
-than I.
-
-
-It is my intention that from the experiences both good and bad, I can help speed
-up your understanding of Rx and lower that barrier to entry to using Rx. This will
-be a progressive step-by-step approach. It may seem slow in places, but the fundamentals
-are so important to have a firm grasp on the powerful features. I hope you will
-have the patience to join me all the way to the end.
-
-The content of this book was originally posted as a series of blog posts at 
-[http://LeeCampbell.blogspot.com](http://leecampbell.blogspot.co.uk/2010/08/reactive-extensions-for-net.html)
-and has proved popular enough that I thought it warranted being reproduced as an e-book. 
-In the spirit of other books such as
-Joe Albahari's [Threading in C#](http://www.albahari.com/threading/)
-and Scott Chacon's [Pro Git](http://git-scm.com/book) books, and considering
-the blog was free, I have made the first version of this book free.
-
-The version that this book has been written against is the .Net 4.0 targeted Rx
-assemblies version 1.0.10621.0 (NuGet: Rx-Main v1.0.11226).
-
-So, fire up Visual Studio and let's get started.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>
-
+# Introduction to Rx
+By Ian Griffiths and Lee Campbell
+   
+---
+
+Reactive programming is not a new concept. Any kind of user interface development necessarily involves code that responds to events. Languages like [Smalltalk](https://en.wikipedia.org/wiki/Smalltalk), [Delphi](https://en.wikipedia.org/wiki/Delphi_(software)) and the .NET languages have popularized reactive or event-driven programming paradigms. Architectural patterns such as [CEP (Complex Event Processing)](https://en.wikipedia.org/wiki/Complex_event_processing), and [CQRS (Command Query Responsibility Segregation)](https://en.wikipedia.org/wiki/Command_Query_Responsibility_Segregation) have events as a fundamental part of their makeup. Reactive programming is a useful concept in any program that has to deal with things happening.
+
+> Reactive programming is a useful concept in any program that has to deal with things happening.
+
+The event driven paradigm allows for code to be invoked without the need for breaking encapsulation or applying expensive polling techniques. There are many common ways to implement this, including the [Observer pattern](https://en.wikipedia.org/wiki/Observer_pattern), [events exposed directly in the language (e.g. C#)](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/events/) or other forms of callback via delegate registration. The Reactive Extensions extend the callback metaphor with LINQ to enable querying sequences of events and managing concurrency.
+
+The .NET runtime libraries have included the `IObservable<T>` and `IObserver<T>` interfaces that represent the core concept of reactive programming for well over a decade now. The Reactive Extensions for .NET (Rx.NET) are effectively a library of implementations of these interfaces. Rx.NET first appeared back in 2010 but since then, Rx libraries have become available for other languages, and this way of programming has become especially popular in JavaScript.
+
+This book will introduce Rx via C#. The concepts are universal, so users of other .NET languages such as VB.NET and F#, will be able to extract the concepts and translate them to their particular language.
+
+Rx.NET is just a library, originally created by Microsoft, but now an open source project supported entirely through community effort. (Rx's current lead maintainer, [Ian Griffiths](https://endjin.com/who-we-are/our-people/ian-griffiths/), is also the author of the latest revision of this book, and indeed the author of this very sentence.)
+
+If you have never used Rx before, it _will_ change the way you design and build software. It provides a well thought out abstraction for a fundamentally important idea in computing: sequences of events. These are as important as lists or arrays, but before Rx there was little direct support in libraries or languages, and what support there was tended to be rather ad hoc, and built on weak theoretical underpinnings. Rx changes that. The extent to which this Microsoft invention has been wholehearted adopted by some developer communities traditionally not especially Microsoft-friendly is a testament to the quality of its fundamental design.
+
+This book aims to teach you:
+
+  * about the types that Rx defines
+  * about the extension methods Rx provides, and how to use them
+  * how to manage subscriptions to event sources
+  * how to visualize "sequences" of data and sketch your solution before coding it
+  * how to deal with concurrency to your advantage and avoid common pitfalls
+  * how to compose, aggregate and transform streams
+  * how to test your Rx code
+  * some common best practices when using Rx
+    
+The best way to learn Rx is to use it. Reading the theory from this book will only help you be familiar with Rx, but to fully understand it you should build things with it. So we warmly encourage you to build based on the examples in this book.
+
+# Acknowledgements
+
+Firstly, I ([Ian Griffiths](https://endjin.com/who-we-are/our-people/ian-griffiths/)) should make it clear that this revised edition builds on the excellent work of the original author [Lee Campbell](https://github.com/LeeCampbell). I am grateful that he generously allowed the Rx.NET project to make use of his content, enabling this new edition to come into existence.
+
+I would also like to recognize the people that made this book possible.
+
+Thanks to everyone at [endjin](https://endjin.com) and especially [Howard van Rooijen](https://endjin.com/who-we-are/our-people/howard-van-rooijen/) and [Matthew Adams](https://endjin.com/who-we-are/our-people/matthew-adams/)
+for funding not only the updates to this book, but also the ongoing development of Rx.NET itself. (And thanks for employing me too!). Thanks also to [Felix Corke](https://www.blackspike.com/) for his work on the design elements of the [web edition of the book](https://introtorx.com).
+
+Crucial to the first edition of the book, in addition to the author, [Lee Campbell](https://leecampbell.com/), were: James Miles, Matt Barrett, [John Marks](https://johnhmarks.wordpress.com/), Duncan Mole, Cathal Golden, Keith Woods, Ray Booysen, Olivier DeHeurles, [Matt Davey](https://mdavey.wordpress.com), [Joe Albahari](https://www.albahari.com/) and Gregory Andrien. 
+
+Extra special thanks to the team at Microsoft that did the hard work and brought us Rx; [Jeffrey Van Gogh](https://www.linkedin.com/in/jeffrey-van-gogh-145673/), [Wes Dyer](https://www.linkedin.com/in/wesdyer/), [Erik Meijer](https://en.wikipedia.org/wiki/Erik_Meijer_%28computer_scientist%29) & [Bart De Smet](https://www.linkedin.com/in/bartdesmet/).
+
+Thanks also to those who continued to work on Rx.NET after it ceased to be directly supported by Microsoft, and became a community-based open source project. Many people were involved, and it's not practical to list every contributor here, but I'd like to say a particular thank you to [Bart De Smet](https://github.com/bartdesmet) (again, because he continued to work on the open source Rx long after moving onto other things internally at Microsoft) and also to [Claire Novotny](https://github.com/clairernovotny), [Daniel Weber](https://github.com/danielcweber), [David Karnok](https://github.com/akarnokd), [Brendan Forster](https://github.com/shiftkey), [Ani Betts](https://github.com/anaisbetts) and [Chris Pulman](https://www.linkedin.com/in/chrispulman/). We are also grateful to [Richard Lander](https://www.linkedin.com/in/richardlander/) and the [.NET Foundation](https://dotnetfoundation.org/) for helping us at [endjin](https://endjin.com) become the new stewards of the [Rx.NET project](https://github.com/dotnet/reactive), enabling it to continue to thrive.
+
+If you are interested in more information about the origins of Rx, you might find the [A Little History of Reaqtor](https://reaqtive.net/) ebook illuminating.
+
+The version that this book has been written against is `System.Reactive` version 6.0. The source for this book can be found at [https://github.com/dotnet/reactive/tree/main/Rx.NET/Documentation/IntroToRx](https://github.com/dotnet/reactive/tree/main/Rx.NET/Documentation/IntroToRx). If you find any bugs or other issues in this book, please [create an issue](https://github.com/dotnet/reactive/issues) at https://github.com/dotnet/reactive/. You might find the [Reactive X slack](reactivex.slack.com) to be a useful resource if you start using Rx.NET in earnest.
+
+So, fire up Visual Studio and let's get started.
+
+---

+ 122 - 241
Rx.NET/Documentation/IntroToRx/01_WhyRx.md

@@ -1,241 +1,122 @@
----
-title : Why Rx?
----
-
-#PART 1 - Getting started	{#PART1 .SectionHeader}
-
-#Why Rx?				{#WhyRx}
-
-Users expect real time data. 
-They want their tweets now. 
-Their order confirmed now.
-They need prices accurate as of now. 
-Their online games need to be responsive. 
-As a developer, you demand fire-and-forget messaging. 
-You don't want to be blocked waiting for a result. 
-You want to have the result pushed to you when it is ready.
-Even better, when working with result sets, you want to receive individual results as they are ready. 
-You do not want to wait for the entire set to be processed before you see the first row. 
-The world has moved to push; users are waiting for us to catch up.
-Developers have tools to push data, this is easy. 
-Developers need tools to react to push data.
-    
-Welcome to [Reactive Extensions for .NET](http://msdn.microsoft.com/en-us/devlabs/gg577609) (Rx). 
-This book is aimed at any .NET developer curious about the `IObservable<T>` and `IObserver<T>`
-        interfaces that have popped up in .NET 4. 
-The Reactive Extensions libraries from Microsoft are the implementations of these interfaces that are quickly picking up traction with Server, Client and Web developers alike. 
-Rx is a powerfully productive development tool.
-Rx enables developers to solve problems in an elegant, familiar and declarative style; often crucially with less code than was possible without Rx. 
-By leveraging LINQ, Rx gets to boast the standard benefits of a LINQ implementation<sup><a href="#reference1">1</a></sup>.
-    
-
-<dl>
-    <dt>Integrated</dt>
-    <dd>
-        LINQ is integrated into the C# language.
-    </dd>
-    <dt>Unitive</dt>
-    <dd>
-        Using LINQ allows you to leverage your existing skills for querying data at rest
-        (LINQ to SQL, LINQ to XML or LINQ to objects) to query data in motion. You could
-        think of Rx as LINQ to events. LINQ allows you to transition from other paradigms
-        into a common paradigm. For example you can transition a standard .NET event, an
-        asynchronous method call, a `Task` or perhaps a 3rd party middleware API
-        into a single common Rx paradigm. By leveraging our existing language of choice
-        and using familiar operators like `Select`, `Where`, `GroupBy`
-        etc, developers can rationalize and communicate designs or code in a common form.
-    </dd>
-    <dt>Extensible</dt>
-    <dd>
-        You can extend Rx with your own custom query operators (extension methods).
-    </dd>
-    <dt>Declarative</dt>
-    <dd>
-        LINQ allows your code to read as a declaration of _what_ your code does and
-        leaves the _how_ to the implementation of the operators.</dd>
-    <dt>Composable</dt>
-    <dd>
-        LINQ features, such as extension methods, lambda syntax and query comprehension
-        syntax, provide a fluent API for developers to consume. Queries can be constructed
-        with numerous operators. Queries can then be composed together to further produce
-        composite queries.</dd>
-    <dt>Transformative</dt>
-    <dd>
-        Queries can transform their data from one type to another. A query might translate
-        a single value to another value, aggregated from a sequence of values to a single
-        average value or expand a single data value into a sequence of values.
-    </dd>
-</dl>
-
-##When is Rx appropriate?		{#WhenRx}
-
-Rx offers a natural paradigm for dealing with sequences of events. 
-A sequence can contain zero or more events. 
-Rx proves to be most valuable when composing sequences of events.
-    
-
-###Should use Rx			{#Should}
-
-Managing events like these is what Rx was built for:
-
- * UI events like mouse move, button click
- * Domain events like property changed, collection updated, "Order Filled", "Registration accepted" etc.
- * Infrastructure events like from file watcher, system and WMI events
- * Integration events like a broadcast from a message bus or a push event from WebSockets API or other low latency middleware like [Nirvana](http://www.my-channels.com)
- * Integration with a CEP engine like [StreamInsight](http://www.microsoft.com/sqlserver/en/us/solutions-technologies/business-intelligence/complex-event-processing.aspx) or [StreamBase](http://www.streambase.com).
-
-Interestingly Microsoft's CEP product StreamInsight, which is part of the SQL Server family, also uses LINQ to build queries over streaming events of data.
-
-Rx is also very well suited for introducing and managing concurrency for the purpose of _offloading_. 
-That is, performing a given set of work concurrently to free up the current thread. 
-A very popular use of this is maintaining a responsive UI.
-
-You should consider using Rx if you have an existing `IEnumerable<T>`        that is attempting to model data in motion. 
-While `IEnumerable<T>` _can_ model data in motion (by using lazy evaluation like `yield return`), it probably won't scale. 
-Iterating over an `IEnumerable<T>` will consume/block a thread. 
-You should either favor the non-blocking nature of Rx via either `IObservable<T>` or consider the `async` features in .NET 4.5.
-    
-###Could use Rx					{#Could}
-
-Rx can also be used for asynchronous calls. 
-These are effectively sequences of one event.
-
- * Result of a `Task` or `Task<T>`
- * Result of an APM method call like `FileStream` BeginRead/EndRead
-
-You may find the using TPL, Dataflow or `async` keyword (.NET 4.5) proves to be a more natural way of composing asynchronous methods. 
-While Rx can definitely help with these scenarios, if there are other more appropriate frameworks at your disposal you should consider them first.
-
-Rx can be used, but is less suited for, introducing and managing concurrency for the purposes of _scaling_ or performing _parallel_ computations. 
-Other dedicated frameworks like TPL (Task Parallel Library) or C++ AMP are more appropriate for performing parallel compute intensive work.
-
-See more on TPL, Dataflow, `async` and C++ AMP at [Microsoft's Concurrency homepage](http://msdn.microsoft.com/en-us/concurrency).
-
-###Won't use Rx				{#Wont}
-
-Rx and specifically `IObservable<T>` is not a replacement for `IEnumerable<T>`.
-I would not recommend trying to take something that is naturally pull based and force it to be push based.
-
- * Translating existing `IEnumerable<T>` values to `IObservable<T>` just so that the code base can be "more Rx"
- * Message queues. 
-   Queues like in MSMQ or a JMS implementation generally have transactionality and are by definition sequential. 
-   I feel `IEnumerable<T>` is a natural fit for here.
-
-By choosing the best tool for the job your code should be easier to maintain, provide better performance and you will probably get better support.
-
-##Rx in action			{#RxInAction}
-
-Adopting and learning Rx can be an iterative approach where you can slowly apply it to your infrastructure and domain. 
-In a short time you should be able to have the skills to produce code, or reduce existing code, to queries composed of simple operators. 
-For example this simple ViewModel is all I needed to code to integrate a search that is to be executed as a user types.
-
-	public class MemberSearchViewModel : INotifyPropertyChanged
-	{
-		//Fields removed...
-		public MemberSearchViewModel(IMemberSearchModel memberSearchModel,
-			ISchedulerProvider schedulerProvider)
-		{
-			_memberSearchModel = memberSearchModel;
-			
-			//Run search when SearchText property changes
-			this.PropertyChanges(vm => vm.SearchText)
-				.Subscribe(Search);
-		}
-		
-		//Assume INotifyPropertyChanged implementations of properties...
-		public string SearchText { get; set; }
-		public bool IsSearching { get; set; }
-		public string Error { get; set; }
-		public ObservableCollection<string> Results { get; }
-
-		//Search on background thread and return result on dispatcher.
-		private void Search(string searchText)
-		{
-			using (_currentSearch) { }
-			IsSearching = true;
-			Results.Clear();
-			Error = null;
-
-			_currentSearch = _memberSearchModel.SearchMembers(searchText)
-				.Timeout(TimeSpan.FromSeconds(2))
-				.SubscribeOn(_schedulerProvider.TaskPool)
-				.ObserveOn(_schedulerProvider.Dispatcher)
-				.Subscribe(
-					Results.Add,
-					ex =>
-					{
-						IsSearching = false;
-						Error = ex.Message;
-					},
-					() => { IsSearching = false; });
-		}
-
-		...
-	}
-
-While this code snippet is fairly small it supports the following requirements:
-
- * Maintains a responsive UI
- * Supports timeouts
- * Knows when the search is complete
- * Allows results to come back one at a time
- * Handles errors
- * Is unit testable, even with the concurrency concerns
- * If a user changes the search, cancel current search and execute new search with new text.
- 
-To produce this sample is almost a case of composing the operators that match the requirements into a single query. 
-The query is small, maintainable, declarative and far less code than "rolling your own". 
-There is the added benefit of reusing a well tested API. 
-The less code _you_ have to write, the less code _you_ have to test, debug and maintain. 
-Creating other queries like the following is simple:
-    
- * calculating a moving average of a series of values e.g. *service level agreements* for average latencies or downtime
- * combining event data from multiple sources e.g.: *search results* from Bing,	Google and Yahoo, or *sensor data* from Accelerometer, Gyro, Magnetometer or temperatures
- * grouping data e.g. *tweets* by topic or user, or *stock prices* by delta	or liquidity*
- * filtering data e.g. *online game servers* within a region, for a specific game or with a minimum number of participants.
-
- 
-Push is here. 
-Arming yourself with Rx is a powerful way to meet users' expectations of a push world. 
-By understanding and composing the constituent parts of Rx you will be able to make short work of complexities of processing incoming events. 
-Rx is set to become a day-to-day part of your coding experience.
-   
-   
----
-
-<p class="comment">
-	<a name="reference1"></a><sup>1</sup>
-	<a href="http://www.amazon.co.uk/gp/product/B001XT616O/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1634&amp;creative=6738&amp;creativeASIN=B001XT616O&amp;linkCode=as2&amp;tag=int0b-21">Essential LINQ</a><img src="http://www.assoc-amazon.co.uk/e/ir?t=int0b-21&amp;l=as2&amp;o=2&amp;a=B001XT616O" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" class="webonly" />
-	 - Calvert, Kulkarni
-</p>
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Essential Linq Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B001XT616O&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>      
-	</div>
</div>
+# PART 1 - Getting started
+
+Rx is a .NET library for processing event streams. Why might you want that?
+
+## Why Rx?
+
+Users want timely information. If you're waiting for a parcel to arrive, live reports of the delivery van's progress give you more freedom than a suspect 2 hour delivery window. Financial applications depend on continuous streams of up-to-date data. We expect our phones and computers to provide us with all sorts of important notifications. And some applications simply can't work without live information. Online collaboration tools and multiplayer games absolutely depend on the rapid distribution and delivery of data.
+
+In short, our systems need to react when interesting things happen.
+
+Live information streams are a basic, ubiquitous element of computer systems. Despite this, they are often a second class citizen in programming languages. Most languages support sequences of data through something like an array, which presumes that the data is sitting in memory ready for our code to read at its leisure. If your application deals with events, arrays might work for historical data, but they aren't a good way to represent events that occur while the application is running. And although streamed data is a pretty venerable concept in computing, it tends to be clunky, with the abstractions often surfaced through APIs that are poorly integrated with our programming language's type system.
+
+This is bad. Live data is critical to a wide range of applications. It should be as easy to work with as lists, dictionaries, and other collections.
+
+The [Reactive Extensions for .NET](https://github.com/dotnet/reactive) (Rx.NET or Rx for short, available as the [`System.Reactive` NuGet package](https://www.nuget.org/packages/System.Reactive/)) elevate live data sources to first class citizens. Rx does not require any special programming language support. It exploits .NET's type system to represent streams of data in a way that .NET languages such as C#, F#, and VB.NET can all work with as naturally as they use collection types.
+
+(A brief grammatical aside: although the phrase "Reactive Extensions" is plural, when we reduce it to just Rx.NET or Rx, we treat it as a singular noun. This is inconsistent, but saying "Rx are..." sounds plain weird.)
+
+For example, C# offers integrated query features that we might use to find all of the entries in a list that meet some criteria. If we have some `List<Trade> trades` variable, we might write this:
+
+```csharp
+var bigTrades =
+    from trade in trades
+    where trade.Volume > 1_000_000;
+```
+
+With Rx, we could use this exact same code with live data. Instead of being a `List<Trade>`, the `trades` variable could be an `IObservable<Trade>`. `IObservable<T>` is the fundamental abstraction in Rx. It is essentially a live version of `IEnumerable<T>`. In this case, `bigTrades` would also be an `IObservable<Trade>`, a live data source able to notify us of all trades whose `Volume` exceeds one million. Crucially, it can report each such trade immediately—this is what we mean by a 'live' data source.
+
+Rx is a powerfully productive development tool. It enables developers to work with live event streams using language features familiar to all .NET developers. It enables a declarative approach that often allows us to express complex behaviour more elegantly and with less code than would be possible without Rx.
+
+Rx builds on LINQ (Language Integrated Query). This enables us to use the query syntax shown above (or you can use the explicit function call approach that some .NET developers prefer). LINQ is widely used in .NET both for data access (e.g., in Entity Framework Core), but also for working with in-memory collections (with LINQ to Objects), meaning that experienced .NET developers will tend to feel at home with Rx. Crucially, LINQ is a highly composable design: you can connect operators together in any combination you like, expressing potentially complex processing in a straightforward way. This composability arises from the mathematical foundations of its design, but although you can learn about this aspect of LINQ if you want, it's not a prerequisite: developers who aren't interested in the mathematics behind it can just enjoy the fact that LINQ providers such as Rx provide a set of building blocks that can be plugged together in endless different ways, and it all just works.
+
+LINQ has proven track record of handling high very high volumes of data. Microsoft has used it extensively in the internal implementation of some of their systems, including services that support tens of millions of active users.
+
+## When is Rx appropriate?
+
+Rx is designed for processing sequences of events, meaning that it suits some scenarios better than others. The next sections describe some of these scenarios, and also cases in which it is a less obvious match but still worth considering. Finally, we describe some cases in which it is possible to use Rx but where alternatives are likely to be better.
+
+### Good Fit with Rx
+
+Rx is well suited to representing events that originate from outside of your code, and which your application needs to respond to, such as:
+
+- Integration events like a broadcast from a message bus, or a push event from WebSockets API, or a message received via MQTT or other low latency middleware like [Azure Event Grid](https://azure.microsoft.com/en-gb/products/event-grid/), [Azure Event Hubs](https://azure.microsoft.com/en-gb/products/event-hubs/) and [Azure Service Bus](https://azure.microsoft.com/en-gb/products/service-bus/), or a non-vendor specific representation such as [cloudevents](https://cloudevents.io/)
+- Telemetry from monitoring devices such as a flow sensor in a water utility's infrastructure, or the monitoring and diagnostic features in a broadband provider's networking equipment
+- Location data from mobile systems such as [AIS](https://github.com/ais-dotnet/) messages from ships, or automotive telemetry
+- Operating system events such as filesystem activity, or WMI events
+- Road traffic information, such as notifications of accidents or changes in average speed
+- Integration with a [Complex Event Processing (CEP)](https://en.wikipedia.org/wiki/Complex_event_processing) engine
+- UI events such as mouse movement or button clicks
+
+Rx is also good way to model domain events. These may occur as a result of some of the events just described, but after processing them to produce events that more directly represent application concepts. These might include:
+
+- Property or state changes on domain objects such as "Order Status Updated", or "Registration Accepted"
+- Changes to collections of domain objects, such as "New Registration Created"
+
+Events might also represent insights derived from incoming events (or historical data being analyzed at a later date) such as:
+
+- A broadband customer might have become an unwitting participant in a DDoS attack
+- Two ocean-going vessels have engaged in a pattern of movement often associated with illegal activity (e.g., travelling closely alongside one another for an extended period, long enough to transfer cargo or people, while far out at sea)
+- [CNC](https://en.wikipedia.org/wiki/Numerical_control) [Milling Machine](https://en.wikipedia.org/wiki/Milling_(machining)) MFZH12's number 4 axis bearing is exhibiting signs of wear at a significantly higher rate than the nominal profile
+- If the user wants to arrive on time at their meeting half way across town, the current traffic conditions suggest they should leave in the next 10 minutes
+
+These three sets of examples show how applications might progressively increase the value of the information as they process events. We start with raw events, which we then enhance to produce domain-specific events, and we then perform analysis to produce notifications that the application's users will really care about. Each stage of processing increases the value of the messages that emerge. Each stage will typically also reduce the volume of messages. If we presented the raw events in the first category directly to users, they might be overwhelmed by the volume of messages, making it impossible to spot the important events. But if we only present them with notifications when our processing has detected something important, this will enable them to work more efficiently and accurately, because we have dramatically improved the signal to noise ratio.
+
+The [`System.Reactive` library](https://www.nuget.org/packages/System.Reactive) provides tools for building exactly this kind of value-adding process, in which we tame high-volume raw event sources to produce high-value, live, actionable insights. It provides a suite of operators that enable our code to express this kind of processing declaratively, as you'll see in subsequent chapters.
+
+Rx is also well suited for introducing and managing concurrency for the purpose of _offloading_. 
+That is, performing a given set of work concurrently, so that the thread that detected an event doesn't also have to be the thread that handles that event. 
+A very popular use of this is maintaining a responsive UI. (UI event handling has become _such_ a popular use of Rx—both in .NET. but also in [RxJS](https://rxjs.dev/), which originated as an offshoot of Rx.NET—that it would be easy to think that this is what it's for. But its success there should not blind us to its wider applicability.)
+
+You should consider using Rx if you have an existing `IEnumerable<T>` that is attempting to model live events. 
+While `IEnumerable<T>` _can_ model data in motion (by using lazy evaluation like `yield return`), there's a problem. If the code consuming the collection has reached the point where it wants the next item (e.g., because a `foreach` loop has just completed an iteration) but no item is yet available, the `IEnumerable<T>` implementation would have no choice but to block the calling thread in its `MoveNext` until such time as data is available, which can cause scalability problems in some applications. Even in cases where thread blocking is acceptable (or if you use the newer `IAsyncEnumerable<T>`, which can take advantage of C#'s `await foreach` feature to avoid blocking a thread in these cases) `IEnumerable<T>` and `IAsyncEnumerable<T>` are misleading types for representing live information sources. These interfaces represent a 'pull' programming model: code asks for the next item in the sequence. Rx is a more natural choice for modelling information sources that naturally produce information on their own schedule.
+
+### Possible Fit with Rx
+
+Rx can be used to represent asynchronous operations. .NET's `Task` or `Task<T>` effectively represent a single event, and `IObservable<T>` can be thought if as a generalization of this to a sequence of events. (The relationship between, say, `Task<int>` and `IObservable<int>` is similar to the relationship between `int` and `IEnumerable<int>`.)
+
+This means that there are some scenarios that can be dealt with either using tasks and the `async` keyword or through Rx. If at any point in your processing you need to deal with multiple values as well as single ones, Rx can do both; tasks don't handle multiple items so well. You can have a `Task<IEnumerable<int>>`, which enables you to `await` for a collection, and that's fine if all the items in the collection can be collected in a single step. The limitation with this is that once the task has produced its `IEnumerable<int>` result, your `await` has completed, and you're back to non-asynchronous iteration over that `IEnumerable<int>`. If the data can't be fetched in a single step—perhaps the `IEnumerable<int>` represents data from an API in which results are fetched in batches of 100 items at a time—its `MoveNext` will have to block your thread every time it needs to wait.
+
+For the first 5 years of its existence, Rx was arguably the best way to represent collections that wouldn't necessarily have all the items available immediately. However, the introduction of [`IAsyncEnumerable<T>`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.iasyncenumerable-1) in .NET Core 3.0 and C# 8 provided a way to handle sequences while remaining in the world of `async`/`await` (and the [`Microsoft.Bcl.AsyncInterfaces` NuGet package](https://www.nuget.org/packages/Microsoft.Bcl.AsyncInterfaces/) makes this available on .NET Framework and .NET Standard 2.0). So the choice to use Rx to now tends to boil down to whether a 'pull' model (exemplified by `foreach` or `await foreach`) or a 'push' model (in which code supplies callbacks to be invoked by the event source when items become available) is a better fit for the concepts being modelled.
+
+Another related feature that was added .NET since Rx first appears is [channels](https://learn.microsoft.com/en-us/dotnet/core/extensions/channels). These allow a source to produce object and a consumer to process them, so there's an obvious superficial similarity to Rx. However, a distinguishing feature of Rx is its support for composition with an extensive set of operators, something with no direct equivalent in channels. Channels on the other hand provide more options for adapting to variations in production and consumption rates.
+
+Earlier, I mentioned _offloading_: using Rx to push work onto other threads. Although this technique can enable Rx to introduce and manage concurrency for the purposes of _scaling_ or performing _parallel_ computations, other dedicated frameworks like [TPL (Task Parallel Library) Dataflow](https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/dataflow-task-parallel-library) or [PLINQ](https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/introduction-to-plinq) are more appropriate for performing parallel compute intensive work. However, TPL Dataflow offers some integration with Rx through its [`AsObserver`](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.dataflow.dataflowblock.asobserver) and [`AsObservable`](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.dataflow.dataflowblock.asobservable) extension methods. So it is common to use Rx to integrate TPL Dataflow with the rest of your application.
+
+### Poor Fit with Rx
+
+Rx's `IObservable<T>` is not a replacement for `IEnumerable<T>` or `IAsyncEnumerable<T>`. It would be a mistake to take something that is naturally pull based and force it to be push based.
+
+Also, there are some situations in which the simplicity of Rx's programming model can work against you. For example, some message queuing technologies such as MSMQ are by definition sequential, and thus might look like a good fit for Rx. However, they are often chosen for their transaction handling support. Rx does not have any direct way to surface transaction semantics, so in scenarios that require this you might be better off just working directly with the relevant technology's API. (That said, [Reaqtor](https://reaqtive.net/) adds durability and persistence to Rx, so you might be able to use that to integrate these kinds of queueing systems with Rx.)
+
+By choosing the best tool for the job your code should be easier to maintain, it will likely provide better performance and you will probably get better support.
+
+## Rx in action
+
+You can get up and running with a simple Rx example very quickly. If you have the .NET SDK installed, you can run the following at a command line:
+
+```ps1
+mkdir TryRx
+cd TryRx
+dotnet new console
+dotnet add package System.Reactive
+```
+
+Alternatively, if you have Visual Studio installed, create a new .NET Console project, and then use the NuGet package manager to add a reference to `System.Reactive`.
+
+This code creates an observable source (`ticks`) that produces an event once every second. The code also passes a handler to that source that writes a message to the console for each event:
+
+```csharp
+using System.Reactive.Linq;
+
+IObservable<long> ticks = Observable.Timer(
+    dueTime: TimeSpan.Zero,
+    period: TimeSpan.FromSeconds(1));
+
+ticks.Subscribe(
+    tick => Console.WriteLine($"Tick {tick}"));
+
+Console.ReadLine();
+```
+
+If this doesn't seem very exciting, it's because it's about as basic an example as it's possible to create, and at its heart, Rx has a very simple programming model. The power comes from composition—we can use the building blocks in the `System.Reactive` library to describe the processing that will takes us from raw, low-level events to high-value insights. But to do that, we must first understand [Rx's key types, `IObservable<T>` and `IObserver<T>`](02_KeyTypes.md).

+ 584 - 488
Rx.NET/Documentation/IntroToRx/02_KeyTypes.md

@@ -1,488 +1,584 @@
----
-title : Key Types
----
-
-
-#Key types		{#KeyTypes}
-
-To use a framework you need to have a familiarty with the key features and their benefits. 
-Without this you find yourself just pasting samples from forums and hacking code until it works, kind of. 
-Then the next poor developer to maintain the code base ha to try to figure out what the intention of your code base was. 
-Fate is only too kind when that maintenence developer is the same as the original developer.
-Rx is powerful, but also allows for a simplification of your code. 
-To write good Reactive code you have to know the basics.
-
-There are two key types to understand when working with Rx, and a subset of auxiliary types that will help you to learn Rx more effectively.
-The `IObserver<T>` and `IObservable<T>` form the fundamental building blocks for Rx, while implementations of `ISubject<Source, TResult>` reduce the learning curve for developers new to Rx.
-
-Many are familiar with LINQ and its many popular forms like LINQ to Objects, LINQ to SQL &amp; LINQ to XML. 
-Each of these common implementations allows you query _data at rest_; Rx offers the ability to query _data in motion_. 
-Essentially Rx is built upon the foundations of the [Observer](http://en.wikipedia.org/wiki/Observer_pattern) pattern. 
-.NET already exposes some other ways to implement the Observer pattern such as multicast delegates or events (which are usually multicast delegates). 
-Multicast delegates are not ideal however as they exhibit the following less desirable features;
-
-
- * In C#, events have a curious interface. Some find the `+=` and ` -=` operators an unnatural way to register a callback
- * Events are difficult to compose
- * Events don't offer the ability to be easily queried over time
- * Events are a common cause of accidental memory leaks
- * Events do not have a standard pattern for signaling completion
- * Events provide almost no help for concurrency or multithreaded applications. e.g. To raise an event on a separate thread requires you to do all of the plumbing
- 
-Rx looks to solve these problems. 
-Here I will introduce you to the building blocks and some basic types that make up Rx.
-
-##IObservable&lt;T&gt;			{#IObservable}
-    
-[`IObservable<T>`](http://msdn.microsoft.com/en-us/library/dd990377.aspx "IObservable(Of T) interface - MSDN") is one of the two new core interfaces for working with Rx. 
-It is a simple interface with just a [Subscribe](http://msdn.microsoft.com/en-us/library/dd782981(v=VS.100).aspx) method. 
-Microsoft is so confident that this interface will be of use to you it has been included in the BCL as of version 4.0 of .NET. 
-You should be able to think of anything that implements `IObservable<T>` as a streaming sequence of `T` objects. 
-So if a method returned an `IObservable<Price>` I could think of it as a stream of Prices.
-
-	//Defines a provider for push-based notification.
-	public interface IObservable<out T>
-	{
-		//Notifies the provider that an observer is to receive notifications.
-		IDisposable Subscribe(IObserver<T> observer);
-	}
-	
-
-<p class="comment">
-	.NET already has the concept of Streams with the type and sub types of `System.IO.Stream`.
-	The `System.IO.Stream` implementations are commonly used to stream data (generally bytes) to or from an I/O device like a file, network or block of memory. 
-	`System.IO.Stream` implementations can have both the ability to read and write, and sometimes the ability to seek (i.e. fast forward through a stream or move backwards). 
-	When I refer to an instance of `IObservable<T>` as a stream, it does not exhibit the seek or write functionality that streams do. 
-	This is a fundamental difference preventing Rx being built on top of the `System.IO.Stream` paradigm. 
-	Rx does however have the concept of forward streaming (push), disposing (closing) and completing (eof). 
-	Rx also extends the metaphor by introducing concurrency constructs, and query operations like transformation, merging, aggregating and expanding. 
-	These features are also not an appropriate fit for the existing `System.IO.Stream` types.
-	Some others refer to instances of `IObservable<T>` as Observable Collections, which I find hard to understand. 
-	While the observable part makes sense to me, I do not find them like collections at all. 
-	You generally cannot sort, insert or remove	items from an `IObservable<T>` instance like I would expect you can	with a collection. 
-	Collections generally have some sort of backing store like an internal array. 
-	The values from an `IObservable<T>` source are not usually pre-materialized as you would expect from a normal collection. 
-	There is also a type in WPF/Silverlight called an `ObservableCollection<T>`	that does exhibit collection-like behavior, and is very well suited to this description.
-	In fact `IObservable<T>` integrates very well with `ObservableCollection<T>` instances. 
-	So to save on any confusion we will refer to instances of `IObservable<T>` as *sequences*. 
-	While instances of `IEnumerable<T>` are also sequences,	we will adopt the convention that they are sequences of _data at rest_, and	`IObservable<T>` instances are sequences of _data in motion_.
-</p>
-
-##IObserver&lt;T&gt;			{#IObserver}
-
-[`IObserver<T>`](http://msdn.microsoft.com/en-us/library/dd783449.aspx "IObserver(Of T) interface - MSDN") is the other one of the two core interfaces for working with Rx. 
-It too has made it into the BCL as of .NET 4.0. 
-Don't worry if you are not on .NET 4.0 yet as the Rx team have included these two interfaces in a separate assembly for .NET 3.5 and Silverlight users. 
-`IObservable<T>` is meant to be the &quot;functional dual of `IEnumerable<T>`&quot;.
-If you want to know what that last statement means, then enjoy the hours of videos on [Channel9](http://channel9.msdn.com/tags/Rx/) where they discuss the mathematical purity of the types. 
-For everyone else it means that where an `IEnumerable<T>` can effectively yield three things (the next value, an exception or the end of the sequence), so too can `IObservable<T>` via `IObserver<T>`'s three methods `OnNext(T)`, `OnError(Exception)` and `OnCompleted()`.
-
-	//Provides a mechanism for receiving push-based notifications.
-	public interface IObserver<in T>
-	{
-		//Provides the observer with new data.
-		void OnNext(T value);
-		//Notifies the observer that the provider has experienced an error condition.
-		void OnError(Exception error);
-		//Notifies the observer that the provider has finished sending push-based notifications.
-		void OnCompleted();
-	}
-
-Rx has an implicit contract that must be followed. An implementation of `IObserver<T>` may have zero or more calls to `OnNext(T)` followed optionally by a call to either `OnError(Exception)` or `OnCompleted()`. 
-This protocol ensures that if a sequence terminates, it is always terminated by an `OnError(Exception)`, *or* an `OnCompleted()`. 
-This protocol does not however demand that an `OnNext(T)`, `OnError(Exception)` or `OnCompleted()` ever be called. 
-This enables to concept of empty and infinite sequences. 
-We will look into this more later.
-
-Interestingly, while you will be exposed to the `IObservable<T>` interface frequently if you work with Rx, in general you will not need to be concerned with `IObserver<T>`. 
-This is due to Rx providing anonymous implementations via methods like `Subscribe`.
-
-###Implementing IObserver&lt;T&gt; and IObservable&lt;T&gt;			{#ImplementingIObserverAndIObservable}
-
-It is quite easy to implement each interface. 
-If we wanted to create an observer that printed values to the console it would be as easy as this.
-
-	public class MyConsoleObserver<T> : IObserver<T>
-	{
-		public void OnNext(T value)
-		{
-			Console.WriteLine("Received value {0}", value);
-		}
-
-		public void OnError(Exception error)
-		{
-			Console.WriteLine("Sequence faulted with {0}", error);
-		}
-
-		public void OnCompleted()
-		{
-			Console.WriteLine("Sequence terminated");
-		}
-	}
-
-Implementing an observable sequence is a little bit harder. 
-An overly simplified implementation that returned a sequence of numbers could look like this.
-
-	public class MySequenceOfNumbers : IObservable<int>
-	{
-		public IDisposable Subscribe(IObserver<int> observer)
-		{
-			observer.OnNext(1);
-			observer.OnNext(2);
-			observer.OnNext(3);
-			observer.OnCompleted();
-			return Disposable.Empty;
-		}
-	}
-
-We can tie these two implementations together to get the following output
-
-	var numbers = new MySequenceOfNumbers();
-	var observer = new MyConsoleObserver<int>();
-	numbers.Subscribe(observer);
-
-Output:
-
-<div class="output">
-	<div class="line">Received value 1</div>
-	<div class="line">Received value 2</div>
-	<div class="line">Received value 3</div>
-	<div class="line">Sequence terminated</div>
-</div>
-
-
-The problem we have here is that this is not really reactive at all. 
-This implementation is blocking, so we may as well use an `IEnumerable<T>` implementation like a `List<T>` or an array.
-    
-This problem of implementing the interfaces should not concern us too much. 
-You will find that when you use Rx, you do not have the need to actually implement these interfaces, Rx provides all of the implementations you need out of the box. 
-Let's have a look at the simple ones.
-
-
-##Subject&lt;T&gt;			{#Subject}
-    
-I like to think of the `IObserver<T>` and the `IObservable<T>` as the 'reader' and 'writer' or, 'consumer' and 'publisher' interfaces. 
-If you were to create your own implementation of `IObservable<T>` you may find that while you want to publicly expose the IObservable characteristics you still need to be able to publish items to the subscribers, throw errors and notify when the sequence is complete. 
-Why that sounds just like the methods defined in `IObserver<T>`!
-While it may seem odd to have one type implementing both interfaces, it does make life easy. 
-This is what [subjects](http://msdn.microsoft.com/en-us/library/hh242969(v=VS.103).aspx "Using Rx Subjects - MSDN") can do for you. 
-[`Subject<T>`](http://msdn.microsoft.com/en-us/library/hh229173(v=VS.103).aspx "Subject(Of T) - MSDN") is the most basic of the subjects. 
-Effectively you can expose your `Subject<T>` behind a method that returns `IObservable<T>` but internally you can use the `OnNext`, `OnError` and `OnCompleted` methods to control the sequence.
-
-In this very basic example, I create a subject, subscribe to that subject and then publish values to the sequence (by calling `subject.OnNext(T)`).
-
-
-  static void Main(string[] args)
-  {
-	var subject = new Subject<string>();
-	WriteSequenceToConsole(subject);
-
-	subject.OnNext("a");
-	subject.OnNext("b");
-	subject.OnNext("c");
-	Console.ReadKey();
-  }
-  
-  //Takes an IObservable<string> as its parameter. 
-  //Subject<string> implements this interface.
-  static void WriteSequenceToConsole(IObservable<string> sequence)
-  {
-	//The next two lines are equivalent.
-	//sequence.Subscribe(value=>Console.WriteLine(value));
-	sequence.Subscribe(Console.WriteLine);
-  }
-
-
-Note that the `WriteSequenceToConsole` method takes an `IObservable<string>` as it only wants access to the subscribe method. 
-Hang on, doesn't the `Subscribe` method need an `IObserver<string>` as an argument? 
-Surely `Console.WriteLine` does not match that interface. 
-Well it doesn't, but the Rx team supply me with an Extension Method to `IObservable<T>` that just takes an [`Action<T>`](http://msdn.microsoft.com/en-us/library/018hxwa8.aspx "Action(Of T) Delegate - MSDN").
-The action will be executed every time an item is published. 
-There are [other overloads to the Subscribe extension method](http://msdn.microsoft.com/en-us/library/system.observableextensions(v=VS.103).aspx "ObservableExtensions class - MSDN") that allows you to pass combinations of delegates to be invoked for `OnNext`, `OnCompleted` and `OnError`. 
-This effectively means I don't need to implement `IObserver<T>`.
-Cool.
-
-As you can see, `Subject<T>` could be quite useful for getting started in Rx programming. 
-`Subject<T>` however, is a basic implementation. 
-There are three siblings to `Subject<T>` that offer subtly different implementations which can drastically change the way your program runs.
-
-<!--
-	TODO: ReplaySubject<T> - Rewrite second sentence. -GA
--->
-
-##ReplaySubject&lt;T&gt;			{#ReplaySubject}
-
-[`ReplaySubject<T>`](http://msdn.microsoft.com/en-us/library/hh211810(v=VS.103).aspx "ReplaySubject(Of T) - MSDN") provides the feature of caching values and then replaying them for any late subscriptions. 
-Consider this example where we have moved our first publication to occur before our subscription
-
-	static void Main(string[] args)
-	{
-	  var subject = new Subject<string>();
-
-	  subject.OnNext("a");
-	  WriteSequenceToConsole(subject);
-
-	  subject.OnNext("b");
-	  subject.OnNext("c");
-	  Console.ReadKey();
-	}
-
-The result of this would be that 'b' and 'c' would be written to the console, but 'a' ignored. 
-If we were to make the minor change to make subject a `ReplaySubject<T>` we would see all publications again.
-
-	var subject = new ReplaySubject<string>();
-
-	subject.OnNext("a");
-	WriteSequenceToConsole(subject);
-
-	subject.OnNext("b");
-	subject.OnNext("c");
-
-This can be very handy for eliminating race conditions. 
-Be warned though, the default constructor of the `ReplaySubject<T>` will create an instance that caches every value published to it. 
-In many scenarios this could create unnecessary memory pressure on the application. 
-`ReplaySubject<T>` allows you to specify simple cache expiry settings that can alleviate this memory issue. 
-One option is that you can specify the size of the buffer in the cache. 
-In this example we create the `ReplaySubject<T>` with a buffer size of 2, and so only get the last two values published prior to our subscription:
-    
-	public void ReplaySubjectBufferExample()
-	{
-		var bufferSize = 2;
-		var subject = new ReplaySubject<string>(bufferSize);
-
-		subject.OnNext("a");
-		subject.OnNext("b");
-		subject.OnNext("c");
-		subject.Subscribe(Console.WriteLine);
-		subject.OnNext("d");
-	}
-
-Here the output would show that the value 'a' had been dropped from the cache, but values 'b' and 'c' were still valid. 
-The value 'd' was published after we subscribed so it is also written to the console.
-    
-<div class="output">
-	<div class="line">Output:</div>
-	<div class="line">b</div>
-	<div class="line">c</div>
-	<div class="line">d</div>
-</div>
-
-Another option for preventing the endless caching of values by the `ReplaySubject<T>`, is to provide a window for the cache. 
-In this example, instead of creating a `ReplaySubject<T>` with a buffer size, we specify a window of time that the cached values are valid for.
-
-	public void ReplaySubjectWindowExample()
-	{
-		var window = TimeSpan.FromMilliseconds(150);
-		var subject = new ReplaySubject<string>(window);
-
-		subject.OnNext("w");
-		Thread.Sleep(TimeSpan.FromMilliseconds(100));
-		subject.OnNext("x");
-		Thread.Sleep(TimeSpan.FromMilliseconds(100));
-		subject.OnNext("y");
-		subject.Subscribe(Console.WriteLine);
-		subject.OnNext("z");
-	}
-
-In the above example the window was specified as 150 milliseconds. 
-Values are published 100 milliseconds apart. 
-Once we have subscribed to the subject, the first value	is 200ms old and as such has expired and been removed from the cache.
-
-<div class="output">
-	<div class="line">Output:</div>
-	<div class="line">x</div>
-	<div class="line">y</div>
-	<div class="line">z</div>
-</div>
-
-##BehaviorSubject&lt;T&gt;			{#BehaviorSubject}
-
-[`BehaviorSubject<T>`](http://msdn.microsoft.com/en-us/library/hh211949(v=VS.103).aspx "BehaviorSubject(Of T) - MSDN") is similar to `ReplaySubject<T>` except it only remembers the last publication. 
-`BehaviorSubject<T>` also requires you to provide it a default value of `T`. 
-This means that all subscribers will receive a value immediately (unless it is already completed).
-
-In this example the value 'a' is written to the console:
-
-	public void BehaviorSubjectExample()
-	{
-		//Need to provide a default value.
-		var subject = new BehaviorSubject<string>("a");
-		subject.Subscribe(Console.WriteLine);
-	}
-
-In this example the value 'b' is written to the console, but not 'a'.
-
-	public void BehaviorSubjectExample2()
-	{
-	  var subject = new BehaviorSubject<string>("a");
-	  subject.OnNext("b");
-	  subject.Subscribe(Console.WriteLine);
-	}
-
-In this example the values 'b', 'c' &amp; 'd' are all written to the console, but again not 'a'
-
-	public void BehaviorSubjectExample3()
-	{
-	  var subject = new BehaviorSubject<string>("a");
-
-	  subject.OnNext("b");
-	  subject.Subscribe(Console.WriteLine);
-	  subject.OnNext("c");
-	  subject.OnNext("d");
-	}
-
-Finally in this example, no values will be published as the sequence has completed.
-Nothing is written to the console.
-
-	public void BehaviorSubjectCompletedExample()
-	{
-	  var subject = new BehaviorSubject<string>("a");
-	  subject.OnNext("b");
-	  subject.OnNext("c");
-	  subject.OnCompleted();
-	  subject.Subscribe(Console.WriteLine);
-	}
-
-That note that there is a difference between a `ReplaySubject<T>` with a buffer size of one (commonly called a 'replay one subject') and a `BehaviorSubject<T>`.
-A `BehaviorSubject<T>` requires an initial value. 
-With the assumption that neither subjects have completed, then you can be sure that the `BehaviorSubject<T>` will have a value. 
-You cannot be certain with the `ReplaySubject<T>` however. 
-With this in mind, it is unusual to ever complete a `BehaviorSubject<T>`. 
-Another difference is that a replay-one-subject will still cache its value once it has been completed.
-So subscribing to a completed `BehaviorSubject<T>` we can be sure to not receive any values, but with a `ReplaySubject<T>` it is possible.
-
-`BehaviorSubject<T>`s are often associated with class [properties](http://msdn.microsoft.com/en-us/library/65zdfbdt(v=vs.71).aspx). 
-As they always have a value and can provide change notifications, they could be candidates for backing fields to properties.
-
-##AsyncSubject&lt;T&gt;				{#AsyncSubject}
-
-[`AsyncSubject<T>`](http://msdn.microsoft.com/en-us/library/hh229363(v=VS.103).aspx "AsyncSubject(Of T) - MSDN") is similar to the Replay and Behavior subjects in the way that it caches values, however it will only store the last value, and only publish it when the sequence is completed. 
-The general usage of the `AsyncSubject<T>` is to only ever publish one value then immediately complete. 
-This means that is becomes quite comparable to `Task<T>`.
-
-In this example no values will be published as the sequence never completes. 
-No values will be written to the console.
-
-	static void Main(string[] args)
-	{
-	  var subject = new AsyncSubject<string>();
-	  subject.OnNext("a");
-	  WriteSequenceToConsole(subject);
-	  subject.OnNext("b");
-	  subject.OnNext("c");
-	  Console.ReadKey();
-	}
-
-In this example we invoke the `OnCompleted` method so the last value 'c' is written to the console:
-
-	static void Main(string[] args)
-	{
-	  var subject = new AsyncSubject<string>();
-
-	  subject.OnNext("a");
-	  WriteSequenceToConsole(subject);
-	  subject.OnNext("b");
-	  subject.OnNext("c");
-	  subject.OnCompleted();
-	  Console.ReadKey();
-	}
-
-##Implicit contracts				{#ImplicitContracts}
-
-There are implicit contacts that need to be upheld when working with Rx as mentioned above. 
-The key one is that once a sequence is completed, no more activity can happen on that sequence. 
-A sequence can be completed in one of two ways, either by `OnCompleted()` or by `OnError(Exception)`.
-
-The four subjects described in this chapter all cater for this implicit contract by ignoring any attempts to publish values, errors or completions once the sequence has already terminated.
-
-Here we see an attempt to publish the value 'c' on a completed sequence. 
-Only values 'a' and 'b' are written to the console.
-
-	public void SubjectInvalidUsageExample()
-	{
-		var subject = new Subject<string>();
-
-		subject.Subscribe(Console.WriteLine);
-
-		subject.OnNext("a");
-		subject.OnNext("b");
-		subject.OnCompleted();
-		subject.OnNext("c");
-	}
-
-##ISubject interfaces				{#ISubject}
-
-While each of the four subjects described in this chapter implement the `IObservable<T>` and `IObserver<T>` interfaces, they do so via another set of interfaces:
-
-
-	//Represents an object that is both an observable sequence as well as an observer.
-	public interface ISubject<in TSource, out TResult> 
-		: IObserver<TSource>, IObservable<TResult>
-	{
-	}
-
-As all the subjects mentioned here have the same type for both `TSource` and `TResult`, they implement this interface which is the superset of all the previous interfaces:
-
-	//Represents an object that is both an observable sequence as well as an observer.
-	public interface ISubject<T> : ISubject<T, T>, IObserver<T>, IObservable<T>
-	{
-	}
-
-These interfaces are not widely used, but prove useful as the subjects do not share a common base class. 
-We will see the subject interfaces used later when we discover [Hot and cold observables](14_HotAndColdObservables.html).
-
-##Subject factory					{#SubjectFactory}
-
-Finally it is worth making you aware that you can also create a subject via a factory method. 
-Considering that a subject combines the `IObservable<T>` and `IObserver<T>` interfaces, it seems sensible that there should be a factory that allows you to combine them yourself. 
-The `Subject.Create(IObserver<TSource>, IObservable<TResult>)` factory method provides just this.
-
-	//Creates a subject from the specified observer used to publish messages to the subject
-	//  and observable used to subscribe to messages sent from the subject
-	public static ISubject>TSource, TResult< Create>TSource, TResult<(
-		IObserver>TSource< observer, 
-		IObservable>TResult< observable)
-	{...}
-
-Subjects provide a convenient way to poke around Rx, however they are not recommended for day to day use. 
-An explanation is in the [Usage Guidelines](18_UsageGuidelines.html) in the appendix. 
-Instead of using subjects, favor the factory methods we will look at in [Part 2](04_CreatingObservableSequences.html).
-
-The fundamental types `IObserver<T>` and `IObservable<T>` and the auxiliary subject types create a base from which to build your Rx knowledge.
-It is important to understand these simple types and their implicit contracts. 
-In production code you may find that you rarely use the `IObserver<T>` interface and subject types, but understanding them and how they fit into the Rx eco-system is still important. 
-The `IObservable<T>` interface is the dominant type that you will be exposed to for representing a sequence of data in motion, and therefore will comprise the core concern for most of your work with Rx and most of this book.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<!--Head First Design Patterns (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36RZY&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<!--Design Patterns (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B000SEIBB8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<!--Clean Code (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0132350882&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		
-		<!--C# 3.0 Design Patterns (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B0043EWUAC&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-	</div>
</div>
+# Key types
+
+Rx is a powerful framework that can greatly simplify code that responds to events. But to write good Reactive code you have to understand the basic concepts. The fundamental building block of Rx is an interface called `IObservable<T>`. Understanding this, and its counterpart `IObserver<T>`, is the key to success with Rx.
+
+The preceding chapter showed this LINQ query expression as the first example:
+
+```csharp
+var bigTrades =
+    from trade in trades
+    where trade.Volume > 1_000_000;
+```
+
+Most .NET developers will be familiar with [LINQ](https://learn.microsoft.com/en-us/dotnet/csharp/linq/) in at least one of its many popular forms such as [LINQ to Objects](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-objects), or [Entity Framework Core queries](https://learn.microsoft.com/en-us/ef/core/querying/). Most LINQ implementations allow you to query _data at rest_. LINQ to Objects works on arrays or other collections, and LINQ queries in Entity Framework Core run against data in a database, but Rx is different: it offers the ability to define queries over live event streams—what you might call _data in motion_.
+
+If you don't like the query expression syntax, you can write exactly equivalent code by invoking LINQ operators directly:
+
+```csharp
+var bigTrades = trades.Where(trade => trade.Volume > 1_000_000);
+```
+
+Whichever style we use, this is the LINQ way of saying that we want `bigTrades` to have just those items in `trades` where the `Volume` property is greater than one million.
+
+We can't tell exactly what these examples do because we can't see the type of the `trades` or `bigTrades` variables. The meaning of this code is going to vary greatly depending on these types. If we were using LINQ to objects, these would both likely be `IEnumerable<Trade>`. That would mean that these variables both referred to objects representing collections whose contents we could enumerate with a `foreach` loop. This would represent _data at rest_, data that our code could inspect directly.
+
+But let's make it clear what the code means by being explicit about the type:
+
+```csharp
+IObservable<Trade> bigTrades = trades.Where(trade => trade.Volume > 1_000_000);
+```
+
+This removes the ambiguity. It is now clear that we're not dealing with data at rest. We're working with an `IObservable<Trade>`. But what exactly is that?
+
+## `IObservable<T>`
+    
+The [`IObservable<T>` interface](https://learn.microsoft.com/en-us/dotnet/api/system.iobservable-1) represents Rx's fundamental abstraction: a sequence of values of some type `T`. In a very abstract sense, this means it represents the same thing as [`IEnumerable<T>`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1). 
+
+The difference is in how code consumes those values. Whereas `IEnumerable<T>` enables code to retrieve values (typically with a `foreach` loop), an `IObservable<T>` provides values when they become available. This distinction is sometimes characterised as _push_ vs _pull_. We can _pull_ values out of an `IEnumerable<T>` by executing a `foreach` loop, but an `IObservable<T>` will _push_ values into our code.
+
+How can an `IObservable<T>` push its values into our code? If we want these values, our code must _subscribe_ to the `IObservable<T>`, which means providing it with some methods it can invoke. In fact, subscription is the only operation an `IObservable<T>` directly supports. Here's the entire definition of the interface:
+
+```csharp
+public interface IObservable<out T>
+{
+    IDisposable Subscribe(IObserver<T> observer);
+}
+```
+
+You can see [the source for `IObservable<T>` on GitHub](https://github.com/dotnet/runtime/blob/b4008aefaf8e3b262fbb764070ea1dd1abe7d97c/src/libraries/System.Private.CoreLib/src/System/IObservable.cs). Notice that it is part of the .NET runtime libraries, and not the `System.Reactive` NuGet package. `IObservable<T>` represents such a fundamentally important abstraction that it is baked into .NET. (So you might be wondering what the `System.Reactive` NuGet package is for. The .NET runtime libraries define only the `IObservable<T>` and `IObserver<T>` interfaces, and not the LINQ implementation. The `System.Reactive` NuGet package gives us LINQ support, and also deals with threading.)
+
+This interface's only method makes it clear what we can do with an `IObservable<T>`: if we want to receive the events it has to offer, we can _subscribe_ to it. (We can also unsubscribe: the `Subscribe` method returns an `IDisposable`, and if we call `Dispose` on that it cancels our subscription.) The `Subscribe` method requires us to pass in an implementation of `IObserver<T>`, which we will get to shortly.
+
+Observant readers will have noticed that an example in the preceding chapter looks like it shouldn't work. That code created an `IObservable<long>` that produced events once per second, and then it subscribed to it with this code:
+
+```csharp
+ticks.Subscribe(
+    tick => Console.WriteLine($"Tick {tick}"));
+```
+
+That's passing a delegate, and not the `IObserver<T>` that `IObservable<T>.Subscribe` requires. We'll get to `IObserver<T>` shortly, but all that's happening here is that this example is using an extension method from the `System.Reactive` NuGet package:
+
+```csharp
+// From the System.Reactive library's ObservableExtensions class
+public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext)
+```
+
+This is a helper method that wraps a delegate in an implementation of `IObserver<T>` and then passes that to `IObservable<T>.Subscribe`. The effect is that we can write just a simple method (instead of a complete implementation of `IObserver<T>`) and the observable source will invoke our callback each time it wants to supply a value. It's more common to use this kind of helper than to implement Rx's interfaces ourselves.
+
+### Hot and Cold Sources
+
+Since an `IObservable<T>` cannot supply us with values until we subscribe, the time at which we subscribe can be important. Imagine an `IObservable<Trade>` describing trades occurring in some market. If the information it supplies is live, it's not going to tell you about any trades that occurred before you subscribed. In Rx, sources of this kind are described as being _hot_.
+
+Not all sources are _hot_. There's nothing stopping an `IObservable<T>` always supplying the exact same sequence of events to any subscriber no matter when the call to `Subscribe` occurs. (Imagine an `IObservable<Trade>` which, instead of reporting live information, generates notifications based on recorded historical trade data.) Sources where it doesn't matter at all when you subscribe are known as _cold_ sources.
+
+Here are some sources that might be represented as hot observables:
+
+* Measurements from a sensor
+* Price ticks from a trading exchange
+* An event source that distributes events immediately such as Azure Event Grid
+* mouse movements
+* timer events
+* broadcasts like ESB channels or UDP network packets
+
+And some examples of some sources that might make good cold observables:
+
+* the contents of a collection (such as is returned by the [`ToObservable` extension method for `IEnumerable<T>`](03_CreatingObservableSequences.md#from-ienumerablet))
+* a fixed range of values, such as [`Observable.Range`](03_CreatingObservableSequences.md#observablerange) produces
+* events generated based on an algorithm, such as [`Observable.Generate`](03_CreatingObservableSequences.md#observablegenerate) produces
+* a factory for an asynchronous operation, such as [`FromAsync`](03_CreatingObservableSequences.md#from-task) returns
+* events produced by running conventional code such as a loop; you can create such sources with [`Observable.Create`](03_CreatingObservableSequences.md#observablecreate)
+* a streaming event provides such as Azure Event Hub or Kafka (or any other streaming-style source which holds onto events from the past to be able to deliver events from a particular moment in the stream; so _not_ an event source in the Azure Event Grid style)
+
+Not all sources are strictly completely _hot_ or _cold_.  For example, you could imagine a slight variation on a live `IObservable<Trade>` where the source always reports the most recent trade to new subscribers. Subscribers can count on immediately receiving something, and will then be kept up to date as new information arrives. The fact that new subscribers will always receive (potentially quite old) information is a _cold_-like characteristic, but it's only that first event that is _cold_. It's still likely that a brand new subscriber will have missed lots of information that would have been available to earlier subscribers, making this source more _hot_ than _cold_.
+
+There's an interesting special case in which a source of events has been designed to enable applications to receive every single event in order, exactly once. Event streaming systems such as Kafka or Azure Event Hub have this characteristic—they retain events for a while, to ensure that consumers don't miss out even if they fall behind from time to time. The standard input (_stdin_) for a process also has this characteristic: if you run a command line tool and start typing input before it is ready to process it, the operating system will hold that input in a buffer, to ensure that nothing is lost. Windows does something similar for desktop applications: each application thread gets a message queue so that if you click or type when it's not able to respond, the input will eventually be processed. We might think of these sources as _cold_-then-_hot_. They're like _cold_ sources in that we won't miss anything just because it took us some time to start receiving events, but once we start retrieving the data, then we can't generally rewind back to the start. So once we're up and running they are more like _hot_ events.
+
+This kind of _cold_-then-_hot_ source can present a problem if we want to attach multiple subscribers. If the source starts providing events as soon as subscription occurs, then that's fine for the very first subscriber: it will receive any events that were backed up waiting for us to start. But if we wanted to attach multiple subscribers, we've got a problem: that first subscriber might receive all the notifications that were sitting waiting in some buffer before we manage to attach the second subscriber. The second subscriber will miss out.
+
+In these cases, we really want some way to rig up all our subscribers before kicking things off. We want subscription to be separate from the act of starting. By default, subscribing to a source implies that we want it to start, but Rx defines a specialised interface that can give us more control: [`IConnectableObservable<T>`](https://github.com/dotnet/reactive/blob/f4f727cf413c5ea7a704cdd4cd9b4a3371105fa8/Rx.NET/Source/src/System.Reactive/Subjects/IConnectableObservable.cs). This derives from `IObservable<T>`, and adds just a single method, `Connect`:
+
+```csharp
+public interface IConnectableObservable<out T> : IObservable<T>
+{
+    IDisposable Connect();
+}
+```
+
+This is useful in these scenarios where there will be some process that fetches or generates events and we need to make sure we're prepared before that starts.  Because an `IConnectableObservable<T>` won't start until you call `Connect`, it provides you with a way to attach however many subscribers you need before events begin to flow.
+
+The 'temperature' of a source is not necessarily evident from its type. Even when the underlying source is an `IConnectableObservable<T>`, that can often be hidden behind layers of code. So whether a source is hot, cold, or something in between, most of the time we just see an `IObservable<T>`. Since `IObservable<T>` defines just one method, `Subscribe`, you might be wondering how we can do anything interesting with it. The power comes from the LINQ operators that the `System.Reactive` NuGet library supplies.
+
+### LINQ Operators and Composition
+
+So far I've shown only a very simple LINQ example, using the `Where` operator to filter events down to ones that meet certain criteria. To give you a flavour of how we can build more advanced functionality through composition, I'm going to introduce an example scenario.
+
+Suppose you want to write a program that watches some folder on a filesystem, and performs automatic processing any time something in that folder changes. For example, web developers often want to trigger automatic rebuilds of their client side code when they save changes in the editor so they can quickly see the effect of their changes. Filesystem changes often come in bursts. Text editors might perform a few distinct operations when saving a file. (Some save modifications to a new file, then perform a couple of renames once this is complete, because this avoids data loss if a power failure or system crash happens to occur at the moment you save the file.) So you typically won't want to take action as soon as you detect file activity. It would be better to give it a moment to see if any more activity occurs, and take action only after everything has settled down.
+
+So we should not react directly to filesystem activity. We want take action at those moments when everything goes quiet after a flurry of activity. Rx does not offer this functionality directly, but it's possible for us to create a custom operator by combing some of the built-in operators. The following code defines an Rx operator that detects and reports such things. If you're new to Rx (which seems likely if you're reading this) it probably won't be instantly obvious how this works. This is a significant step up in complexity from the examples I've shown so far because this came from a real application. But I'll walk through it step by step, so all will become clear.
+
+```csharp
+static class RxExt
+{
+    public static IObservable<IList<T>> Quiescent<T>(
+        this IObservable<T> src,
+        TimeSpan minimumInactivityPeriod,
+        IScheduler scheduler)
+    {
+        IObservable<int> onoffs =
+            from _ in src
+            from delta in 
+               Observable.Return(1, scheduler)
+                         .Concat(Observable.Return(-1, scheduler)
+                                           .Delay(minimumInactivityPeriod, scheduler))
+            select delta;
+        IObservable<int> outstanding = onoffs.Scan(0, (total, delta) => total + delta);
+        IObservable<int> zeroCrossings = outstanding.Where(total => total == 0);
+        return src.Buffer(zeroCrossings);
+    }
+}
+```
+
+The first thing to say about this is that we are effectively defining a custom LINQ-style operator: this is an extension method which, like all of the LINQ operators Rx supplies, takes an `IObservable<T>` as its implicit argument, and produces another observable source as its result. The return type is slightly different: it's `IObservable<IList<T>>`. That's because once we return to a state of inactivity, we will want to process everything that just happened, so this operator will produce a list containing every value that the source reported in its most recent flurry of activity.
+
+When we want to show how an Rx operator behaves, we typically draw a 'marble' diagram. This is a diagram showing one or more `IObservable<T>` event sources, with each one being illustrated by a horizontal line. Each event that a source produces is illustrated by a circle (or 'marble') on that line, with the horizontal position representing timing. Typically, the line has a vertical bar on its left indicating the instant at which the application subscribed to the source, unless it happens to produce events immediately, in which case it will start with a marble. If the line has an arrowhead on the right, that indicates that the observable's lifetime extends beyond the diagram. Here's a diagram showing how the `Quiescent` operator above response to a particular input:
+
+![An Rx marble diagram illustrating two observables. The first is labelled 'source', and it shows six events, labelled numerically. These fall into three groups: events 1 and 2 occur close together, and are followed by a gap. Then events 3, 4, and 5 are close together. And then after another gap event 6 occurs, not close to any. The second observable is labelled 'source.Quiescent(TimeSpan.FromSeconds(2), Scheduler.Default)'. It shows three events. The first is labelled '1, 2', and its horizontal position shows that it occurs a little bit after the '2' event on the 'source' observable. The second event on the second observable is labelled '3,4,5' and occurs a bit after the '5' event on the 'source' observable. The third event from on the second observable is labelled '6', and occurs a bit after the '6' event on the 'source' observable. The image conveys the idea that each time the source produces some events and then stops, the second observable will produce an event shortly after the source stops, which will contain a list with all of the events from the source's most recent burst of activity.](GraphicsIntro/Ch02-Quiescent-Marbles-Input-And-Output.svg)
+
+This shows that the source (the top line) produced a couple of events (the values `1` and `2`, in this example), and then stopped for a bit. A little while after it stopped, the observable returned by the `Quiescent` operator (the lower line) produced a single event with a list containing both of those events (`[1,2]`). Then the source started up again, producing the values `3`, `4`, and `5` in fairly quick succession, and then going quiet for a bit. Again, once the quiet spell had gone on for long enough, the source returned by `Quiescent` produced a single event containing all of the source events from this second burst of activity (`[3,4,5]`). And then the final bit of source activity shown in this diagram consists of a single event, `6`, followed by more inactivity, and again, once the inactivity has gone on for long enough the `Quiescent` source produces a single event to report this. And since that last 'burst' of activity from the source contained only a single event, the list reported by this final output from the `Quiescent` observable is a list with a single value: `[6]`.
+
+So how does the code shown achieve this? The first thing to notice about the `Quiescent` method is that it's just using other Rx LINQ operators (the `Return`, `Scan`, `Where`, and `Buffer` operators are explicitly visible, and the query expression will be using the `SelectMany` operator, because that's what C# query expressions do when they contain two `from` clauses in a row) in a combination that produces the final `IObservable<IList<T>>` output.
+
+This is Rx's _compositional_ approach, and it is how we normally use Rx. We use a mixture of operators, combined (_composed_) in a way that produces the effect we want.
+
+But how does this particular combination produce the effect we want? There are a few ways we could get the behaviour that we're looking for from a `Quiescent` operator, but the basic idea of this particular implementation is that it keeps count of how many events have happened recently, and then produces a result every time that number drops back to zero. The `outstanding` variable refers to the `IObservable<int>` that tracks the number of recent events, and this marble diagram shows what it produces in response to the same `source` events as were shown on the preceding diagram:
+
+![How the Quiescent operator counts the number of outstanding events. An Rx marble diagram illustrating two observables. The first is labelled 'source', and it shows the same six events as the preceding figure, labelled numerically, but this time also color-coded so that each event has a different color. As before, these events fall into three groups: events 1 and 2 occur close together, and are followed by a gap. Then events 3, 4, and 5 are close together. And then after another gap event 6 occurs, not close to any. The second observable is labelled 'outstanding' and for each of the events on the 'source' observable, it shows two events. Each such pair has the same color as on the 'source' line; the coloring is just to make it easier to see how events on this line are associated with events on the 'source' line. The first of each pair appears directly below its corresponding event on the 'source' line, and has a number that is always one higher than its immediate predecessor; the very first item shows a number of 1. The first item from the second pair is the next to appear on this line, and therefore has a number of 2. But then the second item from the first pair appears, and this lowers the number back to 1, and it's followed by the second item from the second pair, which shows 0. Since the second batch of events on the first line appear fairly close together, we see values of 1, 2, 1, 2, 1, and then 0 for these. The final event on the first line, labelled 6, has a corresponding pair on the second line reporting values of 1 and then 0. The overall effect is that each value on the second, 'outstanding' line tells us how many items have emerged from the 'source' line in the last 2 seconds.](GraphicsIntro/Ch02-Quiescent-Marbles-Outstanding.svg)
+
+I've colour coded the events this time so that I can show the relationship between `source` events and corresponding events produced by `outstanding`. Each time `source` produces an event, `outstanding` produces an event at the same time, in which the value is one higher than the preceding value produced by `outstanding`. But each such `source` event also causes `outstanding` to produce another event two seconds later. (It's two seconds because in these examples, I've presumed that the first argument to `Quiescent` is `TimeSpan.FromSeconds(2)`, as shown on the first marble diagram.) That second event always produces a value that is one lower than whatever the preceding value was.
+
+This means that each event to emerge from `outstanding` tells us how many events `source` produced within the last two seconds. This diagram shows that same information in a slightly different form: it shows the most recent value produced by `outstanding` as a graph. You can see the value goes up by one each time `source` produces a new value. And two seconds after each value produced by `source`, it drops back down by one.
+
+![The number of outstanding events as a graph. An Rx marble diagram illustrating the 'source' observables, and the second observable from the preceding diagram this time illustrated as a bar graph showing the latest value. This makes it easier to see that the 'outstanding' value goes up each time a new value emerges from 'source', and then goes down again two seconds later, and that when values emerge close together this running total goes higher. It also makes it clear that the value drops to zero between the 'bursts' of activity.](GraphicsIntro/Ch02-Quiescent-Marbles-Outstanding-Value.svg)
+
+In simple cases like the final event `6`, in which it's the only event that happens at around that time, the `outstanding` value goes up by one when the event happens, and drops down again two seconds later. Over on the left of the picture it's a little more complex: we get two events in fairly quick succession, so the `outstanding` value goes up to one and then up to two, before falling back down to one and then down to zero again. The middle section looks a little more messy—the count goes up by one when the `source` produces event `3`, and then up to two when event `4` comes in. It then drops down to one again once two seconds have passed since the `3` event, but then another event, `5`, comes in taking the total back up to two. Shortly after that it drops back to one again because it has now been two seconds since the `4` event happened. And then a bit later, two seconds after the `5` event it drops back to zero again.
+
+That middle section is the messiest, but it's also most representative of the kind of activity this operator is designed to deal with. Remember, the whole point here is that we're expecting to see flurries of activity, and if those represents filesystem activity, they will tend to be slightly chaotic in nature, because storage devices don't always have entirely predictable performance characteristics (especially if it's a magnetic storage device with moving parts, or remote storage in which variable networking delays might come into play).
+
+With this measure of recent activity in hand, we can spot the end of bursts of activity by watching for when `outstanding` drops back to zero, which is what the observable referred to by `zeroCrossing` in the code above does. (That's just using the `Where` operator to filter out everything except the events where `outstanding`'s current value returns to zero.)
+
+But how does `outstanding` itself work? The basic approach here is that every time `source` produces a value, we actually create a brand new `IObservable<int>`, which produces exactly two values. It immediately produces the value 1, and then after the specified timespan (2 seconds in these examples) it produces the value -1. That's what's going in in this clause of the query expression:
+
+```csharp
+from delta in Observable
+    .Return(1, scheduler)
+    .Concat(Observable
+        .Return(-1, scheduler)
+        .Delay(minimumInactivityPeriod, scheduler))
+```
+
+I said Rx is all about composition, and that's certainly the case here. We are using the very simple `Return` operator to create an `IObservable<int>` that immediately produces just a single value and then terminates. This code calls that twice, once to produce the value `1` and again to produce the value `-1`. It uses the `Delay` operator so that instead of getting that `-1` value immediately, we get an observable that waits for the specified time period (2 seconds in these examples, but whatever `minimumInactivityPeriod` is in general) before producing the value. And then we use `Concat` to stitch those two together into a single `IObservable<int>` that produces the value `1`, and then two seconds later produces the value `-1`.
+
+Although this produces a brand new `IObservable<int>` for each `source` event, the `from` clause shown above is part of a query expression of the form `from ... from .. select`, which the C# compiler turns into a call to `SelectMany`, which has the effect of flattening those all back into a single observable, which is what the `onoffs` variable refers to. This marble diagram illustrates that:
+
+![The number of outstanding events as a graph. Several Rx marble diagrams, starting with the 'source' observable from earlier figures, followed by one labelled with the LINQ query expression in the preceding example, which shows 6 separate marble diagrams, one for each of the elements produced by 'source'. Each consists of two events: one with value 1, positioned directly beneath the corresponding event on 'source' to indicate that they happen simultaneously, and then one with the value -1 two seconds later. Beneath this is a marble diagram labelled 'onoffs' which contains all the same events from the preceding 6 diagrams, but merged into a single sequence. These are all colour coded ot make it easier to see how these events correspond to the original events on 'source'. Finally, we have the 'outstanding' marble diagram which is exactly the same as in the preceding figure.](GraphicsIntro/Ch02-Quiescent-Marbles-On-Offs.svg)
+
+This also shows the `outstanding` observable again, but we can now see where that comes from: it is just the running total of the values emitted by the `onoffs` observable. This running total observable is created with this code:
+
+```csharp
+IObservable<int> outstanding = onoffs.Scan(0, (total, delta) => total + delta);
+```
+
+Rx's `Scan` operator works much like the standard LINQ [`Aggregate`](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/aggregation-operations) operator, in that it cumulatively applies an operation (addition, in this case) to every single item in a sequence. The different is that whereas `Aggregate` produces just the final result once it reaches the end of the sequence, `Scan` shows all of its working, producing the accumulated value so far after each input. So this means that `outstanding` will produce an event every time `onoffs` produces one, and that event's value will be the running total—the sum total of every value from `onoffs` so far.
+
+So that's how `outstanding` comes to tell us how many events `source` produced within the last two seconds (or whatever `minimumActivityPeriod` has been specified).
+
+The final piece of the puzzle is how we go from the `zeroCrossings` (which produces an event every time the source has gone quiescent) to the output `IObservable<IList<T>>`, which provides all of the events that happened in the most recent burst of activity. Here we're just using Rx's `Buffer` operator, which is designed for exactly this scenario: it slices its input into chunks, producing an event for each chunk, the value of which is an `IList<T>` containing the items for the chunk. `Buffer` can slice things up a few ways, but in this case we're using the form that starts a new slice each time some `IObservable<T>` produces an item. Specifically, we're telling `Buffer` to slice up the `source` by creating a new chunk every time `zeroCrossings` produces a new event.
+
+(One last detail, just in case you saw it and were wondering, is that this method requires an `IScheduler`. This is an Rx abstraction for dealing with timing and concurrency. We need it because we need to be able to generate events after a one second delay, and that sort of time-driven activity requires a scheduler.)
+
+We'll get into all of these operators and the workings of schedulers in more detail in later chapters. For now, the key point is that we typically use Rx by creating a combination of LINQ operators that process and combine `IObservable<T>` sources to define the logic that we require.
+
+Notice that nothing in that example actually called the one and only method that `IObservable<T>` defines (`Subscribe`). There will always be something somewhere that ultimately consumes the events, but most of the work of using Rx tends to entail declaratively defining the `IObservable<T>`s we need.
+
+Now that you've seen an example of what Rx programming looks like, we can address some obvious questions about why Rx exists at all.
+
+### What was wrong with .NET Events?
+
+.NET has had built-in support for events from the very first version that shipped over two decades ago—events are part of .NET's type system. The C# language has intrinsic support for this in the form of the `event` keyword, along with specialized syntax for subscribing to events. So why, when Rx turned up some 10 years later, did it feel the need to invent its own representation for streams of events? What was wrong with the `event` keyword?
+
+The basic problem with .NET events is that they get special handling from the .NET type system. Ironically, this makes them less flexible than if there had been no built-in support for the idea of events. Without .NET events, we would have needed some sort of object-based representation of events, at which point you can do all the same things with events that you can do with any other objects: you could store them in fields, pass them as arguments to methods, define methods on them and so on.
+
+To be fair to .NET version 1, it wasn't really possible to define a good object-based representation of events without generics, and .NET didn't get those until version 2 (three and a half years after .NET 1.0 shipped). Different event sources need to be able to report different data, and .NET events provided a way to parameterize events by type. But once generics came along, it became possible to define types such as `IObservable<T>`, and the main advantage that events offered went away. (The other benefit was some language support for implementing and subscribing to events, but in principle that's something that could have been done for Rx if Microsoft had chosen to. It's not a feature that required events to be fundamentally different from other features of the type system.)
+
+Consider the example we've just worked through. It was possible to define our own custom LINQ operator, `Quiescent`, because `IObservable<T>` is just an interface like any other, meaning that we're free to write extension methods for it. You can't write an extension method for an event.
+
+Also, we are able to wrap or adapt `IObservable<T>` sources. `Quiescent` took an `IObservable<T>` as an input, and combined various Rx operators to produce another observable as an output. Its input was a source of events that could be subscribed to, and its output was also a source of events that could be subscribed to. You can't do this with .NET events—you can't write a method that accepts an event as an argument, or that returns an event.
+
+These limitations are sometimes described by saying that .NET events are not _first class citizens_. There are things you can do with values or references in .NET that you can't do with events.
+
+If we represent an event source as a plain old interface, then it _is_ a first class citizen: it can use all of the functionality we expect with other objects and values precisely because it's not something special.
+
+### What about Streams?
+
+I've described `IObservable<T>` as representing a _stream_ of events. This raises an obvious question: .NET already has [`System.IO.Stream`](https://learn.microsoft.com/en-us/dotnet/api/system.io.stream), so why not just use that?
+
+The short answer is that streams are weird because they represent an ancient concept in computing dating back long before the first ever Windows operating system shipped, and as such they have quite a lot of historical baggage. This means that even a scenario as simple as "I have some data, and want to make that available immediately to all interested parties" is surprisingly complex to implement though the `Stream` type.
+
+Moreover, `Stream` doesn't provide any way to indicate what type of data will emerge—it only knows about bytes. Since .NET's type system supports generics, it is natural to want the types that represent event streams to indicate the event type through a type parameter.
+
+So even if you did use `Stream` as part of your implementation, you'd want to introduce some sort of wrapper abstraction. If `IObservable<T>` didn't exist, you'd need to invent it.
+
+It's certainly possible to use IO streams in Rx, but they are not the right primary abstraction.
+
+(If you are unconvinced, see [Appendix A: What's Wrong with Classic IO Streams](A_IoStreams.md) for a far more detailed explanation of exactly why `Stream` is not well suited to this task.)
+
+Now that we've seen why `IObservable<T>` needs to exist, we need to look at its counterpart, `IObserver<T>`.
+
+## `IObserver<T>`
+
+Earlier, I showed the definition of `IObservable<T>`. As you saw, it has just one method, `Subscribe`. And this method takes just one argument, of type [`IObserver<T>`](https://learn.microsoft.com/en-us/dotnet/api/system.iobserver-1). So if you want to observe the events that an `IObservable<T>` has to offer, you must supply it with an `IObserver<T>`. In the examples so far, we've just supplied a simple callback, and Rx has wrapped that in an implementation of `IObserver<T>` for us, but even though this is very often the way we will receive notifications in practice, you still need to understand `IObserver<T>` to use Rx effectively. It is not a complex interface:
+
+```csharp
+public interface IObserver<in T>
+{
+    void OnNext(T value);
+    void OnError(Exception error);
+    void OnCompleted();
+}
+```
+
+As with `IObservable<T>`, you can find [the source for `IObserver<T>`](https://github.com/dotnet/runtime/blob/7cf329b773fa5ed544a9377587018713751c73e3/src/libraries/System.Private.CoreLib/src/System/IObserver.cs) in the .NET runtime GitHub repository, because both of these interfaces are built into the runtime libraries.
+
+If we wanted to create an observer that printed values to the console it would be as easy as this:
+
+```csharp
+public class MyConsoleObserver<T> : IObserver<T>
+{
+    public void OnNext(T value)
+    {
+        Console.WriteLine($"Received value {value}");
+    }
+
+    public void OnError(Exception error)
+    {
+        Console.WriteLine($"Sequence faulted with {error}");
+    }
+
+    public void OnCompleted()
+    {
+        Console.WriteLine("Sequence terminated");
+    }
+}
+```
+
+In the preceding chapter, I used a `Subscribe` extension method that accepted a delegate which it invoked each time the source produced an item. This method is defined by Rx's `ObservableExtensions` class, which also defines various other extension methods for `IObservable<T>`. It includes overloads of `Subscribe` that enable me to write code that has the same effect as the preceding example, without needing to provide my own implementation of `IObserver<T>`:
+
+```csharp
+source.Subscribe(
+    value => Console.WriteLine($"Received value {value}"),
+    error => Console.WriteLine($"Sequence faulted with {error}"),
+    () => Console.WriteLine("Sequence terminated")
+);
+```
+
+The overloads of `Subscribe` where we don't pass all three methods (e.g., my earlier example just supplied a single callback corresponding to `OnNext`) are equivalent to writing an `IObserver<T>` implementation where one or more of the methods simply has an empty body. Whether we find it more convenient to write our own type that implements `IObserver<T>`, or just supply callbacks for some or all of its `OnNext`, `OnError` and `OnCompleted` method, the basic behaviour is the same: an `IObservable<T>` source reports each event with a call to `OnNext`, and tells us that the events have come to an end either by calling `OnError` or `OnCompleted`.
+
+If you're wondering whether the relationship between `IObservable<T>` and `IObserver<T>` is similar to the relationship between [`IEnumerable<T>`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1) and [`IEnumerator<T>`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerator-1), then you're onto something. Both `IEnumerator<T>` and `IObservable<T>` represent _potential_ sequences. With both of these interfaces, they will only supply data if we ask them for it. To get values out of an `IEnumerable<T>`, an `IEnumerator<T>` needs to come into existence, and similarly, to get values out of an `IObservable<T>` requires an `IObserver<T>`.
+
+The difference reflects the fundamental _pull vs push_ difference between `IEnumerable<T>` and `IObservable<T>`. Whereas with `IEnumerable<T>` we ask the source to create an `IEnumerator<T>` for us which we can then use to retrieve items (which is what a C# `foreach` loop does), with `IObservable<T>`, the source does not _implement_ `IObserver<T>`: it expects _us_ to supply an `IObserver<T>` and it will then push its values into that observer.
+
+So why does `IObserver<T>` have these three methods? Remember when I said that in an abstract sense, `IObserver<T>` represents the same thing as `IEnumerable<T>`? I meant it. It might be an abstract sense, but it is precise: `IObservable<T>` and `IObserver<T>` were designed to preserve the exact meaning of `IEnumerable<T>` and `IEnumerator<T>`, changing only the detailed mechanism of consumption.
+
+To see what that means, think about what happens when you iterate over an `IEnumerable<T>` (with, say, a `foreach` loop). With each iteration (and more precisely, on each call to the enumerator's [`MoveNext`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.ienumerator.movenext) method) there are three things that could happen:
+
+* `MoveNext` could return `true` to indicate that a value is available in the enumerator's [`Current`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerator-1.current) property
+* `MoveNext` could throw an exception
+* `MoveNext` could return `false` to indicate that you've reached the end of the collection
+
+These three outcomes correspond precisely to the three methods defined by `IObserver<T>`. We could describe these in slightly more abstract terms:
+
+* Here's another item
+* It has all gone wrong
+* There are no more items
+
+That describes the three things that either can happen next when consuming either an `IEnumerable<T>` or an `IObservable<T>`. The only difference is the means by which consumers discover this. With an `IEnumerable<T>` source, each call to `MoveNext` will tell us which of these three applies. And with an `IObservable<T>` source, it will tell you one of these three things with a call to the corresponding member of your `IObserver<T>` implementation.
+
+## The Fundamental Rules of Rx Sequences
+
+Notice that two of the three outcomes in the list above are terminal. If you're iterating through an `IEnumerable<T>` with a `foreach` loop, and it throws an exception, the `foreach` loop will terminate. The C# compiler understands that if `MoveNext` throws, the `IEnumerator<T>` is now done, so it disposes it and then allows the exception to propagate. Likewise, if you get to the end of a sequence, then you're done, and the compiler understands that too: the code it generates for a `foreach` loop detects when `MoveNext` returns false and when that happens it disposes the enumerator and then moves onto the code after the loop.
+
+These rules might seem so obvious that we might never even think about them when iterating over `IEnumerable<T>` sequences. What might be less immediately obvious is that exactly the same rules apply for an `IObservable<T>` sequence. If an observable source either tells an observer that the sequence has finished, or reports an error, then in either case, that is the last thing the source is allowed to do to the observer.
+
+That means these examples would be breaking the rules:
+
+```csharp
+public static void WrongOnError(IObserver<int> obs)
+{
+    obs.OnNext(1);
+    obs.OnError(new ArgumentException("This isn't an argument!"));
+    obs.OnNext(2);  // Against the rules! We already reported failure, so iteration must stop
+}
+
+public static void WrongOnCompleted(IObserver<int> obs)
+{
+    obs.OnNext(1);
+    obs.OnCompleted();
+    obs.OnNext(2);  // Against the rules! We already said we were done, so iteration must stop
+}
+
+public static void WrongOnErrorAndOnCompleted(IObserver<int> obs)
+{
+    obs.OnNext(1);
+    obs.OnError(new ArgumentException("A connected series of statements was not supplied"));
+
+    // This next call is against the rules because we reported an error, and you're not
+    // allowed to make any further calls after you did that.
+    obs.OnCompleted();
+}
+
+public static void WrongOnCompletedAndOnError(IObserver<int> obs)
+{
+    obs.OnNext(1);
+    obs.OnCompleted();
+
+    // This next call is against the rule because already said we were done.
+    // When you terminate a sequence you have to pick between OnCompleted or OnError
+    obs.OnError(new ArgumentException("Definite proposition not established"));
+}
+```
+
+These correspond in a pretty straightforward way to things we already know about `IEnumerable<T>`:
+
+* `WrongOnError`: if an enumerator throws from `MoveNext`, it's done and you mustn't call `MoveNext` again, so you won't be getting any more items out of it
+* `WrongOnCompleted`: if an enumerator returns `false` from `MoveNext`, it's done and you mustn't call `MoveNext` again, so you won't be getting any more items out of it
+* `WrongOnErrorAndOnCompleted`: if an enumerator throws from `MoveNext`, that means its done, it's done and you mustn't call `MoveNext` again, meaning it won't have any opportunity to tell that it's done by returning `false` from `MoveNext`
+* `WrongOnCompletedAndOnError`: if an enumerator returns `false` from `MoveNext`, it's done and you mustn't call `MoveNext` again,  meaning it won't have any opportunity to also throw an exception
+
+Because `IObservable<T>` is push-based, the onus for obeying all of these rules fall on the observable source. With `IEnumerable<T>`, which is pull-based, it's up to the code using the `IEnumerator<T>` (e.g. a `foreach` loop) to obey these rules. But they are essentially the same rules.
+
+There's an additional rule for `IObserver<T>`: if you call `OnNext` you must wait for it to return before making any more method calls into the same `IObserver<T>`. That means this code breaks the rules:
+
+```csharp
+public static void EverythingEverywhereAllAtOnce(IEnumerable<int> obs)
+{
+    Random r = new();
+    for (int i = 0; i < 10000; ++i)
+    {
+        int v = r.Next();
+        Task.Run(() => obs.OnNext(v)); // Against the rules!
+    }}
+```
+
+This calls `obs.OnNext` 10,000 times, but it executes these calls as individual tasks to be run on the thread pool. The thread pool is designed to be able to execute work in parallel, and that's a a problem here because nothing here ensures that one call to `OnNext` completes before the next begins. We've broken the rule that says we must wait for each call to `OnNext` to return before calling either `OnNext`, `OnError`, or `OnComplete` on the same observer. (Note: this assumes that the caller won't subscribe the same observer to multiple different sources. If you do that, you can't assume that all calls to its `OnNext` will obey the rules, because the different sources won't have any way of knowing they're talking to the same observer.)
+
+This rule is the only form of back pressure built into Rx.NET: since the rules forbid calling `OnNext` if a previous call to `OnNext` is still in progress, this enables an `IObserver<T>` to limit the rate at which items arrive. If you just don't return from `OnNext` until you're ready, the source is obliged to wait. However, there are some issues with this. Once [schedulers](11_SchedulingAndThreading.md) get involved, the underlying source might not be connected directly to the final observer. If you use something like [`ObserveOn`](11_SchedulingAndThreading.md#subscribeon-and-observeon) it's possible that the `IObserver<T>` subscribed directly to the source just puts items on a queue and immediately returns, and those items will then be delivered to the real observer on a different thread. In these cases, the 'back pressure' caused by taking a long time to return from `OnNext` only propagates as far as the code pulling items off the queue. 
+
+It may be possible to use certain Rx operators (such as [`Buffer`](08_Partitioning.md#buffer) or [`Sample`](12_Timing.md#sample)) to mitigate this, but there are no built-in mechanisms for cross-thread propagation of back pressure. Some Rx implementations on other platforms have attempted to provide integrated solutions for this; in the past when the Rx.NET development community has looked into this, some thought that these solutions were problematic, and there is no consensus on what a good solution looks like. So with Rx.NET, if you need to arrange for sources to slow down when you are struggling to keep up, you will need to introduce some mechanism of your own. (Even with Rx platforms that do offer built-in back pressure, they can't provide a general-purpose answer to the question: how do we make this source provide events more slowly? How (or even whether) you can do that will depend on the nature of the source. So some bespoke adaptation is likely to be necessary in any case.)
+
+This rule in which we must wait for `OnNext` to return is tricky and subtle. It's perhaps less obvious than the others, because there's no equivalent rule for `IEnumerable<T>`—the opportunity to break this rule only arises when the source pushes data into the application. You might look at the example above and think "well who would do that?" However, multithreading is just an easy way to show that it is technically possible to break the rule. The harder cases are where single-threaded re-entrancy occurs. Take this code:
+
+```csharp
+public class GoUntilStopped
+{
+    private readonly IObserver<int> observer;
+    private bool running;
+
+    public GoUntilStopped(IObserver<int> observer)
+    {
+        this.observer = observer;
+    }
+
+    public void Go()
+    {
+        this.running = true;
+        for (int i = 0; this.running; ++i)
+        {
+            this.observer.OnNext(i);
+        }
+    }
+
+    public void Stop()
+    {
+        this.running = false;
+        this.observer.OnCompleted();
+    }
+}
+```
+
+This class takes an `IObserver<int>` as a constructor argument. When you call its `Go` method, it repeatedly calls the observer's `OnNext` until something calls its `Stop` method.
+
+Can you see the bug?
+
+We can take a look at what happens by supplying an `IObserver<int>` implementation:
+
+```csharp
+public class MyObserver : IObserver<int>
+{
+    private GoUntilStopped? runner;
+
+    public void Run()
+    {
+        this.runner = new(this);
+        Console.WriteLine("Starting...");
+        this.runner.Go();
+        Console.WriteLine("Finished");
+    }
+
+    public void OnCompleted()
+    {
+        Console.WriteLine("OnCompleted");
+    }
+
+    public void OnError(Exception error) { }
+
+    public void OnNext(int value)
+    {
+        Console.WriteLine($"OnNext {value}");
+        if (value > 3)
+        {
+            Console.WriteLine($"OnNext calling Stop");
+            this.runner?.Stop();
+        }
+        Console.WriteLine($"OnNext returning");
+    }
+}
+```
+
+Notice that the `OnNext` method looks at its input, and if it's greater than 3, it tells the `GoUntilStopped` object to stop.
+
+Let's look at the output:
+
+```
+Starting...
+OnNext 0
+OnNext returning
+OnNext 1
+OnNext returning
+OnNext 2
+OnNext returning
+OnNext 3
+OnNext returning
+OnNext 4
+OnNext calling Stop
+OnCompleted
+OnNext returning
+Finished
+```
+
+The problem is right near the end. Specifically, these two lines:
+
+```
+OnCompleted
+OnNext returning
+```
+
+This tells us that the call to our observer's `OnCompleted` happened before a call in progress to `OnNext` returned. It didn't take multiple threads to make this occur. It happened because the code in `OnNext` decides whether it wants to keep receiving events, and when it wants to stop, it immediately calls the `GoUntilStopped` object's `Stop` method. There's nothing wrong with that. Observers are allowed to make outbound calls to other objects inside `OnNext`, and it's actually quite common for an observer to inspect an incoming event and decide that it wants to stop.
+
+The problem is in the `GoUntilStopped.Stop` method. This calls `OnCompleted` but it makes no attempt to determine whether a call to `OnNext` is in progress.
+
+This can be a surprisingly tricky problem to solve. Suppose `GoUntilStopped` _did_ detect that there was a call in progress to `OnNext`. What then? In the multithreaded case, we could have solved this by using `lock` or some other synchronization primitive to ensure that calls into the observer happened one at at time, but that won't work here: the call to `Stop` has happened on _the same thread_ that called `OnNext`. The call stack will look something like this at the moment where `Stop` has been called and it wants to call `OnCompleted`:
+
+```
+`GoUntilStopped.Go`
+  `MyObserver.OnNext`
+    `GoUntilStopped.Stop`
+```
+ 
+ Our `GoUntilStopped.Stop` method needs to wait for `OnNext` to return before calling `OnCompleted`. But notice that the `OnNext` method can't return until our `Stop` method returns. We've managed to create a deadlock with single-threaded code!
+
+In this case it's not all that hard to fix: we could modify `Stop` so it just sets the `running` field to `false`, and then move the call to `OnComplete` into the `Go` method, after the `for` loop. But more generally this can be a hard problem to fix, and it's one of the reasons for using the `System.Reactive` library instead of just attempting to implement `IObservable<T>` and `IObserver<T>` directly. Rx has general purpose mechanisms for solving exactly this kind of problem. (We'll see these when we look at [Scheduling](11_SchedulingAndThreading.md).) Moreover, all of the implementations Rx provides take advantage of these mechanisms for you.
+
+If you're using Rx by composing its built-in operators in a declarative way, you never have to think about these rules. You get to depend on these rules in your callbacks that receive the events, and it's mostly Rx's problem to keep to the rules. So the main effect of these rules is that it makes life simpler for code that consumes events.
+
+These rules are sometimes expressed as a _grammar_. For example, consider this regular expression:
+
+```
+(OnNext)*(OnError|OnComplete)
+```
+
+This formally captures the basic idea: there can be any number of calls to `OnNext` (maybe even zero calls), that occur in sequence, followed by either an `OnError` or an `OnComplete`, but not both, and there must be nothing after either of these.
+
+One last point: sequences may be infinite. This is true for `IEnumerable<T>`. It's perfectly possible for an enumerator to return `true` every time `MoveNext` is returned, in which case a `foreach` loop iterating over it will never reach the end. It might choose to stop (with a `break` or `return`), or some exception that did not originate from the enumerator might cause the loop to terminate, but it's absolutely acceptable for an `IEnumerable<T>` to produce items for as long as you keep asking for them. The same is true of a `IObservable<T>`. If you subscribe to an observable source, and by the time your program exits you've not received a call to either `OnComplete` or `OnError`, that's not a bug.
+
+So you might argue that this is a slightly better way to describe the rules formally:
+
+```
+(OnNext)*(OnError|OnComplete)?
+```
+
+More subtly, observable sources are allowed to do nothing at all. In fact there's a built-in implementation to save developers from the effort of writing a source that does nothing: if you call `Observable.Never<int>()` it will return an `IObservable<int>`, and if you subscribe to that, it will never call any methods on your observer. This might not look immediately useful—it is logically equivalent to an `IEnumerable<T>` in which the enumerator's `MoveNext` method never returns, which might not be usefully distinguishable from crashing. It's slightly different with Rx, because when we model this "no items emerge ever" behaviour, we don't need to block a thread forever to do it. We can just decide never to call any methods on the observer. This may seem daft, but as you've seen with the `Quiescent` example, sometimes we create observable sources not because we want the actual items that emerge from it, but because we're interested in the instants when interesting things happen. It can sometimes be useful to be able to model "nothing interesting ever happens" cases. For example, if you have written some code to detect unexpected inactivity (e.g., a sensor that stops producing values), and wanted to test that code, your test could use a `Never` source instead of a real one, to simulate a broken sensor.
+
+We're not quite done with the Rx's rules, but the last one applies only when we choose to unsubscribe from a source before it comes to a natural end.
+
+## Subscription Lifetime
+
+There's one more aspect of the relationship between observers and observables to understand: the lifetime of a subscription.
+
+You already know from the rules of `IObserver<T>` that a call to either `OnComplete` or `OnError` denotes the end of a sequence. We passed an `IObserver<T>` to `IObservable<T>.Subscribe`, and now the subscription is over. But what if we want to stop the subscription earlier?
+
+I mentioned earlier that the `Subscribe` method returns an `IDisposable`, which enables us to cancel our subscription. Perhaps we only subscribed to a source because our application opened some window showing the status of some process, and we wanted to update the window to reflect that's process's progress. If the user closes that window, we no longer have any use for the notifications. And although we could just ignore all further notifications, that could be a problem if the thing we're monitoring never reaches a natural end. Our observer would continue to receive notifications for the lifetime of the application. This is a waste of CPU power (and thus power consumption, with corresponding implications for battery life and environmental impact) and it can also prevent the garbage collector from reclaiming memory that should have become free.
+
+So we are free to indicate that we no longer wish to receive notifications by calling `Dispose` on the object returned by `Subscribe`. There are, however, a few non-obvious details.
+
+### Disposal of Subscriptions is Optional
+
+You are not required to call `Dispose` on the object returned by `Subscribe`. Obviously if you want to remain subscribed to events for the lifetime of your process, this makes sense: you never stop using the object, so of course you don't dispose it. But what might be less obvious is that if you subscribe to an `IObservable<T>` that does come to an end, it automatically tidies up after itself.
+
+`IObservable<T>` implementations are not allowed to assume that you will definitely call `Dispose`, so they are required to perform any necessary cleanup if they stop by calling the observer's `OnCompleted` or `OnError`. This is unusual. In most cases where a .NET API returns a brand new object created on your behalf that implements `IDisposable`, it's an error not to dispose it. But `IDisposable` objects representing Rx subscriptions are an exception to this rule. You only need to dispose them if you want them to stop earlier than they otherwise would.
+
+### Cancelling Subscriptions may be Slow or Even Ineffectual
+
+`Dispose` won't necessarily take effect instantly. Obviously it will take some non-zero amount of time in between your code calling into `Dispose`, and the `Dispose` implementation reaching the point where it actually does something. Less obviously, some observable sources may need to do non-trivial work to shut things down.
+
+A source might create a thread to be able to monitor for and report whatever events it represents. (That would happen with the filesystem source shown above when running on Linux on .NET 8, because the `FileSystemWatcher` class itself creates its own thread on Linux.) It might take a while for the thread to detect that it is supposed to shut down.
+
+It is fairly common practice for an `IObservable<T>` to represent some underlying work. For example, Rx can take any factory method that returns a `Task<T>` and wrap it as an `IObservable<T>`. It will invoke the factory once for each call to `Subscribe`, so if there are multiple subscribers to a single `IObservable<T>` of this kind, each one effectively gets its own `Task<T>`. This wrapper is able to supply the factory with a `CancellationToken`, and if an observer unsubscribes by calling `Dispose` before the task naturally runs to completion, it will put that `CancellationToken` into a cancelled state. This might have the effect of bringing the task to a halt, but that will work only if the task happens to be monitoring the `CancellationToken`. Even if it is, it might take some time to bring things to a complete halt. Crucially, the `Dispose` call doesn't wait for that to happen. It will attempt to initiate cancellation but it may return before cancellation is complete.
+
+### The Rules of Rx Sequences when Unsubscribing
+
+The fundamental rules of Rx sequences described earlier only considered sources that decided when (or whether) to come to a halt. What if a subscriber unsubscribes early? There is only one rule:
+
+Once the call to `Dispose` has returned, the source will make no further calls to the relevant observer. If you call `Dispose` on the object returned by `Subscribe`, then once that call returns you can be certain that the observer you passed in will receive no further calls to any of its three methods (`OnNext`, `OnError`, or `OnComplete`).
+
+That might seem clear enough, but it leaves a grey area: what happens when you've called `Dispose` but it hasn't returned yet? The rules permit sources to continue to emit events in this case. In fact they couldn't very well require otherwise: it will invariably take some non-zero length of time for the `Dispose` implementation to make enough progress to have any effect, so in a multi-threaded world it it's always going to be possible that an event gets delivered in between the call to `Dispose` starting, and the call having any effect. The only situation in which you could depend on no further events emerging would be if your call to `Dispose` happened inside the `OnNext` handler. In this case the source will already have noted a call to `OnNext` is in progress so further calls were already blocked before the call to `Dispose` started.
+
+But assuming that your observer wasn't already in the middle of an `OnNext` call, any of the following would be legal:
+
+* stopping calls to `IObserver<T>` almost immediately after `Dispose` begins, even when it takes a relatively long time to bring any relevant underlying processes to a halt, in which case your observer will never receive an `OnCompleted` or `OnError`
+* producing notifications that reflect the process of shutting down (including calling `OnError` if an error occurs while trying to bring things to a neat halt, or `OnCompleted` if it halted without problems)
+* producing a few more notifications for some time after the call to `Dispose` begins, but cutting them off at some arbitrary point, potentially losing track even of important things like errors that occurred while trying to bring things to a halt
+
+As it happens, Rx has a preference for the first option. If you're using an `IObservable<T>` implemented by the `System.Reactive` library (e.g., one returned by a LINQ operator) it is highly likely to have this characteristic. This is partly to avoid tricky situations in which observers try to do things to their sources inside their notification callbacks. Re-entrancy tends to be awkward to deal with, and Rx avoids ever having to deal with this particular form of re-entrancy by ensuring that it has already stopped delivering notifications to the observer before it begins the work of shutting down a subscription.
+
+This sometimes catches people out. If you need to be able to cancel some process that you are observing but you need to be able to observe everything it does up until the point that it stops, then you can't use unsubscription as the shutdown mechanism. As soon as you've called `Dispose`, the `IObservable<T>` that returned that `IDisposable` is no longer under any obligation to tell you anything. This can be frustrating, because the `IDisposable` returned by `Subscribe` can sometimes seem like such a natural and easy way to shut something down. But basic truth is this: once you've initiated unsubscription, you can't rely on getting any further notifications associated with that subscription. You _might_ receive some—the source is allowed to carry on supplying items until the call to `Dispose` returns. But you can't rely on it—the source is also allowed to silence itself immediately, and that's what most Rx-implemented sources will do.
+
+One subtle consequence of this is that if an observable source reports an error after a subscriber has unsubscribed, that error might be lost. A source might call `OnError` on its observer, but if that's a wrapper provided by Rx relating to a subscription that has already been disposed, it just ignores the exception. So it's best to think of early unsubscription as inherently messy, a bit like aborting a thread: it can be done but information can be lost, and there are race conditions that will disrupt normal exception handling.
+
+In short, if you unsubscribe, then a source is not obliged to tell you when things stop, and in most cases it definitely won't tell you.
+
+### Subscription Lifetime and Composition
+
+We typically combine multiple LINQ operators to express our processing requirements in Rx. What does this mean for subscription lifetime?
+
+For example, consider this:
+
+```csharp
+IObservable<int> source = GetSource();
+IObservable<int> filtered = source.Where(i => i % 2 == 0);
+IDisposable subscription = filtered.Subscribe(
+    i => Console.WriteLine(i),
+    error => Console.WriteLine($"OnError: {error}"),
+    () => Console.WriteLine("OnCompleted"));
+```
+
+We're calling `Subscribe` on the observable returned by `Where`. When we do that, it will in turn call `Subscribe` on the `IObservable<int>` returned by `GetSource` (stored in the `source` variable). So there is in effect a chain of subscriptions here. (We only have access to the `IDisposable` returned by `filtered.Subscribe` but the object that returns will be storing the `IDisposable` that it received when it called `source.Subscribe`.)
+
+If the source comes to an end all by itself (by calling either `OnCompleted` or `OnError`), this cascades through the chain. So `source` will call `OnCompleted` on the `IObserver<int>` that was supplied by the `Where` operator. And that in turn will call `OnCompleted` on the `IObserver<int>` that was passed to `filtered.Subscribe`, and that will have references to the three methods we passed, so it will call our completion handler. So you could look at this by saying that `source` completes, it tells `filtered` that it has completed, which invokes our completion handler. (In reality this is a very slight oversimplification, because `source` doesn't tell `filtered` anything; it's actually talking to the `IObserver<T>` that `filtered` supplied. This distinction matters if you have multiple subscriptions active simultaneously for the same chain of observables. But in this case, the simpler way of describing it is good enough even if it's not absolutely precise.)
+
+In short, completion bubbles up from the source, through all the operators, and arrives at our handler.
+
+What if we unsubscribe early by calling `subscription.Dispose()`? In that case it all happens the other way round. The `subscription` returned by `filtered.Subscribe` is the first to know that we're unsubscribing, but it will then call `Dispose` on the object that was returned when it called `source.Subscribe` for us.
+
+Either way, everything from the source to the observer, including any operators that were sitting in between, gets shut down.
+
+Now that we understand the relationship between an `IObservable<T>` source and the `IObserver<T>` interface that received event notifications, we can look at how we might create an `IObservable<T>` instance to represent events of interest in our application.

+ 1300 - 0
Rx.NET/Documentation/IntroToRx/03_CreatingObservableSequences.md

@@ -0,0 +1,1300 @@
+# Creating Observable Sequences
+
+In the preceding chapter, we saw the two fundamental Rx interfaces, `IObservable<T>` and `IObserver<T>`. We also saw how to receive events by implementing `IObserver<T>`, and also by using implementations supplied by the `System.Reactive` package. In this chapter we'll see how to create `IObservable<T>` sources to represent source events of interest in your application.
+
+We will begin by implementing `IObservable<T>` directly. In practice, it's relatively unusual to do that, so we'll then look at the various ways you can get `System.Reactive` to supply an implementation that does most of the work for you.
+
+## A Very Basic `IObservable<T>` Implementation
+
+Here's an implementation of an `IObservable<int>` that produces a sequence of numbers:
+
+```csharp
+public class MySequenceOfNumbers : IObservable<int>
+{
+    public IDisposable Subscribe(IObserver<int> observer)
+    {
+        observer.OnNext(1);
+        observer.OnNext(2);
+        observer.OnNext(3);
+        observer.OnCompleted();
+        return System.Reactive.Disposables.Disposable.Empty; // Handy do-nothing IDisposable
+    }
+}
+```
+
+We can test this by constructing an instance of it, and then subscribing to it:
+
+```csharp
+var numbers = new MySequenceOfNumbers();
+numbers.Subscribe(
+    number => Console.WriteLine($"Received value: {number}"),
+    () => Console.WriteLine("Sequence terminated"));
+```
+
+This produces the following output:
+
+```
+Received value 1
+Received value 2
+Received value 3
+Sequence terminated
+```
+
+Although `MySequenceOfNumbers` is technically a correct implementation of `IObservable<int>`, it is a little too simple to be useful. For one thing, we typically use Rx when there are events of interest, but this is not really reactive at all—it just produces a fixed set of numbers immediately. Moreover, the implementation is blocking—it doesn't even return from `Subscribe` until after it has finished producing all of its values. This example illustrates the basics of how a source provides events to a subscriber, but if we just want to represent a predetermined sequence of numbers, we might as well use an `IEnumerable<T>` implementation such as `List<T>` or an array.
+
+## Representing Filesystem Events in Rx
+
+Let's look at something a little more realistic. This is a wrapper around .NET's `FileSystemWatcher`, presenting filesystem change notifications as an `IObservable<FileSystemEventArgs>`. (Note: this is not necessarily the best design for an Rx `FileSystemWatcher` wrapper. The watcher provides events for several different types of change, and one of them, `Renamed`, provides details as a `RenamedEventArgs`. This derives from `FileSystemEventArgs` so collapsing everything down to a single event stream does work, but this would be inconvenient for applications that wanted access to the details of rename events. A more serious design problem is that this is incapable of reporting more than one event from `FileSystemWatcher.Error`. Such errors might be transient and recoverable, in which case an application might want to continue operating, but since this class chooses to represent everything with a single `IObservable<T>`, it reports errors by invoking the observer's `OnError`, at which point the rules of Rx oblige us to stop. It would be possible to work around this with Rx's `Retry` operator, which can automatically resubscribe after an error, but it might be better to offer a separate `IObservable<ErrorEventArgs>` so that we can report errors in a non-terminating way. However, the additional complication of that won't always be warranted. The simplicity of this design means it will be a good fit for some applications. As is often the way with software design, there isn't a one-size-fits-all approach.)
+
+```csharp
+// Represents filesystem changes as an Rx observable sequence.
+// NOTE: this is an oversimplified example for illustration purposes.
+//       It does not handle multiple subscribers efficiently, it does not
+//       use IScheduler, and it stops immediately after the first error.
+public class RxFsEvents : IObservable<FileSystemEventArgs>
+{
+    private readonly string folder;
+
+    public RxFsEvents(string folder)
+    {
+        this.folder = folder;
+    }
+
+    public IDisposable Subscribe(IObserver<FileSystemEventArgs> observer)
+    {
+        // Inefficient if we get multiple subscribers.
+        FileSystemWatcher watcher = new(this.folder);
+
+        // FileSystemWatcher's documentation says nothing about which thread
+        // it raises events on (unless you use its SynchronizationObject,
+        // which integrates well with Windows Forms, but is inconvenient for
+        // us to use here) nor does it promise to wait until we've
+        // finished handling one event before it delivers the next. The Mac,
+        // Windows, and Linux implementations are all significantly different,
+        // so it would be unwise to rely on anything not guaranteed by the
+        // documentation. (As it happens, the Win32 implementation on .NET 7
+        // does appear to wait until each event handler returns before
+        // delivering the next event, so we probably would get way with
+        // ignoring this issue. For now. On Windows. And actually the Linux
+        // implementation dedicates a single thread to this job, but there's
+        // a comment in the source code saying that this should probably
+        // change - another reason to rely only on documented behaviour.)
+        // So it's our problem to ensure we obey the rules of IObserver<T>.
+        // First, we need to make sure that we only make one call at a time
+        // into the observer. A more realistic example would use an Rx
+        // IScheduler, but since we've not explained what those are yet,
+        // we're just going to use lock with this object.
+        object sync = new();
+
+        // More subtly, the FileSystemWatcher documentation doesn't make it
+        // clear whether we might continue to get a few more change events
+        // after it has reported an error. Since there are no promises about
+        // threads, it's possible that race conditions exist that would lead to
+        // us trying to handle an event from a FileSystemWatcher after it has
+        // reported an error. So we need to remember if we've already called
+        // OnError to make sure we don't break the IObserver<T> rules in that
+        // case.
+        bool onErrorAlreadyCalled = false;
+
+        void SendToObserver(object _, FileSystemEventArgs e)
+        {
+            lock (sync)
+            {
+                if (!onErrorAlreadyCalled)
+                {
+                    observer.OnNext(e); 
+                }
+            }
+        }
+
+        watcher.Created += SendToObserver;
+        watcher.Changed += SendToObserver;
+        watcher.Renamed += SendToObserver;
+        watcher.Deleted += SendToObserver;
+
+        watcher.Error += (_, e) =>
+        {
+            lock (sync)
+            {
+                // The FileSystemWatcher might report multiple errors, but
+                // we're only allowed to report one to IObservable<T>.
+                if (onErrorAlreadyCalled)
+                {
+                    observer.OnError(e.GetException());
+                    onErrorAlreadyCalled = true; 
+                    watcher.Dispose();
+                }
+            }
+        };
+
+        watcher.EnableRaisingEvents = true;
+
+        return watcher;
+    }
+}
+```
+
+That got more complex fast. This illustrates that `IObservable<T>` implementations are responsible for obeying the `IObserver<T>` rules. This is generally a good thing: it keeps the messy concerns around concurrency contained in a single place. Any `IObserver<FileSystemEventArgs>` that I subscribe to this `RxFsEvents` doesn't have to worry about concurrency, because it can count on the `IObserver<T>` rules, which guarantee that it will only have to handle one thing at a time. If I hadn't been required to enforce these rules in the source, it might have made my `RxFsEvents` class simpler, but all of that complexity of dealing with overlapping events would have spread out into the code that handles the events. Concurrency is hard enough to deal with when its effects are contained. Once it starts to spread across multiple types, it can become almost impossible to reason about. Rx's `IObserver<T>` rules prevent this from happening.
+
+(Note: this is a significant feature of Rx. The rules keep things simple for observers. This becomes increasingly important as the complexity of your event sources or event process grows.)
+
+There are a couple of issues with this code (aside from the API design issues already mentioned). One is that when `IObservable<T>` implementations produce events modelling real-life asynchronous activity (such as filesystem changes) applications will often want some way to take control over which threads notifications arrive on. For example, UI frameworks tend to have thread affinity requirements. You typically need to be on a particular thread to be allowed to update the user interface. Rx provides mechanisms for redirecting notifications onto different schedulers, so we can work around it, but we would normally expect to be able to provide this sort of observer with an `IScheduler`, and for it to deliver notifications through that. We'll discuss schedulers in later chapters.
+
+The other issue is that this does not deal with multiple subscribers efficiently. You're allowed to call `IObservable<T>.Subscribe` multiple times, and if you do that with this code, it will create a new `FileSystemWatcher` each time. That could happen more easily than you might think. Suppose we had an instance of this watcher, and wanted to handle different events in different ways. We might use the `Where` operator to define observable sources that split events up in the way we want:
+
+```csharp
+IObservable<FileSystemEventArgs> configChanges =
+    fs.Where(e => Path.GetExtension(e.Name) == ".config");
+IObservable<FileSystemEventArgs> deletions =
+    fs.Where(e => e.ChangeType == WatcherChangeTypes.Deleted);
+```
+
+When you call `Subscribe` on the `IObservable<T>` returned by the `Where` operator, it will call `Subscribe` on its input. So in this case, if we call `Subscribe` on both `configChanges` and `deletions`, that will result in _two_ calls to `Subscribe` on `rs`. So if `rs` is an instance of our `RxFsEvents` type above, each one will construct its own `FileSystemEventWatcher`, which is inefficient.
+
+Rx offers a few ways to deal with this. It provides operators designed specifically to take an `IObservable<T>` that does not tolerate multiple subscribers and wrap it in an adapter that can:
+
+```csharp
+IObservable<FileSystemEventArgs> fs =
+    new RxFsEvents(@"c:\temp")
+    .Publish()
+    .RefCount();
+```
+
+But this is leaping ahead. (These operators are described in [the Publishing Operators chapter](15_PublishingOperators.md).) If you want to build a type that is inherently multi-subscriber-friendly, all you really need to do is keep track of all your subscribers and notify each of them in a loop. Here's a modified version of the filesystem watcher:
+
+```csharp
+public class RxFsEventsMultiSubscriber : IObservable<FileSystemEventArgs>
+{
+    private readonly object sync = new();
+    private readonly List<Subscription> subscribers = new();
+    private readonly FileSystemWatcher watcher;
+
+    public RxFsEventsMultiSubscriber(string folder)
+    {
+        this.watcher = new FileSystemWatcher(folder);
+
+        watcher.Created += SendEventToObservers;
+        watcher.Changed += SendEventToObservers;
+        watcher.Renamed += SendEventToObservers;
+        watcher.Deleted += SendEventToObservers;
+
+        watcher.Error += SendErrorToObservers;
+    }
+
+    public IDisposable Subscribe(IObserver<FileSystemEventArgs> observer)
+    {
+        Subscription sub = new(this, observer);
+        lock (this.sync)
+        {
+            this.subscribers.Add(sub); 
+
+            if (this.subscribers.Count == 1)
+            {
+                // We had no subscribers before, but now we've got one so we need
+                // to start up the FileSystemWatcher.
+                watcher.EnableRaisingEvents = true;
+            }
+        }
+
+        return sub;
+    }
+
+    private void Unsubscribe(Subscription sub)
+    {
+        lock (this.sync)
+        {
+            this.subscribers.Remove(sub);
+
+            if (this.subscribers.Count == 0)
+            {
+                watcher.EnableRaisingEvents = false;
+            }
+        }
+    }
+
+    void SendEventToObservers(object _, FileSystemEventArgs e)
+    {
+        lock (this.sync)
+        {
+            foreach (var subscription in this.subscribers)
+            {
+                subscription.Observer.OnNext(e);
+            }
+        }
+    }
+
+    void SendErrorToObservers(object _, ErrorEventArgs e)
+    {
+        Exception x = e.GetException();
+        lock (this.sync)
+        {
+            foreach (var subscription in this.subscribers)
+            {
+                subscription.Observer.OnError(x);
+            }
+
+            this.subscribers.Clear();
+        }
+    }
+
+    private class Subscription : IDisposable
+    {
+        private RxFsEventsMultiSubscriber? parent;
+
+        public Subscription(
+            RxFsEventsMultiSubscriber rxFsEventsMultiSubscriber,
+            IObserver<FileSystemEventArgs> observer)
+        {
+            this.parent = rxFsEventsMultiSubscriber;
+            this.Observer = observer;
+        }
+        
+        public IObserver<FileSystemEventArgs> Observer { get; }
+
+        public void Dispose()
+        {
+            this.parent?.Unsubscribe(this);
+            this.parent = null;
+        }
+    }
+}
+```
+
+This creates only a single `FileSystemWatcher` instance no matter how many times `Subscribe` is called. Notice that I've had to introduce a nested class to provide the `IDisposable` that `Subscribe` returns. I didn't need that with the very first `IObservable<T>` implementation in this chapter because it had already completed the sequence before returning, so it was able to return the `Disposable.Empty` property conveniently supplied by Rx. (This is handy in cases where you're obliged to supply an `IDisposable`, but you don't actually need to do anything when disposed.) And in my first `FileSystemWatcher` wrapper, `RxFsEvents`, I just returned the `FileSystemWatcher` itself from `Dispose`. (This works because `FileSystemWatcher.Dispose` shuts down the watcher, and each subscriber was given its own `FileSystemWatcher`.) But now that a single `FileSystemWatcher` supports multiple observers, we need to do a little more work when an observer unsubscribes.
+
+When a `Subscription` instance that we returned from `Subscribe` gets disposed, it removes itself from the list of subscribers, ensuring that it won't receive any more notifications. It also sets the `FileSystemWatcher`'s `EnableRaisingEvents` to false if there are no more subscribers, ensuring that this source does not do unnecessary work if nothing needs notifications right now.
+
+This is looking more realistic than the first example. This is truly a source of events that could occur at any moment (making this exactly the sort of thing well suited to Rx) and it now handles multiple subscribers intelligently. However, we wouldn't often write things this way. We're doing all the work ourselves here—this code doesn't even require a reference to the `System.Reactive` package because the only Rx types it refers to are `IObservable<T>` and `IObserver<T>`, both of which are built into the .NET runtime libraries. In practice we typically defer to helpers in `System.Reactive` because they can do a lot of work for us.
+
+For example, suppose we only cared about `Changed` events. We could write just this:
+
+```csharp
+FileSystemWatcher watcher = new (@"c:\temp");
+IObservable<FileSystemEventArgs> changes = Observable
+    .FromEventPattern<FileSystemEventArgs>(watcher, nameof(watcher.Changed))
+    .Select(ep => ep.EventArgs);
+watcher.EnableRaisingEvents = true;
+```
+
+Here we're using the `FromEventPattern` helper from the `System.Reactive` library's `Observable` class, which can be used to build an `IObservable<T>` from any .NET event that conforms to the normal pattern (in which event handlers take two arguments: a sender of type `object`, and then some `EventArgs`-derived type containing information about the event). This is not as flexible as the earlier example. It reports only one of the events, and we have to manually start (and, if necessary stop) the `FileSystemWatcher`. But for some applications that will be good enough, and this is a lot less code to write. If we were aiming to write a fully-featured wrapper for `FileSystemWatcher` suitable for many different scenarios, it might be worth writing a specialized `IObservable<T>` implementation as shown earlier. (We could easily extend this last example to watch all of the events. We'd just use the `FromEventPattern` once for each event, and then use `Observable.Merge` to combine the four resulting observables into one. The only real benefit we're getting from a full custom implementation is that we can automatically start and stop the `FileSystemWatcher` depending on whether there are currently any observers.) But if we just need to represent some events as an `IObservable<T>` so that we can work with them in our application, we can just use this simpler approach.
+
+In practice, we almost always get `System.Reactive` to implement `IObservable<T>` for us. Even if we want to take control of certain aspects (such as automatically starting up and shutting down the `FileSystemWatcher` in these examples) we can almost always find a combination of operators that enable this. The following code uses various methods from `System.Reactive` to return an `IObservable<FileSystemEventArgs>` that has all the same functionality as the fully-featured hand-written `RxFsEventsMultiSubscriber` above, but with considerably less code.
+
+```csharp
+IObservable<FileSystemEventArgs> ObserveFileSystem(string folder)
+{
+    return 
+        // Observable.Defer enables us to avoid doing any work
+        // until we have a subscriber.
+        Observable.Defer(() =>
+            {
+                FileSystemWatcher fsw = new(folder);
+                fsw.EnableRaisingEvents = true;
+
+                return Observable.Return(fsw);
+            })
+        // Once the preceding part emits the FileSystemWatcher
+        // (which will happen when someone first subscribes), we
+        // want to wrap all the events as IObservable<T>s, for which
+        // we'll use a projection. To avoid ending up with an
+        // IObservable<IObservable<FileSystemEventArgs>>, we use
+        // SelectMany, which effectively flattens it by one level.
+        .SelectMany(fsw =>
+            Observable.Merge(new[]
+                {
+                    Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
+                        h => fsw.Created += h, h => fsw.Created -= h),
+                    Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
+                        h => fsw.Changed += h, h => fsw.Changed -= h),
+                    Observable.FromEventPattern<RenamedEventHandler, FileSystemEventArgs>(
+                        h => fsw.Renamed += h, h => fsw.Renamed -= h),
+                    Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
+                        h => fsw.Deleted += h, h => fsw.Deleted -= h)
+                })
+            // FromEventPattern supplies both the sender and the event
+            // args. Extract just the latter.
+            .Select(ep => ep.EventArgs)
+            // The Finally here ensures the watcher gets shut down once
+            // we have no subscribers.
+            .Finally(() => fsw.Dispose()))
+        // This combination of Publish and RefCount means that multiple
+        // subscribers will get to share a single FileSystemWatcher,
+        // but that it gets shut down if all subscribers unsubscribe.
+        .Publish()
+        .RefCount();
+}
+```
+
+I've used a lot of methods there, most of which I've not talked about before. For that example to make any sense, I clearly need to start describing the numerous ways in which the `System.Reactive` package can implement `IObservable<T>` for you.
+
+## Simple factory methods
+
+Due to the large number of methods available for creating observable sequences, we will break them down into categories. Our first category of methods create `IObservable<T>` sequences that produce at most a single result.
+
+### Observable.Return
+
+One of the simplest factory methods is `Observable.Return<T>(T value)`, which you've already seen in the `Quiescent` example in the preceding chapter. This method takes a value of type `T` and returns an `IObservable<T>` which will produce this single value and then complete. In a sense, this _wraps_ a value in an `IObservable<T>`; it's conceptually similar to writing `new T[] { value }`, in that it's a sequence containing just one element. You could also think of it as being the Rx equivalent of `Task.FromResult`, which you can use when you have a value of some type `T`, and need to pass it to something that wants a `Task<T>`.
+
+```csharp
+IObservable<string> singleValue = Observable.Return<string>("Value");
+```
+
+I specified the type parameter for clarity, but this is not necessary as the compiler can infer the type from argument provided:
+
+```csharp
+IObservable<string> singleValue = Observable.Return("Value");
+```
+
+`Return` produces a cold observable: each subscriber will receive the value immediately upon subscription. ([Hot and cold observables](02_KeyTypes.md#hot-and-cold-sources) were described in the preceding chapter.)
+
+### Observable.Empty
+
+Sometimes it can be useful to have an empty sequence. .NET's `Enumerable.Empty<T>()` does this for `IEnumerable<T>`, and Rx has a direct equivalent in the form of `Observable.Empty<T>()`, which returns an empty `IObservable<T>`. We need to provide the type argument because there's no value from which the compiler can infer the type.
+
+```csharp
+IObservable<string> empty = Observable.Empty<string>();
+```
+
+In practice, an empty sequence is one that immediately calls `OnCompleted` on any subscriber.
+
+In comparison with `IEnumerable<T>`, this is just the Rx equivalent of an empty list, but there's another way to look at it. Rx is a powerful way to model asynchronous processes, so you could think of this as being similar to a task that completes immediately without producing any result—so it has a conceptual resemblance to `Task.CompletedTask`. (This is not as close an analogy as that between `Observable.Return` and `Task.FromResult`, because in that case we're comparing an `IObservable<T>` with a `Task<T>`, whereas here we're comparing an `IObservable<T>` with a `Task`—the only way for a task to complete without producing anything is if we use the non-generic version of `Task`.)
+
+### Observable.Never
+
+The `Observable.Never<T>()` method returns a sequence which, like `Empty`, does not produce any values, but unlike `Empty`, it never ends. In practice, that means that it never invokes any method (neither `OnNext`, `OnCompleted`, nor `OnError`) on subscribers. Whereas `Observable.Empty<T>()` completes immediately, `Observable.Never<T>` has infinite duration.
+
+```csharp
+IObservable<string> never = Observable.Never<string>();
+```
+
+It might not seem obvious why this could be useful. I gave one possible use in the last chapter: you could use this in a test to simulate a source that wasn't producing any values, perhaps to enable your test to validate timeout logic.
+
+It can also be used in places where we use observables to represent time-based information. Sometimes we don't actually care what emerges from an observable; we might care only _when_ something (anything) happens. (We saw an example of this "observable sequence used purely for timing purposes" concept in the preceding chapter, although `Never` wouldn't make sense in that particular scenario. The `Quiescent` example used the `Buffer` operator, which works over two observable sequences: the first contains the items of interest, and the second is used purely to determine how to cut the first into chunks. `Buffer` doesn't do anything with the values produced by the second observable: it pays attention only to _when_ values emerge, completing the previous chunk each time the second observable produces a value. And if we're representing temporal information it can sometimes be useful to have a way to represent the idea that some event never occurs.)
+
+As an example of where you might want to use `Never` for timing purposes, suppose you were using some Rx-based library that offered a timeout mechanism, where an operation would be cancelled when some timeout occurs, and the timeout is itself modelled as an observable sequence. If for some reason you didn't want a timeout, and just want to wait indefinitely, you could specify a timeout of `Observable.Never`.
+
+### Observable.Throw
+
+`Observable.Throw<T>(Exception)` returns a sequence that immediately reports an error to any subscriber. As with `Empty` and `Never`, we don't supply a value to this method (just an exception) so we need to provide a type parameter so that it knows what `T` to use in the `IObservable<T>` that it returns. (It will never actually a produce a `T`, but you can't have an instance of `IObservable<T>` without picking some particular type for `T`.)
+
+```csharp
+IObservable<string> throws = Observable.Throw<string>(new Exception()); 
+```
+
+### Observable.Create
+
+The `Create` factory method is more powerful than the other creation methods because it can be used to create any kind of sequence. You could implement any of the preceding four methods with `Observable.Create`.
+The method signature itself may seem more complex than necessary at first, but becomes quite natural once you are used to it.
+
+```csharp
+// Creates an observable sequence from a specified Subscribe method implementation.
+public static IObservable<TSource> Create<TSource>(
+    Func<IObserver<TSource>, IDisposable> subscribe)
+{...}
+public static IObservable<TSource> Create<TSource>(
+    Func<IObserver<TSource>, Action> subscribe)
+{...}
+```
+
+You provide this with a delegate that will be executed each time a subscription is made. Your delegate will be passed an `IObserver<T>`. Logically speaking, this represents the observer passed to the `Subscribe` method, although in practice Rx puts a wrapper around that for various reasons. You can call the `OnNext`/`OnError`/`OnCompleted` methods as you need. This is one of the few scenarios where you will work directly with the `IObserver<T>` interface. Here's a simple example that produces three items:
+
+```csharp
+private IObservable<int> SomeNumbers()
+{
+    return Observable.Create<int>(
+        (IObserver<string> observer) =>
+        {
+            observer.OnNext(1);
+            observer.OnNext(2);
+            observer.OnNext(3);
+            observer.OnCompleted();
+
+            return Disposable.Empty;
+        });
+}
+```
+
+Your delegate must return either an `IDisposable` or an `Action` to enable unsubscription. When the subscriber disposes their subscription in order to unsubscribe, Rx will invoke `Dispose()` on the `IDisposable` you returned, or in the case where you returned an `Action`, it will invoke that.
+
+This example is reminiscent of the `MySequenceOfNumbers` example from the start of this chapter, in that it immediately produces a few fixed values. The main difference in this case is that Rx adds some wrappers that can handle awkward situations such as re-entrancy. Rx will sometimes automatically defer work to prevent deadlocks, so it's possible that code consuming the `IObservable<string>` returned by this method will see a call to `Subscribe` return before the callback in the code above runs, in which case it would be possible for them to unsubscribe inside their `OnNext` handler.
+
+The following sequence diagram shows how this could occur in practice. Suppose the `IObservable<int>` returned by `SomeNumbers` has been wrapped by Rx in a way that ensures that subscription occurs in some different execution context. We'd typically determine the context by using a suitable [scheduler](11_SchedulingAndThreading.md#schedulers). (The [`SubscribeOn`](11_SchedulingAndThreading.md#subscribeon-and-observeon) operator creates such a wrapper.) We might use the [`TaskPoolScheduler`](11_SchedulingAndThreading.md#taskpoolscheduler) in order to ensure that the subscription occurs on some task pool thread. So when our application code calls `Subscribe`, the wrapper `IObservable<int>` doesn't immediately subscribe to the underlying observable. Instead it queues up a work item with the scheduler to do that, and then immediately returns without waiting for that work to run. This is how our subscriber can be in possession of an `IDisposable` representing the subscription before `Observable.Create` invokes our callback. The diagram shows the subscriber then making this available to the observer.
+
+![A sequence diagram with 6 participants: Subscriber, Rx IObservable Wrapper, Scheduler, Observable.Create, Rx IObserver Wrapper, and Observer. It shows the following messages. Subscriber sends "Subscribe()" to Rx IObservable Wrapper. Rx IObservable Wrapper sends "Schedule Subscribe()" to Scheduler. Rx IObservable Wrapper returns "IDisposable (subscription)" to Subscriber. Subscriber sends "Set subscription IDisposable" to Observer. Scheduler sends "Subscribe()" to Observable.Create. Observable.Create sends "OnNext(1)" to Rx IObserver Wrapper. Rx IObserver Wrapper sends "OnNext(1)" to Observer. Observable.Create sends "OnNext(2)" to Rx IObserver Wrapper. Rx IObserver Wrapper sends "OnNext(2)" to Observer. Observer sends "subscription.Dispose()" to Rx IObservable Wrapper. Observable.Create sends "OnNext(3)" to Rx IObserver Wrapper. Observable.Create sends "OnCompleted()" to Rx IObserver Wrapper.](GraphicsIntro/Ch03-Sequence-CreateWrappers.svg)
+
+The diagram shows the scheduler call `Subscribe` on the underlying observable after this, and that will mean the call back we passed to `Observable.Create<int>` will now run. Our callback calls `OnNext`, but it is not passed the real observer: instead it is passed another Rx-generated wrapper. That wrapper initially forwards calls directly onto the real observer, but our diagram shows that when the real observer (all the way over on the right) receives the its second call (`OnNext(2)`) it unsubscribes by calling `Dispose` on the `IDisposable` that was returned when we subscribed to the Rx `IObservable` wrapper. The two wrappers here—the `IObservable` and `IObserver` wrappers—are connected, so when we unsubscribe from the `IObservable` wrapper, it tells the `IObserver` wrapper that the subscription is being shut down. This means that when our `Observable.Create<int>` callback calls `OnNext(3)` on the `IObserver` wrapper, that wrapper does _not_ forward it to the real observer, because it knows that that observer has already unsubscribed. (It also doesn't forward the `OnCompleted`, for the same reason.)
+
+You might be wondering how the `IDisposable` we return to `Observable.Create` can ever do anything useful. It's the return value of the callback, so we can only return it to Rx as the last thing our callback does. Won't we always have finished our work by the time we return, meaning there's nothing to cancel? Not necessarily—we might kick off some work that continues to run after we return. This next example does that, meaning that the unsubscription action it returns is able to do something useful: it sets a cancellation token that is being observed by the loop that generates our observable's output. (This returns a callback instead of an `IDisposable`—`Observable.Create` offers overloads that let you do either. In this case, Rx will invoke our callback when the subscription is terminated early.)
+
+```csharp
+IObservable<char> KeyPresses() =>
+    Observable.Create<char>(observer =>
+    {
+        CancellationTokenSource cts = new();
+        Task.Run(() =>
+        {
+            while (!cts.IsCancellationRequested)
+            {
+                ConsoleKeyInfo ki = Console.ReadKey();
+                observer.OnNext(ki.KeyChar);
+            }
+        });
+
+        return () => cts.Cancel();
+    });
+```
+
+This illustrates how cancellation won't necessarily take effect immediately. The `Console.ReadKey` API does not offer an overload accepting a `CancellationToken`, so this observable won't be able to detect that cancellation is requested until the user next presses a key, causing `ReadKey` to return.
+
+Bearing in mind that cancellation might have been requested while we were waiting for `ReadKey` to return, you might think we should check for that after `ReadKey` returns and before calling `OnNext`. In fact it doesn't matter if we don't. Rx has a rule that says an observable source _must not_ call into an observer _after_ a call to `Dispose` on that observer's subscription returns. To enforce that rule, if the callback you pass to `Observable.Create` continues to call methods on its `IObserver<T>` after a request to unsubscribe, Rx just ignores the call. This is one reason why the `IObserver<T>` it passes to you is a wrapper: it can intercept the calls before they are passed to the underlying observer. However, that convenience means there are two important things to be aware of
+1. if you _do_ ignore attempts to unsubscribe and continue to do work to produce items, you are just wasting time because nothing will receive those items
+2. if you call `OnError` it's possible that nothing is listening and that the error will be completely ignored.
+
+There are overloads of `Create` designed to support `async` methods. This next method exploits this to be able to use the asynchronous `ReadLineAsync` method to present lines of text from a file as an observable source.
+
+```csharp
+IObservable<string> ReadFileLines(string path) =>
+    Observable.Create<string>(async (observer, cancellationToken) =>
+    {
+        using (StreamReader reader = File.OpenText(path))
+        {
+            while (cancellationToken.IsCancellationRequested)
+            {
+                string? line = await reader.ReadLineAsync(cancellationToken).ConfigureAwait(false);
+                if (line is null)
+                {
+                    break;
+                }
+
+                observer.OnNext(line);
+            }
+
+            observer.OnCompleted();
+        }
+    });
+```
+
+Reading data from a storage device typically doesn't happen instantaneously (unless it happens to be in the filesystem cache already), so this source will provide data as quickly as it can be read from storage.
+
+Notice that because this is an `async` method, it will typically return to its caller before it completes. (The first `await` that actually has to wait returns, and the remainder of the method runs via a callback when the work completes.) That means that subscribers will typically be in possession of the `IDisposable` representing their subscription before this method finishes, so we're using a different mechanism to handle unsubscription here. This particular overload of `Create` passes its callback not just an `IObserver<T>` but also a `CancellationToken`, with which it will request cancellation when unsubscription occurs.
+
+File IO can encounter errors. The file we're looking for might not exist, or we might be unable to open it due to security restrictions, or because some other application is using it. The file might be on a remote storage server, and we could lose network connectivity. For this reason, we must expect exceptions from such code. This example has done nothing to detect exceptions, and yet the `IObservable<string>` that this `ReadFileLines` method returns will in fact report any exceptions that occur. This is because the `Create` method will catch any exception that emerges from our callback and report it with `OnError`. (If our code already called `OnComplete` on the observer, Rx won't call `OnError` because that would violate the rules. Instead it will silently drop the exception, so it's best not to attempt to do any work after you call `OnCompleted`.) 
+
+This automatic exception delivery is another example of why the `Create` factory method is the preferred way to implement custom observable sequences. It is almost always a better option than creating custom types that implement the `IObservable<T>` interface. This is not just because it saves you some time. It's also that Rx tackles the intricacies that you may not think of such as thread safety of notifications and disposal of subscriptions.
+
+The `Create` method entails lazy evaluation, which is a very important part of Rx. It opens doors to other powerful features such as scheduling and combination of sequences that we will see later. The delegate will only be invoked when a subscription is made. So in the `ReadFileLines` example, it won't attempt to open the file until you subscribe to the `IObservable<string>` that is returned. If you subscribe multiple times, it will execute the callback each time. (So if the file has changed, you can retrieve the latest contents by calling `Subscribe` again.)
+
+As an exercise, try to build the `Empty`, `Return`, `Never` & `Throw` extension methods yourself using the `Create` method. If you have Visual Studio or [LINQPad](http://www.linqpad.net/) available to you right now, code it up as quickly as you can, or if you have Visual Studio Code, you could create a new [Polyglot Notebook](https://code.visualstudio.com/docs/languages/polyglot). (Polyglot Notebooks make Rx available automatically, so you can just write a C# cell with a suitable `using` directive, and you're up and running.) If you don't (perhaps you are on the train on the way to work), try to conceptualize how you would solve this problem.
+
+You completed that last step before moving onto this paragraph, right? Because you can now compare your versions with these examples of `Empty`, `Return`, `Never` and `Throw` recreated with `Observable.Create`:
+
+```csharp
+public static IObservable<T> Empty<T>()
+{
+    return Observable.Create<T>(o =>
+    {
+        o.OnCompleted();
+        return Disposable.Empty;
+    });
+}
+
+public static IObservable<T> Return<T>(T value)
+{
+    return Observable.Create<T>(o =>
+    {
+        o.OnNext(value);
+        o.OnCompleted();
+        return Disposable.Empty;
+    });
+}
+
+public static IObservable<T> Never<T>()
+{
+    return Observable.Create<T>(o =>
+    {
+        return Disposable.Empty;
+    });
+}
+
+public static IObservable<T> Throws<T>(Exception exception)
+{
+    return Observable.Create<T>(o =>
+    {
+        o.OnError(exception);
+        return Disposable.Empty;
+    });
+}
+```
+
+You can see that `Observable.Create` provides the power to build our own factory methods if we wish.
+
+### Observable.Defer
+
+One very useful aspect of `Observable.Create` is that it provides a place to put code that should run only when subscription occurs. Often, libraries will make `IObservable<T>` properties available that won't necessarily be used by all applications, so it can be useful to defer the work involved until you know you will really need it. This deferred initialization is inherent to how `Observable.Create` works, but what if the nature of our source means that `Observable.Create` is not a good fit? How can we perform deferred initialization in that case? Rx providers `Observable.Defer` for this purpose.
+
+I've already used `Defer` once. The `ObserveFileSystem` method returned an `IObservable<FileSystemEventArgs>` reporting changes in a folder. It was not a good candidate for `Observable.Create` because it provided all the notifications we wanted as .NET events, so it made sense to use Rx's event adaptation features. But we still wanted to defer the creation of the `FileSystemWatcher` until the moment of subscription, which is why that example used `Observable.Defer`.
+
+`Observable.Defer` takes a callback that returns an `IObservable<T>`, and `Defer` wraps this with an `IObservable<T>` that invokes that callback upon subscription. To show the effect, I'm first going to show an example that does not use `Defer`:
+
+```csharp
+static IObservable<int> WithoutDeferal()
+{
+    Console.WriteLine("Doing some startup work...");
+    return Observable.Range(1, 3);
+}
+
+Console.WriteLine("Calling factory method");
+IObservable<int> s = WithoutDeferal();
+
+Console.WriteLine("First subscription");
+s.Subscribe(Console.WriteLine);
+
+Console.WriteLine("Second subscription");
+s.Subscribe(Console.WriteLine);
+```
+
+This produces the following output:
+
+```
+Calling factory method
+Doing some startup work...
+First subscription
+1
+2
+3
+Second subscription
+1
+2
+3
+```
+
+As you can see, the `"Doing some startup work...` message appears when we call the factory method, and before we've subscribed. So if nothing ever subscribed to the `IObservable<int>` that method returns, the work would be done anyway, wasting time and energy. Here's the `Defer` version:
+
+```csharp
+static IObservable<int> WithDeferal()
+{
+    return Observable.Defer(() =>
+    {
+        Console.WriteLine("Doing some startup work...");
+        return Observable.Range(1, 3);
+    });
+}
+```
+
+If we were to use this with similar code to the first example, we'd see this output:
+
+```
+Calling factory method
+First subscription
+Doing some startup work...
+1
+2
+3
+Second subscription
+Doing some startup work...
+1
+2
+3
+```
+
+There are two important differences. First, the `"Doing some startup work..."` message does not appear until we first subscribe, illustrating that `Defer` has done what we wanted. However, notice that the message now appears twice: it will do this work each time we subscribe. If you want this deferred initialization but you'd also like once-only execution, you should look at the operators in the [Publishing Operators chapter](15_PublishingOperators.md), which provide various ways to enable multiple subscribers to share a single subscription to an underlying source.
+
+## Sequence Generators
+
+The creation methods we've looked at so far are straightforward in that they either produce very simple sequences (such as single-element, or empty sequences), or they rely on our code to tell them exactly what to produce. Now we'll look at some methods that can produce longer sequences.
+
+### Observable.Range
+
+`Observable.Range(int, int)` returns an `IObservable<int>` that produces a range of integers. The first integer is the initial value and the second is the number of values to yield. This example will write the values '10' through to '24' and then complete.
+
+```csharp
+IObservable<int> range = Observable.Range(10, 15);
+range.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
+```
+
+### Observable.Generate
+
+Suppose you wanted to emulate the `Range` factory method using `Observable.Create`. You might try this:
+
+```csharp
+// Not the best way to do it!
+IObservable<int> Range(int start, int count) =>
+    Observable.Create<int>(observer =>
+        {
+            for (int i = 0; i < count; ++i)
+            {
+                observer.OnNext(start + i);
+            }
+
+            return Disposable.Empty;
+        });
+```
+
+This will work, but it does not respect request to unsubscribe. That won't cause direct harm, because Rx detects unsubscription, and will simply ignore any further values we produce. However, it's a waste of CPU time (and therefore energy, with consequent battery lifetime and/or environmental impact) to carry on generating numbers after nobody is listening. How bad that is depends on how long a range was requested. But imagine you wanted an infinite sequence? Perhaps it's useful to you to have an `IObservable<BigInteger>` that produces value from the Fibonacci sequence, or prime numbers. How would you write that with `Create`? You'd certainly want some means of handling unsubscription in that case. We need our callback to return if we are to be notified of unsubscription (or we could supply an `async` method, but that doesn't really seem suitable here).
+
+There's a different approach that can work better here: `Observable.Generate`. The simple version of `Observable.Generate` takes the following parameters:
+
+- an initial state
+- a predicate that defines when the sequence should terminate
+- a function to apply to the current state to produce the next state
+- a function to transform the state to the desired output
+
+```csharp
+public static IObservable<TResult> Generate<TState, TResult>(
+    TState initialState, 
+    Func<TState, bool> condition, 
+    Func<TState, TState> iterate, 
+    Func<TState, TResult> resultSelector)
+```
+
+This shows how you could use `Observable.Generate` to construct a `Range` method:
+
+```csharp
+// Example code only
+public static IObservable<int> Range(int start, int count)
+{
+    int max = start + count;
+    return Observable.Generate(
+        start, 
+        value => value < max, 
+        value => value + 1, 
+        value => value);
+}
+```
+
+The `Generate` method calls us back repeatedly until either our `condition` callback says we're done, or the observer unsubscribes. We can define an infinite sequence simply by never saying we are done:
+
+```csharp
+IObservable<BigInteger> Fibonacci()
+{
+    return Observable.Generate(
+        (v1: new BigInteger(1), v2: new BigInteger(1)),
+        value => true, // It never ends!
+        value => (value.v2, value.v1 + value.v2),
+        value => value.v1); ;
+}
+```
+
+## Timed Sequence Generators
+
+Most of the methods we've looked at so far have returned sequences that produce all of their values immediately. (The only exception is where we called `Observable.Create` and produced values when we were ready to.) However, Rx is able to generate sequences on a schedule.
+
+As we'll see, operators that schedule their work do so through an abstraction called a _scheduler_. If you don't specify one, they will pick a default scheduler, but sometimes the timer mechanism is significant. For example, there are timers that integrate with UI frameworks, delivering notifications on the same thread that mouse clicks and other input are delivered on, and we might want Rx's time-based operators to use these. For testing purposes it can be useful to virtualize timings, so we can verify what happens in timing-sensitive code without necessarily waiting for tests to execute in real time.
+
+Schedulers are a complex subject that is out of scope for this chapter, but they are covered in detail in the later chapter on [Scheduling and threading](11_SchedulingAndThreading.md).
+
+There are three ways of producing timed events.
+
+### Observable.Interval
+
+The first is `Observable.Interval(TimeSpan)` which will publish incremental values starting from zero, based on a frequency of your choosing. 
+
+This example publishes values every 250 milliseconds.
+
+```csharp
+IObservable<long> interval = Observable.Interval(TimeSpan.FromMilliseconds(250));
+interval.Subscribe(
+    Console.WriteLine, 
+    () => Console.WriteLine("completed"));
+```
+
+Output:
+
+```
+0
+1
+2
+3
+4
+5
+```
+
+Once subscribed, you must dispose of your subscription to stop the sequence, because `Interval` returns an infinite sequence. Rx presumes that you might have considerable patience, because the sequences returned by `Interval` are of type `IObservable<long>` (`long`, not `int`) meaning you won't hit problems if you produce more than a paltry 2.1475 billion event (i.e. more than `int.MaxValue`).
+
+### Observable.Timer
+
+The second factory method for producing constant time based sequences is `Observable.Timer`. It has several overloads. The most basic one takes just a `TimeSpan` as `Observable.Interval` does. But unlike `Observable.Interval`, `Observable.Timer` will publish exactly one value (the number 0) after the period of time has elapsed, and then it will complete.
+
+```csharp
+var timer = Observable.Timer(TimeSpan.FromSeconds(1));
+timer.Subscribe(
+    Console.WriteLine, 
+    () => Console.WriteLine("completed"));
+```
+
+Output:
+
+```
+0
+completed
+```
+
+Alternatively, you can provide a `DateTimeOffset` for the `dueTime` parameter. This will produce the value 0 and complete at the specified time.
+
+A further set of overloads adds a `TimeSpan` that indicates the period at which to produce subsequent values. This allows us to produce infinite sequences. It also shows how `Observable.Interval` is really just a special case of `Observable.Timer`. `Interval` could be implemented like this:
+
+```csharp
+public static IObservable<long> Interval(TimeSpan period)
+{
+    return Observable.Timer(period, period);
+}
+```
+
+While `Observable.Interval` will always wait the given period before producing the first value, this `Observable.Timer` overload gives the ability to start the sequence when you choose. With `Observable.Timer` you can write the following to have an interval sequence that starts immediately.
+
+```csharp
+Observable.Timer(TimeSpan.Zero, period);
+```
+
+This takes us to our third way and most general way for producing timer related sequences, back to `Observable.Generate`.
+
+### Timed Observable.Generate
+
+ There's a more complex overload of `Observable.Generate` that allows you to provide a function that specifies the due time for the next value.
+
+```csharp
+public static IObservable<TResult> Generate<TState, TResult>(
+    TState initialState, 
+    Func<TState, bool> condition, 
+    Func<TState, TState> iterate, 
+    Func<TState, TResult> resultSelector, 
+    Func<TState, TimeSpan> timeSelector)
+```
+
+The extra `timeSelector` argument lets us tell `Generate` when to produce the next item. We can use this to write our own implementation of `Observable.Timer` (and as you've already seen, this in turn enables us to write our own `Observable.Interval`).
+
+```csharp
+public static IObservable<long> Timer(TimeSpan dueTime)
+{
+    return Observable.Generate(
+        0l,
+        i => i < 1,
+        i => i + 1,
+        i => i,
+        i => dueTime);
+}
+
+public static IObservable<long> Timer(TimeSpan dueTime, TimeSpan period)
+{
+    return Observable.Generate(
+        0l,
+        i => true,
+        i => i + 1,
+        i => i,
+        i => i == 0 ? dueTime : period);
+}
+
+public static IObservable<long> Interval(TimeSpan period)
+{
+    return Observable.Generate(
+        0l,
+        i => true,
+        i => i + 1,
+        i => i,
+        i => period);
+}
+```
+
+This shows how you can use `Observable.Generate` to produce infinite sequences. I will leave it up to you the reader, as an exercise using `Observable.Generate`, to produce values at variable rates.
+
+## Observable sequences and state
+
+As `Observable.Generate` makes particularly clear, observable sequences may need to maintain state. With that operator it is explicit—we pass in initial state, and we supply a callback to update it on each iteration. Plenty of other operators maintain internal state. The `Timer` remembers its tick count, and more subtly, has to somehow keep track of when it last raised an event and when the next one is due. And as you'll see in forthcoming chapters, plenty of other operators need to remember information about what they've already seen.
+
+This raises an interesting question: what happens if a process shuts down? Is there a way to preserve that state, and reconstitute it in a new process.
+
+With ordinary Rx.NET, the answer is no: all such state is held entirely in memory and there is no way to get hold of that state, or to ask running subscriptions to serialize their current state. This means that if you are dealing with particularly long-running operations you need to work out how you would restart and you can't rely on `System.Reactive` to help you. However, there is a related Rx-based set of libraries known collectively as [the Reaqtive libraries](https://reaqtive.net/). These provide implementations of most of the same operators as `System.Reactive`, but in a form where you can collect the current state, and recreate new subscriptions from previously preserved state. These libraries also include a component called Reaqtor, which is a hosting technology that can manage automatic checkpointing, and post-crash recovery, making it possible to support very long-running Rx logic, by making subscriptions persistent and reliable. Be aware that this is not currently in any productised form, so you will need to do a fair amount of work to use it, but if you need a persistable version of Rx, be aware that it exists.
+
+## Adapting Common Types to `IObservable<T>`
+
+Although we've now seen two very general ways to produce arbitrary sequences—`Create` and `Generate`—what if you already have an existing source of information in some other form that you'd like to make available as an `IObservable<T>`? Rx provides a few adapters for common source types.
+
+### From delegates
+
+The `Observable.Start` method allows you to turn a long running `Func<T>` or `Action` into a single value observable sequence. By default, the processing will be done asynchronously on a ThreadPool thread. If the overload you use is a `Func<T>` then the return type will be `IObservable<T>`. When the function returns its value, that value will be published and then the sequence completed. If you use the overload that takes an `Action`, then the returned sequence will be of type `IObservable<Unit>`. The `Unit` type represents the absence of information, so it's somewhat analogous to `void`, except you can have an instance of the `Unit` type. It's particularly useful in Rx because we often care only about when something has happened, and there might not be any information besides timing. In these cases, we often use an `IObservable<Unit>` so that it's possible to produce definite events even though there's no meaningful data in them. (The name comes from the world of functional programming, where this kind of construct is used a lot.) In this case, `Unit` is used to publish an acknowledgement that the `Action` is complete, because an `Action` does not return any information. The `Unit` type itself has no value; it just serves as an empty payload for the `OnNext` notification. Below is an example of using both overloads.
+
+```csharp
+static void StartAction()
+{
+    var start = Observable.Start(() =>
+        {
+            Console.Write("Working away");
+            for (int i = 0; i < 10; i++)
+            {
+                Thread.Sleep(100);
+                Console.Write(".");
+            }
+        });
+
+    start.Subscribe(
+        unit => Console.WriteLine("Unit published"), 
+        () => Console.WriteLine("Action completed"));
+}
+
+static void StartFunc()
+{
+    var start = Observable.Start(() =>
+    {
+        Console.Write("Working away");
+        for (int i = 0; i < 10; i++)
+        {
+            Thread.Sleep(100);
+            Console.Write(".");
+        }
+        return "Published value";
+    });
+
+    start.Subscribe(
+        Console.WriteLine, 
+        () => Console.WriteLine("Action completed"));
+}
+```
+
+Note the difference between `Observable.Start` and `Observable.Return`. The `Start` method invokes our callback only upon subscription, so it is an example of a 'lazy' operation. Conversely, `Return` requires us to supply the value up front.
+
+The observable returned by `Start` may seem to have a superficial resemblance to `Task` or `Task<T>` (depending on whether you use the `Action` or `Func<T>` overload). Each represents work that may take some time before eventually completing, perhaps producing a result. However, there's a significant difference: `Start` doesn't begin the work until you subscribe to it. Moreover, it will re-execute the callback every time you subscribe to it. So it is more like a factory for a task-like entity.
+
+### From events
+
+As we discussed early in the book, .NET has a model for events that is baked into its type system. This predates Rx (not least because Rx wasn't feasible until .NET got generics in .NET 2.0) so it's common for types to support events but not Rx. To be able to integrate with the existing event model, Rx provides methods to take an event and turn it into an observable sequence. I showed this briefly in the file system watcher example earlier, but let's examine this in a bit more detail. There are several different varieties you can use. This show the most succinct form:
+
+```csharp
+FileSystemWatcher watcher = new (@"c:\incoming");
+IObservable<EventPattern<FileSystemEventArgs>> changeEvents = Observable
+    .FromEventPattern<FileSystemEventArgs>(watcher, nameof(watcher.Changed));
+```
+
+If you have an object that provides an event, you can use this overload of `FromEventPattern`, passing in the object and the name of the event that you'd like to use with Rx. Although this is the simplest way to adapt events into Rx's world, it has a few problems.
+
+Firstly, why do I need to pass the event name as a string? Identifying members with strings is an error-prone technique. The compiler won't notice if there's a mismatch between the first and second argument (e.g., if I passed the arguments `(somethingElse, nameof(watcher.Changed))` by mistake). Couldn't I just pass `watcher.Changed` itself? Unfortunately not—this is an example of the issue I mentioned in the first chapter: .NET events are not first class citizens. We can't use them in the way we can use other objects or values. For example, we can't pass an event as an argument to a method. In fact the only thing you can do with a .NET event is attach and remove event handlers. If I want to get some other method to attach handlers to the event of my choosing (e.g., here I want Rx to handle the events), then the only way to do that is to specify the event's name so that the method (`FromEventPattern`) can then use reflection to attach its own handlers.
+
+This is a problem for some deployment scenarios. It is increasingly common in .NET to do extra work at build time to optimize runtime behaviour, and reliance on reflection can compromise these techniques. For example, instead of relying on Just In Time (JIT) compilation of code, we might use Ahead of Time (AOT) mechanisms. .NET's Ready to Run (R2R) system enables you to include pre-compiled code targeting specific CPU types alongside the normal IL, avoiding having to wait for .NET to compile the IL into runnable code. This can have a significant effect on startup times. In client side applications, it can fix problems where applications are sluggish when they first start up. It can also be important in server-side applications, especially in environments where code may be moved from one compute node to another fairly frequently, making it important to minimize cold start costs. There are also scenarios where JIT compilation is not even an option, in which case AOT compilation isn't merely an optimization: it's the only means by which code can run at all.
+
+The problem with reflection is that it makes it difficult for the build tools to work out what code will execute at runtime. When they inspect this call to `FromEventPattern` they will just see arguments of type `object` and `string`. It's not self-evident that this is going to result in reflection-driven calls to the `add` and `remove` methods for `FileSystemWatcher.Changed` at runtime. There are attributes that can be used to provide hints, but there are limits to how well these can work. Sometimes the build tools will be unable to determine what code would need to be AOT compiled to enable this method to execute without relying on runtime JIT.
+
+There's another, related problem. The .NET build tools support a feature called 'trimming', in which they remove unused code. The `System.Reactive.dll` file is about 1.3MB in size, but it would be a very unusual application that used every member of every type in that component. Basic use of Rx might need only a few tens of kilobytes. The idea with trimming is to work out which bits are actually in use, and produce a copy of the DLL that contains only that code. This can dramatically reduce the volume of code that needs to be deployed for an executable to run. This can be especially important in client-side Blazor applications, where .NET components end up being downloaded by the browser. Having to download an entire 1.3MB component might make you think twice about using it. But if trimming means that basic usage requires only a few tens of KB, and that the size would increase only if you were making more extensive use of the component, that can make it reasonable to use a component that would, without trimming, have imposed too large a penalty to justify its inclusion. But as with AOT compilation, trimming can only work if the tools can determine which code is in use. If they can't do that, it's not just a case of falling back to a slower path, waiting while the relevant code gets JIT compiler. If code has been trimmed, it will be unavailable at runtime, and your application might crash with a `MissingMethodException`.
+
+So reflection-based APIs can be problematic if you're using any of these techniques. Fortunately, there's an alternative. We can use an overload that takes a couple of delegates, and Rx will invoke these when it wants to add or remove handlers for the event:
+
+```csharp
+IObservable<EventPattern<FileSystemEventArgs>> changeEvents = Observable
+    .FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
+        h => watcher.Changed += h,
+        h => watcher.Changed -= h);
+```
+
+This is code that AOT and trimming tools can understand easily. We've written methods that explicitly add and remove handlers for the `FileSystemWatcher.Changed` event, so AOT tools can pre-compile those two methods, and trimming tools know that they cannot remove the add and remove handlers for those events.
+
+The downside is that this is a pretty cumbersome bit of code to write. If you've not already bought into the idea of using Rx, this might well be enough to make you think "I'll just stick with ordinary .NET events, thanks. But the cumbersome nature is a symptom of what is wrong with .NET events. We wouldn't have had to write anything so ugly if events had been first class citizens in the first place.
+
+Not only has that second-class status meant we couldn't just pass the event itself as an argument, it has also meant that we've had to state type arguments explicitly. The relationship between an event's delegate type (`FileSystemEventHandler` in this example) and its event argument type (`FileSystemEventArgs` here) is, in general, not something that C#'s type inference can determine automatically, which is why we've had to specify both types explicitly. (Events that use the generic `EventHandler<T>` type are more amenable to type inference, and can use a slightly less verbose version of `FromEventPattern`. Unfortunately, relatively few events actually use that. Some events provide no information besides the fact that something just happened, and use the base `EventHandler` type, and for those kinds of events, you can in fact omit the type arguments completely, making the code slightly less ugly. You still need to provide the add and remove callbacks though.)
+
+Notice that the return type of `FromEventPattern` in this example is: 
+
+`IObservable<EventPattern<FileSystemEventArgs>>`. 
+
+The `EventPattern<T>` type encapsulates the information that the event passes to handlers. Most .NET events follow a common pattern in which handler methods take two arguments: an `object sender`, which just tells you which object raised the event (useful if you attach one event handler to multiple objects) and then a second argument of some type derived from `EventArgs` that provides information about the event. `EventPattern<T>` just packages these two arguments into a single object that offers `Sender` and `EventArgs` properties. In cases where you don't in fact want to attach one handler to multiple sources, you only really need that `EventArgs` property, which is why the earlier `FileSystemWatcher` examples went on to extract just that, to get a simpler result of type `IObservable<FileSystemEventArgs>`. It did this with the `Select` operator, which we'll get to in more detail later:
+
+```csharp
+IObservable<FileSystemEventArgs> changes = changeEvents.Select(ep => ep.EventArgs);
+```
+
+It is very common to want to expose property changed events as observable sequences. The .NET runtime libraries define a .NET-event-based interface for advertising property changes, `INotifyPropertyChanged`, and some user interface frameworks have more specialized systems for this, such as WPF's `DependencyProperty`. If you are contemplating writing your own wrappers to do this sort of thing, I would strongly suggest looking at the [Reactive UI libraries](https://github.com/reactiveui/ReactiveUI/) first. It has a set of [features for wrapping properties as `IObservable<T>`](https://www.reactiveui.net/docs/handbook/when-any/).
+
+### From Task
+
+The `Task` and `Task<T>` types are very widely used in .NET. Mainstream .NET languages have built-in support for working with them (e.g., C#'s `async` and `await` keywords). There's some conceptual overlap between tasks and `IObservable<T>`: both represent some sort of work that might take a while to complete. There is a sense in which an `IObservable<T>` is a generalization of a `Task<T>`: both represent potentially long-running work, but an `IObservable<T>` can produce multiple results whereas `Task<T>` can produce just one.
+
+Since `IObservable<T>` is the more general abstraction, we should be able to represent a `Task<T>` as an `IObservable<T>`. Rx defines various extension methods for `Task` and `Task<T>` to do this. These methods are all called `ToObservable()`, and it offers various overloads offering control of the details where required, and simplicity for the most common scenarios.
+
+Although they are conceptually similar, `Task<T>` does a few things differently in the details. For example, you can retrieve its [`Status` property](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.status), which might report that it is in a cancelled or faulted state. `IObservable<T>` doesn't provide a way to ask a source for its state; it just tells you things. So `ToObservable` makes some decisions about how to present status in a way that makes makes sense in an Rx world:
+
+- if the task is [Cancelled](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskstatus#system-threading-tasks-taskstatus-canceled), `IObservable<T>` invokes a subscriber's `OnError` passing a `TaskCanceledException`
+- if the task is [Faulted](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskstatus#system-threading-tasks-taskstatus-faulted) `IObservable<T>` invokes a subscriber's `OnError` passing the task's inner exception
+- if the task is not yet in a final state (neither [Cancelled](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskstatus#system-threading-tasks-taskstatus-canceled), [Faulted](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskstatus#system-threading-tasks-taskstatus-faulted), or [RanToCompletion](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskstatus#system-threading-tasks-taskstatus-rantocompletion)), the `IObservable<T>` will not produce any notifications until such time as the task does enter one of these final states
+
+It does not matter whether the task is already in a final state at the moment that you call `ToObservable`. If it has finished, `ToObservable` will just return a sequence representing that state. (In fact, it uses either the `Return` or `Throw` creation methods you saw earlier.) If the task has not yet finished, `ToObservable` will attach a continuation to the task to detect the outcome once it does complete.
+
+Tasks come in two forms: `Task<T>`, which produces a result, and `Task`, which does not. But in Rx, there is only `IObservable<T>`—there isn't a no-result form. We've already seen this problem once before, when the `Observable.Start` method needed to be able to [adapt a delegate as an `IObservable<T>`](#from-delegates) even when the delegate was an `Action` that produced no result. The solution was to return an `IObservable<Unit>`, and that's also exactly what you get when you call `ToObservable` on a plain `Task`.
+
+The extension method is simple to use:
+
+```csharp
+Task<string> t = Task.Run(() =>
+{
+    Console.WriteLine("Task running...");
+    return "Test";
+});
+IObservable<string> source = t.ToObservable();
+source.Subscribe(
+    Console.WriteLine,
+    () => Console.WriteLine("completed"));
+source.Subscribe(
+    Console.WriteLine,
+    () => Console.WriteLine("completed"));
+```
+
+Here's the output.
+
+```
+Task running...
+Test
+completed
+Test
+completed
+```
+
+Notice that even with two subscribers, the task runs only once. That shouldn't be surprising since we only created a single task. If the task has not yet finished, then all subscribers will receive the result when it does. If the task has finished, the `IObservable<T>` effectively becomes a single-value cold observable.
+
+#### One Task per subscription
+
+There's a different way to get an `IObservable<T>` for a source. I can replace the first statement in the preceding example with this:
+
+```csharp
+IObservable<string> source = Observable.FromAsync(() => Task.Run(() =>
+{
+    Console.WriteLine("Task running...");
+    return "Test";
+}));
+```
+
+Subscribing twice to this produces slightly different output:
+
+```
+Task running...
+Task running...
+Test
+Test
+completed
+completed
+```
+
+Notice that this executes the task twice, once for each call to `Subscribe`. `FromAsync` can do this because instead of passing a `Task<T>` we pass a callback that returns a `Task<T>`. It calls that when we call `Subscribe`, so each subscriber essentially gets their own task.
+
+If I want to use `async` and `await` to define my task, then I don't need to bother with the `Task.Run` because an `async` lambda creates a `Func<Task<T>>`, which is exactly the type `FromAsync` wants:
+
+```csharp
+IObservable<string> source = Observable.FromAsync(async () =>
+{
+    Console.WriteLine("Task running...");
+    await Task.Delay(50);
+    return "Test";
+});
+```
+
+This produces exactly the same output as before. There is a subtle difference with this though. When I used `Task.Run` the lambda ran on a task pool thread from the start. But when I write it this way, the lambda will begin to run on whatever thread calls `Subscribe`. It's only when it hits the first `await` that it returns (and the call to `Subscribe` will then return), with the remainder of the method running on the thread pool.
+
+### From `IEnumerable<T>`
+
+Rx defines another extension method called `ToObservable`, this time for `IEnumerable<T>`. In earlier chapters I described how `IObservable<T>` was designed to represent the same basic abstraction as `IEnumerable<T>`, with the only difference being the mechanism we use to obtain the elements in the sequence: with `IEnumerable<T>`, we write code that _pulls_ values out of the collection (e.g., a `foreach` loop), whereas `IObservable<T>` _pushes_ values to us by invoking `OnNext` on our `IObserver<T>`.
+
+We could write code that bridges from _pull_ to _push_:
+
+```csharp
+// Example code only - do not use!
+public static IObservable<T> ToObservableOversimplified<T>(this IEnumerable<T> source)
+{
+    return Observable.Create<T>(o =>
+    {
+        foreach (var item in source)
+        {
+            o.OnNext(item);
+        }
+
+        o.OnComplete();
+
+        // Incorrectly ignoring unsubscription.
+        return Disposable.Empty;
+    });
+}
+```
+
+This crude implementation conveys the basic idea, but it is naive. It does not attempt to handle unsubscription, and it's not easy to fix that when using `Observable.Create` for this particular scenario. And as we will see later in the book, Rx sources that might try to deliver large numbers of events in quick succession should integrate with Rx's concurrency model. The implementation that Rx supplies does of course cater for all of these tricky details. That makes it rather more complex, but that's Rx's problem; you can think of it as being logically equivalent to the code shown above, but without the shortcomings.
+
+In fact this is a recurring theme throughout Rx.NET. Many of the built-in operators are useful not because they do something particularly complicated, but because they deal with many subtle and tricky issues for you. You should always try to find something built into Rx.NET that does what you need before considering rolling your own solution.
+
+When transitioning from `IEnumerable<T>` to `IObservable<T>`, you should carefully consider what you are really trying to achieve. Consider that the blocking synchronous (pull) nature of `IEnumerable<T>` does always not mix well with the asynchronous (push) nature of `IObservable<T>`. As soon as something subscribes to an `IObservable<T>` created in this way, it is effectively asking to iterate over the `IEnumerable<T>`, immediately producing all of the values. The call to `Subscribe` might not return until it has reached the end of the `IEnumerable<T>`, making it similar to the very simple example shown [at the start of this chapter](#a-very-basic-iobservablet-implementation). (I say "might" because as we'll see when we get to schedulers, the exact behaviour depends on the context.) `ToObservable` can't work magic—something somewhere has to execute what amounts to a `foreach` loop.
+
+So although this can be a convenient way to bring sequences of data into an Rx world, you should carefully test and measure the performance impact.
+
+### From APM
+
+Rx provides support for the ancient [.NET Asynchronous Programming Model (APM)](https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/asynchronous-programming-model-apm). Back in .NET 1.0, this was the only pattern for representing asynchronous operations. It was superseded in 2010 when .NET 4.0 introduced the [Task-based Asynchronous Pattern (TAP)](https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap). The old APM offers no benefits over the TAP. Moreover, C#'s `async` and `await` keywords (and equivalents in other .NET languages) only support the TAP, meaning that the APM is best avoided. However, the TAP was fairly new back in 2011 when Rx 1.0 was released, so it offered adapters for presenting an APM implementation as an `IObservable<T>`.
+
+Nobody should be using the APM today, but for completeness (and just in case you have to use an ancient library that only offers the APM) I will provide a very brief explanation of Rx's support for it.
+
+The result of the call to `Observable.FromAsyncPattern` does _not_ return an observable sequence. It returns a delegate that returns an observable sequence. (So it is essentially a factory factory) The signature for this delegate will match the generic arguments of the call to `FromAsyncPattern`, except that the return type will be wrapped in an observable sequence. The following example wraps the `Stream` class's `BeginRead`/`EndRead` methods (which are an implementation of the APM).
+
+**Note**: this is purely to illustrate how to wrap the APM. You would never do this in practice because `Stream` has supported the TAP for years.
+
+```csharp
+Stream stream = GetStreamFromSomewhere();
+var fileLength = (int) stream.Length;
+
+Func<byte[], int, int, IObservable<int>> read = 
+            Observable.FromAsyncPattern<byte[], int, int, int>(
+              stream.BeginRead, 
+              stream.EndRead);
+var buffer = new byte[fileLength];
+IObservable<int> bytesReadStream = read(buffer, 0, fileLength);
+bytesReadStream.Subscribe(byteCount =>
+{
+    Console.WriteLine(
+        "Number of bytes read={0}, buffer should be populated with data now.", 
+        byteCount);
+});
+```
+
+## Subjects
+
+So far, this chapter has explored various factory methods that return `IObservable<T>` implementations. There is another way though: `System.Reactive` defines various types that implement `IObservable<T>` that we can instantiate directly. But how do we determine what values these types produce? We're able to do that because they also implement `IObserver<T>`, enabling us to push values into them, and those very same values we push in will be the ones seen by observers.
+
+Types that implement both `IObservable<T>` and `IObserver<T>` are called _subjects_ in Rx. There's an an `ISubject<T>` to represent this. (This is in the `System.Reactive` NuGet package, unlike `IObservable<T>` and `IObserver<T>`, which are both built into the .NET runtime libraries.) `ISubject<T>` looks like this:
+
+```csharp
+public interface ISubject<T> : ISubject<T, T>
+{
+}
+```
+
+So it turns out there's also a two-argument `ISubject<TSource, TResult>` to accommodate the fact that something that is both an observer and an observable might transform the data that flows through it in some way, meaning that the input and output types are not necessarily the same. Here's the two-type-argument definition:
+
+```csharp
+public interface ISubject<in TSource, out TResult> : IObserver<TSource>, IObservable<TResult>
+{
+}
+```
+
+As you can see the `ISubject` interfaces don't define any members of their own. They just inherit from `IObserver<T>` and `IObservable<T>`—these interfaces are nothing more than a direct expression of the fact that a subject is both an observer and an observable.
+
+But what is this for? You can think of `IObserver<T>` and the `IObservable<T>` as the 'consumer' and 'publisher' interfaces respectively. A subject, then is both a consumer and a publisher. Data flows both into and out of a subject.
+
+Rx offers a few subject implementations that can occasionally be useful in code that wants to make an `IObservable<T>` available. Although `Observable.Create` is usually the preferred way to do this, there's one important case where a subject might make more sense: if you have some code that discovers events of interest (e.g., by using the client API for some messaging technology) and wants to make them available through an `IObservable<T>`, subjects can sometimes provide a more convenient way to to this than with `Observable.Create` or a custom implementation.
+
+Rx offers a few subject types. We'll start with the most straightforward one to understand.
+
+### `Subject<T>`
+
+The `Subject<T>` type immediately forwards any calls made to its `IObserver<T>` methods on to all of the observers currently subscribed to it. This example shows its basic operation:
+
+```csharp
+Subject<int> s = new();
+s.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+s.Subscribe(x => Console.WriteLine($"Sub2: {x}"));
+
+s.OnNext(1);
+s.OnNext(2);
+s.OnNext(3);
+```
+
+I've created a `Subject<int>`. I've subscribed to it twice, and then called its `OnNext` method repeatedly. This produces the following output, illustrating that the `Subject<int>` forwards each `OnNext` call onto both subscribers:
+
+```
+Sub1: 1
+Sub2: 1
+Sub1: 2
+Sub2: 2
+Sub1: 3
+Sub2: 3
+```
+
+We could use this as a way to bridge between some API from which we receive data into the world of Rx. You could imagine writing something of this kind:
+
+```csharp
+public class MessageQueueToRx : IDisposable
+{
+    private readonly Subject<string> messages = new();
+
+    public IObservable<string> Messages => messages;
+
+    public void Run()
+    {
+        while (true)
+        {
+            // Receive a message from some hypothetical message queuing service
+            string message = MqLibrary.ReceiveMessage();
+            messages.OnNext(message);
+        }
+    }
+
+    public void Dispose()
+    {
+        message.Dispose();
+    }
+}
+```
+
+It wouldn't be too hard to modify this to use `Observable.Create` instead. But where this approach can become easier is if you need to provide multiple different `IObservable<T>` sources. Imagine we distinguish between different message types based on their content, and publish them through different observables. That's hard to arrange with `Observable.Create` if we still want a single loop pulling messages off the queue.
+
+`Subject<T>` also distributes calls to either `OnCompleted` or `OnError` to all subscribers. Of course, the rules of Rx require that once you have called either of these methods on an `IObserver<T>` (and any `ISubject<T>` is an `IObserver<T>`, so this rule applies to `Subject<T>`) you must not call `OnNext`, `OnError`, or `OnComplete` on that observer ever again. In fact, `Subject<T>` will tolerate calls that break this rule—it just ignores them, so even if your code doesn't quite stick to these rules internally, the `IObservable<T>` you present to the outside world will behave correctly, because Rx enforces this.
+
+`Subject<T>` implements `IDisposable`. Disposing a `Subject<T>` puts it into a state where it will throw an exception if you call any of its methods. The documentation also describes it as unsubscribing all observers, but since a disposed `Subject<T>` isn't capable of producing any further notifications in any case, this doesn't really mean much. (Note that it does _not_ call `OnCompleted` on its observers when you `Dispose` it.) The one practical effect is that its internal field that keeps track of observers is reset to a special sentinel value indicating that it has been disposed, meaning that the one externally observable effect of "unsubscribing" the observers is that if, for some reason, your code held onto a reference to a `Subject<T>` after disposing it, that would no longer keep all the subscribers reachable for GC purposes. If a `Subject<T>` remains reachable indefinitely after it is no longer in use, that in itself is effectively a memory leak, but disposal would at least limit the effects: only the `Subject<T>` itself would remain reachable, and not all of its subscribers.
+
+`Subject<T>` is the most straightforward subject, but there are other, more specialized ones.
+
+## `ReplaySubject<T>`
+
+`Subject<T>` does not remember anything: it immediately distributes incoming values to subscribers. If new subscribers come along, they will only see events that occur after they subscribe. `ReplaySubject<T>`, on the other hand, can remember every value it has ever seen. If a new subject comes along, it will receive the complete history of events so far.
+
+This is a variation on the first example in the preceding [`Subject<T>` section](#subjectt). It creates a `ReplaySubject<int>` instead of a `Subject<int>`. And instead of immediately subscribing twice, it creates an initial subscription, and then a second one only after a couple of values have been emitted.
+
+```csharp
+ReplaySubject<int> s = new();
+s.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+
+s.OnNext(1);
+s.OnNext(2);
+
+s.Subscribe(x => Console.WriteLine($"Sub2: {x}"));
+
+s.OnNext(3);
+```
+
+This produces the following output:
+
+```
+Sub1: 1
+Sub1: 2
+Sub2: 1
+Sub2: 2
+Sub1: 3
+Sub2: 3
+```
+
+As you'd expect, we initially see output only from `Sub1`. But when we make the second call to subscribe, we can see that `Sub2` also received the first two values. And then when we report the third value, both see it. If this example had used `Subject<int>` instead, we would have seen just this output:
+
+```
+Sub1: 1
+Sub1: 2
+Sub1: 3
+Sub2: 3
+```
+
+There's an obvious potential problem here: if `ReplaySubject<T>` remembers every value published to it, we mustn't use it with endless event sources, because it will eventually cause us to run out of memory.
+
+`ReplaySubject<T>` offers constructors that accept simple cache expiry settings that can limit memory consumption. One option is to specify the maximum number of item to remember. This next example creates a `ReplaySubject<T>` with a buffer size of 2:
+
+```csharp    
+ReplaySubject<int> s = new(2);
+s.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+
+s.OnNext(1);
+s.OnNext(2);
+s.OnNext(3);
+
+s.Subscribe(x => Console.WriteLine($"Sub2: {x}"));
+
+s.OnNext(4);
+```
+
+Since the second subscription only comes along after we've already produced 3 values, it no longer sees all of them. It only receives the last two values published prior to subscription (but the first subscription continues to see everything of course):
+
+```
+Sub1: 1
+Sub1: 2
+Sub1: 3
+Sub2: 2
+Sub2: 3
+Sub1: 4
+Sub2: 4
+```
+
+Alternatively, you can specify a time-based limit by passing a `TimeSpan` to the `ReplaySubject<T>` constructor.
+
+## `BehaviorSubject<T>`
+
+Like `ReplaySubject<T>`, `BehaviorSubject<T>` also has a memory, but it remembers exactly one value. However, it's not quite the same as a `ReplaySubject<T>` with a buffer size of 1. Whereas a `ReplaySubject<T>` starts off in a state where it has nothing in its memory, `BehaviorSubject<T>` always remembers _exactly_ one item. How can that work before we've made our first call to `OnNext`? `BehaviorSubject<T>` enforces this by requiring us to supply the initial value when we construct it.
+
+So you can think of `BehaviorSubject<T>` as a subject that _always_ has a value available. If you subscribe to a `BehaviorSubject<T>` it will instantly produce a single value. (It may then go on to produce more values, but it always produces one right away.) As it happens, it also makes that value available through a property called `Value`, so you don't need to subscribe an `IObserver<T>` to it just to retrieve the value.
+
+A `BehaviorSubject<T>` could be thought of an as observable property. Like a normal property, it can immediately supply a value whenever you ask it. The difference is that it can then go on to notify you every time its value changes. If you're using the [ReactiveUI framework](https://www.reactiveui.net/) (an Rx-based framework for building user interfaces), `BehaviourSubject<T>` can make sense as the implementation type for a property in a view model (the type that mediates between your underlying domain model and your user interface). It has property-like behaviour, enabling you to retrieve a value at any time, but it also provides change notifications, which ReactiveUI can handle in order to keep the UI up to date.
+
+This analogy falls down slightly when it comes to completion. If you call `OnCompleted`, it immediately calls `OnCompleted` on all of its observers, and if any new observers subscribe, they will also immediately be completed—it does not first supply the last value. (So this is another way in which it is different from a `ReplaySubject<T>` with a buffer size of 1.)
+
+Similarly, if you call `OnError`, all current observers will receive an `OnError` call, and any subsequent subscribers will also receive nothing but an `OnError` call.
+
+## `AsyncSubject<T>`
+
+`AsyncSubject<T>` provides all observers with the final value it receives. Since it can't know which is the final value until `OnCompleted` is called, it will not invoke any methods on any of its subscribers until either its `OnCompleted` or `OnError` method is called. (If `OnError` is called, it just forwards that to all current and future subscribers.) You will often use this subject indirectly, because it is the basis of [Rx's integration with the `await` keyword](13_LeavingIObservable.md#integration-with-async-and-await). (When you `await` an observable sequence, the `await` returns the final value emitted by the source.)
+
+If no calls were made to `OnNext` before `OnCompleted` then there was no final value, so it will just complete any observers without providing a value.
+
+In this example no values will be published as the sequence never completes. 
+No values will be written to the console.
+
+```csharp
+AsyncSubject<string> subject = new();
+subject.OnNext("a");
+subject.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+subject.OnNext("b");
+subject.OnNext("c");
+```
+
+In this example we invoke the `OnCompleted` method so there will be a final value ('c') for the subject to produce:
+
+```csharp
+AsyncSubject<string> subject = new();
+
+subject.OnNext("a");
+subject.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+subject.OnNext("b");
+subject.OnNext("c");
+subject.OnCompleted();
+subject.Subscribe(x => Console.WriteLine($"Sub2: {x}"));
+```
+
+This produces the following output:
+
+```
+Sub1: c
+Sub2: c
+```
+
+If you have some potentially slow work that needs to be done when your application starts up, and which needs to be done just once, you might choose an `AsyncSubject<T>` to make the results of that work available. Code requiring those results can subscribe to the subject. If the work is not yet complete, they will receive the results as soon as they are available. And if the work has already completed, they will receive it immediately.
+
+## Subject factory
+
+Finally it is worth making you aware that you can also create a subject via a factory method. Considering that a subject combines the `IObservable<T>` and `IObserver<T>` interfaces, it seems sensible that there should be a factory that allows you to combine them yourself. The `Subject.Create(IObserver<TSource>, IObservable<TResult>)` factory method provides just this.
+
+```csharp
+// Creates a subject from the specified observer used to publish messages to the
+// subject and observable used to subscribe to messages sent from the subject
+public static ISubject<TSource, TResult> Create<TSource, TResult>(
+    IObserver<TSource> observer, 
+    IObservable<TResult> observable)
+{...}
+```
+
+Note that unlike all of the other subjects just discussed, this creates a subject where there is no inherent relationship between the input and the output. This just takes whatever `IObserver<TSource>` and `IObserver<TResult>` implementations you supply and wraps them up in a single object. All calls made to the subject's `IObserver<TSource>` methods will be passed directly to the observer you supplied. If you want values to emerge to subscribers to the corresponding `IObservable<TResult>`, it's up to you to make that happen. This really combines the two objects you supply with the absolute minimum of glue.
+
+Subjects provide a convenient way to poke around Rx, and are occasionally useful in production scenarios, but they are not recommended for most cases. An explanation is in the [Usage Guidelines appendix](C_UsageGuidelines.md). Instead of using subjects, favour the factory methods shown earlier in this chapter..
+
+## Summary
+
+We have looked at the various eager and lazy ways to create a sequence. We have seen how to produce timer based sequences using the various factory methods. And we've also explored ways to transition from other synchronous and asynchronous representations. 
+
+As a quick recap:
+
+- Factory Methods
+  - Observable.Return
+  - Observable.Empty
+  - Observable.Never
+  - Observable.Throw
+  - Observable.Create
+  - Observable.Defer
+
+- Generative methods
+  - Observable.Range
+  - Observable.Generate
+  - Observable.Interval
+  - Observable.Timer
+
+- Adaptation
+  - Observable.Start
+  - Observable.FromEventPattern
+  - Task.ToObservable
+  - Task&lt;T&gt;.ToObservable
+  - IEnumerable&lt;T&gt;.ToObservable
+  - Observable.FromAsyncPattern
+
+Creating an observable sequence is our first step to practical application of Rx: create the sequence and then expose it for consumption. Now that we have a firm grasp on how to create an observable sequence, we can look in more detail at the operators that allow us to describe processing to be applied, to build up more complex observable sequences.

+ 0 - 415
Rx.NET/Documentation/IntroToRx/03_LifetimeManagement.md

@@ -1,415 +0,0 @@
----
-title: Lifetime management
----
-
-<!--TODO: Link on this page to the C# in a nutshell(?) Amazon via affiliates -->
-<!--
-    LC.
-        re read apply laws of that kindle book.
-        Create a Proposition and support it or create and argument and prove it.
-        Beginning middle and end. Beginning should give and idea to the destination, should not be a surprise.
-        Code and keyword highlights seem inconsistent.
-        
-        Proposition is that you can explicitly manage the lifetime of your subscriptions to queries.
-        
-
-    G.A.
-        (overall pretty focused and flows from one point to the next competently; would be even better with some rewriting)
- 
-    Subscription finalizers
-        A caveat is a negative notice, a warning  that doesn't work here.
--->
-
-#Lifetime management				{#LifetimeManagement}
-
-The very nature of Rx code is that you as a consumer do not know when a sequence will provide values or terminate. 
-This uncertainty does not prevent your code from providing a level of certainty. 
-You can control when you will start accepting values and when you choose to stop accepting values. 
-You still need to be the master of your domain. 
-Understanding the basics of managing Rx resources allow your applications to be as efficient, bug free and predictable as possible.
-
-Rx provides fine grained control to the lifetime of subscriptions to queries. 
-While using familiar interfaces, you can deterministically release resources associated to queries.
-This allows you to make the decisions on how to most effectively manage your resources, ideally keeping the scope as tight as possible.
-
-In the previous chapter we introduced you to the key types and got off the ground with some examples. 
-For the sake of keeping the initial samples simple we ignored a very important part of the `IObservable<T>` interface. 
-The `Subscribe` method takes an `IObserver<T>` parameter, but we did not need to provide that as we used the extension method that took an `Action<T>` instead.
-The important part we overlooked is that both `Subscribe` methods have a return value. 
-The return type is `IDisposable`. 
-In this chapter we will further explore how this return value can be used to management lifetime of our subscriptions.
-
-##Subscribing						{#Subscribe}
-
-Just before we move on, it is worth briefly looking at all of the overloads of the `Subscribe` extension method. 
-The overload we used in the previous chapter was the simple [Overload to Subscribe](http://msdn.microsoft.com/en-us/library/ff626574(v=VS.92).aspx "Subscribe Extension method overloads on MSDN") which allowed us to pass just an `Action<T>` to be performed when `OnNext` was invoked. 
-Each of these further overloads allows you to avoid having to create and then pass in an instance of `IObserver<T>`.
-
-	//Just subscribes to the Observable for its side effects. 
-	// All OnNext and OnCompleted notifications are ignored.
-	// OnError notifications are re-thrown as Exceptions.
-	IDisposable Subscribe<TSource>(this IObservable<TSource> source);
-		
-	//The onNext Action provided is invoked for each value.
-	//OnError notifications are re-thrown as Exceptions.
-	IDisposable Subscribe<TSource>(this IObservable<TSource> source, 
-		Action<TSource> onNext);
-		
-	//The onNext Action is invoked for each value.
-	//The onError Action is invoked for errors
-	IDisposable Subscribe<TSource>(this IObservable<TSource> source, 
-		Action<TSource> onNext, 
-		Action<Exception> onError);
-		
-	//The onNext Action is invoked for each value.
-	//The onCompleted Action is invoked when the source completes.
-	//OnError notifications are re-thrown as Exceptions.
-	IDisposable Subscribe<TSource>(this IObservable<TSource> source, 
-		Action<TSource> onNext, 
-		Action onCompleted);
-		
-	//The complete implementation
-	IDisposable Subscribe<TSource>(this IObservable<TSource> source, 
-		Action<TSource> onNext, 
-		Action<Exception> onError, 
-		Action onCompleted);
-
-Each of these overloads allows you to pass various combinations of delegates that you want executed for each of the notifications an `IObservable<T>` instance could produce. 
-A key point to note is that if you use an overload that does not specify a delegate for the `OnError` notification, any `OnError` notifications will be re-thrown as an exception. 
-Considering that the error could be raised at any time, this can make debugging quite difficult. 
-It is normally best to use an overload that specifies a delegate to cater for `OnError` notifications.
-
-In this example we attempt to catch error using standard .NET Structured Exception Handling:
-
-	var values = new Subject<int>();
-	try
-	{
-		values.Subscribe(value => Console.WriteLine("1st subscription received {0}", value));
-	}
-	catch (Exception ex)
-	{
-		Console.WriteLine("Won't catch anything here!");
-	}
-		
-	values.OnNext(0);
-	//Exception will be thrown here causing the app to fail.
-	values.OnError(new Exception("Dummy exception"));
-
-The correct way to way to handle exceptions is to provide a delegate for `OnError` notifications as in this example.
-
-	var values = new Subject<int>();
-		
-	values.Subscribe(
-		value => Console.WriteLine("1st subscription received {0}", value),
-		ex => Console.WriteLine("Caught an exception : {0}", ex));
-
-	values.OnNext(0);
-	values.OnError(new Exception("Dummy exception"));
-
-We will look at other interesting ways to deal with errors on a sequence in later chapters in the book.
-
-##Unsubscribing						{#Unsubscribing}
-
-We have yet to look at how we could unsubscribe from a subscription. 
-If you were to look for an _Unsubscribe_ method in the Rx public API you would not find any. 
-Instead of supplying an Unsubscribe method, Rx will return an `IDisposable` whenever a subscription is made. 
-This disposable can be thought of as the subscription itself, or perhaps a token representing the subscription. 
-Disposing it will dispose the subscription and effectively `unsubscribe`. 
-Note that calling `Dispose` on the result of a Subscribe call will not cause any side effects for other subscribers; it just removes the subscription from the observable's internal list of subscriptions.
-This then allows us to call `Subscribe` many times on a single `IObservable<T>`, allowing subscriptions to come and go without affecting each other. 
-In this example we initially have two subscriptions, we then dispose of one subscription early which still allows the other to continue to receive publications from the underlying sequence:
-
-	var values = new Subject<int>();
-	var firstSubscription = values.Subscribe(value => 
-		Console.WriteLine("1st subscription received {0}", value));
-	var secondSubscription = values.Subscribe(value => 
-		Console.WriteLine("2nd subscription received {0}", value));
-	values.OnNext(0);
-	values.OnNext(1);
-	values.OnNext(2);
-	values.OnNext(3);
-	firstSubscription.Dispose();
-	Console.WriteLine("Disposed of 1st subscription");
-	values.OnNext(4);
-	values.OnNext(5);
-
-Output:
-
-<div class="output">
-	<div class="line">1st subscription received 0</div>
-	<div class="line">2nd subscription received 0</div>
-	<div class="line">1st subscription received 1</div>
-	<div class="line">2nd subscription received 1</div>
-	<div class="line">1st subscription received 2</div>
-	<div class="line">2nd subscription received 2</div>
-	<div class="line">1st subscription received 3</div>
-	<div class="line">2nd subscription received 3</div>
-	<div class="line">Disposed of 1st subscription</div>
-	<div class="line">2nd subscription received 4</div>
-	<div class="line">2nd subscription received 5</div>
-</div>
-
-The team building Rx could have created a new interface like _ISubscription_ or _IUnsubscribe_ to facilitate unsubscribing. 
-They could have added an _Unsubscribe_ method to the existing `IObservable<T>` interface. 
-By using the `IDisposable` type instead we get the following benefits for free:
-
- * The type already exists
- * People understand the type
- * `IDisposable` has standard usages and patterns
- * Language support via the `using` keyword
- * Static analysis tools like FxCop can help you with its usage
- * The `IObservable<T>` interface remains very simple.
-
-As per the `IDisposable` guidelines, you can call `Dispose` as many times as you like. 
-The first call will unsubscribe and any further calls will do nothing as the subscription will have already been disposed.
-
-##OnError and OnCompleted			{#OnErrorAndOnCompleted}
-
-Both the `OnError` and `OnCompleted` signify the completion of a sequence.
-If your sequence publishes an `OnError` or `OnCompleted` it will be the last publication and no further calls to `OnNext` can be performed. 
-In this example we try to publish an `OnNext` call after an `OnCompleted` and the `OnNext` is ignored:
-
-	var subject = new Subject<int>();
-	subject.Subscribe(
-		Console.WriteLine, 
-		() => Console.WriteLine("Completed"));
-	subject.OnCompleted();
-	subject.OnNext(2);
-
-Of course, you could implement your own `IObservable<T>` that allows publishing after an `OnCompleted` or an `OnError`, however it would not follow the precedence of the current Subject types and would be a non-standard implementation. 
-I think it would be safe to say that the inconsistent behavior would cause unpredictable behavior in the applications that consumed your code.
-
-An interesting thing to consider is that when a sequence completes or errors, you should still dispose of your subscription.
-
-##IDisposable						{#IDisposable}
-
-The `IDisposable` interface is a handy type to have around and it is also integral to Rx. 
-I like to think of types that implement `IDisposable` as having explicit lifetime management. 
-I should be able to say "I am done with that" by calling the `Dispose()` method.
-
-By applying this kind of thinking, and then leveraging the C# `using` statement, you can create handy ways to create scope. 
-As a reminder, the `using` statement is effectively a `try`/`finally` block that will always call `Dispose` on your instance when leaving the scope.
-
-If we consider that we can use the `IDisposable` interface to effectively create a scope, you can create some fun little classes to leverage this. 
-For example here is a simple class to log timing events:
-
-	public class TimeIt : IDisposable
-	{
-		private readonly string _name;
-		private readonly Stopwatch _watch;
-
-		public TimeIt(string name)
-		{
-			_name = name;
-			_watch = Stopwatch.StartNew();
-		}
-
-		public void Dispose()
-		{
-			_watch.Stop();
-			Console.WriteLine("{0} took {1}", _name, _watch.Elapsed);
-		}
-	}
-
-This handy little class allows you to create scope and measure the time certain sections of your code base take to run. 
-You could use it like this:
-
-	using (new TimeIt("Outer scope"))
-	{
-		using (new TimeIt("Inner scope A"))
-		{
-			DoSomeWork("A");
-		}
-		using (new TimeIt("Inner scope B"))
-		{
-			DoSomeWork("B");
-		}
-		Cleanup();
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Inner scope A took 00:00:01.0000000</div>
-	<div class="line">Inner scope B took 00:00:01.5000000</div>
-	<div class="line">Outer scope took 00:00:02.8000000</div>
-</div>
-
-You could also use the concept to set the color of text in a console application:
-
-	//Creates a scope for a console foreground color. When disposed, will return to 
-	//  the previous Console.ForegroundColor
-	public class ConsoleColor : IDisposable
-	{
-		private readonly System.ConsoleColor _previousColor;
-
-		public ConsoleColor(System.ConsoleColor color)
-		{
-			_previousColor = Console.ForegroundColor;
-			Console.ForegroundColor = color;
-		}
-
-		public void Dispose()
-		{
-			Console.ForegroundColor = _previousColor;
-		}
-	}
-
-I find this handy for easily switching between colors in little _spike_ console	applications:
-
-	Console.WriteLine("Normal color");
-	using (new ConsoleColor(System.ConsoleColor.Red))
-	{
-		Console.WriteLine("Now I am Red");
-		using (new ConsoleColor(System.ConsoleColor.Green))
-		{
-			Console.WriteLine("Now I am Green");
-		}
-		Console.WriteLine("and back to Red");
-	}
-
-Output:
-
-<div class="output">
-	<div class="line" style="color: #C0C0C0;">Normal color</div>
-	<div class="line" style="color: #FF0000;">Now I am Red</div>
-	<div class="line" style="color: #00FF00;">Now I am Green</div>
-	<div class="line" style="color: #FF0000;">and back to Red</div>
-</div>
-
-So we can see that you can use the `IDisposable` interface for more than just common use of deterministically releasing unmanaged resources. 
-It is a useful tool for managing lifetime or scope of anything; from a stopwatch timer, to the current color of the console text, to the subscription to a sequence of notifications.
-
-The Rx library itself adopts this liberal usage of the `IDisposable` interface and introduces several of its own custom implementations:
-
- * Disposable
- * BooleanDisposable
- * CancellationDisposable
- * CompositeDisposable
- * ContextDisposable
- * MultipleAssignmentDisposable
- * RefCountDisposable
- * ScheduledDisposable
- * SerialDisposable
- * SingleAssignmentDisposable
-
-For a full rundown of each of the implementations see the [Disposables](20_Disposables.html) reference in the Appendix. 
-For now we will look at the extremely simple and useful `Disposable` static class:
-
-	namespace System.Reactive.Disposables
-	{
-	  public static class Disposable
-	  {
-		// Gets the disposable that does nothing when disposed.
-		public static IDisposable Empty { get {...} }
-
-		// Creates the disposable that invokes the specified action when disposed.
-		public static IDisposable Create(Action dispose)
-		{...}
-	  }
-	}
-
-As you can see it exposes two members: `Empty` and `Create`. 
-The `Empty` method allows you get a stub instance of an `IDisposable` that does nothing when `Dispose()` is called. 
-This is useful for when you need to fulfil an interface requirement that returns an `IDisposable` but you have no specific implementation that is relevant.
-
-The other overload is the `Create` factory method which allows you to pass an `Action` to be invoked when the instance is disposed. 
-The `Create` method will ensure the standard Dispose semantics, so calling `Dispose()` multiple times will only invoke the delegate you provide once:
-
-	var disposable = Disposable.Create(() => Console.WriteLine("Being disposed."));
-	Console.WriteLine("Calling dispose...");
-	disposable.Dispose();
-	Console.WriteLine("Calling again...");
-	disposable.Dispose();
-
-Output:
-
-<div class="output">
-	<div class="line">Calling dispose...</div>
-	<div class="line">Being disposed.</div>
-	<div class="line">Calling again...</div>
-</div>
-
-Note that "Being disposed." is only printed once. 
-In a later chapter we cover another	useful method for binding the lifetime of a resource to that of a subscription in the [Observable.Using](11_AdvancedErrorHandling.html#Using) method.
-
-<!--
-G.A.
-Subscription finalizers
- A caveat is a negative notice, a warning  that doesn't work here.
--->
-##Resource management vs. memory management		{#Finalizers}
-
-It seems many .NET developers only have a vague understanding of the .NET runtime's Garbage Collector and specifically how it interacts with Finalizers and `IDisposable`.
-As the author of the [Framework Design Guidelines](http://msdn.microsoft.com/en-us/library/ms229042.aspx) points out, this may be due to the confusion between 'resource management' and 'memory management':
-
-<p class="comment">
-	Many people who hear about the Dispose pattern for the first time complain that
-	the GC isn't doing its job. They think it should collect resources, and that this
-	is just like having to manage resources as you did in the unmanaged world. The truth
-	is that the GC was never meant to manage resources. It was designed to manage memory
-	and it is excellent in doing just that. - <a href="http://blogs.msdn.com/b/kcwalina/">
-		Krzysztof Cwalina</a> from <a href="http://www.bluebytesoftware.com/blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx">
-			Joe Duffy's blog</a>
-</p>
-
-This is both a testament to Microsoft for making .NET so easy to work with and also a problem as it is a key part of the runtime to misunderstand. 
-Considering this, I thought it was prudent to note that _subscriptions will not be automatically disposed of_. 
-You can safely assume that the instance of `IDisposable` that is returned to you does not have a finalizer and will not be collected when it goes out of scope. 
-If you call a `Subscribe` method and ignore the return value, you have lost your only handle to unsubscribe. 
-The subscription will still exist, and you have effectively lost access to this resource, which could result in leaking memory and running unwanted processes.
-
-The exception to this cautionary note is when using the `Subscribe` extension methods. 
-These methods will internally construct behavior that will _automatically detach_ subscriptions when the sequence completes or errors. 
-Even with the automatic detach behavior; you still need to consider sequences that never terminate (by `OnCompleted` or `OnError`). 
-You will need the instance of `IDisposable` to terminate the subscription to these infinite sequences explicitly.
-
-<p class="comment">
-	You will find many of the examples in this book will not allocate the `IDisposable`
-	return value. This is only for brevity and clarity of the sample. <a href="18_UsageGuidelines.html">
-		Usage guidelines</a> and best practice information can be found in the appendix.
-</p>
-
-By leveraging the common `IDisposable` interface, Rx offers the ability to have deterministic control over the lifetime of your subscriptions. 
-Subscriptions are independent, so the disposable of one will not affect another. 
-While some `Subscribe` extension methods utilize an automatically detaching observer, it is still considered best practice to explicitly manage your subscriptions, as you would with any other resource implementing `IDisposable`. 
-As we will see in later chapters, a subscription may actually incur the cost of other resources such as event handles, caches and threads. 
-It is also best practice to always provide an `OnError` handler to prevent an exception being thrown in an otherwise difficult to handle manner.
-
-With the knowledge of subscription lifetime management, you are able to keep a tight leash on subscriptions and their underlying resources. 
-With judicious application of standard disposal patterns to your Rx code, you can keep your applications predictable, easier to maintain, easier to extend and hopefully bug free.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 0 - 874
Rx.NET/Documentation/IntroToRx/04_CreatingObservableSequences.md

@@ -1,874 +0,0 @@
----
-title : Creating a sequence
----
-
-<!--
-        LC
-        Introduce the concept of Lazy. Contrast this to the recently mentioned earger disposal. Lazy eval + eager disposal = miniumn resource lifetime.
-        Check for And also, and then continuations through out. Ensure that we are creating sensible an obvious breaks in passage.
-
-        G.A.
-I've been up for a while so it's probably me fucking up something obvious, but the code as is gives me this error:
-Cannot convert lambda expression to delegate type 'System.Func<System.IObserver<string>,System.Action>' because some of the return types in the block are not implicitly convertible to the delegate return type
- 
-And if I use the Action variant instead I get:
-Cannot convert lambda expression to delegate type 'System.Func<System.IObserver<string>,System.IDisposable>' because some of the return types in the block are not implicitly convertible to the delegate return type
- 
--->
-
-#PART 2 - Sequence basics		{#PART2 .SectionHeader}
-
-So you want to get involved and write some Rx code, but how do you get started?
-We have looked at the key types, but know that we should not be creating our own implementations of `IObserver<T>` or `IObservable<T>` and should favor factory methods over using subjects. 
-Even if we have an observable sequence, how do we pick out the data we want from it? 
-We need to understand the basics of creating an observable sequence, getting values into it and picking out the values we want from them.
-
-In Part 2 we discover the basics for constructing and querying observable sequences.
-We assert that LINQ is fundamental to using and understanding Rx. 
-On deeper inspection, we find that _functional programming_ concepts are core to having a deep understanding of LINQ and therefore enabling you to master Rx. 
-To support this understanding, we classify the query operators into three main groups. 
-Each of these groups proves to have a root operator that the other operators can be constructed from. 
-Not only will this deconstruction exercise provide a deeper insight to Rx, functional programming and query composition; it should arm you with the ability to create custom operators where the general Rx operators do not meet your needs.
-
-#Creating a sequence				{#CreationOfObservables}
-
-In the previous chapters we used our first Rx extension method, the `Subscribe` method and its overloads. 
-We also have seen our first factory method in `Subject.Create()`. 
-We will start looking at the vast array of other methods that enrich `IObservable<T>` to make Rx what it is. 
-It may be surprising to see that there are relatively few public instance methods in the Rx library. 
-There are however a large number of public static methods, and more specifically, a large number of extension methods. 
-Due to the large number of methods and their overloads, we will break them down into categories.
-
-<p class="comment">
-	Some readers may feel that they can skip over parts of the next few chapters. 
-	I would only suggest doing so if you are very confident with LINQ and functional composition.
-	The intention of this book is to provide a step-by-step introduction to Rx, with the goal of you, the reader, being able to apply Rx to your software. 
-	The appropriate	application of Rx will come through a sound understanding of the fundamentals of Rx. 
-	The most common mistakes people will make with Rx are due to a misunderstanding of the principles upon which Rx was built. 
-	With this in mind, I encourage you to read on.
-</p>
-
-It seems sensible to follow on from our examination of our key types where we simply constructed new instances of subjects. 
-Our first category of methods will be _creational_ methods: simple ways we can create instances of `IObservable<T>` sequences.
-These methods generally take a seed to produce a sequence: either a single value of a type, or just the type itself. 
-In functional programming this can be described as _anamorphism_ or referred to as an '_unfold_'.
-
-##Simple factory methods			{#SimpleFactoryMethods}
-
-###Observable.Return				{#ObservableReturn}
-
-In our first and most basic example we introduce `Observable.Return<T>(T value)`.
-This method takes a value of `T` and returns an `IObservable<T>` with the single value and then completes. 
-It has _unfolded_ a value of `T` into an observable sequence.
-
-	var singleValue = Observable.Return<string>("Value");
-	//which could have also been simulated with a replay subject
-	var subject = new ReplaySubject<string>();
-	subject.OnNext("Value");
-	subject.OnCompleted();
-
-Note that in the example above that we could use the factory method or get the same effect by using the replay subject. 
-The obvious difference is that the factory method is only one line and it allows for declarative over imperative programming style.
-In the example above we specified the type parameter as `string`, this is not necessary as it can be inferred from the argument provided.
-
-	singleValue = Observable.Return<string>("Value");
-	//Can be reduced to the following
-	singleValue = Observable.Return("Value");
-
-###Observable.Empty					{#ObservableEmpty}
-
-The next two examples only need the type parameter to unfold into an observable sequence. 
-The first is `Observable.Empty<T>()`. 
-This returns an empty `IObservable<T>` i.e. it just publishes an `OnCompleted` notification.
-
-	var empty = Observable.Empty<string>();
-	//Behaviorally equivalent to
-	var subject = new ReplaySubject<string>();
-	subject.OnCompleted();
-
-###Observable.Never					{#ObservableNever}
-
-The `Observable.Never<T>()` method will return infinite sequence without any notifications.
-
-	var never = Observable.Never<string>();
-	//similar to a subject without notifications
-	var subject = new Subject<string>();
-
-###Observable.Throw					{#ObservableThrow}
-
-`Observable.Throw<T>(Exception)` method needs the type parameter information, it also need the `Exception` that it will `OnError` with. 
-This method creates a sequence with just a single `OnError` notification containing the	exception passed to the factory.
-
-
-	var throws = Observable.Throw<string>(new Exception()); 
-	//Behaviorally equivalent to
-	var subject = new ReplaySubject<string>(); 
-	subject.OnError(new Exception());
-
-###Observable.Create				{#ObservableCreate}
-
-The `Create` factory method is a little different to the above creation methods.
-The method signature itself may be a bit overwhelming at first, but becomes quite natural once you have used it.
-
-	//Creates an observable sequence from a specified Subscribe method implementation.
-	public static IObservable<TSource> Create<TSource>(
-		Func<IObserver<TSource>, IDisposable> subscribe)
-	{...}
-	public static IObservable<TSource> Create<TSource>(
-		Func<IObserver<TSource>, Action> subscribe)
-	{...}
-
-Essentially this method allows you to specify a delegate that will be executed anytime a subscription is made. 
-The `IObserver<T>` that made the subscription will be passed to your delegate so that you can call the `OnNext`/`OnError`/`OnCompleted` methods as you need. 
-This is one of the few scenarios where you will need to concern yourself with the `IObserver<T>` interface. 
-Your delegate is a `Func` that returns an `IDisposable`. 
-This `IDisposable` will have its `Dispose()` method called when the subscriber disposes from their subscription.
-
-The `Create` factory method is the preferred way to implement custom observable sequences. 
-The usage of subjects should largely remain in the realms of samples and testing. 
-Subjects are a great way to get started with Rx. 
-They reduce the learning curve for new developers, however they pose several concerns that the `Create` method eliminates. 
-Rx is effectively a functional programming paradigm. Using subjects means we are now managing state, which is potentially mutating. 
-Mutating state and asynchronous programming are very hard to get right. 
-Furthermore many of the operators (extension methods) have been carefully written to ensure correct and consistent lifetime of subscriptions and sequences are maintained. 
-When you introduce subjects you can break this. 
-Future releases may also see significant performance degradation if you explicitly use subjects.
-
-The `Create` method is also preferred over creating custom types that implement the `IObservable` interface. 
-There really is no need to implement the observer/observable interfaces yourself. 
-Rx tackles the intricacies that you may not think of such as thread safety of notifications and subscriptions.
-
-A significant benefit that the `Create` method has over subjects is that the sequence will be lazily evaluated. 
-Lazy evaluation is a very important part of Rx. 
-It opens doors to other powerful features such as scheduling and combination of sequences that we will see later. 
-The delegate will only be invoked when a subscription is made.
-
-In this example we show how we might first return a sequence via standard blocking eagerly evaluated call, and then we show the correct way to return an observable sequence without blocking by lazy evaluation.
-
-	private IObservable<string> BlockingMethod()
-	{
-		var subject = new ReplaySubject<string>();
-		subject.OnNext("a");
-		subject.OnNext("b");
-		subject.OnCompleted();
-		Thread.Sleep(1000);
-		return subject;
-	}
-	private IObservable<string> NonBlocking()
-	{
-		return Observable.Create<string>(
-			(IObserver<string> observer) =>
-			{
-				observer.OnNext("a");
-				observer.OnNext("b");
-				observer.OnCompleted();
-				Thread.Sleep(1000);
-				return Disposable.Create(() => Console.WriteLine("Observer has unsubscribed"));
-				//or can return an Action like 
-				//return () => Console.WriteLine("Observer has unsubscribed"); 
-			});
-	}
-
-While the examples are somewhat contrived, the intention is to show that when a consumer calls the eagerly evaluated, blocking method, they will be blocked for at least 1 second before they even receive the `IObservable<string>`, regardless of if they do actually subscribe to it or not. 
-The non blocking method is lazily evaluated so the consumer immediately receives the `IObservable<string>` and will only incur the cost of the thread sleep if they subscribe.
-
-As an exercise, try to build the `Empty`, `Return`, `Never` &amp; `Throw` extension methods yourself using the `Create` method.
-If you have Visual Studio or [LINQPad](http://www.linqpad.net/) available to you right now, code it up as quickly as you can. 
-If you don't (perhaps you are on the train on the way to work), try to conceptualize how you would solve this problem. 
-When you are done move forward to see some examples of how it could be done...
-
-<hr style="page-break-after: always" />
-
-Examples of `Empty`, `Return`, `Never` and `Throw` recreated with `Observable.Create`:
-
-	public static IObservable<T> Empty<T>()
-	{
-		return Observable.Create<T>(o =>
-		{
-			o.OnCompleted();
-			return Disposable.Empty;
-		});
-	}
-	public static IObservable<T> Return<T>(T value)
-	{
-		return Observable.Create<T>(o =>
-		{
-			o.OnNext(value);
-			o.OnCompleted();
-			return Disposable.Empty;
-		});
-	}
-	public static IObservable<T> Never<T>()
-	{
-		return Observable.Create<T>(o =>
-		{
-			return Disposable.Empty;
-		});
-	}
-	public static IObservable<T> Throws<T>(Exception exception)
-	{
-		return Observable.Create<T>(o =>
-		{
-			o.OnError(exception);
-			return Disposable.Empty;
-		});
-	}
-
-You can see that `Observable.Create` provides the power to build our own factory methods if we wish. 
-You may have noticed that in each of the examples we only are able to return our subscription token (the implementation of `IDisposable`) once we have produced all of our `OnNext` notifications. 
-This is because inside of the delegate we provide, we are completely sequential. 
-It also makes the token rather pointless. 
-Now we look at how we can use the return value in a more useful way. 
-First is an example where inside our delegate we create a Timer that will call the observer's `OnNext` each time the timer ticks.
-
-	//Example code only
-	public void NonBlocking_event_driven()
-	{
-		var ob = Observable.Create<string>(
-			observer =>
-			{
-				var timer = new System.Timers.Timer();
-				timer.Interval = 1000;
-				timer.Elapsed += (s, e) => observer.OnNext("tick");
-				timer.Elapsed += OnTimerElapsed;
-				timer.Start();
-				
-				return Disposable.Empty;
-			});
-		var subscription = ob.Subscribe(Console.WriteLine);
-		Console.ReadLine();
-		subscription.Dispose();
-	}
-	private void OnTimerElapsed(object sender, ElapsedEventArgs e)
-	{
-		Console.WriteLine(e.SignalTime);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">tick</div>
-	<div class="line">01/01/2012 12:00:00</div>
-	<div class="line">tick</div>
-	<div class="line">01/01/2012 12:00:01</div>
-	<div class="line">tick</div>
-	<div class="line">01/01/2012 12:00:02</div>
-	<div class="line"></div>
-	<div class="line">01/01/2012 12:00:03</div>
-	<div class="line">01/01/2012 12:00:04</div>
-	<div class="line">01/01/2012 12:00:05</div>
-</div>
-
-The example above is broken. 
-When we dispose of our subscription, we will stop seeing "tick" being written to the screen; however we have not released our second event handler "`OnTimerElasped`" and have not disposed of the instance of the timer, so it will still be writing the `ElapsedEventArgs.SignalTime` to the console after our disposal. 
-The extremely simple fix is to return `timer` as the `IDisposable` token.
-
-	//Example code only
-	var ob = Observable.Create<string>(
-		observer =>
-		{
-			var timer = new System.Timers.Timer();
-			timer.Interval = 1000;
-			timer.Elapsed += (s, e) => observer.OnNext("tick");
-			timer.Elapsed += OnTimerElapsed;
-			timer.Start();
-				
-			return timer;
-		});
-
-Now when a consumer disposes of their subscription, the underlying `Timer` will be disposed of too.
-
-`Observable.Create` also has an overload that requires your `Func` to return an `Action` instead of an `IDisposable`. 
-In a similar example to above, this one shows how you could use an action to un-register the event handler, preventing a memory leak by retaining the reference to the timer.
-
-	//Example code only
-	var ob = Observable.Create<string>(
-		observer =>
-		{
-			var timer = new System.Timers.Timer();
-			timer.Enabled = true;
-			timer.Interval = 100;
-			timer.Elapsed += OnTimerElapsed;
-			timer.Start();
-				
-			return ()=>{
-				timer.Elapsed -= OnTimerElapsed;
-				timer.Dispose();
-			};
-		});
-
-These last few examples showed you how to use the `Observable.Create` method.
-These were just examples; there are actually better ways to produce values from a timer that we will look at soon. 
-The intention is to show that `Observable.Create` provides you a lazily evaluated way to create observable sequences. 
-We will dig much deeper into lazy evaluation and application of the `Create` factory method throughout the book especially when we cover concurrency and scheduling.
-
-##Functional unfolds				{#Unfold}
-
-As a functional programmer you would come to expect the ability to unfold a potentially	infinite sequence. 
-An issue we may face with `Observable.Create` is that is that it can be a clumsy way to produce an infinite sequence. 
-Our timer example above is an example of an infinite sequence, and while this is a simple implementation it is an annoying amount of code for something that effectively is delegating all the work to the `System.Timers.Timer` class. 
-The `Observable.Create` method also has poor support for unfolding sequences using corecursion.
-
-###Corecursion						{#Corecursion}
-
-Corecursion is a function to apply to the current state to produce the next state.
-Using corecursion by taking a value, applying a function to it that extends that value and repeating we can create a sequence. 
-A simple example might be to take the value 1 as the seed and a function that increments the given value by one. 
-This could be used to create sequence of [1,2,3,4,5...].
-
-Using corecursion to create an `IEnumerable<int>` sequence is made simple with the `yield return` syntax.
-
-	private static IEnumerable<T> Unfold<T>(T seed, Func<T, T> accumulator)
-	{
-		var nextValue = seed;
-		while (true)
-		{
-			yield return nextValue;
-			nextValue = accumulator(nextValue);
-		}
-	}
-
-The code above could be used to produce the sequence of natural numbers like this.
-
-	var naturalNumbers = Unfold(1, i => i + 1);
-	Console.WriteLine("1st 10 Natural numbers");
-	foreach (var naturalNumber in naturalNumbers.Take(10))
-	{
-		Console.WriteLine(naturalNumber);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">1st 10 Natural numbers</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">5</div>
-	<div class="line">6</div>
-	<div class="line">7</div>
-	<div class="line">8</div>
-	<div class="line">9</div>
-	<div class="line">10</div>
-</div>
-
-Note the `Take(10)` is used to terminate the infinite sequence.
-
-Infinite and arbitrary length sequences can be very useful. 
-First we will look at some that come with Rx and then consider how we can generalize the creation of infinite observable sequences.
-
-###Observable.Range					{#ObservableRange}
-
-`Observable.Range(int, int)` simply returns a range of integers. 
-The first integer is the initial value and the second is the number of values to yield. 
-This example will write the values '10' through to '24' and then complete.
-
-	var range = Observable.Range(10, 15);
-	range.Subscribe(Console.WriteLine, ()=>Console.WriteLine("Completed"));
-
-###Observable.Generate				{#ObservableGenerate}
-
-It is difficult to emulate the `Range` factory method using `Observable.Create`.
-It would be cumbersome to try and respect the principles that the code should be lazily evaluated and the consumer should be able to dispose of the subscription resources when they so choose. 
-This is where we can use corecursion to provide a richer unfold. 
-In Rx the unfold method is called `Observable.Generate`.
-
-The simple version of `Observable.Generate` takes the following parameters:
-
- * an initial state
- * a predicate that defines when the sequence should terminate
- * a function to apply to the current state to produce the next state
- * a function to transform the state to the desired output
-
-	public static IObservable<TResult> Generate<TState, TResult>(
-		TState initialState, 
-		Func<TState, bool> condition, 
-		Func<TState, TState> iterate, 
-		Func<TState, TResult> resultSelector)
-
-As an exercise, write your own `Range` factory method using `Observable.Generate`.
-
-Consider the `Range` signature `Range(int start, int count)`, which provides the seed and a value for the conditional predicate. 
-You know how each new value is derived from the previous one; this becomes your iterate function.
-Finally, you probably don't need to transform the state so this makes the result selector function very simple.
-
-Continue when you have built your own version...
-
-<hr style="page-break-after: always" />
-
-Example of how you could use `Observable.Generate` to construct a similar `Range` factory method.
-
-
-	//Example code only
-	public static IObservable<int> Range(int start, int count)
-	{
-		var max = start + count;
-		return Observable.Generate(
-			start, 
-			value => value < max, 
-			value => value + 1, 
-			value => value);
-	}
-	
-###Observable.Interval				{#ObservableInterval}
-
-Earlier in the chapter we used a `System.Timers.Timer` in our observable to generate a continuous sequence of notifications. 
-As mentioned in the example at the time, this is not the preferred way of working with timers in Rx. 
-As Rx provides operators that give us this functionality it could be argued that to not use them is to re-invent the wheel. 
-More importantly the Rx operators are the preferred way of working with timers due to their ability to substitute in schedulers which is desirable for easy substitution of the underlying timer. 
-There are at least three various timers you could choose from for the example above:
-
- * `System.Timers.Timer`
- * `System.Threading.Timer`
- * `System.Windows.Threading.DispatcherTimer`
-
-By abstracting the timer away via a scheduler we are able to reuse the same code for multiple platforms. 
-More importantly than being able to write platform independent code is the ability to substitute in a test-double scheduler/timer to enable testing.
-Schedulers are a complex subject that is out of scope for this chapter, but they are covered in detail in the later chapter on [Scheduling and threading](15_SchedulingAndThreading.html).
-
-There are three better ways of working with constant time events, each being a further generalization of the former. 
-The first is `Observable.Interval(TimeSpan)` which will publish incremental values starting from zero, based on a frequency of your choosing. 
-This example publishes values every 250 milliseconds.
-
-
-	var interval = Observable.Interval(TimeSpan.FromMilliseconds(250));
-	interval.Subscribe(
-		Console.WriteLine, 
-		() => Console.WriteLine("completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">5</div>
-</div>
-
-Once subscribed, you must dispose of your subscription to stop the sequence. 
-It is an example of an infinite sequence.
-
-###Observable.Timer					{#ObservableTimer}
-
-The second factory method for producing constant time based sequences is `Observable.Timer`.
-It has several overloads; the first of which we will look at being very simple.
-The most basic overload of `Observable.Timer` takes just a `TimeSpan` as `Observable.Interval` does. 
-The `Observable.Timer` will however only publish one value (0) after the period of time has elapsed, and then it will complete.
-
-	var timer = Observable.Timer(TimeSpan.FromSeconds(1));
-	timer.Subscribe(
-		Console.WriteLine, 
-		() => Console.WriteLine("completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">completed</div>
-</div>
-
-Alternatively, you can provide a `DateTimeOffset` for the `dueTime` parameter. 
-This will produce the value 0 and complete at the due time.
-
-A further set of overloads adds a `TimeSpan` that indicates the period to produce subsequent values. 
-This now allows us to produce infinite sequences and also construct `Observable.Interval` from `Observable.Timer`.
-
-	public static IObservable<long> Interval(TimeSpan period)
-	{
-		return Observable.Timer(period, period);
-	}
-
-
-Note that this now returns an `IObservable` of `long` not `int`.
-While `Observable.Interval` would always wait the given period before producing the first value, this `Observable.Timer` overload gives the ability to start the sequence when you choose. 
-With `Observable.Timer` you can write the following to have an interval sequence that started immediately.
-
-
-	Observable.Timer(TimeSpan.Zero, period);
-
-
-This takes us to our third way and most general way for producing timer related sequences, back to `Observable.Generate`. 
-This time however, we are looking at a more complex overload that allows you to provide a function that specifies the due time for the next value.
-
-	public static IObservable<TResult> Generate<TState, TResult>(
-		TState initialState, 
-		Func<TState, bool> condition, 
-		Func<TState, TState> iterate, 
-		Func<TState, TResult> resultSelector, 
-		Func<TState, TimeSpan> timeSelector)
-
-Using this overload, and specifically the extra `timeSelector` argument, we can produce our own implementation of `Observable.Timer` and in turn, `Observable.Interval`.
-
-	public static IObservable<long> Timer(TimeSpan dueTime)
-	{
-		return Observable.Generate(
-			0l,
-			i => i < 1,
-			i => i + 1,
-			i => i,
-			i => dueTime);
-	}
-	public static IObservable<long> Timer(TimeSpan dueTime, TimeSpan period)
-	{
-		return Observable.Generate(
-			0l,
-			i => true,
-			i => i + 1,
-			i => i,
-			i => i == 0 ? dueTime : period);
-	}
-	public static IObservable<long> Interval(TimeSpan period)
-	{
-		return Observable.Generate(
-			0l,
-			i => true,
-			i => i + 1,
-			i => i,
-			i => period);
-	}
-
-This shows how you can use `Observable.Generate` to produce infinite sequences.
-I will leave it up to you the reader, as an exercise using `Observable.Generate`, to produce values at variable rates. 
-I find using these methods invaluable not only in day to day work but especially for producing dummy data.
-
-##Transitioning into IObservable&lt;T&gt;		{#TransitioningIntoIObservable}
-
-Generation of an observable sequence covers the complicated aspects of functional programming i.e. corecursion and unfold. 
-You can also start a sequence by simply making a transition from an existing synchronous or asynchronous paradigm into the Rx paradigm.
-
-###From delegates					{#ObservableStart}
-
-The `Observable.Start` method allows you to turn a long running `Func<T>` or `Action` into a single value observable sequence. 
-By default, the processing will be done asynchronously on a ThreadPool thread. 
-If the overload you use is a `Func<T>` then the return type will be `IObservable<T>`.
-When the function returns its value, that value will be published and then the sequence completed. 
-If you use the overload that takes an `Action`, then the returned sequence will be of type `IObservable<Unit>`. 
-The `Unit` type is a functional programming construct and is analogous to `void`. 
-In this case `Unit` is used to publish an acknowledgement that the `Action` is complete, however this is rather inconsequential as the sequence is immediately completed straight after `Unit` anyway. 
-The `Unit` type itself has no value; it just serves as an empty payload for the `OnNext` notification.
-Below is an example of using both overloads.
-
-	static void StartAction()
-	{
-		var start = Observable.Start(() =>
-			{
-				Console.Write("Working away");
-				for (int i = 0; i < 10; i++)
-				{
-					Thread.Sleep(100);
-					Console.Write(".");
-				}
-			});
-		start.Subscribe(
-			unit => Console.WriteLine("Unit published"), 
-			() => Console.WriteLine("Action completed"));
-	}
-	static void StartFunc()
-	{
-		var start = Observable.Start(() =>
-		{
-			Console.Write("Working away");
-			for (int i = 0; i < 10; i++)
-			{
-				Thread.Sleep(100);
-				Console.Write(".");
-			}
-			return "Published value";
-		});
-		start.Subscribe(
-			Console.WriteLine, 
-			() => Console.WriteLine("Action completed"));
-	}
-	
-Note the difference between `Observable.Start` and `Observable.Return`; `Start` lazily evaluates the value from a function, `Return` provided the value eagerly. This makes `Start` very much like a `Task`. 
-This can also lead to some confusion on when to use each of the features. 
-Both are valid tools and the choice come down to the context of the problem space. 
-Tasks are well suited to parallelizing computational work and providing workflows via continuations for computationally heavy work. 
-Tasks also have the benefit of documenting and enforcing single value semantics. 
-Using `Start` is a good way to integrate computationally heavy work into an existing code base that is largely made up of observable sequences.
-We look at [composition of sequences](12_CombiningSequences.html) in more depth later in the book.
-
-###From events						{#FromEvent}
-
-As we discussed early in the book, .NET already has the event model for providing a reactive, event driven programming model. 
-While Rx is a more powerful and useful framework, it is late to the party and so needs to integrate with the existing event model. 
-Rx provides methods to take an event and turn it into an observable sequence.
-There are several different varieties you can use. 
-Here is a selection of common event patterns.
-
-	//Activated delegate is EventHandler
-	var appActivated = Observable.FromEventPattern(
-			h => Application.Current.Activated += h,
-			h => Application.Current.Activated -= h);
-	//PropertyChanged is PropertyChangedEventHandler
-	var propChanged = Observable.FromEventPattern
-		<PropertyChangedEventHandler, PropertyChangedEventArgs>(
-			handler => handler.Invoke,
-			h => this.PropertyChanged += h,
-			h => this.PropertyChanged -= h);
-			
-	//FirstChanceException is EventHandler<FirstChanceExceptionEventArgs>
-	var firstChanceException = Observable.FromEventPattern<FirstChanceExceptionEventArgs>(
-			h => AppDomain.CurrentDomain.FirstChanceException += h,
-			h => AppDomain.CurrentDomain.FirstChanceException -= h);      
-
-
-So while the overloads can be confusing, they key is to find out what the event's signature is. 
-If the signature is just the base `EventHandler` delegate then you can use the first example. 
-If the delegate is a sub-class of the `EventHandler`, then you need to use the second example and provide the `EventHandler` sub-class and also its specific type of `EventArgs`. 
-Alternatively, if the delegate is the newer generic `EventHandler<TEventArgs>`, then you need to use the third example and just specify what the generic type of the event argument is.
-
-It is very common to want to expose property changed events as observable sequences.
-These events can be exposed via `INotifyPropertyChanged` interface, a `DependencyProperty` or perhaps by events named appropriately to the Property they are representing.
-If you are looking at writing your own wrappers to do this sort of thing, I would strongly suggest looking at the Rxx library on [http://Rxx.codeplex.com](http://Rxx.codeplex.com) first. 
-Many of these have been catered for in a very elegant fashion.
-
-###From Task						{#FromTask}
-
-Rx provides a useful, and well named set of overloads for transforming from other existing paradigms to the Observable paradigm. 
-The `ToObservable()` method overloads provide a simple route to make the transition.
-
-As we mentioned earlier, the `AsyncSubject<T>` is similar to a `Task<T>`.
-They both return you a single value from an asynchronous source. 
-They also both cache the result for any repeated or late requests for the value. 
-The first `ToObservable()` extension method overload we look at is an extension to `Task<T>`.
-The implementation is simple;
-
-
- * if the task is already in a status of `RanToCompletion` then the value is added to the sequence and then the sequence completed
- * if the task is Cancelled then the sequence will error with a `TaskCanceledException`
- * if the task is Faulted then the sequence will error with the task's inner exception
- * if the task has not yet completed, then a continuation is added to the task to perform the above actions appropriately
-
-There are two reasons to use the extension method:
-
- * From Framework 4.5, almost all I/O-bound functions return `Task<T>`
- * If `Task<T>` is a good fit, it's preferable to use it over `IObservable<T>` - because it communicates single-value result in the type system. 
-In other words,	a function that returns a single value in the future should return a `Task<T>`,	not an `IObservable<T>`. 
-Then if you need to combine it with other observables, use `ToObservable()`.
-
-Usage of the extension method is also simple.
-
-	var t = Task.Factory.StartNew(()=>"Test");
-	var source = t.ToObservable();
-	source.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">Test</div>
-	<div class="line">completed</div>
-</div>
-
-There is also an overload that converts a `Task` (non generic) to an `IObservable<Unit>`.
-
-###From IEnumerable&lt;T&gt;		{#FromIEnumerable}
-
-The final overload of `ToObservable` takes an `IEnumerable<T>`.
-This is semantically like a helper method for an `Observable.Create` with a `foreach` loop in it.
-
-	//Example code only
-	public static IObservable<T> ToObservable<T>(this IEnumerable<T> source)
-	{
-		return Observable.Create<T>(o =>
-		{
-			foreach (var item in source)
-			{
-				o.OnNext(item);
-			}
-			//Incorrect disposal pattern
-			return Disposable.Empty;
-		});
-	}
-
-This crude implementation however is naive. 
-It does not allow for correct disposal, it does not handle exceptions correctly and as we will see later in the book, it does not have a very nice concurrency model. 
-The version in Rx of course caters for all of these tricky details so you don't need to worry.
-
-When transitioning from `IEnumerable<T>` to `IObservable<T>`, you should carefully consider what you are really trying to achieve. 
-You should also carefully test and measure the performance impacts of your decisions. 
-Consider that the blocking synchronous (pull) nature of `IEnumerable<T>` sometimes just does not mix well with the asynchronous (push) nature of `IObservable<T>`.
-Remember that it is completely valid to pass `IEnumerable`, `IEnumerable<T>`, arrays or collections as the data type for an observable sequence. 
-If the sequence can be materialized all at once, then you may want to avoid exposing it as an `IEnumerable`.
-If this seems like a fit for you then also consider passing immutable types like an array or a `ReadOnlyCollection<T>`. 
-We will see the use of `IObservable<IList<T>>` later for operators that provide batching of data.
-
-###From APM							{#FromAPM}
-
-Finally we look at a set of overloads that take you from the [Asynchronous Programming Model](http://msdn.microsoft.com/en-us/magazine/cc163467.aspx) (APM) to an observable sequence. 
-This is the style of programming found in .NET that can be identified with the use of two methods prefixed with `Begin...` and `End...` and the iconic `IAsyncResult` parameter type. 
-This is commonly seen in the I/O APIs.
-
-	class webrequest
-	{    
-		public webresponse getresponse() 
-		{...}
-		public iasyncresult begingetresponse(
-			asynccallback callback, 
-			object state) 
-		{...}
-		public webresponse endgetresponse(iasyncresult asyncresult) 
-		{...}
-		...
-	}
-	class stream
-	{
-		public int read(
-			byte[] buffer, 
-			int offset, 
-			int count) 
-		{...}
-		public iasyncresult beginread(
-			byte[] buffer, 
-			int offset, 
-			int count, 
-			asynccallback callback, 
-			object state) 
-		{...}
-		public int endread(iasyncresult asyncresult) 
-		{...}
-		...
-	}
-</pre>
-<p class="comment">
-	At time of writing .NET 4.5 was still in preview release. 
-	Moving forward with .NET 4.5 the APM model will be replaced with `Task` and new `async` and `await` keywords. 
-	Rx 2.0 which is also in a beta release will integrate with these features. .NET 4.5 and Rx 2.0 are not in the scope of this book.
-</p>
-
-APM, or the Async Pattern, has enabled a very powerful, yet clumsy way of for .NET programs to perform long running I/O bound work. 
-If we were to use the synchronous access to IO, e.g. `WebRequest.GetResponse()` or `Stream.Read(...)`, we would be blocking a thread but not performing any work while we waited for the IO. 
-This can be quite wasteful on busy servers performing a lot of concurrent work to hold a thread idle while waiting for I/O to complete. 
-Depending on the implementation, APM can work at the hardware device driver layer and not require any threads while blocking. 
-Information on how to follow the APM model is scarce. 
-Of the documentation you can find it is pretty shaky, however, for more information on APM, see Jeffrey Richter's brilliant book <cite>CLR via C#</cite> or Joe Duffy's comprehensive <cite>Concurrent Programming on Windows</cite>. 
-Most stuff on the internet is blatant plagiary of Richter's examples from his book. 
-An in-depth examination of APM is outside of the scope of this book.
-
-To utilize the Asynchronous Programming Model but avoid its awkward API, we can use the `Observable.FromAsyncPattern` method. 
-Jeffrey van Gogh gives a brilliant walk through of the `Observable.FromAsyncPattern` in [Part 1](http://blogs.msdn.com/b/jeffva/archive/2010/07/23/rx-on-the-server-part-1-of-n-asynchronous-system-io-stream-reading.aspx) of his <cite>Rx on the Server</cite> blog series. 
-While the theory backing the Rx on the Server series is sound, it was written in mid 2010 and targets an old version of Rx.
-
-With 30 overloads of `Observable.FromAsyncPattern` we will look at the general concept so that you can pick the appropriate overload for yourself. 
-First if we look at the normal pattern of APM we will see that the BeginXXX method will take zero or more data arguments followed by an `AsyncCallback` and an `Object`.
-The BeginXXX method will also return an `IAsyncResult` token.
-
-	//Standard Begin signature
-	IAsyncResult BeginXXX(AsyncCallback callback, Object state);
-	//Standard Begin signature with data
-	IAsyncResult BeginYYY(string someParam1, AsyncCallback callback, object state);
-
-The EndXXX method will accept an `IAsyncResult` which should be the token returned from the BeginXXX method. The EndXXX can also return a value.
-
-	//Standard EndXXX Signature
-	void EndXXX(IAsyncResult asyncResult);
-	//Standard EndXXX Signature with data
-	int EndYYY(IAsyncResult asyncResult);
-
-The generic arguments for the `FromAsyncPattern` method are just the BeginXXX data arguments if any, followed by the EndXXX return type if any. 
-If we apply that to our `Stream.Read(byte[], int, int, AsyncResult, object)` example above we see that we have a `byte[]`, an `int` and another `int` as our data parameters for `BeginRead` method.
-
-	//IAsyncResult BeginRead(
-	//  byte[] buffer, 
-	//  int offset, 
-	//  int count, 
-	//  AsyncCallback callback, object state) {...}
-	Observable.FromAsyncPattern<byte[], int, int ...
-
-Now we look at the EndXXX method and see it returns an `int`, which completes the generic signature of our `FromAsyncPattern` call.
-
-	//int EndRead(
-	//  IAsyncResult asyncResult) {...}
-	Observable.FromAsyncPattern<byte[], int, int, int>
-
-The result of the call to `Observable.FromAsyncPattern` does _not_ return an observable sequence. 
-It returns a delegate that returns an observable sequence.
-The signature for this delegate will match the generic arguments of the call to	`FromAsyncPattern`, except that the return type will be wrapped in an observable sequence.
-
-	var fileLength = (int) stream.Length;
-	//read is a Func<byte[], int, int, IObservable<int>>
-	var read = Observable.FromAsyncPattern<byte[], int, int, int>(
-		stream.BeginRead, 
-		stream.EndRead);
-	var buffer = new byte[fileLength];
-	var bytesReadStream = read(buffer, 0, fileLength);
-	bytesReadStream.Subscribe(
-		byteCount =>
-		{
-			Console.WriteLine("Number of bytes read={0}, buffer should be populated with data now.",
-			byteCount);
-		});
-
-Note that this implementation is just an example. 
-For a very well designed implementation that is built against the latest version of Rx you should look at the Rxx project on [http://rxx.codeplex.com](http://rxx.codeplex.com).
-
-This covers the first classification of query operators: creating observable sequences.
-We have looked at the various eager and lazy ways to create a sequence. 
-We have introduced the concept of corecursion and show how we can use it with the `Generate` method to unfold potentially infinite sequences. 
-We can now produce timer based sequences using the various factory methods. 
-We should also be familiar with ways to transition from other synchronous and asynchronous paradigms and be able to decide when it is or is not appropriate to do so. 
-As a quick recap:
-
- * Factory Methods
-   * Observable.Return
-   * Observable.Empty
-   * Observable.Never
-   * Observable.Throw
-   * Observable.Create
-
- * Unfold methods
-   * Observable.Range
-   * Observable.Interval
-   * Observable.Timer
-   * Observable.Generate
-
- * Paradigm Transition
-   * Observable.Start
-   * Observable.FromEventPattern
-   * Task.ToObservable
-   * Task&lt;T&gt;.ToObservable
-   * IEnumerable&lt;T&gt;.ToObservable
-   * Observable.FromAsyncPattern
-
-Creating an observable sequence is our first step to practical application of Rx: create the sequence and then expose it for consumption. 
-Now that we have a firm grasp on how to create an observable sequence, we can discover the operators that allow us to query an observable sequence.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 13 - 0
Rx.NET/Documentation/IntroToRx/04_Part2.md

@@ -0,0 +1,13 @@
+# PART 2 - From Events to Insights 
+
+We live in an age where data is being created, stored, and distributed at a phenomenal rate. Consuming this data can be overwhelming, like trying to drink directly from a fire hose. We need the ability to identify the important data, meaning we need ways to determine what is and is not relevant. We need to take groups of data and process them collectively to discover patterns or other information that might not be apparent from any individual raw input. Users, customers and managers need to do this with more data than ever before, while still delivering higher performance and more useful outputs.
+
+Rx provides some powerful mechanisms for extracting meaningful insights from raw data streams. This is one of the main reasons for representing information as `IObservable<T>` streams in the first place. The preceding chapter showed how to create an observable sequence, so now we will look at how to exploit the power this has unlocked using the the various Rx methods that can process and transform an observable sequence. 
+
+Rx supports most of the standard LINQ operators. It also defines numerous additional operators. These fall broadly into categories, and each of the following chapters tackles one category:
+
+* [Filtering](05_Filtering.md)
+* [Transformation](06_Transformation.md)
+* [Aggregation](07_Aggregation.md)
+* [Partitioning](08_Partitioning.md)
+* [Combination](09_CombiningSequences.md)

+ 428 - 505
Rx.NET/Documentation/IntroToRx/05_Filtering.md

@@ -1,505 +1,428 @@
----
-title : Reducing a sequence
----
-
-#Reducing a sequence				{#Reduction}
-
-We live in the information age. 
-Data is being created, stored and distributed at a phenomenal rate. 
-Consuming this data can be overwhelming, like trying to drink directly from the fire hose. 
-We need the ability to pick out the data we need, choose what is and is not relevant, and roll up groups of data to make it relevant. 
-Users, customers and managers need you do this with more data than ever before, while still delivering higher performance and tighter deadlines.
-
-Given that we know how to create an observable sequence, we will now look at the various methods that can reduce an observable sequence. 
-We can categorize operators that reduce a sequence to the following:
-
-<dl>
-	<dt>Filter and partition operators</dt>
-	<dd>
-		Reduce the source sequence to a sequence with at most the same number of elements</dd>
-	<dt>Aggregation operators</dt>
-	<dd>
-		Reduce the source sequence to a sequence with a single element</dd>
-	<dt>Fold operators</dt>
-	<dd>
-		Reduce the source sequence to a single element as a scalar value</dd>
-</dl>
-
-We discovered that the creation of an observable sequence from a scalar value is defined as _anamorphism_ or described as an _'unfold'_. 
-We can think of the anamorphism from `T` to `IObservable<T>` as an 'unfold'.
-This could also be referred to as "entering the monad" where in this case (and for most cases in this book) the monad is `IObservable<T>`. 
-What we will now start looking at are methods that eventually get us to the inverse which is defined as _catamorphism_ or a `fold`. 
-Other popular names for fold are 'reduce', 'accumulate' and 'inject'.
-
-##Where								{#Where}    
-Applying a filter to a sequence is an extremely common exercise and the most common filter is the `Where` clause. 
-In Rx you can apply a where clause with the `Where` extension method. 
-For those that are unfamiliar, the signature of the `Where` method is as follows:
-
-
-	IObservable<T> Where(this IObservable<T> source, Fun<T, bool> predicate)
-
-Note that both the source parameter and the return type are the same. 
-This allows for a fluent interface, which is used heavily throughout Rx and other LINQ code.
-In this example we will use the `Where` to filter out all even values produced from a `Range` sequence.
-
-	var oddNumbers = Observable.Range(0, 10)
-		.Where(i => i % 2 == 0)
-		.Subscribe(
-			Console.WriteLine, 
-			() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">2</div>
-	<div class="line">4</div>
-	<div class="line">6</div>
-	<div class="line">8</div>
-	<div class="line">Completed</div>
-</div>
-
-The `Where` operator is one of the many standard LINQ operators. 
-This and other LINQ operators are common use in the various implementations of query operators, most notably the `IEnumerable<T>` implementation. 
-In most cases the operators behave just as they do in the `IEnumerable<T>` implementations, but there are some exceptions. 
-We will discuss each implementation and explain any variation as we go. 
-By implementing these common operators Rx also gets language support for free via C# query comprehension syntax. 
-For the examples in this book however, we will keep with using extension methods for consistency.
-
-##Distinct and DistinctUntilChanged	{#Distinct}
-As I am sure most readers are familiar with the `Where` extension method for `IEnumerable<T>`, some will also know the `Distinct` method.
-In Rx, the `Distinct` method has been made available for observable sequences too. 
-For those that are unfamiliar with `Distinct`, and as a recap for those that are, `Distinct` will only pass on values from the source that it has not seen before.
-
-	var subject = new Subject<int>();
-	var distinct = subject.Distinct();
-		
-	subject.Subscribe(
-		i => Console.WriteLine("{0}", i),
-		() => Console.WriteLine("subject.OnCompleted()"));
-	distinct.Subscribe(
-		i => Console.WriteLine("distinct.OnNext({0})", i),
-		() => Console.WriteLine("distinct.OnCompleted()"));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	subject.OnNext(1);
-	subject.OnNext(1);
-	subject.OnNext(4);
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">distinct.OnNext(1)</div>
-	<div class="line">2</div>
-	<div class="line">distinct.OnNext(2)</div>
-	<div class="line">3</div>
-	<div class="line">distinct.OnNext(3)</div>
-	<div class="line">1</div>
-	<div class="line">1</div>
-	<div class="line">4</div>
-	<div class="line">distinct.OnNext(4)</div>
-	<div class="line">subject.OnCompleted()</div>
-	<div class="line">distinct.OnCompleted()</div>
-</div>
-
-Take special note that the value 1 is pushed 3 times but only passed through the first time.
-There are overloads to `Distinct` that allow you to specialize the way an item is determined to be distinct or not. 
-One way is to provide a function that returns a different value to use for comparison. 
-Here we look at an example that uses a property from a custom class to define if a value is distinct.
-
-	public class Account
-	{
-		public int AccountId { get; set; }
-		//... etc
-	}
-	public void Distinct_with_KeySelector()
-	{
-		var subject = new Subject<Account>();
-		var distinct = subject.Distinct(acc => acc.AccountId);
-	}
-
-In addition to the `keySelector` function that can be provided, there is an overload that takes an `IEqualityComparer<T>` instance. 
-This is useful if you have a custom implementation that you can reuse to compare instances of your type `T`. 
-Lastly there is an overload that takes a `keySelector` and an instance of `IEqualityComparer<TKey>`. 
-Note that the equality comparer in this case is aimed at the selected key type (`TKey`), not the type `T`.
-
-A variation of `Distinct`, that is peculiar to Rx, is `DistinctUntilChanged`.
-This method will surface values only if they are different from the previous value.
-Reusing our first `Distinct` example, note the change in output.
-
-	var subject = new Subject<int>();
-	var distinct = subject.DistinctUntilChanged();
-		
-	subject.Subscribe(
-		i => Console.WriteLine("{0}", i),
-		() => Console.WriteLine("subject.OnCompleted()"));
-	distinct.Subscribe(
-		i => Console.WriteLine("distinct.OnNext({0})", i),
-		() => Console.WriteLine("distinct.OnCompleted()"));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	subject.OnNext(1);
-	subject.OnNext(1);
-	subject.OnNext(4);
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">distinct.OnNext(1)</div>
-	<div class="line">2</div>
-	<div class="line">distinct.OnNext(2)</div>
-	<div class="line">3</div>
-	<div class="line">distinct.OnNext(3)</div>
-	<div class="line">1</div>
-	<div class="line">distinct.OnNext(1)</div>
-	<div class="line">1</div>
-	<div class="line">4</div>
-	<div class="line">distinct.OnNext(4)</div>
-	<div class="line">subject.OnCompleted()</div>
-	<div class="line">distinct.OnCompleted()</div>
-</div>
-
-The difference between the two examples is that the value 1 is pushed twice. 
-However the third time that the source pushes the value 1, it is immediately after the second time value 1 is pushed. 
-In this case it is ignored. 
-Teams I have worked with have found this method to be extremely useful in reducing any noise that a sequence may provide.
-
-##IgnoreElements					{#IgnoreElements}
-
-The `IgnoreElements` extension method is a quirky little tool that allows you to receive the `OnCompleted` or `OnError` notifications. 
-We could effectively recreate it by using a `Where` method with a predicate that always returns false.
-
-	var subject = new Subject<int>();
-	
-	//Could use subject.Where(_=>false);
-	var noElements = subject.IgnoreElements();
-	subject.Subscribe(
-		i=>Console.WriteLine("subject.OnNext({0})", i),
-		() => Console.WriteLine("subject.OnCompleted()"));
-	noElements.Subscribe(
-		i=>Console.WriteLine("noElements.OnNext({0})", i),
-		() => Console.WriteLine("noElements.OnCompleted()"));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">subject.OnNext(1)</div>
-	<div class="line">subject.OnNext(2)</div>
-	<div class="line">subject.OnNext(3)</div>
-	<div class="line">subject.OnCompleted()</div>
-	<div class="line">noElements.OnCompleted()</div>
-</div>
-
-As suggested earlier we could use a `Where` to produce the same result
-
-	subject.IgnoreElements();
-	//Equivalent to 
-	subject.Where(value=>false);
-	//Or functional style that implies that the value is ignored.
-	subject.Where(_=>false);
-
-Just before we leave `Where` and `IgnoreElements`, I wanted to just quickly look at the last line of code. 
-Until recently, I personally was not aware that '`_`' was a valid variable name; however it is commonly used by functional programmers to indicate an ignored parameter. 
-This is perfect for the above example; for each value we receive, we ignore it and always return false.
-The intention is to improve the readability of the code via convention.
-
-##Skip and Take						{#SkipAndTake}
-
-The other key methods to filtering are so similar I think we can look at them as one big group. 
-First we will look at `Skip` and `Take`. 
-These act just like they do for the `IEnumerable<T>` implementations. 
-These are the most simple and probably the most used of the Skip/Take methods. 
-Both methods just have the one parameter; the number of values to skip or to take.
-
-If we first look at `Skip`, in this example we have a range sequence of 10 items and we apply a `Skip(3)` to it.
-
-	Observable.Range(0, 10)
-		.Skip(3)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">5</div>
-	<div class="line">6</div>
-	<div class="line">7</div>
-	<div class="line">8</div>
-	<div class="line">9</div>
-	<div class="line">Completed</div>
-</div>
-
-Note the first three values (0, 1 &amp; 2) were all ignored from the output. 
-Alternatively, if we used `Take(3)` we would get the opposite result; i.e. we would only get the first 3 values and then the Take operator would complete the sequence.
-
-	Observable.Range(0, 10)
-		.Take(3)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">Completed</div>
-</div>
-
-Just in case that slipped past any readers, it is the `Take` operator that completes once it has received its count. 
-We can prove this by applying it to an infinite sequence.
-
-	Observable.Interval(TimeSpan.FromMilliseconds(100))
-		.Take(3)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">Completed</div>
-</div>
-
-###SkipWhile and TakeWhile			{#SkipWhileTakeWhile}
-
-The next set of methods allows you to skip or take values from a sequence while a predicate evaluates to true. 
-For a `SkipWhile` operation this will filter out all values until a value fails the predicate, then the remaining sequence can be returned.
-
-	var subject = new Subject<int>();
-	subject
-		.SkipWhile(i => i < 4)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	subject.OnNext(4);
-	subject.OnNext(3);
-	subject.OnNext(2);
-	subject.OnNext(1);
-	subject.OnNext(0);
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">4</div>
-	<div class="line">3</div>
-	<div class="line">2</div>
-	<div class="line">1</div>
-	<div class="line">0</div>
-	<div class="line">Completed</div>
-</div>
-
-`TakeWhile` will return all values while the predicate passes, and when the first value fails the sequence will complete.
-
-	var subject = new Subject<int>();
-	subject
-		.TakeWhile(i => i < 4)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	subject.OnNext(4);
-	subject.OnNext(3);
-	subject.OnNext(2);
-	subject.OnNext(1);
-	subject.OnNext(0);
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">Completed</div>
-</div>
-
-###SkipLast and TakeLast			{#SkipLastTakeLast}
-
-These methods become quite self explanatory now that we understand Skip/Take and SkipWhile/TakeWhile. 
-Both methods require a number of elements at the end of a sequence to either skip or take. 
-The implementation of the `SkipLast` could cache all values, wait for the source sequence to complete, and then replay all the values except for the last number of elements. 
-The Rx team however, has been a bit smarter than that. 
-The real implementation will queue the specified number of notifications and once the queue size exceeds the value, it can be sure that it may drain a value from the queue.
-
-	var subject = new Subject<int>();
-	subject
-		.SkipLast(2)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-	Console.WriteLine("Pushing 1");
-	subject.OnNext(1);
-	Console.WriteLine("Pushing 2");
-	subject.OnNext(2);
-	Console.WriteLine("Pushing 3");
-	subject.OnNext(3);
-	Console.WriteLine("Pushing 4");
-	subject.OnNext(4);
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">Pushing 1</div>
-	<div class="line">Pushing 2</div>
-	<div class="line">Pushing 3</div>
-	<div class="line">1</div>
-	<div class="line">Pushing 4</div>
-	<div class="line">2</div>
-	<div class="line">Completed</div>
-</div>
-
-Unlike `SkipLast`, `TakeLast` does have to wait for the source sequence to complete to be able to push its results.
-As per the example above, there are `Console.WriteLine` calls to indicate what the program is doing at each stage.
-
-	var subject = new Subject<int>();
-	subject
-		.TakeLast(2)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-	Console.WriteLine("Pushing 1");
-	subject.OnNext(1);
-	Console.WriteLine("Pushing 2");
-	subject.OnNext(2);
-	Console.WriteLine("Pushing 3");
-	subject.OnNext(3);
-	Console.WriteLine("Pushing 4");
-	subject.OnNext(4);
-	Console.WriteLine("Completing");
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">Pushing 1</div>
-	<div class="line">Pushing 2</div>
-	<div class="line">Pushing 3</div>
-	<div class="line">Pushing 4</div>
-	<div class="line">Completing</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">Completed</div>
-</div>
-
-###SkipUntil and TakeUntil			{#SkipUntilTakeUntil}
-
-Our last two methods make an exciting change to the methods we have previously looked.
-These will be the first two methods that we have discovered together that require two observable sequences.
-
-`SkipUntil` will skip all values until any value is produced by a secondary observable sequence.
-
-	var subject = new Subject<int>();
-	var otherSubject = new Subject<Unit>();
-	subject
-		.SkipUntil(otherSubject)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	otherSubject.OnNext(Unit.Default);
-	subject.OnNext(4);
-	subject.OnNext(5);
-	subject.OnNext(6);
-	subject.OnNext(7);
-	subject.OnNext(8);
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">4</div>
-	<div class="line">5</div>
-	<div class="line">6</div>
-	<div class="line">7</div>
-	<div class="line">Completed</div>
-</div>
-
-Obviously, the converse is true for `TakeWhile`. 
-When the secondary sequence produces a value, then the `TakeWhile` operator will complete the output sequence.
-
-	var subject = new Subject<int>();
-	var otherSubject = new Subject<Unit>();
-	subject
-		.TakeUntil(otherSubject)
-		.Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-	otherSubject.OnNext(Unit.Default);
-	subject.OnNext(4);
-	subject.OnNext(5);
-	subject.OnNext(6);
-	subject.OnNext(7);
-	subject.OnNext(8);
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">Completed</div>
-</div>
-
-That was our quick run through of the filtering methods available in Rx. 
-While they are pretty simple, as we will see, the power in Rx is down to the composability of its operators.
-
-These operators provide a good introduction to the filtering in Rx. 
-The filter operators are your first stop for managing the potential deluge of data we can face in the information age. 
-We now know how to remove unmatched data, duplicate data or excess data. 
-Next, we will move on to the other two sub classifications of the reduction operators, inspection and aggregation.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>
+# Filtering
+
+Rx provides us with tools to take potentially vast quantities of events and process these to produce higher level insights. This can often involve a reduction in volume. A small number of events may be more useful than a large number if the individual events in that lower-volume stream are, on average, more informative. The simplest mechanisms for achieving this involve simply filtering out events we don't want. Rx defines several operators that can do this.
+
+Just before we move on to introducing the new operators, we will quickly define an extension method to help illuminate several of the examples. This `Dump` extension method subscribes to any `IObservable<T>` with handlers that display messages for each notification the source produces. This method takes a `name` argument, which will be shown as part of each message, enabling us to see where events came from in examples that subscribe to more than one source.
+
+```csharp
+public static class SampleExtensions
+{
+    public static void Dump<T>(this IObservable<T> source, string name)
+    {
+        source.Subscribe(
+            value =>Console.WriteLine($"{name}-->{value}"), 
+            ex => Console.WriteLine($"{name} failed-->{ex.Message}"),
+            () => Console.WriteLine($"{name} completed"));
+    }
+}
+```
+
+## Where
+
+Applying a filter to a sequence is an extremely common exercise and the most straightforward filter in LINQ is the `Where` operator. As usual with LINQ, Rx provides its operators in the form of extension methods. If you are already familiar with LINQ, the signature of Rx's `Where` method will come as no surprise:
+
+```csharp
+IObservable<T> Where<T>(this IObservable<T> source, Func<T, bool> predicate)
+```
+
+Note that the element type is the same for the `source` parameter as it is for the return type. This is because `Where` doesn't modify elements. It can filter some out, but those that it does not remove are passed through unaltered.
+
+This example uses `Where` to filter out all odd values produced from a `Range` sequence, meaning only even numbers will emerge.
+
+```csharp
+IObservable<int> xs = Observable.Range(0, 10); // The numbers 0-9
+IObservable<int> evenNumbers = xs.Where(i => i % 2 == 0);
+
+evenNumbers.Dump("Where");
+```
+
+Output:
+
+```
+Where-->0
+Where-->2
+Where-->4
+Where-->6
+Where-->8
+Where completed
+```
+
+The `Where` operator is one of the many standard LINQ operators you'll find on all LINQ providers. LINQ to Objects, the `IEnumerable<T>` implementation, provides an equivalent method, for example. In most cases, Rx's operators behave just as they do in the `IEnumerable<T>` implementations, although there are some exceptions as we'll see later. We will discuss each implementation and explain any variation as we go. By implementing these common operators Rx also gets language support for free via C# query expression syntax. For example, we could have written the first statement this way, and it would have compiled to effectively identical code:
+
+```csharp
+IObservable<int> evenNumbers =
+    from i in xs
+    where i % 2 == 0
+    select i;
+```
+
+The examples in this book mostly use extension methods, not query expressions, partly because Rx implements some operators for which there is no corresponding query syntax, and partly because the method call approach can sometimes make it easier to see what is happening.
+
+As with most Rx operators, `Where` does not subscribe immediately to its source. (Rx LINQ operators are much like those in LINQ to Objects: the `IEnumerable<T>` version of `Where` returns without attempting to enumerate its source. It's only when something attempts to enumerate the `IEnumerable<T>` that `Where` returns that it will in turn start enumerating the source.) Only when something calls `Subscribe` on the `IObservable<T>` returned by `Where` will it call `Subscribe` on its source. And it will do so once for each such call to `Subscribe`. More generally, when you chain LINQ operators together, each `Subscribe` call on the resulting `IObservable<T>` results in a cascading series of calls to `Subscribe` all the way down the chain.
+
+A side effect of this cascading `Subscribe` is that `Where` (like most other LINQ operators) is neither inherently _hot_ or _cold_: since it just subscribes to its source, then it will be hot if its source is hot, and cold if its source is cold.
+
+The `Where` operator passes on all elements for which its `predicate` callback returns `true`. To be more precise, when you subscript to `Where`, it will create its own `IObserver<T>` which it passes as the argument to `source.Subscribe`, and this observer invokes the `predicate` for each call to `OnNext`. If that predicate returns `true`, then and only then will the observer created by `Where` call `OnNext` on the observer that you passed to `Where`.
+
+`Where` always passes the final call to either `OnComplete` or `OnError` through. That means that if you were to write this:
+
+```csharp
+IObservable<int> dropEverything = xs.Where(_ => false);
+```
+
+then although this would filter out all elements (because the predicate ignores its argument and always returns `false`, instructing `Where` to drop everything), this won't filter out an error or completion.
+
+In fact if that's what you want—an operator that drops all the elements and just tells you when a source completes or fails—there's a simpler way.
+
+## IgnoreElements
+
+The `IgnoreElements` extension method allows you to receive just the `OnCompleted` or `OnError` notifications. It is equivalent to using the `Where` operator with a predicate that always returns `false`, as this example illustrates:
+
+```csharp
+IObservable<int> xs = Observable.Range(1, 3);
+IObservable<int> dropEverything = xs.IgnoreElements();
+
+xs.Dump("Unfiltered");
+dropEverything.Dump("IgnoreElements");
+```
+
+As the output shows, the `xs` source produces the numbers 1 to 3 then completes, but if we run that through `IgnoreElements`, all we see is the `OnCompleted`.
+
+```
+Unfiltered-->1
+Unfiltered-->2
+Unfiltered-->3
+Unfiltered completed
+IgnoreElements completed
+```
+
+## OfType
+
+Some observable sequences produce items of various types. For example, consider an application that wants to keep track of ships as they move. This is possible with an AIS receiver. AIS is the Automatic Identification System, which most ocean-going ships use to report their location, heading, speed, and other information. There are numerous kinds of AIS message. Some report a ship's location and speed, but its name is reported in a different kind of message. (This is because most ships move more often than they change their names, so they broadcast these two types of information at quite different intervals.)
+
+Imagine how this might look in Rx. Actually you don't have to imagine it. The open source [Ais.Net project](https://github.com/ais-dotnet) includes a [`ReceiverHost` class](https://github.com/ais-dotnet/Ais.Net.Receiver/blob/15de7b2908c3bd67cf421545578cfca59b24ed2c/Solutions/Ais.Net.Receiver/Ais/Net/Receiver/Receiver/ReceiverHost.cs) that makes AIS messages available through Rx. The `ReceiverHost` defines a `Messages` property of type `IObservable<IAisMessage>`. Since AIS defines numerous message types, this observable source can produce many different kinds of objects. Everything it emits will implement the [`IAisMessage` interface](https://github.com/ais-dotnet/Ais.Net.Receiver/blob/15de7b2908c3bd67cf421545578cfca59b24ed2c/Solutions/Ais.Net.Models/Ais/Net/Models/Abstractions/IAisMessage.cs), which reports the ship's unique identifier, but not much else. But the [`Ais.Net.Models` library](https://www.nuget.org/packages/Ais.Net.Models/) defines numerous other interfaces, including [`IVesselNavigation`](https://github.com/ais-dotnet/Ais.Net.Receiver/blob/15de7b2908c3bd67cf421545578cfca59b24ed2c/Solutions/Ais.Net.Models/Ais/Net/Models/Abstractions/IVesselNavigation.cs), which reports location, speed, and heading, and [`IVesselName`](https://github.com/ais-dotnet/Ais.Net.Receiver/blob/15de7b2908c3bd67cf421545578cfca59b24ed2c/Solutions/Ais.Net.Models/Ais/Net/Models/Abstractions/IVesselName.cs), which tells you the vessel's name.
+
+Suppose you are interested only in the locations of vessels in the water, and you don't care about the vessels' names. You will want to see all messages that implement the `IVesselNavigation` interface, and to ignore all those that don't. You could try to achieve this with the `Where` operator:
+
+```csharp
+// Won't compile!
+IObservable<IVesselNavigation> vesselMovements = 
+   receiverHost.Messages.Where(m => m is IVesselNavigation);
+```
+
+However, that won't compile. You will get this error:
+
+```
+Cannot implicitly convert type 
+'System.IObservable<Ais.Net.Models.Abstractions.IAisMessage>' 
+to 
+'System.IObservable<Ais.Net.Models.Abstractions.IVesselNavigation>'
+```
+
+Remember that the return type of `Where` is always the same as its input. Since `receiverHost.Messages` is of type `IObservable<IAisMessage>`, that's is also the type that `Where` will return. It so happens that our predicate ensures that only those messages that implement `IVesselNavigation` make it through, but there's no way for the C# compiler to understand the relationship between the predicate and the output. (For all it knows, `Where` might do the exact opposite, including only those elements for which the predicate returns `false`. In fact the compiler can't guess anything about how `Where` might use its predicate.)
+
+Fortunately, Rx provides an operator specialized for this case. `OfType` filters items down to just those that are of a particular type. Items must be either the exact type specified, or inherit from it, or, if it's an interface, they must implement it. This enables us to fix the last example:
+
+```csharp
+IObservable<IVesselNavigation> vesselMovements = 
+   receiverHost.Messages.OfType<IVesselNavigation>();
+```
+
+## Positional Filtering
+
+Sometimes, we don't care about what an element is, so much as where it is in the sequence. Rx defines a few operators that can help us with this.
+
+### FirstAsync and FirstOrDefaultAsync
+
+LINQ providers typically implement a `First` operator that provides the first element of a sequence. Rx is no exception, but the nature of Rx means we typically need this to work slightly differently. With providers for data at rest (such as LINQ to Objects or Entity Framework Core) the source elements already exist, so retrieving the first item is just a matter of reading it. But with Rx, sources produce data when they choose, so there's no way of knowing when the first item will become available.
+
+So with Rx, we typically use `FirstAsync`. This returns an `IObservable<T>` that will produce the first value that emerges from the source sequence and will then complete. (Rx does also offer a more conventional `First` method, but it can be problematic. See the [**Blocking Versions of First/Last/Single[OrDefault]** section later](#blocking-versions-of-firstlastsingleordefault) for details.)
+
+For example, this code uses the AIS.NET source introduced earlier to report the first time a particular boat (the aptly named HMS Example, as it happens) reports that it is moving:
+
+```csharp
+uint exampleMmsi = 235009890;
+IObservable<IVesselNavigation> moving = 
+   receiverHost.Messages
+    .Where(v => v.Mmsi == exampleMmsi)
+    .OfType<IVesselNavigation>()
+    .Where(vn => vn.SpeedOverGround > 1f)
+    .FirstAsync();
+```
+
+As well as using `FirstAsync`, this also uses a couple of the other filter elements already described. It starts with a [`Where`](#where) step that filters messages down to those from the one boat we happen to be interested in. (Specifically, we filter based on that boat's [Maritime Mobile Service Identity, or MMSI](https://en.wikipedia.org/wiki/Maritime_Mobile_Service_Identity).) Then we use [`OfType`](#oftype) so that we are looking only at those messages that report how/whether the vessel is moving. Then we use another `Where` clause so that we can ignore messages indicating that the boat is not actually moving, finally, we use `FirstAsync` so that we get only the first message indicating movement. As soon as the boat moves, this `moving` source will emit a single `IVesselNavigation` event and will then immediately complete.
+
+We can simplify that query slightly, because `FirstAsync` optionally takes a predicate. This enables us to collapse the final `Where` and `FirstAsync` into a single operator:
+
+```csharp
+IObservable<IVesselNavigation> moving = 
+   receiverHost.Messages
+    .Where(v => v.Mmsi == exampleMmsi)
+    .OfType<IVesselNavigation>()
+    .FirstAsync(vn => vn.SpeedOverGround > 1f);
+```
+
+What if the input to `FirstAsync` is empty? If its completes without ever producing an item, `FirstAsync` invokes its subscriber's `OnError`, passing an `InvalidOperationException` with an error message reporting that the sequence contains no elements. The same is true if we're using the form that takes a predicate (as in this second example), and no elements matching the predicate emerged. This is consistent with the LINQ to Objects `First` operator. (Note that we wouldn't expect this to happen with the examples just shown, because the source will continue to report AIS messages for as long as the application is running, meaning there's no reason for it ever to complete.)
+
+Sometimes, we might want to tolerate this kind of absence of events. Most LINQ providers offer not just `First` but `FirstOrDefault`. We can use this by modify the preceding example. This uses the [`TakeUntil` operator](#skipuntil-and-takeuntil) to introduce a cut-off time: this example is prepared to wait for 5 minutes, but gives up after that. (So although the AIS receiver can produce messages endlessly, this example has decided it won't wait forever.) And since that means we might complete without ever seeing the boat move, we've replaced `FirstAsync` with `FirstOrDefaultAsync`:
+
+```csharp
+IObservable<IVesselNavigation?> moving = 
+   receiverHost.Messages
+    .Where(v => v.Mmsi == exampleMmsi)
+    .OfType<IVesselNavigation>()
+    .TakeUntil(DateTimeOffset.Now.AddMinutes(5))
+    .FirstOrDefaultAsync(vn => vn.SpeedOverGround > 1f);
+```
+
+If, after 5 minutes, we've not seen a message from the boat indicating that it's moving at 1 knot or faster, `TakeUntil` will unsubscribe from its upstream source and will call `OnCompleted` on the observer supplied by `FirstOrDefaultAsync`. Whereas `FirstAsync` would treat this as an error, `FirstOrDefaultAsync` will produce the default value for its element type (`IVesselNavigation` in this case; the default value for an interface type is `null`), pass that to its subscriber's `OnNext`, and then call `OnCompleted`.
+
+In short, this `moving` observable will always produce exactly one item. Either it will produce an `IVesselNavigation` indicating that the boat has moved, or it will produce `null` to indicate that this didn't happen in the 5 minutes that this code has allowed.
+
+This production of a `null` might be an OK way to indicate that something didn't happen, but there's something slightly clunky about it: anything consuming this `moving` source now has to work out whether a notification signifies the event of interest, or the absence of any such event. If that happens to be convenient for your code, then great, but Rx provides a more direct way to represent the absence of an event: an empty sequence.
+
+You could imagine a _first or empty_ operator that worked this way. This wouldn't make sense for LINQ providers that return an actual value. For example, as LINQ to Objects' `First` returns `T`, not `IEnumerable<T>`, so there's no way for it to return an empty sequence. But because Rx's offers `First`-like operators that return `IObservable<T>`, it would be technically possible to have an operator that returns either the first item or no items at all. There is no such operator built into Rx, but we can get exactly the same effect by using a more generalised operator, `Take`.
+
+### Take
+
+`Take` is a standard LINQ operator that takes the first few items from a sequence and then discards the rest.
+
+In a sense, `Take` is a generalization of `First`: `Take(1)` returns only the first item, so you could think of LINQ's `First` as being a special case of `Take`. That's not strictly correct because these operators respond differently to missing elements: as we've just seen, `First` (and Rx's `FirstAsync`) insists on receiving at least one element, producing an `InvalidOperationException` if you supply it with an empty sequence. Even the more existentially relaxed `FirstOrDefault` still insists on producing something. `Take` works slightly differently.
+
+If the input to `Take` completes before producing as many elements as have been specified, `Take` does not complain—it just forwards whatever the source has provided. If the source did nothing other than call `OnCompleted`, then `Take` just calls `OnCompleted` on its observer. If we used `Take(5)`, but the source produced three items and then completed, `Take(5)` will forward those three items to its subscriber, and will then complete. This means we could use `Take` to implement the hypothetical `FirstOrEmpty` discussed in the preceding section:
+
+```csharp
+public static IObservable<T> FirstOrEmpty<T>(this IObservable<T> src) => src.Take(1);
+```
+
+Now would be a good time to remind you that most Rx operators (and all the ones in this chapter) are not intrinsically either hot or cold. They defer to their source. Given some hot `source`, `source.Take(1)` is also hot. The AIS.NET `receiverHost.Messages` source I've been using in these examples is hot (because it reports live message broadcasts from ships), so observable sequences derived from it are also hot. Why is now a good time to discuss this? Because it enables me to make the following absolutely dreadful pun:
+
+```csharp
+IObservable<IAisMessage> hotTake = receiverHost.Messages.Take(1);
+```
+
+Thank you. I'm here all week.
+
+The `FirstAsync` and `Take` operators work from the start of the sequence. What if we're interested only in the tail end?
+
+### LastAsync, LastOrDefaultAsync, and PublishLast
+
+LINQ providers typically provide `Last` and `LastOrDefault`. These do almost exactly the same thing as `First` or `FirstOrDefault` except, as the name suggests, they return the final element instead of the first one. As with `First`, the nature of Rx means that unlike with LINQ providers working with data at rest, the final element might not be just sitting there waiting to be fetched. So just as Rx offers `FirstAsync` and `FirstOrDefault`, it offers `LastAsync` and `LastOrDefaultAsync`. (It does also offer `Last`, but again, as the [Blocking Versions of First/Last/Single[OrDefault]](#blocking-versions-of-firstlastsingleordefault) section discusses, this can be problematic.)
+
+There is also [`PublishLast`](15_PublishingOperators.md#publishlast). This has similar semantics to `LastAsync` but it handles multiple subscriptions differently. Each time you subscribe to the `IObservable<T>` that `LastAsync` returns, it will subscribe to the underlying source, but `PublishLast` makes only a single `Subscribe` call to the underlying source. (To provide control over exactly when this happens, `PublishLast` returns an `IConnectableObservable<T>`. As the [Hot and Cold Sources section of chapter 2](02_KeyTypes.md#hot-and-cold-sources) described, this provides a `Connect` method, and the connectable observable returned by `PublishLast` subscribes to its underlying source when you call this.) Once this single subscription receives an `OnComplete` notification from the source, it will deliver the final value to all subscribers. (It also remembers the final value, so if any new observers subscribe after the final value has been produced, they will immediately receive that value when they subscribe.) The final value is immediately followed by an `OnCompleted` notification. This is one of a family of operators based on the [`Multicast`](15_PublishingOperators.md#multicast) operator described in more detail in later chapters.
+
+The distinction between `LastAsync` and `LastOrDefaultAsync` is the same as with `FirstAsync` and `FirstOrDefaultAsync`. If the source completes having produced nothing, `LastAsync` reports an error, whereas `LastOrDefaultAsync` emits the default value for its element type and then completes. `PublishLast` handles an empty source differently again: if the source completes without producing any elements, the observable returned by `PublishLast` will do the same: it produces neither an error nor a default value in this scenario.
+
+Reporting the final element of a sequence entails a challenge that `First` does not face. It's very easy to know when you've received the first element from a source: if the source produces an element, and it hasn't previously produced an element, then that's the first element right there. This means that operators such as `FirstAsync` can report the first element immediately. But `LastAsync` and `LastOrDefaultAsync` don't have that luxury.
+
+If you receive an element from a source, how do you know that it is the last element? In general, you can't know this at the instant that you receive it. You will only know that you have received the last element when the source goes on to invoke your `OnCompleted` method. This won't necessarily happen immediately. An earlier example used `TakeUntil(DateTimeOffset.Now.AddMinutes(5))` to bring a sequence to an end after 5 minutes, and if you do that, it's entirely possible that a significant amount of time might elapse between the final element being emitted, and `TakeUntil` shutting things down. In the AIS scenario, boats might only emit messages once every few minutes, so it's quite plausible that we could end up with `TakeUntil` forwarding a message, and then discovering a few minutes later that the cutoff time has been reached without any further messages coming in. Several minutes could have elapsed between the final `OnNext` and the `OnComplete`.
+
+Because of this. `LastAsync` and `LastOrDefaultAsync` emit nothing at all until their source completes. **This has an important consequence:** there might be a significant delay between `LastAsync` receiving the final element from the source, and it forwarding that element to its subscriber.
+
+### TakeLast
+
+Earlier we saw that Rx implements the standard `Take` operator, which forwards up to a specified number of elements from the start of a sequence and then stops. `TakeLast` forwards the elements at the end of a sequence. For example, `TakeLast(3)` asks for the final 3 elements of the source sequence. As with `Take`, `TakeLast` is tolerant of sources that produce too few items. If a source produces fewer than 3 items, `TaskLast(3)` will just forward the entire sequence.
+
+`TakeLast` faces the same challenge as `Last`: it doesn't know when it is near the end of the sequence. It therefore has to hold onto copies of the most recently seen values. It needs memory to hold onto however many values you've specified. If you write `TakeLast(1_000_000)`, it will need to allocate a buffer large enough to store 1,000,000 values. It doesn't know if the first element it receives will be one of the final million. It can't know that until either the source completes, or the source has emitted more than 1,000,000 items. When the source finally does complete, `TakeLast` will now know what the final million elements were and will need to pass all of them to its subscriber's `OnNext` method one after another.
+
+### Skip and SkipLast
+
+What if we want the exact opposite of the `Take` or `TakeLast` operators? Instead of taking the first 5 items from a source, maybe I want to discard the first 5 items instead? Perhaps I have some `IObservable<float>` taking readings from a sensor, and I have discovered that the sensor produces garbage values for its first few readings, so I'd like to ignore those, and only start listening once it has settled down. I can achieve this with `Skip(5)`.
+
+`SkipLast` does the same thing at the end of the sequence: it omits the specified number of elements at the tail end. As with some of the other operators we've just been looking at, this has to deal with the problem that it can't tell when it's near the end of the sequence. It only gets to discover which were the last (say) 4 elements after the source has emitted all of them, followed by an `OnComplete`. So `SkipLast` will introduce a delay. If you use `SkipLast(4)`, it won't forward the first element that the source produces until the source produces a 5th element. So it doesn't need to wait for `OnCompleted` or `OnError` before it can start doing things, it just has to wait until its certain that an element is not one of the ones we want to discard.
+
+The other key methods to filtering are so similar I think we can look at them as one big group. First we will look at `Skip` and `Take`. These act just like they do for the `IEnumerable<T>` implementations. These are the most simple and probably the most used of the Skip/Take methods. Both methods just have the one parameter; the number of values to skip or to take.
+
+### SingleAsync and SingleOrDefaultAsync
+
+LINQ operators typically provide a `Single` operator, for use when a source should provide exactly one item, and it would be an error for it to contain more, or for it to be empty. The same Rx considerations apply here as for `First` and `Last`, so you will probably be unsurprised to learn that Rx offers a `SingleAsync` method that returns an `IObservable<T>` that will either call its observer's `OnNext` exactly once, or will call its `OnError` to indicate either that the source reported an error, or that the source did not produce exactly one item.
+
+With `SingleAsync`, you will get an error if the source is empty, just like with `FirstAsync` and `LastAsync`, but you will also get an error if the source contains multiple items. There is a `SingleOrDefault` which, like its first/last counterparts, tolerates an empty input sequence, generating a single element with the element type's default value in that case.
+
+`Single` and `SingleAsync` share with `Last` and `LastAsync` the characteristic that they don't initially know when they receive an item from the source whether it should be the output. That may seem odd: since `Single` requires the source stream to provide just one item, surely it must know that the item it will deliver to its subscriber will be the first item it receives. This is true, but the thing it doesn't yet know when it receives the first item is whether the source is going to produce a second one. It can't forward the first item unless and until the source completes. We could say that `SingleAsync`'s job is to first verify that the source contains exactly one item, and then to forward that item if it does, but to report an error if it does not. In the error case, `SingleAsync` will know it has gone wrong if it ever receives a second item, so it can immediately call `OnError` on its subscriber at that point. But in the success scenario, it can't know that all is well until the source confirms that nothing more is coming by completing. Only then will `SingleAsync` emit the result.
+
+### Blocking Versions of First/Last/Single[OrDefault]
+
+Several of the operators described in the preceding sections end in the name `Async`. This is a little strange because normally, .NET methods that end in `Async` return a `Task` or `Task<T>`, and yet these all return an `IObservable<T>`. Also, as already discussed, each of these methods corresponds to a standard LINQ operator which does not generally end in `Async`. (And to further add to the confusion, some LINQ providers such as Entity Framework Core do include `Async` versions of some of these operators, but they are different. Unlike Rx, these do in fact return a `Task<T>`, so they still produce a single value, and not an `IQueryable<T>` or `IEnumerable<T>`.) This naming arises from an unfortunate choice early in Rx's design.
+
+If Rx were being designed from scratch today, the relevant operators in the preceding section would just have the normal names: `First`, and `FirstOrDefault`, and so on. The reason they all end with `Async` is that these were added in Rx 2.0, and Rx 1.0 had already defined operators with those names. This example uses the `First` operator:
+
+```csharp
+int v = Observable.Range(1, 10).First();
+Console.WriteLine(v);
+```
+
+This prints out the value `1`, which is the first item returned by `Range` here. But look at the type of that variable `v`. It's not an `IObservable<int>`, it's just an `int`. What would happen if we used this on an Rx operator that didn't immediately produce values upon subscription? Here's one example:
+
+```csharp
+long v = Observable.Timer(TimeSpan.FromSeconds(2)).First();
+Console.WriteLine(v);
+```
+
+If you run this, you'll find that the call to `First` doesn't return until a value is produced. It is a _blocking_ operator. We typically avoid blocking operators in Rx, because it's easy to create deadlocks with them. The whole point of Rx is that we can create code that reacts to events, so to just sit and wait until a specific observable source produces a value is not really in the spirit of things. If you find yourself wanting to do that, there are often better ways to achieve the results you're looking for. (Or perhaps Rx isn't good model for whatever you're doing.)
+
+If you really do need to wait for a value like this, it might be better to use the `Async` forms in conjunction with Rx's integrated support for C#'s `async`/`await`:
+
+```csharp
+long v = await Observable.Timer(TimeSpan.FromSeconds(2)).FirstAsync();
+Console.WriteLine(v);
+```
+
+This logically has the same effect, but because we're using `await`, this won't block the calling thread while it waits for the observable source to produce a value. This might reduce the chances of deadlock.
+
+The fact that we're able to use `await` makes some sense of the fact that these methods end with `Async`, but you might be wondering what's going on here. We've seen that these methods all return `IObservable<T>`, not `Task<T>`, so how are we able to use `await`? There's a [full explanation in the Leaving Rx's World chapter](13_LeavingIObservable.md#integration-with-async-and-await), but the short answer is that Rx provides extension methods that enable this to work. When you `await` an observable sequence, the `await` will complete once the source completes, and it will return the final value that emerges from the source. This works well for operators such as `FirstAsync` and `LastAsync` that produce exactly one item.
+
+Note that there are occasionally situations in which values are available immediately. For example, the [`BehaviourSubject<T>` section in chapter 3](03_CreatingObservableSequences.md#behaviorsubjectt), showed that the defining feature of `BehaviourSubject<T>` is that it always has a current value. That means that Rx's `First` method won't actually block—it will subscribe to the `BehaviourSubject<T>`, and `BehaviourSubject<T>.Subscribe` calls `OnNext` on its subscriber's observable before returning. That enables `First` to return a value immediately without blocking. (Of course, if you use the overload of `First` that accepts a predicate, and if the `BehaviourSubject<T>`'s value doesn't satisfy the predicate, `First` will then block.)
+
+### ElementAt
+
+There is yet another standard LINQ operator for selecting one particular element from the source: `ElementAt`. You provide this with a number indicating the position in the sequence of the element you require. In data-at-rest LINQ providers, this is logically equivalent to accessing an array element by index. Rx implements this operator, but whereas most LINQ providers' `ElementAt<T>` implementation returns a `T`, Rx's returns an `IObservable<T>`. Unlike with `First`, `Last`, and `Single`, Rx does not provide a blocking form of `ElementAt<T>`. But since you can await any `IObservable<T>`, you can always do this:
+
+```csharp
+IAisMessage fourth = await receiverHost.Message.ElementAt(4);
+```
+
+If your source sequence only produces five values and we ask for `ElementAt(5)`, the sequence that `ElementAt` returns will report an `ArgumentOutOfRangeException` error to its subscriber when the source completes. There are three ways we can deal with this:
+
+- Handle the OnError gracefully
+- Use `.Skip(5).Take(1);` This will ignore the first 5 values and the only take the 6th value. 
+If the sequence has less than 6 elements we just get an empty sequence, but no errors.
+- Use `ElementAtOrDefault`
+
+`ElementAtOrDefault` extension method will protect us in case the index is out of range, by pushing the `default(T)` value. Currently there is not an option to provide your own default value.
+
+## Temporal Filtering
+
+The `Take` and `TakeLast` operators let us filter out everything except elements either at the very start or very end (and `Skip` and `SkipLast` let us see everything but those), but these all require us to know the exact number of elements. What if we want to specify the cut-off not in terms of an element count, but in terms of a particular instant in time?
+
+In fact you've already seen one example: earlier I used `TakeUntil` to convert an endless `IObservable<T>` into one that would complete after five minutes. This is one of a family of operators.
+
+### SkipWhile and TakeWhile
+
+In the [`Skip` and `SkipLast` section](#skip-and-skiplast), I described a sensor that produces garbage values for its first few readings. This is quite common. For example, gas monitoring sensors often need to get some component up to a correct operating temperature before they can produce accurate readings. In the example in that section, I used `Skip(5)` to ignore the first few readings, but that is a crude solution. How do we know that 5 is enough? Or might it be ready sooner, in which case 5 is too few.
+
+What we really want to do is discard readings until we know the readings will be valid. And that's exactly the kind of scenario that `SkipWhile` can be useful for. Suppose we have a gas sensor that reports concentrations of some particular gas, but which also reports the temperature of the sensor plate that is performing the detection. Instead of hoping that 5 readings is a sensible number to skip, we could express the actual requirement:
+
+```csharp
+const int MinimumSensorTemperature = 74;
+IObservable<SensorReading> readings = sensor.RawReadings
+    .SkipUntil(r => r.SensorTemperature >= MinimumSensorTemperature);
+```
+
+This directly expresses the logic we require: this will discard readings until the device is up to its minimum operating temperature.
+
+The next set of methods allows you to skip or take values from a sequence while a predicate evaluates to true. For a `SkipWhile` operation this will filter out all values until a value fails the predicate, then the remaining sequence can be returned.
+
+```csharp
+var subject = new Subject<int>();
+subject
+    .SkipWhile(i => i < 4)
+    .Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
+subject.OnNext(1);
+subject.OnNext(2);
+subject.OnNext(3);
+subject.OnNext(4);
+subject.OnNext(3);
+subject.OnNext(2);
+subject.OnNext(1);
+subject.OnNext(0);
+
+subject.OnCompleted();
+```
+
+Output:
+
+```
+4
+3
+2
+1
+0
+Completed
+
+```
+
+`TakeWhile` will return all values while the predicate passes, and when the first value fails the sequence will complete.
+
+```csharp
+var subject = new Subject<int>();
+subject
+    .TakeWhile(i => i < 4)
+    .Subscribe(Console.WriteLine, () => Console.WriteLine("Completed"));
+subject.OnNext(1);
+subject.OnNext(2);
+subject.OnNext(3);
+subject.OnNext(4);
+subject.OnNext(3);
+subject.OnNext(2);
+subject.OnNext(1);
+subject.OnNext(0);
+
+subject.OnCompleted();
+```
+
+Output:
+
+```
+1
+2
+3
+Completed
+
+```
+
+### SkipUntil and TakeUntil
+
+In addition to `SkipWhile` and `TakeWhile`, Rx defines `SkipUntil` and `TakeUntil`. These may sound like nothing more than an alternate expression of the same idea: you might expect `SkipUntil` to do almost exactly the same thing as `SkipWhile`, with the only difference being that `SkipWhile` runs for as long as its predicate returns `true`, whereas `SkipUntil` runs for as long as its predicate returns `false`. And there is an overload of `SkipUntil` that does exactly that (and a corresponding one for `TakeUntil`). If that's all these were they wouldn't be interesting. However, there are overloads of `SkipUntil` and `TakeUntil` that enable us to do things we can't do with `SkipWhile` and `TakeWhile`.
+
+You've already seen one example. The [`FirstAsync` and `FirstOrDefaultAsync`](#firstasync-and-firstordefaultasync) included an example that used an overload of `TakeUntil` that accepted a `DateTimeOffset`. This wraps any `IObservable<T>`, returning an `IObservable<T>` that will forward everything from the source until the specified time, at which point it will immediately complete (and will unsubscribe from the underlying source).
+
+We couldn't have achieved this with `TakeWhile`, because that consults its predicate only when the source produces an item. If we want the source to complete at a specific time, the only way we could do that with `TakeWhile` is if its source happens to produce an item at the exact moment we wanted to finish. `TakeWhile` will only ever complete as a result of its source producing an item. `TakeUntil` can complete asynchronously. If we specified a time 5 minutes into the future, it doesn't matter if the source is completely idle when that time arrives. `TakeUntil` will complete anyway. (It relies on [Schedulers](11_SchedulingAndThreading.md#schedulers) to be able to do this.)
+
+We don't have to use a time, `TakeUntil` offers an overload that accept a second `IObservable<T>`. This enables us to tell it to stop when something interesting happens, without needing to know in advance exactly when that will occur. This overload of `TakeUntil` forwards items from the source until that second `IObservable<T>` produces a value. `SkipUntil` offers a similar overload in which the second `IObservable<T>` determines when it should start forwarding items from the source.
+
+**Note**: these overloads require the second observable to produce a value in order to trigger the start or end. If that second observable completes without producing a single notification, then it has no effect—`TakeUntil` will continue to take items indefinitely; `SkipUntil` will never produce anything. In other words, these operators would treat `Observable.Empty<T>()` as being effectively equivalent to `Observable.Never<T>()`.
+
+### Distinct and DistinctUntilChanged
+
+`Distinct` is yet another standard LINQ operator. It removes duplicates from a sequence. To do this, it needs to remember all the values that its source has ever produced, so that it can filter out any items that it has seen before. Rx includes an implementation of `Distinct`, and this example uses it to display the unique identifier of vessels generating AIS messages, but ensuring that we only display each such identifier the first time we see it:
+
+```csharp
+IObservable<uint> newIds = receiverHost.Messages
+    .Select(m => m.Mmsi)
+    .Distinct();
+
+newIds.Subscribe(id => Console.WriteLine($"New vessel: {id}"));
+```
+
+(This is leaping ahead a little—it uses `Select`, which we'll get to in [the Transformation of Sequences chapter](06_Transformation.md). However, this is a very widely used LINQ operator, so you are probably already familiar with it. I'm using it here to extract just the MMSI—the vessel identifier—from the message.)
+
+This example is fine if we are only interested in vessels' identifiers. But what if we want to inspect the detail of these messages? How can we retain the ability to see messages only for vessels we've never previously heard of, but still be able to look at the information in those message? The use of `Select` to extract the id stops us from doing this. Fortunately, `Distinct` provides an overload enabling us to change how it determines uniqueness. Instead of getting `Distinct` to look at the values it is processing, we can provide it with a function that lets us pick whatever characteristics we like. So instead of filtering the stream down to values that have never been seen before, we can instead filter the stream down to values that have some particular property or combination of properties we've never seen before. Here's a simple example:
+
+```csharp
+IObservable<IAisMessage> newVesselMessages = 
+   receiverHost.Messages.Distinct(m => m.Mmsi);
+```
+
+Here, the input to `Distinct` is now an `IObservable<IAisMessage>`. (In the preceding example it was actually `IObservable<uint>`, because the `Select` clause picked out just the MMSI.) So `Distinct` now receives the entire `IAisMessage` each time the source emits one. But because we've supplied a callback, it's not going try and compare entire `IAisMessage` messages with one another. Instead, each time it receives one, it passes that to our callback, and then looks at the value our callback returns, and compares that with the values the callback returned for all previously seen messages, and lets the message through only if that's new.
+
+So the effect is similar to before. Messages will be allowed through only if they have an MMSI not previously seen. But the difference is that the `Distinct` operator's output here is `IObservable<IAisMessage>`, so when `Distinct` lets an item through, the entire original message remains available.
+
+In addition to the standard LINQ `Distinct` operator, Rx also provides `DistinctUntilChanged`. This only lets through notifications when something has changed, which it achieved by filtering out only adjacent duplicates. For example, given the sequence `1,2,2,3,4,4,5,4,3,3,2,1,1` it would produce `1,2,3,4,5,4,3,2,1`. Whereas `Distinct` remembers every value ever produced, `DistinctUntilChanged` remembers only the most recently emitted value, and filters out new values if and only if they match that most recent value.
+
+This example uses `DistinctUntilChanged` to detect when a particular vessel reports a change in `NavigationStatus`.
+
+```csharp
+uint exampleMmsi = 235009890;
+IObservable<IAisMessageType1to3> statusChanges = receiverHost.Messages
+    .Where(v => v.Mmsi == exampleMmsi)
+    .OfType<IAisMessageType1to3>()
+    .DistinctUntilChanged(m => m.NavigationStatus)
+    .Skip(1);
+```
+
+For example, if the vessel had repeatedly been reporting a status of `AtAnchor`, `DistinctUntilChanged` would drop each such message because the status was the same as it had previously been. But if the status were to change to `UnderwayUsingEngine`, that would cause `DistinctUntilChanged` to let the first message reporting that status through. It would then not allow any further messages through until there was another change in value, either back to `AtAnchor`, or to something else such as `Moored`. (The `Skip(1)` on the end is there because `DistinctUntilChanged` always lets through the very first message it sees. We have no way of knowing whether that actually represents a change in status, but it is very likely not to: ships report their status every few minutes, but they change that status much less often, so the first time we receive a report of a ship's status, it probably doesn't represent a change of status. By dropping that first item, we ensure that `statusChanges` provides notifications only when we can be certain that the status changed.)
+
+That was our quick run through of the filtering methods available in Rx. While they are relatively simple, as we have already begun to see, the power in Rx is down to the composability of its operators.
+
+The filter operators are your first stop for managing the potential deluge of data we can face in this information-rich age. We now know how to apply various criteria to remove data. Next, we will move on to operators that can transform data.

+ 0 - 404
Rx.NET/Documentation/IntroToRx/06_Inspection.md

@@ -1,404 +0,0 @@
----
-title: Inspection
----
-
-<!--
-	Review code samples. I think one says 6 in the code but 2 in the output.
-	Begin middle end.
-	Word spell check.
--->
-<!--
-	Last chapter talked about the deluge of data and removing the crap.
-	This chapter should continue the theme and instead discuss "in contrast to removing data 
-	we dont want, we can also picking out data we do want, or validate that the sequence meets
-	 an expectation."
-
--->
-
-#Inspection			{#Inspection}
-
-Making sense of all the data we consume is not always about just filtering out the redundant and superfluous. 
-Sometimes we need to pluck out data that is relevant or validate that a sequence even meets our expectations. 
-Does this data have any values that meet this specification? 
-Is this specific value in the sequence? 
-Get me that specific value from the sequence!
-
-In the last chapter we looked at a series of ways to reduce your observable sequence via a variety of filters. 
-Next we will look at operators that provide inspection functionality. 
-Most of these operators will reduce your observable sequence down to a sequence with a single value in it. 
-As the return value of these methods is not a scalar (it is still `IObservable<T>`) these methods do not actually satisfy our definition of catamorphism, but suit our examination of reducing a sequence to a single value.
-
-The series of methods we will look at next are useful for inspecting a given sequence.
-Each of them returns an observable sequence with the single value containing the result. 
-This proves useful, as by their nature they are asynchronous. 
-They are all quite simple so we will be brief with each of them.
-
-##Any								{#Any}
-
-First we can look at the parameterless overload for the extension method `Any`.
-This will simply return an observable sequence that has the single value of `false` if the source completes without any values. 
-If the source does produce a value however, then when the first value is produced, the result sequence will immediately push `true` and then complete. 
-If the first notification it gets is an error, then it will pass that error on.
-
-	var subject = new Subject<int>();
-	subject.Subscribe(Console.WriteLine, () => Console.WriteLine("Subject completed"));
-	var any = subject.Any();
-
-	any.Subscribe(b => Console.WriteLine("The subject has any values? {0}", b));
-
-	subject.OnNext(1);
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">The subject has any values? True</div>
-	<div class="line">subject completed</div>
-</div>
-
-If we now remove the OnNext(1), the output will change to the following
-
-<div class="output">
-	<div class="line">subject completed</div>
-	<div class="line">The subject has any values? False</div>
-</div>
-
-If the source errors it would only be interesting if it was the first notification, otherwise the `Any` method will have already pushed true. 
-If the first notification is an error then `Any` will just pass it along as an `OnError` notification.
-
-	var subject = new Subject<int>();
-	subject.Subscribe(Console.WriteLine,
-		ex => Console.WriteLine("subject OnError : {0}", ex),
-		() => Console.WriteLine("Subject completed"));
-	var any = subject.Any();
-
-	any.Subscribe(b => Console.WriteLine("The subject has any values? {0}", b),
-		ex => Console.WriteLine(".Any() OnError : {0}", ex),
-		() => Console.WriteLine(".Any() completed"));
-
-	subject.OnError(new Exception());
-
-Output:
-
-<div class="output">
-	<div class="line">subject OnError : System.Exception: Fail</div>
-	<div class="line">.Any() OnError : System.Exception: Fail</div>
-</div>
-
-The `Any` method also has an overload that takes a predicate. 
-This effectively makes it a `Where` with an `Any` appended to it.
-
-	subject.Any(i => i > 2);
-	//Functionally equivalent to 
-	subject.Where(i => i > 2).Any();
-
-As an exercise, write your own version of the two `Any` extension method overloads.
-While the answer may not be immediately obvious, we have covered enough material for you to create this using the methods you know...
-
-<hr style="page-break-after: always" />
-
-Example of the `Any` extension methods written with `Observable.Create`:
-
-	public static IObservable<bool> MyAny<T>(
-		this IObservable<T> source)
-	{
-		return Observable.Create<bool>(
-			o =>
-			{
-				var hasValues = false;
-				return source
-					.Take(1)
-					.Subscribe(
-						_ => hasValues = true,
-						o.OnError,
-						() =>
-						{
-							o.OnNext(hasValues);
-							o.OnCompleted();
-						});
-			});
-	}
-
-	public static IObservable<bool> MyAny<T>(
-		this IObservable<T> source, 
-		Func<T, bool> predicate)
-	{
-		return source
-			.Where(predicate)
-			.MyAny();
-	}
-
-##All								{#All}
-
-The `All`() extension method works just like the `Any` method, except that all values must meet the predicate. 
-As soon as a value does not meet the predicate a `false` value is returned then the output sequence completed. 
-If the source is empty, then `All` will push `true` as its value. 
-As per the `Any` method, and errors will be passed along to the subscriber of the `All` method.
-
-	var subject = new Subject<int>();
-	subject.Subscribe(Console.WriteLine, () => Console.WriteLine("Subject completed"));
-	var all = subject.All(i => i < 5);
-	all.Subscribe(b => Console.WriteLine("All values less than 5? {0}", b));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(6);
-	subject.OnNext(2);
-	subject.OnNext(1);
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">6</div>
-	<div class="line">All values less than 5? False</div>
-	<div class="line">all completed</div>
-	<div class="line">2</div>
-	<div class="line">1</div>
-	<div class="line">subject completed</div>
-</div>
-
-Early adopters of Rx may notice that the `IsEmpty` extension method is missing.
-You can easily replicate the missing method using the `All` extension method.
-
-
-	//IsEmpty() is deprecated now.
-	//var isEmpty = subject.IsEmpty();
-	var isEmpty = subject.All(_ => false);
-
-##Contains							{#Contains}
-
-The `Contains` extension method overloads could sensibly be overloads to the `Any` extension method. 
-The `Contains` extension method has the same behavior as `Any`, however it specifically targets the use of `IComparable` instead of the usage of predicates and is designed to seek a specific value instead of a value that fits the predicate. 
-I believe that these are not overloads of `Any` for consistency with `IEnumerable`.
-
-
-	var subject = new Subject<int>();
-	subject.Subscribe(
-		Console.WriteLine, 
-		() => Console.WriteLine("Subject completed"));
-	var contains = subject.Contains(2);
-	contains.Subscribe(
-		b => Console.WriteLine("Contains the value 2? {0}", b),
-		() => Console.WriteLine("contains completed"));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-		
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">Contains the value 2? True</div>
-	<div class="line">contains completed</div>
-	<div class="line">3</div>
-	<div class="line">Subject completed</div>
-</div>
-
-There is also an overload to `Contains` that allows you to specify an implementation of `IEqualityComparer<T>` other than the default for the type. 
-This can be useful if you have a sequence of custom types that may have some special rules for equality depending on the use case.
-    
-##DefaultIfEmpty					{#DefaultIfEmpty}
-
-The `DefaultIfEmpty` extension method will return a single value if the source sequence is empty. 
-Depending on the overload used, it will either be the value provided as the default, or `Default(T)`. 
-`Default(T)` will be the zero value for _struct_ types and will be `null` for classes. 
-If the source is not empty then all values will be passed straight on through.
-
-
-In this example the source produces values, so the result of `DefaultIfEmpty` is just the source.
-
-	var subject = new Subject<int>();
-	subject.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Subject completed"));
-	var defaultIfEmpty = subject.DefaultIfEmpty();
-	defaultIfEmpty.Subscribe(
-		b => Console.WriteLine("defaultIfEmpty value: {0}", b),
-		() => Console.WriteLine("defaultIfEmpty completed"));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">defaultIfEmpty value: 1</div>
-	<div class="line">2</div>
-	<div class="line">defaultIfEmpty value: 2</div>
-	<div class="line">3</div>
-	<div class="line">defaultIfEmpty value: 3</div>
-	<div class="line">Subject completed</div>
-	<div class="line">defaultIfEmpty completed</div>
-</div>
-
-If the source is empty, we can use either the default value for the type (i.e. 0 for int) or provide our own value in this case 42.
-
-	var subject = new Subject<int>();
-	subject.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Subject completed"));
-	var defaultIfEmpty = subject.DefaultIfEmpty();
-	defaultIfEmpty.Subscribe(
-		b => Console.WriteLine("defaultIfEmpty value: {0}", b),
-		() => Console.WriteLine("defaultIfEmpty completed"));
-
-	var default42IfEmpty = subject.DefaultIfEmpty(42);
-	default42IfEmpty.Subscribe(
-		b => Console.WriteLine("default42IfEmpty value: {0}", b),
-		() => Console.WriteLine("default42IfEmpty completed"));
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">Subject completed</div>
-	<div class="line">defaultIfEmpty value: 0</div>
-	<div class="line">defaultIfEmpty completed</div>
-	<div class="line">default42IfEmpty value: 42</div>
-	<div class="line">default42IfEmpty completed</div>
-</div>
-
-##ElementAt							{#ElementAt}
-
-The `ElementAt` extension method allows us to "cherry pick" out a value at a given index. 
-Like the `IEnumerable<T>` version it is uses a 0 based index.
-
-	var subject = new Subject<int>();
-	subject.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Subject completed"));
-	var elementAt1 = subject.ElementAt(1);
-	elementAt1.Subscribe(
-		b => Console.WriteLine("elementAt1 value: {0}", b),
-		() => Console.WriteLine("elementAt1 completed"));
-
-	subject.OnNext(1);
-	subject.OnNext(2);
-	subject.OnNext(3);
-
-	subject.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">elementAt1 value: 2</div>
-	<div class="line">elementAt1 completed</div>
-	<div class="line">3</div>
-	<div class="line">subject completed</div>
-</div>
-
-As we can't check the length of an observable sequence it is fair to assume that sometimes this method could cause problems. 
-If your source sequence only produces five values and we ask for `ElementAt(5)`, the result sequence will error with an `ArgumentOutOfRangeException` inside when the source completes. 
-There are three options we have:
-
- * Handle the OnError gracefully
- * Use `.Skip(5).Take(1);` This will ignore the first 5 values and the only take the 6th value. 
-If the sequence has less than 6 elements we just get an empty sequence, but no errors.
- * Use ElementAtOrDefault
-
-`ElementAtOrDefault` extension method will protect us in case the index is out of range, by pushing the `Default(T)` value. 
-Currently there is not an option to provide your own default value.
-    
-##SequenceEqual						{#SequenceEqual}
-
-Finally `SequenceEqual` extension method is perhaps a stretch to put in a chapter that starts off talking about catamorphism and fold, but it does serve well for the theme of inspection. 
-This method allows us to compare two observable sequences.
-As each source sequence produces values, they are compared to a cache of the other sequence to ensure that each sequence has the same values in the same order and that the sequences are the same length. 
-This means that the result sequence can return `false` as soon as the source sequences produce diverging values, or `true` when both sources complete with the same values.
-    
-    var subject1 = new Subject<int>();
-	subject1.Subscribe(
-		i=>Console.WriteLine("subject1.OnNext({0})", i),
-		() => Console.WriteLine("subject1 completed"));
-	var subject2 = new Subject<int>();
-	subject2.Subscribe(
-		i=>Console.WriteLine("subject2.OnNext({0})", i),
-		() => Console.WriteLine("subject2 completed"));
-
-
-	var areEqual = subject1.SequenceEqual(subject2);
-	areEqual.Subscribe(
-		i => Console.WriteLine("areEqual.OnNext({0})", i),
-		() => Console.WriteLine("areEqual completed"));
-
-	subject1.OnNext(1);
-	subject1.OnNext(2);
-
-	subject2.OnNext(1);
-	subject2.OnNext(2);
-	subject2.OnNext(3);
-
-	subject1.OnNext(3);
-
-	subject1.OnCompleted();
-	subject2.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">subject1.OnNext(1)</div>
-	<div class="line">subject1.OnNext(2)</div>
-	<div class="line">subject2.OnNext(1)</div>
-	<div class="line">subject2.OnNext(2)</div>
-	<div class="line">subject2.OnNext(3)</div>
-	<div class="line">subject1.OnNext(3)</div>
-	<div class="line">subject1 completed</div>
-	<div class="line">subject2 completed</div>
-	<div class="line">areEqual.OnNext(True)</div>
-	<div class="line">areEqual completed</div>
-</div>
-
-
-This chapter covered a set of methods that allow us to inspect observable sequences.
-The result of each, generally, returns a sequence with a single value.
-We will continue to look at methods to reduce our sequence until we discover the elusive functional fold feature.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 185 - 0
Rx.NET/Documentation/IntroToRx/06_Transformation.md


+ 475 - 525
Rx.NET/Documentation/IntroToRx/07_Aggregation.md

@@ -1,525 +1,475 @@
----
-title: Aggregation
----
-
-#Aggregation						{#Aggregation}
-
-Data is not always valuable is its raw form. 
-Sometimes we need to consolidate, collate, combine or condense the mountains of data we receive into more consumable bite sized chunks. 
-Consider fast moving data from domains like instrumentation, finance, signal processing and operational intelligence. 
-This kind of data can change at a rate of over ten values per second. 
-Can a person actually consume this? 
-Perhaps for human consumption, aggregate values like averages, minimums and maximums can be of more use.
-
-Continuing with the theme of reducing an observable sequence, we will look at the aggregation functions that are available to us in Rx. 
-Our first set of methods continues on from our last chapter, as they take an observable sequence and reduce it to a sequence with a single value. 
-We then move on to find operators that can transition a sequence back to a scalar value, a functional fold.
-
-Just before we move on to introducing the new operators, we will quickly create our own extension method. 
-We will use this 'Dump' extension method to help build our samples.
-
-	public static class SampleExtentions
-	{
-		public static void Dump<T>(this IObservable<T> source, string name)
-		{
-			source.Subscribe(
-				i=>Console.WriteLine("{0}-->{1}", name, i), 
-				ex=>Console.WriteLine("{0} failed-->{1}", name, ex.Message),
-				()=>Console.WriteLine("{0} completed", name));
-		}
-	}
-
-Those who use [LINQPad](http://www.linqpad.net/) will recognize that this is the source of inspiration. 
-For those who have not used LINQPad, I highly recommend it. 
-It is perfect for whipping up quick samples to validate a snippet of code. 
-LINQPad also fully supports the `IObservable<T>` type.
-
-##Count					{#Count}
-
-`Count` is a very familiar extension method for those that use LINQ on `IEnumerable<T>`.
-Like all good method names, it "does what it says on the tin". 
-The Rx version deviates from the `IEnumerable<T>` version as Rx will return an observable sequence, not a scalar value. 
-The return sequence will have a single value being the count of the values in the source sequence. 
-Obviously we cannot provide the count until the source sequence completes.
-
-	var numbers = Observable.Range(0,3);
-	numbers.Dump("numbers");
-	numbers.Count().Dump("count");
-
-Output:
-
-<div class="output">
-	<div class="line">numbers-->1</div>
-	<div class="line">numbers-->2</div>
-	<div class="line">numbers-->3</div>
-	<div class="line">numbers Completed</div>
-	<div class="line">count-->3</div>
-	<div class="line">count Completed</div>
-</div>
-
-If you are expecting your sequence to have more values than a 32 bit integer can hold, there is the option to use the `LongCount` extension method. 
-This is just the same as `Count` except it returns an `IObservable<long>`.
-
-##Min, Max, Sum and Average			{#MaxAndMin}
-
-Other common aggregations are `Min`, `Max`, `Sum` and `Average`.
-Just like `Count`, these all return a sequence with a single value. 
-Once the source completes the result sequence will produce its value and then complete.
-
-
-	var numbers = new Subject<int>();
-	
-	numbers.Dump("numbers");
-	numbers.Min().Dump("Min");
-	numbers.Average().Dump("Average");
-
-	numbers.OnNext(1);
-	numbers.OnNext(2);
-	numbers.OnNext(3);
-	numbers.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">numbers-->1</div>
-	<div class="line">numbers-->2</div>
-	<div class="line">numbers-->3</div>
-	<div class="line">numbers Completed</div>
-	<div class="line">min-->1</div>
-	<div class="line">min Completed</div>
-	<div class="line">avg-->2</div>
-	<div class="line">avg Completed</div>
-</div>
-
-The `Min` and `Max` methods have overloads that allow you to provide a custom implementation of an `IComparer<T>` to sort your values in a custom way. 
-The `Average` extension method specifically calculates the mean (as opposed to median or mode) of the sequence. 
-For sequences of integers (int or long) the output of `Average` will be an `IObservable<double>`.
-If the source is of nullable integers then the output will be `IObservable<double?>`.
-All other numeric types (`float`, `double`, `decimal` and their nullable equivalents) will result in the output sequence being of the same type as the input sequence.
-
-##Functional folds					{#Fold}
-
-Finally we arrive at the set of methods in Rx that meet the functional description of catamorphism/fold. 
-These methods will take an `IObservable<T>` and produce a `T`.
-
-Caution should be prescribed whenever using any of these fold methods on an observable sequence, as they are all blocking. 
-The reason you need to be careful with blocking methods is that you are moving from an asynchronous paradigm to a synchronous one, and without care you can introduce concurrency problems such as locking UIs and deadlocks. 
-We will take a deeper look into these problems in a later chapter when we look at concurrency.
-
-<p class="comment">
-	It is worth noting that in the soon to be released .NET 4.5 and Rx 2.0 will provide
-	support for avoiding these concurrency problems. The new `async`/`await`
-	keywords and related features in Rx 2.0 can help exit the monad in a safer way.
-</p>
-
-###First							{#First}
-
-The `First()` extension method simply returns the first value from a sequence.
-
-
-	var interval = Observable.Interval(TimeSpan.FromSeconds(3));
-	//Will block for 3s before returning
-	Console.WriteLine(interval.First());
-
-If the source sequence does not have any values (i.e. is an empty sequence) then the `First` method will throw an exception. 
-You can cater for this in three ways:
-
- * Use a try/catch blocks around the `First()` call
- * Use `Take(1)` instead. However, this will be asynchronous, not blocking.
- * Use `FirstOrDefault` extension method instead
-
-The `FirstOrDefault` will still block until the source produces any notification.
-If the notification is an `OnError` then it will be thrown. 
-If the notification is an `OnNext` then that value will be returned, otherwise if it is an `OnCompleted` the default will be returned. 
-As we have seen in earlier methods, we can either choose to use the parameterless method in which the default value will be `default(T)` (i.e. null for reference types or the zero value for value types), alternatively we can provide our own default value to use.
-
-A special mention should be made for the unique relationship that `BehaviorSubject` and the `First()` extension method has. 
-The reason behind this is that the `BehaviorSubject` is guaranteed to have a notification, be it a value, an error or a completion. 
-This effectively removes the blocking nature of the `First` extension method when used with a `BehaviorSubject`. 
-This can be used to make behavior subjects act like properties.
-
-###Last								{#Last}
-
-The `Last` and `LastOrDefault` will block until the source completes and then return the last value. 
-Just like the `First()` method any `OnError` notifications will be thrown. 
-If the sequence is empty then `Last()` will throw an `InvalidOperationException`, but you can use `LastOrDefault` to avoid this.
-
-###Single							{#Single}
-
-The `Single` extension method is for getting the single value from a sequence.
-The difference between this and `First()` or `Last()` is that it helps to assert your assumption that the sequence will only contain a single value. 
-The method will block until the source produces a value and then completes. 
-If the sequence produces any other combination of notifications then the method will throw. 
-This method works especially well with `AsyncSubject` instances as they only produce a single value sequences.
-
-##Build your own aggregations		{#BuildYourOwn}
-
-If the provided aggregations do not meet your needs, you can build your own. 
-Rx provides two different ways to do this.
-
-###Aggregate						{#Aggregate}
-
-The `Aggregate` method allows you to apply an accumulator function to the sequence. 
-For the basic overload, you need to provide a function that takes the current state of the accumulated value and the value that the sequence is pushing.
-The result of the function is the new accumulated value. 
-This overload signature is as follows:
-
-	IObservable<TSource> Aggregate<TSource>(
-		this IObservable<TSource> source, 
-		Func<TSource, TSource, TSource> accumulator)
-
-If you wanted to produce your own version of `Sum` for `int` values, you could do so by providing a function that just adds to the current state of the accumulator.
-
-	var sum = source.Aggregate((acc, currentValue) => acc + currentValue);
-
-This overload of `Aggregate` has several problems. 
-First is that it requires the aggregated value must be the same type as the sequence values. 
-We have already seen in other aggregates like `Average` this is not always the case. 
-Secondly, this overload needs at least one value to be produced from the source or the output will error with an `InvalidOperationException`. 
-It should be completely valid for us to use `Aggregate` to create our own `Count` or `Sum` on an empty sequence. 
-To do this you need to use the other overload. 
-This overload takes an extra parameter which is the seed. 
-The seed value provides an initial accumulated value. 
-It also allows the aggregate type to be different to the value type.
-
-	IObservable<TAccumulate> Aggregate<TSource, TAccumulate>(
-		this IObservable<TSource> source, 
-		TAccumulate seed, 
-		Func<TAccumulate, TSource, TAccumulate> accumulator)
-
-
-To update our `Sum` implementation to use this overload is easy. 
-Just add the seed which will be 0. 
-This will now return 0 as the sum when the sequence is empty which is just what we want. 
-You also now can also create your own version of `Count`.
-
-	var sum = source.Aggregate(0, (acc, currentValue) => acc + currentValue);
-	var count = source.Aggregate(0, (acc, currentValue) => acc + 1);
-	//or using '_' to signify that the value is not used.
-	var count = source.Aggregate(0, (acc, _) => acc + 1);
-
-As an exercise write your own `Min` and `Max` methods using `Aggregate`.
-You will probably find the `IComparer<T>` interface useful, and in particular the static `Comparer<T>.Default` property. 
-When you have done the exercise, continue to the example implementations...
-
-<hr style="page-break-after: always" />
-
-Examples of creating `Min` and `Max` from `Aggregate`:
-
-	public static IObservable<T> MyMin<T>(this IObservable<T> source)
-	{
-		return source.Aggregate(
-			(min, current) => Comparer<T>
-				.Default
-				.Compare(min, current) > 0 
-					? current 
-					: min);
-	}
-
-	public static IObservable<T> MyMax<T>(this IObservable<T> source)
-	{
-		var comparer = Comparer<T>.Default;
-		Func<T, T, T> max = 
-			(x, y) =>
-			{
-				if(comparer.Compare(x, y) < 0)
-				{
-					return y;
-				}
-				return x;
-			};
-		return source.Aggregate(max);
-	}
-
-###Scan								{#Scan}
-
-While `Aggregate` allows us to get a final value for sequences that will complete, sometimes this is not what we need. 
-If we consider a use case that requires that we get a running total as we receive values, then `Aggregate` is not a good fit. 
-`Aggregate` is also not a good fit for infinite sequences. 
-The `Scan` extension method however meets this requirement perfectly. 
-The signatures for both `Scan` and `Aggregate` are the same; the difference is that `Scan` will push the _result_ from every call to the accumulator function.
-So instead of being an aggregator that reduces a sequence to a single value sequence, it is an accumulator that we return an accumulated value for each value of the source sequence. 
-In this example we produce a running total.
-
-	var numbers = new Subject<int>();
-	var scan = numbers.Scan(0, (acc, current) => acc + current);
-
-	numbers.Dump("numbers");
-	scan.Dump("scan");
-
-	numbers.OnNext(1);
-	numbers.OnNext(2);
-	numbers.OnNext(3);
-	numbers.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">numbers-->1</div>
-	<div class="line">sum-->1</div>
-	<div class="line">numbers-->2</div>
-	<div class="line">sum-->3</div>
-	<div class="line">numbers-->3</div>
-	<div class="line">sum-->6</div>
-	<div class="line">numbers completed</div>
-	<div class="line">sum completed</div>
-</div>
-
-It is probably worth pointing out that you use `Scan` with `TakeLast()` to produce `Aggregate`.
-
-	source.Aggregate(0, (acc, current) => acc + current);
-	//is equivalent to 
-	source.Scan(0, (acc, current) => acc + current).TakeLast();
-
-As another exercise, use the methods we have covered so far in the book to produce a sequence of running minimum and running maximums. 
-The key here is that each time we receive a value that is less than (or more than for a Max operator) our current accumulator we should push that value and update the accumulator value. 
-We don't however want to push duplicate values. 
-For example, given a sequence of [2, 1, 3, 5, 0] we should see output like [2, 1, 0] for the running minimum, and [2, 3, 5] for the running maximum.
-We don't want to see [2, 1, 2, 2, 0] or [2, 2, 3, 5, 5]. 
-Continue to see an example implementation.
-
-<hr style="page-break-after: always" />
-
-Example of a running minimum:
-
-	var comparer = Comparer<T>.Default;
-	Func<T,T,T> minOf = (x, y) => comparer.Compare(x, y) < 0 ? x: y;
-	var min = source.Scan(minOf)
-		.DistinctUntilChanged();
-
-Example of a running maximum:
-
-	public static IObservable<T> RunningMax<T>(this IObservable<T> source)
-	{
-		return source.Scan(MaxOf)
-			.Distinct();
-	}
-	private static T MaxOf<T>(T x, T y)
-	{
-		var comparer = Comparer<T>.Default;
-		if (comparer.Compare(x, y) < 0)
-		{
-			return y;
-		}
-		return x;
-	}
-
-While the only functional differences between the two examples is checking greater instead of less than, the examples show two different styles. 
-Some people prefer the terseness of the first example, others like their curly braces and the verbosity of the second example. 
-The key here was to compose the `Scan` method with the `Distinct` or `DistinctUntilChanged` methods. 
-It is probably preferable to use the `DistinctUntilChanged` so that we internally are not keeping a cache of all values.
-
-##Partitioning						{#Partitioning}
-
-Rx also gives you the ability to partition your sequence with features like the standard LINQ operator `GroupBy`. 
-This can be useful for taking a single sequence and fanning out to many subscribers or perhaps taking aggregates on partitions.
-
-###MinBy and MaxBy					{#MinByMaxBy}
-
-The `MinBy` and `MaxBy` operators allow you to partition your sequence based on a key selector function. 
-Key selector functions are common in other LINQ operators like the `IEnumerable<T>` `ToDictionary` or `GroupBy` and the [`Distinct`}(05_Filtering.html#Distinct) method.
-Each method will return you the values from the key that was the minimum or maximum respectively.
-
-	// Returns an observable sequence containing a list of zero or more elements that have a 
-	//  minimum key value.
-	public static IObservable<IList<TSource>> MinBy<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector)
-	{...}
-	public static IObservable<IList<TSource>> MinBy<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		IComparer<TKey> comparer)
-	{...}
-
-	// Returns an observable sequence containing a list of zero or more elements that have a
-	//  maximum key value.
-	public static IObservable<IList<TSource>> MaxBy<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector)
-	{...}
-	public static IObservable<IList<TSource>> MaxBy<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		IComparer<TKey> comparer)
-	{...}
-
-Take note that each `Min` and `Max` operator has an overload that takes a comparer. 
-This allows for comparing custom types or custom sorting of standard types.
-
-Consider a sequence from 0 to 10. 
-If we apply a key selector that partitions the values in to groups based on their modulus of 3, we will have 3 groups of values.
-The values and their keys will be as follows:
-
-	Func<int, int> keySelector = i => i % 3;
-
-
- * 0, key: 0
- * 1, key: 1
- * 2, key: 2
- * 3, key: 0
- * 4, key: 1
- * 5, key: 2
- * 6, key: 0
- * 7, key: 1
- * 8, key: 2
- * 9, key: 0
-
-
-We can see here that the minimum key is 0 and the maximum key is 2. 
-If therefore, we applied the `MinBy` operator our single value from the sequence would be the list of [0,3,6,9]. 
-Applying the `MaxBy` operator would produce the list [2,5,8]. 
-The `MinBy` and `MaxBy` operators will only yield a single value (like an `AsyncSubject`) and that value will be an `IList<T>` with zero or more values.
-
-If instead of the values for the minimum/maximum key, you wanted to get the minimum value for each key, then you would need to look at `GroupBy`.
-
-###GroupBy							{#GroupBy}
-
-The `GroupBy` operator allows you to partition your sequence just as `IEnumerable<T>`'s `GroupBy` operator does. 
-In a similar fashion to how the `IEnumerable<T>` operator returns an `IEnumerable<IGrouping<TKey, T>>`, the `IObservable<T>` `GroupBy` operator returns an `IObservable<IGroupedObservable<TKey, T>>`.
-
-	// Transforms a sequence into a sequence of observable groups, 
-	//  each of which corresponds to a unique key value, 
-	//  containing all elements that share that same key value.
-	public static IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector)
-	{...}
-	public static IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		IEqualityComparer<TKey> comparer)
-	{...}
-	public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		Func<TSource, TElement> elementSelector)
-	{...}
-	public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		Func<TSource, TElement> elementSelector, 
-		IEqualityComparer<TKey> comparer)
-	{...}
-
-I find the last two overloads a little redundant as we could easily just compose a `Select` operator to the query to get the same functionality.
-
-In a similar fashion that the `IGrouping<TKey, T>` type extends the `IEnumerable<T>`, the `IGroupedObservable<T>` just extends `IObservable<T>` by adding a `Key` property. 
-The use of the `GroupBy` effectively gives us a nested observable sequence.
-
-To use the `GroupBy` operator to get the minimum/maximum value for each key, we can first partition the sequence and then `Min`/`Max` each partition.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(0.1)).Take(10);
-	var group = source.GroupBy(i => i % 3);
-	group.Subscribe(
-		grp => 
-			grp.Min().Subscribe(
-				minValue => 
-				Console.WriteLine("{0} min value = {1}", grp.Key, minValue)),
-		() => Console.WriteLine("Completed"));
-
-The code above would work, but it is not good practice to have these nested subscribe calls. 
-We have lost control of the nested subscription, and it is hard to read.
-When you find yourself creating nested subscriptions, you should consider how to apply a better pattern. 
-In this case we can use `SelectMany` which we will look at in the next chapter.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(0.1)).Take(10);
-	var group = source.GroupBy(i => i % 3);
-	group.SelectMany(
-			grp =>
-				grp.Max()
-				.Select(value => new { grp.Key, value }))
-		.Dump("group");
-
-###Nested observables				{#NestedObservables}
-
-The concept of a sequence of sequences can be somewhat overwhelming at first, especially if both sequence types are `IObservable`. 
-While it is an advanced topic, we will touch on it here as it is a common occurrence with Rx. 
-I find it easier if I can conceptualize a scenario or example to understand concepts better.
-
-Examples of Observables of Observables:
-
-<dl>
-	<dt>Partitions of Data</dt>
-	<dd>
-		You may partition data from a single source so that it can easily be filtered and
-		shared to many sources. Partitioning data may also be useful for aggregates as we
-		have seen. This is commonly done with the `GroupBy` operator.
-	</dd>
-	<dt>Online Game servers</dt>
-	<dd>
-		Consider a sequence of servers. New values represent a server coming online. The
-		value itself is a sequence of latency values allowing the consumer to see real time
-		information of quantity and quality of servers available. If a server went down
-		then the inner sequence can signify that by completing.
-	</dd>
-	<dt>Financial data streams</dt>
-	<dd>
-		New markets or instruments may open and close during the day. These would then stream
-		price information and could complete when the market closes.
-	</dd>
-	<dt>Chat Room</dt>
-	<dd>
-		Users can join a chat (outer sequence), leave messages (inner sequence) and leave
-		a chat (completing the inner sequence).
-	</dd>
-	<dt>File watcher</dt>
-	<dd>
-		As files are added to a directory they could be watched for modifications (outer
-		sequence). The inner sequence could represent changes to the file, and completing
-		an inner sequence could represent deleting the file.
-	</dd>
-</dl>
-
-Considering these examples, you could see how useful it could be to have the concept of nested observables. 
-There are a suite of operators that work very well with nested observables such as `SelectMany`, `Merge` and `Switch` that we look at in future chapters.
-
-When working with nested observables, it can be handy to adopt the convention that a new sequence represents a creation (e.g. A new partition is created, new game host comes online, a market opens, users joins a chat, creating a file in a watched directory). 
-You can then adopt the convention for what a completed inner sequence represents (e.g. Game host goes offline, Market Closes, User leave chat, File being watched is deleted). 
-The great thing with nested observables is that a completed inner sequence can effectively be restarted by creating a new inner sequence.
-
-In this chapter we are starting to uncover the power of LINQ and how it applies to Rx. 
-We chained methods together to recreate the effect that other methods already provide. 
-While this is academically nice, it also allows us to starting thinking in terms of functional composition. 
-We have also seen that some methods work nicely with certain types: `First()` + `BehaviorSubject<T>`, `Single()` + `AsyncSubject<T>`, `Single()` + `Aggregate()` etc. 
-We have covered the second of our three classifications of operators, _catamorphism_.
-Next we will discover more methods to add to our functional composition tool belt and also find how Rx deals with our third functional concept, _bind_.
-
-Consolidating data into groups and aggregates enables sensible consumption of mass data. 
-Fast moving data can be too overwhelming for batch processing systems and human consumption. 
-Rx provides the ability to aggregate and partition on the fly, enabling real-time reporting without the need for expensive CEP or OLAP products.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>
+# Aggregation
+
+Data is not always tractable is its raw form. Sometimes we need to consolidate, collate, combine or condense the mountains of data we receive. This might just be a case of reducing the volume of data to a manageable level. For example, consider fast moving data from domains like instrumentation, finance, signal processing and operational intelligence. This kind of data can change at a rate of over ten values per second for individual sources, and much higher rates if we're observing multiple sources. Can a person actually consume this? For human consumption, aggregate values like averages, minimums and maximums can be of more use.
+
+We can often achieve more than this. The way in which we combine and correlate may enable us to reveal patterns, providing insights that would not be available from any individual message, or from simple reduction to a single statistical measure. Rx's composability enables us to express complex and subtle computations over streams of data enabling us not just to reduce the volume of messages that users have to deal with, but to increase the amount of value in each message a human receives.
+
+We will start with the simplest aggregation functions, which reduce an observable sequence to a sequence with a single value in some specific way. We then move on to more general-purpose operators that enable you to define your own aggregation mechanisms.
+
+## Simple Numeric Aggregation
+
+Rx supports various standard LINQ operators that reduce all of the values in a sequence down to a single numeric result.
+
+### Count
+
+`Count` tells you how many elements a sequence contains. Although this is a standard LINQ operator, Rx's version deviates from the `IEnumerable<T>` version as Rx will return an observable sequence, not a scalar value. As usual, this is because of the push-related nature of Rx. Rx's `Count` can't demand that its source supply all elements immediately, so it just has to wait until the source says that it has finished. The sequence that `Count` returns will always be of type `IObservable<int>`, regardless of the source's element type. This will do nothing until the source completes, at which point it will emit a single value reporting how many elements the source produced, and then it will in turn immediately complete. This example uses `Count` with `Range`, because `Range` generates all of its values as quickly as possible and then completes, meaning we get a result from `Count` immediately:
+
+```csharp
+IObservable<int> numbers = Observable.Range(0,3);
+numbers.Count().Dump("count");
+```
+
+Output:
+
+```
+count-->3
+count Completed
+```
+
+If you are expecting your sequence to have more values than a 32-bit signed integer can count, you can use the `LongCount` operator instead. This is just the same as `Count` except it returns an `IObservable<long>`.
+
+### Sum
+
+The `Sum` operator adds together all the values in its source, producing the total as its only output. As with `Count`, Rx's `Sum` differs from most other LINQ providers in that it does not produce a scalar as its output. It produces an observable sequence that does nothing until its source completes. When the source completes, the observable returned by `Sum` produces a single value and then immediately completes. This example shows it in use:
+
+```csharp
+IObservable<int> numbers = Observable.Range(1,5);
+numbers.Sum().Dump("sum");
+```
+
+The output shows the single result produced by `Sum`:
+
+```
+sum-->15
+sum completed
+```
+
+`Sum` is only able to work with values of type `int`, `long`, `float`, `double` `decimal`, or the nullable versions of these. This means that there are types you might expect to be able to `Sum` that you can't. For example the `BigInteger` type in the `System.Numerics` namespace represents integer values whose size is limited only by available memory, and how long you're prepared to wait for it to perform calculations. (Even basic arithmetic gets very slow on numbers with millions of digits.) You can use `+` to add these together because the type defines an overload for that operator. But `Sum` has historically had no way to find that. The introduction of [generic math in C# 11.0](https://learn.microsoft.com/en-us/dotnet/standard/generics/math#operator-interfaces) means that it would technically be possible to introduce a version of `Sum` that would work for any type `T` that implemented [`IAdditionOperators<T, T, T>`](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3). However, that would mean a dependency on .NET 7.0 or later (because generic math is not available in older versions), and at the time of writing this, Rx supports .NET 7.0 through its `net6.0` target. It could introduce a separate `net7.0` and/or `net8.0` target to enable this, but has not yet done so. (To be fair, [`Sum` in LINQ to Objects also doesn't support this yet](https://github.com/dotnet/runtime/issues/64031).)
+
+If you supply `Sum` with the nullable versions of these types (e.g., your source is an `IObservable<int?>`) then `Sum` will also return a sequence with a nullable item type, and it will produce `null` if any of the input values is `null`.
+
+Although `Sum` can work only with a small, fixed list of numeric types, your source doesn't necessarily have to produce values of those types. `Sum` offers overloads that accept a lambda that extracts a suitable numeric value from each input element. For example, suppose you wanted to answer the following unlikely question: if the next 10 ships that happen to broadcast descriptions of themselves over AIS were put side by side, would they all fit in a channel of some particular width? We could do this by filtering the AIS messages down to those that provide ship size information, using `Take` to collect the next 10 such messages, and then using `Sum`. The Ais.NET library's `IVesselDimensions` interface does not implement addition (and even if it did, we already just saw that Rx wouldn't be able to exploit that), but that's fine: all we need to do is supply a lambda that can take an `IVesselDimensions` and return a value of some numeric type that `Sum` can process:
+
+```csharp
+IObservable<IVesselDimensions> vesselDimensions = receiverHost.Messages
+    .OfType<IVesselDimensions>();
+
+IObservable<int> totalVesselWidths = vesselDimensions
+    .Take(10)
+    .Sum(dimensions => 
+            checked((int)(dimensions.DimensionToPort + dimensions.DimensionToStarboard)));
+```
+
+(If you're wondering what's with cast and the `checked` keyword here, AIS defines these values as unsigned integers, so the Ais.NET library reports them as `uint`, which is not a type Rx's `Sum` supports. In practice, it's very unlikely that a vessel will be wide enough to overflow a 32-bit signed integer, so we just cast it to `int`, and the `checked` keyword will throw an exception in the unlikely event that we encounter ship more than 2.1 billion metres wide.)
+
+### Average
+
+The standard LINQ operator `Average` effectively calculates the value that `Sum` would calculate, and then divides it by the value that `Count` would calculate. And once again, whereas most LINQ implementations would return a scalar, Rx's `Average` produces an observable.
+
+Although `Average` can process values of the same numeric types as `Sum`, the output type will be different in some cases. If the source is `IObservable<int>`, or if you use one of the overloads that takes a lambda that extracts the value from the source, and that lambda returns an `int`, the result will be a `double.` This is because the average of a set of whole numbers is not necessarily a whole number. Likewise, averaging `long` values produces a `double`. However, inputs of type `decimal` produce outputs of type `decimal`, and likewise `float` inputs produce a `float` output.
+
+As with `Sum`, if the inputs to `Average` are nullable, the output will be too.
+
+### Min and Max
+
+Rx implements the standard LINQ `Min` and `Max` operators which find the element with the highest or lowest value. As with all the other operators in this section, these do not return scalars, and instead return an `IObservable<T>` that produces a single value.
+
+Rx defines specialized implementations for the same numeric types that `Sum` and `Average` support. However, unlike those operators it also defines an overload that will accept source items of any type. When you use `Min` or `Max` on a source type where Rx does not define a specialized implementation, it uses [`Comparer<T>.Default`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.comparer-1.default) to compare items. There is also an overload enabling you to pass a comparer.
+
+As with `Sum` and `Average` there are overloads that accept a callback. If you use these overloads, `Min` and `Max` will invoke this callback for each source item, and will look for the lowest or highest value that your callback returns. Note that the single output they eventually produce will be a value returned by the callback, and not the original source item from which that value was derived. To see what that means, look at this example:
+
+```csharp
+IObservable<int> widthOfWidestVessel = vesselDimensions
+    .Take(10)
+    .Max(dimensions => 
+            checked((int)(dimensions.DimensionToPort + dimensions.DimensionToStarboard)));
+```
+
+`Max` returns an `IObservable<int>` here, which will be the width of the widest vessel out of the next 10 messages that report vessel dimensions. But what if you didn't just want to see the width? What if you wanted the whole message?
+
+## MinBy and MaxBy
+
+Rx offers two subtle variations on `Min` and `Max`: `MinBy` and `MaxBy`. These are similar to the callback-based `Min` and `Max` we just saw that enable us to work with sequences of elements that are not numeric values, but which may have numeric properties. The difference is that instead of returning the minimum or maximum value, `MinBy` and `MaxBy` tell you which source element produced that value. For example, suppose that instead of just discovering the width of the widest ship, we wanted to know what ship that actually was:
+
+```csharp
+IObservable<IVesselDimensions> widthOfWidestVessel = vesselDimensions
+    .Take(10)
+    .MaxBy(dimensions => 
+              checked((int)(dimensions.DimensionToPort + dimensions.DimensionToStarboard)));
+```
+
+This is very similar to the example in the preceding section. We're working with a sequence where the element type is `IVesselDimensions`, so we've supplied a callback that extracts the value we want to use for comparison purposes. (The same callback as last time, in fact.) Just like `Max`, `MaxBy` is trying to work out which element produces the highest value when passed to this callback. It can't know which that is until the source completes. If the source hasn't completed yet, all it can know is the highest _yet_, but that might be exceeded by a future value. So as with all the other operators we've looked at in this chapter, this produces nothing until the source completes, which is why I've put a `Take(10)` in there.
+
+However, the type of sequence we get is different. `Max` returned an `IObservable<int>`, because it invokes the callback for every item in the source, and then produces the highest of the values that our callback returned. But with `MaxBy`, we get back an `IObservable<IVesselDimensions>` because `MaxBy` tells us which source element produced that value.
+
+Of course, there might be more than one item that has the highest width—there might be three equally large ships, for example. With `Max` this doesn't matter because it's only trying to return the actual value: it doesn't matter how many source items had the maximum value, because it's the same value in all cases. But with `MaxBy`  we get back the 
+original items that produce the maximum, and if there were three that all did this, we wouldn't want Rx to pick just one arbitrarily.
+
+So unlike the other aggregation operators we've seen so far, an observable returned by `MinBy` or `MaxBy` doesn't necessarily produce just a single value. It might produce several. You might ask whether it really is an aggregation operator, since it's not reducing the input sequence to one output. But it is reducing it to a single value: the minimum (or maximum) returned by the callback. It's just that it presents the result slightly differently. It produces a sequence based on the result of the aggregation process. You could think of it as a combination of aggregation and filtering: it performs aggregation to determine the minimum or maximum, and then filters the source sequence down just to the elements for which the callback produces that value.
+
+**Note**: LINQ to Objects also defines [`MinBy`](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.minby) and [`MaxBy`](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.maxby) methods, but they are slightly different. These LINQ to Objects versions do in fact arbitrarily pick a single source element—if there are multiple source values all producing the minimum (or maximum) result, LINQ to Objects gives you just one whereas Rx gives you all of them. Rx defined its versions of these operators years before .NET 6.0 added their LINQ to Objects namesakes, so if you're wondering why Rx does it differently, the real question is why did LINQ to Objects not follow Rx's precedent.
+
+## Simple Boolean Aggregation
+
+LINQ defines several standard operators that reduce entire sequences to a single boolean value.
+
+### Any
+
+The `Any` operator has two forms. The parameterless overload effectively asks the question "are there any elements in this sequence?" It returns an observable sequence that will produce a single value of `false` if the source completes without emitting any values. If the source does produce a value however, then when the first value is produced, the result sequence will immediately produce `true` and then complete. If the first notification it gets is an error, then it will pass that error on.
+
+```csharp
+var subject = new Subject<int>();
+subject.Subscribe(Console.WriteLine, () => Console.WriteLine("Subject completed"));
+var any = subject.Any();
+
+any.Subscribe(b => Console.WriteLine("The subject has any values? {0}", b));
+
+subject.OnNext(1);
+subject.OnCompleted();
+```
+
+Output:
+
+```
+1
+The subject has any values? True
+subject completed
+```
+
+If we now remove the OnNext(1), the output will change to the following
+
+```
+subject completed
+The subject has any values? False
+```
+
+In the case where the source does produce a value, `Any` immediately unsubscribes from it. So if the source wants to report an error, `Any` will only see this if that is the first notification it produces.
+
+```csharp
+var subject = new Subject<int>();
+subject.Subscribe(Console.WriteLine,
+    ex => Console.WriteLine("subject OnError : {0}", ex),
+    () => Console.WriteLine("Subject completed"));
+
+IObservable<bool> any = subject.Any();
+
+any.Subscribe(b => Console.WriteLine("The subject has any values? {0}", b),
+    ex => Console.WriteLine(".Any() OnError : {0}", ex),
+    () => Console.WriteLine(".Any() completed"));
+
+subject.OnError(new Exception());
+```
+
+Output:
+
+```
+subject OnError : System.Exception: Exception of type 'System.Exception' was thrown.
+.Any() OnError : System.Exception: Exception of type 'System.Exception' was thrown.
+```
+
+But if the source were to generate a value before an exception, e.g.:
+
+```csharp
+subject.OnNext(42);
+subject.OnError(new Exception());
+```
+
+we'd see this output instead:
+
+```
+42
+The subject has any values? True
+.Any() completed
+subject OnError : System.Exception: Exception of type 'System.Exception' was thrown.
+```
+
+Although the handler that subscribed directly to the source subject still sees the error, our `any` observable reported a value of `True` and then completed, meaning it did not report the error that followed.
+
+The `Any` method also has an overload that takes a predicate. This effectively asks a slightly different question: "are there any elements in this sequence that meet these criteria?" The effect is similar to using `Where` followed by the no-arguments form of `Any`.
+
+```csharp
+IObservable<bool> any = subject.Any(i => i > 2);
+// Functionally equivalent to 
+IObservable<bool> longWindedAny = subject.Where(i => i > 2).Any();
+```
+
+### All
+
+The `All` operator is similar to the `Any` method that takes a predicate, except that all values must satisfy the predicate. As soon as the predicate rejects a value, the observable returned by `All` produces a `false` value and then completes. If the source reaches its end without producing any elements that do not satisfy the predicate, then `All` will push `true` as its value. (A consequence of this is that if you use `All` on an empty sequence, the result will be a sequence that produces `true`. This is consistent with how `All` works in other LINQ providers, but it might be surprising for anyone not familiar with the formal logic convention known as [vacuous truth](https://en.wikipedia.org/wiki/Vacuous_truth).)
+
+Once `All` decides to produce a `false` value, it immediately unsubscribes from the source (just like `Any` does as soon as it determines that it can produce `true`.) If the source produces an error before this happens, the error will be passed along to the subscriber of the `All` method. 
+
+```csharp
+var subject = new Subject<int>();
+subject.Subscribe(Console.WriteLine, () => Console.WriteLine("Subject completed"));
+IEnumerable<bool> all = subject.All(i => i < 5);
+all.Subscribe(b => Console.WriteLine($"All values less than 5? {b}"));
+
+subject.OnNext(1);
+subject.OnNext(2);
+subject.OnNext(6);
+subject.OnNext(2);
+subject.OnNext(1);
+subject.OnCompleted();
+```
+
+Output:
+
+```
+1
+2
+6
+All values less than 5? False
+all completed
+2
+1
+subject completed
+```
+
+### IsEmpty
+
+The LINQ `IsEmpty` operator is logically the opposite of the no-arguments `Any` method. It returns `true` if and only if the source completes without producing any elements. If the source produces an item, `IsEmpty` produces `false` and immediately unsubscribes. If the source produces an error, this forwards that error.
+
+### Contains
+
+The `Contains` operator determines whether a particular element is present in a sequence. You could implement it using `Any`, just supplying a callback that compares each item with the value you're looking for. However, it will typically be slightly more succinct, and may be a more direct expression of intent to write `Contains`.
+
+```csharp
+var subject = new Subject<int>();
+subject.Subscribe(
+    Console.WriteLine, 
+    () => Console.WriteLine("Subject completed"));
+
+IEnumerable<bool> contains = subject.Contains(2);
+
+contains.Subscribe(
+    b => Console.WriteLine("Contains the value 2? {0}", b),
+    () => Console.WriteLine("contains completed"));
+
+subject.OnNext(1);
+subject.OnNext(2);
+subject.OnNext(3);
+    
+subject.OnCompleted();
+```
+
+Output:
+
+```
+1
+2
+Contains the value 2? True
+contains completed
+3
+Subject completed
+```
+
+There is also an overload to `Contains` that allows you to specify an implementation of `IEqualityComparer<T>` other than the default for the type. This can be useful if you have a sequence of custom types that may have some special rules for equality depending on the use case.
+
+## Build your own aggregations
+
+If the built-in aggregations described in the preceding sections do not meet your needs, you can build your own. Rx provides two different ways to do this.
+
+### Aggregate
+
+The `Aggregate` method is very flexible: it is possible to build any of the operators shown so far in this chapter with it. You supply it with a function, and it invokes that function once for every element. But it doesn't just pass the element into your function: it also provides a way for your function to _aggregate_ information. As well as the current element, it also passes in an _accumulator_. The accumulator can be any type you like—it will depend on what sort of information you're looking to accumulate. Whatever value your function returns becomes the new accumulator value, and it will pass that into the function along with the next element from the source. There are a few variations on this, but the simplest overload looks like this:
+
+```csharp
+IObservable<TSource> Aggregate<TSource>(
+    this IObservable<TSource> source, 
+    Func<TSource, TSource, TSource> accumulator)
+```
+
+If you wanted to produce your own version of `Count` for `int` values, you could do so by providing a function that just adds 1 for each value the source produces:
+
+```csharp
+IObservable<int> sum = source.Aggregate((acc, element) => acc + 1);
+```
+
+To understand exactly what this is doing, let's look at how `Aggregate` will call this lambda. To make that slightly easier to see, suppose we put that lambda in its own variable:
+
+```csharp
+Func<int, int, int> c = (acc, element) => acc + 1;
+```
+
+Now suppose the source produces an item with the value 100. `Aggregate` will invoke our function:
+
+```csharp
+c(0, 100) // returns 1
+```
+
+The first argument is the current accumulator. `Aggregate` has used `default(int)` for the initial accumulator value, which is 0. Our function returns 1, which becomes the new accumulator value. So if the source produces a second value, say, 200, `Aggregate` will pass the new accumulator, along with the second value from the source:
+
+```csharp
+c(1, 200) // returns 2
+```
+
+This particular function completely ignores its second argument (the element from the source). It just adds one to the accumulator each time. So the accumulator is nothing more than a record of the number of times our function has been called.
+
+Now let's look at how we might implement `Sum` using `Aggregate`:
+
+```csharp
+Func<int, int, int> s = (acc, element) => acc + element
+IObservable<int> sum = source.Aggregate(s);
+```
+
+For the first element, `Aggregate` will again pass the default value for our chosen accumulator type, `int`: 0. And it will pass the first element value. So again if the first element is 100 it does this:
+
+```csharp
+s(0, 100) // returns 100
+```
+
+And then if the second element is 200, `Aggregate` will make this call:
+
+```csharp
+s(100, 200) // returns 300
+```
+
+Notice that this time, the first argument was 100, because that's what the previous invocation of `s` returned. So in this case, after seeing elements 100 and 200, the accumulator's value is 300, which is the sum of all the elements.
+
+What if we want the initial accumulator value to be something other than `default(TAccumulator)`? There's an overload for that. For example, here's how we could implement something like `All` with `Aggregate`:
+
+```csharp
+IObservable<bool> all = source.Aggregate(true, (acc, element) => acc && element);
+```
+
+This isn't exactly equivalent to the real `All` by the way: it handles errors differently. `All` instantly unsubscribes from its source if it sees a single element that is `false`, because it knows that nothing else the source produces can possibly change the outcome. That means that if the source had been about to produce an error, it will no longer have the opportunity to do so because `All` unsubscribed. But `Aggregate` has no way of knowing that the accumulator has entered a state from which it can never leave, so it will remain subscribed to the source until the source completes (or until whichever code subscribed to the `IObservable<T>` returned by `Aggregate` unsubscribes). This means that if the source were to produce `true`, then `false`, `Aggregate` would, unlike `All`, remain subscribed to the source, so if the source goes on to call `OnError`, `Aggregate` will receive that error, and pass it on to its subscriber.
+
+Here's a way to think about `Aggregate` that some people find helpful. If your source produces the values 1 through 5, and if the function we pass to `Aggregate` is called `f`, then the value that `Aggregate` produces once the source completes will be this:
+
+```csharp
+T result = f(f(f(f(f(default(T), 1), 2), 3), 4), 5);
+```
+
+So in the case of our recreation of `Count`, the accumulator type was `int`, so that becomes:
+
+```csharp
+int sum = s(s(s(s(s(0, 1), 2), 3), 4), 5);
+// Note: Aggregate doesn't return this directly -
+// it returns an IObservable<int> that produces this value.
+```
+
+Rx's `Aggregate` doesn't perform all those invocations at once: it invokes the function each time the source produces an element, so the calculations will be spread out over time. If your callback is a _pure function_—one that is unaffected by global variables and other environmental factors, and which will always return the same result for any particular input—this doesn't matter. The result of `Aggregate` will be the same as if it had all happened in one big expression like the preceding example. But if your callback's behaviour is affected by, say, a global variable, or by the current contents of the filesystem, then the fact that it will be invoked when the source produces each value may be more significant.
+
+`Aggregate` has other names in some programming systems by the way. Some systems call it `reduce`. It is also often referred to as a _fold_. (Specifically a _left fold_. A right fold proceeds in reverse. Conventionally its function takes arguments in the reverse order, so it would look like `s(1, s(2, s(3, s(4, s(5, 0)))))`. Rx does not offer a built-in right fold. It would not be a natural fit because it would have to wait until it received the final element before it could begin, meaning it would need to hold onto every element in the entire sequence, and then evaluate the entire fold at once when the sequence completes.)
+
+You might have spotted that in my quest to re-implement some of the built-in aggregation operators, I went straight from `Sum` to `Any`. What about `Average`? It turns out we can't do that with the overloads I've shown you so far. And that's because `Average` needs to accumulate two pieces of information—the running total and the count—and it also needs to perform once final step right at the end: it needs to divide the total by the count. With the overloads shown so far, we can only get part way there:
+
+```csharp
+IObservable<int> nums = Observable.Range(1, 5);
+
+IObservable<(int Count, int Sum)> avgAcc = nums.Aggregate(
+    (Count: 0, Sum: 0),
+    (acc, element) => (Count: acc.Count + 1, Sum: acc.Sum + element));
+```
+
+This uses a tuple as the accumulator, enabling it to accumulate two values: the count and the sum. But the final accumulator value becomes the result, and that's not what we want. We're missing that final step that calculates the average by dividing the sum by the count. Fortunately, `Aggregate` offers a 3rd overload that enables us to provide this final step. We pass a second callback which will be invoked just once when the source completes. `Aggregate` passes the final accumulator value into this lambda, and then whatever it returns becomes the single item produced by the observable that `Aggregate` returns.
+
+```csharp
+IObservable<double> avg = nums.Aggregate(
+    (Count: 0, Sum: 0),
+    (acc, element) => (Count: acc.Count + 1, Sum: acc.Sum + element),
+    acc => ((double) acc.Sum) / acc.Count);
+```
+
+I've been showing how `Aggregate` can re-implement some of the built-in aggregation operators to illustrate that it is a powerful and very general operator. However, that's not what we use it for. `Aggregate` is useful precisely because it lets us define custom aggregation.
+
+For example, suppose I wanted to build up a list of the names of all the ships that have broadcast their details over AIS. Here's one way to do that:
+
+```csharp
+IObservable<IReadOnlySet<string>> allNames = vesselNames
+    .Take(10)
+    .Aggregate(
+        ImmutableHashSet<string>.Empty,
+        (set, name) => set.Add(name.VesselName));
+```
+
+I've used `ImmutableHashSet<string>` here because its usage patterns happen to fit `Aggregate` neatly. An ordinary `HashSet<string>` would also have worked, but is a little less convenient because its `Add` method doesn't return the set, so our function needs an extra statement to return the accumulated set:
+
+```csharp
+IObservable<IReadOnlySet<string>> allNames = vesselNames
+    .Take(10)
+    .Aggregate(
+        new HashSet<string>(),
+        (set, name) =>
+        {
+            set.Add(name.VesselName);
+            return set;
+        });
+```
+
+With either of these implementations, `vesselNames` will produce a single value that is a `IReadOnlySet<string>` containing each vessel name seen in the first 10 messages that report a name.
+
+I've had to fudge an issue in these last two examples. I've made them work over just the first 10 suitable messages to emerge. Think about what would happen if I didn't have the `Take(10)` in there. The code would compile, but we'd have a problem. The AIS message source I've been using in various examples is an endless source. Ships will continue to move around the oceans for the foreseeable future. Ais.NET does not contain any code designed to detect either the end of civilisation, or the invention of technologies that will render the use of ships obsolete, so it will never call `OnCompleted` on its subscribers. The observable returned by `Aggregate` reports nothing until its source either completes or fails. So if we remove that `Take(10)`, the behaviour would be identical `Observable.Never<IReadOnlySet<string>>`. I had to force the input to `Aggregate` to come to an end to make it produce something. But there is another way.
+
+### Scan
+
+While `Aggregate` allows us to reduce complete sequences to a single, final value, sometimes this is not what we need. If we are dealing with an endless source, we might want something more like a running total, updated each time we receive a value. The `Scan` operator is designed for exactly this requirement. The signatures for both `Scan` and `Aggregate` are the same; the difference is that `Scan` doesn't wait for the end of its input. It produces the aggregated value after every item.
+
+We can use this to build up a set of vessel names as in the preceding section, but with `Scan` we don't have to wait until the end. This will report the current list every time it receives a message containing a name:
+
+```csharp
+IObservable<IReadOnlySet<string>> allNames = vesselNames
+    .Scan(
+        ImmutableHashSet<string>.Empty,
+        (set, name) => set.Add(name.VesselName));
+```
+
+Note that this `allNames` observable will produce elements even if nothing has changed. If the accumulated set of names already contained the name that just emerged from `vesselNames`, the call to `set.Add` will do nothing, because that name will already be in the set. But `Scan` scan produces one output for each input, and doesn't care if the accumulator didn't change. Whether this matters will depend on what you are planning to do with this `allNames` observable, but if you need to, you can fix this easily with the [`DistinctUntilChanged` operator shown in chapter 5](05_Filtering.md#distinct-and-distinctuntilchanged).
+
+You could think of `Scan` as being a version of `Aggregate` that shows its working. If we wanted to see how the process of calculating an average aggregates the count and sum, we could write this:
+
+```csharp
+IObservable<int> nums = Observable.Range(1, 5);
+
+IObservable<(int Count, int Sum)> avgAcc = nums.Scan(
+    (Count: 0, Sum: 0),
+    (acc, element) => (Count: acc.Count + 1, Sum: acc.Sum + element));
+
+avgAcc.Dump("acc");
+```
+
+That produces this output:
+
+```
+acc-->(1, 1)
+acc-->(2, 3)
+acc-->(3, 6)
+acc-->(4, 10)
+acc-->(5, 15)
+acc completed
+```
+
+You can see clearly here that `Scan` is emitting the current accumulated values each time the source produces a value.
+
+Unlike `Aggregate`, `Scan` doesn't offer an overload taking a second function to transform the accumulator into the result. So we can see the tuple containing the count and sum here, but not the actual average value we want. But we can achieve that by using the [`Select`](06_Transformation.md#select) operator described in the [Transformation chapter](06_Transformation.md):
+
+```csharp
+IObservable<double> avg = nums.Scan(
+    (Count: 0, Sum: 0),
+    (acc, element) => (Count: acc.Count + 1, Sum: acc.Sum + element))
+    .Select(acc => ((double) acc.Sum) / acc.Count);
+
+avg.Dump("avg");
+```
+
+Now we get this output:
+
+```
+avg-->1
+avg-->1.5
+avg-->2
+avg-->2.5
+avg-->3
+avg completed
+```
+
+`Scan` is a more generalised operator than `Aggregate`. You could implement `Aggregate` by combining `Scan` with the [`TakeLast()` operator described in the Filtering chapter](05_Filtering.md#takelast).
+
+```csharp
+source.Aggregate(0, (acc, current) => acc + current);
+// is equivalent to 
+source.Scan(0, (acc, current) => acc + current).TakeLast();
+```
+
+Aggregation is useful for reducing volumes of data or combining multiple elements to produce averages, or other measures that incorporate information from multiple elements. But to perform some kinds of analysis we will also need to slice up or otherwise restructure our data before calculating aggregated values. So in the next chapter we'll look at the various mechanisms Rx offers for partitioning data.

+ 499 - 0
Rx.NET/Documentation/IntroToRx/08_Partitioning.md

@@ -0,0 +1,499 @@
+# Partitioning
+
+Rx can split a single sequence into multiple sequences. This can be useful for distributing items over many subscribers. When performing analytics, it can be useful to take aggregates on partitions. You may already be familiar with the standard LINQ operators `GroupBy`. Rx supports this, and also defines some of its own.
+
+## GroupBy
+
+The `GroupBy` operator allows you to partition your sequence just as `IEnumerable<T>`'s `GroupBy` operator does. Once again, the open source [Ais.Net project](https://github.com/ais-dotnet) can provide a useful example. Its [`ReceiverHost` class](https://github.com/ais-dotnet/Ais.Net.Receiver/blob/15de7b2908c3bd67cf421545578cfca59b24ed2c/Solutions/Ais.Net.Receiver/Ais/Net/Receiver/Receiver/ReceiverHost.cs) makes AIS messages available through Rx, defining a `Messages` property of type `IObservable<IAisMessage>`. This is a very busy source, because it reports every message it is able to access. For example, if you connect the receiver to the AIS message source generously provided by the Norwegian government, it produces a notification every time _any_ ship broadcasts an AIS message anywhere on the Norwegian coast. There are a lot of ships moving around Norway, so this is a bit of a firehose.
+
+If we know exactly which ships we're interested in, you saw how to filter this stream in the [Filtering chapter](05_Filtering.md). But what if we don't, and yet we still want to be able to perform processing relating to individual ships? For example, perhaps we'd like to discover any time any ship changes its `NavigationStatus` (which reports values such as `AtAnchor`, or `Moored`). The [`Distinct` and `DistinctUntilChanged` section of the Filtering chapter](05_Filtering.md#distinct-and-distinctuntilchanged) showed how to do exactly that, but it began by filtering the stream down to messages from a single ship. If we tried to use `DistinctUntilChanged` directly on the all-ships stream it will not produce meaningful information. If ship A is moored and ship B is at anchor, and if we receive alternative status messages from ship A and ship B, `DistinctUntilChanged` would report each message as a change in status, even though neither ship's status has changed.
+
+We can fix this by splitting the "all the ships" sequence into lots of little sequences:
+
+```csharp
+IObservable<IGroupedObservable<uint, IAisMessage>> perShipObservables = 
+   receiverHost.Messages.GroupBy(message => message.Mmsi);
+```
+
+This `perShipObservables` is an observable sequence of observable sequences. More specifically, it's an observable sequence of grouped observable sequences, but as you can see from [the definition of `IGroupedObservable<TKey, T>`](https://github.com/dotnet/reactive/blob/95d9ea9d2786f6ec49a051c5cff47dc42591e54f/Rx.NET/Source/src/System.Reactive/Linq/IGroupedObservable.cs#L18), a grouped observable is just a specialized kind of observable:
+
+```csharp
+public interface IGroupedObservable<out TKey, out TElement> : IObservable<TElement>
+{
+    TKey Key { get; }
+}
+```
+
+Each time `receiverHost.Message` reports an AIS message, the `GroupBy` operator will invoke the callback to find out which group this item belongs to. We refer to the value returned by the callback as the _key_, and `GroupBy` remembers each key it has already seen. If this is a new key, `GroupBy` creates a new `IGroupedObservable` whose `Key` property will be the value just returned by the callback. It emits this `IGroupedObservable` from the outer observable (the one we put in `perShipObservables`) and then immediately causes that new `IGroupedObservable` to emit the element (an `IAisMessage` in this example) that produced that key. But if the callback produces a key that `GroupBy` has seen before, it finds the `IGroupedObservable` that it already produced for that key, and causes that to emit the value.
+
+So in this example, the effect is that any time the `receiverHost` reports a message from a ship with we've not previously heard from, `perShipObservables` will emit a new observable that reports messages just for that ship. We could use this to report each time we learn about a new ship:
+
+```csharp
+perShipObservables.Subscribe(m => Console.WriteLine($"New ship! {m.Key}"));
+```
+
+But that doesn't do anything we couldn't have achieved with `Distinct`. The power of `GroupBy` is that we get an observable sequence for each ship here, so we can go on to set up some per-ship processing:
+
+```csharp
+IObservable<IObservable<IAisMessageType1to3>> shipStatusChangeObservables =
+    perShipObservables.Select(shipMessages => shipMessages
+        .OfType<IAisMessageType1to3>()
+        .DistinctUntilChanged(m => m.NavigationStatus)
+        .Skip(1));
+```
+
+This uses [`Select`](06_Transformation.md#select) (introduced in the Transformation chapter) to apply processing to each group that comes out of `perShipObservables`. Remember, each such group represents a distinct ship, so the callback we've passed to `Select` here will be invoked exactly once for each ship. This means it's now fine for us to use `DistinctUntilChanged`. The input this example supplies to `DistinctUntilChanged` is a sequence representing the messages from just one ship, so this will tell us when that ship changes its status. This is now able to do what we want because each ship gets its own instance of `DistinctUntilChanged`. `DistinctUntilChanged` always forwards the first event it receives—it only drops items when they are the same as the preceding item, and there is no preceding item in this case. But that is unlikely to be the right behaviour here. Suppose that the first message we see from some vessel named `A` reports a status of `Moored`. It's possible that immediately before we started running, it was in some different state, and that the very first report we received happened to represent a change in status. But it's more likely that it has been moored for some time before we started. We can't tell for certain, but the majority of status reports don't represent a change, so `DistinctUntilChanged`'s behaviour of always forwarding the first event is likely to be wrong here. So we use `Skip(1)` to drop the first message from each ship.
+
+At this point we have an observable sequence of observable sequences. The outer sequence produces a nested sequence for each distinct ship that it sees, and that nested sequence will report `NavigationStatus` changes for that particular ship.
+
+I'm going to make a small tweak:
+
+```csharp
+IObservable<IAisMessageType1to3> shipStatusChanges =
+    perShipObservables.SelectMany(shipMessages => shipMessages
+        .OfType<IAisMessageType1to3>()
+        .DistinctUntilChanged(m => m.NavigationStatus)
+        .Skip(1));
+```
+
+I've replaced `Select` with [`SelectMany`, also described in the Transformation chapter](06_Transformation.md#selectmany). As you may recall, `SelectMany` flattens nested observables back into a single flat sequence. You can see this reflected in the return type: now we've got just an `IObservable<IAisMessageType1to3>` instead of a sequence of sequences.
+
+Wait a second! Haven't I just undone the work that `GroupBy` did? I asked it to partition the events by vessel id, so why am I now recombining it back into a single, flat stream? Isn't that what I started with?
+
+It's true that the stream type has the same shape as my original input: this will be a single observable sequence of AIS messages. (It's a little more specialized—the element type is `IAisMessageType1to3`, because that's where I can get `NavigationStatus` from, but these all still implement `IAisMessage`.) And all the different vessels will be mixed together in this one stream. But I've not actually negated the work that `GroupBy` did. This marble diagram illustrates what's going on:
+
+![A marble diagram showing how an input observable named receiverHost.Messages is expanded into groups, processed, and then collapsed back into a single source. The input observable shows events from three different ships, 'A', 'B', and 'C'. Each event is labelled with the ship's reported status. All the messages from A report a status of Moored. B makes two AtAnchor status reports, followed by two UnderwayUsingEngine reports. C reports UnderwaySailing twice, then AtAnchor, and then UnderwaySailing again. The events from the three ships are intermingled—the order on the input line goes A, B, C, B, A, C, B, C, C, B, A. The next section is labelled as perShipObservables, and this shows the effect of grouping the events by vessel. The first line shows only the events from A, the second those from B, and the third those from C. The next section is labelled with the processing code from the preceding example, and shows three more observables, corresponding to the three groups in the preceding part of the diagram. But in this one, the source for A shows no events at all. The second line shows a single event for B, the first one where it reported UnderwayUsingEngine. And it shows two for C: the one where it reported AtAnchor, and then the one after that where it reported UnderwaySailing. The final line of the diagram is a single source, combining the events just described in the preceding section of the diagram.](GraphicsIntro/Ch08-Partitioning-Marbles-Status-Changes.svg)
+
+The `perShipObservables` section shows how `GroupBy` creates a separate observable for each distinct vessel. (This diagram shows three vessels, named `A`, `B`, and `C`. With the real source, there would be a lot more observables coming out of `GroupBy`, but the principle remains the same.) We do a bit of work on these group streams before flattening them. As already described, we use `DistinctUntilChanged` and `Skip(1)` to ensure we only produce an event when we know for certain that a vessel's status has changed. (Since we only ever saw `A` reporting a status of `Moored`, then as far as we know its status never changed, which is why its stream is completely empty.) Only then do we flatten it back into a single observable sequence.
+
+Marble diagrams need to be simple to fit on a page, so let's now take a quick look at some real output. This confirms that this is very different from the raw `receiverHost.Messages`. First, I need to attach a subscriber:
+
+```csharp
+shipStatusChanges.Subscribe(m => Console.WriteLine(
+   $"Vessel {((IAisMessage)m).Mmsi} changed status to {m.NavigationStatus} at {DateTimeOffset.UtcNow}"));
+```
+
+If I then let the receiver run for about ten minutes, I see this output:
+
+```
+Vessel 257076860 changed status to UnderwayUsingEngine at 23/06/2023 06:42:48 +00:00
+Vessel 257006640 changed status to UnderwayUsingEngine at 23/06/2023 06:43:08 +00:00
+Vessel 259005960 changed status to UnderwayUsingEngine at 23/06/2023 06:44:23 +00:00
+Vessel 259112000 changed status to UnderwayUsingEngine at 23/06/2023 06:44:33 +00:00
+Vessel 259004130 changed status to Moored at 23/06/2023 06:44:43 +00:00
+Vessel 257076860 changed status to NotDefined at 23/06/2023 06:44:53 +00:00
+Vessel 258024800 changed status to Moored at 23/06/2023 06:45:24 +00:00
+Vessel 258006830 changed status to UnderwayUsingEngine at 23/06/2023 06:46:39 +00:00
+Vessel 257428000 changed status to Moored at 23/06/2023 06:46:49 +00:00
+Vessel 257812800 changed status to Moored at 23/06/2023 06:46:49 +00:00
+Vessel 257805000 changed status to Moored at 23/06/2023 06:47:54 +00:00
+Vessel 259366000 changed status to UnderwayUsingEngine at 23/06/2023 06:47:59 +00:00
+Vessel 257076860 changed status to UnderwayUsingEngine at 23/06/2023 06:48:59 +00:00
+Vessel 257020500 changed status to UnderwayUsingEngine at 23/06/2023 06:50:24 +00:00
+Vessel 257737000 changed status to UnderwayUsingEngine at 23/06/2023 06:50:39 +00:00
+Vessel 257076860 changed status to NotDefined at 23/06/2023 06:51:04 +00:00
+Vessel 259366000 changed status to Moored at 23/06/2023 06:51:54 +00:00
+Vessel 232026676 changed status to Moored at 23/06/2023 06:51:54 +00:00
+Vessel 259638000 changed status to UnderwayUsingEngine at 23/06/2023 06:52:34 +00:00
+```
+
+The critical thing to understand here is that in the space of ten minutes, `receiverHost.Messages` produced _thousands_ of messages. (The rate varies by time of day, but it's typically over a thousand messages a minute. The code would have processed roughly ten thousand messages when I ran it to produce that output.) But as you can see, `shipStatusChanges` produced just 19 messages.
+
+This shows how Rx can tame high volume event sources in ways that are much more powerful than mere aggregation. We've not just reduced the data down to some statistical measure that can only provide an overview. Statistical measures such as averages or variance are often very useful, but they aren't always able to provide us with the domain-specific insights we want. They wouldn't be able to tell us anything about any particular ship for example. But here, every message tells us something about a particular ship. We've been able to retain that level of detail, despite the fact that we are looking at every ship. We've been able to instruct Rx to tell us any time any ship changes its status.
+
+It may seem like I'm making too big a deal of this, but it took so little effort to achieve this result that it can be easy to miss just how much work Rx is doing for us here. This code does all of the following:
+
+- monitors every single ship operating in Norwegian waters
+- provides per-ship information
+- reports events at a rate that a human could reasonably cope with
+
+It can take thousands of messages and perform the necessary processing to find the handful that really matter to us.
+
+This is an example of the "fanning out, and then back in again" technique I described in ['The Significance of SelectMany' in the Transformation chapter](06_Transformation.md#the-significance-of-selectmany). This code uses `GroupBy` to fan out from a single observable to multiple observables. The key to this step is to create nested observables that provide the right level of detail for the processing we want to do. In this example that level of detail was "one specific ship" but it wouldn't have to be. You could imagine wanting to group messages by region—perhaps we're interesting in comparing different ports, so we'd want to partition the source based on whichever port a vessel is closest to, or perhaps by its destination port. (AIS provides a way for vessels to broadcast their intended destination.) Having partitioned the data by whatever criteria we require, we then define the processing to be applied for each group. In this case, we just watched for changes to `NavigationStatus`. This step will typically be where the reduction in volume happens. For example, most vessels will only change their `NavigationStatus` a few times a day at most. Having then reduced the notification stream to just those events we really care about, we can combine it back into a single stream that provides the high-value notifications we want.
+
+This power comes at a cost, of course. It didn't take much code to get Rx to do this work for us, but we're causing it to work reasonably hard: it needs to remember every ship it has seen so far, and to maintain an observable source for each one. If our data source has broad enough reach to receive messages from tens of thousands of vessel, Rx will need to maintain tens of thousands of observable sources, one for each vessel. The example shown has nothing resembling an inactivity timeout—a vessel broadcasting even a single message will be remembered for as long as the program runs. (A malicious actor fabricating AIS messages each with a different made up identifier would eventually cause this code to crash by running out of memory.) Depending on your data sources you might need to take steps to avoid unbounded growth of memory usage, so real examples can become more complex than this, but the basic approach is powerful.
+
+Now that we've seen an example, let's look at `GroupBy` in a bit more detail. It comes in a few different flavours. We just used this overload:
+
+```csharp
+public static IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector)
+```
+
+That overload uses whatever the default comparison behaviour is for your chosen key type. In our case we used `uint` (the type of the `Mmsi` property that uniquely identifies a vessel in an AIS message), which is just a number, so it's an intrinsically comparable type. In some cases you might want non-standard comparison. For example, if you use `string` as a key, you might want to be able to specify a locale-specific case-insensitive comparison. For these scenarios, there's an overload that takes a comparer:
+
+```csharp
+public static IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector, 
+    IEqualityComparer<TKey> comparer)
+```
+
+There are two more overloads that extend the preceding two with an `elementSelector` argument:
+
+```csharp
+public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector, 
+    Func<TSource, TElement> elementSelector)
+{...}
+
+public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector, 
+    Func<TSource, TElement> elementSelector, 
+    IEqualityComparer<TKey> comparer)
+{...}
+```
+
+This is functionally equivalent to using the `Select` operator after `GroupBy`.
+
+By the way, when using `GroupBy` you might be tempted to `Subscribe` directly to the nested observables:
+
+```csharp
+// Don't do it this way. Use the earlier example.
+perShipObservables.Subscribe(shipMessages =>
+  shipMessages
+    .OfType<IAisMessageType1to3>()
+    .DistinctUntilChanged(m => m.NavigationStatus)
+    .Skip(1)
+    .Subscribe(m => Console.WriteLine(
+    $"Ship {((IAisMessage)m).Mmsi} changed status to {m.NavigationStatus} at {DateTimeOffset.UtcNow}")));
+```
+
+This may seem to have the same effect: `perShipObservables` here is the sequence returned by `GroupBy`, so it will produce a observable stream for each distinct ship. This example subscribes to that, and then uses the same operators as before on each nested sequence, but instead of collecting the results out into a single output observable with `SelectMany`, this explicitly calls `Subscribe` for each nested stream.
+
+This might seem like a more natural way to work if you're unfamiliar with Rx. But although this will seem to produce he same behaviour, it introduces a problem: Rx doesn't understand that these nested subscriptions are associated with the outer subscription. That won't necessarily cause a problem in this simple example, but it could if we start using additional operators. Consider this modification:
+
+```csharp
+IDisposable sub = perShipObservables.Subscribe(shipMessages =>
+  shipMessages
+    .OfType<IAisMessageType1to3>()
+    .DistinctUntilChanged(m => m.NavigationStatus)
+    .Skip(1)
+    .Finally(() => Console.WriteLine($"Nested sub for {shipMessages.Key} ending"))
+    .Subscribe(m => Console.WriteLine(
+    $"Ship {((IAisMessage)m).Mmsi} changed status to {m.NavigationStatus} at {DateTimeOffset.UtcNow}")));
+```
+
+I've added a `Finally` operator for the nested sequence. This enables us to invoke a callback when a sequence comes to an end for any reason. But even if we unsubscribe from the outer sequence (by calling `sub.Dispose();`) this `Finally` will never do anything. That's because Rx has no way of knowing that these inner subscriptions are part of the outer one.
+
+If we made the same modification to the earlier version, in which these nested sequences were collected into one output sequence by `SelectMany`, Rx understands that subscriptions to the inner sequence exist only because of the subscription to the sequence returned by `SelectMany`. (In fact, `SelectMany` is what subscribes to those inner sequences.) So if we unsubscribe from the output sequence in that example, it will correctly run any `Finally` callbacks on any inners sequences.
+
+More generally, if you have lots of sequences coming into existence as part of a single processing chain, it is usually better to get Rx to manage the process from end to end.
+
+## Buffer
+
+The `Buffer` operator is useful if you need to deal with events in batches. This can be useful for performance, especially if you're storing data about events. Take the AIS example. If you wanted to log notifications to a persistent store, the cost of storing a single record is likely to be almost identical to the cost of storing several. Most storage devices operate with blocks of data often several kilobytes in size, so the amount of work required to store a single byte of data is often identical to the amount of work required to store several thousand bytes. The pattern of buffering up data until we have a reasonably large chunk of work crops up all the time in programming. The .NET runtime library's `Stream` class has built-in buffering for exactly this reason, so it's no surprise that it's built into Rx.
+
+Efficiency concerns are not the only reason you might want to process multiple events in one batch instead of individual ones. Suppose you wanted to generate a stream of continuously updated statistics about some source of data. By carving the source into chunks with `Buffer`, you can calculate, say, an average over the last 10 events.
+
+`Buffer` can partition the elements from a source stream, so it's a similar kind of operator to `GroupBy`, but there are a couple of significant differences. First, `Buffer` doesn't inspect the elements to determine how to partition them—it partitions purely based on the order in which elements emerge. Second, `Buffer` waits until it has completely filled a partition, and then presents all of the elements as an `IList<T>`. This can make certain tasks a lot easier because everything in the partition is available for immediate use—values aren't buried in a nested `IObservable<T>`. Third, `Buffer` offers some overloads that make it possible for a single element to turn up in more than one 'partition'. (In this case, `Buffer` is no longer strictly partitioning the data, but as you'll see, it's just a small variation on the other behaviours.)
+
+The simplest way to use `Buffer` is to gather up adjacent elements into chunks. (LINQ to Objects now has an equivalent operator that it calls [`Chunk`](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.chunk). The reason Rx didn't use the same name is that Rx introduced this operator over 10 years before LINQ to Objects did. So the real question is why LINQ to Objects chose a different name. It might be because `Chunk` doesn't support all of the variations that Rx's `Buffer` does, but you'd need to ask the .NET runtime library team.) This overload of `Buffer` takes a single argument, indicating the chunk size you would like:
+
+```csharp
+public static IObservable<IList<TSource>> Buffer<TSource>(
+    this IObservable<TSource> source, 
+    int count)
+{...}
+```
+
+This example uses it to split navigation messages into chunks of 4, and then goes on to calculate the average speed across those 4 readings:
+
+```csharp
+IObservable<IList<IVesselNavigation>> navigationChunks = 
+   receiverHost.Messages.Where(v => v.Mmsi == 235009890)
+                        .OfType<IVesselNavigation>()
+                        .Where(n => n.SpeedOverGround.HasValue)
+                        .Buffer(4);
+
+IObservable<float> recentAverageSpeed = 
+    navigationChunks.Select(chunk => chunk.Average(n => n.SpeedOverGround.Value));
+```
+
+If the source completes, and has not produced an exact multiple of the chunk size, the final chunk will be smaller. We can see this with the following more artificial example:
+
+```csharp
+Observable
+    .Range(1, 5)
+    .Buffer(2)
+    .Select(chunk => string.Join(", ", chunk))
+    .Dump("chunks");
+```
+
+As you can see from this output, the final chunk has just a single item, even though we asked for 2 at a time:
+
+```
+chunks-->1, 2
+chunks-->3, 4
+chunks-->5
+chunks completed
+```
+
+`Buffer` had no choice here because the source completed, and if it hadn't produced that final under-sized chunk, we would never have seen the final item. But apart from this end-of-source case, this overload of `Buffer` waits until it has collected enough elements to fill a buffer of the specified size before passing it on. That means that `Buffer` introduces a delay. If source items are quite far apart (e.g., when a ship is not moving it might only report AIS navigation data every few minutes) this can lead to long delays.
+
+In some cases, we might want to handle multiple events in a batch when a source is busy without having to wait a long time when the source is operating more slowly. This would be useful in a user interface. If you want to provide fresh information, it might be better to accept an undersized chunk so that you can provide more timely information. For these scenarios, `Buffer` offers overloads that accept a `TimeSpan`:
+
+```csharp
+public static IObservable<IList<TSource>> Buffer<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan timeSpan)
+{...}
+
+public static IObservable<IList<TSource>> Buffer<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan timeSpan, 
+    int count)
+{...}
+```
+
+The first of these partitions the source based on nothing but timing. This will emit one chunk every second no matter the rate at which `source` produces value:
+
+```csharp
+IObservable<IList<string>> output = source.Buffer(TimeSpan.FromSeconds(1));
+```
+
+If `source` happened to emit no values during any particular chunk's lifetime, `output` will emit an empty list.
+
+The second overload, taking both a `timespan` and a `count`, essentially imposes two upper limits: you'll never have to wait longer than `timespan` between chunks, and you'll never receive a chunk with more than `count` elements. As with the `timespan`-only overload, this can deliver under-full and even empty chunks if the source doesn't produce elements fast enough to fill the buffer within the time specified.
+
+### Overlapping buffers
+
+In the preceding section, I showed an example that collected chunks of 4 `IVesselNavigation` entries for a particular vessel, and calculated the average speed. This sort of averaging over multiple samples can be a useful way of smoothing out slight random variations in readings. So the goal in this case wasn't to process items in batches for efficiency, it was to enable a particular kind of calculation.
+
+But there was a problem with the example: because it was averaging 4 readings, it produced an output only once every 4 input messages. And since vessels might report their speed only once every few minutes if they are not moving, we might be waiting a very long time.
+
+There's an overload of `Buffer` that enables us to do a little better: instead of averaging the first 4 readings, and then the 4 readings after that, and then the 4 after that, and so on, we might want to calculate the average of the last 4 readings _every time the vessel reports a new reading.
+
+This is sometimes called a sliding window. We want to process readings 1, 2, 3, 4, then 2, 3, 4, 5, then 3, 4, 5, 6, and so on. There's an overload of buffer that can do this. This example shows the first statement from the earlier average speed example, but with one small modification:
+
+```csharp
+IObservable<IList<IVesselNavigation>> navigationChunks = receiverHost.Messages
+    .Where(v => v.Mmsi == 235009890)
+    .OfType<IVesselNavigation>()
+    .Where(n => n.SpeedOverGround.HasValue)
+    .Buffer(4, 1);
+```
+
+This calls an overload of `Buffer` that takes two `int` arguments. The first does the same thing as before: it indicates that we want 4 items in each chunk. But the second argument indicates how often to produce a buffer. This says we want a buffer for every `1` element (i.e., every single element) that the source produces. (The overload that accepts just a `count` is equivalent to passing the same value for both arguments to this overload.)
+
+So this will wait until the source has produce 4 suitable messages (i.e., messages that satisfy the `Where` and `OfType` operators here) and will then report those first four readings in the first `IList<VesselNavigation>` to emerge from `navigationChunks`. But the source only has to produce one more suitable message, and then this will emit another `IList<VesselNavigation>`, containing 3 of the same value as were in the first chunk, and then the new value. When the next suitable message emerges, this will emit another list with the 3rd, 4th, 5th, and 6th messages, and so on.
+
+This marble diagram illustrates the behaviour for `Buffer(4, 1)`.
+
+![A marble diagram showing two sequences. The first is labelled "Range(1,6)" and shows the numbers 1 to 6. The second is labelled ".Buffer(4,1)", and it shows three events. The colour coding and horizontal position indicate that these emerge at the same time as he final three events in the top diagram. The first event on this second sequence contains a list of numbers, "1,2,3,4", the second shows "2,3,4,5" and the third shows "3,4,5,6".](GraphicsIntro/Ch08-Partitioning-Marbles-Buffer-Marbles.svg)
+
+If we fed this into the same `recentAverageSpeed` expression as the earlier example, we'd still get no output until the 4th suitable message emerges from the source, but from then on, every single suitable message to emerge from the source will emit a new average value. These average values will still always report the average of the 4 most recently reported speeds, but we will now get these averages four times as often.
+
+We could also use this to improve the example earlier that reported when ships changed their `NavigationStatus`. The last example told you what state a vessel had just entered, but this raises an obvious question: what state was it in before? We can use `Buffer(2, 1)` so that each time we see a message indicating a change in status, we also have access to the preceding change in status:
+
+```csharp
+IObservable<IList<IAisMessageType1to3>> shipStatusChanges =
+    perShipObservables.SelectMany(shipMessages => shipMessages
+        .OfType<IAisMessageType1to3>()
+        .DistinctUntilChanged(m => m.NavigationStatus)
+        .Buffer(2, 1));
+
+IDisposable sub = shipStatusChanges.Subscribe(m => Console.WriteLine(
+    $"Ship {((IAisMessage)m[0]).Mmsi} changed status from" +
+    $" {m[1].NavigationStatus} to {m[1].NavigationStatus}" +
+    $" at {DateTimeOffset.UtcNow}"));
+```
+
+As the output shows, we can now report the previous state as well as the state just entered:
+
+```
+Ship 259664000 changed status from UnderwayUsingEngine to Moored at 30/06/2023
+ 13:36:39 +00:00
+Ship 257139000 changed status from AtAnchor to UnderwayUsingEngine at 30/06/20
+23 13:38:39 +00:00
+Ship 257798800 changed status from UnderwayUsingEngine to Moored at 30/06/2023
+ 13:38:39 +00:00
+```
+
+This change enabled us to remove the `Skip`. The earlier example had that because we can't tell whether the first message we receive from any particular ship after startup represents a change. But since we're telling `Buffer` we want pairs of messages, it won't give us anything for any single ship until it has seen messages with two different statuses.
+
+You can also ask for a sliding window defined by time instead of counts using this overload:
+
+```csharp
+public static IObservable<IList<TSource>> Buffer<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan timeSpan, 
+    TimeSpan timeShift)
+{...}
+```
+
+The `timeSpan` determines the length of time covered by each window, and the `timeShift` determines the interval at which new windows are started.
+
+## Window
+
+The `Window` operator is very similar to the `Buffer`. It can split the input into chunks based either on element count or time, and it also offers support for overlapping windows. However, it has a different return type. Whereas using `Buffer` on an `IObservable<T>` will return an `IObservable<IList<T>>`, `Window` will return an `IObservable<IObservable<T>>`. This means that `Window` doesn't have to wait until it has filled a complete buffer before producing anything. You could say that `Window` more fully embraces the reactive paradigm than `Buffer`. Then again after some experience you might conclude that `Window` is harder to use than `Buffer` but is very rarely any more useful in practice.
+
+Because `Buffer` returns an `IObservable<IList<T>>`, it can't produce a chunk until it has all of the elements that will go into that chunk. `IList<T>` supports random access—you can ask it how many elements it has, and you can retrieve any element by numeric index, and we expect these operations to complete immediately. (It would be technically possible to write an implementation of `IList<T>` representing as yet unreceived data, and to make its `Count` and indexer properties block if you try to use them before that data is available, but this would be a strange thing to do. Developers expect lists to return information immediately, and the lists produced by Rx's `Buffer` meet that expectation.) So if you write, say, `Buffer(4)`, it can't produce anything until it has all 4 items that will constitute the first chunk.
+
+But because `Window` returns an observable that produces a nested observable to represent each chunk, it can emit that before necessarily having all of the elements. In fact, it emits a new window as soon as it knows it will need one. If you use `Window(4, 1)` for example, the observable it returns emits its first nested observable immediately. And then as soon as the source produces its first element, that nested observable will emit that element, and then the second nested observable will be produced. We passed `1` as the 2nd argument to `Window`, so we get a new window for every element the source produces. As soon as the first element has been emitted, the next item the source emits will appear in the second window (and also the first, since we've specified overlapping windows in this case), so the second window is effectively _open_ from immediately after the emergence of the first element. So the `IObservable<IObservable<T>>` that `Window` return produces a new `IObservable<T>` at that point.
+
+Nested observables produce their items as and when they become available. They complete once `Window` knows there will be no further items in that window (i.e., at exactly the same point `Buffer` would have produced the completed `IList<T>` for that window.)
+
+`Window` can seem like it is better than `Buffer` because it lets you get your hands on the individual items in a chunk the instant they are available. However, if you were doing calculations that required access to every single item in the chunk, this doesn't necessarily help you. You're not going to be able to complete your processing until you've received every item in the chunk, so you're not going to produce a final result any earlier, and your code might be more complicated because it can no longer count on having an `IList<T>` conveniently making all of the items available at once. However, if you're calculating some sort of aggregation over the items in a chunk, `Window` might be more efficient because it enables you to process each item as it emerges and then discard it. If a chunk is very large, `Buffer` would have to hold onto every item until the chunk completes, which might use more memory. Moreover, in cases where you don't necessarily need to see every item in a chunk before you can do something useful with those items, `Window` might enable you to avoid introducing processing delays.
+
+`Window` doesn't help us in the AIS `NavigationStatus` example, because the goal there was to report both the _before_ and _after_ status for each change. We can't do that until we know what the _after_ value is, so we would get no benefit from receiving the _before_ value earlier. We need the second value to do what we're trying to do, so we might as well use `Buffer` because it's easier. But if you wanted to keep track of the number of distinct vessels that have reported movement so far today, `Window` would be an appropriate mechanism: you could set it up to produce one window per day, and you would be able to start seeing information within each window without needing to wait until the end of the day.
+
+In addition to supporting simple count-based or duration-based splitting, there are more flexible ways to define the window boundaries, such as this overload:
+
+```csharp
+// Projects each element of an observable sequence into consecutive non-overlapping windows.
+// windowClosingSelector : A function invoked to define the boundaries of the produced 
+// windows. A new window is started when the previous one is closed.
+public static IObservable<IObservable<TSource>> Window<TSource, TWindowClosing>
+(
+    this IObservable<TSource> source, 
+    Func<IObservable<TWindowClosing>> windowClosingSelector
+)
+```
+
+The first of these complex overloads allows us to control when windows close. The `windowClosingSelector` function is called each time a window is created, and each windows will close when the corresponding sequence from the `windowClosingSelector` produces a value. The value is disregarded so it doesn't matter what type the sequence values are; in fact you can just complete the sequence from `windowClosingSelector` to close the window instead.
+
+In this example, we create a window with a closing selector. We return the same subject from that selector every time, then notify from the subject whenever a user presses enter from the console.
+
+```csharp
+int windowIdx = 0;
+IObservable<long> source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
+var closer = new Subject<Unit>();
+source.Window(() => closer)
+      .Subscribe(window =>
+       {
+           int thisWindowIdx = windowIdx++;
+           Console.WriteLine("--Starting new window");
+           string windowName = $"Window{thisWindowIdx}";
+           window.Subscribe(
+              value => Console.WriteLine("{0} : {1}", windowName, value),
+              ex => Console.WriteLine("{0} : {1}", windowName, ex),
+              () => Console.WriteLine("{0} Completed", windowName));
+       },
+       () => Console.WriteLine("Completed"));
+
+string input = "";
+while (input != "exit")
+{
+    input = Console.ReadLine();
+    closer.OnNext(Unit.Default);
+}
+```
+
+Output (when I hit enter after '1' and '5' are displayed):
+
+```
+--Starting new window
+window0 : 0
+window0 : 1
+
+window0 Completed
+
+--Starting new window
+window1 : 2
+window1 : 3
+window1 : 4
+window1 : 5
+
+window1 Completed
+
+--Starting new window
+window2 : 6
+window2 : 7
+window2 : 8
+window2 : 9
+
+window2 Completed
+
+Completed
+```
+
+The most complex overload of `Window` allows us to create potentially overlapping windows.
+
+```csharp
+// Projects each element of an observable sequence into zero or more windows.
+// windowOpenings : Observable sequence whose elements denote the creation of new windows.
+// windowClosingSelector : A function invoked to define the closing of each produced window.
+public static IObservable<IObservable<TSource>> Window
+    <TSource, TWindowOpening, TWindowClosing>
+(
+    this IObservable<TSource> source, 
+    IObservable<TWindowOpening> windowOpenings, 
+    Func<TWindowOpening, IObservable<TWindowClosing>> windowClosingSelector
+)
+```
+
+This overload takes three arguments
+
+1. The source sequence
+2. A sequence that indicates when a new window should be opened
+3. A function that takes a window opening value, and returns a window closing sequence
+
+This overload offers great flexibility in the way windows are opened and closed. Windows can be largely independent from each other; they can overlap, vary in size and even skip values from the source.
+
+To ease our way into this more complex overload, let's first try to use it to recreate a simpler version of `Window` (the overload that takes a count). To do so, we need to open a window once on the initial subscription, and once each time the source has produced then specified count. The window needs to close each time that count is reached. To achieve this we only need the source sequence. We will be subscribing to it multiple times, but for some kinds of sources that might cause problems, so we do so via the [`Publish`](15_PublishingOperators.md#publish) operator, which enables multiple subscribers while making only one subscription to the underlying source.
+
+```csharp
+public static IObservable<IObservable<T>> MyWindow<T>(
+    this IObservable<T> source, 
+    int count)
+{
+    IObservable<T> shared = source.Publish().RefCount();
+    IObservable<int> windowEdge = shared
+        .Select((i, idx) => idx % count)
+        .Where(mod => mod == 0)
+        .Publish()
+        .RefCount();
+    return shared.Window(windowEdge, _ => windowEdge);
+}
+```
+
+If we now want to extend this method to offer skip functionality, we need to have two different sequences: one for opening and one for closing. We open a window on subscription and again after the `skip` items have passed. We close those windows after '`count`' items have passed since the window opened.
+
+```csharp
+public static IObservable<IObservable<T>> MyWindow<T>(
+    this IObservable<T> source, 
+    int count, 
+    int skip)
+{
+    if (count <= 0) throw new ArgumentOutOfRangeException();
+    if (skip <= 0) throw new ArgumentOutOfRangeException();
+
+    IObservable<T> shared = source.Publish().RefCount();
+    IObservable<int> index = shared
+        .Select((i, idx) => idx)
+        .Publish()
+        .RefCount();
+ 
+    IObservable<int> windowOpen = index.Where(idx => idx % skip == 0);
+    IObservable<int> windowClose = index.Skip(count-1);
+ 
+    return shared.Window(windowOpen, _ => windowClose);
+}
+```
+
+We can see here that the `windowClose` sequence is re-subscribed to each time a window is opened, due to it being returned from a function. This allows us to reapply the skip (`Skip(count-1)`) for each window. Currently, we ignore the value that the `windowOpen` pushes to the `windowClose` selector, but if you require it for some logic, it is available to you.
+
+As you can see, the `Window` operator can be quite powerful. We can even use `Window` to replicate other operators; for instance we can create our own implementation of `Buffer` that way. We can have the `SelectMany` operator take a single value (the window) to produce zero or more values of another type (in our case, a single `IList<T>`). To create the `IList<T>` without blocking, we can apply the `Aggregate` method and use a new `List<T>` as the seed.
+
+```csharp
+public static IObservable<IList<T>> MyBuffer<T>(this IObservable<T> source, int count)
+{
+    return source.Window(count)
+        .SelectMany(window => 
+            window.Aggregate(
+                new List<T>(), 
+                (list, item) =>
+                {
+                    list.Add(item);
+                    return list;
+                }));
+}
+```
+
+You might find it to be an interesting exercise to try implementing other time shifting methods, like `Sample` or `Throttle`, with `Window`.
+
+We've seen a few useful ways to spread a single stream of items across multiple output sequences, using either data-driven grouping criteria, or time-based chunking with either `Buffer` or `Window`. In the next chapter, we'll look at operators that can combine together data from multiple streams.

+ 0 - 777
Rx.NET/Documentation/IntroToRx/08_Transformation.md

@@ -1,777 +0,0 @@
----
-title: Transformation of sequences
----
-
-#Transformation of sequences			{#TransformationOfSequences}
-
-The values from the sequences we consume are not always in the format we need. 
-Sometimes there is too much noise in the data so we strip the values down. 
-Sometimes each value needs to be expanded either into a richer object or into more values. 
-By composing operators, Rx allows you to control the quality as well as the quantity of values in the observable sequences you consume.
-
-Up until now, we have looked at creation of sequences, transition into sequences, and, the reduction of sequences by filtering, aggregating or folding. 
-In this chapter we will look at _transforming_ sequences. 
-This allows us to introduce our third category of functional methods, _bind_. 
-A bind function in Rx will take a sequence and apply some set of transformations on each element to produce a new sequence.
-To review:
-
-<p class="centered">
-	*Ana(morphism) T --> IObservable<T>*
-</p>
-<p class="centered">
-	*Cata(morphism) IObservable<T> --> T*
-</p>
-<p class="centered">
-	*Bind IObservable<T1> --> IObservable<T2>*
-</p>
-
-Now that we have been introduced to all three of our higher order functions, you may find that you already know them. 
-Bind and Cata(morphism) were made famous by [MapReduce](http://en.wikipedia.org/wiki/MapReduce) framework from Google.
-Here Google refer to Bind and Cata by their perhaps more common aliases; Map and Reduce.
-
-It may help to remember our terms as the `ABCs` of higher order functions.
-
-<p class="centered">
-	*A*na enters the sequence. T --> IObservable<T>
-</p>
-<p class="centered">
-	*B*ind modifies the sequence. IObservable<T1> --> IObservable<T2>
-</p>
-<p class="centered">
-	*C*ata leaves the sequence. IObservable<T> --> T
-</p>
-
-##Select							{#Select}
-
-The classic transformation method is `Select`. 
-It allows you provide a function that takes a value of `TSource` and return a value of `TResult`.
-The signature for `Select` is nice and simple and suggests that its most common usage is to transform from one type to another type, i.e. `IObservable<TSource>` to `IObservable<TResult>`.
-
-	IObservable<TResult> Select<TSource, TResult>(
-		this IObservable<TSource> source, 
-		Func<TSource, TResult> selector)
-
-Note that there is no restriction that prevents `TSource` and `TResult` being the same thing. 
-So for our first example, we will take a sequence of integers and transform each value by adding 3, resulting in another sequence of integers.
-
-	var source = Observable.Range(0, 5);
-	source.Select(i=>i+3)
-		.Dump("+3")
-
-Output:
-
-<div class="output">
-	<div class="line">+3-->3</div>
-	<div class="line">+3-->4</div>
-	<div class="line">+3-->5</div>
-	<div class="line">+3-->6</div>
-	<div class="line">+3-->7</div>
-	<div class="line">+3 completed</div>
-</div>
-
-While this can be useful, more common use is to transform values from one type to another. 
-In this example we transform integer values to characters.
-
-	Observable.Range(1, 5);
-		.Select(i =>(char)(i + 64))
-		.Dump("char");
-
-Output:
-
-<div class="output">
-	<div class="line">char-->A</div>
-	<div class="line">char-->B</div>
-	<div class="line">char-->C</div>
-	<div class="line">char-->D</div>
-	<div class="line">char-->E</div>
-	<div class="line">char completed</div>
-</div>
-
-If we really want to take advantage of LINQ we could transform our sequence of integers	to a sequence of anonymous types.
-
-	Observable.Range(1, 5)
-		.Select(
-			i => new { Number = i, Character = (char)(i + 64) })
-		.Dump("anon");
-
-Output:
-
-<div class="output">
-	<div class="line">anon-->{ Number = 1, Character = A }</div>
-	<div class="line">anon-->{ Number = 2, Character = B }</div>
-	<div class="line">anon-->{ Number = 3, Character = C }</div>
-	<div class="line">anon-->{ Number = 4, Character = D }</div>
-	<div class="line">anon-->{ Number = 5, Character = E }</div>
-	<div class="line">anon completed</div>
-</div>
-
-To further leverage LINQ we could write the above query using [query comprehension syntax](http://www.albahari.com/nutshell/linqsyntax.aspx).
-
-	var query = from i in Observable.Range(1, 5)
-				select new {Number = i, Character = (char) (i + 64)};
-	query.Dump("anon");
-
-In Rx, `Select` has another overload. 
-The second overload provides two values to the `selector` function. 
-The additional argument is the element's index in the sequence. 
-Use this method if the index of the element in the sequence is important to your selector function.
-
-##Cast and OfType					{#CastAndOfType}
-
-If you were to get a sequence of objects i.e. `IObservable<object>`, you may find it less than useful. 
-There is a method specifically for `IObservable<object>` that will cast each element to a given type, and logically it is called `Cast<T>()`.
-
-	var objects = new Subject<object>();
-	objects.Cast<int>().Dump("cast");
-	objects.OnNext(1);
-	objects.OnNext(2);
-	objects.OnNext(3);
-	objects.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">cast-->1</div>
-	<div class="line">cast-->2</div>
-	<div class="line">cast-->3</div>
-	<div class="line">cast completed</div>
-</div>
-
-If however we were to add a value that could not be cast into the sequence then we get errors.
-
-	var objects = new Subject<object>();
-	objects.Cast<int>().Dump("cast");
-	objects.OnNext(1);
-	objects.OnNext(2);
-	objects.OnNext("3");//Fail
-
-Output:
-
-<div class="output">
-	<div class="line">cast-->1</div>
-	<div class="line">cast-->2</div>
-	<div class="line">cast failed -->Specified cast is not valid.</div>
-</div>
-
-Thankfully, if this is not what we want, we could use the alternative extension method `OfType<T>()`.
-
-	var objects = new Subject<object>();
-	objects.OfType<int>().Dump("OfType");
-	objects.OnNext(1);
-	objects.OnNext(2);
-	objects.OnNext("3");//Ignored
-	objects.OnNext(4);
-	objects.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">OfType-->1</div>
-	<div class="line">OfType-->2</div>
-	<div class="line">OfType-->4</div>
-	<div class="line">OfType completed</div>
-</div>
-
-It is fair to say that while these are convenient methods to have, we could have created them with the operators we already know about.
-
-	//source.Cast<int>(); is equivalent to
-	source.Select(i=>(int)i);
-	
-	//source.OfType<int>();
-	source.Where(i=>i is int).Select(i=>(int)i);
-
-##Timestamp and TimeInterval		{#TimeStampAndTimeInterval}
-
-As observable sequences are asynchronous it can be convenient to know timings for when elements are received. 
-The `Timestamp` extension method is a handy convenience method that wraps elements of a sequence in a light weight `Timestamped<T>` structure. 
-The `Timestamped<T>` type is a struct that exposes the value of the element it wraps, and the timestamp it was created with as a `DateTimeOffset`.
-
-In this example we create a sequence of three values, one second apart, and then transform it to a time stamped sequence. 
-The handy implementation of `ToString()` on `Timestamped<T>` gives us a readable output.
-
-	Observable.Interval(TimeSpan.FromSeconds(1))
-		.Take(3)
-		.Timestamp()
-		.Dump("TimeStamp");
-
-Output
-
-<div class="output">
-	<div class="line">TimeStamp-->0@01/01/2012 12:00:01 a.m. +00:00</div>
-	<div class="line">TimeStamp-->1@01/01/2012 12:00:02 a.m. +00:00</div>
-	<div class="line">TimeStamp-->2@01/01/2012 12:00:03 a.m. +00:00</div>
-	<div class="line">TimeStamp completed</div>
-</div>
-
-We can see that the values 0, 1 &amp; 2 were each produced one second apart. 
-An alternative to getting an absolute timestamp is to just get the interval since the last element. 
-The `TimeInterval` extension method provides this. 
-As per the `Timestamp` method, elements are wrapped in a light weight structure. 
-This time the structure is the `TimeInterval<T>` type.
-
-	Observable.Interval(TimeSpan.FromSeconds(1))
-			.Take(3)
-			.TimeInterval()
-			.Dump("TimeInterval");
-
-Output:
-
-<div class="output">
-	<div class="line">TimeInterval-->0@00:00:01.0180000</div>
-	<div class="line">TimeInterval-->1@00:00:01.0010000</div>
-	<div class="line">TimeInterval-->2@00:00:00.9980000</div>
-	<div class="line">TimeInterval completed</div>
-</div>
-
-As you can see from the output, the timings are not exactly one second but are pretty close.
-
-##Materialize and Dematerialize			{#MaterializeAndDematerialize}
-
-The `Timestamp` and `TimeInterval` transform operators can prove useful for logging and debugging sequences, so too can the `Materialize` operator.
-`Materialize` transitions a sequence into a metadata representation of the sequence, taking an `IObservable<T>` to an `IObservable<Notification<T>>`.
-The `Notification` type provides meta data for the events of the sequence.
-
-If we materialize a sequence, we can see the wrapped values being returned.
-
-	Observable.Range(1, 3)
-		.Materialize()
-		.Dump("Materialize");
-
-Output:
-
-<div class="output">
-	<div class="line">Materialize-->OnNext(1)</div>
-	<div class="line">Materialize-->OnNext(2)</div>
-	<div class="line">Materialize-->OnNext(3)</div>
-	<div class="line">Materialize-->OnCompleted()</div>
-	<div class="line">Materialize completed</div>
-</div>
-
-Note that when the source sequence completes, the materialized sequence produces an 'OnCompleted' notification value and then completes. 
-`Notification<T>` is an abstract class with three implementations:
-
- * OnNextNotification
- * OnErrorNotification
- * OnCompletedNotification
-
-`Notification<T>` exposes four public properties to help you discover it: `Kind`, `HasValue`, `Value` and `Exception`.
-Obviously only `OnNextNotification` will return true for `HasValue` and have a useful implementation of `Value`. 
-It should also be obvious that `OnErrorNotification` is the only implementation that will have a value for `Exception`. 
-The `Kind` property returns an `enum` which should allow you to know which methods are appropriate to use.
-
-	public enum NotificationKind
-	{
-		OnNext,
-		OnError,
-		OnCompleted,
-	}
-
-In this next example we produce a faulted sequence. 
-Note that the final value of the materialized sequence is an `OnErrorNotification`. 
-Also that the materialized sequence does not error, it completes successfully.
-
-	var source = new Subject<int>();
-	source.Materialize()
-		.Dump("Materialize");
-
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnNext(3);
-	source.OnError(new Exception("Fail?"));
-
-Output:
-
-<div class="output">
-	<div class="line">Materialize-->OnNext(1)</div>
-	<div class="line">Materialize-->OnNext(2)</div>
-	<div class="line">Materialize-->OnNext(3)</div>
-	<div class="line">Materialize-->OnError(System.Exception)</div>
-	<div class="line">Materialize completed</div>
-</div>
-
-Materializing a sequence can be very handy for performing analysis or logging of a sequence. 
-You can unwrap a materialized sequence by applying the `Dematerialize` extension method. 
-The `Dematerialize` will only work on `IObservable<Notification<TSource>>`.
-
-##SelectMany						{#SelectMany}
-
-Of the transformation operators above, we can see that `Select` is the most useful. 
-It allows very broad flexibility in its transformation output and can even be used to reproduce some of the other transformation operators. 
-The `SelectMany` operator however is even more powerful. 
-In LINQ and therefore Rx, the _bind_ method is `SelectMany`. 
-Most other transformation operators can be built with `SelectMany`. 
-Considering this, it is a shame to think that `SelectMany` may be one of the most misunderstood methods in LINQ.
-
-In my personal discovery of Rx, I struggled to grasp the `SelectMany` extension method. 
-One of my colleagues helped me understand `SelectMany` better by suggesting I think of it as <q>from one, select many</q>. 
-An even better definition is <q>From one, select zero or more</q>. 
-If we look at the signature for `SelectMany` we see that it takes a source sequence and a function as its parameters.
-
-	IObservable<TResult> SelectMany<TSource, TResult>(
-		this IObservable<TSource> source, 
-		Func<TSource, IObservable<TResult>> selector)
-
-The `selector` parameter is a function that takes a single value of `T` and returns a sequence. 
-Note that the sequence the `selector` returns does not have to be of the same type as the `source`. 
-Finally, the `SelectMany` return type is the same as the `selector` return type.
-
-This method is very important to understand if you wish to work with Rx effectively, so let's step through this slowly. 
-It is also important to note its subtle differences to `IEnumerable<T>`'s `SelectMany` operator, which we will look	at soon.
-
-Our first example will take a sequence with the single value '3' in it. 
-The selector function we provide will produce a further sequence of numbers. 
-This result sequence will be a range of numbers from 1 to the value provided i.e. 3. 
-So we take the sequence [3] and return the sequence [1,2,3] from our `selector` function.
-
-	Observable.Return(3)
-		.SelectMany(i => Observable.Range(1, i))
-		.Dump("SelectMany");
-
-Output:
-
-<div class="output">
-	<div class="line">SelectMany-->1</div>
-	<div class="line">SelectMany-->2</div>
-	<div class="line">SelectMany-->3</div>
-	<div class="line">SelectMany completed</div>
-</div>
-
-If we modify our source to be a sequence of [1,2,3] like this...
-
-	Observable.Range(1,3)
-		.SelectMany(i => Observable.Range(1, i))
-		.Dump("SelectMany");
-
-...we will now get an output with the result of each sequence ([1], [1,2] and [1,2,3]) flattened to produce [1,1,2,1,2,3].
-
-<div class="output">
-	<div class="line">SelectMany-->1</div>
-	<div class="line">SelectMany-->1</div>
-	<div class="line">SelectMany-->2</div>
-	<div class="line">SelectMany-->1</div>
-	<div class="line">SelectMany-->2</div>
-	<div class="line">SelectMany-->3</div>
-	<div class="line">SelectMany completed</div>
-</div>
-
-This last example better illustrates how `SelectMany` can take a `single` value and expand it to many values. 
-When we then apply this to a `sequence` of values, the result is each of the child sequences combined to produce the final sequence. 
-In both examples, we have returned a sequence that is the same type as the source. 
-This is not a restriction however, so in this next example we return a different type. 
-We will reuse the `Select` example of transforming an integer to an ASCII character. 
-To do this, the `selector` function just returns a char sequence with a single value.
-
-	Func<int, char> letter = i => (char)(i + 64);
-	Observable.Return(1)
-		.SelectMany(i => Observable.Return(letter(i)));
-		.Dump("SelectMany");
-
-So with the input of [1] we return a sequence of [A].
-
-<div class="output">
-	<div class="line">SelectMany-->A</div>
-	<div class="line">SelectMany completed</div>
-</div>
-
-Extending the source sequence to have many values, will give us a result with many values.
-
-	Func<int, char> letter = i => (char)(i + 64);
-	Observable.Range(1,3)
-		.SelectMany(i => Observable.Return(letter(i)))
-		.Dump("SelectMany");
-
-Now the input of [1,2,3] produces [[A], [B], [C]] which is flattened to just [A,B,C].
-
-<div class="output">
-	<div class="line">SelectMany-->A</div>
-	<div class="line">SelectMany-->B</div>
-	<div class="line">SelectMany-->C</div>
-</div>
-
-Note that we have effectively recreated the `Select` operator.
-
-The last example maps a number to a letter. 
-As there are only 26 letters, it would be nice to ignore values greater than 26. 
-This is easy to do. 
-While we must return a sequence for each element of the source, there aren't any rules that prevent it from being an empty sequence. 
-In this case if the element value is a number outside of the range 1-26 we return an empty sequence.
-
-	Func<int, char> letter = i => (char)(i + 64);
-	Observable.Range(1, 30)
-		.SelectMany(
-			i =>
-			{
-				if (0 < i &amp;&amp; i < 27)
-				{
-					return Observable.Return(letter(i));
-				}
-				else
-				{
-					return Observable.Empty<char>();
-				}
-			})
-		.Dump("SelectMany");
-
-Output:
-
-<div class="output">
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">C</div>
-	<div class="line">...</div>
-	<div class="line">X</div>
-	<div class="line">Y</div>
-	<div class="line">Z</div>
-	<div class="line">Completed</div>
-</div>
-
-To be clear, for the source sequence [1..30], the value 1 produced a sequence [A], the value 2 produced a sequence [B] and so on until value 26 produced a sequence [Z]. 
-When the source produced value 27, the `selector` function returned the empty sequence []. 
-Values 28, 29 and 30 also produced empty sequences. 
-Once all the sequences from the calls to the selector had been fattened to produce the final result, we end up with the sequence [A..Z].
-
-Now that we have covered the third of our three higher order functions, let us take time to reflect on some of the methods we have already learnt. 
-First we can consider the `Where` extension method. 
-We first looked at this method in the chapter on [Reducing a sequence](05_Filtering.html#Where). 
-While this method does reduce a sequence, it is not a fit for a functional _fold_ as the result is still a sequence. 
-Taking this into account, we find that `Where` is actually a fit for _bind_. 
-As an exercise, try to write your own extension method version of `Where` using the `SelectMany` operator. 
-Review the last example for some help...
-
-
-<hr style="page-break-after: always" />
-
-An example of a `Where` extension method written using `SelectMany`:
-
-	public static IObservable<T> Where<T>(this IObservable<T> source, Func<T, bool> predicate)
-	{
-		return source.SelectMany(
-			item =>
-			{
-				if (predicate(item))
-				{
-					return Observable.Return(item);
-				}
-				else
-				{
-					return Observable.Empty<T>();
-				}
-			});
-	}
-
-Now that we know we can use `SelectMany` to produce `Where`, it should be a natural progression for you the reader to be able to extend this to reproduce other filters like `Skip` and `Take`.
-
-As another exercise, try to write your own version of the `Select` extension method using `SelectMany`. 
-Refer to our example where we use `SelectMany` to convert `int` values into `char` values if you need some help...
-
-<hr style="page-break-after: always" />
-
-An example of a `Select` extension method written using `SelectMany`:
-
-	public static IObservable<TResult> MySelect<TSource, TResult>(
-		this IObservable<TSource> source, 
-		Func<TSource, TResult> selector)
-	{
-		return source.SelectMany(value => Observable.Return(selector(value)));
-	}
-
-###IEnumerable<T> vs. IObservable<T> SelectMany	{#IEnumerableVsIObservableSelectMany}
-
-It is worth noting the difference between the implementations of `IEnumerable<T>` `SelectMany` and `IObservable<T>` `SelectMany`. 
-Consider that `IEnumerable<T>` sequences are pull based and blocking. 
-This means that when an `IEnumerable<T>` is processed with a `SelectMany` it will pass one item at a time to the `selector` function and wait until it has processed all of the values from the `selector` before requesting (pulling) the next value from the source.
-
-Consider an `IEnumerable<T>` source sequence of [1,2,3]. 
-If we process that with a `SelectMany` operator that returns a sequence of [x*10, (x*10)+1,	(x*10)+2], we would get the [[10,11,12], [20,21,22], [30,31,32]].
-
-	private IEnumerable<int> GetSubValues(int offset)
-	{
-		yield return offset * 10;
-		yield return (offset * 10) + 1;
-		yield return (offset * 10) + 2;
-	}
-
-We then apply the `GetSubValues` method with the following code:
-
-	var enumerableSource = new [] {1, 2, 3};
-	var enumerableResult = enumerableSource.SelectMany(GetSubValues);
-	foreach (var value in enumerableResult)
-	{
-		Console.WriteLine(value);
-	}
-
-The resulting child sequences are flattened into [10,11,12,20,21,22,30,31,32].
-
-<div class="output">
-	<div class="line">10</div>
-	<div class="line">11</div>
-	<div class="line">12</div>
-	<div class="line">20</div>
-	<div class="line">21</div>
-	<div class="line">22</div>
-	<div class="line">30</div>
-	<div class="line">31</div>
-	<div class="line">32</div>
-</div>
-
-The difference with `IObservable<T>` sequences is that the call to the `SelectMany`'s `selector` function is not blocking and the result sequence can produce values over time. 
-This means that subsequent 'child' sequences can overlap. 
-Let us consider again a sequence of [1,2,3], but this time values are produced three second apart. 
-The `selector` function will also produce sequence of [x*10, (x*10)+1, (x*10)+2] as per the example above, however these values will be four seconds apart.
-
-To visualize this kind of asynchronous data we need to represent space and time.
-
-###Visualizing sequences			{#VisualizingSequences}
-
-Let's divert quickly and talk about a technique we will use to help communicate the concepts relating to sequences. 
-Marble diagrams are a way of visualizing sequences.
-Marble diagrams are great for sharing Rx concepts and describing composition of sequences. 
-When using marble diagrams there are only a few things you need to know
-
-
- 1. a sequence is represented by a horizontal line 
- 2. time moves to the right (i.e. things on the left happened before things on the right)
- 3. notifications are represented by symbols:
-   *. '0' for OnNext 
-   *. 'X' for an OnError 
-   *. '|' for OnCompleted 
- 4. many concurrent sequences can be visualized by creating rows of sequences
-
-This is a sample of a sequence of three values that completes:
-
-<div class="marble">
-	<pre class="line">--0--0--0-|</pre>
-</div>
-
-This is a sample of a sequence of four values then an error:
-
-<div class="marble">
-	<pre class="line">--0--0--0--0--X</pre>
-</div>
-
-Now going back to our `SelectMany` example, we can visualize our input sequence by using values in instead of the 0 marker. 
-This is the marble diagram representation
-of the sequence [1,2,3] spaced three seconds apart (note each character represents
-one second).
-
-<div class="marble">
-	<pre class="line">--1--2--3|</pre>
-</div>
-
-Now we can leverage the power of marble diagrams by introducing the concept of time and space. 
-Here we see the visualization of the sequence produced by the first value 1 which gives us the sequence [10,11,12]. 
-These values were spaced four seconds apart, but the initial value is produce immediately.
-
-<div class="marble">
-	<pre class="line">1---1---1|</pre>
-	<pre class="line">0   1   2|</pre>
-</div>
-
-As the values are double digit they cover two rows, so the value of 10 is not confused with the value 1 immediately followed by the value 0. 
-We add a row for each sequence produced by the `selector` function.
-
-<div class="marble">
-	<pre class="line">--1--2--3|</pre>
-	<pre class="line"> </pre>
-	<pre class="line" style="color: blue">  1---1---1|</pre>
-	<pre class="line" style="color: blue">  0   1   2|</pre>
-	<pre class="line"> </pre>
-	<pre class="line" style="color: red">     2---2---2|</pre>
-	<pre class="line" style="color: red">     0   1   2|</pre>
-	<pre class="line"></pre>
-	<pre class="line" style="color: green">        3---3---3|</pre>
-	<pre class="line" style="color: green">        0   1   2|</pre>
-</div>
-
-Now that we can visualize the source sequence and its child sequences, we should be able to deduce the expected output of the `SelectMany` operator.
-To create a result row for our marble diagram, we simple allow the values from each child sequence to 'fall' into the new result row.
-
-<div class="marble">
-	<pre class="line">--1--2--3|</pre>
-	<pre class="line"> </pre>
-	<pre class="line" style="color: blue">  1---1---1|</pre>
-	<pre class="line" style="color: blue">  0   1   2|</pre>
-	<pre class="line"> </pre>
-	<pre class="line" style="color: red">     2---2---2|</pre>
-	<pre class="line" style="color: red">     0   1   2|</pre>
-	<pre class="line"></pre>
-	<pre class="line" style="color: green">        3---3---3|</pre>
-	<pre class="line" style="color: green">        0   1   2|</pre>
-	<pre class="line"></pre>
-	<pre class="line">--<span style="color: blue">1</span>--<span style="color: red">2</span><span
-		style="color: blue">1</span>-<span style="color: green">3</span><span style="color: red">2</span><span
-			style="color: blue">1</span>-<span style="color: green">3</span><span style="color: red">2</span>--<span
-				style="color: green">3</span>|</pre>
-	<pre class="line">&nbsp;&nbsp;<span style="color: blue">0</span>&nbsp;&nbsp;<span
-		style="color: red">0</span><span style="color: blue">1</span>&nbsp;<span style="color: green">0</span><span
-			style="color: red">1</span><span style="color: blue">2</span>&nbsp;<span style="color: green">1</span><span
-				style="color: red">2</span>&nbsp;&nbsp;<span style="color: green">2</span>|</pre>
-	<pre class="line"></pre>
-</div>
-
-If we take this exercise and now apply it to code, we can validate our marble diagram.
-First our method that will produce our child sequences:
-
-	private IObservable<long> GetSubValues(long offset)
-	{
-		//Produce values [x*10, (x*10)+1, (x*10)+2] 4 seconds apart, but starting immediately.
-		return Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(4))
-			.Select(x => (offset*10) + x)
-			.Take(3);
-	}
-
-This is the code that takes the source sequence to produce our final output:
-
-	// Values [1,2,3] 3 seconds apart.
-	Observable.Interval(TimeSpan.FromSeconds(3))
-		.Select(i => i + 1) //Values start at 0, so add 1.
-		.Take(3)            //We only want 3 values
-		.SelectMany(GetSubValues) //project into child sequences
-		.Dump("SelectMany");
-
-The output produced matches our expectations from the marble diagram.
-
-<div class="output">
-	<div class="line">SelectMany-->10</div>
-	<div class="line">SelectMany-->20</div>
-	<div class="line">SelectMany-->11</div>
-	<div class="line">SelectMany-->30</div>
-	<div class="line">SelectMany-->21</div>
-	<div class="line">SelectMany-->12</div>
-	<div class="line">SelectMany-->31</div>
-	<div class="line">SelectMany-->22</div>
-	<div class="line">SelectMany-->32</div>
-	<div class="line">SelectMany completed</div>
-</div>
-
-We have previously looked at the `Select` operator when it is used in Query Comprehension Syntax, so it is worth noting how you use the `SelectMany` operator. 
-The `Select` extension method maps quite obviously to query comprehension syntax, `SelectMany` is not so obvious. 
-As we saw in the earlier example, the simple implementation of just suing select is as follows:
-
-	var query = from i in Observable.Range(1, 5)
-				select i;
-
-If we wanted to add a simple `where` clause we can do so like this:
-
-	var query = from i in Observable.Range(1, 5)
-				where i%2==0
-				select i;
-
-To add a `SelectMany` to the query, we actually add an extra `from` clause.
-
-	var query = from i in Observable.Range(1, 5)
-				where i%2==0
-				from j in GetSubValues(i)
-				select j;
-	//Equivalent to 
-	var query = Observable.Range(1, 5)
-					   .Where(i=>i%2==0)
-					   .SelectMany(GetSubValues);
-
-An advantage of using the query comprehension syntax is that you can easily access other variables in the scope of the query. 
-In this example we select into an anon type both the value from the source and the child value.
-
-	var query = from i in Observable.Range(1, 5)
-				where i%2==0
-				from j in GetSubValues(i)
-				select new {i, j};
-	query.Dump("SelectMany");
-
-Output
-
-<div class="output">
-	<div class="line">SelectMany-->{ i = 2, j = 20 }</div>
-	<div class="line">SelectMany-->{ i = 4, j = 40 }</div>
-	<div class="line">SelectMany-->{ i = 2, j = 21 }</div>
-	<div class="line">SelectMany-->{ i = 4, j = 41 }</div>
-	<div class="line">SelectMany-->{ i = 2, j = 22 }</div>
-	<div class="line">SelectMany-->{ i = 4, j = 42 }</div>
-	<div class="line">SelectMany completed</div>
-</div>
-
----
-
-<a name="Part2Summary"></a>
-
-This brings us to a close on Part 2. 
-The key takeaways from this were to allow you the reader to understand a key principal to Rx: functional composition. 
-As we move through Part 2, examples became progressively more complex. 
-We were leveraging the power of LINQ to chain extension methods together to compose complex queries.
-
-We didn't try to tackle all of the operators at once, we approached them in groups.
-
- * Creation
- * Reduction
- * Inspection
- * Aggregation
- * Transformation
-
-On deeper analysis of the operators we find that most of the operators are actually	specialization of the higher order functional concepts. 
-We named them the ABC's of functional programming:
-
-<ul>
-	<li>Anamorphism, aka:
-		<ul>
-			<li>Ana
-			<li>Unfold
-			<li>Generate
-		</ul>
-	
-	<li>Bind, aka:
-		<ul>
-			<li>Map
-			<li>SelectMany
-			<li>Projection
-			<li>Transform
-		</ul>
-	
-	<li>Catamorphism, aka:
-		<ul>
-			<li>Cata
-			<li>Fold
-			<li>Reduce
-			<li>Accumulate
-			<li>Inject
-		</ul>
-</ul>
-
-Now you should feel that you have a strong understanding of how a sequence can be manipulated. 
-What we have learnt up to this point however can all largely be applied to `IEnumerable` sequences too. 
-Rx can be much more complex than what many people will have dealt with in `IEnumerable` world, as we have seen with the `SelectMany` operator. 
-In the next part of the book we will uncover features specific to the asynchronous nature of Rx. 
-With the foundation we have built so far we should be able to tackle the far more challenging and interesting features of Rx.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 885 - 0
Rx.NET/Documentation/IntroToRx/09_CombiningSequences.md

@@ -0,0 +1,885 @@
+# Combining sequences
+
+Data sources are everywhere, and sometimes we need to consume data from more than just a single source. Common examples that have many inputs include: price feeds, sensor networks, news feeds, social media aggregators, file watchers, multi touch surfaces, heart-beating/polling servers, etc. The way we deal with these multiple stimuli is varied too. We may want to consume it all as a deluge of integrated data, or one sequence at a time as sequential data. We could also get it in an orderly fashion, pairing data values from two sources to be processed together, or perhaps just consume the data from the first source that responds to the request.
+
+Earlier chapters have also shown some examples of the _fan out and back in_ style of data processing, where we partition data, and perform processing on each partition to convert high-volume data into lower-volume higher-value events before recombining. This ability to restructure streams greatly enhances the benefits of operator composition. If Rx only enabled us to apply composition as a simple linear processing chain, it would be a good deal less powerful. Being able to pull streams apart gives us much more flexibility. So even when there is a single source of events, we often still need to combine multiple observable streams as part of our processing. Sequence composition enables you to create complex queries across multiple data sources. This unlocks the possibility to write some very powerful yet succinct code.
+
+We've already used [`SelectMany`](06_Transformation.md#selectmany) in earlier chapters. This is one of the fundamental operators in Rx. As we saw in the [Transformation chapter](06_Transformation.md), it's possible to build several other operators from `SelectMany`, and its ability to combine streams is part of what makes it powerful. But there are several more specialized combination operators available, which make it easier to solve certain problems than it would be using `SelectMany`. Also, some operators we've seen before (including `TakeUntil` and `Buffer`) have overloads we've not yet explored that can combine multiple sequences.
+
+## Sequential Combination
+
+We'll start with the simplest kind of combining operators, which do not attempt concurrent combination. They deal with one source sequence at a time.
+
+### Concat
+
+`Concat` is arguably the simplest way to combine sequences. It does the same thing as its namesake in other LINQ providers: it concatenates two sequences. The resulting sequence produces all of the elements from the first sequence, followed by all of the elements from the second sequence. The simplest signature for `Concat` is as follows.
+
+```csharp
+public static IObservable<TSource> Concat<TSource>(
+    this IObservable<TSource> first, 
+    IObservable<TSource> second)
+```
+
+Since `Concat` is an extension method, we can invoke it as a method on any sequence, passing the second sequence in as the only argument:
+
+```csharp
+IObservable<int> s1 = Observable.Range(0, 3);
+IObservable<int> s2 = Observable.Range(5, 5);
+IObservable<int> c = s1.Concat(s2);
+IDisposable sub = c.Subscribe(Console.WriteLine, x => Console.WriteLine("Error: " + x));
+```
+
+This marble diagram shows the items emerging from the two sources, `s1` and `s2`, and how `Concat` combines them into the result, `c`:
+
+![A marble diagram showing three sequences. The first, s1, produces the values 0, 1, and 2, and then completes shortly after. The second, s2 starts after s1 finishes, and produces the values 5, 6, 7, 8, and 9, and then completes. The final sequence, c, produces all of the values from s1 then s2, that is: 0, 1, 2, 5, 6, 7, 8, and 9. The positioning shows that each item in c is produced at the same time as the corresponding value from s1 or s2.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles.svg)
+
+Rx's `Concat` does nothing with its sources until something subscribes to the `IObservable<T>` it returns. So in this case, when we call `Subscribe` on `c` (the source returned by `Concat`) it will subscribe to its first input, `s1`, and each time that produces a value, the `c` observable will emit that same value to its subscriber. If we went on to call `sub.Dispose()` before `s1` completes, `Concat` would unsubscribe from the first source, and would never subscribe to `s2`. If `s1` were to report an error, `c` would report that same error to is subscriber, and again, it will never subscribe to `s2`. Only if `s1` completes will the `Concat` operator subscribe to `s2`, at which point it will forward any items that second input produces until either the second source completes or fails, or the application unsubscribes from the concatenated observable.
+
+Although Rx's `Concat` has the same logical behaviour as the [LINQ to Objects `Concat`](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.concat), there are some Rx-specific details to be aware of. In particular, timing is often more significant in Rx than with other LINQ implementations. For example, in Rx we distinguish between [_hot_ and _cold_ source](02_KeyTypes.md#hot-and-cold-sources). With a cold source it typically doesn't matter exactly when you subscribe, but hot sources are essentially live, so you only get notified of things that happen while you are subscribed. This can mean that hot sources might not be a good fit with `Concat` The following marble diagram illustrates a scenario in which this produces results that have the potential to surprise:
+
+![A marble diagram showing three sequences. The first, labelled 'cold', produces the values 0, 1, and 2, then completes. The second, labelled 'hot' produces values A, B, C, D, and E, but the positioning shows that these overlap partially with the 'cold' sequence. In particular, 'hot' produces A between items 0 and 1 from 'cold', and it produces B between 1 and 2, meaning that these A and B values occur before cold completes. The final sequence, labelled 'cold.Concat(hot)' shows all three values from 'cold' followed by only those values that 'hot' produced after 'cold' completes, i.e., just C, D, and E.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles.svg)
+
+Since `Concat` doesn't subscribe to its second input until the first has finished, it won't see the first couple of items that the `hot` source would deliver to any subscribers that been listening from the start. This might not be the behaviour you would expect: it certainly doesn't look like this concatenated all of the items from the first sequence with all of the items from the second one. It looks like it missed out `A` and `B` from `hot`.
+
+#### Marble Diagram Limitations
+
+This last example reveals that marble diagrams gloss over a detail: they show when a source starts, when it produces values, and when it finishes, but they ignore the fact that to be able to produce items at all, an observable source needs a subscriber. If nothing subscribes to an `IObservable<T>`, then it doesn't really produce anything. `Concat` doesn't subscribe to its second input until the first completes, so arguably instead of the diagram above, it would be more accurate to show this:
+
+![A marble diagram showing three sequences. The first, labelled 'cold', produces the values 0, 1, and 2, then completes. The second, labelled 'hot' produces values C, D, and E, and the positioning shows that these are produced after the 'cold' sequence completes. The final sequence, labelled 'cold.Concat(hot)' shows all three values from 'cold' followed by all three values from 'hot', i.e., 0, 1, 2, C, D, and E. This entirely diagram looks almost the same as the preceding one, except the 'hot' sequence doesn't produce the A or B values, and starts directly after 'cold' finishes.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles-SubOnly.svg)
+
+This makes it easier to see why `Concat` produces the output it does. But since `hot` is a hot source here, this diagram fails to convey the fact that `hot` is producing items entirely on its own schedule. In a scenario where `hot` had multiple subscribers, then the earlier diagram would arguably be better because it correctly reflects every event available from `hot` (regardless of however many listeners might be subscribed at any particular moment). But although this convention works for hot sources, it doesn't work for cold ones, which typically start producing items upon subscription. A source returned by [`Timer`](03_CreatingObservableSequences.md#observabletimer) produces items on a regular schedule, but that schedule starts at the instant when subscription occurs. That means that if there are multiple subscriptions, there are multiple schedules. Even if I have just a single `IObservable<long>` returned by `Observable.Timer`, each distinct subscriber will get items on its own schedule—subscribers receive events at a regular interval _starting from whenever they happened to subscribe_. So for cold observables, it typically makes sense to use the convention used by this second diagram, in which we're looking at the events received by one particular subscription to a source.
+
+Most of the time we can get away with ignoring this subtlety, quietly using whichever convention suits us. To paraphrase [Humpty Dumpty: when I use a marble diagram, it means just what I choose it to mean—neither more nor less](https://www.goodreads.com/quotes/12608-when-i-use-a-word-humpty-dumpty-said-in-rather). But when you're combining hot and cold sources together, there might not be one obviously best way to represent this in a marble diagram. We could even do something like this, where we describe the events that `hot` represents separately from the events seen by a particular subscription to `hot`.
+
+![This essentially combines the preceding two diagrams. It has the same first and last sequences. In between these it has a sequence labelled 'Events available from hot' which shows the same as the 'hot' sequence in the diagram before last. It then has a sequence labelled 'Concat subscription to hot' which shows the same as the 'hot' sequence from the preceding diagram.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles-SourceAndSub.svg)
+
+
+We're using a distinct 'lane' in the marble diagram to represent the events seen by a particular subscription to a source. With this technique, we can also show what would happen if you pass the same cold source into `Concat` twice:
+
+![A marble diagram showing three sequences. The first, labelled 'Concat subscription to cold', produces the values 0, 1, and 2, then completes. The second, also labelled 'Concat subscription to cold' produces the values again, but positioned to shows that these are produced after the first sequence completes. The final sequence, labelled 'cold.Concat(cold)' shows the values twice, i.e., 0, 1, 2, 0, 1, and 2.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles-Cold-Twice.svg)
+
+This highlights the fact that that being a cold source, `cold` provides items separately to each subscription. We see the same three values emerging from the same source, but at different times.
+
+#### Concatenating Multiple Sources
+
+What if you wanted to concatenate more than two sequences? `Concat` has an overload accepting multiple observable sequences as an array. This is annotated with the `params` keyword, so you don't need to construct the array explicitly. You can just pass any number of arguments, and the C# compiler will generate the code to create the array for you. There's also an overload taking an `IEnumerable<IObservable<T>>`, in case the observables you want to concatenate are already in some collection.
+
+```csharp
+public static IObservable<TSource> Concat<TSource>(
+    params IObservable<TSource>[] sources)
+
+public static IObservable<TSource> Concat<TSource>(
+    this IEnumerable<IObservable<TSource>> sources)
+```
+
+The `IEnumerable<IObservable<T>>` overload evaluates `sources` lazily. It won't begin to ask it for source observables until someone subscribes to the observable that `Concat` returns, and it only calls `MoveNext` again on the resulting `IEnumerator<IObservable<T>>` when the current source completes meaning it's ready to start on the text. To illustrate this, the following example is an iterator method that returns a sequence of sequences and is sprinkled with logging. It returns three observable sequences each with a single value [1], [2] and [3]. Each sequence returns its value on a timer delay.
+
+```csharp
+public IEnumerable<IObservable<long>> GetSequences()
+{
+    Console.WriteLine("GetSequences() called");
+    Console.WriteLine("Yield 1st sequence");
+
+    yield return Observable.Create<long>(o =>
+    {
+        Console.WriteLine("1st subscribed to");
+        return Observable.Timer(TimeSpan.FromMilliseconds(500))
+            .Select(i => 1L)
+            .Finally(() => Console.WriteLine("1st finished"))
+            .Subscribe(o);
+    });
+
+    Console.WriteLine("Yield 2nd sequence");
+
+    yield return Observable.Create<long>(o =>
+    {
+        Console.WriteLine("2nd subscribed to");
+        return Observable.Timer(TimeSpan.FromMilliseconds(300))
+            .Select(i => 2L)
+            .Finally(() => Console.WriteLine("2nd finished"))
+            .Subscribe(o);
+    });
+
+    Thread.Sleep(1000); // Force a delay
+
+    Console.WriteLine("Yield 3rd sequence");
+
+    yield return Observable.Create<long>(o =>
+    {
+        Console.WriteLine("3rd subscribed to");
+        return Observable.Timer(TimeSpan.FromMilliseconds(100))
+            .Select(i=>3L)
+            .Finally(() => Console.WriteLine("3rd finished"))
+            .Subscribe(o);
+    });
+
+    Console.WriteLine("GetSequences() complete");
+}
+```
+
+We can call this `GetSequences` method and pass the results to `Concat`, and then use our `Dump` extension method to watch what happens:
+
+```csharp
+GetSequences().Concat().Dump("Concat");
+```
+
+Here's the output:
+
+```
+GetSequences() called
+Yield 1st sequence
+1st subscribed to
+Concat-->1
+1st finished
+Yield 2nd sequence
+2nd subscribed to
+Concat-->2
+2nd finished
+Yield 3rd sequence
+3rd subscribed to
+Concat-->3
+3rd finished
+GetSequences() complete
+Concat completed
+```
+
+Below is a marble diagram of the `Concat` operator applied to the `GetSequences` method. 's1', 's2' and 's3' represent sequence 1, 2 and 3. Respectively, 'rs' represents the result sequence.
+
+![A marble diagram showing 4 sequences .The first, s1, waits for a while, then produces a single value, 1, then immediate completes. The second, s2, starts immediately after s1 completes. It waits for a slightly shorter interval, then produces the value 2, then immediately completes. The third, s3, starts some time after s2 completes, waits an even shorter time, produces the value 3, and then immediately completes. The final sequence, r, starts at the same time as s1, produces the values 1, 2, and 3 at exactly the same time as these values are produces by the earlier sources, and completes at the same time as s3.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles-Three.svg)
+
+You should note that once the iterator has executed its first `yield return` to return the first sequence, the iterator does not continue until the first sequence has completed. The iterator calls `Console.WriteLine` to display the text `Yield 2nd sequence` immediately after that first `yield return`, but you can see that message doesn't appear in the output until after we see the `Concat-->1` message showing the first output from `Concat`, and also the `1st finished` message, produced by the `Finally` operator, which runs only after that first sequence has completed. (The code also makes that first source delay for 500ms before producing its value, so that if you run this, you can see that everything stops for a bit until that first source produces its single value then completes.) Once the first source completes, the `GetSequences` method continues (because `Concat` will ask it for the next item once the first observable source completes). When `GetSequences` provides the second sequence with another `yield return`, `Concat` subscribes to that, and again `GetSequences` makes no further progress until that second observable sequence completes. When asked for the third sequence, the iterator itself waits for a second before producing that third and final value, which you can see from the gap between the end of `s2` and the start of `s3` in the diagram.
+
+### Prepend
+
+There's one particular scenario that `Concat` supports, but in a slightly cumbersome way. It can sometimes be useful to make a sequence that always emits some initial value immediately. Take the example I've been using a lot in this book, where ships transmit AIS messages to report their location and other information: in some applications you might not want to wait until the ship happens next to transmit a message. You could imagine an application that records the last known location of any vessel. This would make it possible for the application to offer, say, an `IObservable<IVesselNavigation>` which instantly reports the last known information upon subscription, and which then goes on to supply any newer messages if the vessel produces any.
+
+How would we implement this? We want initially cold-source-like behaviour, but transitioning into hot. So we could just concatenate two sources. We could use [`Observable.Return`](03_CreatingObservableSequences.md#observablereturn) to create a single-element cold source, and then concatenate that with the live stream:
+
+```csharp
+IVesselNavigation lastKnown = ais.GetLastReportedNavigationForVessel(mmsi);
+IObservable<IVesselNavigation> live = ais.GetNavigationMessagesForVessel(mmsi);
+
+IObservable<IVesselNavigation> lastKnownThenLive = Observable.Concat(
+    Observable.Return(lastKnown), live);
+```
+
+This is a common enough requirement that Rx supplies `Prepend` that has a similar effect. We can replace the final line with:
+
+```csharp
+IObservable<IVesselNavigation> lastKnownThenLive = live.Prepend(lastKnown);
+```
+
+This observable will do exactly the same thing: subscribers will immediately receive the `lastKnown`, and then if the vessel should emit further navigation messages, they will receive those too. By the way, for this scenario you'd probably also want to ensure that the look up of the "last known" message happens as late as possible. We can delay this until the point of subscription by using [`Defer`](03_CreatingObservableSequences.md#observabledefer):
+
+```csharp
+public static IObservable<IVesselNavigation> GetLastKnownAndSubsequenceNavigationForVessel(uint mmsi)
+{
+    return Observable.Defer<IVesselNavigation>(() =>
+    {
+        // This lambda will run each time someone subscribes.
+        IVesselNavigation lastKnown = ais.GetLastReportedNavigationForVessel(mmsi);
+        IObservable<IVesselNavigation> live = ais.GetNavigationMessagesForVessel(mmsi);
+
+        return live.Prepend(lastKnown);
+    }
+}
+```
+
+`StartWith` might remind you of [`BehaviorSubject<T>`](03_CreatingObservableSequences.md#behaviorsubjectt), because that also ensures that consumers receive a value as soon as they subscribe. It's not quite the same: `BehaviorSubject<T>` caches the last value its own source emits. You might think that would make it a better way to implement this vessel navigation example. However, since this example is able to return a source for any vessel (the `mmsi` argument is a [Maritime Mobile Service Identity](https://en.wikipedia.org/wiki/Maritime_Mobile_Service_Identity) uniquely identifying a vessel) it would need to keep a `BehaviorSubject<T>` running for every single vessel you were interested in, which might be impractical.
+
+`BehaviorSubject<T>` can hold onto only one value, which is fine for this AIS scenario, and `Prepend` shares this limitation. But what if you need a source to begin with some particular sequence?
+
+### StartWith
+
+`StartWith` is a generalization of `Prepend` that enables us to provide any number of values to emit immediately upon subscription. As with `Prepend`, it will then go on to forward any further notifications that emerge from the source.
+
+As you can see from its signature, this method takes a `params` array of values so you can pass in as many or as few values as you need:
+
+```csharp
+// prefixes a sequence of values to an observable sequence.
+public static IObservable<TSource> StartWith<TSource>(
+    this IObservable<TSource> source, 
+    params TSource[] values)
+```
+
+There's also an overload that accepts an `IEnumerable<T>`. Note that Rx will _not_ defer its enumeration of this. `StartWith` immediately converts the `IEnumerable<T>` into an array before returning.
+
+`StartsWith` is not a common LINQ operator, and its existence is peculiar to Rx. If you imagine what `StartsWith` would look like in LINQ to Objects, it would not be meaningfully different from [`Concat`](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.concat). There's a difference in Rx because `StartsWith` effectively bridges between _pull_ and _push_ worlds. It effectively converts the items we supply into an observable, and it then concatenates the `source` argument onto that.
+
+### Append
+
+The existence of `Prepend` might lead you to wonder whether there is an `Append` for adding a single item onto the end of any `IObservable<T>`. After all, this is a common LINQ operator; [LINQ to Objects has an `Append` implementation](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.append), for example. And Rx does indeed supply such a thing:
+
+```csharp
+IObservable<string> oneMore = arguments.Append("And another thing...");
+```
+
+There is no corresponding `EndWith`. There's no fundamental reason that there couldn't be such a thing it's just that apparently there's not much demand—the [Rx repository](https://github.com/dotnet/reactive) has not yet had a feature request. So although the symmetry of `Prepend` and `Append` does suggest that there could be a similar symmetry between `StartWith` and an as-yet-hypothetical `EndWith`, the absence of this counterpart doesn't seem to have caused any problems. There's an obvious value to being able to create observable sources that always immediately produce a useful output; it's not clear what `EndWith` would be useful for, besides satisfying a craving for symmetry.
+
+### DefaultIfEmpty
+
+The next operator we'll examine doesn't strictly performs sequential combination. However, it's a very close relative of `Append` and `Prepend`. Like those operators, this will emit everything their source does. And like those operators, `DefaultIfEmpty` takes one additional item. The difference is that it won't always emit that additional item.
+
+Whereas `Prepend` emits its additional item at the start, and `Append` emits its additional item at the end, `DefaultIfEmpty` emits the additional item only if the source completes without producing anything. So this provides a way of guaranteeing that an observable will not be empty.
+
+You don't have to supply `DefaultIfEmpty` with a value. If you use the overload in which you supply no such value, it will just use `default(T)`. This will be a zero-like value for _struct_ types and `null` for reference types.
+
+### Repeat
+
+The final operator that combines sequences sequentially is `Repeat`. It allows you to simply repeat a sequence. It offers overloads where you can specify the number of times to repeat the input, and one that repeats infinitely:
+
+```csharp
+// Repeats the observable sequence a specified number of times.
+public static IObservable<TSource> Repeat<TSource>(
+    this IObservable<TSource> source, 
+    int repeatCount)
+
+// Repeats the observable sequence indefinitely and sequentially.
+public static IObservable<TSource> Repeat<TSource>(
+    this IObservable<TSource> source)
+```
+
+`Repeat` resubscribes to the source for each repetition. This means that this will only strictly repeat if the source produces the same items each time you subscribe. Unlike the [`ReplaySubject<T>`](03_CreatingObservableSequences.md#replaysubjectt), this doesn't store and replay the items that emerge from the source. This means that you normally won't want to call `Repeat` on a hot source. (If you really want repetition of the output of a hot source, a combination of [`Replay`](15_PublishingOperators.md#replay) and `Repeat` might fit the bill.)
+
+If you use the overload that repeats indefinitely, then the only way the sequence will stop is if there is an error or the subscription is disposed of. The overload that specifies a repeat count will stop on error, un-subscription, or when it reaches that count. This example shows the sequence [0,1,2] being repeated three times.
+
+```csharp
+var source = Observable.Range(0, 3);
+var result = source.Repeat(3);
+
+result.Subscribe(
+    Console.WriteLine,
+    () => Console.WriteLine("Completed"));
+```
+
+Output:
+
+```
+0
+1
+2
+0
+1
+2
+0
+1
+2
+Completed
+```
+
+## Concurrent sequences
+
+We'll now move on to operators for combining observable sequences that might produce values concurrently.
+
+### Amb
+
+`Amb` is a strangely named operator. It's short for _ambiguous_, but that doesn't tell us much more than `Amb`. If you're curious about the name you can read about the [origins of `Amb` in Appendix D](D_AlgebraicUnderpinnings.md#amb), but for now, let's look at what it actually does. 
+Rx's `Amb` takes any number of `IObservable<T>` sources as inputs, and waits to see which, if any, first produces some sort of output. As soon as this happens, it immediately unsubscribes from all of the other sources, and forwards all notifications from the source that reacted first.
+
+Why is that useful?
+
+A common use case for `Amb` is when you want to produce some sort of result as quickly as possible, and you have multiple options for obtaining that result, but you don't know in advance which will be fastest. Perhaps there are multiple servers that could all potentially give you the answer you want, and it's impossible to predict which will have the lowest response time. You could send requests to all of them, and then just use the first to respond. If you model each individual request as its own `IObservable<T>`, `Amb` can handle this for you. Note that this isn't very efficient: you're asking several servers all to do the same work, and you're going to discard the results from most of them. (Since `Amb` unsubscribes from all the sources it's not going to use as soon as the first reacts, it's possible that you might be able to send a message to all the other servers to cancel the request. But this is still somewhat wasteful.) But there may be scenarios in which timeliness is crucial, and for those cases it might be worth tolerating a bit of wasted effort to produce faster results.
+
+`Amb` is broadly similar to `Task.WhenAny`, in that it lets you detect when the first of multiple sources does something. However, the analogy is not precise. `Amb` automatically unsubscribes from all of the other sources, ensuring that everything is cleaned up. With `Task` you should always ensure that you eventually observe all tasks in case any of them faulted.
+
+To illustrate `Amb`'s behaviour, here's a marble diagram showing three sequences, `s1`, `s2`, and `s3`, each able to produce a sequence values. The line labelled `r` shows the result of passing all three sequences into `Amb`. As you can see, `r` provides exactly the same notifications as `s1`, because in this example, `s1` was the first sequence to produce a value.
+
+![A marble diagram showing 4 sequences. The first, s1, produces the values 1, 2, 3, and 4. The second, s2, starts at the same time as s1, but produces its first value, 99, after s1 produces 1, and produces its second value, 88, after s1 produces 2, and it then completes between s1 producing 2 and 3. The third source, s3, produces its first value, 8, after s2 produced 99, and before s1 produced 2, and it goes on to produce two more values, 7 and 6, interleaved with the activity from the earlier sources. The final sequence, r, is identical to s1.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles.svg)
+
+This code creates exactly the situation described in that marble diagram, to verify that this is indeed how `Amb` behaves:
+
+```csharp
+var s1 = new Subject<int>();
+var s2 = new Subject<int>();
+var s3 = new Subject<int>();
+
+var result = Observable.Amb(s1, s2, s3);
+
+result.Subscribe(
+    Console.WriteLine,
+    () => Console.WriteLine("Completed"));
+
+s1.OnNext(1);
+s2.OnNext(99);
+s3.OnNext(8);
+s1.OnNext(2);
+s2.OnNext(88);
+s3.OnNext(7);
+s2.OnCompleted();
+s1.OnNext(3);
+s3.OnNext(6);
+s1.OnNext(4);
+s1.OnCompleted();
+s3.OnCompleted();
+```
+
+Output:
+
+```
+1
+2
+3
+4
+Completed
+```
+
+If we changed the order so that `s2.OnNext(99)` came before the call to `s1.OnNext(1);` then s2 would produce values first and the marble diagram would look like this.
+
+![A marble diagram showing 4 sequences. The first, s1, produces the values 1, 2, 3, and 4. The second, s2, starts at the same time as s1, but produces its first value, 99, before s1 produces 1 (this being the key difference from the preceding diagram), and produces its second value, 88, after s1 produces 2, and it then completes between s1 producing 2 and 3. The third source, s3, produces its first value, 8, after s2 produced 99, and before s1 produced 2, and it goes on to produce two more values, 7 and 6, interleaved with the activity from the earlier sources. The final sequence, r, is identical to s2 (and not, as in the preceding diagram, s1).](GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles2.svg)
+
+There are a few overloads of `Amb`. The preceding example used the overload that takes a `params` array of sequences. There's also an overload that takes exactly two sources, avoiding the array allocation that occurs with `params`. Finally, you could pass in an `IEnumerable<IObservable<T>>`. (Note that there are no overloads that take an `IObservable<IObservable<T>>`. `Amb` requires all of the source observables it monitors to be supplied up front.)
+
+```csharp
+// Propagates the observable sequence that reacts first.
+public static IObservable<TSource> Amb<TSource>(
+    this IObservable<TSource> first, 
+    IObservable<TSource> second)
+{...}
+public static IObservable<TSource> Amb<TSource>(
+    params IObservable<TSource>[] sources)
+{...}
+public static IObservable<TSource> Amb<TSource>(
+    this IEnumerable<IObservable<TSource>> sources)
+{...}
+```
+
+Reusing the `GetSequences` method from the `Concat` section, we see that `Amb` evaluates the outer (IEnumerable) sequence completely before subscribing to any of the sequences it returns.
+
+```csharp
+GetSequences().Amb().Dump("Amb");
+```
+
+Output:
+
+```
+GetSequences() called
+Yield 1st sequence
+Yield 2nd sequence
+Yield 3rd sequence
+GetSequences() complete
+1st subscribed to
+2nd subscribed to
+3rd subscribed to
+Amb-->3
+Amb completed
+```
+
+Here is the marble diagram illustrating how this code behaves:
+
+![A marble diagram showing four sequences. The first three all start at the same time, but significantly later than the fourth. The first, s1, waits for a while and then produces the value 1 and then completes. The second, s2, produces a value 2 before s1 produced its value, and immediately completes. The third, s3, produces its value, 3, before s2 produced 2, and then immediately completes. The final sequence, r, starts long before all the rest, and then produces 3 at the same time as s3 produced 3, and then immediately completes.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles3.svg)
+
+Remember that `GetSequences` produces its first two observables as soon as it is asked for them, and then waits for 1 second before producing the third and final one. But unlike `Concat`, `Amb` won't subscribe to any of its sources until it has retrieved all of them from the iterator, which is why this marble diagram shows the subscriptions to all three sources starting after 1 second. (The first two sources were available earlier—`Amb` would have started enumerating the sources as soon as subscription occurred, but it waited until it had all three before subscribing, which is why they all appear over on the right.) The third sequence has the shortest delay between subscription and producing its value, so although it's the last observable returned, it is able to produce its value the fastest even though there are two sequences yielded one second before it (due to the `Thread.Sleep`).
+
+### Merge
+
+The `Merge` extension method takes multiple sequences as its input. Any time any of those input sequences produces a value, the observable returned by `Merge` produces that same value. If the input sequences produce values at the same time on different threads, `Merge` handles this safely, ensuring that it delivers items one at a time.
+
+Since `Merge` returns a single observable sequence that includes all of the values from all of its input sequences, there's a sense in which it is similar to `Concat`. But whereas `Concat` waits until each input sequence completes before moving onto the next, `Merge` supports concurrently active sequences. As soon as you subscribe to the observable returned by `Merge`, it immediately subscribes to all of its inputs, forwarding everything any of them produces. This marble diagram shows two sequences, `s1` and `s2`, running concurrently and `r` shows the effect of combining these with `Merge`: the values from both source sequences emerge from the merged sequence.
+
+![A marble diagram showing three sequences. The first, s1, produces the value 1 three times in a row, with a gap between each value. The second, s2, produces the value 2 three times in a row, and it does so at the same interval as the values from s2, but starting slightly later. The third sequence, c, contains all the same values as s1 and s2 combined, and at the same time as they emerge from their respective source sequences. So c produces 1, 2, 1, 2, 1, 2.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Merge-Marbles.svg)
+
+The result of a `Merge` will complete only once all input sequences complete. However, the `Merge` operator will error if any of the input sequences terminates erroneously (at which point it will unsubscribe from all its other inputs).
+
+If you read the [Creating Observables chapter](03_CreatingObservableSequences.md), you've already seen one example of `Merge`. I used it to combine the individual sequences representing the various events provided by a `FileSystemWatcher` into a single stream at the end of the ['Representing Filesystem Events in Rx'](03_CreatingObservableSequences.md#representing-filesystem-events-in-rx) section. As another example, let's look at AIS once again. There is no publicly available single global source that can provide all AIS messages across the entire globe as an `IObservable<IAisMessage>`. Any single source is likely to cover just one area, or maybe even just a single AIS receiver. With `Merge`, it's straightforward to combine these into a single source:
+
+```csharp
+IObservable<IAisMessage> station1 = aisStations.GetMessagesFromStation("AdurStation");
+IObservable<IAisMessage> station2 = aisStations.GetMessagesFromStation("EastbourneStation");
+
+IObservable<IAisMessage> allMessages = station1.Merge(station2);
+```
+
+If you want to combine more than two sources, you have a few options:
+
+- Chain `Merge` operators together e.g. `s1.Merge(s2).Merge(s3)`
+- Pass a `params` array of sequences to the `Observable.Merge` static method. e.g. `Observable.Merge(s1,s2,s3)`
+- Apply the `Merge` operator to an `IEnumerable<IObservable<T>>`.
+- Apply the `Merge` operator to an `IObservable<IObservable<T>>`.
+
+The overloads look like this:
+
+```csharp
+/// Merges two observable sequences into a single observable sequence.
+/// Returns a sequence that merges the elements of the given sequences.
+public static IObservable<TSource> Merge<TSource>(
+    this IObservable<TSource> first, 
+    IObservable<TSource> second)
+{...}
+
+// Merges all the observable sequences into a single observable sequence.
+// The observable sequence that merges the elements of the observable sequences.
+public static IObservable<TSource> Merge<TSource>(
+    params IObservable<TSource>[] sources)
+{...}
+
+// Merges an enumerable sequence of observable sequences into a single observable sequence.
+public static IObservable<TSource> Merge<TSource>(
+    this IEnumerable<IObservable<TSource>> sources)
+{...}
+
+// Merges an observable sequence of observable sequences into an observable sequence.
+// Merges all the elements of the inner sequences in to the output sequence.
+public static IObservable<TSource> Merge<TSource>(
+    this IObservable<IObservable<TSource>> sources)
+{...}
+```
+
+As the number of sources being merged goes up, the operators that take collections have an advantage over the first overload. (I.e., `s1.Merge(s2).Merge(s3)` performs slightly less well than `Observable.Merge(new[] { s1, s2, s3 })`, or the equivalent `Observable.Merge(s1, s2, s3)`.) However, for just three or four, the differences are small, so in practice you can choose between the first two overloads as a matter of your preferred style. (If you're merging 100 sources or more the differences are more pronounced, but by that stage, the you probably wouldn't want to use the chained call style anyway.) The third and fourth overloads allow to you merge sequences that can be evaluated lazily at run time.
+
+That last `Merge` overload that takes a sequence of sequences is particularly interesting, because it makes it possible for the set of sources being merged to grow over time. `Merge` will remain subscribed to `sources` for as long as your code remains subscribed to the `IObservable<T>` that `Merge` returns. So if `sources` emits more and more `IObservable<T>`s over time, these will all be included by `Merge`.
+
+That might sound familiar. The [`SelectMany` operator](06_Transformation.md#selectmany), which is able to flatten multiple observable sources back out into a single observable source. This is just another illustration of why I've described `SelectMany` as a fundamental operator in Rx: strictly speaking we don't need a lot of the operators that Rx gives us because we could build them using `SelectMany`. Here's a simple re-implementation of that last `Merge` overload using `SelectMany`:
+
+```csharp
+public static IObservable<T> MyMerge<T>(this IObservable<IObservable<T>> sources) =>
+    sources.SelectMany(source => source);
+```
+
+As well as illustrating that we don't technically need Rx to provide that last `Merge` for us, it's also a good illustration of why it's helpful that it does. It's not immediately obvious what this does. Why are we passing a lambda that just returns its argument? Unless you've seen this before, it can take some thought to work out that `SelectMany` expects us to pass a callback that it invokes for each incoming item, but that our input items are already nested sequences, so we can just return each item directly, and `SelectMany` will then take that and merge everything it produces into its output stream. And even if you have internalized `SelectMany` so completely that you know right away that this will just flatten `sources`, you'd still probably find `Observable.Merge(sources)` a more direct expression of intent. (Also, since `Merge` is a more specialized operator, Rx is able to provide a very slightly more efficient implementation of it than the `SelectMany` version shown above.)
+
+If we again reuse the `GetSequences` method, we can see how the `Merge` operator works with a sequence of sequences.
+
+```csharp
+GetSequences().Merge().Dump("Merge");
+```
+
+Output:
+
+```
+GetSequences() called
+Yield 1st sequence
+1st subscribed to
+Yield 2nd sequence
+2nd subscribed to
+Merge --> 2
+Merge --> 1
+Yield 3rd sequence
+3rd subscribed to
+GetSequences() complete
+Merge --> 3
+Merge completed
+```
+
+As we can see from the marble diagram, s1 and s2 are yielded and subscribed to immediately. s3 is not yielded for one second and then is subscribed to. Once all input sequences have completed, the result sequence completes.
+
+![A marble diagram showing four sources. The first, s1, waits for a while and then produces the value 1 and immediately completes. The second, s2, starts at the same time as s1, but produces a single value, 2 and immediately completes before s1 produced its value. The third, s3, starts long after s1 and s3 have finished, waits a short while, produces the value 3, then immediately completes. The final source, r, starts when s1 and s2 start, completes when s3 completes, and produces the three values from each of the three other sources at the same as they do, so it shows 2, 1, then 3.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Merge-Marbles-Multi.svg)
+
+
+For each of the `Merge` overloads that accept variable numbers of sources (either via an array, an `IEnumerable<IObservable<T>>`, or an `IObservable<IObservable<T>>`) there's an additional overload adding a `maxconcurrent` parameter. For example:
+
+```csharp
+public static IObservable<TSource> Merge<TSource>(this IEnumerable<IObservable<TSource>> sources, int maxConcurrent)
+```
+
+This enables you to limit the number of sources that `Merge` accepts inputs from at any single time. If the number of sources available exceeds `maxConcurrent` (either because you passed in a collection with more sources, or because you used the `IObservable<IObservable<T>`-based overload and the source emitted more nested sources than `maxConcurrent`) `Merge` will wait for existing sources to complete before moving onto new ones. A `maxConcurrent` of 1 makes `Merge` behave in the same way as `Concat`.
+
+### Switch
+
+Rx's `Switch` operator takes an `IObservable<IObservable<T>>`, and produces notifications from the most recent nested observable. Each time its source produces a new nested `IObservable<T>`, `Switch` unsubscribes from the previous nested source (unless this is the first source, in which case there won't be a previous one) and subscribes to the latest one.
+
+`Switch` can be used in a 'time to leave' type feature for a calendar application. In fact you can see the source code for a modified version of [how Bing provides (or at least provided; the implementation may have changed) notifications telling you that it's time to leave for an appointment](https://github.com/reaqtive/reaqtor/blob/c3ae17f93ae57f3fb75a53f76e60ae69299a509e/Reaqtor/Samples/Remoting/Reaqtor.Remoting.Samples/DomainFeeds.cs#L33-L76). Since that's derived from a real example, it's a little complex, so I'll describe just the essence here.
+
+The basic idea with a 'time to leave' notification is that we using map and route finding services to work out the expected journey time to get to wherever the appointment is, and to use the [`Timer` operator](03_CreatingObservableSequences.md#observabletimer) to create an `IObservable<T>` that will produce a notification when it's time to leave. (Specifically this code produces an `IObservable<TrafficInfo>` which reports the proposed route for the journey, and expected travel time.) However, there are two things that can change, rendering the initial predicted journey time useless. First, traffic conditions can change. When the user created their appointment, we have to guess the expected journey time based on how traffic normally flows at the time of day in question. However, if there turns out to be really bad traffic on the day, the estimate will need to be revised upwards, and we'll need to notify the user earlier.
+
+The other thing that can change is the user's location. This will also obviously affect the predicted journey time.
+
+To handle this, the system will need observable sources that can report changes in the user's location, and changes in traffic conditions affecting the proposed journey. Every time either of these reports a change, we will need to produce a new estimated journey time, and a new `IObservable<TrafficInfo>` that will produce a notification when it's time to leave.
+
+Every time we revise our estimate, we want to abandon the previously created `IObservable<TrafficInfo>`. (Otherwise, the user will receive a bewildering number of notifications telling them to leave, one for every time we recalculated the journey time.) We just want to use the latest one. And that's exactly what `Switch` does.
+
+You can see the [example for that scenario in the Reaqtor repo](https://github.com/reaqtive/reaqtor/blob/c3ae17f93ae57f3fb75a53f76e60ae69299a509e/Reaqtor/Samples/Remoting/Reaqtor.Remoting.Samples/DomainFeeds.cs#L33-L76). Here, I'm going to present a different, simpler scenario: live searches. As you type, the text is sent to a search service and the results are returned to you as an observable sequence. Most implementations have a slight delay before sending the request so that unnecessary work does not happen. Imagine I want to search for "Intro to Rx". I quickly type in "Into to" and realize I have missed the letter 'r'. I stop briefly and change the text to "Intro ". By now, two searches have been sent to the server. The first search will return results that I do not want. Furthermore, if I were to receive data for the first search merged together with results for the second search, it would be a very odd experience for the user. I really only want results corresponding to the latest search text. This scenario fits perfectly with the `Switch` method.
+
+In this example, there is an `IObservable<string>` source that represents the search text—each new value the user types emerges from this source sequence. We also have a search function that produces a single search result for a given search term:
+
+```csharp
+private IObservable<string> SearchResults(string query)
+{
+    ...
+}
+```
+
+This returns just a single value, but we model it as an `IObservable<string>` partly to deal with the fact that it might take some time to perform the search, and also to be enable to use it with Rx. We can take our source of search terms, and then use `Select` to pass each new search value to this `SearchResults` function. This creates our resulting nested sequence, `IObservable<IObservable<string>>`.
+
+Suppose we were to then use `Merge` to process the results:
+
+```csharp
+IObservable<string> searchValues = ....;
+IObservable<IObservable<string>> search = searchValues.Select(searchText => SearchResults(searchText));
+                    
+var subscription = search
+    .Merge()
+    .Subscribe(Console.WriteLine);
+```
+
+If we were lucky and each search completed before the next element from `searchValues` was produced, the output would look sensible. However, it is much more likely, however that multiple searches will result in overlapped search results. This marble diagram shows what the `Merge` function could do in such a situation.
+
+![A marble diagram showing 6 sources. The first, searchValues, produces the values I, In, Int, and Intr, and is shown as continuing on beyond the time represented by the diagram. The second, 'results (I)', starts when `searchValues` produces its first value, I, and then a while later produces a single value, Self, before immediately completing. It is significant that this single value is produced after the searchValues source has already produced its second value, In. The third source is labelled 'results (In)'. It starts at the same time that searchValues produces its second value, In, and a while later produces a single value, Into, before immediately completing. It is significant that it produces its value after searchValues has already produced its third value, Int. The fourth source is labelled 'results (Int)'. It starts at the same time that searchValues produces its third value, Int, and a while later produces a single value, 42, before immediately completing. It is significant that it produces its value after searchValues has already produced its fourth value, Intr. The fifth source is labelled 'results (Intr)'. It starts at the same time that searchValues produces its fourth value, Intr, and a while later produces a single value, Start, before immediately completing. It is significant that it produces its value before  the previous sequence produced its value. The final source is labelled 'Merged results'. It starts at the same time that searchValues starts, and it contains each of the items produced by the 2nd, 3rd, 4th, and 5th sequences. It does not complete.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Switch-Marbles-Bad-Merge.svg)
+
+Note how the values from the search results are all mixed together. The fact that some search terms took longer to get a search result than others has also meant that they have come out in the wrong order. This is not what we want. If we use the `Switch` extension method we will get much better results. `Switch` will subscribe to the outer sequence and as each inner sequence is yielded it will subscribe to the new inner sequence and dispose of the subscription to the previous inner sequence. This will result in the following marble diagram:
+
+![A marble diagram showing 6 sources. The first, searchValues, produces the values I, In, Int, and Intr, and is shown as continuing on beyond the time represented by the diagram. The second, 'results (I)', starts when `searchValues` produces its first value, I, and then a while later produces a single value, Self, before immediately completing. It is significant that this single value is produced after the searchValues source has already produced its second value, In. The third source is labelled 'results (In)'. It starts at the same time that searchValues produces its second value, In, and a while later produces a single value, Into, before immediately completing. It is significant that it produces its value after searchValues has already produced its third value, Int. The fourth source is labelled 'results (Int)'. It starts at the same time that searchValues produces its third value, Int, and a while later produces a single value, 42, before immediately completing. It is significant that it produces its value after searchValues has already produced its fourth value, Intr. The fifth source is labelled 'results (Intr)'. It starts at the same time that searchValues produces its fourth value, Intr, and a while later produces a single value, Start, before immediately completing. It is significant that it produces its value before  the previous sequence produced its value. The final source is labelled 'Merged results'. It starts at the same time that searchValues starts, and it reports just a single value, Start, at exactly the same time the `results (Intr)` source produces the same value. It does not complete.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Switch-Marbles.svg)
+
+Now, each time a new search term arrives, causing a new search to be kicked off, a corresponding new `IObservable<string>` for that search's results appears, causing `Switch` to unsubscribe from the previous results. This means that any results that arrive too late (i.e., when the result is for a search term that is no longer the one in the search box) will be dropped. As it happens, in this particular example, this means that we only see the result for the final search term. All the intermediate values that we saw as the user was typing didn't hang around for long, because the user kept on pressing the next key before we'd received the previous value's results. Only at the end, when the user stopped typing for long enough that the search results came back before they became out of date, do we finally see a value from `Switch`. The net effect is that we've eliminated confusing results that are out of date.
+
+This is another diagram where the ambiguity of marble diagrams causes a slight issue. I've shown each of the single-value observables produced by each of the calls to `SearchResults`, but in practice `Switch` unsubscribes from all but the last of these before they've had a chance to produce a value. So this diagram is showing the values those sources could potentially produce, and not the values that they actually delivered as part of the subscription, because the subscriptions were cut short.
+
+## Pairing sequences
+
+The previous methods allowed us to flatten multiple sequences sharing a common type into a result sequence of the same type (with various strategies for deciding what to include and what to discard). The operators in this section still take multiple sequences as an input, but attempt to pair values from each sequence to produce a single value for the output sequence. In some cases, they also allow you to provide sequences of different types.
+
+### Zip
+
+`Zip` combines pairs of items from two sequences. So its first output is created by combining the first item from one input with the first item from the other. The second output combines the second item from each input. And so on. The name is meant to evoke a zipper on clothing or a bag, which brings the teeth on each half of the zipper together one pair at a time.
+
+Since `Zip` combines pairs of item in strict order, it will complete when the first of the sequences complete. If one of the sequence has reached its end, then even if the other continues to emit values, there will be nothing to pair any of these values with, so `Zip` just unsubscribes at this point, discards the unpairable values, and reports completion.
+
+If either of the sequences produces an error, the sequence returned by `Zip` will report that same error.
+
+If one of the source sequences publishes values faster than the other sequence, the rate of publishing will be dictated by the slower of the two sequences, because it can only emit an item when it has one from each source.
+
+Here's an example:
+
+```csharp
+// Generate values 0,1,2 
+var nums = Observable.Interval(TimeSpan.FromMilliseconds(250))
+    .Take(3);
+
+// Generate values a,b,c,d,e,f 
+var chars = Observable.Interval(TimeSpan.FromMilliseconds(150))
+    .Take(6)
+    .Select(i => Char.ConvertFromUtf32((int)i + 97));
+
+// Zip values together
+nums.Zip(chars, (lhs, rhs) => (lhs, rhs)))
+    .Dump("Zip");
+ ```
+
+The effect can be seen in this marble diagram below.:
+
+![A marble diagram showing three sequences. The first, s1 waits for a while and then produces the values 0, 1, and 2, with some time between each value and completes immediately after producing 2. The second source, s2, waits for slightly less time, producing the value a before s1 produce 0, and then it produces b and c between s1's 0 and 1, and then between s1's 1 and 2, it produces d. It produces e at roughly the same time as s1 produces 2 (and for the purposes of this example, it doesn't really matter whether those happen at exactly the same time, or before or after one another) and then goes on to produce f, then immediately completes. The third sequence, c, shows the value '0,a' at the same time s1 produces 0, then '1,b' when s1 produces 1, and '2,c` when s1 produces 2, and then immediately completes (at the same time s1 completes).](GraphicsIntro/Ch09-CombiningSequences-Marbles-Zip-Marbles.svg)
+
+Here's the actual output of the code:
+
+```
+{ Left = 0, Right = a }
+{ Left = 1, Right = b }
+{ Left = 2, Right = c }
+```
+
+Note that the `nums` sequence only produced three values before completing, while the `chars` sequence produced six values. The result sequence produced three values, this was as many pairs is it could make.
+
+It is also worth noting that `Zip` has a second overload that takes an `IEnumerable<T>` as the second input sequence.
+
+```csharp
+// Merges an observable sequence and an enumerable sequence into one observable sequence 
+// containing the result of pair-wise combining the elements by using the selector function.
+public static IObservable<TResult> Zip<TFirst, TSecond, TResult>(
+    this IObservable<TFirst> first, 
+    IEnumerable<TSecond> second, 
+    Func<TFirst, TSecond, TResult> resultSelector)
+{...}
+```
+
+This allows us to zip sequences from both `IEnumerable<T>` and `IObservable<T>` paradigms!
+
+### SequenceEqual
+
+There's another operator that processes pairs of items from two sources: `SequenceEqual`. But instead of producing an output for each pair of inputs, this compares each pair, and ultimately produces a single value indicating whether every pair of inputs was equal or not.
+
+In the case where the sources produce different values, `SequenceEqual` produces a single `false` value as soon as it detects this. But if the sources are equal, it can only report this when both have completed because until that happens, it doesn't yet know if there might a difference coming later. Here's an example illustrating its behaviour:
+
+```csharp
+var subject1 = new Subject<int>();
+
+subject1.Subscribe(
+    i => Console.WriteLine($"subject1.OnNext({i})"),
+    () => Console.WriteLine("subject1 completed"));
+
+var subject2 = new Subject<int>();
+
+subject2.Subscribe(
+    i => Console.WriteLine($"subject2.OnNext({i})"),
+    () => Console.WriteLine("subject2 completed"));
+
+var areEqual = subject1.SequenceEqual(subject2);
+
+areEqual.Subscribe(
+    i => Console.WriteLine($"areEqual.OnNext({i})"),
+    () => Console.WriteLine("areEqual completed"));
+
+subject1.OnNext(1);
+subject1.OnNext(2);
+
+subject2.OnNext(1);
+subject2.OnNext(2);
+subject2.OnNext(3);
+
+subject1.OnNext(3);
+
+subject1.OnCompleted();
+subject2.OnCompleted();
+```
+
+Output:
+
+```
+subject1.OnNext(1)
+subject1.OnNext(2)
+subject2.OnNext(1)
+subject2.OnNext(2)
+subject2.OnNext(3)
+subject1.OnNext(3)
+subject1 completed
+subject2 completed
+areEqual.OnNext(True)
+areEqual completed
+```
+
+### CombineLatest
+
+The `CombineLatest` operator is similar to `Zip` in that it combines pairs of items from its sources. However, instead of pairing the first items, then the second, and so on, `CombineLatest` produces an output any time _either_ of its inputs produces a new value. For each new value to emerge from an input, `CombineLatest` uses that along with the most recently seen value from the other input. (To be precise, it doesn't produce anything until each input has produced at least one value, so if one input takes longer to get started than the other, there will be a period in which `CombineLatest` doesn't in fact produce an output each time one of its inputs does, because it's waiting for the other to produce its first value.) The signature is as follows.
+
+```csharp
+// Composes two observable sequences into one observable sequence by using the selector 
+// function whenever one of the observable sequences produces an element.
+public static IObservable<TResult> CombineLatest<TFirst, TSecond, TResult>(
+    this IObservable<TFirst> first, 
+    IObservable<TSecond> second, 
+    Func<TFirst, TSecond, TResult> resultSelector)
+{...}
+```
+
+The marble diagram below shows off usage of `CombineLatest` with one sequence that produces numbers (`s1`), and the other letters (`s2`). If the `resultSelector` function just joins the number and letter together as a pair, this would produce the result shown on the bottom line. I've colour coded each output to indicate which of the two sources caused it to emit that particular result, but as you can see, each output includes a value from each source.
+
+![A marble diagram showing three sequences. The first, s1, waits for a while then produces the values 1, 2, and 3, spaced out over time. The second, s2, starts at the same time as s1, and waits for less time, producing its first value, a, before s1 produces 1. Then after s1 has produced 2, s2 produces b and then c, both being produced before s1 produces 3. The third sequence, CombineLatest, shows '1,a' at the same time as s1 produces 1, then '2,a' when s1 produces 2, then '2,b' when s2 produces b, then '2,c' when s2 produces c, then '3,c' when s1 produces 3. All three sequences do not end within the time shown in the diagram.](GraphicsIntro/Ch09-CombiningSequences-Marbles-CombineLatest-Marbles.svg)
+
+If we slowly walk through the above marble diagram, we first see that `s1` produces the letter 'a'. `s2` has not produced any value yet so there is nothing to pair, meaning that no value is produced for the result. Next, `s2` produces the number '1' so the result sequence can now produce a pair '1,a'. We then receive the number '2' from `s1`. The last letter is still 'a' so the next pair is '2,a'. The letter 'b' is then produced creating the pair '2,b', followed by 'c' giving '2,c'. Finally the number 3 is produced and we get the pair '3,c'.
+
+This is great in case you need to evaluate some combination of state which needs to be kept up-to-date when any single component of that state changes. A simple example would be a monitoring system. Each service is represented by a sequence that returns a Boolean indicating the availability of said service. The monitoring status is green if all services are available; we can achieve this by having the result selector perform a logical AND. 
+Here is an example.
+
+```csharp
+IObservable<bool> webServerStatus = GetWebStatus();
+IObservable<bool> databaseStatus = GetDBStatus();
+
+// Yields true when both systems are up.
+var systemStatus = webServerStatus
+    .CombineLatest(
+        databaseStatus,
+        (webStatus, dbStatus) => webStatus && dbStatus);
+```
+
+You may have noticed that this method could produce a lot of duplicate values. For example, if the web server goes down the result sequence will yield '`false`'. If the database then goes down, another (unnecessary) '`false`' value will be yielded. This would be an appropriate time to use the `DistinctUntilChanged` extension method. The corrected code would look like the example below.
+
+```csharp
+// Yields true when both systems are up, and only on change of status
+var systemStatus = webServerStatus
+    .CombineLatest(
+        databaseStatus,
+        (webStatus, dbStatus) => webStatus && dbStatus)
+    .DistinctUntilChanged();
+```
+
+## Join
+
+The `Join` operator allows you to logically join two sequences. Whereas the `Zip` operator would pair values from the two sequences based on their position within the sequence, the `Join` operator allows you join sequences based on when elements are emitted.
+
+Since the production of a value by an observable source is logically an instantaneous event, joins use a model of intersecting windows. Recall that with the [`Window`](08_Partitioning.md#window) operator, you can define the duration of each window using an observable sequence. The `Join` operator uses a similar concept: for each source, we can define a time window over which each element is considered to be 'current' and two elements from different sources will be joined if their time windows overlap. As the `Zip` operator, we also need to provide a selector function to produce the result item from each pair of values. Here's the `Join` operator:
+
+```csharp
+public static IObservable<TResult> Join<TLeft, TRight, TLeftDuration, TRightDuration, TResult>
+(
+    this IObservable<TLeft> left,
+    IObservable<TRight> right,
+    Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector,
+    Func<TRight, IObservable<TRightDuration>> rightDurationSelector,
+    Func<TLeft, TRight, TResult> resultSelector
+)
+```
+
+This is a complex signature to try and understand in one go, so let's take it one parameter at a time.
+
+`IObservable<TLeft> left` is the first source sequence. `IObservable<TRight> right` is the second source sequence. `Join` is looking to produce pairs of items, with each pair containing one element from `left` and one element from `right`.
+
+The `leftDurationSelector` argument enables us to define the time window for each item from `left`. A source item's time window begins when the source emits the item. To determine when the window for an item from `left` should close, `Join` will invoke the `leftDurationSelector`, passing in the value just produced by `left`. This selector must return an observable source. (It doesn't matter at all what the element type of this source is, because `Join` is only interested in _when_ it does things.) The item's time window ends as soon as the source returned for that item by `leftDurationSelector` either produces a value or completes.
+
+The `rightDurationSelector` argument defines the time window for each item from `right`. It works in exactly the same way as the `leftDurationSelector`.
+
+Initially, there are no current items. But as `left` and `right` produce items, these items' windows will start, so `Join` might have multiple items all with their windows currently open. Each time `left` produces a new item, `Join` looks to see if any items from `right` still have their windows open. If they do, `left` is now paired with each of them. (So a single item from one source might be joined with multiple items from the other source.) `Join` calls the `resultSelector` for each such pairing. Likewise, each time `right` produces an item, then if there are any currently open windows for items from `left`, that new item from `right` will be paired with each of these, and again, `resultSelector` will be called for each such pairing.
+
+The observable returned by `Join` produces the result of each call to `resultSelector`.
+
+Let us now imagine a scenario where the left sequence produces values twice as fast as the right sequence. Imagine that in addition we never close the left windows; we could do this by always returning `Observable.Never<Unit>()` from the `leftDurationSelector` function. And imagine that we make the right windows close as soon as they possibly can, which we can achieve by making `rightDurationSelector` return `Observable.Empty<Unit>()`. The following marble diagram illustrates this:
+
+![A marble diagram showing five groups of sequences. The first group, labelled left, contains a single sequence which immediately produces the value 0, then, at evenly space intervals, the values 1, 2, 3, 4, and 5. The second group, labelled 'left durations' shows a sequence for each of the values produced by left, each starting at exactly the moment left produces one of its value. None of these sequences produces any values or completes. The third group is labelled right. It waits until after left has produced its second value (1), and then produces A. Between left's 3 and 4, it produces B. After left's 5 it produces C. The next group is labelled 'right durations', and it shows three sequences, each starting at the time right produces one of its values, and each immediately ending—these are effectively instantaneously short sequences. The final group, Join, shows a single sequence. When right produces A, this immediately produces '0,A' and then '1,A'. When right produces B, it produces '0,B', '1,B', '2,B', and `3,B`. Then right produces C, the Join sequence produces '0,C', '1,C', '2,C', '3,C', '4,C', '5,C'. The diagram happens to show each set of value stacked vertically, but that's only because they are produced in such quick succession that we wouldn't otherwise be able to see them.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Join-Marbles1.svg)
+
+Each time a left duration window intersects with a right duration window, we get an output. The right duration windows are all effectively of zero length, but this doesn't stop them from intersecting with the left duration windows, because those all never end. So the first item from right has a (zero-length) window that falls inside two of the windows for the `left` items, and so `Join` produces two results. I've stacked these vertically on the diagram to show that they happen at virtually the same time. Of course, the rules of `IObserver<T>` mean that they can't actually happen at the same time: `Join` has to wait until the consumer's `OnNext` has finished processing `0,A` before it can go on to produce `1,A`. But it will produce all the pairs as quickly as possible any time a single event from one source overlaps with multiple windows for the other.
+
+If I also immediately closed the left window by returning `Observable.Empty<Unit>`, or perhaps `Observable.Return(0)`, the windows would never overlap, so no pairs would ever get produced. (In theory if both left and right produce items at _exactly_ the same time, then perhaps we might get a pair, but since the timing of events is never absolutely precise, it would be a bad idea to design a system that depended on this.)
+
+What if I wanted to ensure that items from `right` only ever intersected with a single value from `left`? In that case, I'd need to ensure that the left durations did not overlap. One way to do that would be to have my `leftDurationSelector` always return the same sequence that I passed as the `left` sequence. This will result in `Join` making multiple subscriptions to the same source, and for some kinds of sources that might introduce unwanted side effects, but the [`Publish`](15_PublishingOperators.md#publish) and [`RefCount`](15_PublishingOperators.md#refcount) operators provide a way to deal with that, so this is in fact a reasonably strategy. If we do that, the results look more like this.
+
+![A marble diagram showing five groups of sequences. The first group, labelled left, contains a single sequence which immediately produces the value 0, then, at evenly space intervals, the values 1, 2, 3, 4, and 5. The second group, labelled 'left durations' shows a sequence for each of the values produced by left, each starting at exactly the moment left produces one of its value, and finishing at the same moment that the next one starts.The third group is labelled right. It waits until after left has produced its second value (1), and then produces A. Between left's 3 and 4, it produces B. After left's 5 it produces C. The next group is labelled 'right durations', and it shows three sequences, each starting at the time right produces one of its values, and each immediately ending—these are effectively instantaneously short sequences. The final group, Join, shows a single sequence. When right produces A, this immediately produces '1,A'. When right produces B, it produces `3,B`. Then right produces C, the Join sequence produces '5,C'.](GraphicsIntro/Ch09-CombiningSequences-Marbles-Join-Marbles2.svg)
+
+The last example is very similar to [`CombineLatest`](12_CombiningSequences.md#CombineLatest), except that it is only producing a pair when the right sequence changes. We can easily make it work the same way by changing the right durations to work in the same way as the left durations. This code shows how (including the use of `Publish` and `RefCount` to ensure that we only get a single subscription to the underlying `left` and `right` sources despite providing then to `Join` many times over).
+
+```csharp
+public static IObservable<TResult> MyCombineLatest<TLeft, TRight, TResult>
+(
+    IObservable<TLeft> left,
+    IObservable<TRight> right,
+    Func<TLeft, TRight, TResult> resultSelector
+)
+{
+    var refcountedLeft = left.Publish().RefCount();
+    var refcountedRight = right.Publish().RefCount();
+
+    return Observable.Join(
+        refcountedLeft,
+        refcountedRight,
+        value => refcountedLeft,
+        value => refcountedRight,
+        resultSelector);
+}
+```
+
+Obviously there's no need to write this—you can just use the built-in `CombineLatest`. (And that will be slightly more efficient because it has a specialized implementation.) But it shows that `Join` is a powerful operator.
+
+## GroupJoin
+
+When the `Join` operator pairs up values whose windows overlap, it will pass the scalar values left and right to the `resultSelector`. The `GroupJoin` operator is based on the same concept of overlapping windows, but its selector works slightly differently: `GroupJoin` still passes a single (scalar) value from the left source, but it passes an `IObservable<TRight>` as the second argument. This argument represents all of the values from the right sequence that occur within the window for the particular left value for which it was invoked.
+
+So this lacks the symmetry of `Join`, because the left and right sources are handled differently. `GroupJoin` will call the `resultSelector` exactly once for each item produced by the `left` source. When a left value's window overlaps with the windows of multiple right values, `Group` would deal with that by calling the selector once for each such pairing, but `GroupJoin` deals with this by having the observable passed as the second argument to `resultSelector` emit each of the right items that overlap with that left item. (If a left item overlaps with nothing from the right, `resultSelector` will still be called with that item, it'll just be passed an `IObservable<TRight>` that doesn't produce any items.)
+
+The `GroupJoin` signature is very similar to `Join`, but note the difference in the `resultSelector` parameter.
+
+```csharp
+public static IObservable<TResult> GroupJoin<TLeft, TRight, TLeftDuration, TRightDuration, TResult>
+(
+    this IObservable<TLeft> left,
+    IObservable<TRight> right,
+    Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector,
+    Func<TRight, IObservable<TRightDuration>> rightDurationSelector,
+    Func<TLeft, IObservable<TRight>, TResult> resultSelector
+)
+```
+
+If we went back to our first `Join` example where we had
+
+* the `left` producing values twice as fast as the right,
+* the left never expiring
+* the right immediately expiring
+
+This diagram shows those same inputs again, and also shows the observables `GroupJoin` would pass to the `resultSelector` for each of the items produced by `left`:
+
+![A marble diagram showing five groups of sequences. The first group, labelled left, contains a single sequence which immediately produces the value 0, then, at evenly space intervals, the values 1, 2, 3, 4, and 5. The second group, labelled 'left durations' shows a sequence for each of the values produced by left, each starting at exactly the moment left produces one of its value. None of these sequences produces any values or completes. The third group is labelled right. It waits until after left has produced its second value (1), and then produces A. Between left's 3 and 4, it produces B. After left's 5 it produces C. The next group is labelled 'right durations', and it shows three sequences, each starting at the time right produces one of its values, and each immediately ending—these are effectively instantaneously short sequences. The final group contains 6 sequences, each of which has a label of the form `Right observable passed to selector for 0`, with the digit at the end changing for each sequence (so "...for 1" then "...for 2" and so on). Each of these sequences in the final group starts at the same time as a corresponding value from the left sequence. The first two show A, B, and C at the same time that the right sequence produces these values. The next two start after right has produced A, so they show only B and C. The last two start after right produces B so they show only C.](GraphicsIntro/Ch09-CombiningSequences-Marbles-GroupJoin-Marbles.svg)
+
+This produces events corresponding to all of the same events that `Join` produced, they're just distributed across six different `IObservable<TRight>` sources. It may have occurred to you that with `GroupJoin` you could effectively re-create your own `Join` method by doing something like this:
+
+```csharp
+public IObservable<TResult> MyJoin<TLeft, TRight, TLeftDuration, TRightDuration, TResult>(
+    IObservable<TLeft> left,
+    IObservable<TRight> right,
+    Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector,
+    Func<TRight, IObservable<TRightDuration>> rightDurationSelector,
+    Func<TLeft, TRight, TResult> resultSelector)
+{
+    return Observable.GroupJoin
+    (
+        left,
+        right,
+        leftDurationSelector,
+        rightDurationSelector,
+        (leftValue, rightValues) => 
+          rightValues.Select(rightValue=>resultSelector(leftValue, rightValue))
+    )
+    .Merge();
+}
+```
+
+You could even create a crude version of `Window` with this code:
+
+```csharp
+public IObservable<IObservable<T>> MyWindow<T>(IObservable<T> source, TimeSpan windowPeriod)
+{
+    return Observable.Create<IObservable<T>>(o =>;
+    {
+        var sharedSource = source
+            .Publish()
+            .RefCount();
+
+        var intervals = Observable.Return(0L)
+            .Concat(Observable.Interval(windowPeriod))
+            .TakeUntil(sharedSource.TakeLast(1))
+            .Publish()
+            .RefCount();
+
+        return intervals.GroupJoin(
+                sharedSource, 
+                _ => intervals, 
+                _ => Observable.Empty<Unit>(), 
+                (left, sourceValues) => sourceValues)
+            .Subscribe(o);
+    });
+}
+```
+
+Rx delivers yet another way to query data in motion by allowing you to interrogate sequences of coincidence. This enables you to solve the intrinsically complex problem of managing state and concurrency while performing matching from multiple sources. By encapsulating these low level operations, you are able to leverage Rx to design your software in an expressive and testable fashion. Using the Rx operators as building blocks, your code effectively becomes a composition of many simple operators. This allows the complexity of the domain code to be the focus, not the otherwise incidental supporting code.
+
+### And-Then-When
+
+`Zip` can take only two sequences as an input. If that is a problem, then you can use a combination of the three `And`/`Then`/`When` methods. These methods are used slightly differently from most of the other Rx methods. Out of these three, `And` is the only extension method to `IObservable<T>`. Unlike most Rx operators, it does not return a sequence; instead, it returns the mysterious type `Pattern<T1, T2>`. The `Pattern<T1, T2>` type is public (obviously), but all of its properties are internal. The only two (useful) things you can do with a `Pattern<T1, T2>` are invoking its `And` or `Then` methods. The `And` method called on the `Pattern<T1, T2>` returns a `Pattern<T1, T2, T3>`. On that type, you will also find the `And` and `Then` methods. The generic `Pattern` types are there to allow you to chain multiple `And` methods together, each one extending the generic type parameter list by one. You then bring them all together with the `Then` method overloads. The `Then` methods return you a `Plan` type. Finally, you pass this `Plan` to the `Observable.When` method in order to create your sequence.
+
+It may sound very complex, but comparing some code samples should make it easier to understand. It will also allow you to see which style you prefer to use.
+
+To `Zip` three sequences together, you can either use `Zip` methods chained together like this:
+
+```csharp
+IObservable<long> one = Observable.Interval(TimeSpan.FromSeconds(1)).Take(5);
+IObservable<long> two = Observable.Interval(TimeSpan.FromMilliseconds(250)).Take(10);
+IObservable<long> three = Observable.Interval(TimeSpan.FromMilliseconds(150)).Take(14);
+
+// lhs represents 'Left Hand Side'
+// rhs represents 'Right Hand Side'
+IObservable<(long One, long Two, long Three)> zippedSequence = one
+    .Zip(two, (lhs, rhs) => (One: lhs, Two: rhs))
+    .Zip(three, (lhs, rhs) => (lhs.One, lhs.Two, Three: rhs));
+
+zippedSequence.Subscribe(
+    v => Console.WriteLine($"One: {v.One}, Two: {v.Two}, Three: {v.Three}"),
+    () => Console.WriteLine("Completed"));
+```
+
+Or perhaps use the nicer syntax of the `And`/`Then`/`When`:
+
+```csharp
+Pattern<long, long, long> pattern =
+    one.And(two).And(three);
+Plan<(long One, long Two, long Three)> plan =
+    pattern.Then((first, second, third) => (One: first, Two: second, Three: third));
+IObservable<(long One, long Two, long Three)> zippedSequence = Observable.When(plan);
+
+zippedSequence.Subscribe(
+    v => Console.WriteLine($"One: {v.One}, Two: {v.Two}, Three: {v.Three}"),
+    () => Console.WriteLine("Completed"));
+```
+
+This can be further reduced, if you prefer, to:
+
+```csharp
+IObservable<(long One, long Two, long Three)> zippedSequence = Observable.When(
+    one.And(two).And(three)
+        .Then((first, second, third) =>
+            (One: first, Two: second, Three: third))
+    );  
+
+zippedSequence.Subscribe(
+    v => Console.WriteLine($"One: {v.One}, Two: {v.Two}, Three: {v.Three}"),
+    () => Console.WriteLine("Completed"));
+```
+
+The `And`/`Then`/`When` trio has more overloads that enable you to group an even greater number of sequences. They also allow you to provide more than one 'plan' (the output of the `Then` method). This gives you the `Merge` feature but on the collection of 'plans'. I would suggest playing around with them if this functionality is of interest to you. The verbosity of enumerating all of the combinations of these methods would be of low value. You will get far more value out of using them and discovering for yourself.
+
+## Summary
+
+This chapter covered a set of methods that allow us to combine observable sequences. This brings us to a close on Part 2. We've looked at the operators that are mostly concerned with defining the computations we want to perform on the data. In Part 3 we will move onto practical concerns such as managing scheduling, side effects, and error handling.

+ 0 - 540
Rx.NET/Documentation/IntroToRx/09_SideEffects.md

@@ -1,540 +0,0 @@
----
-title: Side effects
----
-
-<!--TODO: Link on this page to the Art of Scalability and Continuous Delivery on Amazon via affiliates -->
-
-#PART 3 - Taming the sequence		{#PART3 .SectionHeader}
-
-In the third part to this book we will look the features that allow us to apply Rx to more than just sample code. 
-When building production quality code we often need to be able to handle error scenarios, log workflow, retry in certain circumstances, dispose of resources and other real-life problems that are regularly excluded from examples and demos.
-
-Part 3 of this book aims to equip you with the tools you need to be able to useRx as more than just a toy. 
-If you use Rx properly, you will find it pervasive in your code base. 
-You should not shy away from this, just like you would not shy away from using the `foreach` syntax with `IEnumerable` types, or, the `using` syntax with `IDisposable` types. 
-Understanding and embracing Rx will improve your code base by reducing it, by making it more declarative, by identifying and eliminating race conditions, and therefore making it more maintainable.
-
-Maintenance of Rx code obviously requires Rx knowledge but this creates a "chicken and egg" problem. 
-I choose to believe that Rx is here to stay. 
-I believe this because it solves a targeted set of problems very well. 
-It is also complimentary to other libraries and features such as TPL (Task Parallel Library) and the future `async`/`await` features of .NET 4.5. 
-Considering this, if Rx improves our code base then we should embrace it!
-
-<hr style="page-break-after: always" />
-
-#Side effects						{#SideEffects}
-
-Non-functional requirements of production systems often demand high availability, quality monitoring features and low lead time for defect resolution. 
-Logging, debugging, instrumentation and journaling are common non-functional requirements that developers need to consider for production ready systems. 
-These artifacts could be considered side effects of the main business workflow. 
-Side effects are a real life problem that code samples and how-to guides often ignore, however Rx provides tools to help.
-
-In this chapter we will discuss the consequences of introducing side effects when working with an observable sequence. 
-A function is considered to have a side effect if, in addition to any return value, it has some other observable effect. 
-Generally the 'observable effect' is a modification of state. 
-This observable effect could be
-
-
- * modification of a variable with a wider scope than the function (i.e. global, static	or perhaps an argument)
- * I/O such as a read/write from a file or network
-<!--TODO:Validate that readers see the display as an I/O device or not?-->
- * updating a display
-
-<!--TODO: Are there other existing paradigms that allow you to modify state, either safely or explicitly-->
-
-##Issues with side effects			{#IssuesWithSideEffects}
-<!--TODO: Maybe could be more terse in v2-->
-
-Functional programming in general tries to avoid creating any side effects. 
-Functions with side effects, especially which modify state, require the programmer to understand more than just the inputs and outputs of the function. 
-The surface area they are required to understand needs to now extend to the history and context of the state being modified. 
-This can greatly increase the complexity of a function, and thus make it harder to correctly understand and maintain.
-
-Side effects are not always accidental, nor are they always intentional. 
-An easy way to reduce the accidental side effects is to reduce the surface area for change.
-The simple actions coders can take are to reduce the visibility or scope of state and to make what you can immutable. 
-You can reduce the visibility of a variable by scoping it to a code block like a method. 
-You can reduce visibility of class members by making them private or protected. 
-By definition immutable data can't be modified so cannot exhibit side effects. 
-These are sensible encapsulation rules that will dramatically improve the maintainability of your Rx code.
-
-To provide a simple example of a query that has a side effect, we will try to output the index and value of the elements received by updating a variable (closure).
-
-	var letters = Observable.Range(0, 3)
-		.Select(i => (char)(i + 65));
-
-	var index = -1;
-	var result = letters.Select(
-		c =>
-		{
-			index++;
-			return c;
-		});
-
-	result.Subscribe(
-		c => Console.WriteLine("Received {0} at index {1}", c, index),
-		() => Console.WriteLine("completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">Received A at index 0</div>
-	<div class="line">Received B at index 1</div>
-	<div class="line">Received C at index 2</div>
-	<div class="line">completed</div>
-</div>
-
-While this seems harmless enough, imagine if another person sees this code and understands it to be the pattern the team is using. 
-They in turn adopt this style themselves.
-For the sake of the example, we will add a duplicate subscription to our previous example.
-
-	var letters = Observable.Range(0, 3)
-		.Select(i => (char)(i + 65));
-
-	var index = -1;
-	var result = letters.Select(
-		c =>
-		{
-			index++;
-			return c;
-		});
-
-	result.Subscribe(
-		c => Console.WriteLine("Received {0} at index {1}", c, index),
-		() => Console.WriteLine("completed"));
-
-	result.Subscribe(
-		c => Console.WriteLine("Also received {0} at index {1}", c, index),
-		() => Console.WriteLine("2nd completed"));
-
-Output
-
-<div class="output">
-	<div class="line">Received A at index 0</div>
-	<div class="line">Received B at index 1</div>
-	<div class="line">Received C at index 2</div>
-	<div class="line">completed</div>
-	<div class="line">Also received A at index 3</div>
-	<div class="line">Also received B at index 4</div>
-	<div class="line">Also received C at index 5</div>
-	<div class="line">2nd completed</div>
-</div>
-
-<!--TODO: Apply forward reference. Where do we show better ways of controlling workflow?-->
-
-Now the second person's output is clearly nonsense. 
-They will be expecting index values to be 0, 1 and 2 but get 3, 4 and 5 instead. 
-I have seen far more sinister versions of side effects in code bases. 
-The nasty ones often modify state that is a Boolean value e.g. `hasValues`, `isStreaming` etc. 
-We will see in a later chapter far better ways of controlling workflow with observable sequences than using shared state.
-
-In addition to creating potentially unpredictable results in existing software, programs that exhibit side effects are far more difficult to test and maintain.
-Future refactoring, enhancements or other maintenance on programs that exhibits side effects are far more likely to be brittle. 
-This is especially so in asynchronous or concurrent software.
-
-##Composing data in a pipeline		{#ComposingDataInAPipeline}
-
-The preferred way of capturing state is to introduce it to the pipeline. 
-Ideally, we want each part of the pipeline to be independent and deterministic. 
-That is, each function that makes up the pipeline should have its inputs and output as its only state. 
-To correct our example we could enrich the data in the pipeline so that there is no shared state. 
-This would be a great example where we could use the `Select` overload that exposes the index.
-
-	var source = Observable.Range(0, 3);
-	var result = source.Select(
-		(idx, value) => new
-							{
-								Index = idx,
-								Letter = (char) (value + 65)
-							});
-
-	result.Subscribe(
-		x => Console.WriteLine("Received {0} at index {1}", x.Letter, x.Index),
-		() => Console.WriteLine("completed"));
-
-	result.Subscribe(
-		x => Console.WriteLine("Also received {0} at index {1}", x.Letter, x.Index),
-		() => Console.WriteLine("2nd completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">Received A at index 0</div>
-	<div class="line">Received B at index 1</div>
-	<div class="line">Received C at index 2</div>
-	<div class="line">completed</div>
-	<div class="line">Also received A at index 0</div>
-	<div class="line">Also received B at index 1</div>
-	<div class="line">Also received C at index 2</div>
-	<div class="line">2nd completed</div>
-</div>
-
-Thinking outside of the box, we could also use other features like `Scan` to achieve similar results. 
-Here is an example.
-
-	var result = source.Scan(
-			new
-			{
-				Index = -1,
-				Letter = new char()
-			},
-			(acc, value) => new
-			{
-				Index = acc.Index + 1,
-				Letter = (char)(value + 65)
-			});
-
-The key here is to isolate the state, and reduce or remove any side effects like mutating state.
-
-##Do								{#Do}
-
-We should aim to avoid side effects, but in some cases it is unavoidable. 
-The `Do` extension method allows you to inject side effect behavior. 
-The signature of the `Do` extension method looks very much like the `Select` method;
-
- * They both have various overloads to cater for combinations of `OnNext`, `OnError` and `OnCompleted` handlers
- * They both return and take an observable sequence
-
-The overloads are as follows:
-
-	// Invokes an action with side effecting behavior for each element in the observable 
-	//  sequence.
-	public static IObservable<TSource> Do<TSource>(
-		this IObservable<TSource> source, 
-		Action<TSource> onNext)
-	{...}
-
-	// Invokes an action with side effecting behavior for each element in the observable 
-	//  sequence and invokes an action with side effecting behavior upon graceful termination
-	//  of the observable sequence.
-	public static IObservable<TSource> Do<TSource>(
-		this IObservable<TSource> source, 
-		Action<TSource> onNext, 
-		Action onCompleted)
-	{...}
-
-	// Invokes an action with side effecting behavior for each element in the observable
-	//  sequence and invokes an action with side effecting behavior upon exceptional 
-	//  termination of the observable sequence.
-	public static IObservable<TSource> Do<TSource>(
-		this IObservable<TSource> source, 
-		Action<TSource> onNext, 
-		Action<Exception> onError)
-	{...}
-
-	// Invokes an action with side effecting behavior for each element in the observable
-	//  sequence and invokes an action with side effecting behavior upon graceful or
-	//  exceptional termination of the observable sequence.
-	public static IObservable<TSource> Do<TSource>(
-		this IObservable<TSource> source, 
-		Action<TSource> onNext, 
-		Action<Exception> onError, 
-		Action onCompleted)
-	{...}
-
-	// Invokes the observer's methods for their side effects.
-	public static IObservable<TSource> Do<TSource>(
-		this IObservable<TSource> source, 
-		IObserver<TSource> observer)
-	{...}
-
-The `Select` overloads take `Func` arguments for their `OnNext` handlers and also provide the ability to return an observable sequence that is a different type to the source. 
-In contrast, the `Do` methods only take an `Action<T>` for the `OnNext` handler, and therefore can only return a sequence that is the same type as the source. 
-As each of the arguments that can be passed to the `Do` overloads are actions, they implicitly cause side effects.
-
-<!--TODO: Maybe guide the user better here so they will follow the path that Actions=side effects-->
-
-For the next example, we first define the following methods for logging:
-
-	private static void Log(object onNextValue)
-	{
-		Console.WriteLine("Logging OnNext({0}) @ {1}", onNextValue, DateTime.Now);
-	}
-	private static void Log(Exception onErrorValue)
-	{
-		Console.WriteLine("Logging OnError({0}) @ {1}", onErrorValue, DateTime.Now);
-	}
-	private static void Log()
-	{
-		Console.WriteLine("Logging OnCompleted()@ {0}", DateTime.Now);
-	}
-
-This code can use `Do` to introduce some logging using the methods from above.
-
-	var source = Observable
-		.Interval(TimeSpan.FromSeconds(1))
-		.Take(3);
-	var result = source.Do(
-		i => Log(i),
-		ex => Log(ex),
-		() => Log());
-
-	result.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">Logging OnNext(0) @ 01/01/2012 12:00:00</div>
-	<div class="line">0</div>
-	<div class="line">Logging OnNext(1) @ 01/01/2012 12:00:01</div>
-	<div class="line">1</div>
-	<div class="line">Logging OnNext(2) @ 01/01/2012 12:00:02</div>
-	<div class="line">2</div>
-	<div class="line">Logging OnCompleted() @ 01/01/2012 12:00:02</div>
-	<div class="line">completed</div>
-</div>
-
-Note that because the `Do` is earlier in the query chain than the `Subscribe`, it will receive the values first and therefore write to the console first. 
-I like to think of the `Do` method as a [wire tap](http://en.wikipedia.org/wiki/Telephone_tapping) to a sequence. 
-It gives you the ability to listen in on the sequence, without the ability to modify it.
-
-The most common acceptable side effect I see in Rx is the need to log. 
-The signature of `Do` allows you to inject it into a query chain. 
-This allows us to add logging into our sequence and retain encapsulation. 
-When a repository, service agent or provider exposes an observable sequence, they have the ability to add their side effects (e.g. logging) to the sequence before exposing it publicly. 
-Consumers can then append operators to the query (e.g. `Where`, `SelectMany`) and this will not affect the logging of the provider.
-
-Consider the method below. 
-It produces numbers but also logs what it produces (to the console for simplicity). 
-To the consuming code the logging is transparent.
-
-	private static IObservable<long> GetNumbers()
-	{
-		return Observable.Interval(TimeSpan.FromMilliseconds(250))
-			.Do(i => Console.WriteLine("pushing {0} from GetNumbers", i));
-	}
-
-We then call it with this code.
-
-	var source = GetNumbers();
-	var result = source.Where(i => i%3 == 0)
-		.Take(3)
-		.Select(i => (char) (i + 65));
-
-	result.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">pushing 0 from GetNumbers</div>
-	<div class="line">A</div>
-	<div class="line">pushing 1 from GetNumbers</div>
-	<div class="line">pushing 2 from GetNumbers</div>
-	<div class="line">pushing 3 from GetNumbers</div>
-	<div class="line">D</div>
-	<div class="line">pushing 4 from GetNumbers</div>
-	<div class="line">pushing 5 from GetNumbers</div>
-	<div class="line">pushing 6 from GetNumbers</div>
-	<div class="line">G</div>
-	<div class="line">completed</div>
-</div>
-
-This example shows how producers or intermediaries can apply logging to the sequence regardless of what the end consumer does.
-
-One overload to `Do` allows you to pass in an `IObserver<T>`.
-In this overload, each of the `OnNext`, `OnError` and `OnCompleted` methods are passed to the other `Do` overload as each of the actions to perform.
-
-Applying a side effect adds complexity to a query. 
-If side effects are a necessary evil, then being explicit will help your fellow coder understand your intentions.
-Using the `Do` method is the favored approach to doing so. 
-This may seem trivial, but given the inherent complexity of a business domain mixed with asynchrony and concurrency, developers don't need the added complication of side effects hidden in a `Subscribe` or `Select` operator.
-
-##Encapsulating with AsObservable			{#AsObservable}
-
-Poor encapsulation is a way developers can leave the door open for unintended side effects.
-Here is a handful of scenarios where carelessness leads to leaky abstractions. 
-Our first example may seem harmless at a glance, but has numerous problems.
-
-	public class UltraLeakyLetterRepo
-	{
-		public ReplaySubject<string> Letters { get; set; }
-
-		public UltraLeakyLetterRepo()
-		{
-			Letters = new ReplaySubject<string>();
-			Letters.OnNext("A");
-			Letters.OnNext("B");
-			Letters.OnNext("C");
-		}
-	}
-
-In this example we expose our observable sequence as a property. 
-The first problem here is that it is a settable property. 
-Consumers could change the entire subject out if they wanted. 
-This would be a very poor experience for other consumers of this class. 
-If we make some simple changes we can make a class that seems safe enough.
-
-	public class LeakyLetterRepo
-	{
-		private readonly ReplaySubject<string> _letters;
-
-		public LeakyLetterRepo()
-		{
-			_letters = new ReplaySubject<string>();
-			_letters.OnNext("A");
-			_letters.OnNext("B");
-			_letters.OnNext("C");
-		}
-		
-		public ReplaySubject<string> Letters
-		{
-			get { return _letters; }
-		}
-
-	}
-
-Now the `Letters` property only has a getter and is backed by a read-only field. 
-This is much better. 
-Keen readers will note that the `Letters` property returns a `ReplaySubject<string>`. 
-This is poor encapsulation, as consumers could call `OnNext`/`OnError`/`OnCompleted`.
-To close off that loophole we can simply make the return type an `IObservable<string>`.
-
-	public IObservable<string> Letters
-	{
-		get { return _letters; }
-	}
-
-The class now _looks_ much better. 
-The improvement, however, is only cosmetic.
-There is still nothing preventing consumers from casting the result back to an `ISubject<string>` and then calling whatever methods they like. 
-In this example we see external code pushing their values into the sequence.
-
-	var repo = new ObscuredLeakinessLetterRepo();
-	var good = repo.GetLetters();
-	var evil = repo.GetLetters();
-		
-	good.Subscribe(
-		Console.WriteLine);
-
-	//Be naughty
-	var asSubject = evil as ISubject<string>;
-	if (asSubject != null)
-	{
-		//So naughty, 1 is not a letter!
-		asSubject.OnNext("1");
-	}
-	else
-	{
-		Console.WriteLine("could not sabotage");
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">C</div>
-	<div class="line">1</div>
-</div>
-
-The fix to this problem is quite simple. 
-By applying the `AsObservable` extension method, the `_letters` field will be wrapped in a type that only implements `IObservable<T>`.
-
-	public IObservable<string> GetLetters()
-	{
-		return _letters.AsObservable();
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">C</div>
-	<div class="line">could not sabotage</div>
-</div>
-
-While I have used words like 'evil' and 'sabotage' in these examples, it is more often than not an oversight rather than malicious intent that causes problems. 
-The failing falls first on the programmer who designed the leaky class. 
-Designing interfaces is hard, but we should do our best to help consumers of our code fall into [the pit of success](http://blogs.msdn.com/b/brada/archive/2003/10/02/50420.aspx) by giving them discoverable and consistent types. 
-Types become more discoverable if we reduce their surface area to expose only the features we intend our consumers to use. 
-In this example we reduced the type's surface area.
-We did so by removing the property setter and returning a simpler type via the `AsObservable` method.
-
-##Mutable elements cannot be protected		{#MutableElementsCantBeProtected}
-
-While the `AsObservable` method can encapsulate your sequence, you should still be aware that it gives no protection against mutable elements. 
-Consider what consumers of a sequence of this class could do:
-
-	public class Account
-	{
-		public int Id { get; set; }
-		public string Name { get; set; }
-	}
-
-Here is a quick example of the kind of mess we can make if we choose to modify elements	in a sequence.
-
-	var source = new Subject<Account>();
-
-	//Evil code. It modifies the Account object.
-	source.Subscribe(account => account.Name = "Garbage");
-	//unassuming well behaved code
-	source.Subscribe(
-		account=>Console.WriteLine("{0} {1}", account.Id, account.Name),
-		()=>Console.WriteLine("completed"));
-
-	source.OnNext(new Account {Id = 1, Name = "Microsoft"});
-	source.OnNext(new Account {Id = 2, Name = "Google"});
-	source.OnNext(new Account {Id = 3, Name = "IBM"});
-	source.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1 Garbage</div>
-	<div class="line">2 Garbage</div>
-	<div class="line">3 Garbage</div>
-	<div class="line">completed</div>
-</div>
-
-Here the second consumer was expecting to get 'Microsoft', 'Google' and 'IBM' but received just 'Garbage'.
-
-Observable sequences will be perceived to be a sequence of resolved events: things that have happened as a statement of fact. 
-This implies two things: first, each element represents a snapshot of state at the time of publication, secondly, the information emanates from a trustworthy source. 
-We want to eliminate the possibility of tampering. 
-Ideally the type `T` will be immutable, solving both of these problems. 
-This way, consumers of the sequence can be assured that the data they get is the data that the source produced. 
-Not being able to mutate elements may seem limiting as a consumer, but these needs are best met via the [Transformation](08_Transformation.html) operators which provide better encapsulation.
-
-Side effects should be avoided where possible. 
-Any combination of concurrency with shared state will commonly demand the need for complex locking, deep understanding of CPU architectures and how they work with the locking and optimization features of the language you use. 
-The simple and preferred approach is to avoid shared state, favor immutable data types and utilize query composition and transformation. 
-Hiding side effects into `Where` or `Select` clauses can make for very confusing code. 
-If a side effect is required, then the `Do` method expresses intent that you are creating a side effect by being explicit.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Domain Driven Design (Kindle) Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00794TAUG&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Purely functional data structures Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0521663504&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 0 - 533
Rx.NET/Documentation/IntroToRx/10_LeavingTheMonad.md

@@ -1,533 +0,0 @@
----
-title: Leaving the monad
----
-
-<!--TODO: Enumerators -->
-
-#Leaving the monad					{#LeavingTheMonad}
-<!--
-        
-        TODO: Create a compelling reason that you would want to leave the monad and support 
-        it. else Create the argument that you can but don't want to and then prove it.
-
--->
-
-An observable sequence is a useful construct, especially when we have the power of LINQ to compose complex queries over it. 
-Even though we recognize the benefits of the observable sequence, sometimes it is required to leave the `IObservable<T>` paradigm for another paradigm, maybe to enable you to integrate with an existing API (i.e. use events or `Task<T>`). 
-You might leave the observable paradigm if you find it easier for testing, or it may simply be easier for you to learn Rx by moving between an observable paradigm and a more familiar one.
-
-##What is a monad					{#WhatIsAMonad}
-
-We have casually referred to the term _monad_ earlier in the book, but to most it will be a very foreign term. 
-I am going to try to avoid overcomplicating what a monad is, but give enough of an explanation to help us out with our next category of methods. 
-The full definition of a monad is quite abstract. 
-[Many others](http://www.haskell.org/haskellwiki/Monad_tutorials_timeline) have tried to provide their definition of a monad using all sorts of metaphors from astronauts to Alice in Wonderland. 
-Many of the tutorials for monadic programming use Haskell for the code examples which can add to the confusion.
-For us, a monad is effectively a programming structure that represents computations.
-Compare this to other programming structures:
-
-<dl>
-	<dt>Data structure</dt>
-	<dd>
-		Purely state e.g. a List, a Tree or a Tuple
-	</dd>
-	<dt>Contract</dt>
-	<dd>
-		Contract definition or abstract functionality e.g. an interface or abstract class
-	</dd>
-	<dt>Object-Orientated structure</dt>
-	<dd>
-		State and behavior together
-	</dd>
-</dl>
-
-Generally a monadic structure allows you to chain together operators to produce a pipeline, just as we do with our extension methods.
-
-<cite>Monads are a kind of abstract data type constructor that encapsulate program logic
-	instead of data in the domain model. </cite>
-
-This neat definition of a monad lifted from Wikipedia allows us to start viewing sequences as monads; the abstract data type in this case is the `IObservable<T>` type. 
-When we use an observable sequence, we compose functions onto the abstract data type (the `IObservable<T>`) to create a query. 
-This query becomes our encapsulated programming logic.
-
-The use of monads to define control flows is particularly useful when dealing with typically troublesome areas of programming such as IO, concurrency and exceptions.
-This just happens to be some of Rx's strong points!
-
-##Why leave the monad?				{#WhyLeaveTheMonad}
-
-There is a variety of reasons you may want to consume an observable sequence in a different paradigm. 
-Libraries that need to expose functionality externally may be required to present it as events or as `Task` instances. 
-In demonstration and sample code you may prefer to use blocking methods to limit the number of asynchronous moving parts. 
-This may help make the learning curve to Rx a little less steep!
-
-In production code, it is rarely advised to 'break the monad', especially moving from an observable sequence to blocking methods. 
-Switching between asynchronous and synchronous paradigms should be done with caution, as this is a common root cause for concurrency problems such as deadlock and scalability issues.
-
-In this chapter, we will look at the methods in Rx which allow you to leave the `IObservable<T>` monad.
-
-##ForEach							{#ForEach}
-
-The `ForEach` method provides a way to process elements as they are received.
-The key difference between `ForEach` and `Subscribe` is that `ForEach` will block the current thread until the sequence completes.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1))
-		.Take(5);
-	source.ForEach(i => Console.WriteLine("received {0} @ {1}", i, DateTime.Now));
-	Console.WriteLine("completed @ {0}", DateTime.Now);
-
-Output:
-
-<div class="output">
-	<div class="line">received 0 @ 01/01/2012 12:00:01 a.m.</div>
-	<div class="line">received 1 @ 01/01/2012 12:00:02 a.m.</div>
-	<div class="line">received 2 @ 01/01/2012 12:00:03 a.m.</div>
-	<div class="line">received 3 @ 01/01/2012 12:00:04 a.m.</div>
-	<div class="line">received 4 @ 01/01/2012 12:00:05 a.m.</div>
-	<div class="line">completed @ 01/01/2012 12:00:05 a.m.</div>
-</div>
-
-Note that the completed line is last, as you would expect. 
-To be clear, you can get similar functionality from the `Subscribe` extension method, but the `Subscribe` method will not block. 
-So if we substitute the call to `ForEach` with a call to `Subscribe`, we will see the completed line happen first.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1))
-		.Take(5);
-	source.Subscribe(i => Console.WriteLine("received {0} @ {1}", i, DateTime.Now));
-	Console.WriteLine("completed @ {0}", DateTime.Now);
-
-Output:
-
-<div class="output">
-	<div class="line">completed @ 01/01/2012 12:00:00 a.m.</div>
-	<div class="line">received 0 @ 01/01/2012 12:00:01 a.m.</div>
-	<div class="line">received 1 @ 01/01/2012 12:00:02 a.m.</div>
-	<div class="line">received 2 @ 01/01/2012 12:00:03 a.m.</div>
-	<div class="line">received 3 @ 01/01/2012 12:00:04 a.m.</div>
-	<div class="line">received 4 @ 01/01/2012 12:00:05 a.m.</div>
-</div>
-
-Unlike the `Subscribe` extension method, `ForEach` has only the one overload; the one that take an `Action<T>` as its single argument.
-In contrast, previous (pre-release) versions of Rx, the `ForEach` method had most of the same overloads as `Subscribe`. 
-Those overloads of `ForEach` have been deprecated, and I think rightly so. 
-There is no need to have an `OnCompleted` handler in a synchronous call, it is unnecessary. 
-You can just place the call immediately after the `ForEach` call as we have done above. 
-Also, the `OnError` handler can now be replaced with standard Structured Exception Handling like you would use for any other synchronous code, with a `try`/`catch` block. 
-This also gives symmetry to the `ForEach` instance method on the `List<T>` type.
-
-	var source = Observable.Throw<int>(new Exception("Fail"));
-	try
-	{
-		source.ForEach(Console.WriteLine);
-	}
-	catch (Exception ex)
-	{
-		Console.WriteLine("error @ {0} with {1}", DateTime.Now, ex.Message);
-	}
-	finally
-	{
-		Console.WriteLine("completed @ {0}", DateTime.Now);    
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">error @ 01/01/2012 12:00:00 a.m. with Fail</div>
-	<div class="line">completed @ 01/01/2012 12:00:00 a.m.</div>
-</div>
-
-The `ForEach` method, like its other blocking friends (`First` and `Last` etc.), should be used with care. 
-I would leave the `ForEach` method for spikes, tests and demo code only. 
-We will discuss the problems with introducing blocking calls when we look at concurrency.
-
-<!--TODO: The  GetEnumerator, Latest, MostRecent and Next operators are not covered. These could be really useful.-->
-<!--<a name="ObservableSequencesToEnumerators"></a>
-	<h2>Observable sequences to enumerators</h2>
-	<p></p>
-	<a name="GetEnumerator"></a>
-	<h3>GetEnumerator</h3>
-	<p></p>
-	<a name="Latest"></a>
-	<h3>Latest</h3>
-	<p></p>
-	<a name="MostRecent"></a>
-	<h3>MostRecent</h3>
-	<p></p>
-	<a name="Next"></a>
-	<h3>Next</h3>
-	<p></p>
--->
-
-##ToEnumerable						{#ToEnumerable}
-
-An alternative way to switch out of the `IObservable<T>` is to call the `ToEnumerable` extension method. 
-As a simple example:
-
-	var period = TimeSpan.FromMilliseconds(200);
-	var source = Observable.Timer(TimeSpan.Zero, period) 
-		.Take(5); 
-	var result = source.ToEnumerable();
-	foreach (var value in result) 
-	{ 
-		Console.WriteLine(value); 
-	} 
-	Console.WriteLine("done");
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">done</div>
-</div>
-
-The source observable sequence will be subscribed to when you start to enumerate the sequence (i.e. lazily). 
-In contrast to the `ForEach` extension method, using the `ToEnumerable` method means you are only blocked when you try to move to the next element and it is not available. 
-Also, if the sequence produces values faster than you consume them, they will be cached for you.
-
-To cater for errors, you can wrap your `foreach` loop in a `try`/`catch` as you do with any other enumerable sequence:
-
-	try 
-	{ 
-		foreach (var value in result)
-		{ 
-			Console.WriteLine(value); 
-		} 
-	} 
-	catch (Exception e) 
-	{ 
-		Console.WriteLine(e.Message);
-	} 
-
-As you are moving from a push to a pull model (non-blocking to blocking), the standard warning applies.
-
-##To a single collection			{#ToBatch}
-
-To avoid having to oscillate between push and pull, you can use one of the next four methods to get the entire list back in a single notification. 
-They all have the same semantics, but just produce the data in a different format. 
-They are similar to their corresponding `IEnumerable<T>` operators, but the return values differ in order to retain asynchronous behavior.
-
-###ToArray and ToList				{#ToArrayAndToList}
-
-Both `ToArray` and `ToList` take an observable sequence and package it into an array or an instance of `List<T>` respectively. 
-Once the observable sequence completes, the array or list will be pushed as the single value of the result sequence.
-
-	var period = TimeSpan.FromMilliseconds(200); 
-	var source = Observable.Timer(TimeSpan.Zero, period).Take(5); 
-	var result = source.ToArray(); 
-	result.Subscribe( 
-		arr => { 
-			Console.WriteLine("Received array"); 
-			foreach (var value in arr) 
-			{ 
-				Console.WriteLine(value); 
-			} 
-		}, 
-		() => Console.WriteLine("Completed")
-	); 
-	Console.WriteLine("Subscribed"); 
-
-Output:
-
-<div class="output">
-	<div class="line">Subscribed</div>
-	<div class="line">Received array</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">Completed</div>
-</div>
-
-As these methods still return observable sequences we can use our `OnError` handler for errors. 
-Note that the source sequence is packaged to a single notification; you either get the whole sequence *or* the error. 
-If the source produces values and then errors, you will not receive any of those values. 
-All four operators (`ToArray`, `ToList`, `ToDictionary` and `ToLookup`) handle errors like this.
-
-###ToDictionary and ToLookup	{#ToDictionaryAndToLookup}
-
-As an alternative to arrays and lists, Rx can package an observable sequence into a dictionary or lookup with the `ToDictionary` and `ToLookup` methods.
-Both methods have the same semantics as the `ToArray` and `ToList` methods, as they return a sequence with a single value and have the same error handling features.
-
-The `ToDictionary` extension method overloads:
-
-	// Creates a dictionary from an observable sequence according to a specified key selector 
-	// function, a comparer, and an element selector function.
-	public static IObservable<IDictionary<TKey, TElement>> ToDictionary<TSource, TKey, TElement>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		Func<TSource, TElement> elementSelector, 
-		IEqualityComparer<TKey> comparer) 
-	{...} 
-	// Creates a dictionary from an observable sequence according to a specified key selector 
-	// function, and an element selector function. 
-	public static IObservable<IDictionary<TKey, TElement>> ToDictionary<TSource, TKey, TElement>( 
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		Func<TSource, TElement> elementSelector) 
-	{...} 
-	// Creates a dictionary from an observable sequence according to a specified key selector 
-	// function, and a comparer. 
-	public static IObservable<IDictionary<TKey, TSource>> ToDictionary<TSource, TKey>( 
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector,
-		IEqualityComparer<TKey> comparer) 
-	{...} 
-	// Creates a dictionary from an observable sequence according to a specified key selector 
-	// function. 
-	public static IObservable<IDictionary<TKey, TSource>> ToDictionary<TSource, TKey>( 
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector) 
-	{...} 
-
-The `ToLookup` extension method overloads:
-
-	// Creates a lookup from an observable sequence according to a specified key selector 
-	// function, a comparer, and an element selector function. 
-	public static IObservable<ILookup<TKey, TElement>> ToLookup<TSource, TKey, TElement>( 
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		Func<TSource, TElement> elementSelector,
-		IEqualityComparer<TKey> comparer) 
-	{...} 
-	// Creates a lookup from an observable sequence according to a specified key selector 
-	// function, and a comparer. 
-	public static IObservable<ILookup<TKey, TSource>> ToLookup<TSource, TKey>(
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		IEqualityComparer<TKey> comparer) 
-	{...} 
-	// Creates a lookup from an observable sequence according to a specified key selector 
-	// function, and an element selector function. 
-	public static IObservable<ILookup<TKey, TElement>> ToLookup<TSource, TKey, TElement>( 
-		this IObservable<TSource> source, 
-		Func<TSource, TKey> keySelector, 
-		Func<TSource, TElement> elementSelector)
-	{...} 
-	// Creates a lookup from an observable sequence according to a specified key selector 
-	// function. 
-	public static IObservable<ILookup<TKey, TSource>> ToLookup<TSource, TKey>( 
-		this IObservable<TSource> source, 
-		Func<TSource,
-		TKey> keySelector) 
-	{...} 
-
-Both `ToDictionary` and `ToLookup` require a function that can be applied each value to get its key. 
-In addition, the `ToDictionary` method overloads mandate that all keys should be unique. 
-If a duplicate key is found, it terminate the sequence with a `DuplicateKeyException`. 
-On the other hand, the `ILookup<TKey, TElement>` is designed to have multiple values grouped by the key. 
-If you have many values per key, then `ToLookup` is probably the better option.
-
-##ToTask							{#ToTask}
-
-We have compared `AsyncSubject<T>` to `Task<T>` and even showed how to [transition from a task](04_CreatingObservableSequences.html#FromTask) to an observable sequence. 
-The `ToTask` extension method will allow you to convert an observable sequence into a `Task<T>`. 
-Like an `AsyncSubject<T>`, this method will ignore multiple values, only returning the last value.
-
-	// Returns a task that contains the last value of the observable sequence. 
-	public static Task<TResult> ToTask<TResult>(
-		this IObservable<TResult> observable) 
-	{...} 
-	// Returns a task that contains the last value of the observable sequence, with state to 
-	//  use as the underlying task's AsyncState. 
-	public static Task<TResult> ToTask<TResult>(
-		this IObservable<TResult> observable,
-		object state) 
-	{...} 
-	// Returns a task that contains the last value of the observable sequence. Requires a 
-	//  cancellation token that can be used to cancel the task, causing unsubscription from 
-	//  the observable sequence. 
-	public static Task<TResult> ToTask<TResult>(
-		this IObservable<TResult> observable, 
-		CancellationToken cancellationToken) 
-	{...} 
-	// Returns a task that contains the last value of the observable sequence, with state to 
-	//  use as the underlying task's AsyncState. Requires a cancellation token that can be used
-	//  to cancel the task, causing unsubscription from the observable sequence. 
-	public static Task<TResult> ToTask<TResult>(
-		this IObservable<TResult> observable, 
-		CancellationToken cancellationToken, 
-		object state) 
-	{...} 
-
-This is a simple example of how the `ToTask` operator can be used. 
-Note, the `ToTask` method is in the `System.Reactive.Threading.Tasks` namespace.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)) 
-		.Take(5);
-	var result = source.ToTask(); //Will arrive in 5 seconds. 
-	Console.WriteLine(result.Result);
-
-Output:
-
-<div class="output">
-	<div class="line">4</div>
-</div>
-
-If the source sequence was to manifest error then the task would follow the error-handling semantics of tasks.
-
-	var source = Observable.Throw<long>(new Exception("Fail!")); 
-	var result = source.ToTask(); 
-	try 
-	{ 
-		Console.WriteLine(result.Result);
-	} 
-	catch (AggregateException e) 
-	{ 
-		Console.WriteLine(e.InnerException.Message); 
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Fail!</div>
-</div>
-
-Once you have your task, you can of course engage in all the features of the TPL such as continuations.
-
-##ToEvent&lt;T&gt;					{#ToEventT}
-
-Just as you can use an event as the source for an observable sequence with [`FromEventPattern`](04_CreatingObservableSequences.html#FromEvent), you can also make your observable sequence look like a standard .NET event with the `ToEvent` extension methods.
-
-	// Exposes an observable sequence as an object with a .NET event. 
-	public static IEventSource<unit> ToEvent(this IObservable<Unit> source)
-	{...} 
-	// Exposes an observable sequence as an object with a .NET event. 
-	public static IEventSource<TSource> ToEvent<TSource>(
-		this IObservable<TSource> source) 
-	{...} 
-	// Exposes an observable sequence as an object with a .NET event. 
-	public static IEventPatternSource<TEventArgs> ToEventPattern<TEventArgs>(
-		this IObservable<EventPattern<TEventArgs>> source) 
-		where TEventArgs : EventArgs 
-	{...} 
-
-The `ToEvent` method returns an `IEventSource<T>`, which will have a single event member on it: `OnNext`.
-
-	public interface IEventSource<T> 
-	{ 
-		event Action<T> OnNext; 
-	} 
-
-When we convert the observable sequence with the `ToEvent` method, we can just subscribe by providing an `Action<T>`, which we do here with a lambda.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1))
-		.Take(5); 
-	var result = source.ToEvent(); 
-	result.OnNext += val => Console.WriteLine(val);
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-</div>
-
-###ToEventPattern					{#ToEventPattern}
-
-Note that this does not follow the standard pattern of events. 
-Normally, when you subscribe to an event, you need to handle the `sender` and `EventArgs` parameters. 
-In the example above, we just get the value. 
-If you want to expose your sequence as an event that follows the standard pattern, you will need to use `ToEventPattern`.
-
-The `ToEventPattern` will take an `IObservable<EventPattern<TEventArgs>>` and convert that into an `IEventPatternSource<TEventArgs>`. 
-The public interface for these types is quite simple.
-
-	public class EventPattern<TEventArgs> : IEquatable<EventPattern<TEventArgs>>
-		where TEventArgs : EventArgs 
-	{ 
-		public EventPattern(object sender, TEventArgs e)
-		{ 
-			this.Sender = sender; 
-			this.EventArgs = e; 
-		} 
-		public object Sender { get; private set; } 
-		public TEventArgs EventArgs { get; private set; } 
-		//...equality overloads
-	} 
-	public interface IEventPatternSource<TEventArgs> where TEventArgs : EventArgs
-	{ 
-		event EventHandler<TEventArgs> OnNext; 
-	} 
-
-These look quite easy to work with. 
-So if we create an `EventArgs` type and then apply a simple transform using `Select`, we can make a standard sequence fit the pattern.
-
-The `EventArgs` type:
-
-	public class MyEventArgs : EventArgs 
-	{ 
-		private readonly long _value; 
-		public MyEventArgs(long value) 
-		{ 
-			_value = value; 
-		} 
-		public long Value 
-		{ 
-			get { return _value; } 
-		} 
-	} 
-
-The transform:
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1))
-		.Select(i => new EventPattern<MyEventArgs>(this, new MyEventArgs(i)));
-
-Now that we have a sequence that is compatible, we can use the `ToEventPattern`, and in turn, a standard event handler.
-
-	var result = source.ToEventPattern(); 
-	result.OnNext += (sender, eventArgs) => Console.WriteLine(eventArgs.Value);
-
-Now that we know how to get back into .NET events, let's take a break and remember why Rx is a better model.
-
- * In C#, events have a curious interface. Some find the `+=` and `-=` operators an unnatural way to register a callback
- * Events are difficult to compose
- * Events do not offer the ability to be easily queried over time
- * Events are a common cause of accidental memory leaks
- * Events do not have a standard pattern for signaling completion
- * Events provide almost no help for concurrency or multithreaded applications. For instance, raising an event on a separate thread requires you to do all of the plumbing
-
----
-
-The set of methods we have looked at in this chapter complete the circle started in the [Creating a Sequence](04_CreatingObservableSequences.html#TransitioningIntoIObservable) chapter. 
-We now have the means to enter and leave the observable sequence monad. 
-Take care when opting in and out of the `IObservable<T>` monad. 
-Doing so excessively can quickly make a mess of your code base, and may indicate a design flaw.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Domain Driven Design (Kindle) Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00794TAUG&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Purely functional data structures Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0521663504&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 7 - 0
Rx.NET/Documentation/IntroToRx/10_Part3.md

@@ -0,0 +1,7 @@
+# PART 3 - Getting pragmatic.
+
+The first part of this book focused on the basic ideas and types of Rx. In the second part, I showed the operators Rx offers, enabling us to define the transformations and computations we want to apply to our source data. This second part was essentially functional programming. Rx's operators are mostly like mathematical functions, in that they will invariably behave in the same way for particular inputs. They are unaffected by the state of the world around them, and they also do nothing to change its state. In functional programming, such mechanisms are sometimes described as _pure_.
+
+This _purity_ can help us understand what our code will do. It means we don't need to know about the state of the rest of our program in order to understand how one particular part functions. However, code that is completely detached from the outside world is unlikely to achieve anything useful. In practice, we need to connect these pure computations with more pragmatic concerns. The [Creating Observable Sequences chapter](03_CreatingObservableSequences.md) already showed how to define observable streams, so we've already looked at how to connect real world inputs into the world of Rx. But what about the other end? How do we do something useful with the results of our processing?
+
+In some cases, it might be enough to do work inside `IObserver` implementations, or using the callback-based subscription mechanisms you've already seen. However, some situations will demand something more sophisticated. So in this third part of the book, we will look at some of the features Rx offers to help connect processes of the kind we looked at in part 2 with the rest of the world.

+ 0 - 491
Rx.NET/Documentation/IntroToRx/11_AdvancedErrorHandling.md

@@ -1,491 +0,0 @@
----
-title: Advanced error handling
----
-
-#Advanced error handling				{#AdvancedErrorHandling}
-
-Exceptions happen. 
-Exceptions themselves are not bad or good, however the way we raise or catch them can. 
-Some exceptions are predictable and are due to sloppy code, for example a `DivideByZeroException`. 
-Other exceptions cannot be prevented with defensive coding, for example an I/O exception like `FileNotFoundException` or `TimeoutException`. 
-In these cases, we need to cater for the exception gracefully. 
-Providing some sort of error message to the user, logging the error or perhaps retrying are all potential ways to handle these exceptions.
-
-The `IObserver<T>` interface and `Subscribe` extension methods provide the ability to cater for sequences that terminate in error, however they leave the sequence terminated. 
-They also do not offer a composable way to cater for different `Exception` types. 
-A functional approach that enables composition of error handlers, allowing us to remain in the monad, would be more useful. 
-Again, Rx delivers.
-
-##Control flow constructs				{#ControlFlowConstructs}
-
-Using marble diagrams, we will examine various ways to handle different control flows. 
-Just as with normal .NET code, we have flow control constructs such as `try`/`catch`/`finally`. 
-In this chapter we see how they can be applied to observable sequences.
-
-###Catch								{#Catch}
-
-Just like a catch in SEH (Structured Exception Handling), with Rx you have the option of swallowing an exception, wrapping it in another exception or performing some other logic.
-
-We already know that observable sequences can handle erroneous situations with the `OnError` construct. 
-A useful method in Rx for handling an `OnError` notification is the `Catch` extension method. 
-Catch allows you to intercept a specific `Exception` type and then continue with another sequence.
-
-Below is the signature for the simple overload of catch:
-
-	public static IObservable<TSource> Catch<TSource>(
-		this IObservable<TSource> first, 
-		IObservable<TSource> second)
-	{
-		...
-	}
-
-####Swallowing exceptions			{#CatchSwallowingException}
-
-With Rx, you can catch and swallow exceptions in a similar way to SEH. 
-It is quite simple; we use the `Catch` extension method and provide an empty sequence as the second value.
-
-We can represent an exception being swallowed like this with a marble diagram.
-
-<div class="marble">
-	<pre class="line">S1--1--2--3--X</pre>
-	<pre class="line">S2            -|</pre>
-	<pre class="line">R --1--2--3----|</pre>
-</div>
-
-Here `S1` represents the first sequence that ends with an error (`X`). 
-`S2` is the continuation sequence, an empty sequence. 
-`R` is the result sequence which starts as `S1`, then continues with `S2` when `S1` terminates.
-
-	var source = new Subject<int>();
-	var result = source.Catch(Observable.Empty<int>());
-
-	result.Dump("Catch"););
-
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnError(new Exception("Fail!"));
-
-Output:
-
-<div class="output">
-	<div class="line">Catch-->1</div>
-	<div class="line">Catch-->2</div>
-	<div class="line">Catch completed</div>
-</div>
-
-The example above will catch and swallow all types of exceptions. 
-This is somewhat equivalent to the following with SEH:
-
-	try
-	{
-		DoSomeWork();
-	}
-	catch
-	{
-	}
-
-Just as it is generally avoided in SEH, you probably also want to limit your use of swallowing errors in Rx. 
-You may, however, have a specific exception you want to handle. 
-Catch has an overload that enables you specify the type of exception.
-Just as the following code would allow you to catch a `TimeoutException`:
-
-	try
-	{
-		//
-	}
-	catch (TimeoutException tx)
-	{
-		//
-	}
-
-Rx also offers an overload of `Catch` to cater for this.
-
-	public static IObservable<TSource> Catch<TSource, TException>(
-		this IObservable<TSource> source, 
-		Func<TException, IObservable<TSource>> handler) 
-		where TException : Exception
-	{
-		...
-	}
-
-The following Rx code allows you to catch a `TimeoutException`. 
-Instead of providing a second sequence, we provide a function that takes the exception and returns a sequence. 
-This allows you to use a factory to create your continuation.
-In this example, we add the value -1 to the error sequence and then complete it.
-
-	var source = new Subject<int>();
-	var result = source.Catch<int, TimeoutException>(tx=>Observable.Return(-1));
-
-	result.Dump("Catch");
-
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnError(new TimeoutException());
-
-Output:
-
-<div class="output">
-	<div class="line">Catch-->1</div>
-	<div class="line">Catch-->2</div>
-	<div class="line">Catch-->-1</div>
-	<div class="line">Catch completed</div>
-</div>
-
-If the sequence was to terminate with an `Exception` that could not be cast to a `TimeoutException`, then the error would not be caught and would flow through to the subscriber.
-
-	var source = new Subject<int>();
-	var result = source.Catch<int, TimeoutException>(tx=>Observable.Return(-1));
-
-	result.Dump("Catch");
-
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnError(new ArgumentException("Fail!"));
-
-Output:
-
-<div class="output">
-	<div class="line">Catch-->1</div>
-	<div class="line">Catch-->2</div>
-	<div class="line">Catch failed-->Fail!</div>
-</div>
-
-###Finally							{#Finally}
-
-Similar to the `finally` statement with SEH, Rx exposes the ability to execute code on completion of a sequence, regardless of how it terminates. 
-The `Finally` extension method accepts an `Action` as a parameter. 
-This `Action` will be invoked if the sequence terminates normally or erroneously, or if the subscription is disposed of.
-
-	public static IObservable<TSource> Finally<TSource>(
-		this IObservable<TSource> source, 
-		Action finallyAction)
-	{
-		...
-	}
-
-In this example, we have a sequence that completes. 
-We provide an action and see that it is called after our `OnCompleted` handler.
-
-	var source = new Subject<int>();
-	var result = source.Finally(() => Console.WriteLine("Finally action ran"));
-	result.Dump("Finally");
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnNext(3);
-	source.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">Finally-->1</div>
-	<div class="line">Finally-->2</div>
-	<div class="line">Finally-->3</div>
-	<div class="line">Finally completed</div>
-	<div class="line">Finally action ran</div>
-</div>
-
-In contrast, the source sequence could have terminated with an exception. 
-In that case, the exception would have been sent to the console, and then the delegate we provided would have been executed.
-
-Alternatively, we could have disposed of our subscription. 
-In the next example, we see that the `Finally` action is invoked even though the sequence does not complete.
-
-	var source = new Subject<int>();
-	var result = source.Finally(() => Console.WriteLine("Finally"));
-	var subscription = result.Subscribe(
-		Console.WriteLine,
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnNext(3);
-	subscription.Dispose();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">Finally</div>
-</div>
-
-Note that there is an anomaly in the current implementation of `Finally`.
-If there is no `OnError` handler provided, the error will be promoted to an exception and thrown. 
-This will be done before the `Finally` action is invoked. 
-We can reproduce this behavior easily by removing the `OnError` handler from our examples above.
-
-	var source = new Subject<int>();
-	var result = source.Finally(() => Console.WriteLine("Finally"));
-	result.Subscribe(
-		Console.WriteLine,
-		//Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-	source.OnNext(1);
-	source.OnNext(2);
-	source.OnNext(3);
-	//Brings the app down. Finally action is not called.
-	source.OnError(new Exception("Fail"));
-
-Hopefully this will be identified as a bug and fixed by the time you read this in the next release of Rx. 
-Out of academic interest, here is a sample of a `Finally` extension method that would work as expected.
-
-	public static IObservable<T> MyFinally<T>(
-		this IObservable<T> source, 
-		Action finallyAction)
-	{
-		return Observable.Create<T>(o =>
-		{
-			var finallyOnce = Disposable.Create(finallyAction);
-			var subscription = source.Subscribe(
-				o.OnNext,
-				ex =>
-				{
-					try { o.OnError(ex); }
-					finally { finallyOnce.Dispose(); }
-				},
-				() =>
-				{
-					try { o.OnCompleted(); }
-					finally { finallyOnce.Dispose(); }
-				});
-
-			return new CompositeDisposable(subscription, finallyOnce);
-		});
-	}
-
-###Using							{#Using}
-
-The `Using` factory method allows you to bind the lifetime of a resource to the lifetime of an observable sequence. 
-The signature itself takes two factory methods; one to provide the resource and one to provide the sequence. 
-This allows everything to be lazily evaluated.
-
-	public static IObservable<TSource> Using<TSource, TResource>(
-		Func<TResource> resourceFactory, 
-		Func<TResource, IObservable<TSource>> observableFactory) 
-		where TResource : IDisposable
-	{
-		...
-	}
-
-The `Using` method will invoke both the factories when you subscribe to the sequence.
-The resource will be disposed of when the sequence is terminated gracefully, terminated erroneously or when the subscription is disposed.
-
-To provide an example, we will reintroduce the `TimeIt` class from [Chapter 3](03_LifetimeManagement.html#IDisposable). 
-I could use this handy little class to time the duration of a subscription. 
-In the next example we create an observable sequence with the `Using` factory method. 
-We provide a factory for a `TimeIt` resource and a function that returns a sequence.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1));
-	var result = Observable.Using(
-		() => new TimeIt("Subscription Timer"),
-		timeIt => source);
-	result.Take(5).Dump("Using");
-
-Output:
-
-<div class="output">
-	<div class="line">Using-->0</div>
-	<div class="line">Using-->1</div>
-	<div class="line">Using-->2</div>
-	<div class="line">Using-->3</div>
-	<div class="line">Using-->4</div>
-	<div class="line">Using completed</div>
-	<div class="line">Subscription Timer took 00:00:05.0138199</div>
-</div>
-
-Due to the `Take(5)` decorator, the sequence completes after five elements and thus the subscription is disposed of. 
-Along with the subscription, the `TimeIt` resource is also disposed of, which invokes the logging of the elapsed time.
-
-This mechanism can find varied practical applications in the hands of an imaginative developer. 
-The resource being an `IDisposable` is convenient; indeed, it makes it so that many types of resources can be bound to, such as other subscriptions, stream reader/writers, database connections, user controls and, with `Disposable.Create(Action)`, virtually anything else.
-
-###OnErrorResumeNext				{#OnErrorResumeNext}
-
-Just the title of this section will send a shudder down the spines of old VB developers! 
-In Rx, there is an extension method called `OnErrorResumeNext` that has similar semantics to the VB keywords/statement that share the same name.
-This extension method allows the continuation of a sequence with another sequence regardless of whether the first sequence completes gracefully or due to an error.
-Under normal use, the two sequences would merge as below:
-
-<div class="marble">
-	<pre class="line">S1--0--0--|</pre>
-	<pre class="line">S2        --0--|</pre>
-	<pre class="line">R --0--0----0--|</pre>
-</div>
-
-In the event of a failure in the first sequence, then the sequences would still merge:
-
-<div class="marble">
-	<pre class="line">S1--0--0--X</pre>
-	<pre class="line">S2        --0--|</pre>
-	<pre class="line">R --0--0----0--|</pre>
-</div>
-
-The overloads to `OnErrorResumeNext` are as follows:
-
-	public static IObservable<TSource> OnErrorResumeNext<TSource>(
-		this IObservable<TSource> first, 
-		IObservable<TSource> second)
-	{
-		..
-	}
-	
-	public static IObservable<TSource> OnErrorResumeNext<TSource>(
-		params IObservable<TSource>[] sources)
-	{
-		...
-	}
-	
-	public static IObservable<TSource> OnErrorResumeNext<TSource>(
-		this IEnumerable<IObservable<TSource>> sources)
-	{
-		...
-	}
-
-It is simple to use; you can pass in as many continuations sequences as you like using the various overloads. 
-Usage should be limited however. 
-Just as the `OnErrorResumeNext` keyword warranted mindful use in VB, so should it be used with caution in Rx. 
-It will swallow exceptions quietly and can leave your program in an unknown state.
-Generally, this will make your code harder to maintain and debug.
-
-###Retry							{#Retry}
-
-If you are expecting your sequence to encounter predictable issues, you might simply want to retry. 
-One such example when you want to retry is when performing I/O (such as web request or disk access). 
-I/O is notorious for intermittent failures. 
-The `Retry` extension method offers the ability to retry on failure a specified number of times or until it succeeds.
-
-	//Repeats the source observable sequence until it successfully terminates.
-	public static IObservable<TSource> Retry<TSource>(
-		this IObservable<TSource> source)
-	{
-		...
-	}
-	
-	// Repeats the source observable sequence the specified number of times or until it 
-	//  successfully terminates.
-	public static IObservable<TSource> Retry<TSource>(
-		this IObservable<TSource> source, int retryCount)
-	{
-		...
-	}
-
-In the diagram below, the sequence (`S`) produces values then fails. 
-It is re-subscribed, after which it produces values and fails again; this happens a total of two times.
-The result sequence (`R`) is the concatenation of all the successive subscriptions to (`S`).
-
-<div class="marble">
-	<pre class="line">S --1--2--X</pre>
-	<pre class="line">            --1--2--3--X</pre>
-	<pre class="line">                         --1</pre>
-	<pre class="line">R --1--2------1--2--3------1</pre>
-</div>
-
-In the next example, we just use the simple overload that will always retry on any exception.
-
-	public static void RetrySample<T>(IObservable<T> source)
-	{
-		source.Retry().Subscribe(t=>Console.WriteLine(t)); //Will always retry
-		Console.ReadKey();
-	}
-
-Given the source [0,1,2,X], the output would be:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-</div>
-
-This output would continue forever, as we throw away the token from the subscribe method. 
-As a marble diagram it would look like this:
-
-<div class="marble">
-	<pre class="line">S--0--1--2--x</pre>
-	<pre class="line">             --0--1--2--x</pre>
-	<pre class="line">                         --0--</pre>
-	<pre class="line">R--0--1--2-----0--1--2-----0--</pre>
-</div>
-
-Alternatively, we can specify the maximum number of retries. 
-In this example, we only retry once, therefore the error that gets published on the second subscription will be passed up to the final subscription. 
-Note that to retry once you pass a value of 2. 
-Maybe the method should have been called `Try`?
-
-	source.Retry(2).Dump("Retry(2)"); 
-
-Output:
-
-<div class="output">
-	<div class="line">Retry(2)-->0</div>
-	<div class="line">Retry(2)-->1</div>
-	<div class="line">Retry(2)-->2</div>
-	<div class="line">Retry(2)-->0</div>
-	<div class="line">Retry(2)-->1</div>
-	<div class="line">Retry(2)-->2</div>
-	<div class="line">Retry(2) failed-->Test Exception</div>
-</div>
-
-As a marble diagram, this would look like:
-	
-<div class="marble">
-	<pre class="line">S--0--1--2--x</pre>
-	<pre class="line">             --0--1--2--x</pre>
-	<pre class="line">R--0--1--2-----0--1--2--x</pre>
-</div>
-
-Proper care should be taken when using the infinite repeat overload. 
-Obviously if there is a persistent problem with your underlying sequence, you may find yourself stuck in an infinite loop.
-Also, take note that there is no overload that allows you to specify the type of exception to retry on.
-
-A useful extension method to add to your own library might be a "Back Off and Retry" method. 
-The teams I have worked with have found such a feature useful when performing I/O, especially network requests. 
-The concept is to try, and on failure wait for a given period of time and then try again. 
-Your version of this method may take into account the type of `Exception` you want to retry on, as well as the maximum number of times to retry. 
-You may even want to lengthen the to wait period to be less aggressive on each subsequent retry.
-
-<!--TODO: Build BackOffRetry with the reader-->
-
-Requirements for exception management that go beyond simple `OnError` handlers are commonplace. 
-Rx delivers the basic exception handling operators which you can use to compose complex and robust queries. 
-In this chapter we have covered advanced error handling and some more resource management features from Rx.
-We looked at the `Catch`, `Finally` and `Using` methods as well as the other methods like `OnErrorResumeNext` and `Retry`, that allow you to play a little 'fast and loose'. 
-We have also revisited the use of marble diagrams to help us visualize the combination of multiple sequences. 
-This will help us in our next chapter where we will look at other ways of composing and aggregating observable sequences.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Domain Driven Design (Kindle) Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00794TAUG&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Purely functional data structures Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0521663504&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>                  
-	</div>
</div>

+ 1047 - 0
Rx.NET/Documentation/IntroToRx/11_SchedulingAndThreading.md

@@ -0,0 +1,1047 @@
+# Scheduling and Threading
+
+Rx is primarily a system for working with _data in motion_ asynchronously. If we are dealing with multiple information sources, they may well generate data concurrently. We may want some degree of parallelism when processing data to achieve our scalability targets. We will need control over these aspects of our system.
+
+So far, we have managed to avoid any explicit usage of threading or concurrency. We have seen some methods that must deal with timing to perform their jobs. (For example, `Buffer`, `Delay`, and `Sample` must arrange for work to happen on a particular schedule.) However, we have relied on the default behaviour, and although the defaults often do what we want, we sometimes need to exercise more control. This chapter will look at Rx's scheduling system, which offers an elegant way to manage these concerns.
+
+## Rx, Threads and Concurrency
+
+Rx does not impose constraints on which threads we use. An `IObservable<T>` is free to invoke its subscribers' `OnNext/Completed/Error` methods on any thread, perhaps a different thread for each call. Despite this free-for-all, there is one aspect of Rx that prevents chaos: observable sources must obey the [Fundamental Rules of Rx Sequences](02_KeyTypes.md#the-fundamental-rules-of-rx-sequences) under all circumstances.
+
+When we first explored these rules, we focused on how they determine the ordering of calls into any single observer. There can be any number of calls to `OnNext`, but once either `OnError` or `OnCompleted` have been invoked, there must be no further calls. But now that we're looking at concurrency, a different aspect of these rules becomes more important: for any single subscription, an observable source must not make concurrent calls into that subscription's observer. So if a source calls `OnNext`, it must wait until that call returns before either calling `OnNext` again, or calling `OnError` or `OnComplete`.
+
+The upshot for observers is that as long as your observer is involved in just one subscription, it will only ever be asked to deal with one thing at a time. If doesn't matter if the source to which it is subscribed is a long and complex processing chain involving many different operators. Even if you build that source by combining multiple inputs (e.g., using [`Merge`](09_CombiningSequences.md#merge)), the fundamental rules require that if you called `Subscribe` just once on a single `IObservable<T>`, that source is never allowed to make multiple concurrent calls into your `IObserver<T>` methods.
+
+So although each call might come in on a different thread, the calls are strictly sequential (unless a single observer is involved in multiple subscriptions).
+
+Rx operators that receive incoming notifications as well as producing them will notify their observers on whatever thread the incoming notification happened to arrive on. Suppose you have a sequence of operators like this:
+
+```csharp
+source
+    .Where(x => x.MessageType == 3)
+    .Buffer(10)
+    .Take(20)
+    .Subscribe(x => Console.WriteLine(x));
+```
+
+When that call to `Subscribe` happens, we end up with a chain of observers. The Rx-supplied observer that will invoke our callback was passed to the observable returned by `Take`, which will in turn create an observer that subscribed to the observable returned by `Buffer`, which will in turn create an observer subscribed to the `Where` observable, which will have created yet another observer which is subscribed to `source`.
+
+So when `source` decides to produce an item, it will invoke the `Where` operator's observer's `OnNext`. That will invoke the predicate, and if the `MessageType` is indeed 3, the `Where` observer will call `OnNext` on the `Buffer`'s observer, and it will do this on the same thread. The `Where` observer's `OnNext` isn't going to return until the `Buffer` observer's `OnNext` returns. Now if the `Buffer` observer determines that it has completely filled a buffer (e.g., it just received its 10th item), then it is also not going to return yet—it's going to invoke the `Take` observer's `OnNext`, and as long as `Take` hasn't already received 20 buffers, it's going to call `OnNext` on the Rx-supplied observer that will invoke our callback.
+
+So for the source notifications that make it all the way through to that `Console.WriteLine` in the callback passed to subscribe, we end up with a lot of nested calls on the stack:
+
+```
+`source` calls:
+  `Where` observer, which calls:
+    `Buffer` observer, which calls:
+      `Take` observer, which calls:
+        `Subscribe` observer, which calls our lambda
+```
+
+This is all happening on one thread. Most Rx operators don't have any one particular thread that they call home. They just do their work on whatever thread the call comes in on. This makes Rx pretty efficient. Passing data from one operator to the next merely involves a method call, and those are pretty fast. (In fact, there are typically a few more layers. Rx tends to add a few wrappers to handle errors and early unsubscription. So the call stack will look a bit more complex than what I've just shown. But it's still typically all just method calls.)
+
+You will sometimes hear Rx described as having a _free threaded_ model. All that means is that operators don't generally care what thread they use. As we will see, there are exceptions, but this direct calling by one operator of the next is the norm.
+
+An upshot of this is that it's typically the original source that determines which thread is used. This next example illustrates this by creating a subject, then calling `OnNext` on various threads and reporting the thread id.
+
+```csharp
+Console.WriteLine($"Main thread: {Environment.CurrentManagedThreadId}");
+var subject = new Subject<string>();
+
+subject.Subscribe(
+    m => Console.WriteLine($"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+
+object sync = new();
+ParameterizedThreadStart notify = arg =>
+{
+    string message = arg?.ToString() ?? "null";
+    Console.WriteLine(
+        $"OnNext({message}) on thread: {Environment.CurrentManagedThreadId}");
+    lock (sync)
+    {
+        subject.OnNext(message);
+    }
+};
+
+notify("Main");
+new Thread(notify).Start("First worker thread");
+new Thread(notify).Start("Second worker thread");
+```
+
+Output:
+
+```
+Main thread: 1
+OnNext(Main) on thread: 1
+Received Main on thread: 1
+OnNext(First worker thread) on thread: 10
+Received First worker thread on thread: 10
+OnNext(Second worker thread) on thread: 11
+Received Second worker thread on thread: 11
+```
+
+In each case, the handler passed to `Subscribe` was called back on the same thread that made the call to `subject.OnNext`. This is straightforward and efficient. However, things are not always this simple.
+
+## Timed invocation
+
+Some notifications will not be the immediate result of a source providing an item. For example, Rx offers a [`Delay`](12_Timing.md#delay) operator, which time shifts the delivery of items. This next example is based on the preceding one, with the main difference being that we no longer subscribe directly to the source. We go via `Delay`:
+
+```csharp
+Console.WriteLine($"Main thread: {Environment.CurrentManagedThreadId}");
+var subject = new Subject<string>();
+
+subject
+    .Delay(TimeSpan.FromSeconds(0.25))
+    .Subscribe(
+    m => Console.WriteLine($"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+
+object sync = new();
+ParameterizedThreadStart notify = arg =>
+{
+    string message = arg?.ToString() ?? "null";
+    Console.WriteLine(
+        $"OnNext({message}) on thread: {Environment.CurrentManagedThreadId}");
+    lock (sync)
+    {
+        subject.OnNext(message);
+    }
+};
+
+notify("Main 1");
+Thread.Sleep(TimeSpan.FromSeconds(0.1));
+notify("Main 2");
+Thread.Sleep(TimeSpan.FromSeconds(0.3));
+notify("Main 3");
+new Thread(notify).Start("First worker thread");
+Thread.Sleep(TimeSpan.FromSeconds(0.1));
+new Thread(notify).Start("Second worker thread");
+
+Thread.Sleep(TimeSpan.FromSeconds(2));
+```
+
+This also waits for a while between sending source items, so we can see the effect of `Delay`. Here's the output:
+
+```
+Main thread: 1
+OnNext(Main 1) on thread: 1
+OnNext(Main 2) on thread: 1
+Received Main 1 on thread: 12
+Received Main 2 on thread: 12
+OnNext(Main 3) on thread: 1
+OnNext(First worker thread) on thread: 13
+OnNext(Second worker thread) on thread: 14
+Received Main 3 on thread: 12
+Received First worker thread on thread: 12
+Received Second worker thread on thread: 12
+```
+
+Notice that in this case every `Received` message is on thread id 12, which is different from any of the three threads on which the notifications were raised.
+
+This shouldn't be entirely surprising. The only way Rx could have used the original thread here would be for `Delay` to block the thread for the specified time (a quarter of a second here) before forwarding the call. This would be unacceptable for most scenarios, so instead, the `Delay` operator arranges for a callback to occur after a suitable delay. As you can see from the output, these all seems to happen on one particular thread. No matter which thread calls `OnNext`, the delayed notification arrives on thread id 12. But this is not a thread created by the `Delay` operator. This is happening because `Delay` is using a _scheduler_.
+
+## Schedulers
+
+Schedulers do three things:
+
+* determining the context in which to execute work (e.g., a certain thread)
+* deciding when to execute work (e.g., immediately, or deferred)
+* keeping track of time
+
+Here's a simple example to explore the first two of those:
+
+```csharp
+Console.WriteLine($"Main thread: {Environment.CurrentManagedThreadId}");
+
+Observable
+    .Range(1, 5)
+    .Subscribe(m => 
+      Console.WriteLine(
+        $"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+
+Console.WriteLine("Subscribe returned");
+Console.ReadLine();
+```
+
+It might not be obvious that this has anything to do with scheduling, but in fact, `Range` always uses a scheduler to do its work. We've just let it use its default scheduler. Here's the output:
+
+```
+Main thread: 1
+Received 1 on thread: 1
+Received 2 on thread: 1
+Received 3 on thread: 1
+Received 4 on thread: 1
+Received 5 on thread: 1
+Subscribe returned
+```
+
+Looking at the first two items in our list of what schedulers do, we can see that the context in which this has executed the work is the thread on which I called `Subscribe`. And as for when it has decided to execute the work, it has decided to do it all before `Subscribe` returns. So you might think that `Range` immediately produces all of the items we've asked for and then returns. However, it's not quite as simple as that. Let's look at what happens if we have multiple `Range` instances running simultaneously. This introduces an extra operator: a `SelectMany` that calls `Range` again:
+
+```csharp
+Observable
+    .Range(1, 5)
+    .SelectMany(i => Observable.Range(i * 10, 5))
+    .Subscribe(m => 
+      Console.WriteLine(
+        $"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+```
+
+The output shows that `Range` doesn't in fact necessarily produce all of its items immediately:
+
+```
+Received 10 on thread: 1
+Received 11 on thread: 1
+Received 20 on thread: 1
+Received 12 on thread: 1
+Received 21 on thread: 1
+Received 30 on thread: 1
+Received 13 on thread: 1
+Received 22 on thread: 1
+Received 31 on thread: 1
+Received 40 on thread: 1
+Received 14 on thread: 1
+Received 23 on thread: 1
+Received 32 on thread: 1
+Received 41 on thread: 1
+Received 50 on thread: 1
+Received 24 on thread: 1
+Received 33 on thread: 1
+Received 42 on thread: 1
+Received 51 on thread: 1
+Received 34 on thread: 1
+Received 43 on thread: 1
+Received 52 on thread: 1
+Received 44 on thread: 1
+Received 53 on thread: 1
+Received 54 on thread: 1
+Subscribe returned
+```
+
+The first nested `Range` produces by the `SelectMany` callback produces a couple of values (10 and 11) but then the second one manages to get its first value out (20) before the first one produces its third (12). You can see there's some interleaving of progress here. So although the context in which work is executed continues to be the thread on which we invoked `Subscribe`, the second choice the scheduler has to make—when to execute the work—is more subtle than it first seems. This tells us that `Range` is not as simple as this naive implementation:
+
+```csharp
+public static IObservable<int> NaiveRange(int start, int count)
+{
+    return System.Reactive.Linq.Observable.Create<int>(obs =>
+    {
+        for (int i = 0; i < count; i++)
+        {
+            obs.OnNext(start + i);
+        }
+
+        return Disposable.Empty;
+    });
+}
+```
+
+If `Range` worked like that, this code would produce all of the items from the first range returned by the `SelectMany` callback before moving on to the next. In fact, Rx does provide a scheduler that would give us that behaviour if that's what we want. This example passes `ImmediateScheduler.Instance` to the nested `Observable.Range` call:
+
+```csharp
+Observable
+    .Range(1, 5)
+    .SelectMany(i => Observable.Range(i * 10, 5, ImmediateScheduler.Instance))
+    .Subscribe(
+    m => Console.WriteLine($"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+```
+
+Here's the outcome:
+
+```
+Received 10 on thread: 1
+Received 11 on thread: 1
+Received 12 on thread: 1
+Received 13 on thread: 1
+Received 14 on thread: 1
+Received 20 on thread: 1
+Received 21 on thread: 1
+Received 22 on thread: 1
+Received 23 on thread: 1
+Received 24 on thread: 1
+Received 30 on thread: 1
+Received 31 on thread: 1
+Received 32 on thread: 1
+Received 33 on thread: 1
+Received 34 on thread: 1
+Received 40 on thread: 1
+Received 41 on thread: 1
+Received 42 on thread: 1
+Received 43 on thread: 1
+Received 44 on thread: 1
+Received 50 on thread: 1
+Received 51 on thread: 1
+Received 52 on thread: 1
+Received 53 on thread: 1
+Received 54 on thread: 1
+Subscribe returned
+```
+
+By specifying `ImmediateScheduler.Instance` in the innermost call to `Observable.Range` we've asked for a particular policy: this invokes all work on the caller's thread, and it always does so immediately. There are a couple of reasons this is not `Range`'s default. (Its default is `Scheduler.CurrentThread`, which always returns an instance of `CurrentThreadScheduler`.) First, `ImmediateScheduler.Instance` can end up causing fairly deep call stacks. Most of the other schedulers maintain work queues, so if one operator decides it has new work to do while another is in the middle of doing something (e.g., a nested `Range` operator decides to start emitting its values), instead of starting that work immediately (which will involve invoking the method that will do the work) that work can be put on a queue instead, enabling the work already in progress to finish before starting on the next thing. Using the immediate scheduler everywhere can cause stack overflows when queries become complex. The second reason `Range` does not use the immediate scheduler by default is so that when multiple observables are all active at once, they can all make some progress—`Range` produces all of its items as quickly as it can, so it could end up starving other operators of CPU time if it didn't use a scheduler that enabled operators to take it in turns.
+
+Notice that the `Subscribe returned` message appears last in both examples. So although the `CurrentThreadScheduler` isn't quite as eager as the immediate scheduler, it still won't return to its caller until it has completed all outstanding work. It maintains a work queue, enabling slightly more fairness, and avoiding stack overflows, but as soon as anything asks the `CurrentThreadScheduler` to do something, it won't return until it has drained its queue.
+
+Not all schedulers have this characteristic. Here's a variation on the earlier example in which we have just a single call to `Range`, without any nested observables. This time I'm asking it to use the `TaskPoolScheduler`.
+
+```csharp
+Observable
+    .Range(1, 5, TaskPoolScheduler.Default)
+    .Subscribe(
+    m => Console.WriteLine($"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+```
+
+This makes a different decision about the context in which to run work, compared to the immediate and current thread schedulers, as we can see from its output:
+
+```
+Main thread: 1
+Subscribe returned
+Received 1 on thread: 12
+Received 2 on thread: 12
+Received 3 on thread: 12
+Received 4 on thread: 12
+Received 5 on thread: 12
+```
+
+Notice that the notifications all happened on a different thread (with id 12) than the thread on which we invoked `Subscribe` (id 1). That's because the `TaskPoolScheduler`'s defining feature is that it invokes all work through the Task Parallel Library's (TPL) task pool. That's why we see a different thread id: the task pool doesn't own our application's main thread. In this case, it hasn't seen any need to spin up multiple threads. That's reasonable, there's just a single source here providing item one at a time. It's good that we didn't get more threads in this case—the thread pool is at its most efficient when a single thread processes work items sequentially, because it avoids context switching overheads, and since there's no actual scope for concurrent work here, we would gain nothing if it had created multiple threads in this case.
+
+There's one other very significant difference with this scheduler: notice that the call to `Subscribe` returned before _any_ of the notifications reached our observer. That's because this is the first scheduler we've looked at that will introduce real parallelism. The `ImmediateScheduler` and `CurrentThreadScheduler` will never spin up new threads by themselves, no matter how much the operators executing might want to perform concurrent operations. And although the `TaskPoolScheduler` determined that there's no need for it to create multiple threads, the one thread it did create is a different thread from the application's main thread, meaning that the main thread can continue to run in parallel with this subscription. Since `TaskPoolScheduler` isn't going to do any work on the thread that initiated the work, it can return as soon as it has queued the work up, enabling the `Subscribe` method to return immediately.
+
+What if we use the `TaskPoolScheduler` in the example with nested observables? This uses it just on the inner call to `Range`, so the outer one will still use the default `CurrentThreadScheduler`:
+
+```csharp
+Observable
+    .Range(1, 5)
+    .SelectMany(i => Observable.Range(i * 10, 5, TaskPoolScheduler.Default))
+    .Subscribe(
+    m => Console.WriteLine($"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+```
+
+Now we can see a few more threads getting involved:
+
+```
+Received 10 on thread: 13
+Received 11 on thread: 13
+Received 12 on thread: 13
+Received 13 on thread: 13
+Received 40 on thread: 16
+Received 41 on thread: 16
+Received 42 on thread: 16
+Received 43 on thread: 16
+Received 44 on thread: 16
+Received 50 on thread: 17
+Received 51 on thread: 17
+Received 52 on thread: 17
+Received 53 on thread: 17
+Received 54 on thread: 17
+Subscribe returned
+Received 14 on thread: 13
+Received 20 on thread: 14
+Received 21 on thread: 14
+Received 22 on thread: 14
+Received 23 on thread: 14
+Received 24 on thread: 14
+Received 30 on thread: 15
+Received 31 on thread: 15
+Received 32 on thread: 15
+Received 33 on thread: 15
+Received 34 on thread: 15
+```
+
+Since we have only a single observer in this example, the rules of Rx require it to be given items one at a time, so in practice there wasn't really any scope for parallelism here, but the more complex structure would have resulted in more work items initially going into the scheduler's queue than in the preceding example, which is probably why the work got picked up by more than one thread this time. In practice most of these threads would have spent most of their time blocked in the code inside `SelectMany` that ensures that it delivers one item at a time to its target observer. It's perhaps a little surprising that the items are not more scrambled. The subranges themselves seem to have emerged in a random order, but it has almost produced the items sequentially within each subrange (with item 14 being the one exception to that). This is a quirk relating to the way in which `Range` interacts with the `TaskPoolScheduler`.
+
+I've not yet talked about the scheduler's third job: keeping track of time. This doesn't arise with `Range` because it attempts to produce all of its items as quickly as it can. But for the `Delay` operator I showed in the [Timed Invocation](#timed-invocation) section, timing is obviously a critical element. In fact this would be a good point to show the API that schedulers offer:
+
+```csharp
+public interface IScheduler
+{
+    DateTimeOffset Now { get; }
+    
+    IDisposable Schedule<TState>(TState state, 
+                                 Func<IScheduler, TState, IDisposable> action);
+    
+    IDisposable Schedule<TState>(TState state, 
+                                 TimeSpan dueTime, 
+                                 Func<IScheduler, TState, IDisposable> action);
+    
+    IDisposable Schedule<TState>(TState state, 
+                                 DateTimeOffset dueTime, 
+                                 Func<IScheduler, TState, IDisposable> action);
+}
+```
+
+You can see that all but one of these is concerned with timing. Only the first `Schedule` overload is not, and operators call that when they want to schedule work to run as soon as the scheduler will allow. That's the overload used by `Range`. (Strictly speaking, `Range` interrogates the scheduler to find out whether it supports long-running operations, in which an operator can take temporary control of a thread for an extended period. It prefers to use that when it can because it tends to be more efficient than submitting work to the scheduler for every single item it wishes to produce. The `TaskPoolScheduler` does support long running operations, which explains the slightly surprising output we saw earlier, but the `CurrentThreadScheduler`, `Range`'s default choice, does not. So by default, `Range` will invoke that first `Schedule` overload once for each item it wishes to produce.)
+
+`Delay` uses the second overload. The exact implementation is quite complex (mainly because of how it catches up efficiently when a busy source causes it to fall behind) but in essence, each time a new item arrives into the `Delay` operator, it schedules a work item to run after the configured delay, so that it can supply that item to its subscriber with the expected time shift.
+
+Schedulers have to be responsible for managing time, because .NET has several different timer mechanisms, and the choice of timer is often determined by the context in which you want to handle a timer callback. Since schedulers determine the context in which work runs, that means they must also choose the timer type. For example, UI frameworks typically provide timers that invoke their callbacks in a context suitable for making updates to the user interface. Rx provides some UI-framework-specific schedulers that use these timers, but these would be inappropriate choices for other scenarios. So each scheduler uses a timer suitable for the context in which it is going to run work items.
+
+There's a useful upshot of this: because `IScheduler` provides an abstraction for timing-related details, it is possible to virtualize time. This is very useful for testing. If you look at the extensive test suite in the [Rx repository](https://github.com/dotnet/reactive) you will find that there are many tests that verify timing-related behaviour. If these ran in real-time, the test suite would take far too long to run, and would also be likely to produce the odd spurious failure, because background tasks running on the same machine as the tests will occasionally change the speed of execution in a way that might confuse the test. Instead, these tests use a specialized scheduler that provides complete control over the passage of time. (For more information, see the [ Test Schedulers section later](#test-schedulers) and there's also a whole [testing chapter](16_TestingRx.md) coming up.)
+
+Notice that all three `IScheduler.Schedule` methods require a callback. A scheduler will invoke this at the time and in the context that it chooses. A scheduler callback takes another `IScheduler` as its first argument. This is used in scenarios where repetitive invocation is required, as we'll see later. 
+
+Rx supplies several schedulers. The following sections describe the most widely used ones.
+
+### ImmediateScheduler
+
+`ImmediateScheduler` is the simplest scheduler Rx offers. As you saw in the preceding sections, whenever it is asked to schedule some work, it just runs it immediately. It does this inside its `IScheduler.Schedule` method.
+
+This is a very simple strategy, and it makes `ImmediateScheduler` very efficient. For this reason, many operators default to using `ImmediateScheduler`. However, it can be problematic with operators that instantly produce multiple items, especially when the number of items might be large. For example, Rx defines the [`ToObservable` extension method for `IEnumerable<T>`](03_CreatingObservableSequences.md#from-ienumerablet). When you subscribe to an `IObservable<T>` returned by this, it will start iterating over the collection immediately, and if you were to tell it to use the `ImmediateScheduler`, `Subscribe` would not return until it reached the end of the collection. That would obviously be a problem for an infinite sequence, and it's why operators of this kind do not use `ImmediateScheduler` by default.
+
+The `ImmediateScheduler` also has potentially surprising behaviour when you invoke the `Schedule` overload that takes a `TimeSpan`. This asks the scheduler to run some work after the specified length of time. The way it achieves this is to call `Thread.Sleep`. With most of Rx's schedulers, this overload will arrange for some sort of timer mechanism to run the code later, enabling the current thread to get on with its business, but `ImmediateScheduler` is true to its name here, in that it refuses to engage in such deferred execution. It just blocks the current thread until it is time to do the work. This means that time-based observables like those returned by `Interval` would work if you specified this scheduler, but at the cost of preventing the thread from doing anything else.
+
+The `Schedule` overload that takes a `DateTime` is slightly different. If you specify a time less than 10 seconds into the future, it will block the calling thread like it does when you use `TimeSpan`. But if you pass a `DateTime` that is further into the future, it gives up on immediate execution, and falls back to using a timer.
+
+### CurrentThreadScheduler
+
+The `CurrentThreadScheduler` is very similar to the `ImmediateScheduler`. The difference is how it handles requests to schedule work when an existing work item is already being handled on the current thread. This can happen if you chain together multiple operators that use schedulers to do their work.
+
+To understand what happens, it's helpful to know how sources that produce multiple items in quick succession, such as the [`ToObservable` extension method for `IEnumerable<T>`](03_CreatingObservableSequences.md#from-ienumerablet) or [`Observable.Range`](03_CreatingObservableSequences.md#observablerange), use schedulers. These kinds of operators do not use normal `for` or `foreach` loops. They typically schedule a new work item for each iteration (unless the scheduler happens to make special provisions for long-running work). Whereas the `ImmediateScheduler` will run such work immediately, the `CurrentThreadScheduler` checks to see if it is already processing a work item. We saw that with this example from earlier:
+
+```csharp
+Observable
+    .Range(1, 5)
+    .SelectMany(i => Observable.Range(i * 10, 5))
+    .Subscribe(
+        m => Console.WriteLine($"Received {m} on thread: {Environment.CurrentManagedThreadId}"));
+```
+
+Let's follow exactly what happens here. First, assume that this code is just running normally and not in any unusual context—perhaps inside the `Main` entry point of a program. When this code calls `Subscribe` on the `IObservable<int>` returned by `SelectMany`, that will in turn will call `Subscribe` on the `IObservable<int>` returned by the first `Observable.Range`, which will in turn schedule a work item for the generation of the first value in the range (`1`).
+
+Since we didn't pass a scheduler explicitly to `Range`, it will use its default choice, the `CurrentThreadScheduler`, and that will ask itself "Am I already in the middle of handling some work item on this thread?" In this case the answer will be "no," so it will run the work item immediately (before returning from the `Schedule` call made by the `Range` operator). The `Range` operator will then produce its first value, calling `OnNext` on the `IObserver<int>` that the `SelectMany` operator provided when it subscribed to the range.
+
+The `SelectMany` operator's `OnNext` method will now invoke its lambda, passing in the argument supplied (the value `1` from the `Range` operator). You can see from the example above that this lambda calls `Observable.Range` again, returning a new `IObservable<int>`. `SelectMany` will immediately subscribe to this (before returning from its `OnNext`). This is the second time this code has ended up calling `Subscribe` on an `IObservable<int>` returned by a `Range` (but it's a different instance than the last time), and `Range` will once again default to using the `CurrentThreadScheduler`, and will once again schedule a work item to perform the first iteration.
+
+So once again,the `CurrentThreadScheduler` will ask itself "Am I already in the middle of handling some work item on this thread?" But this time, the answer will be yes. And this is where the behaviour is different than `ImmediateScheduler`. The `CurrentThreadScheduler` maintains a queue of work for each thread that it gets used on, and in this case it just adds the newly scheduled work to the queue, and returns back to the `SelectMany` operators `OnNext`.
+
+`SelectMany` has now completed its handling of this item (the value `1`) from the first `Range`, so its `OnNext` returns. At this point, this outer `Range` operator schedules another work item. Again, the `CurrentThreadScheduler` will detect that it is currently running a work item, so it just adds this to the queue.
+
+Having scheduled the work item that is going to generate its second value (`2`), the `Range` operator returns. Remember, the code in the `Range` operator that was running at this point was the callback for the first scheduled work item, so it's returning to the `CurrentThreadScheduler`—we are back inside its `Schedule` method (which was invoked by the range operator's `Subscribe` method).
+
+At this point, the `CurrentThreadScheduler` does not return from `Schedule` because it checks its work queue, and will see that there are now two items in the queue. (There's the work item that the nested `Range` observable scheduled to generate its first value, and there's also the work item that the top-level `Range` observable just scheduled to generate its second value.) The `CurrentThreadScheduler` will now execute the first of these: the nested `Range` operator now gets to generate its first value (which will be `10`), so it calls `OnNext` on the observer supplied by `SelectMany`, which will then call its observer, which was supplied thanks to the top-level call to `Subscribe` in the example. And that observer will just call the lambda we passed to `Subscribe`, causing our `Console.WriteLine` to run. After that returns, the nested `Range` operator will schedule another work item to generate its second item. Again, the `CurrentThreadScheduler` will realise that it's already in the middle of handling a work item on this thread, so it just puts it in the queue and then returns immediately from `Schedule`. The nested `Range` operator is now done for this iteration so it returns back to the scheduler. The scheduler will now pick up the next item in the queue, which in this case is the work item added by the top-level `Range` to produce the second item.
+
+And so it continues. This queuing of work items when work is already in progress is what enables multiple observable sources to make progress in parallel.
+
+By contrast, the `ImmediateScheduler` runs new work items immediately, which is why we don't see this parallel progress.
+
+(To be strictly accurate, there are certain scenarios in which `ImmediateScheduler` can't run work immediately. In these iterative scenarios, it actually supplies a slightly different scheduler that the operators use to schedule all work after the first item, and this checks whether it's being asked to process multiple work items simultaneously. If it is, it falls back to a queuing strategy similar to `CurrentThreadScheduler`, except it's a queue local to the initial work item, instead of a per-thread queue. This prevents problems due to multithreading, and it also avoids stack overflows that would otherwise occur when an iterative operator schedules a new work item inside the handler for the current work item. Since the queue is not shared across all work in the thread, this still has the effect of ensuring that any nested work queued up by a work item completes before the call to `Schedule` returns. So even when this queueing kicks in, we typically don't see interleaving of work from separate sources like we do with `CurrentThreadScheduler`. For example, if we told the nested `Range` to use `ImmediateScheduler`, this queueing behaviour would kick in as `Range` starts to iterate, but because the queue is local to initial work item executed by that nested `Range`, it will end up producing all of the nested `Range` items before returning.)
+
+### DefaultScheduler
+
+The `DefaultScheduler` is intended for work that may need to be spread out over time, or where you are likely to want concurrent execution. These features mean that this can't guarantee to run work on any particular thread, and in practice it schedules work via the CLR's thread pool. This is the default scheduler for all of Rx's time-based operators, and also for the `Observable.ToAsync` operator that can wrap a .NET method as an `IObservable<T>`.
+
+Although this scheduler is useful if you would prefer work not to happen on your current thread—perhaps you're writing an application with a user interface and you prefer to avoid doing too much work on the thread responsible for updating the UI and responding to user input—the fact that it can end up running work on any thread may make like complicated. What if you want all the work to happen on one thread, just not the thread you're on now? There's another scheduler for that.
+
+### EventLoopScheduler
+
+The `EventLoopScheduler` provides one-at-a-time scheduling, queuing up newly scheduled work items. This is similar to how the `CurrentThreadScheduler` operates if you use it from just one thread. The difference is that `EventLoopScheduler` creates a dedicated thread for this work instead of using whatever thread you happen to schedule the work from.
+
+Unlike the schedulers we've examined so far, there is no static property for obtaining an `EventLoopScheduler`. That's because each one has its own thread, so you need to create one explicitly. It offers two constructors:
+
+```csharp
+public EventLoopScheduler()
+public EventLoopScheduler(Func<ThreadStart, Thread> threadFactory)
+```
+
+The first creates a thread for you. The second lets you control the thread creation process. It invokes the callback you supply, and it will pass this its own callback that you are required to run on the newly created thread.
+
+The `EventLoopScheduler` implements `IDisposable`, and calling Dispose will allow the thread to terminate. This can work nicely with the `Observable.Using` method. The following example shows how to use an `EventLoopScheduler` to iterate over all contents of an `IEnumerable<T>` on a dedicated thread, ensuring that the thread exits once we have finished:
+
+```csharp
+IEnumerable<int> xs = GetNumbers();
+Observable
+    .Using(
+        () => new EventLoopScheduler(),
+        scheduler => xs.ToObservable(scheduler))
+    .Subscribe(...);
+```
+
+### NewThreadScheduler
+
+The `NewThreadScheduler` creates a new thread to execute every work item it is given. This is unlikely to make sense in most scenarios. However, it might be useful in cases where you want to execute some long running work, and represent its completion through an `IObservable<T>`. The `Observable.ToAsync` does exactly this, and will normally use the `DefaultScheduler`, meaning it will run the work on a thread pool thread. But if the work is likely to take more than second or two, the thread pool may not be a good choice, because it is optimized for short execution times, and its heuristics for managing the size of the thread pool are not designed with long-running operations in mind. The `NewThreadScheduler` may be a better choice in this case.
+
+Although each call to `Schedule` creates a new thread, the `NewThreadScheduler` passes a different scheduler into work item callbacks, meaning that anything that attempts to perform iterative work will not create a new thread for every iteration. For example, if you use `NewThreadScheduler` with `Observable.Range`, you will get a new thread each time you subscribe to the resulting `IObservable<int>`, but you won't get a new thread for each item, even though `Range` does schedule a new work item for each value it produces. It schedules these per-value work items through the nested scheduler supplied to the work item callback, and the nested scheduler that `NewThreadScheduler` supplies in these cases invokes all such nested work items on the same thread.
+
+### SynchronizationContextScheduler
+
+This invokes all work through a [`SynchronizationContext`](https://learn.microsoft.com/en-us/dotnet/api/system.threading.synchronizationcontext). This is useful in user interface scenarios. Most .NET client-side user interface frameworks make a `SynchronizationContext` available that can be used to invoke callbacks in a context suitable for making changes to the UI. (Typically this involves invoking them on the correct thread, but individual implementations can decide what constitutes the appropriate context.)
+
+### TaskPoolScheduler
+
+Invokes all work via the thread pool using [TPL tasks](https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl). The TPL was introduced many years after the CLR thread pool, and is now the recommended way to launch work via the thread pool. At the time the TPL was added, the thread pool would use a slightly different algorithm when you scheduled work through tasks than it would use if you relied on the older thread pool APIs. This newer algorithm enabled it to be more efficient in some scenarios. The documentation is now rather vague about this, so it's not clear whether these differences still exist on modern .NET, but tasks continue to be the recommended mechanism for using the thread pool. Rx's DefaultScheduler uses the older CLR thread pool APIs for backwards compatibility reasons. In performance critical code you could try using the `TaskPoolScheduler` instead in cases where a lot of work is being run on thread pool threads to see if it offers any performance benefits for your workload.
+
+### ThreadPoolScheduler
+
+Invokes all work through the thread pool using the old pre-[TPL](https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl) API. This type is a historical artifact, dating back to when not all platforms offered the same kind of thread pool. In almost all cases, if you want the behaviour for which this type was designed, you should use the `DefaultScheduler` (although [`TaskPoolScheduler`](#taskpoolscheduler) offers a different behaviour that might be). The only scenario in which using `ThreadPoolScheduler` makes any difference is when writing UWP applications. The UWP target of `System.Reactive` v6.0 provides a different implementation of this class than you get for all other targets. It uses `Windows.System.Threading.ThreadPool` whereas all other targets use `System.Threading.ThreadPool`. The UWP version provides properties letting you configure some features specific to the UWP thread pool.
+
+In practice it's best to avoid this class in new code. The only reason the UWP target had a different implementation was that UWP used not to provide `System.Threading.ThreadPool`. But that changed when UWP added support for .NET Standard 2.0 in Windows version 10.0.19041. There is no longer any good reason for there to be a UWP-specific `ThreadPoolScheduler`, and it's a source of confusion that this type is quite different in the UWP target but it has to remain for backwards compatibility purposes. (It may well be deprecated because Rx 7 will be addressing some problems arising from the fact that the `System.Reactive` component currently has direct dependencies on UI frameworks.) If you use the `DefaultScheduler` you will be using the `System.Threading.ThreadPool` no matter which platform you are running on.
+
+### UI Framework Schedulers: ControlScheduler, DispatcherScheduler and CoreDispatcherScheduler
+
+Although the `SynchronizationContextScheduler` will work for all widely used client-side UI frameworks in .NET, Rx offers more specialized schedulers. `ControlScheduler` is for Windows Forms applications, `DispatcherScheduler` for WPF, and `CoreDispatcherScheduler` for UWP.
+
+These more specialized types offer two benefits. First, you don't necessarily have to be on the target UI thread to obtain an instance of these schedulers. Whereas with `SynchronizationContextScheduler` the only way you can generally obtain the `SynchronizationContext` this requires is by retrieving `SynchronizationContext.Current` while running on the UI thread. But these other UI-framework-specific schedulers can be passed a suitable `Control`, `Dispatcher` or `CoreDispatcher`, which it's possible to obtain from a non-UI thread. Second, `DispatcherScheduler` and `CoreDispatcherScheduler` provide a way to use the prioritisation mechanism supported by the `Dispatcher` and `CoreDispatcher` types.
+
+### Test Schedulers
+
+The Rx libraries define several schedulers that virtualize time, including `HistoricalScheduler`, `TestScheduler`, `VirtualTimeScheduler`, and `VirtualTimeSchedulerBase`. We will look at this sort of scheduler in the [Testing chapter](16_TestingRx.md).
+
+## SubscribeOn and ObserveOn
+
+So far, I've talked about why some Rx sources need access to schedulers. This is necessary for timing-related behaviour, and also for sources that produce items as quickly as possible. But remember, schedulers control three things:
+
+- determining the context in which to execute work (e.g., a certain thread)
+- deciding when to execute work (e.g., immediately, or deferred)
+- keeping track of time
+
+The discussion so far as mostly focused on the 2nd and 3rd features. When it comes to our own application code, we are most likely to use schedulers to control that first aspect. Rx defines two extension methods to `IObservable<T>` for this: `SubscribeOn` and `ObserveOn`. Both methods take an `IScheduler` and return an `IObservable<T>` so you can chain more operators downstream of these.
+
+These methods do what their names suggest. If you use `SubscribeOn`, then when you call `Subscribe` on the resulting `IObservable<T>` it arranges to call the original `IObservable<T>`'s `Subscribe` method via the specified scheduler. Here's an example:
+
+```csharp
+Console.WriteLine($"[T:{Environment.CurrentManagedThreadId}] Main thread");
+
+Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .SubscribeOn(new EventLoopScheduler((start) =>
+    {
+        Thread t = new(start) { IsBackground = false };
+        Console.WriteLine($"[T:{t.ManagedThreadId}] Created thread for EventLoopScheduler");
+        return t;
+    }))
+    .Subscribe(tick => 
+          Console.WriteLine(
+            $"[T:{Environment.CurrentManagedThreadId}] {DateTime.Now}: Tick {tick}"));
+
+Console.WriteLine($"[T:{Environment.CurrentManagedThreadId}] {DateTime.Now}: Main thread exiting");
+```
+
+This calls `Observable.Interval` (which uses `DefaultScheduler` by default), but instead of subscribing directly to this, it first takes the `IObservable<T>` returned by `Interval` and invokes `SubscribeOn`. I've used an `EventLoopScheduler`, and I've passed it a factory callback for the thread that it will use to ensure that it is a non-background thread. (By default `EventLoopScheduler` creates itself a background thread, meaning that the thread won't force the process to stay alive. Normally that's what you'd want but I'm changing that in this example to show what's happening.)
+
+When I call `Subscribe` on the `IObservable<long>` returned by `SubscribeOn`, it calls `Schedule` on the `EventLoopScheduler` that I supplied, and in the callback for that work item, it then calls `Subscribe` on the original `Interval` source. So the effect is that the subscription to the underlying source doesn't happen on my main thread, it happens on the thread created for my `EventLoopScheduler`. Running the program produces this output:
+
+```
+[T:1] Main thread
+[T:12] Created thread for EventLoopScheduler
+[T:1] 21/07/2023 14:57:21: Main thread exiting
+[T:6] 21/07/2023 14:57:22: Tick 0
+[T:6] 21/07/2023 14:57:23: Tick 1
+[T:6] 21/07/2023 14:57:24: Tick 2
+...
+```
+
+Notice that my application's main thread exits before the source begins producing notifications. But also notice that the thread id for the newly created thread is 12, and yet my notifications are coming through on a different thread, with id 6! What's happening?
+
+This often catches people out. The scheduler on which you subscribe to an observable source doesn't necessarily have any impact on how the source behaves once it is up and running. Remember earlier that I said `Observable.Interval` uses `DefaultScheduler` by default? Well we've not specified a scheduler for the `Interval` here, so it will be using that default. It doesn't care what context we invoke its `Subscribe` method from. So really, the only effect of introducing the `EventLoopScheduler` here has been to keep the process alive even after its main thread exits. That scheduler thread never actually gets used again after it makes its initial `Subscribe` call into the `IObservable<long>` returned by `Observable.Interval`. It just sits patiently waiting for further calls to `Schedule` that never come.
+
+Not all sources are completely unaffected by the context in which their `Subscribe` is invoked, though. If I were to replace this line:
+
+```csharp
+    .Interval(TimeSpan.FromSeconds(1))
+```
+
+with this:
+
+```csharp
+    .Range(1, 5)
+```
+
+then we get this output:
+
+```
+[T:1] Main thread
+[T:12] Created thread for EventLoopScheduler
+[T:12] 21/07/2023 15:02:09: Tick 1
+[T:1] 21/07/2023 15:02:09: Main thread exiting
+[T:12] 21/07/2023 15:02:09: Tick 2
+[T:12] 21/07/2023 15:02:09: Tick 3
+[T:12] 21/07/2023 15:02:09: Tick 4
+[T:12] 21/07/2023 15:02:09: Tick 5
+```
+
+Now all the notifications are coming in on thread 12, the thread created for the `EventLoopScheduler`. Note that even here, `Range` isn't using that scheduler. The difference is that `Range` defaults to `CurrentThreadScheduler`, so it will generate its outputs from whatever thread you happen to call it from. So even though it's not actually using the `EventLoopScheduler`, it does end up using that scheduler's thread, because we used that scheduler to subscribe to the `Range`.
+
+So this illustrates that `SubscribeOn` is doing what it promises: it does determine the context from which `Subscribe` is invoked. It's just that it doesn't always matter what context that is. If `Subscribe` does non-trivial work, it can matter. For example, if you use [`Observable.Create`](03_CreatingObservableSequences.md#observablecreate) to create a custom sequence, `SubscribeOn` determines the context in which the callback you passed to `Create` is invoked. But Rx doesn't have a concept of a 'current' scheduler—there's no way to ask "which scheduler was I invoked from?"—so Rx operators don't just inherit their scheduler from the context on which they were subscribed.
+
+When it comes to emitting items, most of the sources Rx supplies fall into one of three categories. First, operators that produce outputs in response to inputs from an upstream source (e.g., `Where`, `Select`, or `GroupBy`) generally call their observers methods from inside their own `OnNext`. So whatever context their source observable was running in when it called `OnNext`, that's the context the operator will use when calling its observer. Second, operators that produce items either iteratively, or based on timing will use a scheduler (either explicitly supplied, or a default type when none is specified). Third, some sources just produce items from whatever context they like. For example, if an `async` method uses `await` and specifies `ConfigureAwait(false)` then it could be on more or less any thread and in any context after the `await` completes, and it might then go on to invoke `OnNext` on an observer.
+
+As long as a source follows [the fundamental rules of Rx sequences](02_KeyTypes.md#the-fundamental-rules-of-rx-sequences), it's allowed to invoke its observer's methods from any context it likes. It can choose to accept a scheduler as input and to use that, but it's under no obligation to. And if you have an unruly source of this kind that you'd like to tame, that's where the `ObserveOn` extension method comes in. Consider the following rather daft example:
+
+```csharp
+Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .SelectMany(tick => Observable.Return(tick, NewThreadScheduler.Default))
+    .Subscribe(tick => 
+      Console.WriteLine($"{DateTime.Now}-{Environment.CurrentManagedThreadId}: Tick {tick}"));
+```
+
+This deliberately causes every notification to arrive on a different thread, as this output shows:
+
+```
+Main thread: 1
+21/07/2023 15:19:56-12: Tick 0
+21/07/2023 15:19:57-13: Tick 1
+21/07/2023 15:19:58-14: Tick 2
+21/07/2023 15:19:59-15: Tick 3
+...
+```
+
+(It's achieving this by calling `Observable.Return` for every single tick that emerges from `Interval`, and telling `Return` to use the `NewThreadScheduler`. Each such call to `Return` will create a new thread. This is a terrible idea, but it is an easy way to get a source that calls from a different context every time.) If I want to impose some order, I can add a call to `ObserveOn`:
+
+```csharp
+Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .SelectMany(tick => Observable.Return(tick, NewThreadScheduler.Default))
+    .ObserveOn(new EventLoopScheduler())
+    .Subscribe(tick => 
+      Console.WriteLine($"{DateTime.Now}-{Environment.CurrentManagedThreadId}: Tick {tick}"));
+```
+
+I've created an `EventLoopScheduler` here because it creates a single thread, and runs every scheduled work item on that thread. The output now shows the same thread id (13) every time:
+
+```
+Main thread: 1
+21/07/2023 15:24:23-13: Tick 0
+21/07/2023 15:24:24-13: Tick 1
+21/07/2023 15:24:25-13: Tick 2
+21/07/2023 15:24:26-13: Tick 3
+...
+```
+
+So although each new observable created by `Observable.Return` creates a brand new thread, `ObserveOn` ensures that my observer's `OnNext` (and `OnCompleted` or `OnError` in cases where those are called) is invoked via the specified scheduler.
+
+### SubscribeOn and ObserveOn in UI applications
+
+If you're using Rx in a user interface, `ObserveOn` is useful when you are dealing with information sources that don't provide notifications on the UI thread. You can wrap any `IObservable<T>` with `ObserveOn`, passing a `SynchronizationContextScheduler` (or a framework-specific type such as `DispatcherScheduler`), to ensure that your observer receives notifications on the UI thread, making it safe to update the UI.
+
+`SubscribeOn` can also be useful in user interfaces as a way to ensure that any initialization work that an observable source does to get started does not happen on the UI thread.
+
+Most UI frameworks designate one particular thread for receiving notifications from the user and also for updating the UI, for any one window. It is critical to avoid blocking this UI thread, as doing so leads to a poor user experience—if you are doing work on the UI thread, it will be unavailable for responding to user input until that work is done. As a general rule, if you cause a user interface to become unresponsive for longer than 100ms, users will become irritated, so you should not be perform any work that will take longer than this on the UI thread. When Microsoft first introduced its application store (which came in with Windows 8) they specified an even more stringent limit: if your application blocked the UI thread for longer than 50ms, it might not be allowed into the store. With the processing power offered by modern processors, you can achieve a lot of processing 50ms. Even on the relatively low-powered processors in mobile devices that's long enough to execute millions of instructions. However, anything involving I/O (reading or writing files, or waiting for a response from any kind of network service) should not be done on the UI thread. The general pattern for creating responsive UI applications is:
+
+- receive a notification about some sort of user action
+- if slow work is required, do this on a background thread
+- pass the result back to the UI thread
+- update the UI
+
+This is a great fit for Rx: responding to events, potentially composing multiple events, passing data to chained method calls. With the inclusion of scheduling, we even have the power to get off and back onto the UI thread for that responsive application feel that users demand.
+
+Consider a WPF application that used Rx to populate an `ObservableCollection<T>`. You could use `SubscribeOn` to ensure that the main work was not done on the UI thread, followed by `ObserveOn` to ensure you were notified back on the correct thread. If you failed to use the `ObserveOn` method, then your `OnNext` handlers would be invoked on the same thread that raised the notification. In most UI frameworks, this would cause some sort of not-supported/cross-threading exception. In this example, we subscribe to a sequence of `Customers`. I'm using `Defer` so that if `GetCustomers` does any slow initial work before returning its `IObservable<Customer>`, that won't happen until we subscribe. We then use `SubscribeOn` to call that method and perform the subscription on a task pool thread. Then we ensure that as we receive `Customer` notifications, we add them to the `Customers` collection on the `Dispatcher`.
+
+```csharp
+Observable
+    .Defer(() => _customerService.GetCustomers())
+    .SubscribeOn(TaskPoolScheduler.Default)
+    .ObserveOn(DispatcherScheduler.Instance) 
+    .Subscribe(Customers.Add);
+```
+
+Rx also offers `SubscribeOnDispatcher()` and `ObserveOnDispatcher()` extension methods to `IObservable<T>`, that automatically use the current thread's `Dispatcher` (and equivalents for `CoreDispatcher`). While these might be slightly more convenient they can make it harder to test your code. We explain why in the [Testing Rx](16_TestingRx.md) chapter.
+
+## Concurrency pitfalls
+
+Introducing concurrency to your application will increase its complexity. If your application is not noticeably improved by adding a layer of concurrency, then you should avoid doing so. Concurrent applications can exhibit maintenance problems with symptoms surfacing in the areas of debugging, testing and refactoring.
+
+The common problem that concurrency introduces is unpredictable timing. Unpredictable timing can be caused by variable load on a system, as well as variations in system configurations (e.g. varying core clock speed and availability of processors). These can ultimately can result in [deadlocks](http://en.wikipedia.org/wiki/Deadlock), [livelocks](http://en.wikipedia.org/wiki/Deadlock#Livelock) and corrupted state.
+
+A particularly significant danger of introducing concurrency to an application is that you can silently introduce bugs. Bugs arising from unpredictable timing are notoriously difficult to detect, making it easy for these kinds of defects to slip past Development, QA and UAT and only manifest themselves in Production environments. Rx, however, does such a good job of simplifying the concurrent processing of observable sequences that many of these concerns can be mitigated. You can still create problems, but if you follow the guidelines then you can feel a lot safer in the knowledge that you have heavily reduced the capacity for unwanted race conditions.
+
+In a later chapter, [Testing Rx](16_TestingRx.md), we will look at how Rx improves your ability to test concurrent workflows.
+
+### Lock-ups
+
+Rx can simplify handling of concurrency, but it is not immune deadlock. Some calls (like `First`, `Last`, `Single` and `ForEach`) are blocking—they do not return until something that they are waiting for occurs. The following example shows that this makes it very easy for deadlock to occur:
+
+```csharp
+var sequence = new Subject<int>();
+
+Console.WriteLine("Next line should lock the system.");
+
+IEnumerable<int> value = sequence.First();
+sequence.OnNext(1);
+
+Console.WriteLine("I can never execute....");
+```
+
+The `First` method will not return until its source emits a sequence. But the code that causes this source to emit sequence is on the line _after_ the call to `First`. So the source can't emit a sequence until `First` returns. This style of deadlock, with two parties, each unable to proceed until the other proceeds, is often known as a _deadly embrace_. As this code shows, it's entirely possible for a deadly embrace to occur even in single threaded code. In fact, the single threaded nature of this code is what enables deadlock: we have two operations (waiting for the first notification, and sending the first notification) and only a single thread. That doesn't have to be a problem. If we'd used `FirstAsync` and attached an observer to that, `FirstAsync` would have executed its logic when the source `Subject<int>` invoked its `OnNext`. But that is more complex than just calling `First` and assigning the result into a variable.
+
+This is an oversimplified example to illustrate the behaviour, and we would never write such code in production. (And even if we did, it fails so quickly and consistently that we would immediately become aware of a problem.) But in real application code, these kinds of problems can be harder to spot. Race conditions often slip into the system at integration points, so the problem isn't necessarily evidence in any one piece of code: timing problems can emerge as a result of how we plug multiple pieces of code together.
+
+The next example may be a little harder to detect, but is only small step away from our first, unrealistic example. The basic idea is that we've got a subject that represents button clicks in a user interface. Event handlers representing user input are invoked by the UI framework. We just provide the framework with event handler methods, and it calls them for us whenever the event of interest, such as a button being clicked, occurs. This code calls `First` on the subject representing clicks, but it's less obvious that this might cause a problem here than it was in the preceding example:
+
+```csharp
+public Window1()
+{
+    InitializeComponent();
+    DataContext = this;
+    Value = "Default value";
+    
+    // Deadlock! We need the dispatcher to continue to allow me to click the button to produce a value
+    Value = _subject.First();
+    
+    // This will have the intended effect, but because it does not block,
+    // we can call this on the UI thread without deadlocking.
+    //_subject.FirstAsync(1).Subscribe(value => Value = value);
+}
+
+private void MyButton_Click(object sender, RoutedEventArgs e)
+{
+    _subject.OnNext("New Value");
+}
+
+public string Value
+{
+    get { return _value; }
+    set
+    {
+        _value = value;
+        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));
+    }
+}
+```
+
+The earlier example called the subject's `OnNext` after `First` returned, making it relatively straightforward to see that if `First` didn't return, then the subject wouldn't emit a notification. But that's not as obvious here. The `MyButton_Click` event handler will be set up inside the call to `InitializeComponent` (as is normal in WPF code), so apparently we've done the necessary setup to enable events to flow. By the time we reach this call to `First`, the UI framework already knows that if the user clicks `MyButton`, it should call `MyButton_Click`, and that method is going to cause the subject to emit a value.
+
+There's nothing intrinsically wrong with that use of `First`. (Risky, yes, but there are scenarios in which that exact code would be absolutely fine.) The problem is the context in which we've used it. This code is in the constructor of a UI element, and these always run on a particular thread associated with that window's UI elements. (This happens to be a WPF example, but other UI frameworks work the same way.) And that's the same thread that the UI framework will use to deliver notifications about user input. If we block this UI thread, we prevent the UI framework from invoking our button click event handler. So this blocking call is waiting for an event that can only be raised from the very thread that it is blocking, thus creating a deadlock.
+
+You might be starting to get the impression that we should try to avoid blocking calls in Rx. This is a good rule of thumb. We can fix the code above by commenting out the line that uses `First`, and uncommenting the one below it containing this code:
+
+```csharp
+_subject.FirstAsync(1).Subscribe(value => Value = value);
+```
+
+This uses `FirstAsync` which does the same job, but with a different approach. It implements the same logic but it returns an `IObservable<T>` to which we must subscribe if we want to receive the first value whenever it does eventually appear. It is more complex than the just assigning the result of `First` into the `Value` property, but it is better adapted to the fact that we can't know when that source will produce a value.
+
+If you do a lot of UI development, that last example might have seemed obviously wrong to you: we had code in the constructor for a window that wouldn't allow the constructor to complete until the user clicked a button in that window. The window isn't even going to appear until construction is complete so it makes no sense to wait for the user to click a button. That button's not even going to be visible on screen until after our constructor completes. Moreover, seasoned UI developers know that you don't just stop the world and wait for a specific action from the user. (Even modal dialogs, which effectively do demand a response before continuing, don't block the UI thread.) But as the next example shows, it's easy for problems to be harder to see. In this example, a button's click handler will try to get the first value from an observable sequence exposed via an interface.
+
+```csharp
+public partial class Window1 : INotifyPropertyChanged
+{
+    //Imagine DI here.
+    private readonly IMyService _service = new MyService(); 
+    private int _value2;
+
+    public Window1()
+    {
+        InitializeComponent();
+        DataContext = this;
+    }
+
+    public int Value2
+    {
+        get { return _value2; }
+        set
+        {
+            _value2 = value;
+            var handler = PropertyChanged;
+            if (handler != null) handler(this, new PropertyChangedEventArgs(nameof(Value2)));
+        }
+    }
+
+    #region INotifyPropertyChanged Members
+    public event PropertyChangedEventHandler PropertyChanged;
+    #endregion
+
+    private void MyButton2_Click(object sender, RoutedEventArgs e)
+    {
+        Value2 = _service.GetTemperature().First();
+    }
+}
+```
+
+Unlike the earlier example, this does not attempt to block progress in the constructor. The blocking call to `First` occurs here in a button click handler (the `MyButton2_Click` method near the end). This example is more interesting because this sort of thing isn't necessarily wrong. Applications often perform blocking operations in click handlers: when we click a button to save a copy of a document, we expect the application to perform all necessary IO work to write our data out to storage. With modern solid state storage devices, this often happens so quickly as to appear instantaneous, but back in the days when mechanical hard drives were the norm, it was not unusual for an application to become briefly unresponsive while it saved our document. This can happen even today if your storage is remote, and networking issues are causing delays.
+
+So even if we've learned to be suspicious of blocking operations such as `First`, it's possible that it's OK in this example. It's not possible to tell for certain by looking at this code alone. It all depends on what sort of an observable `GetTemperature` returns, and the manner in which it produces its items. That call to `First` will block on the UI thread until a first item becomes available, so this will produce a deadlock if the production of that first item requires access to the UI thread. Here's a slightly contrived way to create that problem:
+
+```csharp
+class MyService : IMyService
+{
+    public IObservable<int> GetTemperature()
+    {
+        return Observable.Create<int>(
+            o =>
+            {
+                o.OnNext(27);
+                o.OnNext(26);
+                o.OnNext(24);
+                return () => { };
+            })
+            .SubscribeOnDispatcher();
+    }
+}
+```
+
+This fakes up behaviour intended to simulate an actual temperature sensor by making a series of calls to `OnNext`. But it does some odd explicit scheduling: it calls `SubscribeOnDispatcher`. That's an extension method that effectively calls `SubscribeOn(DispatcherScheduler.Current.Dispatcher)`. This effectively tells Rx that when something tries to subscribe to the `IObservable<int>` that `GetTemperature` returns, that subscription call should be done through a WPF-specific scheduler that runs its work items on the UI thread. (Strictly, speaking, WPF does allow multiple UI threads, so to more precise, this code only works if you call it on a UI thread, and if you do so, the scheduler will ensure that work items are scheduled onto the same UI thread.)
+
+The effect is that when our click handler calls `First`, that will in turn subscribe to the `IObservable<int>` returned by `GetTemperature`, and because that used `SubscribeOnDispatcher`, this does not invoke the callback passed to `Observable.Create` immediately. Instead, it schedules a work item that will do that when the UI thread (i.e., the thread we're running on) becomes free. It's not considered to be free right now, because it's in the middle of handling the button click. Having handed this work item to the scheduler, the `Subscribe` call returns back to the `First` method. And the `First` method now sits and waits for the first item to emerge. Since it won't return until that happens, the UI thread will not be considered to be available until that happens, meaning that the scheduled work item that was supposed to produce that first item can never run, and we have deadlock.
+
+This boils down to the same basic problem as the first of these `First`-related deadlock examples. We have two processes: the generation of items, and waiting for an item to occur. These need to be in progress concurrently—we need the "wait for first item" logic to be up and running at the point when the source emits its first item. These examples all use just a single thread, which makes it a bad idea to use a single blocking call (`First`) both to set up the process of watching for the first item, and also to wait for that to happen. But even though it was the same basic problem in all three cases, it became harder to see as the code became more complex. With real application code, it's often a lot harder than this to see the root causes of deadlocks.
+
+So far, this chapter may seem to say that concurrency is all doom and gloom by focusing on the problems you could face, and the fact that they are often hard to spot in practice; this is not the intent though. 
+Although adopting Rx can't magically avoid classic concurrency problems, Rx can make it easier to get it right, provided you follow these two rules.
+
+- Only the top-level subscriber should make scheduling decisions
+- Avoid using blocking calls: e.g. `First`, `Last` and `Single`
+
+The last example came unstuck with one simple problem; the `GetTemperature` service was dictating the scheduling model when, really, it had no business doing so. Code representing a temperature sensor shouldn't need to know that I'm using a particular UI framework, and certainly shouldn't be unilaterally deciding that it is going to run certain work on a WPF user interface thread.
+
+When getting started with Rx, it can be easy to convince yourself that baking scheduling decisions into lower layers is somehow being 'helpful'. "Look!" you might say. "Not only have I provided temperature readings, I've also made this automatically notify you on the UI thread, so you won't have to bother with `ObserveOn`." The intentions may be good, but it's all too easy to create a threading nightmare.
+
+Only the code that sets up a subscription and consumes its results can have a complete overview of the concurrency requirements, so that is the right level at which to choose which schedulers to use. Lower levels of code should not try to get involved; they should just do what they are told. (Rx arguably breaks this rule slightly itself by choosing default schedulers where they are needed. But it makes very conservative choices designed to minimize the chances of deadlock, and always allows applications to take control by specifying the scheduler.)
+
+Note that following either one of the two rules above would have been sufficient to prevent deadlock in this example. But it is best to follow both rules.
+
+This does leave one question unanswered: _how_ should the top-level subscriber make scheduling decisions? I've identified the area of the code that needs to make the decision, but what should the decision be? It will depend on the kind of application you are writing. For UI code, this pattern generally works well: "Subscribe on a background thread; Observe on the UI thread". With UI code, the risk of deadlock arises in because the UI thread is effectively a shared resource, and contention for that resource can produce deadlock. So the strategy is to avoid requiring that resource as much as possible: work that doesn't need to be on the thread should not be on that thread, which is why performing subscription on a worker thread (e.g., by using the `TaskPoolScheduler`) reduces the risk of deadlock.
+
+It follows that if you have observable sources that decide when to produce events (e.g., timers, or sources representing inputs from external information feeds or devices) you would also want those to schedule work on worker threads. It is only when we need to update the user interface that we need our code to run on the UI thread, and so we defer that until the last possible moment by using `ObserveOn` in conjunction with a suitable UI-aware scheduler (such as the WPF `DispatcherScheduler`). If we have a complex Rx query made up out of multiple operators, this `ObserveOn` should come right at the end, just before we call `Subscribe` to attach the handler that will update the UI. This way, only the final step, the updating of the UI, will need access to the UI thread. By the time this runs, all complex processing will be complete, and so this should be able to run very quickly, relinquishing control of the UI thread almost immediately, improving application responsiveness, and lowering the risk of deadlock.
+
+Other scenarios will require other strategies, but the general principle with deadlocks is always the same: understand which shared resources require exclusive access. For example, if you have a sensor library, it might create a dedicated thread to monitor devices and report new measurements, and if it were to stipulate that certain work had to be done on that thread, this would be very similar to the UI scenario: there is a particular thread that you will need to avoid blocking. The same approach would likely apply here. But this is not the only kind of scenario.
+
+You could imagine a data processing application in which certain data structures are shared. It's quite common in these cases to be allowed to access such data structures from any thread, but to be required to do so one thread at a time. Typically we would use thread synchronization primitives to protect against concurrent use of these critical data structures. In these cases, the risks of deadlock do not arise from the use of particular threads. Instead, they arise from the possibility that one thread can't progress because some other thread is using a shared data structure, but that other thread is waiting for the first thread to do something, and won't relinquish its lock on that data structure until that happens. The simplest way to avoid problems here is to avoid blocking wherever possible. Avoid methods like `First`, preferring their non-blocking equivalents such as `FirstAsync`. (If there are cases where you can't avoid blocking, try to avoid doing so while in possession of locks that guard access to shared data. And if you really can't avoid that either, then there are no simple answers. You'll now have to start thinking about lock hierarchies to systematically avoid deadlock, just as you would if you weren't using Rx.) The non-blocking style is the natural way to do things with Rx, and that's the main way Rx can help you avoid concurrency related problems in these cases.
+
+## Advanced features of schedulers
+
+Schedulers provide some features that are mainly of interest when writing observable sources that need to interact with a scheduler. The most common way to use schedulers is when setting up a subscription, either supplying them as arguments when creating observable sources, or passing them to `SubscribeOn` and `ObserveOn`. But if you need to write an observable source that produces items on some schedule of its own choosing (e.g., suppose you are writing a library that represents some external data source and you want to present that as an `IObservable<T>`), you might need to use some of these more advanced features.
+
+### Passing state
+
+All of the methods defined by `IScheduler` take a `state` argument. Here's the interface definition again:
+
+```csharp
+public interface IScheduler
+{
+    DateTimeOffset Now { get; }
+
+    IDisposable Schedule<TState>(TState state, 
+                                 Func<IScheduler, TState, IDisposable> action);
+    
+    IDisposable Schedule<TState>(TState state, 
+                                 TimeSpan dueTime, 
+                                 Func<IScheduler, TState, IDisposable> action);
+    
+    IDisposable Schedule<TState>(TState state, 
+                                 DateTimeOffset dueTime, 
+                                 Func<IScheduler, TState, IDisposable> action);
+}
+```
+
+The scheduler does not care what is in this `state` argument. It just passes it unmodified into your callback when it executes your work item. This provides one way to provide context for that callback. It's not strictly necessary: the delegate we pass as the `action` can incorporate whatever state we need. The easiest way to do that is to capture variables in a lambda. However, if you look at the [Rx source code](https://github.com/dotnet/reactive/) you will find that it typically doesn't do that. For example, the heart of the `Range` operator is a method called `LoopRec` and if you look at [the source for `LoopRec`](https://github.com/dotnet/reactive/blob/95d9ea9d2786f6ec49a051c5cff47dc42591e54f/Rx.NET/Source/src/System.Reactive/Linq/Observable/Range.cs#L55-L73) you'll see that it includes this line:
+
+```csharp
+var next = scheduler.Schedule(this, static (innerScheduler, @this) => @this.LoopRec(innerScheduler));
+```
+
+Logically, `Range` is just a loop that executes once for each item it produces. But to enable concurrent execution and to avoid stack overflows, it implements this by scheduling each iteration of the loop as an individual work item. (The method is called `LoopRec` because it is logically a recursive loop: it is kicked off by calling `Schedule`, and each time the scheduler calls this method, it calls `Schedule` again to ask for the next item to run. This doesn't actually cause recursion with any of Rx's built-in schedulers, even the `ImmediateScheduler`, because they all detect this and arrange to run the next item after the current one returns. But if you wrote the most naive scheduler possible, this would actually end up recursing at runtime, likely leading to stack overflows if you tried to create a large sequence.)
+
+Notice that the lambda passed to `Schedule` has been annotated with `static`. This tells the C# compiler that it is our intention _not_ to capture any variables, and that any attempt to do so should cause a compiler error. The advantage of this is that the compiler is able to generate code that reuses the same delegate instance for every call. The first time this runs, it will create a delegate and store it in a hidden field. On every subsequent execution of this (either in future iterations of the same range, or for completely new range instances) it can just use that same delegate again and again and again. This is possible because the delegate captures no state. This avoids allocating a new object each time round the loop.
+
+Couldn't the Rx library have used a more straightforward approach? We could choose not to use the state, passing a `null` state to scheduler, and then discarding the state argument passed to our callback:
+
+```csharp
+// Less weird, but less efficient:
+var next = scheduler.Schedule<object?>(null, (innerScheduler, _) => LoopRec(innerScheduler));
+```
+
+This avoids the previous example's weirdness of passing our own `this` argument: now we're just invoking the `LoopRec` instance member in the ordinary way: we're implicitly using the `this` reference that is in scope. So this will create a delegate the captures that implicit `this` reference. This works, but it's inefficient: it will force the compiler to generate code that allocates a couple of objects. It creates one object that has a field holding onto the captured `this`, and then it needs to create a distinct delegate instance that has a reference to that capture object.
+
+The more complex code that is actually in the `Range` implementation avoids this. It disables capture by annotating the lambda with `static`. That prevents code from relying on the implicit `this` reference. So it has had to arrange for the `this` reference to be available to the callback. And that's exactly the sort of thing the `state` argument is there for. It provides a way to pass in some per-work-item state so that you can avoid the overhead of capturing variables on each iteration.
+
+### Future scheduling
+
+I talked earlier about time-based operators, and also about the two time-based members of `ISchedule` that enable this, but I've not yet shown how to use it. These enable you to schedule an action to be executed in the future. (This relies on the process continuing to run for as long as necessary. As mentioned in earlier chapters, `System.Reactive` doesn't support persistent, durable subscriptions. So if you want to schedule something for days into the future, you might want to look at [Reaqtor](https://reaqtive.net/).) You can do so by specifying the exact point in time an action should be invoked by calling the overload of `Schedule` that takes a `DateTimeOffset`, or you can specify the period of time to wait until the action is invoked with the `TimeSpan`-based overload.
+
+You can use the `TimeSpan` overload like this:
+
+```csharp
+var delay = TimeSpan.FromSeconds(1);
+Console.WriteLine("Before schedule at {0:o}", DateTime.Now);
+
+scheduler.Schedule(delay, () => Console.WriteLine("Inside schedule at {0:o}", DateTime.Now));
+Console.WriteLine("After schedule at  {0:o}", DateTime.Now);
+```
+
+Output:
+
+```
+Before schedule at 2012-01-01T12:00:00.000000+00:00
+After schedule at 2012-01-01T12:00:00.058000+00:00
+Inside schedule at 2012-01-01T12:00:01.044000+00:00
+```
+
+This illustrates that scheduling was non-blocking here, because the 'before' and 'after' calls are very close together in time. (It will be this way for most schedulers, but as discussed earlier, `ImmediateScheduler` works differently. In this case, you would see the After message after the Inside one. that's why none of the timed operators will use `ImmediateScheduler` by default.) You can also see that approximately one second after the action was scheduled, it was invoked.
+
+You can specify a specific point in time to schedule the task with the `DateTimeOffset` overload. If, for some reason, the point in time you specify is in the past, then the action is scheduled as soon as possible. Be aware that changes in the system clock complicate matters. Rx's schedulers do make some accommodations to deal with clock drift, but sudden large changes to the system clock can cause some short term chaos.
+
+### Cancellation
+
+Each of the overloads to `Schedule` returns an `IDisposable`, and calling `Dispose` on this will cancel the scheduled work. In the previous example, we scheduled work to be invoked in one second. We could cancel that work by disposing of the return value.
+
+```csharp
+var delay = TimeSpan.FromSeconds(1);
+Console.WriteLine("Before schedule at {0:o}", DateTime.Now);
+
+var workItem = scheduler.Schedule(delay, 
+   () => Console.WriteLine("Inside schedule at {0:o}", DateTime.Now));
+
+Console.WriteLine("After schedule at  {0:o}", DateTime.Now);
+
+workItem.Dispose();
+```
+
+Output:
+
+```
+Before schedule at 2012-01-01T12:00:00.000000+00:00
+After schedule at 2012-01-01T12:00:00.058000+00:00
+```
+
+Note that the scheduled action never occurred, because we cancelled it almost immediately.
+
+When the user cancels the scheduled action method before the scheduler is able to invoke it, that action is just removed from the queue of work. This is what we see in example above. It's possible to cancel scheduled work that is already running, and this is why the work item callback is required to return `IDisposable`: if work has already begun when you try to cancel the work item, Rx calls `Dispose` on the `IDisposable` that your work item callback returned. This gives a way for users to cancel out of a job that may already be running. This job could be some sort of I/O, heavy computations or perhaps usage of `Task` to perform some work.
+
+You may be wondering how this mechanism can be any use: the work item callback needs to have returned already for Rx to be able to invoke the `IDisposable` that it returns. This mechanism can only be used in practice if work continues after returning to the scheduler. You could fire up another thread so the work happens concurrently, although we generally try to avoid creating threads in Rx. Another possibility would be if the scheduled work item invoked some asynchronous API and returned without waiting for it to complete. If that API offered cancellation, you could return an `IDisposable` that cancelled it.
+
+To illustrate cancellation in operation, this slightly unrealistic example runs some work as a `Task` to enable it to continue after our callback returns. It just fakes some work by performing a spin wait and adding values to the `list` argument. The key here is that we create a `CancellationToken` to be able to tell the task we want it to stop, and we return an `IDisposable` that puts this token in to a cancelled state.
+
+```csharp
+public IDisposable Work(IScheduler scheduler, List<int> list)
+{
+    CancellationTokenSource tokenSource = new();
+    CancellationToken cancelToken = tokenSource.Token;
+    Task task = new(() =>
+    {
+        Console.WriteLine();
+   
+        for (int i = 0; i < 1000; i++)
+        {
+            SpinWait sw = new();
+   
+            for (int j = 0; j < 3000; j++) sw.SpinOnce();
+   
+            Console.Write(".");
+   
+            list.Add(i);
+   
+            if (cancelToken.IsCancellationRequested)
+            {
+                Console.WriteLine("Cancellation requested");
+                
+                // cancelToken.ThrowIfCancellationRequested();
+                
+                return;
+            }
+        }
+    }, cancelToken);
+   
+    task.Start();
+   
+    return Disposable.Create(tokenSource.Cancel);
+}
+```
+
+This code schedules the above code and allows the user to cancel the processing work by pressing Enter
+
+```csharp
+List<int> list = new();
+Console.WriteLine("Enter to quit:");
+
+IDisposable token = scheduler.Schedule(list, Work);
+Console.ReadLine();
+
+Console.WriteLine("Cancelling...");
+
+token.Dispose();
+
+Console.WriteLine("Cancelled");
+```
+
+Output:
+
+```
+Enter to quit:
+........
+Cancelling...
+Cancelled
+Cancellation requested
+```
+
+The problem here is that we have introduced explicit use of `Task` so we are increasing concurrency in a way that is outside of the control of the scheduler. The Rx library generally allows control over the way in which concurrency is introduced by accepting a scheduler parameter. If the goal is to enable long-running iterative work, we can avoid having to spin up new threads or tasks but using Rx recursive scheduler features instead. I already talked a bit about this in the [Passing state](#passing-state) section, but there are a few ways to go about it.
+
+### Recursion
+
+In addition to the `IScheduler` methods, Rx defines various overloads of `Schedule` in the form of extension methods. Some of these take some strange looking delegates as parameters. Take special note of the final parameter in each of these overloads of the `Schedule` extension method.
+
+```csharp
+public static IDisposable Schedule(
+    this IScheduler scheduler, 
+    Action<Action> action)
+{...}
+
+public static IDisposable Schedule<TState>(
+    this IScheduler scheduler, 
+    TState state, 
+    Action<TState, Action<TState>> action)
+{...}
+
+public static IDisposable Schedule(
+    this IScheduler scheduler, 
+    TimeSpan dueTime, 
+    Action<Action<TimeSpan>> action)
+{...}
+
+public static IDisposable Schedule<TState>(
+    this IScheduler scheduler, 
+    TState state, 
+    TimeSpan dueTime, 
+    Action<TState, Action<TState, TimeSpan>> action)
+{...}
+
+public static IDisposable Schedule(
+    this IScheduler scheduler, 
+    DateTimeOffset dueTime, 
+    Action<Action<DateTimeOffset>> action)
+{...}
+
+public static IDisposable Schedule<TState>(
+    this IScheduler scheduler, 
+    TState state, DateTimeOffset dueTime, 
+    Action<TState, Action<TState, DateTimeOffset>> action)
+{...}   
+```
+
+Each of these overloads take a delegate "action" that allows you to call "action" recursively. This may seem a very odd signature, but it allows us to achieve a similar logically recursive iterative approach as you saw in [Passing state](#passing-state) section, but in a potentially simpler way.
+
+This example uses the simplest recursive overload. We have an `Action` that can be called recursively.
+
+```csharp
+Action<Action> work = (Action self) =>
+{
+    Console.WriteLine("Running");
+    self();
+};
+
+var token = s.Schedule(work);
+    
+Console.ReadLine();
+Console.WriteLine("Cancelling");
+
+token.Dispose();
+
+Console.WriteLine("Cancelled");
+```
+
+Output:
+
+```
+Enter to quit:
+Running
+Running
+Running
+Running
+Cancelling
+Cancelled
+Running
+```
+
+Note that we didn't have to write any cancellation code in our delegate. Rx handled the looping and checked for cancellation on our behalf. Since each individual iteration was scheduled as a separate work item, there are no long-running jobs, so it's enough to let the scheduler deal entirely with cancellation.
+
+The main difference between these overloads, and using the `IScheduler` methods directly, is that you don't need to pass another callback directly into the scheduler. You just invoke the supplied `Action` and it schedules another call to your method. They also enable you not to pass a state argument if you don't have any use for one.
+
+As mentioned in the earlier section, although this logically represents recursion, Rx protects us from stack overflows. The schedulers implement this style of recursion by waiting for the method to return before performing the recursive call.
+    
+This concludes our tour of scheduling and threading. Next, we will look at the related topic of timing.

+ 0 - 846
Rx.NET/Documentation/IntroToRx/12_CombiningSequences.md

@@ -1,846 +0,0 @@
----
-title: Combining sequences
----
-
-#Combining sequences				{#CombiningMultipleSequences}
-
-Data sources are everywhere, and sometimes we need to consume data from more than just a single source. 
-Common examples that have many inputs include: multi touch surfaces, news feeds, price feeds, social media aggregators, file watchers, heart-beating/polling servers, etc. 
-The way we deal with these multiple stimuli is varied too. 
-We may want to consume it all as a deluge of integrated data, or one sequence at a time as sequential data. 
-We could also get it in an orderly fashion, pairing data values from two sources to be processed together, or perhaps just consume the data from the first source that responds to the request.
-
-We have uncovered the benefits of operator composition; now we turn our focus to sequence composition. 
-Earlier on, we briefly looked at operators that work with multiple sequences such as `SelectMany`, `TakeUntil`/`SkipUntil`, `Catch` and `OnErrorResumeNext`. 
-These give us a hint at the potential that sequence composition can deliver. 
-By uncovering the features of sequence composition with Rx, we find yet another layer of game changing functionality. 
-Sequence composition enables you to create complex queries across multiple data sources. 
-This unlocks the possibility to write some very powerful and succinct code.
-
-Now we will build upon the concepts covered in the [Advanced Error Handling](11_AdvancedErrorHandling.html) chapter. 
-There we were able to provide continuations for sequences that failed. 
-We will now examine operators aimed at composing sequences that are still operational instead of sequences that have terminated due to an error.
-
-##Sequential concatenation			{#SimpleConcatenation}
-
-The first methods we will look at are those that concatenate sequences sequentially.
-They are very similar to the methods we have seen before for dealing with faulted sequences.
-
-###Concat							{#Concat}
-
-The `Concat` extension method is probably the most simple composition method.
-It simply concatenates two sequences. 
-Once the first sequence completes, the second sequence is subscribed to and its values are passed on through to the result sequence.
-It behaves just like the `Catch` extension method, but will concatenate operational sequences when they complete, instead of faulted sequences when they `OnError`.
-The simple signature for `Concat` is as follows.
-
-	// Concatenates two observable sequences. Returns an observable sequence that contains the
-	//  elements of the first sequence, followed by those of the second the sequence.
-	public static IObservable<TSource> Concat<TSource>(
-		this IObservable<TSource> first, 
-		IObservable<TSource> second)
-	{
-		...
-	}
-
-Usage of `Concat` is familiar. 
-Just like `Catch` or `OnErrorResumeNext`, we pass the continuation sequence to the extension method.
-
-	//Generate values 0,1,2 
-	var s1 = Observable.Range(0, 3);
-	//Generate values 5,6,7,8,9 
-	var s2 = Observable.Range(5, 5);
-	s1.Concat(s2)
-		.Subscribe(Console.WriteLine);
-
-Returns:
-
-<div class="marble">
-	<pre class="line">s1 --0--1--2-|</pre>
-	<pre class="line">s2           -5--6--7--8--|</pre>
-	<pre class="line">r  --0--1--2--5--6--7--8--|</pre>
-</div>
-
-If either sequence was to fault so too would the result sequence. 
-In particular, if `s1` produced an `OnError` notification, then `s2` would never be used. 
-If you wanted `s2` to be used regardless of how s1 terminates, then `OnErrorResumeNext` would be your best option.
-
-`Concat` also has two useful overloads. 
-These overloads allow you to pass multiple observable sequences as either a `params` array or an `IEnumerable<IObservable<T>>`.
-
-	public static IObservable<TSource> Concat<TSource>(
-		params IObservable<TSource>[] sources)
-	{...}
-	
-	public static IObservable<TSource> Concat<TSource>(
-		this IEnumerable<IObservable<TSource>> sources)
-	{...}
-
-The ability to pass an `IEnumerable<IObservable<T>>` means that the multiple sequences can be lazily evaluated. 
-The overload that takes a `params` array is well-suited to times when we know how many sequences we want to merge at compile time, whereas the `IEnumerable<IObservable<T>>` overload is a better fit when we do not know this ahead of time.
-
-In the case of the lazily evaluated `IEnumerable<IObservable<T>>`, the `Concat` method will take one sequence, subscribe until it is completed and then switch to the next sequence. 
-To help illustrate this, we create a method that returns a sequence of sequences and is sprinkled with logging. 
-It returns three observable sequences each with a single value [1], [2] and [3]. 
-Each sequence returns its value on a timer delay.
-
-	public IEnumerable<IObservable<long>> GetSequences()
-	{
-		Console.WriteLine("GetSequences() called");
-		Console.WriteLine("Yield 1st sequence");
-		yield return Observable.Create<long>(o =>
-			{
-				Console.WriteLine("1st subscribed to");
-				return Observable.Timer(TimeSpan.FromMilliseconds(500))
-					.Select(i=>1L)
-					.Subscribe(o);
-			});
-		Console.WriteLine("Yield 2nd sequence");
-		yield return Observable.Create<long>(o =>
-			{
-				Console.WriteLine("2nd subscribed to");
-				return Observable.Timer(TimeSpan.FromMilliseconds(300))
-					.Select(i=>2L)
-					.Subscribe(o);
-			});
-		Thread.Sleep(1000);     //Force a delay
-		Console.WriteLine("Yield 3rd sequence");
-		yield return Observable.Create<long>(o =>
-			{
-				Console.WriteLine("3rd subscribed to");
-				return Observable.Timer(TimeSpan.FromMilliseconds(100))
-					.Select(i=>3L)
-					.Subscribe(o);
-			});
-		Console.WriteLine("GetSequences() complete");
-	}
-
-When we call our `GetSequences` method and concatenate the results, we see the following output using our `Dump` extension method.
-
-	GetSequences().Concat().Dump("Concat");
-
-Output:
-
-<div class="output">
-	<div class="line">GetSequences() called</div>
-	<div class="line">Yield 1st sequence</div>
-	<div class="line">1st subscribed to</div>
-	<div class="line">Concat-->1</div>
-	<div class="line">Yield 2nd sequence</div>
-	<div class="line">2nd subscribed to</div>
-	<div class="line">Concat-->2</div>
-	<div class="line">Yield 3rd sequence</div>
-	<div class="line">3rd subscribed to</div>
-	<div class="line">Concat-->3</div>
-	<div class="line">GetSequences() complete</div>
-	<div class="line">Concat completed</div>
-</div>
-
-Below is a marble diagram of the `Concat` operator applied to the `GetSequences` method. 
-'s1', 's2' and 's3' represent sequence 1, 2 and 3. 
-Respectively, 'rs' represents the result sequence.
-
-<div class="marble">
-	<pre class="line">s1-----1|</pre>
-	<pre class="line">s2      ---2|</pre>
-	<pre class="line">s3          -3|</pre>
-	<pre class="line">rs-----1---2-3|</pre>
-</div>
-
-You should note that the second sequence is only yielded once the first sequence has completed. 
-To prove this, we explicitly put in a 500ms delay on producing a value and completing. 
-Once that happens, the second sequence is then subscribed to. 
-When that sequence completes, then the third sequence is processed in the same fashion.
-
-###Repeat							{#Repeat}
-
-Another simple extension method is `Repeat`. 
-It allows you to simply repeat a sequence, either a specified or an infinite number of times.
-
-	// Repeats the observable sequence indefinitely and sequentially.
-	public static IObservable<TSource> Repeat<TSource>(
-		this IObservable<TSource> source)
-	{...}
-
-	//Repeats the observable sequence a specified number of times.
-	public static IObservable<TSource> Repeat<TSource>(
-		this IObservable<TSource> source, 
-		int repeatCount)
-	{...}
-
-If you use the overload that loops indefinitely, then the only way the sequence will stop is if there is an error or the subscription is disposed of. 
-The overload that specifies a repeat count will stop on error, un-subscription, or when it reaches that count. 
-This example shows the sequence [0,1,2] being repeated three times.
-
-	var source = Observable.Range(0, 3);
-	var result = source.Repeat(3);
-
-	result.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">Completed</div>
-</div>
-
-###StartWith						{#StartWith}
-
-Another simple concatenation method is the `StartWith` extension method.
-It allows you to prefix values to a sequence. 
-The method signature takes a `params` array of values so it is easy to pass in as many or as few values as you need.
-
-	// prefixes a sequence of values to an observable sequence.
-	public static IObservable<TSource> StartWith<TSource>(
-		this IObservable<TSource> source, 
-		params TSource[] values)
-	{
-		...
-	}
-
-Using `StartWith` can give a similar effect to a `BehaviorSubject<T>` by ensuring a value is provided as soon as a consumer subscribes. 
-It is not the same as a `BehaviorSubject` however, as it will not cache the last value.
-
-In this example, we prefix the values -3, -2 and -1 to the sequence [0,1,2].
-
-	//Generate values 0,1,2 
-	var source = Observable.Range(0, 3);
-	var result = source.StartWith(-3, -2, -1);
-	result.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">-3</div>
-	<div class="line">-2</div>
-	<div class="line">-1</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">Completed</div>
-</div>
-
-##Concurrent sequences				{#ConcurrentSequences}
-
-The next set of methods aims to combine observable sequences that are producing values concurrently. 
-This is an important step in our journey to understanding Rx.
-For the sake of simplicity, we have avoided introducing concepts related to concurrency until we had a broad understanding of the simple concepts.
-
-###Amb								{#Amb}
-
-The `Amb` method was a new concept to me when I started using Rx. 
-It is a non-deterministic function, first introduced by John McCarthy and is an abbreviation of the word _Ambiguous_. 
-The Rx implementation will return values from the sequence that is first to produce values, and will completely ignore the other sequences.
-In the examples below I have three sequences that all produce values. 
-The sequences can be represented as the marble diagram below.
-
-<div class="marble">
-	<pre class="line">s1 -1--1--|</pre>
-	<pre class="line">s2 --2--2--|</pre>
-	<pre class="line">s3 ---3--3--|</pre>
-	<pre class="line">r  -1--1--|</pre>
-</div>
-
-The code to produce the above is as follows.
-
-	var s1 = new Subject<int>();
-	var s2 = new Subject<int>();
-	var s3 = new Subject<int>();
-
-	var result = Observable.Amb(s1, s2, s3);
-
-	result.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-	s1.OnNext(1);
-	s2.OnNext(2);
-	s3.OnNext(3);
-	s1.OnNext(1);
-	s2.OnNext(2);
-	s3.OnNext(3);
-	s1.OnCompleted();
-	s2.OnCompleted();
-	s3.OnCompleted();
-
-Output:
-
-<div class="output">
-	<div class="line">1</div>
-	<div class="line">1</div>
-	<div class="line">Completed</div>
-</div>
-
-If we comment out the first `s1.OnNext(1);` then s2 would produce values first and the marble diagram would look like this.
-
-<div class="marble">
-	<pre class="line">s1 ---1--|</pre>
-	<pre class="line">s2 -2--2--|</pre>
-	<pre class="line">s3 --3--3--|</pre>
-	<pre class="line">r  -2--2--|</pre>
-</div>
-
-The `Amb` feature can be useful if you have multiple cheap resources that can provide values, but latency is widely variable. 
-For an example, you may have servers replicated around the world. 
-Issuing a query is cheap for both the client to send and for the server to respond, however due to network conditions the latency is not predictable and varies considerably. 
-Using the `Amb` operator, you can send the same request out to many servers and consume the result of the first that responds.
-
-There are other useful variants of the `Amb` method. 
-We have used the overload that takes a `params` array of sequences. 
-You could alternatively use it as an extension method and chain calls until you have included all the target sequences (e.g. s1.Amb(s2).Amb(s3)). 
-Finally, you could pass in an `IEnumerable<IObservable<T>>`.
-
-	// Propagates the observable sequence that reacts first.
-	public static IObservable<TSource> Amb<TSource>(
-		this IObservable<TSource> first, 
-		IObservable<TSource> second)
-	{...}
-	public static IObservable<TSource> Amb<TSource>(
-		params IObservable<TSource>[] sources)
-	{...}
-	public static IObservable<TSource> Amb<TSource>(
-		this IEnumerable<IObservable<TSource>> sources)
-	{...}
-
-Reusing the `GetSequences` method from the `Concat` section, we see that the evaluation of the outer (IEnumerable) sequence is eager.
-
-	GetSequences().Amb().Dump("Amb");
-
-Output:
-
-<div class="output">
-	<div class="line">GetSequences() called</div>
-	<div class="line">Yield 1st sequence</div>
-	<div class="line">Yield 2nd sequence</div>
-	<div class="line">Yield 3rd sequence</div>
-	<div class="line">GetSequences() complete</div>
-	<div class="line">1st subscribed to</div>
-	<div class="line">2nd subscribed to</div>
-	<div class="line">3rd subscribed to</div>
-	<div class="line">Amb-->3</div>
-	<div class="line">Amb completed</div>
-</div>
-
-Marble:
-
-<div class="marble">
-	<pre class="line">s1-----1|</pre>
-	<pre class="line">s2---2|</pre>
-	<pre class="line">s3-3|</pre>
-	<pre class="line">rs-3|</pre>
-</div>
-
-Take note that the inner observable sequences are not subscribed to until the outer sequence has yielded them all. 
-This means that the third sequence is able to return values the fastest even though there are two sequences yielded one second before it (due to the `Thread.Sleep`).
-
-###Merge							{#Merge}
-
-The `Merge` extension method does a primitive combination of multiple concurrent sequences. 
-As values from any sequence are produced, those values become part of the result sequence. 
-All sequences need to be of the same type, as per the previous methods. 
-In this diagram, we can see `s1` and `s2` producing values concurrently and the values falling through to the result sequence as they occur.
-
-<div class="marble">
-	<pre class="line">s1 --1--1--1--|</pre>
-	<pre class="line">s2 ---2---2---2|</pre>
-	<pre class="line">r  --12-1-21--2|</pre>
-</div>
-
-The result of a `Merge` will complete only once all input sequences complete.
-By contrast, the `Merge` operator will error if any of the input sequences terminates erroneously.
-
-	//Generate values 0,1,2 
-	var s1 = Observable.Interval(TimeSpan.FromMilliseconds(250))
-		.Take(3);
-	//Generate values 100,101,102,103,104 
-	var s2 = Observable.Interval(TimeSpan.FromMilliseconds(150))
-		.Take(5)
-		.Select(i => i + 100);
-	s1.Merge(s2)
-		.Subscribe(
-			Console.WriteLine,
-			()=>Console.WriteLine("Completed"));
-
-The code above could be represented by the marble diagram below. 
-In this case, each unit of time is 50ms. 
-As both sequences produce a value at 750ms, there is a race condition and we cannot be sure which value will be notified first in the result sequence (sR).
-
-<div class="marble">
-	<pre class="line">s1 ----0----0----0| </pre>
-	<pre class="line">s2 --0--0--0--0--0|</pre>
-	<pre class="line">sR --0-00--00-0--00|</pre>
-</div>
-
-Output:
-
-<div class="output">
-	<div class="line">100</div>
-	<div class="line">0</div>
-	<div class="line">101</div>
-	<div class="line">102</div>
-	<div class="line">1</div>
-	<div class="line">103</div>
-	<div class="line">104 //Note this is a race condition. 2 could be </div>
-	<div class="line">2 // published before 104. </div>
-</div>
-
-You can chain this overload of the `Merge` operator to merge multiple sequences.
-`Merge` also provides numerous other overloads that allow you to pass more than two source sequences. 
-You can use the static method `Observable.Merge` which takes a `params` array of sequences that is known at compile time.
-You could pass in an `IEnumerable` of sequences like the `Concat` method. 
-`Merge` also has the overload that takes an `IObservable<IObservable<T>>`, a nested observable. To summarize:
-
- * Chain `Merge` operators together e.g. `s1.Merge(s2).Merge(s3)`
- * Pass a `params` array of sequences to the `Observable.Merge` static method. e.g. `Observable.Merge(s1,s2,s3)`
- * Apply the `Merge` operator to an `IEnumerable<IObservable<T>>`.
- * Apply the `Merge` operator to an `IObservable<IObservable<T>>`.
-
-Merge overloads:
-
-	/// Merges two observable sequences into a single observable sequence.
-	/// Returns a sequence that merges the elements of the given sequences.
-	public static IObservable<TSource> Merge<TSource>(
-		this IObservable<TSource> first, 
-		IObservable<TSource> second)
-	{...}
-	
-	// Merges all the observable sequences into a single observable sequence.
-	// The observable sequence that merges the elements of the observable sequences.
-	public static IObservable<TSource> Merge<TSource>(
-		params IObservable<TSource>[] sources)
-	{...}
-	
-	// Merges an enumerable sequence of observable sequences into a single observable sequence.
-	public static IObservable<TSource> Merge<TSource>(
-		this IEnumerable<IObservable<TSource>> sources)
-	{...}
-	
-	// Merges an observable sequence of observable sequences into an observable sequence.
-	// Merges all the elements of the inner sequences in to the output sequence.
-	public static IObservable<TSource> Merge<TSource>(
-		this IObservable<IObservable<TSource>> sources)
-	{...}
-
-For merging a known number of sequences, the first two operators are effectively the same thing and which style you use is a matter of taste: either provide them as a `params` array or chain the operators together. 
-The third and fourth overloads allow to you merge sequences that can be evaluated lazily at run time.
-The `Merge` operators that take a sequence of sequences make for an interesting concept. 
-You can either pull or be pushed observable sequences, which will be subscribed to immediately.
-
-If we again reuse the `GetSequences` method, we can see how the `Merge` operator works with a sequence of sequences.
-
-	GetSequences().Merge().Dump("Merge");
-
-Output:
-
-<div class="output">
-	<div class="line">GetSequences() called</div>
-	<div class="line">Yield 1st sequence</div>
-	<div class="line">1st subscribed to</div>
-	<div class="line">Yield 2nd sequence</div>
-	<div class="line">2nd subscribed to</div>
-	<div class="line">Merge-->2</div>
-	<div class="line">Merge-->1</div>
-	<div class="line">Yield 3rd sequence</div>
-	<div class="line">3rd subscribed to</div>
-	<div class="line">GetSequences() complete</div>
-	<div class="line">Merge-->3</div>
-	<div class="line">Merge completed</div>
-</div>
-
-As we can see from the marble diagram, s1 and s2 are yielded and subscribed to immediately.
-s3 is not yielded for one second and then is subscribed to. 
-Once all input sequences have completed, the result sequence completes.
-
-<div class="marble">
-	<pre class="line">s1-----1|</pre>
-	<pre class="line">s2---2|</pre>
-	<pre class="line">s3          -3|</pre>
-	<pre class="line">rs---2-1-----3|</pre>
-</div>
-
-###Switch							{#Switch}
-
-Receiving all values from a nested observable sequence is not always what you need.
-In some scenarios, instead of receiving everything, you may only want the values from the most recent inner sequence. 
-A great example of this is live searches. 
-As you type, the text is sent to a search service and the results are returned to you as an observable sequence.
-Most implementations have a slight delay before sending the request so that unnecessary work does not happen. 
-Imagine I want to search for "Intro to Rx". 
-I quickly type in "Into to" and realize I have missed the letter 'r'. 
-I stop briefly and change the text to "Intro ". 
-By now, two searches have been sent to the server. 
-The first search will return results that I do not want. 
-Furthermore, if I were to receive data for the first search merged together with results for the second search, it would be a very odd experience for the user. 
-This scenario fits perfectly with the `Switch` method.
-
-In this example, there is a source that represents a sequence of search text.
-<!--When the user types in a new value, the source sequence OnNext's the value-->
-Values the user types are represented as the source sequence. 
-Using `Select`, we pass the value of the search to a function that takes a `string` and returns an `IObservable<string>`. 
-This creates our resulting nested sequence, `IObservable<IObservable<string>>`.
-
-Search function signature:
-
-	private IObservable<string> SearchResults(string query)
-	{
-		...
-	}
-
-Using `Merge` with overlapping search:
-
-	IObservable<string> searchValues = ....;
-	IObservable<IObservable<string>> search = searchValues
-		.Select(searchText=>SearchResults(searchText));
-					 
-	var subscription = search
-		.Merge()
-		.Subscribe(
-			Console.WriteLine);
-
-<!--TODO: Show output here-->
-
-If we were lucky and each search completed before the next element from `searchValues` was produced, the output would look sensible. 
-It is much more likely, however that multiple searches will result in overlapped search results. 
-This marble diagram shows what the `Merge` function could do in such a situation.
-
- * `SV` is the searchValues sequence
- * `S1` is the search result sequence for the first value in searchValues/SV
- * `S2` is the search result sequence for the second value in searchValues/SV
- * `S3` is the search result sequence for the third value in searchValues/SV
- * `RM` is the result sequence for the merged (`R`esult `M`erge) sequences
-
-<div class="marble">
-	<pre class="line">SV--1---2---3---|</pre>
-	<pre class="line">S1  -1--1--1--1|</pre>
-	<pre class="line">S2      --2-2--2--2|</pre>
-	<pre class="line">S3          -3--3|</pre>
-	<pre class="line">RM---1--1-2123123-2|</pre>
-</div>
-
-Note how the values from the search results are all mixed together. 
-This is not what we want. 
-If we use the `Switch` extension method we will get much better results. 
-`Switch` will subscribe to the outer sequence and as each inner sequence is yielded it will subscribe to the new inner sequence and dispose of the subscription to the previous inner sequence. 
-This will result in the following marble diagram where `RS` is the result sequence for the Switch (`R`esult `S`witch) sequences
-
-<div class="marble">
-	<pre class="line">SV--1---2---3---|</pre>
-	<pre class="line">S1  -1--1--1--1|</pre>
-	<pre class="line">S2      --2-2--2--2|</pre>
-	<pre class="line">S3          -3--3|</pre>
-	<pre class="line">RS --1--1-2-23--3|</pre>
-</div>
-
-Also note that, even though the results from S1 and S2 are still being pushed, they are ignored as their subscription has been disposed of. 
-This eliminates the issue of overlapping values from the nested sequences.
-
-##Pairing sequences					{#ParingSequences}
-
-The previous methods allowed us to flatten multiple sequences sharing a common type into a result sequence of the same type. 
-These next sets of methods still take multiple sequences as an input, but attempt to pair values from each sequence to produce a single value for the output sequence. 
-In some cases, they also allow you to provide sequences of different types.
-
-###CombineLatest					{#CombineLatest}
-
-The `CombineLatest` extension method allows you to take the most recent value from two sequences, and with a given function transform those into a value for the result sequence. 
-Each input sequence has the last value cached like `Replay(1)`.
-Once both sequences have produced at least one value, the latest output from each sequence is passed to the `resultSelector` function every time either sequence produces a value. 
-The signature is as follows.
-
-	// Composes two observable sequences into one observable sequence by using the selector 
-	//  function whenever one of the observable sequences produces an element.
-	public static IObservable<TResult> CombineLatest<TFirst, TSecond, TResult>(
-		this IObservable<TFirst> first, 
-		IObservable<TSecond> second, 
-		Func<TFirst, TSecond, TResult> resultSelector)
-	{...}
-
-The marble diagram below shows off usage of `CombineLatest` with one sequence that produces numbers (N), and the other letters (L). 
-If the `resultSelector` function just joins the number and letter together as a pair, this would be the result (R):
-
-<div class="marble">
-	<pre class="line">N---1---2---3---</pre>
-	<pre class="line">L--a------bc----</pre>
-	<pre class="line">                </pre>
-	<pre class="line">R---1---2-223---</pre>
-	<pre class="line">    a   a bcc   </pre>
-</div>
-
-If we slowly walk through the above marble diagram, we first see that `L` produces the letter 'a'. 
-`N` has not produced any value yet so there is nothing to pair, no value is produced for the result (R). 
-Next, `N` produces the number '1' so we now have a pair '1a' that is yielded in the result sequence. 
-We then receive the number '2' from `N`. The last letter is still 'a' so the next pair is '2a'. 
-The letter 'b' is then produced creating the pair '2b', followed by 'c' giving '2c'. 
-Finally the number 3 is produced and we get the pair '3c'.
-
-This is great in case you need to evaluate some combination of state which needs to be kept up-to-date when the state changes. 
-A simple example would be a monitoring system. 
-Each service is represented by a sequence that returns a Boolean indicating the availability of said service. 
-The monitoring status is green if all services are available; we can achieve this by having the result selector perform a logical AND. 
-Here is an example.
-
-	IObservable<bool> webServerStatus = GetWebStatus();
-	IObservable<bool> databaseStatus = GetDBStatus();
-	//Yields true when both systems are up.
-	var systemStatus = webServerStatus
-		.CombineLatest(
-			databaseStatus,
-			(webStatus, dbStatus) => webStatus &amp;&amp; dbStatus);
-
-Some readers may have noticed that this method could produce a lot of duplicate values. 
-For example, if the web server goes down the result sequence will yield '`false`'. 
-If the database then goes down, another (unnecessary) '`false`' value will be yielded. 
-This would be an appropriate time to use the `DistictUntilChanged` extension method. 
-The corrected code would look like the example below.
-
-	//Yields true when both systems are up, and only on change of status
-	var systemStatus = webServerStatus
-		.CombineLatest(
-			databaseStatus,
-			(webStatus, dbStatus) => webStatus &amp;&amp; dbStatus)
-		.DistinctUntilChanged();
-
-To provide an even better service, we could provide a default value by prefixing `false` to the sequence.
-
-	//Yields true when both systems are up, and only on change of status
-	var systemStatus = webServerStatus
-		.CombineLatest(
-			databaseStatus,
-			(webStatus, dbStatus) => webStatus &amp;&amp; dbStatus)
-		.DistinctUntilChanged()
-		.StartWith(false);
-
-
-###Zip								{#Zip}
-
-The `Zip` extension method is another interesting merge feature. 
-Just like a zipper on clothing or a bag, the `Zip` method brings together two sequences of values as pairs; two by two. 
-Things to note about the `Zip` function is that the result sequence will complete when the first of the sequences complete, it will error if either of the sequences error and it will only publish once it has a pair of fresh values from each source sequence. 
-So if one of the source sequences publishes values faster than the other sequence, the rate of publishing will be dictated by the slower of the two sequences.
-
-	//Generate values 0,1,2 
-	var nums = Observable.Interval(TimeSpan.FromMilliseconds(250))
-		.Take(3);
-	//Generate values a,b,c,d,e,f 
-	var chars = Observable.Interval(TimeSpan.FromMilliseconds(150))
-		.Take(6)
-		.Select(i => Char.ConvertFromUtf32((int)i + 97));
-	//Zip values together
-	nums.Zip(chars, (lhs, rhs) => new { Left = lhs, Right = rhs })
-		.Dump("Zip");
-
-This can be seen in the marble diagram below. 
-Note that the result uses two lines so that we can represent a complex type, i.e. the anonymous type with the properties Left and Right.
-
-<div class="marble">
-	<pre class="line">nums  ----0----1----2| </pre>
-	<pre class="line">chars --a--b--c--d--e--f| </pre>
-	<pre class="line">                        </pre>
-	<pre class="line">result----0----1----2|</pre>
-	<pre class="line">          a    b    c|</pre>
-</div>
-
-The actual output of the code:
-
-<div class="output">
-	<div class="line">{ Left = 0, Right = a }</div>
-	<div class="line">{ Left = 1, Right = b }</div>
-	<div class="line">{ Left = 2, Right = c }</div>
-</div>
-
-Note that the `nums` sequence only produced three values before completing, while the `chars` sequence produced six values. 
-The result sequence thus has three values, as this was the most pairs that could be made.
-
-The first use I saw of `Zip` was to showcase drag and drop. 
-[The example](http://channel9.msdn.com/Blogs/J.Van.Gogh/Writing-your-first-Rx-Application) tracked mouse movements from a `MouseMove` event that would produce event arguments with its current X,Y coordinates. 
-First, the example turns the event into an observable sequence. 
-Then they cleverly zipped the sequence with a `Skip(1)` version of the same sequence. 
-This allows the code to get a delta of the mouse position, i.e. where it is now (sequence.Skip(1)) minus where it was (sequence). 
-It then applied the delta to the control it was dragging.
-
-To visualize the concept, let us look at another marble diagram. 
-Here we have the mouse movement (MM) and the Skip 1 (S1). 
-The numbers represent the index of the mouse movement.
-
-<div class="marble">
-	<pre class="line">MM --1--2--3--4--5</pre>
-	<pre class="line">S1    --2--3--4--5</pre>
-	<pre class="line">                  </pre>
-	<pre class="line">Zip   --1--2--3--4</pre>
-	<pre class="line">        2  3  4  5</pre>
-</div>
-
-Here is a code sample where we fake out some mouse movements with our own subject.
-
-	var mm = new Subject<Coord>();
-	var s1 = mm.Skip(1);
-
-	var delta = mm.Zip(s1,
-						(prev, curr) => new Coord
-							{
-								X = curr.X - prev.X,
-								Y = curr.Y - prev.Y
-							});
-
-	delta.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-	mm.OnNext(new Coord { X = 0, Y = 0 });
-	mm.OnNext(new Coord { X = 1, Y = 0 }); //Move across 1
-	mm.OnNext(new Coord { X = 3, Y = 2 }); //Diagonally up 2
-	mm.OnNext(new Coord { X = 0, Y = 0 }); //Back to 0,0
-	mm.OnCompleted();
-
-This is the simple Coord(inate) class we use.
-
-	public class Coord
-	{
-		public int X { get; set; }
-		public int Y { get; set; }
-		public override string ToString()
-		{
-			return string.Format("{0},{1}", X, Y);
-		}
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">0,1</div>
-	<div class="line">2,2</div>
-	<div class="line">-3,-2</div>
-	<div class="line">Completed</div>
-</div>
-
-It is also worth noting that `Zip` has a second overload that takes an `IEnumerable<T>` as the second input sequence.
-
-	// Merges an observable sequence and an enumerable sequence into one observable sequence 
-	//  containing the result of pair-wise combining the elements by using the selector function.
-	public static IObservable<TResult> Zip<TFirst, TSecond, TResult>(
-		this IObservable<TFirst> first, 
-		IEnumerable<TSecond> second, 
-		Func<TFirst, TSecond, TResult> resultSelector)
-	{...}
-
-This allows us to zip sequences from both `IEnumerable<T>` and `IObservable<T>` paradigms!
-
-###And-Then-When					{#AndThenWhen}
-
-If `Zip` only taking two sequences as an input is a problem, then you can use a combination of the three `And`/`Then`/`When` methods.
-These methods are used slightly differently from most of the other Rx methods. 
-Out of these three, `And` is the only extension method to `IObservable<T>`.
-Unlike most Rx operators, it does not return a sequence; instead, it returns the mysterious type `Pattern<T1, T2>`. 
-The `Pattern<T1, T2>` type is public (obviously), but all of its properties are internal. 
-The only two (useful) things you can do with a `Pattern<T1, T2>` are invoking its `And` or `Then` methods. 
-The `And` method called on the `Pattern<T1, T2>` returns a `Pattern<T1, T2, T3>`. 
-On that type, you will also find the `And` and `Then` methods. 
-The generic `Pattern` types are there to allow you to chain multiple `And` methods together, each one extending the generic type parameter list by one. 
-You then bring them all together with the `Then` method overloads. 
-The `Then` methods return you a `Plan` type. 
-Finally, you pass this `Plan` to the `Observable.When` method in order to create your sequence.
-
-It may sound very complex, but comparing some code samples should make it easier to understand. 
-It will also allow you to see which style you prefer to use.
-
-To `Zip` three sequences together, you can either use `Zip` methods chained together like this:
-
-	var one = Observable.Interval(TimeSpan.FromSeconds(1)).Take(5);
-	var two = Observable.Interval(TimeSpan.FromMilliseconds(250)).Take(10);
-	var three = Observable.Interval(TimeSpan.FromMilliseconds(150)).Take(14);
-	
-	//lhs represents 'Left Hand Side'
-	//rhs represents 'Right Hand Side'
-	var zippedSequence = one
-		.Zip(two, (lhs, rhs) => new {One = lhs, Two = rhs})
-		.Zip(three, (lhs, rhs) => new {One = lhs.One, Two = lhs.Two, Three = rhs});
-
-	zippedSequence.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-Or perhaps use the nicer syntax of the `And`/`Then`/`When`:
-
-	var pattern = one.And(two).And(three);
-	var plan = pattern.Then((first, second, third)=>new{One=first, Two=second, Three=third});
-	var zippedSequence = Observable.When(plan);
-
-	zippedSequence.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-This can be further reduced, if you prefer, to:
-
-	var zippedSequence = Observable.When(
-			one.And(two)
-			   .And(three)
-			   .Then((first, second, third) => 
-					new { 
-						One = first, 
-						Two = second, 
-						Three = third 
-					})
-			);
-
-	zippedSequence.Subscribe(
-		Console.WriteLine,
-		() => Console.WriteLine("Completed"));
-
-The `And`/`Then`/`When` trio has more overloads that enable you to group an even greater number of sequences. 
-They also allow you to provide more than one 'plan' (the output of the `Then` method). 
-This gives you the `Merge` feature but on the collection of 'plans'. 
-I would suggest playing around with them if this functionality is of interest to you. 
-The verbosity of enumerating all of the combinations of these methods would be of low value.
-You will get far more value out of using them and discovering for yourself.
-
-As we delve deeper into the depths of what the Rx libraries provide us, we can see more practical usages for it. 
-Composing sequences with Rx allows us to easily make sense of the multiple data sources a problem domain is exposed to. 
-We can concatenate values or sequences together sequentially with `StartWith`, `Concat` and `Repeat`. 
-We can process multiple sequences concurrently with `Merge`, or process a single sequence at a time with `Amb` and `Switch`. 
-Pairing values with `CombineLatest`, `Zip` and the `And`/`Then`/`When` operators can simplify otherwise fiddly operations like our drag-and-drop examples and monitoring system status.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Essential Linq Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B001XT616O&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 305 - 0
Rx.NET/Documentation/IntroToRx/12_Timing.md

@@ -0,0 +1,305 @@
+# Time-based sequences
+
+With event sources, timing is often important. In some cases, the only information of interest about some event might be the time at which it occurred. The core `IObservable<T>` and `IObserver<T>` interfaces don't mention timing at all in their method signatures, but they don't need to, because a source can decide when it calls an observer's `OnNext` method. A subscriber knows when an event occurred because it is occurring right now. This isn't always the most convenient way in which to work with timing, so the Rx library provides some timing-related operators. We've already seen a couple of operators that offer optional time-based operation: [`Buffer`](08_Partitioning.md#buffer) and [`Window`](08_Partitioning.md#window). This chapter looks at the various operators that are all about timing.
+
+## Timestamp and TimeInterval
+
+As observable sequences are asynchronous it can be convenient to know when elements are received. Obviously, a subscriber can always just use `DateTimeOffset.Now`, but if you want to refer to the arrival time as part of a larger query, the `Timestamp` extension method is a handy convenience method that attaches a timestamp to each element. It wraps elements from its source sequence in a light weight `Timestamped<T>` structure. The `Timestamped<T>` type is a struct that exposes the value of the element it wraps, and also a `DateTimeOffset` indicating when `Timestamp` operator received it.
+
+In this example we create a sequence of three values, one second apart, and then transform it to a time stamped sequence.
+
+```csharp
+Observable.Interval(TimeSpan.FromSeconds(1))
+          .Take(3)
+          .Timestamp()
+          .Dump("Timestamp");
+```
+
+As you can see, `Timestamped<T>`'s implementation of `ToString()` gives us a readable output.
+
+```
+Timestamp-->0@07/08/2023 10:03:58 +00:00
+Timestamp-->1@07/08/2023 10:03:59 +00:00
+Timestamp-->2@07/08/2023 10:04:00 +00:00
+TimeStamp completed
+```
+
+We can see that the values 0, 1, and 2 were each produced one second apart.
+
+Rx also offers `TimeInterval`. Instead of reporting the time at which items arrived, it reports the interval between items (or, in the case of the first element, how long it took for that to emerge after subscription). Similarly to the `Timestamp` method, elements are wrapped in a light weight structure. But whereas `Timestamped<T>` adorned each item with the arrival time, `TimeInterval` wraps each element with the `TimeInterval<T>` type which adds a `TimeSpan`. We can modify the previous example to use `TimeInterval`:
+
+```csharp
+Observable.Interval(TimeSpan.FromSeconds(1))
+          .Take(3)
+          .TimeInterval()
+          .Dump("TimeInterval");
+```
+
+As you can see, the output now reports the time between elements instead of the time of day at which they were received:
+
+```
+Timestamp-->0@00:00:01.0183771
+Timestamp-->1@00:00:00.9965679
+Timestamp-->2@00:00:00.9908958
+Timestamp completed
+```
+
+As you can see from the output, the timings are not exactly one second but are pretty close. Some of this will be measurement noise in the `TimeInterval` operator, but most of this variability is likely to arise from the `Observable.Interval` class. There will always be a limit to the precision with which a scheduler can honour the timing request of it. Some scheduler introduce more variation than others. The schedulers that deliver work via a UI thread are ultimately limited by how quickly that thread's message loop responds. But even in the most favourable condition, schedulers are limited by the fact that .NET is not built for use in real-time systems (and nor are most of the operating systems Rx can be used on). So with all of the operators in this section, you should be aware that timing is always a _best effort_ affair in Rx.
+
+In fact, the inherent variations in timing can make `Timestamp` particularly useful. The problem with simply looking at `DateTimeOffset.Now` is that it takes a non-zero amount of time to process an event, so you'll likely see a slightly different time each time you try to read the current time during the processing of one event. By attaching a timestamp once, we capture the time at which the event was observed, and then it doesn't matter how much delay downstream processing adds. The event will be annotated with a single, fixed time indicating when it passed through `Timestamp`.
+
+## Delay
+
+The `Delay` extension method time-shifts an entire sequence. `Delay` attempts to preserve the relative time intervals between the values. There is inevitably a limit to the precision with which it can do this—it won't recreate timing down to the nearest nanosecond. The exact precision is determined by the scheduler you use, and will typically get worse under heavy load, but it will typically reproduce timings to within a few milliseconds.
+
+There are overloads of `Delay` offering various different ways to specify the time shift. (With all the options, you can optionally pass a scheduler, but if you call the overloads that don't take one, it defaults to [`DefaultScheduler`](11_SchedulingAndThreading.md#defaultscheduler).) The most straightforward is to pass a `TimeSpan`, which will delay the sequence by the specified amount. And there are also delays that accept a `DateTimeOffset` which will wait until the specified time occurs, and then start replaying the input. (This second, absolute time based approach is essentially equivalent to the `TimeSpan` overloads. You would get more or less the same effect by subtracting the current time from the target time to get a `TimeSpan`, except the `DateTimeOffset` version attempts to deal with changes in the system clock that occur between `Delay` being called, and the specified time arriving.)
+
+To show the `Delay` method in action, this example creates a sequence of values one second apart and timestamps them. This will show that it is not the subscription that is being delayed, but the actual forwarding of the notifications to our final subscriber.
+
+```csharp
+IObservable<Timestamped<long>> source = Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .Take(5)
+    .Timestamp();
+
+IObservable<Timestamped<long>> delay = source.Delay(TimeSpan.FromSeconds(2));
+
+delay.Subscribe(value => 
+   Console.WriteLine(
+     $"Item {value.Value} with timestamp {value.Timestamp} received at {DateTimeOffset.Now}"),
+   () => Console.WriteLine("delay Completed"));
+```
+
+If you look at the timestamps in the output, you can see that the times captured by `Timestamp` are all two seconds earlier than the time reported by the subscription:
+
+```
+Item 0 with timestamp 09/11/2023 17:32:20 +00:00 received at 09/11/2023 17:32:22 +00:00
+Item 1 with timestamp 09/11/2023 17:32:21 +00:00 received at 09/11/2023 17:32:23 +00:00
+Item 2 with timestamp 09/11/2023 17:32:22 +00:00 received at 09/11/2023 17:32:24 +00:00
+Item 3 with timestamp 09/11/2023 17:32:23 +00:00 received at 09/11/2023 17:32:25 +00:00
+Item 4 with timestamp 09/11/2023 17:32:24 +00:00 received at 09/11/2023 17:32:26 +00:00
+delay Completed
+```
+
+Note that `Delay` will not time-shift `OnError` notifications. These will be propagated immediately.
+
+## Sample
+
+The `Sample` method produces items at whatever interval you ask. Each time it produces a value, it reports the last value that emerged from your source. If you have a source that produces data at a higher rate than you need (e.g. suppose you have an accelerometer that reports 100 measurements per second, but you only need to take a reading 10 times a second), `Sample` provides an easy way to reduce the data rate. This example shows `Sample` in action.
+
+```csharp
+IObservable<long> interval = Observable.Interval(TimeSpan.FromMilliseconds(150));
+interval.Sample(TimeSpan.FromSeconds(1)).Subscribe(Console.WriteLine);
+```
+
+Output:
+
+```
+5
+12
+18
+```
+
+If you looked at these numbers closely, you might have noticed that the interval between the values is not the same each time. I chose a source interval of 150ms and a sample interval of 1 second to highlight an aspect of sampling that can require careful handling: if the rate at which a source produces items doesn't line up neatly with the sampling rate, this can mean that `Sample` introduces irregularities that weren't present in the source. If we list the times at which the underlying sequence produces values, and the times at which `Sample` takes each value, we can see that with these particular timings, the sample intervals only line up with the source timings every 3 seconds.
+
+| Relative time (ms) | Source value | Sampled value |
+| :----------------- | :----------- | :------------ |
+| 0                  |              |               |
+| 50                 |              |               |
+| 100                |              |               |
+| 150                | 0            |               |
+| 200                |              |               |
+| 250                |              |               |
+| 300                | 1            |               |
+| 350                |              |               |
+| 400                |              |               |
+| 450                | 2            |               |
+| 500                |              |               |
+| 550                |              |               |
+| 600                | 3            |               |
+| 650                |              |               |
+| 700                |              |               |
+| 750                | 4            |               |
+| 800                |              |               |
+| 850                |              |               |
+| 900                | 5            |               |
+| 950                |              |               |
+| 1000               |              | 5             |
+| 1050               | 6            |               |
+| 1100               |              |               |
+| 1150               |              |               |
+| 1200               | 7            |               |
+| 1250               |              |               |
+| 1300               |              |               |
+| 1350               | 8            |               |
+| 1400               |              |               |
+| 1450               |              |               |
+| 1500               | 9            |               |
+| 1550               |              |               |
+| 1600               |              |               |
+| 1650               | 10           |               |
+| 1700               |              |               |
+| 1750               |              |               |
+| 1800               | 11           |               |
+| 1850               |              |               |
+| 1900               |              |               |
+| 1950               | 12           |               |
+| 2000               |              | 12            |
+| 2050               |              |               |
+| 2100               | 13           |               |
+| 2150               |              |               |
+| 2200               |              |               |
+| 2250               | 14           |               |
+| 2300               |              |               |
+| 2350               |              |               |
+| 2400               | 15           |               |
+| 2450               |              |               |
+| 2500               |              |               |
+| 2550               | 16           |               |
+| 2600               |              |               |
+| 2650               |              |               |
+| 2700               | 17           |               |
+| 2750               |              |               |
+| 2800               |              |               |
+| 2850               | 18           |               |
+| 2900               |              |               |
+| 2950               |              |               |
+| 3000               | 19           | 19            |
+
+Since the first sample is taken after the source emits five, and two thirds of the way into the gap after which it will produce six, there's a sense in which the "right" current value is something like 5.67, but `Sample` doesn't attempt any such interpolation. It just reports the last value to emerge from the source. A related consequence is that if the sampling interval is short enough that you're asking `Sample` to report values faster than they are emerging from the source, it will just repeat values.
+
+## Throttle
+
+The `Throttle` extension method provides a sort of protection against sequences that produce values at variable rates and sometimes too quickly. Like the `Sample` method, `Throttle` will return the last sampled value for a period of time. Unlike `Sample` though, `Throttle`'s period is a sliding window. Each time `Throttle` receives a value, the window is reset. Only once the period of time has elapsed will the last value be propagated. This means that the `Throttle` method is only useful for sequences that produce values at a variable rate. Sequences that produce values at a constant rate (like `Interval` or `Timer`) would have all of their values suppressed if they produced values faster than the throttle period, whereas all of their values would be propagated if they produced values slower than the throttle period.
+
+```csharp
+// Ignores values from an observable sequence which 
+// are followed by another value before dueTime.
+public static IObservable<TSource> Throttle<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan dueTime)
+{...}
+public static IObservable<TSource> Throttle<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan dueTime, 
+    IScheduler scheduler)
+{...}
+```
+
+We could apply `Throttle` to use a live search feature that makes suggestions as you type. We would typically want to wait until the user has stopped typing for a bit before searching for suggestions, because otherwise, we might end up kicking off several searches in a row, cancelling the last one each time the user presses another key. Only once there is a pause should we can execute a search with what they have typed so far. `Throttle` fits well with this scenario, because it won't allow any events through at all if the source is producing values faster than the specified rate.
+
+Note that the RxJS library decided to make their version of throttle work differently, so if you ever find yourself using both Rx.NET and RxJS, be aware that they don't work the same way. In RxJS, throttle doesn't shut off completely when the source exceeds the specified rate: it just drops enough items that the output never exceeds the specified rate. So RxJS's throttle implementation is a kind of rate limiter, whereas Rx.NET's `Throttle` is more like a self-resetting circuit breaker that shuts off completely during an overload.
+
+## Timeout
+
+The `Timeout` operator method allows us terminate a sequence with an error if the source does not produce any notifications for a given period. We can either specify the period as a sliding window with a `TimeSpan`, or as an absolute time that the sequence must complete by providing a `DateTimeOffset`.
+
+```csharp
+// Returns either the observable sequence or a TimeoutException
+// if the maximum duration between values elapses.
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan dueTime)
+{...}
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan dueTime, 
+    IScheduler scheduler)
+{...}
+
+// Returns either the observable sequence or a  
+// TimeoutException if dueTime elapses.
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    DateTimeOffset dueTime)
+{...}
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    DateTimeOffset dueTime, 
+    IScheduler scheduler)
+{...}
+```
+
+If we provide a `TimeSpan` and no values are produced within that time span, then the sequence fails with a `TimeoutException`.
+
+```csharp
+var source = Observable.Interval(TimeSpan.FromMilliseconds(100))
+                       .Take(5)
+                       .Concat(Observable.Interval(TimeSpan.FromSeconds(2)));
+
+var timeout = source.Timeout(TimeSpan.FromSeconds(1));
+timeout.Subscribe(
+    Console.WriteLine, 
+    Console.WriteLine, 
+    () => Console.WriteLine("Completed"));
+```
+
+Initially this produces values frequently enough to satisfy `Timeout`, so the observable returned by `Timeout` just forwards items from the source. But once the source stops producing items, we get an OnError:
+
+```
+0
+1
+2
+3
+4
+System.TimeoutException: The operation has timed out.
+```
+
+Alternatively, we can pass `Timeout` an absolute time; if the sequence does not complete by that time, it produces an error.
+
+```csharp
+var dueDate = DateTimeOffset.UtcNow.AddSeconds(4);
+var source = Observable.Interval(TimeSpan.FromSeconds(1));
+var timeout = source.Timeout(dueDate);
+timeout.Subscribe(
+    Console.WriteLine, 
+    Console.WriteLine, 
+    () => Console.WriteLine("Completed"));
+```
+
+Output:
+
+```
+0
+1
+2
+System.TimeoutException: The operation has timed out.
+```
+
+There are other `Timeout` overloads enabling us to substitute an alternative sequence when a timeout occurs.
+
+```csharp
+// Returns the source observable sequence or the other observable 
+// sequence if the maximum duration between values elapses.
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan dueTime, 
+    IObservable<TSource> other)
+{...}
+
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    TimeSpan dueTime, 
+    IObservable<TSource> other, 
+    IScheduler scheduler)
+{...}
+
+// Returns the source observable sequence or the 
+// other observable sequence if dueTime elapses.
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    DateTimeOffset dueTime, 
+    IObservable<TSource> other)
+{...}  
+
+public static IObservable<TSource> Timeout<TSource>(
+    this IObservable<TSource> source, 
+    DateTimeOffset dueTime, 
+    IObservable<TSource> other, 
+    IScheduler scheduler)
+{...}
+```
+
+As we've now seen, Rx provides features to manage timing in a reactive paradigm. Data can be timed, throttled, or sampled to meet your needs. Entire sequences can be shifted in time with the delay feature, and timeliness of data can be asserted with the `Timeout` operator.
+
+Next we will look at the boundary between Rx and the rest of the world.

+ 500 - 0
Rx.NET/Documentation/IntroToRx/13_LeavingIObservable.md

@@ -0,0 +1,500 @@
+# Leaving Rx's World
+
+An observable sequence is a useful construct, especially when we have the power of LINQ to compose complex queries over it. Even though we recognize the benefits of the observable sequence, sometimes we must leave the `IObservable<T>` paradigm. This is necessary when we need to integrate with an existing non-Rx-based API (e.g. one that uses events or `Task<T>`). You might leave the observable paradigm if you find it easier for testing, or it may simply be easier for you to learn Rx by moving between an observable paradigm and a more familiar one.
+
+Rx's compositional nature is the key to its power, but it can look like a problem when you need to integrate with a component that doesn't understand Rx. Most of the Rx library features we've looked at so far express their inputs and outputs as observables. How are you supposed to take some real world source of events and turn that into an observable? How are you supposed to do something meaningful with the output of an observable?
+
+You've already seen some answer to these questions. The [Creating Observable Sequences chapter](03_CreatingObservableSequences.md) showed various ways to create observable sources. But when it comes to handling the items that emerge from an `IObservable<T>`, all we've really seen is how to implement [`IObserver<T>`](02_KeyTypes.md#iobserver), and [how to use the callback based `Subscribe` extension methods  to subscribe to an `IObservable<T>`](02_KeyTypes.md#iobservable).
+
+In this chapter, we will look at the methods in Rx which allow you to leave the `IObservable<T>` world, so you can take action based on the notifications that emerge from an Rx source.
+
+## Integration with `async` and `await`
+
+You can use C#'s `await` keyword with any `IObservable<T>`. We saw this earlier with [`FirstAsync`](05_Filtering.md#blocking-versions-of-firstlastsingleordefault):
+
+```csharp
+long v = await Observable.Timer(TimeSpan.FromSeconds(2)).FirstAsync();
+Console.WriteLine(v);
+```
+
+Although `await` is most often used with `Task`, `Task<T>`, or `ValueTask<T>`, it is actually an extensible language feature. It's possible to make `await` work for more or less any type by supplying a method called `GetAwaiter`, typically as an extension method, and a suitable type for `GetAwaiter` to return, providing C# with the features `await` requires. That's precisely what Rx does. If your source file includes a `using System.Reactive.Linq;` directive, a suitable extension method will be available, so you can `await` any task.
+
+The way this actually works is that the relevant `GetAwaiter` extension method wraps the `IObservable<T>` in an `AsyncSubject<T>`, which provides everything that C# requires to support `await`. These wrappers work in such a way that there will be a call to `Subscribe` each time you execute an `await` against an `IObservable<T>`.
+
+If a source reports an error by invoking its observer's `OnError`, Rx's `await` integration handles this by putting the task into a faulted state, so that the `await` will rethrow the exception.
+
+Sequences can be empty. They might call `OnCompleted` without ever having called `OnNext`. However, since there's no way to tell from the type of a source that it will be empty, this doesn't fit especially well with the `await` paradigm. With tasks, you can know at compile time whether you'll get a result by looking at whether you're awaiting a `Task` or `Task<T>`, so the compiler is able to know whether a particular `await` expression produces a value. But when you `await` and `IObservable<T>`, there's no compile-time distinction, so the only way Rx can report that a sequence is empty when you `await` is to throw an `InvalidOperationException` reporting that the sequence contains no elements.
+
+As you may recall from the [`AsyncSubject<T>` section of chapter 3](03_CreatingObservableSequences.md#asyncsubjectt), `AsyncSubject<T>` reports only the final value to emerge from its source. So if you `await` a sequence that reports multiple items, all but the final item will be ignored. What if you want to see all of the items, but you'd still like to use `await` to handle completion and errors?
+
+## ForEachAsync
+
+The `ForEachAsync` method supports `await`, but it provides a way to process each element. You could think of it as a hybrid of the `await` behaviour described in the preceding section, and the callback-based `Subscribe`. We can still use `await` to detect completion and errors, but we supply a callback enabling us to handle every item:
+
+```csharp
+IObservable<long> source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(5);
+await source.ForEachAsync(i => Console.WriteLine($"received {i} @ {DateTime.Now}"));
+Console.WriteLine($"finished @ {DateTime.Now}");
+```
+
+Output:
+
+```
+received 0 @ 02/08/2023 07:53:46
+received 1 @ 02/08/2023 07:53:47
+received 2 @ 02/08/2023 07:53:48
+received 3 @ 02/08/2023 07:53:49
+received 4 @ 02/08/2023 07:53:50
+finished @ 02/08/2023 07:53:50
+```
+
+Note that the `finished` line is last, as you would expect. Let's compare this with the `Subscribe` extension method, which also lets us provide a single callback for handling items:
+
+```csharp
+IObservable<long> source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(5);
+source.Subscribe(i => Console.WriteLine($"received {i} @ {DateTime.Now}"));
+Console.WriteLine($"finished @ {DateTime.Now}");
+```
+
+As the output shows, `Subscribe` returned immediately. Our per-item callback was invoked just like before, but this all happened later on:
+
+```
+finished @ 02/08/2023 07:55:42
+received 0 @ 02/08/2023 07:55:43
+received 1 @ 02/08/2023 07:55:44
+received 2 @ 02/08/2023 07:55:45
+received 3 @ 02/08/2023 07:55:46
+received 4 @ 02/08/2023 07:55:47
+```
+
+This can be useful in batch-style programs that perform some work and then exit. The problem with using `Subscribe` in that scenario is that our program could easily exit without having finished the work it started. This is easy to avoid with `ForEachAsync` because we just use `await` to ensure that our method doesn't complete until the work is done.
+
+When we use `await` either directly against an `IObservable<T>`, or through `ForEachAsync`, we are essentially choosing to handle sequence completion in a conventional way, not a reactive way. Error and completion handling are no longer callback driven—Rx supplies the `OnCompleted` and `OnError` handlers for us, and instead represents these through C#'s awaiter mechanism. (Specifically, when we `await` a source directly, Rx supplies a custom awaiter, and when we use `ForEachAsync` it just returns a `Task`.)
+
+Note that there are some circumstances in which `Subscribe` will block until its source completes. [`Observable.Return`](03_CreatingObservableSequences.md#observablereturn) will do this by default, as will [`Observable.Range`](03_CreatingObservableSequences.md#observablerange). We could try to make the last example do it by specifying a different scheduler:
+
+```csharp
+// Don't do this!
+IObservable<long> source = 
+   Observable.Interval(TimeSpan.FromSeconds(1), ImmediateScheduler.Instance)
+             .Take(5);
+source.Subscribe(i => Console.WriteLine($"received {i} @ {DateTime.Now}"));
+Console.WriteLine($"finished @ {DateTime.Now}");
+```
+
+However, this highlights the dangers of non-async blocking calls: although this looks like it should work, in practice it deadlocks in the current version of Rx. Rx doesn't consider the `ImmediateScheduler` to be suitable for timer-based operations, which is why it's not the default, and this scenario is a good example of why that is. (The fundamental issue is that the only way to cancel a scheduled work item is to call `Dispose` on the object returned by the call to `Schedule`. `ImmediateScheduler` by definition doesn't return until after it has finished the work, meaning it effectively can't support cancellation. So the call to `Interval` effectively creates a periodically scheduled work item that can't be cancelled, and which is therefore doomed to run forever.)
+
+This is why we need `ForEachAsync`. It might look like we can get the same effect through clever use of schedulers, but in practice if you need to wait for something asynchronous to happen, it's always better to use `await` than to use an approach that entails blocking the calling thread.
+
+## ToEnumerable
+
+The two mechanisms we've explored so far convert completion and error handling from Rx's callback mechanism to a more conventional approach enabled by `await`, but we still had to supply a callback to be able to handle every individual item. But the `ToEnumerable` extension method goes a step further: it enables the entire sequence to be consumed with a conventional `foreach` loop:
+
+```csharp
+var period = TimeSpan.FromMilliseconds(200);
+IObservable<long> source = Observable.Timer(TimeSpan.Zero, period).Take(5);
+IEnumerable<long> result = source.ToEnumerable();
+
+foreach (long value in result)
+{
+    Console.WriteLine(value);
+}
+
+Console.WriteLine("done");
+```
+
+Output:
+
+```
+0
+1
+2
+3
+4
+done
+```
+
+The source observable sequence will be subscribed to when you start to enumerate the sequence (i.e. lazily). 
+If no elements are available yet, or you have consumed all elements produced so far, the call that `foreach` makes to the enumerator's `MoveNext` will block until the source produces an element. So this approach relies on the source being able to generate elements from some other thread. (In this example, `Timer` defaults to the [`DefaultScheduler`](11_SchedulingAndThreading.md#defaultscheduler), which runs timed work on the thread pool.) If the sequence produces values faster than you consume them, they will be queued for you. (This means that it is technically possible to consume and generate items on the same thread when using `ToEnumerable` but this would rely on the producer always remaining ahead. This would be a dangerous approach because if the `foreach` loop ever caught up, it would then deadlock.)
+
+As with `await` and `ForEachAsync`, if the source reports an error, this will be thrown, so you can use ordinary C# exception handling as this example shows:
+
+```csharp
+try 
+{ 
+    foreach (long value in result)
+    { 
+        Console.WriteLine(value); 
+    } 
+} 
+catch (Exception e) 
+{ 
+    Console.WriteLine(e.Message);
+} 
+```
+
+## To a single collection
+
+Sometimes you will want all of the items a source produces as a single list. For example, perhaps you can't just process the elements individually because you will sometimes need to refer back to elements received earlier. The four operations described in following sections gather all of the items into a single collection. They all still produce an `IObservable<T>` (e.g., an `IObservable<int[]>` or an `IObservable<Dictionary<string, long>>`), but these are all single-element observables, and as you've already seen, you can use the `await` keyword to get hold of this single output.
+
+### ToArray and ToList
+
+`ToArray` and `ToList` take an observable sequence and package it into an array or an instance of `List<T>` respectively. As with all of the single collection operations, these return an observable source that waits for their input sequence to complete, and then produces the array or list as the single value, after which they immediately complete. This example uses `ToArray` to collect all 5 elements from a source sequence into an array, and uses `await` to extract that array from the sequence that `ToArray` returns:
+
+```csharp
+TimeSpan period = TimeSpan.FromMilliseconds(200);
+IObservable<long> source = Observable.Timer(TimeSpan.Zero, period).Take(5);
+IObservable<long[]> resultSource = source.ToArray();
+
+long[] result = await resultSource;
+foreach (long value in result)
+{
+    Console.WriteLine(value);
+}
+```
+
+Output:
+
+```
+0
+1
+2
+3
+4
+```
+
+As these methods still return observable sequences, you can also use the normal Rx `Subscribe` mechanisms, or use these as inputs to other operators.
+
+If the source produces values and then errors, you will not receive any of those values. All values received up to that point will be discarded, and the operator will invoke its observer's `OnError` (and in the example above, that will result in the exception being thrown from the `await`). All four operators (`ToArray`, `ToList`, `ToDictionary` and `ToLookup`) handle errors like this.
+
+### ToDictionary and ToLookup
+
+Rx can package an observable sequence into a dictionary or lookup with the `ToDictionary` and `ToLookup` methods. Both methods take the same basic approach as the `ToArray` and `ToList` methods: they return a single-element sequence that produces the collection once the input source completes.
+
+`ToDictionary` provides four overloads that correspond directly to the `ToDictionary` extension methods for `IEnumerable<T>` defined by LINQ to Objects:
+
+```csharp
+// Creates a dictionary from an observable sequence according to a specified 
+// key selector function, a comparer, and an element selector function.
+public static IObservable<IDictionary<TKey, TElement>> ToDictionary<TSource, TKey, TElement>(
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector, 
+    Func<TSource, TElement> elementSelector, 
+    IEqualityComparer<TKey> comparer) 
+{...} 
+
+// Creates a dictionary from an observable sequence according to a specified
+// key selector function, and an element selector function. 
+public static IObservable<IDictionary<TKey, TElement>> ToDictionary<TSource, TKey, TElement>( 
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector, 
+    Func<TSource, TElement> elementSelector) 
+{...} 
+
+// Creates a dictionary from an observable sequence according to a specified
+// key selector function, and a comparer. 
+public static IObservable<IDictionary<TKey, TSource>> ToDictionary<TSource, TKey>( 
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector,
+    IEqualityComparer<TKey> comparer) 
+{...} 
+
+// Creates a dictionary from an observable sequence according to a specified 
+// key selector function. 
+public static IObservable<IDictionary<TKey, TSource>> ToDictionary<TSource, TKey>( 
+    this IObservable<TSource> source, 
+    Func<TSource, TKey> keySelector) 
+{...} 
+```
+
+The `ToLookup` extension offers near-identical-looking overloads, the difference being the return type (and the name, obviously). They all return an `IObservable<ILookup<TKey, TElement>>`. As with LINQ to Objects, the distinction between a dictionary and a lookup is that the `ILookup<TKey, TElement>>` interface allows each key to have any number of values, whereas a dictionary maps each key to one value.
+
+## ToTask
+
+Although Rx provides direct support for using `await` with an `IObservable<T>`, it can sometimes be useful to obtain a `Task<T>` representing an `IObservable<T>`. This is useful because some APIs expect a `Task<T>`. You can call `ToTask()` on any `IObservable<T>`, and this will subscribe to that observable, returning a `Task<T>` that will complete when the task completes, producing the sequence's final output as the task's result. If the source completes without producing an element, the task will enter a faulted state, with an `InvalidOperation` exception complaining that the input sequence contains no elements.
+
+You can optionally pass a cancellation token. If you cancel this before the observable sequence completes, Rx will unsubscribe from the source, and put the task into a cancelled state.
+
+This is a simple example of how the `ToTask` operator can be used. 
+Note, the `ToTask` method is in the `System.Reactive.Threading.Tasks` namespace.
+
+```csharp
+IObservable<long> source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(5);
+Task<long> resultTask = source.ToTask();
+long result = await resultTask; // Will take 5 seconds. 
+Console.WriteLine(result);
+```
+
+Output:
+
+```
+4
+```
+
+If the source sequence calls `OnError`, Rx puts the task in a faulted state, using the exception supplied.
+
+Once you have your task, you can of course use all the features of the TPL such as continuations.
+
+## ToEvent
+
+Just as you can use an event as the source for an observable sequence with [`FromEventPattern`](03_CreatingObservableSequences.md#from-events), you can also make your observable sequence look like a standard .NET event with the `ToEvent` extension methods.
+
+```csharp
+// Exposes an observable sequence as an object with a .NET event. 
+public static IEventSource<unit> ToEvent(this IObservable<Unit> source)
+{...}
+
+// Exposes an observable sequence as an object with a .NET event. 
+public static IEventSource<TSource> ToEvent<TSource>(this IObservable<TSource> source) 
+{...}
+```
+
+The `ToEvent` method returns an `IEventSource<T>`, which has a single member: an `OnNext` event.
+
+```csharp
+public interface IEventSource<T> 
+{ 
+    event Action<T> OnNext; 
+} 
+```
+
+When we convert the observable sequence with the `ToEvent` method, we can just subscribe by providing an `Action<T>`, which we do here with a lambda.
+
+```csharp
+var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(5); 
+var result = source.ToEvent(); 
+result.OnNext += val => Console.WriteLine(val);
+```
+
+Output:
+
+```
+0
+1
+2
+3
+4
+```
+
+Although this is the simplest way to convert Rx notifications into events, it does not follow the standard .NET event pattern. We use a slightly different approach if we want that.
+
+### ToEventPattern
+
+Normally, .NET events supply `sender` and `EventArgs` arguments to their handlers. In the example above, we just get the value. If you want to expose your sequence as an event that follows the standard pattern, you will need to use `ToEventPattern`.
+
+```csharp
+// Exposes an observable sequence as an object with a .NET event. 
+public static IEventPatternSource<TEventArgs> ToEventPattern<TEventArgs>(
+    this IObservable<EventPattern<TEventArgs>> source) 
+    where TEventArgs : EventArgs 
+```
+
+The `ToEventPattern` will take an `IObservable<EventPattern<TEventArgs>>` and convert that into an `IEventPatternSource<TEventArgs>`. The public interface for these types is quite simple.
+
+```csharp
+public class EventPattern<TEventArgs> : IEquatable<EventPattern<TEventArgs>>
+    where TEventArgs : EventArgs 
+{ 
+    public EventPattern(object sender, TEventArgs e)
+    { 
+        this.Sender = sender; 
+        this.EventArgs = e; 
+    } 
+    public object Sender { get; private set; } 
+    public TEventArgs EventArgs { get; private set; } 
+    //...equality overloads
+} 
+
+public interface IEventPatternSource<TEventArgs> where TEventArgs : EventArgs
+{ 
+    event EventHandler<TEventArgs> OnNext; 
+} 
+```
+
+To use this, we will need a suitable `EventArgs` type. You might be able to use one supplied by the .NET runtime libraries, but if not you can easily write your own:
+
+The `EventArgs` type:
+
+```csharp
+public class MyEventArgs : EventArgs 
+{ 
+    private readonly long _value; 
+    
+    public MyEventArgs(long value) 
+    { 
+        _value = value; 
+    } 
+
+    public long Value 
+    { 
+        get { return _value; } 
+    } 
+} 
+```
+
+We can then use this from Rx by applying a simple transform using `Select`:
+
+```csharp
+IObservable<EventPattern<MyEventArgs>> source = 
+   Observable.Interval(TimeSpan.FromSeconds(1))
+             .Select(i => new EventPattern<MyEventArgs>(this, new MyEventArgs(i)));
+```
+
+Now that we have a sequence that is compatible, we can use the `ToEventPattern`, and in turn, a standard event handler.
+
+```csharp
+IEventPatternSource<MyEventArgs> result = source.ToEventPattern(); 
+result.OnNext += (sender, eventArgs) => Console.WriteLine(eventArgs.Value);
+```
+
+Now that we know how to get back into .NET events, let's take a break and remember why Rx is a better model.
+
+- Events are difficult to compose
+- Events cannot be passed as argument or stored in fields
+- Events do not offer the ability to be easily queried over time
+- Events do not have a standard pattern for reporting errors
+- Events do not have a standard pattern for indicating the end of a sequence of values
+- Events provide almost no help for managing concurrency or multithreaded applications
+
+## Do
+
+Non-functional requirements of production systems often demand high availability, quality monitoring features and low lead time for defect resolution. Logging, debugging, instrumentation and journaling are common implementation choices for implementing non-functional requirements. To enable these it can often be useful to 'tap into' your Rx queries, making them deliver monitoring and diagnostic information as a side effect of their normal operation.
+
+The `Do` extension method allows you to inject side effect behaviour. From an Rx perspective, `Do` doesn't appear to do anything: you can apply it to any `IObservable<T>`, and it returns another `IObservable<T>` that reports exactly the same elements and error or completion as its source. However, its various overloads takes callback arguments that look just like those for `Subscribe`: you can provide callbacks for individual items, completion, and errors. Unlike `Subscribe`, `Do` is not the final destination—everything the `Do` callbacks see will also be forwarded onto `Do`'s subscribers.  This makes it useful for logging and similar instrumentation because you can use it to report how information is flowing through an Rx query without changing that query's behaviour.
+
+You have to be a bit careful of course. Using `Do` will have a performance impact. And if the callback you supply to `Do` performs any operations that could change the inputs to the Rx query it is part of, you will have created a feedback loop making the behaviour altogether harder to understand.
+
+Let's first define some logging methods that we can go on to use in an example:
+
+```csharp
+private static void Log(object onNextValue)
+{
+    Console.WriteLine($"Logging OnNext({onNextValue}) @ {DateTime.Now}");
+}
+
+private static void Log(Exception error)
+{
+    Console.WriteLine($"Logging OnError({error}) @ {DateTime.Now}");
+}
+
+private static void Log()
+{
+    Console.WriteLine($"Logging OnCompleted()@ {DateTime.Now}");
+}
+```
+
+This code uses `Do` to introduce some logging using the methods from above.
+
+```csharp
+IObservable<long> source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(3);
+IObservable<long> loggedSource = source.Do(
+    i => Log(i),
+    ex => Log(ex),
+    () => Log());
+
+loggedSource.Subscribe(
+    Console.WriteLine,
+    () => Console.WriteLine("completed"));
+```
+
+Output:
+
+```
+Logging OnNext(0) @ 01/01/2012 12:00:00
+0
+Logging OnNext(1) @ 01/01/2012 12:00:01
+1
+Logging OnNext(2) @ 01/01/2012 12:00:02
+2
+Logging OnCompleted() @ 01/01/2012 12:00:02
+completed
+```
+
+Note that because the `Do` is part of the query, it necessarily sees the values earlier than the `Subscribe`, which is the final link in the chain. That's why the log messages appear before the lines produced by the `Subscribe` callbacks. I like to think of the `Do` method as a [wire tap](http://en.wikipedia.org/wiki/Telephone_tapping) to a sequence. It gives you the ability to listen in on the sequence without modifying it.
+
+As with `Subscribe`, instead of passing callbacks, there are overloads that let you supply callbacks for whichever of the OnNext, OnError, and OnCompleted notifications you want, or you can pass `Do` an `IObserver<T>`.
+
+## Encapsulating with AsObservable
+
+Poor encapsulation is a way developers can leave the door open for bugs. Here is a handful of scenarios where carelessness leads to leaky abstractions. Our first example may seem harmless at a glance, but has numerous problems.
+
+```csharp
+public class UltraLeakyLetterRepo
+{
+    public ReplaySubject<string> Letters { get; }
+
+    public UltraLeakyLetterRepo()
+    {
+        Letters = new ReplaySubject<string>();
+        Letters.OnNext("A");
+        Letters.OnNext("B");
+        Letters.OnNext("C");
+    }
+}
+```
+
+In this example we expose our observable sequence as a property. We've used a `ReplaySubject<string>` so that each subscriber will receive all of the values upon subscription. However, revealing this implementation choice in the public type of the `Letters` property is poor encapsulation, as consumers could call `OnNext`/`OnError`/`OnCompleted`. To close off that loophole we can simply make the publicly visible property type an `IObservable<string>`.
+
+```csharp
+public class ObscuredLeakinessLetterRepo
+{
+    public IObservable<string> Letters { get; }
+
+    public ObscuredLeakinessLetterRepo()
+    {
+        var letters = new ReplaySubject<string>();
+        letters.OnNext("A");
+        letters.OnNext("B");
+        letters.OnNext("C");
+        this.Letters = letters;
+    }
+}
+```
+
+This is a significant improvement: the compiler won't let someone using an instance of this source write `source.Letters.OnNext("1")`. So the API surface area properly encapsulates the implementation detail, but if we were paranoid, we could not that nothing prevents consumers from casting the result back to an `ISubject<string>` and then calling whatever methods they like. In this example we see external code pushing their values into the sequence.
+
+```csharp
+var repo = new ObscuredLeakinessLetterRepo();
+IObservable<string> good = repo.GetLetters();
+    
+good.Subscribe(Console.WriteLine);
+
+// Be naughty
+if (good is ISubject<string> evil)
+{
+    // So naughty, 1 is not a letter!
+    evil.OnNext("1");
+}
+else
+{
+    Console.WriteLine("could not sabotage");
+}
+```
+
+Output:
+
+```
+A
+B
+C
+1
+```
+
+Arguably, code that does this sort of thing is asking for trouble, but if we wanted actively to prevent it, the fix to this problem is quite simple. By applying the `AsObservable` extension method, we can modify the line of the constructor that sets `this.Letters` to wrap the subject in a type that only implements `IObservable<T>`.
+
+```csharp
+this.Letters = letters.AsObservable();
+```
+
+Output:
+
+```
+A
+B
+C
+could not sabotage
+```
+
+While I have used words like 'evil' and 'sabotage' in these examples, it is [more often than not an oversight rather than malicious intent](https://en.wikipedia.org/wiki/Hanlon%27s_razor) that causes problems. The failing falls first on the programmer who designed the leaky class. Designing interfaces is hard, but we should do our best to help consumers of our code fall into [the pit of success](https://learn.microsoft.com/en-gb/archive/blogs/brada/the-pit-of-success) by giving them discoverable and consistent types. Types become more discoverable if we reduce their surface area to expose only the features we intend our consumers to use. In this example we reduced the type's surface area. We did so by choosing a suitable public-facing type for the property, and then preventing access to the underlying type with the `AsObservable` method.
+
+The set of methods we have looked at in this chapter complete the circle started in the [Creating Sequences chapter](03_CreatingObservableSequences.md). We now have the means to enter and leave Rx's world. Take care when opting in and out of the `IObservable<T>`. It's best not to transition back and forth—having a bit of Rx-based processing, then some more conventional code, and then plumbing the results of that back into Rx can quickly make a mess of your code base, and may indicate a design flaw. Typically it is better to keep all of your Rx logic together, so you only need to integrating with the outside world twice: once for input and once for output.

+ 0 - 1100
Rx.NET/Documentation/IntroToRx/13_TimeShiftedSequences.md

@@ -1,1100 +0,0 @@
----
-title: Time-shifted sequences
----
-
-#Time-shifted sequences				{#TimeShiftedSequences}
-
-When working with observable sequences, the time axis is an unknown quantity: when will the next notification arrive? 
-When consuming an `IEnumerable` sequence, asynchrony is not a concern; when we call `MoveNext()`, we are blocked until the sequence yields. 
-This chapter looks at the various methods we can apply to an observable sequence when its relationship with time is a concern.
-
-##Buffer							{#Buffer}
-
-Our first subject will be the `Buffer` method. 
-In some situations, you may not want a deluge of individual notifications to process. 
-Instead, you might prefer to work with batches of data. 
-It may be the case that processing one item at a time is just too expensive, and the trade-off is to deal with messages in batches, at the cost of accepting a delay.
-
-The `Buffer` operator allows you to store away a range of values and then re-publish them as a list once the buffer is full. 
-You can temporarily withhold a specified number of elements, stash away all the values for a given time span, or use a combination of both count and time. 
-`Buffer` also offers more advanced overloads that we will look at in a future chapter.
-
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		int count)
-	{...}
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan)
-	{...}
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		int count)
-	{...}
-
-The two overloads of `Buffer` are straight forward and should make it simple for other developers to understand the intent of the code.
-
-	IObservable<IList<T>> bufferedSequence;
-	bufferedSequence = mySequence.Buffer(4);
-	//or
-	bufferedSequence = mySequence.Buffer(TimeSpan.FromSeconds(1))
-
-For some use cases, it may not be enough to specify only a buffer size and a maximum delay period. 
-Some systems may have a sweet spot for the size of a batch they can process, but also have a time constraint to ensure that data is not stale. 
-In this case buffering by both time and count would be suitable.
-
-In this example below, we create a sequence that produces the first ten values one second apart, then a further hundred values within another second. 
-We buffer by a maximum period of three seconds and a maximum batch size of fifteen values.
-
-	var idealBatchSize = 15;
-	var maxTimeDelay = TimeSpan.FromSeconds(3);
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10)
-		.Concat(Observable.Interval(TimeSpan.FromSeconds(0.01)).Take(100));
-
-	source.Buffer(maxTimeDelay, idealBatchSize)
-		.Subscribe(
-			buffer => Console.WriteLine("Buffer of {1} @ {0}", DateTime.Now, buffer.Count), 
-			() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">Buffer of 3 @ 01/01/2012 12:00:03</div>
-	<div class="line">Buffer of 3 @ 01/01/2012 12:00:06</div>
-	<div class="line">Buffer of 3 @ 01/01/2012 12:00:09</div>
-	<div class="line">Buffer of 15 @ 01/01/2012 12:00:10</div>
-	<div class="line">Buffer of 15 @ 01/01/2012 12:00:10</div>
-	<div class="line">Buffer of 15 @ 01/01/2012 12:00:10</div>
-	<div class="line">Buffer of 15 @ 01/01/2012 12:00:11</div>
-	<div class="line">Buffer of 15 @ 01/01/2012 12:00:11</div>
-	<div class="line">Buffer of 15 @ 01/01/2012 12:00:11</div>
-	<div class="line">Buffer of 11 @ 01/01/2012 12:00:11</div>
-</div>
-
-Note the variations in time and buffer size. 
-We never get a buffer containing more than fifteen elements, and we never wait more than three seconds. 
-A practical application of this is when you are loading data from an external source into an `ObservableCollection<T>` in a WPF application. 
-It may be the case that adding one item at a time is just an unnecessary load on the dispatcher (especially if you are expecting over a hundred items). 
-You may have also measured, for example that processing a batch of fifty items takes 100ms. 
-You decide that this is the maximum amount of time you want to block the dispatcher, to keep the application responsive. 
-This could give us two reasonable values to use: `source.Buffer(TimeSpan.FromMilliseconds(100), 50)`.
-This means the longest we will block the UI is about 100ms to process a batch of 50 values, and we will never have values waiting for longer than 100ms before they are processed.
-
-###Overlapping buffers				{#OverlappingBuffers}
-
-`Buffer` also offers overloads to manipulate the overlapping of the buffers.
-The variants we have looked at so far do not overlap and have no gaps between buffers, i.e. all values from the source are propagated through.
-
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		int count, 
-		int skip)
-	{...}
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		TimeSpan timeShift)
-	{...}
-
-There are three interesting things you can do with overlapping buffers:
-
-<dl>
-	<dt>Overlapping behavior</dt>
-	<dd>
-		Ensure that current buffer includes some or all values from previous buffer</dd>
-	<dt>Standard behavior</dt>
-	<dd>
-		Ensure that each new buffer only has new data</dd>
-	<dt>Skip behavior</dt>
-	<dd>
-		Ensure that each new buffer not only contains new data exclusively, but also ignores
-		one or more values since the previous buffer</dd>
-</dl>
-
-####Overlapping buffers by count	{#OverlappingBuffersByCount}
-
-If you are specifying a buffer size as a count, then you need to use this overload.
-
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		int count, 
-		int skip)
-	{...}
-
-You can apply the above scenarios as follows:
-
-<dl>
-	<dt>Overlapping behavior</dt>
-	<dd>
-		`skip` < `count`*</dd>
-	<dt>Standard behavior</dt>
-	<dd>
-		`skip` = `count`</dd>
-	<dt>Skip behavior</dt>
-	<dd>
-		`skip` > `count`</dd>
-
-<p class="comment">
-	*The `skip` parameter cannot be less than or equal to zero. If you want to
-	use a value of zero (i.e. each buffer contains all values), then consider using
-	the <a href="07_Aggregation.html#Scan">`Scan`</a> method instead with an
-	`IList<T>` as the accumulator.
-</p>
-
-Let's see each of these in action. In this example, we have a source that produces values every second. 
-We apply each of the variations of the buffer overload.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
-	source.Buffer(3, 1)
-		.Subscribe(
-			buffer =>
-			{
-				Console.WriteLine("--Buffered values");
-				foreach (var value in buffer)
-				{
-					Console.WriteLine(value);
-				}
-			}, () => Console.WriteLine("Completed"));
-
-Output
-
-<div class="output">
-	<div class="line">--Buffered values</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">5</div>
-	<div class="line">etc....</div>
-</div>
-
-Note that in each buffer, one value is skipped from the previous batch. 
-If we change the `skip` parameter from 1 to 3 (same as the buffer size), we see standard buffer behavior.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
-	source.Buffer(3, 3)
-		...
-
-Output
-
-<div class="output">
-	<div class="line">--Buffered values</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">5</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">6</div>
-	<div class="line">7</div>
-	<div class="line">8</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">9</div>
-	<div class="line">Completed</div>
-</div>
-
-Finally, if we change the `skip` parameter to 5 (a value greater than the count of 3), we can see that two values are lost between each buffer.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
-	source.Buffer(3, 5)
-		...
-
-Output
-
-<div class="output">
-	<div class="line">--Buffered values</div>
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">--Buffered values</div>
-	<div class="line">5</div>
-	<div class="line">6</div>
-	<div class="line">7</div>
-	<div class="line">Completed</div>
-</div>
-
-####Overlapping buffers by time			{#OverlappingBuffersByTime}
-
-You can, of course, apply the same three behaviors with buffers defined by time instead of count.
-
-	public static IObservable<IList<TSource>> Buffer<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		TimeSpan timeShift)
-	{...}
-
-To exactly replicate the output from our [Overlapping Buffers By Count[(#OverlappingBuffersByCount) examples, we only need to provide the following arguments:
-
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
-	var overlapped = source.Buffer(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1));
-	var standard = source.Buffer(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(3));
-	var skipped = source.Buffer(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(5));
-
-As our source produces values consistently every second, we can use the same values from our count example but as seconds.
-
-##Delay								{#Delay}
-
-The `Delay` extension method is a purely a way to time-shift an entire sequence.
-You can provide either a relative time the sequence should be delayed by using a `TimeSpan`, or an absolute point in time that the sequence should wait for using a `DateTimeOffset`. 
-The relative time intervals between the values are preserved.
-
-	// Time-shifts the observable sequence by a relative time.
-	public static IObservable<TSource> Delay<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime)
-	{...}
-
-	// Time-shifts the observable sequence by a relative time.
-	public static IObservable<TSource> Delay<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime, 
-		IScheduler scheduler)
-	{...}
-
-	// Time-shifts the observable sequence by an absolute time.
-	public static IObservable<TSource> Delay<TSource>(
-		this IObservable<TSource> source, 
-		DateTimeOffset dueTime)
-	{...}
-
-	// Time-shifts the observable sequence by an absolute time.
-	public static IObservable<TSource> Delay<TSource>(
-		this IObservable<TSource> source, 
-		DateTimeOffset dueTime, 
-		IScheduler scheduler)
-	{...}
-
-To show the `Delay` method in action, we create a sequence of values one second apart and timestamp them. 
-This will show that it is not the subscription that is being delayed, but the actual forwarding of the notifications to our final subscriber.
-
-	var source = Observable.Interval(TimeSpan.FromSeconds(1))
-		.Take(5)
-		.Timestamp();
-
-	var delay = source.Delay(TimeSpan.FromSeconds(2));
-
-	source.Subscribe(
-		value => Console.WriteLine("source : {0}", value),
-		() => Console.WriteLine("source Completed"));
-	delay.Subscribe(
-		value => Console.WriteLine("delay : {0}", value),
-		() => Console.WriteLine("delay Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">source : 0@01/01/2012 12:00:00 pm +00:00</div>
-	<div class="line">source : 1@01/01/2012 12:00:01 pm +00:00</div>
-	<div class="line">source : 2@01/01/2012 12:00:02 pm +00:00</div>
-	<div class="line">delay : 0@01/01/2012 12:00:00 pm +00:00</div>
-	<div class="line">source : 3@01/01/2012 12:00:03 pm +00:00</div>
-	<div class="line">delay : 1@01/01/2012 12:00:01 pm +00:00</div>
-	<div class="line">source : 4@01/01/2012 12:00:04 pm +00:00</div>
-	<div class="line">source Completed</div>
-	<div class="line">delay : 2@01/01/2012 12:00:02 pm +00:00</div>
-	<div class="line">delay : 3@01/01/2012 12:00:03 pm +00:00</div>
-	<div class="line">delay : 4@01/01/2012 12:00:04 pm +00:00</div>
-	<div class="line">delay Completed</div>
-</div>
-
-It is worth noting that `Delay` will not time-shift `OnError` notifications.
-These will be propagated immediately.
-
-##Sample				{#Sample}
-
-The `Sample` method simply takes the last value for every specified `TimeSpan`.
-This is great for getting timely data from a sequence that produces too much information for your requirements. 
-This example shows sample in action.
-
-	var interval = Observable.Interval(TimeSpan.FromMilliseconds(150));
-	interval.Sample(TimeSpan.FromSeconds(1))
-			.Subscribe(Console.WriteLine);
-
-Output:
-
-<div class="output">
-	<div class="line">5</div>
-	<div class="line">12</div>
-	<div class="line">18</div>
-</div>
-
-This output is interesting and this is the reason why I choose the value of 150ms.
-If we plot the underlying sequence of values against the time they are produced, we can see that `Sample` is taking the last value it received for each period of one second.
-
-<table style="font-size: 11px; font-family: Segoe UI; text-align: right">
-	<tr>
-		<th>
-			Relative time (ms)
-		</th>
-		<th>
-			Source value
-		</th>
-		<th>
-			Sampled value
-		</th>
-	</tr>
-	<tr>
-		<td>
-			0
-		</td>
-		<td width="74" style='width: 80px'>
-		</td>
-		<td width="74" style='width: 80px'>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			50
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			100
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			150
-		</td>
-		<td>
-			0
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			200
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			250
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			300
-		</td>
-		<td>
-			1
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			350
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			400
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			450
-		</td>
-		<td>
-			2
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			500
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			550
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			600
-		</td>
-		<td>
-			3
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			650
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			700
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			750
-		</td>
-		<td>
-			4
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			800
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			850
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			900
-		</td>
-		<td>
-			5
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			950
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1000
-		</td>
-		<td>
-		</td>
-		<td>
-			5
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1050
-		</td>
-		<td>
-			6
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1100
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1150
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1200
-		</td>
-		<td>
-			7
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1250
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1300
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1350
-		</td>
-		<td>
-			8
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1400
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1450
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1500
-		</td>
-		<td>
-			9
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1550
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1600
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1650
-		</td>
-		<td>
-			10
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1700
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1750
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1800
-		</td>
-		<td>
-			11
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1850
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1900
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			1950
-		</td>
-		<td>
-			12
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2000
-		</td>
-		<td>
-		</td>
-		<td>
-			12
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2050
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2100
-		</td>
-		<td>
-			13
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2150
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2200
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2250
-		</td>
-		<td>
-			14
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2300
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2350
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2400
-		</td>
-		<td>
-			15
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2450
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2500
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2550
-		</td>
-		<td>
-			16
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2600
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2650
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2700
-		</td>
-		<td>
-			17
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2750
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2800
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2850
-		</td>
-		<td>
-			18
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2900
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			2950
-		</td>
-		<td>
-		</td>
-		<td>
-		</td>
-	</tr>
-	<tr>
-		<td>
-			3000
-		</td>
-		<td>
-			19
-		</td>
-		<td>
-			19
-		</td>
-	</tr>
-</table>
-
-##Throttle							{#Throttle}
-
-The `Throttle` extension method provides a sort of protection against sequences that produce values at variable rates and sometimes too quickly. 
-Like the `Sample` method, `Throttle` will return the last sampled value for a period of time.
-Unlike `Sample` though, `Throttle`'s period is a sliding window. 
-Each time `Throttle` receives a value, the window is reset. 
-Only once the period of time has elapsed will the last value be propagated. 
-This means that the `Throttle` method is only useful for sequences that produce values at a variable rate. 
-Sequences that produce values at a constant rate (like `Interval` or `Timer`) either would have all of their values suppressed if they produced values faster than the throttle period, or all of their values would be propagated if they produced values slower than the throttle period.
-
-	// Ignores values from an observable sequence which are followed by another value before
-	//  dueTime.
-	public static IObservable<TSource> Throttle<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime)
-	{...}
-	public static IObservable<TSource> Throttle<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime, 
-		IScheduler scheduler)
-	{...}
-
-A great application of the `Throttle` method would be to use it with a live search like "Google Suggest". 
-While the user is still typing we can hold off on the search. 
-Once there is a pause for a given period, we can execute the search with what they have typed. 
-The Rx team has a great example of this scenario in the [Rx Hands On Lab](http://download.microsoft.com/download/C/5/D/C5D669F9-01DF-4FAF-BBA9-29C096C462DB/Rx%20HOL%20.NET.pdf "Rx Hands On Lab as PDF - Mcrosoft.com").
-
-
-##Timeout					{#Timeout}
-
-We have considered handling timeout exceptions previously in the chapter on [Flow control](11_AdvancedErrorHandling.html#CatchSwallowingException). 
-The `Timeout` extension method allows us terminate the sequence with an error if we do not receive any notifications for a given period.
-We can either specify the period as a sliding window with a `TimeSpan`, or as an absolute time that the sequence must complete by providing a `DateTimeOffset`.
-
-	// Returns either the observable sequence or a TimeoutException if the maximum duration
-	//  between values elapses.
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime)
-	{...}
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime, 
-		IScheduler scheduler)
-	{...}
-
-	// Returns either the observable sequence or a TimeoutException if dueTime elapses.
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		DateTimeOffset dueTime)
-	{...}
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		DateTimeOffset dueTime, 
-		IScheduler scheduler)
-	{...}
-
-If we provide a `TimeSpan` and no values are produced within that time span, then the sequence fails with a `TimeoutException`.
-
-	var source = Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(10)
-		.Concat(Observable.Interval(TimeSpan.FromSeconds(2)));
-
-	var timeout = source.Timeout(TimeSpan.FromSeconds(1));
-	timeout.Subscribe(
-		Console.WriteLine, 
-		Console.WriteLine, 
-		() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">3</div>
-	<div class="line">4</div>
-	<div class="line">System.TimeoutException: The operation has timed out.</div>
-</div>
-
-Like the `Throttle` method, this overload is only useful for sequences that produce values at a variable rate.
-
-The alternative use of `Timeout` is to set an absolute time; the sequence must be completed by then.
-
-	var dueDate = DateTimeOffset.UtcNow.AddSeconds(4);
-	var source = Observable.Interval(TimeSpan.FromSeconds(1));
-	var timeout = source.Timeout(dueDate);
-	timeout.Subscribe(
-		Console.WriteLine, 
-		Console.WriteLine, 
-		() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-	<div class="line">0</div>
-	<div class="line">1</div>
-	<div class="line">2</div>
-	<div class="line">System.TimeoutException: The operation has timed out.</div>
-</div>
-
-Perhaps an even more interesting usage of the `Timeout` method is to substitute in an alternative sequence when a timeout occurs. 
-The `Timeout` method has overloads the provide the option of specifying a continuation sequence to use if a timeout occurs. 
-This functionality behaves much like the [Catch](11_AdvancedErrorHandling.html#Catch) operator. 
-It is easy to imagine that the simple overloads actually just call through to these over loads and specify an `Observable.Throw<TimeoutException>` as the continuation sequence.
-
-	// Returns the source observable sequence or the other observable sequence if the maximum 
-	//  duration between values elapses.
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime, 
-		IObservable<TSource> other)
-	{...}
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan dueTime, 
-		IObservable<TSource> other, 
-		IScheduler scheduler)
-	{...}
-
-	// Returns the source observable sequence or the other observable sequence if dueTime 
-	//  elapses.
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		DateTimeOffset dueTime, 
-		IObservable<TSource> other)
-	{...}  
-	public static IObservable<TSource> Timeout<TSource>(
-		this IObservable<TSource> source, 
-		DateTimeOffset dueTime, 
-		IObservable<TSource> other, 
-		IScheduler scheduler)
-	{...}
-
-<!--
-	TODO: Observable.GroupByUntil
-	TODO: Observable.Merge reprise(has options to take schedulers too)
--->
-
-Rx provides features to tame the unpredictable element of time in a reactive paradigm.
-Data can be buffered, throttled, sampled or delayed to meet your needs. 
-Entire sequences can be shifted in time with the delay feature, and timeliness of data can be asserted with the `Timeout` operator. 
-These simple yet powerful features further extend the developer's tool belt for querying data in motion.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 210 - 0
Rx.NET/Documentation/IntroToRx/14_ErrorHandlingOperators.md

@@ -0,0 +1,210 @@
+# Error Handling Operators
+
+Exceptions happen. Some exceptions are inherently avoidable, occurring only because of bugs in our code. For example, if we put the CLR into a situation where it has to raise a `DivideByZeroException`, we've done something wrong. But there are plenty of exceptions that cannot be prevented with defensive coding. For example, exceptions relating to I/O or networking failures such as like `FileNotFoundException` or `TimeoutException` can be caused by environmental factors outside of our code's control. In these cases, we need to handle the exception gracefully. The kind of handling will depend on the context. It might be appropriate to provide some sort of error message to the user; in some scenarios logging the error might be a more appropriate response. If the failure is likely to be transient, we could try to recover by retrying the operation that failed.
+
+The `IObserver<T>` interface defines the `OnError` method so that a source can report an error, but since this terminates the sequence, it provides no direct means of working out what to do next. However, Rx provides operators that provide a variety of error handling mechanisms.
+
+## Catch
+
+Rx defines a `Catch` operator. The name is deliberately reminiscent of C#'s `try`/`catch` syntax because it lets you handle errors from an Rx source in a similar way to exceptions that emerge from normal execution of code. It can work in two different ways. You can just supply a function to which Rx will pass the error, and this function can return an `IObservable<T>`, and `Catch` will now forward items from that instead of the original source. Or, instead of passing a function, you can just supply one or more additional sequences, and catch will move onto the next each time the current one fails.
+
+### Examining the exception
+
+`Catch` has an overload that enables you provide a handler to be invoked if the source produces an error:
+
+```csharp
+public static IObservable<TSource> Catch<TSource, TException>(
+    this IObservable<TSource> source, 
+    Func<TException, IObservable<TSource>> handler) 
+    where TException : Exception
+```
+
+This is conceptually very similar to a C# `catch` block: we can write code that looks at the exception and then decides how to proceed. And as with a `catch` block we can decide which kinds of exceptions we are interested in. For example, we might know that the source will sometimes produce a `TimeoutException`, and we might just want to return an empty sequence in that case, instead of an error:
+
+```csharp
+IObservable<int> result = source.Catch<int, TimeoutException>(_ => Observable.Empty<int>());
+```
+
+`Catch` will only invoke our function if the exception is of the type specified (or a type derived from that). If the sequence was to terminate with an `Exception` that could not be cast to a `TimeoutException`, then the error would not be caught and would flow through to the subscriber.
+
+This example returns `Observable.Empty<int>()`. This is conceptually similar to 'swallowing' an exception in C#, i.e., choosing to take no action. This can be a reasonable response to an exception that you anticipate, but it is generally a bad idea to do this with the base `Exception` type.
+
+This last example ignored its input, because it was interested only in the exception type. However, we are free to examine the exception, and make more fine-grained decisions about what should emerge from the `Catch`:
+
+```csharp
+IObservable<string> result = source.Catch(
+    (FileNotFoundException x) => x.FileName == "settings.txt"
+        ? Observable.Return(DefaultSettings) : Observable.Throw<string>(x));
+```
+
+This provides special handling for one particular file, but otherwise rethrows the exception. Returning `Observable.Throw<T>(x)` here (where `x` is the original exception) is conceptually similar to writing `throw` in a catch block. (In C# there's an important distinction between `throw;` and `throw x;` because it changes how exception context is captured, but in Rx, `OnError` doesn't capture a stack trace, so there's no equivalent distinction.)
+
+You're also free to throw a completely different exception, of course. You can return any `IObservable<T>` you like, as long as its element type is the same as the source's.
+
+### Fallback
+
+The other overloads of `Catch` offer less discriminating behaviour: you can supply one or more additional sequences, and any time the current source fails, the exception will be ignored, and `Catch` will simply move onto the next sequence. Since you will never get to know what the exception is, this mechanism gives you no way of knowing whether the exception that occurred was one you anticipated, or a completely unexpected one, so you will normally want to avoid this form. But for completeness, here's how to use it:
+
+```csharp
+IObservable<string> settings = settingsSource1.Catch(settingsSource2);
+```
+
+That form provides just a single fallback. There's also a static `Observable.Catch` method that takes a `params` array, so you can pass any number of sources. This is exactly equivalent to the preceding example:
+
+```csharp
+IObservable<string> settings = Observable.Catch(settingsSource1, settingsSource2);
+```
+
+There's also an overload that accepts an `IEnumerable<IObservable<T>>`.
+
+If any of the sources reaches its end without reporting an exception, `Catch` also immediately reports completion and does not subscribe to any of the subsequent sources. If the very last source reports an exception, `Catch` will have no further sources to fall back on, so in that case it won't catch the exception. It will forward that final exception to its subscriber.
+
+## Finally
+
+Similar to a `finally` block in C#, Rx enables us to execute some code on completion of a sequence, regardless of whether it runs to completion naturally or fails. Rx adds a third mode of completion that has no exact equivalent in `catch`/`finally`: the subscriber might unsubscribe before the source has a chance to complete. (This is conceptually similar to using `break` to terminate a `foreach` early.) The `Finally` extension method accepts an `Action` as a parameter. This `Action` will be invoked when the sequence terminates, regardless of whether `OnCompleted` or `OnError` was called. It will also invoke the action if the subscription is disposed of before it completes.
+
+```csharp
+public static IObservable<TSource> Finally<TSource>(
+    this IObservable<TSource> source, 
+    Action finallyAction)
+{
+    ...
+}
+```
+
+In this example, we have a sequence that completes. We provide an action and see that it is called after our `OnCompleted` handler.
+
+```csharp
+var source = new Subject<int>();
+IObservable<int> result = source.Finally(() => Console.WriteLine("Finally action ran"));
+result.Dump("Finally");
+source.OnNext(1);
+source.OnNext(2);
+source.OnNext(3);
+source.OnCompleted();
+```
+
+Output:
+
+```
+Finally-->1
+Finally-->2
+Finally-->3
+Finally completed
+Finally action ran
+```
+
+The source sequence could also have terminated with an exception. In that case, the exception would have been sent to the subscriber's `OnError` (and we'd have seen that in the console output), and then the delegate we provided to `Finally` would have been executed.
+
+Alternatively, we could have disposed of our subscription. In the next example, we see that the `Finally` action is invoked even though the sequence does not complete.
+
+```csharp
+var source = new Subject<int>();
+var result = source.Finally(() => Console.WriteLine("Finally"));
+var subscription = result.Subscribe(
+    Console.WriteLine,
+    Console.WriteLine,
+    () => Console.WriteLine("Completed"));
+source.OnNext(1);
+source.OnNext(2);
+source.OnNext(3);
+subscription.Dispose();
+```
+
+Output:
+
+```
+1
+2
+3
+Finally
+```
+
+Note that if the subscriber's `OnError` throws an exception, and if the source calls `OnNext` without a `try`/`catch` block, the CLR's unhandled exception reporting mechanism kicks in, and in some circumstances this can result in the application shutting down before the `Finally` operator has had an opportunity to invoke the callback. We can create this scenario with the following code:
+
+```csharp
+var source = new Subject<int>();
+var result = source.Finally(() => Console.WriteLine("Finally"));
+result.Subscribe(
+    Console.WriteLine,
+    // Console.WriteLine,
+    () => Console.WriteLine("Completed"));
+source.OnNext(1);
+source.OnNext(2);
+source.OnNext(3);
+
+// Brings the app down. Finally action might not be called.
+source.OnError(new Exception("Fail"));
+```
+
+If you run this directly from the program's entry point, without wrapping it in a `try`/`catch`, you may or may not see the `Finally` message displayed, because exception handling works subtly differently in the case an exception reaches all the way to the top of the stack without being caught. (Oddly, it usually does run, but if you have a debugger attached, the program usually exits without running the `Finally` callback.)
+
+This is mostly just a curiosity: application frameworks such as ASP.NET Core or WPF typically install their own top-of-stack exception handlers, and in any case you shouldn't be subscribing to a source that you know will call `OnError` without supplying an error callback. This problem only emerges because the delegate-based `Subscribe` overload in use here supplies an `IObserver<T>` implementation that throws in its `OnError`. However, if you're building console applications to experiment with Rx's behaviour you are quite likely to run into this. In practice, `Finally` will do the right thing in more normal situations. (But in any case, you shouldn't throw exceptions from an `OnError` handler.)
+
+## Using
+
+The `Using` factory method allows you to bind the lifetime of a resource to the lifetime of an observable sequence. The method takes two callbacks: one to create the disposable resource and one to provide the sequence. This allows everything to be lazily evaluated. These callbacks are invoked when code calls `Subscribe` on the `IObservable<T>` that this method returns.
+
+```csharp
+public static IObservable<TSource> Using<TSource, TResource>(
+    Func<TResource> resourceFactory, 
+    Func<TResource, IObservable<TSource>> observableFactory) 
+    where TResource : IDisposable
+{
+    ...
+}
+```
+
+The resource will be disposed of when the sequence terminates either with `OnCompleted` or `OnError`, or when the subscription is disposed.
+
+## OnErrorResumeNext
+
+Just the title of this section will send a shudder down the spines of old VB developers! (For those not familiar with this murky language feature, the VB language lets you instruct it to ignore any errors that occur during execution, and to just continue with the next statement after any failure.) In Rx, there is an extension method called `OnErrorResumeNext` that has similar semantics to the VB keywords/statement that share the same name. This extension method allows the continuation of a sequence with another sequence regardless of whether the first sequence completes gracefully or due to an error.
+
+This is very similar to the second form of `Catch` (as described in [Fallback](#fallback)). The difference is that with `Catch`, if any source sequence reaches its end without reporting an error, `Catch` will not move onto the next sequence. `OnErrorResumeNext` will forward all elements produced by all of its inputs, so it is similar to [`Concat`](09_CombiningSequences.md#concat), it just ignores all errors.
+
+Just as the `OnErrorResumeNext` keyword was best avoided for anything other than throwaway code in VB, so should it be used with caution in Rx. It will swallow exceptions quietly and can leave your program in an unknown state. Generally, this will make your code harder to maintain and debug. (The same applies for the fallback forms of `Catch`.)
+
+## Retry
+
+If you are expecting your sequence to encounter predictable failures, you might simply want to retry. For example, if you are running in a cloud environment, it's very common for operations to fail occasionally for no obvious reason. Cloud platforms often relocate services on a fairly regular basis for operational reasons, which means it's not unusual for operations to fail—you might make a request to a service just before the cloud provider decided to move that service to a different compute node—but for the exact same operation to succeed if you immediately retry it (because the retried request gets routed to the new node). Rx's `Retry` extension method offers the ability to retry on failure a specified number of times or until it succeeds. This works by resubscribing to the source if it reports an error.
+
+This example uses the simple overload, which will always retry on any exception.
+
+```csharp
+public static void RetrySample<T>(IObservable<T> source)
+{
+    source.Retry().Subscribe(t => Console.WriteLine(t)); // Will always retry
+    Console.ReadKey();
+}
+```
+
+Given a source that produces the values 0, 1, and 2, and then calls `OnError`, the output would be the numbers 0, 1, 2 repeating over an over endlessly. This output would continue forever because this example never unsubscribes, and `Retry` will retry forever if you don't tell it otherwise.
+
+We can specify the maximum number of retries. In this next example, we only retry once, therefore the error that gets published on the second subscription will be passed up to the final subscription. Note that we tell `Retry` the maximum number of attempts, so if we want it to retry once, you pass a value of 2—that's the initial attempt plus one retry.
+
+```csharp
+source.Retry(2).Dump("Retry(2)"); 
+```
+
+Output:
+
+```
+Retry(2)-->0
+Retry(2)-->1
+Retry(2)-->2
+Retry(2)-->0
+Retry(2)-->1
+Retry(2)-->2
+Retry(2) failed-->Test Exception
+```
+
+Proper care should be taken when using the infinite repeat overload. Obviously if there is a persistent problem with your underlying sequence, you may find yourself stuck in an infinite loop. Also, take note that there is no overload that allows you to specify the type of exception to retry on.
+
+Rx also offers a `RetryWhen` method. This is similar to the first `Catch` overload we looked at: instead of handling all exceptions indiscriminately, it lets you supply code that can decide what to do. It works slightly differently: instead of invoking this callback once per error, it invokes it once passing in an `IObservable<Exception>` through which it will supply all of the exceptions, and the callback returns an `IObservable<T>` referred to as the _signal_ observable. The `T` can be anything, because the values this observable may return will be ignored: all that matters is which of the three `IObserver<T>` methods is invoked.
+
+If, when receiving an exception, the signal observable calls `OnError`, `RetryWhen` will not retry, and will report that same error to its subscribers. If on the other hand the signal observable calls `OnCompleted`, again `RetryWhen` will not retry, and will complete without reporting an error. But if the signal observable calls `OnNext`, this causes `RetryWhen` to retry by resubscribing to the source.
+
+<!--TODO: Build BackOffRetry with the reader-->
+
+Applications often need exception management logic that goes beyond simple `OnError` handlers. Rx delivers exception handling operators similar to those we are used to in C#, which you can use to compose complex and robust queries. In this chapter we have covered advanced error handling and some more resource management features from Rx.

+ 0 - 510
Rx.NET/Documentation/IntroToRx/14_HotAndColdObservables.md

@@ -1,510 +0,0 @@
----
-title : Hot and Cold observables
----
-
-<!--TODO: Observable.Synchronize (vNext? Say it is not intro material?)-->
-<!--TODO: Observable.Defer - Make cold (vNext? Say it is not intro material?)-->
-
-#Hot and Cold observables			{#HotAndCold}
-
-In this chapter, we will look at how to describe and handle two styles of observable sequences:
-
- 1. Sequences that are passive and start producing notifications on request (when subscribed to), and
- 2. Sequences that are active and produce notifications regardless of subscriptions.
-
-In this sense, passive sequences are `Cold` and active are described as being `Hot`. 
-You can draw some similarities between implementations of the `IObservable<T>` interface and implementations of the `IEnumerable<T>`interface with regards to hot and cold. 
-With `IEnumerable<T>`, you could have an on-demand collection via the yield return syntax, or you could have an eagerly-evaluated collection by returning a populated `List<T>`.
-We can compare the two styles by attempting to read just the first value from a sequence. 
-We can do this with a method like this:
-
-	public void ReadFirstValue(IEnumerable<int> list)
-	{
-		foreach (var i in list)
-		{
-			Console.WriteLine("Read out first value of {0}", i);
-			break;
-		}
-	}
-
-As an alternative to the `break` statement, we could apply a `Take(1)` to the `list`. 
-If we then apply this to an eagerly-evaluated sequence, such as a list, we see the entire list is first constructed, and then returned.
-
-	public static void Main()
-	{
-		ReadFirstValue(EagerEvaluation());
-	}
-	public IEnumerable<int> EagerEvaluation()
-	{
-		var result = new List<int>();
-		Console.WriteLine("About to return 1");
-		result.Add(1);
-		//code below is executed but not used.
-		Console.WriteLine("About to return 2");
-		result.Add(2);
-		return result;
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">About to return 1</div>
-	<div class="line">About to return 2</div>
-	<div class="line">Read out first value of 1</div>
-</div>
-
-We now apply the same code to a lazily-evaluated sequence.
-
-	public IEnumerable<int> LazyEvaluation()
-	{
-		Console.WriteLine("About to return 1");
-		yield return 1;
-		//Execution stops here in this example
-		Console.WriteLine("About to return 2");
-		yield return 2;
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">About to return 1</div>
-	<div class="line">Read out first value of 1</div>
-</div>
-
-The lazily-evaluated sequence did not have to yield any more values than required.
-Lazy evaluation is good for on-demand queries whereas eager evaluation is good for sharing sequences so as to avoid re-evaluating multiple times. 
-Implementations of `IObservable<T>` can exhibit similar variations in style.
-
-Examples of hot observables that could publish regardless of whether there are any subscribers would be:
-
- * mouse movements 
- * timer events 
- * broadcasts like ESB channels or UDP network packets. 
- * price ticks from a trading exchange 
-
-ome examples of cold observables would be:
-
- * asynchronous request (e.g. when using `Observable.FromAsyncPattern`)
- * whenever `Observable.Create` is used
- * subscriptions to queues 
- * on-demand sequences
-
-##Cold observables					{#ColdObservables}
-
-In this example, we fetch a list of products from a database. 
-In our implementation, we choose to return an `IObservable<string>` and, as we get the results, we publish them until we have the full list, then complete the sequence.
-
-	private const string connectionString = @"Data Source=.\SQLSERVER;"+
-		@"Initial Catalog=AdventureWorksLT2008;Integrated Security=SSPI;"
-	private static IObservable<string> GetProducts()
-	{
-		return Observable.Create<string>(
-		o =>
-		{
-			using(var conn = new SqlConnection(connectionString))
-			using (var cmd = new SqlCommand("Select Name FROM SalesLT.ProductModel", conn))
-			{
-				conn.Open();
-				SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
-				while (reader.Read())
-				{
-					o.OnNext(reader.GetString(0));
-				}
-				o.OnCompleted();
-				return Disposable.Create(()=>Console.WriteLine("--Disposed--"));
-			}
-		});
-	}
-
-This code is just like many existing data access layers that return an `IEnumerable<T>`, however it would be much easier with Rx to access this in an asynchronous manner (using [SubscribeOn and ObserveOn](15_SchedulingAndThreading.html#SubscribeOnObserveOn)). 
-This example of a data access layer is lazily evaluated and provides no caching. 
-Each time the method is used, we reconnect to the database.
-This is typical of cold observables; calling the method does nothing. 
-Subscribing to the returned `IObservable<T>` will however invoke the create delegate which connects to the database.
-
-Here we have a consumer of our above code, but it explicitly only wants up to three values (the full set has 128 values). 
-This code illustrates that the `Take(3)` expression will restrict what the consumer receives but `GetProducts()` method will still publish _all_ of the values.
-
-	public void ColdSample()
-	{
-		var products = GetProducts().Take(3);
-		products.Subscribe(Console.WriteLine);
-		Console.ReadLine();
-	}
-
-The `GetProducts()` code above is a pretty naive example, as it lacks the ability to cancel at any time. 
-This means all values are read even though only three were requested.
-In the later chapter on [scheduling](15_SchedulingAndThreading.html), we cover examples on how to provide cancellation correctly.
-
-##Hot observables					{#HotObservables}
-
-In our example above, the database was not accessed until the consumer of the `GetProducts()` method subscribed to the return value. 
-Subsequent or even parallel calls to `GetProducts()` would return independent observable sequences and would each make their own independent calls to the database. 
-By contrast, a hot observable is an observable sequence that is producing notifications even if there are no subscribers. 
-The classic cases of hot observables are UI Events and Subjects. 
-For example, if the mouse moves then the `MouseMove` event will be raised. 
-If there are no event handlers registered for the event, then nothing happens. 
-If, on the other hand, we create a `Subject<int>`, we can inject values into it using `OnNext`, regardless of whether there are observers subscribed to the subject or not.
-
-Some observable sequences can appear to be hot when they are in fact cold. 
-A couple of examples that surprise many is `Observable.Interval` and `Observable.Timer` (though it should not come as a shock to attentive readers of the [Creating observable sequences](04_CreatingObservableSequences.html#Unfold) chapter). 
-In the example below, we subscribe twice to the same instance, created via the `Interval` factory method. 
-The delay between the two subscriptions should demonstrate that while they are subscribed to the same observable instance, the values each subscription receives are independent, i.e. `Interval` is cold.
-
-	public void SimpleColdSample()
-	{
-		var period = TimeSpan.FromSeconds(1);
-		var observable = Observable.Interval(period);
-		observable.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
-		Thread.Sleep(period);
-		observable.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
-		Console.ReadKey();
-		/* Output: 
-		first subscription : 0 
-		first subscription : 1 
-		second subscription : 0 
-		first subscription : 2 
-		second subscription : 1 
-		first subscription : 3 
-		second subscription : 2 
-		*/ 
-	}
-
-##Publish and Connect				{#PublishAndConnect}
-
-If we want to be able to share the actual data values and not just the observable instance, we can use the `Publish()` extension method. 
-This will return an `IConnectableObservable<T>`, which extends `IObservable<T>` by adding a single `Connect()` method. 
-By using the `Publish()` then `Connect()` method, we can get this sharing functionality.
-
-	var period = TimeSpan.FromSeconds(1);
-	var observable = Observable.Interval(period).Publish();
-	observable.Connect();
-	observable.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
-	Thread.Sleep(period);
-	observable.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
-
-Output:
-
-<div class="output">
-	<div class="line">first subscription : 0 </div>
-	<div class="line">first subscription : 1 </div>
-	<div class="line">second subscription : 1 </div>
-	<div class="line">first subscription : 2 </div>
-	<div class="line">second subscription : 2 </div>
-</div>
-
-In the example above, the `observable` variable is an `IConnectableObservable<T>`, and by calling `Connect()` it will subscribe to the underlying (the `Observable.Interval`).
-In this case, we are quick enough to subscribe before the first item is published, but only on the first subscription. 
-The second subscription subscribes late and misses the first publication. 
-We could move the invocation of the `Connect()` method until after all subscriptions have been made. 
-That way, even with the call to `Thread.Sleep` we will not really subscribe to the underlying until after both subscriptions are made. 
-This would be done as follows:
-
-	var period = TimeSpan.FromSeconds(1);
-	var observable = Observable.Interval(period).Publish();
-	observable.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
-	Thread.Sleep(period);
-	observable.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
-	observable.Connect();
-
-<div class="output">
-	<div class="line">first subscription : 0 </div>
-	<div class="line">second subscription : 0 </div>
-	<div class="line">first subscription : 1 </div>
-	<div class="line">second subscription : 1 </div>
-	<div class="line">first subscription : 2 </div>
-	<div class="line">second subscription : 2 </div>
-</div>
-
-As you can imagine, this is quite useful whenever an application needs to share sequences of data. 
-In a financial trading application, if you wanted to consume a price stream for a certain asset in more than one place, you would want to try to reuse a single, common stream and avoid making another subscription to the server providing that data. 
-In a social media application, many widgets may need to be notified whenever someone connects. 
-`Publish` and `Connect` are perfect solutions for this.
-
-###Disposal of connections and subscriptions	{#Disposal}
-
-A point of interest is how disposal is performed. 
-Indeed, we have not covered yet the fact that `Connect` returns an `IDisposable`. 
-By disposing of the 'connection', you can turn the sequence on and off (`Connect()` to toggle it on, disposing toggles it off). 
-In this example, we see that the sequence can be connected and disconnected multiple times.
-
-	var period = TimeSpan.FromSeconds(1);
-	var observable = Observable.Interval(period).Publish();
-	observable.Subscribe(i => Console.WriteLine("subscription : {0}", i));
-	var exit = false;
-	while (!exit)
-	{
-		Console.WriteLine("Press enter to connect, esc to exit.");
-		var key = Console.ReadKey(true);
-		if(key.Key== ConsoleKey.Enter)
-		{
-			var connection = observable.Connect(); //--Connects here--
-			Console.WriteLine("Press any key to dispose of connection.");
-			Console.ReadKey();
-			connection.Dispose(); //--Disconnects here--
-		}
-		if(key.Key==ConsoleKey.Escape)
-		{
-			exit = true;
-		}
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Press enter to connect, esc to exit. </div>
-	<div class="line">Press any key to dispose of connection. </div>
-	<div class="line">subscription : 0 </div>
-	<div class="line">subscription : 1 </div>
-	<div class="line">subscription : 2 </div>
-	<div class="line">Press enter to connect, esc to exit. </div>
-	<div class="line">Press any key to dispose of connection. </div>
-	<div class="line">subscription : 0 </div>
-	<div class="line">subscription : 1 </div>
-	<div class="line">subscription : 2 </div>
-	<div class="line">Press enter to connect, esc to exit. </div>
-</div>
-
-Let us finally consider automatic disposal of a connection. 
-We want a single sequence to be shared between subscriptions, as per the price stream example mentioned above.
-We also want to only have the sequence running hot if there are any subscribers.
-It seems therefore, not only obvious that there should be a mechanism for automatically connecting (once a subscription has been made), but also a mechanism for disconnecting (once there are no more subscriptions) from a sequence. 
-First let us look at what happens to a sequence when we connect with no subscribers, and then later unsubscribe:
-
-	var period = TimeSpan.FromSeconds(1);
-	var observable = Observable.Interval(period)
-		.Do(l => Console.WriteLine("Publishing {0}", l)) //Side effect to show it is running
-		.Publish();
-	observable.Connect();
-	Console.WriteLine("Press any key to subscribe");
-	Console.ReadKey();
-	var subscription = observable.Subscribe(i => Console.WriteLine("subscription : {0}", i));
-	Console.WriteLine("Press any key to unsubscribe.");
-	Console.ReadKey();
-	subscription.Dispose();
-	Console.WriteLine("Press any key to exit.");
-	Console.ReadKey();
-
-Output:
-
-<div class="output">
-	<div class="line">Press any key to subscribe </div>
-	<div class="line">Publishing 0 </div>
-	<div class="line">Publishing 1 </div>
-	<div class="line">Press any key to unsubscribe. </div>
-	<div class="line">Publishing 2 </div>
-	<div class="line">subscription : 2 </div>
-	<div class="line">Publishing 3 </div>
-	<div class="line">subscription : 3 </div>
-	<div class="line">Press any key to exit. </div>
-	<div class="line">Publishing 4 </div>
-	<div class="line">Publishing 5 </div>
-</div>
-
-A few things to note here:
-
- 1. I use the `Do` extension method to create side effects on the sequence (i.e. write to the console). 
-This allows us to see when the sequence is actually connected.
- 2. We connect first and then subscribe, which means that we can publish without any live subscriptions i.e. make the sequence hot. 
- 3. We dispose of our subscription but do not dispose of the connection, which means the sequence will still be running. 
-
-###RefCount					{#RefCount}
-
-Let us modify that last example by replacing uses of `Connnect()` by the extension method `RefCount`. 
-This will "magically" implement our requirements for automatic disposal and lazy connection. 
-`RefCount` will take an `IConnectableObservable<T>` and turn it back into an `IObservable<T>` while automatically implementing the "connect" and "disconnect" behavior we are looking for.
-
-	var period = TimeSpan.FromSeconds(1);
-	var observable = Observable.Interval(period)
-		.Do(l => Console.WriteLine("Publishing {0}", l)) //side effect to show it is running
-		.Publish()
-		.RefCount();
-	//observable.Connect(); Use RefCount instead now 
-	Console.WriteLine("Press any key to subscribe");
-	Console.ReadKey();
-	var subscription = observable.Subscribe(i => Console.WriteLine("subscription : {0}", i));
-	Console.WriteLine("Press any key to unsubscribe.");
-	Console.ReadKey();
-	subscription.Dispose();
-	Console.WriteLine("Press any key to exit.");
-	Console.ReadKey();
-
-Output:
-
-<div class="output">
-	<div class="line">Press any key to subscribe </div>
-	<div class="line">Press any key to unsubscribe. </div>
-	<div class="line">Publishing 0 </div>
-	<div class="line">subscription : 0 </div>
-	<div class="line">Publishing 1 </div>
-	<div class="line">subscription : 1 </div>
-	<div class="line">Publishing 2 </div>
-	<div class="line">subscription : 2 </div>
-	<div class="line">Press any key to exit. </div>
-</div>
-
-The `Publish`/`RefCount` pair is extremely useful for taking a cold observable and sharing it as a hot observable sequence for subsequent observers.
-`RefCount()` also allows us to avoid a race condition. 
-In the example above, we subscribed to the sequence before a connection was established. 
-This is not always possible, especially if we are exposing the sequence from a method. 
-By using the `RefCount` method we can mitigate the subscribe/connect race condition because of the auto-connect behavior.
-
-##Other connectable observables			{#OtherConnectables}
-
-The `Connect` method is not the only method that returns `IConnectableObservable<T>` instances. 
-The ability to connect or defer an operator's functionality is useful in other areas too.
-
-###PublishLast 						{#PublishLast}
-
-The `PublishLast()` method is effectively a non-blocking `Last()` call. 
-You can consider it similar to an `AsyncSubject<T>` wrapping your target sequence. 
-You get equivalent semantics to `AsyncSubject<T>` where only the last value is published, and only once the sequence completes.
-
-	var period = TimeSpan.FromSeconds(1);
-	var observable = Observable.Interval(period)
-		.Take(5)
-		.Do(l => Console.WriteLine("Publishing {0}", l)) //side effect to show it is running
-		.PublishLast();
-	observable.Connect();
-	Console.WriteLine("Press any key to subscribe");
-	Console.ReadKey();
-	var subscription = observable.Subscribe(i => Console.WriteLine("subscription : {0}", i));
-	Console.WriteLine("Press any key to unsubscribe.");
-	Console.ReadKey();
-	subscription.Dispose();
-	Console.WriteLine("Press any key to exit.");
-	Console.ReadKey();
-
-Output:
-
-<div class="output">
-	<div class="line">Press any key to subscribe </div>
-	<div class="line">Publishing 0 </div>
-	<div class="line">Publishing 1 </div>
-	<div class="line">Press any key to unsubscribe. </div>
-	<div class="line">Publishing 2 </div>
-	<div class="line">Publishing 3 </div>
-	<div class="line">Publishing 4 </div>
-	<div class="line">subscription : 4 </div>
-	<div class="line">Press any key to exit. </div>
-</div>
-
-###Replay							{#Replay}
-
-The `Replay` extension method allows you take an existing observable sequence and give it 'replay' semantics as per `ReplaySubject<T>`. 
-As a reminder, the `ReplaySubject<T>` will cache all values so that any late subscribers will also get all of the values. 
-In this example, two subscriptions are made on time, and then a third subscription can be made after the sequence completes. 
-Even though the third subscription is made after the underlying sequence has completed, we can still get all of the values.
-
-	var period = TimeSpan.FromSeconds(1);
-	var hot = Observable.Interval(period)
-		.Take(3)
-		.Publish();
-	hot.Connect();
-	Thread.Sleep(period); //Run hot and ensure a value is lost.
-	var observable = hot.Replay();
-	observable.Connect();
-	observable.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
-	Thread.Sleep(period);
-	observable.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
-	Console.ReadKey();
-	observable.Subscribe(i => Console.WriteLine("third subscription : {0}", i));
-	Console.ReadKey();
-
-Output:
-
-<div class="output">
-	<div class="line">first subscription : 1 </div>
-	<div class="line">second subscription : 1 </div>
-	<div class="line">first subscription : 2 </div>
-	<div class="line">second subscription : 2 </div>
-	<div class="line">third subscription : 1 </div>
-	<div class="line">third subscription : 2 </div>
-</div>
-
-The `Replay` extension method has several overloads that match the `ReplaySubject<T>` constructor overloads; you are able to specify the buffer size by count or by time.
-
-###Multicast			{#Multicast}
-
-The `PublishLast` and `Replay` methods effectively apply `AsyncSubject<T>` and `ReplaySubject<T>` functionality to the underlying observable sequence.
-We could attempt to build a crude implementation ourselves.
-
-	var period = TimeSpan.FromSeconds(1);
-	//var observable = Observable.Interval(period).Publish();
-	var observable = Observable.Interval(period);
-	var shared = new Subject<long>();
-	shared.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
-	observable.Subscribe(shared);   //'Connect' the observable.
-	Thread.Sleep(period);
-	Thread.Sleep(period);
-	shared.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
-
-Output:
-
-<div class="output">
-	<div class="line">first subscription : 0</div>
-	<div class="line">first subscription : 1</div>
-	<div class="line">second subscription : 1</div>
-	<div class="line">first subscription : 2</div>
-	<div class="line">second subscription : 2 </div>
-</div>
-
-The Rx library supplies us with a great method to do this well though. 
-You can apply subject behavior via the `Multicast` extension method. 
-This allows you to share or "multicast" an observable sequence with the behavior of a specific subject.
-For example
-
- * `.Publish()` = `.Multicast(new Subject<T>)`
- * `.PublishLast()` = `.Multicast(new AsyncSubject<T>)`
- * `.Replay()` = `.Multicast(new ReplaySubject<T>)`
-
-Hot and cold observables are two different styles of sharing an observable sequence.
-Both have equally valid applications but behave in different ways. 
-Cold observables allow you to lazily evaluate an observable sequence independently for each subscriber.
-Hot observables allow you to share notifications by multicasting your sequence, even if there are no subscribers. 
-The use of `RefCount` allows you to have lazily-evaluated, multicast observable sequences, coupled with eager disposal semantics once the last subscription is disposed.
-
-<!--
-	<a name="Defer"></a>
-	<h2>Defer
-	<p></p>
-
-	<a name="Synchronize"></a>
-	<h2>Synchronize
-	<p></p>
-	-->
-
----
-	
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 403 - 0
Rx.NET/Documentation/IntroToRx/15_PublishingOperators.md

@@ -0,0 +1,403 @@
+# Publishing operators
+
+Hot sources need to be able to deliver events to multiple subscribers. While we can implement the subscriber tracking ourselves, it can be easier to write an oversimplified source that works only for a single subscriber. And although that won't be a full implementation of `IObservable<T>`, that won't matter if we then use one of Rx's _multicast_ operators to publish it as a multi-subscriber hot source. The example in ["Representing Filesystem Events in Rx"](03_CreatingObservableSequences.md#representing-filesystem-events-in-rx) used this trick, but as you'll see in this chapter there are a few variations on the theme.
+
+## Multicast
+
+Rx offers three operators enabling us to support multiple subscribers using just a single subscription to some underlying source: [`Publish`](#publish), [`PublishLast`](#publishlast), and [`Replay`](#replay). All three of these are wrappers around Rx's `Multicast` operator, which provides the common mechanism at the heart of all of them.
+
+`Multicast` turns any `IObservable<T>` into an `IConnectableObservable<T>` which, as you can see, just adds a `Connect` method:
+
+```csharp
+public interface IConnectableObservable<out T> : IObservable<T>
+{
+    IDisposable Connect();
+}
+```
+
+Since it derives from `IObservable<T>`, you can call `Subscribe` on an `IConnectableObservable<T>`, but the implementation returned by `Multicast` won't call `Subscribe` on the underlying source when you do that. It only calls `Subscribe` on the underlying source when you call `Connect`. So that we can see this in action, let's define a source that prints out a message each time `Subscribe` is called:
+
+```csharp
+IObservable<int> src = Observable.Create<int>(obs =>
+{
+    Console.WriteLine("Create callback called");
+    obs.OnNext(1);
+    obs.OnNext(2);
+    obs.OnCompleted();
+    return Disposable.Empty;
+});
+```
+
+Since this is only going to be invoked once no matter how many observers subscribe, `Multicast` can't pass on the `IObserver<T>`s handed to its own `Subscribe` method, because there could be any number of them. It uses a [Subject](03_CreatingObservableSequences.md#subjectt) as the single `IObserver<T>` that is passes to the underlying source, and this subject is also responsible for keeping track of all subscribers. If we call `Multicast` directly, we are required to pass in the subject we want to use:
+
+```csharp
+IConnectableObservable<int> m = src.Multicast(new Subject<int>());
+```
+
+We can now subscribe to this a few times over:
+
+```csharp
+m.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+m.Subscribe(x => Console.WriteLine($"Sub2: {x}"));
+m.Subscribe(x => Console.WriteLine($"Sub3: {x}"));
+```
+
+None of these subscribers will receive anything unless we call `Connect`:
+
+```csharp
+m.Connect();
+```
+
+**Note**: `Connect` returns an `IDisposable`. Calling `Dispose` on that unsubscribes from the underlying source.
+
+This call to `Connect` causes the following output:
+
+```csharp
+Create callback called
+Sub1: 1
+Sub2: 1
+Sub3: 1
+Sub1: 2
+Sub2: 2
+Sub3: 2
+```
+
+As you can see, the method we passed to `Create` runs only once, confirming that `Multicast` did only subscribe once, despite us calling `Subscribe` three times over. But each item went to all three subscriptions.
+
+The way `Multicast` works is fairly straightforward: it gets the subject do most of the work. Whenever you call `Subscribe` on an observable returned by `Multicast`, it just calls `Subscribe` on the subject. And when you call `Connect`, it just passes the subject into the underlying source's `Subscribe`. So this code would have had the same effect:
+
+```csharp
+var s = new Subject<int>();
+
+s.Subscribe(x => Console.WriteLine($"Sub1: {x}"));
+s.Subscribe(x => Console.WriteLine($"Sub2: {x}"));
+s.Subscribe(x => Console.WriteLine($"Sub3: {x}"));
+
+src.Subscribe(s);
+```
+
+However, an advantage of `Multicast` is that it returns `IConnectableObservable<T>`, and as we'll see later, some other parts of Rx know how to work with this interface.
+
+`Multicast` offers an overload that works in a quite different way: it is intended for scenarios where you want to write a query that uses its source observable twice. For example, we might want to get adjacent pairs of items using `Zip`:
+
+```csharp
+IObservable<(int, int)> ps = src.Zip(src.Skip(1));
+ps.Subscribe(ps => Console.WriteLine(ps));
+```
+
+(Although [`Buffer`](08_Partitioning.md#buffer) might seem like a more obvious way to do this, one advantage of this `Zip` approach is that it will never give us half of a pair. When we ask `Buffer` for pairs, it will give us a single-item buffer when we reach the end, which can require extra code to work around.)
+
+The problem with this approach is that the source will see two subscriptions: one directly from `Zip`, and then a second one through `Skip`. If we were to run the code above, we'd see this output:
+
+```
+Create callback called
+Create callback called
+(1, 2)
+```
+
+Our `Create` callback ran twice. The second `Multicast` overload lets us avoid that:
+
+```csharp
+IObservable<(int, int)> ps = src.Multicast(() => new Subject<int>(), s => s.Zip(s.Skip(1)));
+ps.Subscribe(ps => Console.WriteLine(ps));
+```
+
+As the output shows, this avoids the multiple subscriptions:
+
+```csharp
+Create callback called
+(1, 2)
+```
+
+This overload of `Multicast` returns a normal `IObservable<T>`. This means we don't need to call `Connect`. But it also means that each subscription to the resulting `IObservable<T>` causes a subscription to the underlying source. But for the scenario it is designed for this is fine: we're just trying to avoid getting twice as many subscriptions to the underlying source.
+
+The remaining operators defined in this section, `Publish`, `PublishLast`, and `Replay`, are all wrappers around `Multicast`, each supplying a specific type of subject for you.
+
+### Publish
+
+The `Publish` operator calls `Multicast` with a [`Subject<T>`](03_CreatingObservableSequences.md#subjectt). The effect of this is that once you have called `Connect` on the result, any items produced by the source will be delivered to all subscribers. This enables me to replace this earlier example:
+
+```csharp
+IConnectableObservable<int> m = src.Multicast(new Subject<int>());
+```
+
+with this:
+
+```csharp
+IConnectableObservable<int> m = src.Publish();
+```
+
+These are exactly equivalent.
+
+Because `Subject<T>` forwards all incoming `OnNext` calls to each of its subscribers immediately, and because it doesn't store any previously made calls, the result is a hot source. If you attach some subscribers before calling `Connect`, and then you attached more subscribers after calling `Connect`, those later subscribers will only receive events that occurred after they subscribed. This example demonstrates that:
+
+```csharp
+IConnectableObservable<long> publishedTicks = Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .Take(4)
+    .Publish();
+
+publishedTicks.Subscribe(x => Console.WriteLine($"Sub1: {x} ({DateTime.Now})"));
+publishedTicks.Subscribe(x => Console.WriteLine($"Sub2: {x} ({DateTime.Now})"));
+
+publishedTicks.Connect();
+Thread.Sleep(2500);
+Console.WriteLine();
+Console.WriteLine("Adding more subscribers");
+Console.WriteLine();
+
+publishedTicks.Subscribe(x => Console.WriteLine($"Sub3: {x} ({DateTime.Now})"));
+publishedTicks.Subscribe(x => Console.WriteLine($"Sub4: {x} ({DateTime.Now})"));
+```
+
+The following output shows that we only see output for the Sub3 and Sub4 subscriptions for the final 2 events:
+
+```
+Sub1: 0 (10/08/2023 16:04:02)
+Sub2: 0 (10/08/2023 16:04:02)
+Sub1: 1 (10/08/2023 16:04:03)
+Sub2: 1 (10/08/2023 16:04:03)
+
+Adding more subscribers
+
+Sub1: 2 (10/08/2023 16:04:04)
+Sub2: 2 (10/08/2023 16:04:04)
+Sub3: 2 (10/08/2023 16:04:04)
+Sub4: 2 (10/08/2023 16:04:04)
+Sub1: 3 (10/08/2023 16:04:05)
+Sub2: 3 (10/08/2023 16:04:05)
+Sub3: 3 (10/08/2023 16:04:05)
+Sub4: 3 (10/08/2023 16:04:05)
+```
+
+As with [`Multicast`](#multicast), `Publish` offers an overload that provides per-top-level-subscription multicast. This lets us simplify the example from the end of that section from this:
+
+```csharp
+IObservable<(int, int)> ps = src.Multicast(() => new Subject<int>(), s => s.Zip(s.Skip(1)));
+ps.Subscribe(ps => Console.WriteLine(ps));
+```
+
+to this:
+
+```csharp
+IObservable<(int, int)> ps = src.Publish(s => s.Zip(s.Skip(1)));
+ps.Subscribe(ps => Console.WriteLine(ps));
+```
+
+`Publish` offers overloads that let you specify an initial value. These use [`BehaviorSubject<T>`](03_CreatingObservableSequences.md#behaviorsubjectt) instead of `Subject<T>`. The difference here is that all subscribers will immediately receive a value as soon as they subscribe. If the underlying source hasn't yet produced an item (or if `Connect` hasn't been called, meaning we've not even subscribed to the source yet) they will receive the initial value. And if at least one item has been received from the source, any new subscribers will instantly receive the latest value the source produced, and will then go on to receive any further new values.
+
+### PublishLast
+
+The `PublishLast` operator calls `Multicast` with an [`AsyncSubject<T>`](03_CreatingObservableSequences.md#asyncsubjectt). The effect of this is that the final item produced by the source will be delivered to all subscribers. You still need to call `Connect`. This determines when subscription to the underlying source occurs. But all subscribers will receive the final event regardless of when they subscribe, because `AsyncSubject<T>` remembers the final result. We can see this in action with the following example:
+
+```csharp
+IConnectableObservable<long> pticks = Observable
+    .Interval(TimeSpan.FromSeconds(0.1))
+    .Take(4)
+    .PublishLast();
+
+pticks.Subscribe(x => Console.WriteLine($"Sub1: {x} ({DateTime.Now})"));
+pticks.Subscribe(x => Console.WriteLine($"Sub2: {x} ({DateTime.Now})"));
+
+pticks.Connect();
+Thread.Sleep(3000);
+Console.WriteLine();
+Console.WriteLine("Adding more subscribers");
+Console.WriteLine();
+
+pticks.Subscribe(x => Console.WriteLine($"Sub3: {x} ({DateTime.Now})"));
+pticks.Subscribe(x => Console.WriteLine($"Sub4: {x} ({DateTime.Now})"));
+```
+
+This creates a source that produces 4 values in the space of 0.4 seconds. It attaches a couple of subscribers to the `IConnectableObservable<T>` returned by `PublishLast` and then immediately calls `Connect`. Then it sleeps for 1 second, which gives the source time to complete. This means that those first two subscribers will receive the one and only value they will ever receive (the last value in the sequence) before that call to `Thread.Sleep` returns. But we then go on to attach two more subscribers. As the output shows, these also receive that same final event:
+
+```
+Sub1: 3 (11/14/2023 9:15:46 AM)
+Sub2: 3 (11/14/2023 9:15:46 AM)
+
+Adding more subscribers
+
+Sub3: 3 (11/14/2023 9:15:49 AM)
+Sub4: 3 (11/14/2023 9:15:49 AM)
+```
+
+These last two subscribers receive the value later because they subscribed later, but the `AsyncSubject<T>` created by `PublishLast` is just replaying the final value it received to these late subscribers.
+
+### Replay
+
+The `Replay` operator calls `Multicast` with a [`ReplaySubject<T>`](03_CreatingObservableSequences.md#replaysubjectt). The effect of this is that any subscribers attached before calling `Connect` just receive all events as the underlying source produces them, but any subscribers attached later effectively get to 'catch up', because the `ReplaySubject<T>` remembers events it has already seen, and replays them to new subscribers.
+
+This example is very similar to the one used for `Publish`:
+
+```csharp
+IConnectableObservable<long> pticks = Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .Take(4)
+    .Replay();
+
+pticks.Subscribe(x => Console.WriteLine($"Sub1: {x} ({DateTime.Now})"));
+pticks.Subscribe(x => Console.WriteLine($"Sub2: {x} ({DateTime.Now})"));
+
+pticks.Connect();
+Thread.Sleep(2500);
+Console.WriteLine();
+Console.WriteLine("Adding more subscribers");
+Console.WriteLine();
+
+pticks.Subscribe(x => Console.WriteLine($"Sub3: {x} ({DateTime.Now})"));
+pticks.Subscribe(x => Console.WriteLine($"Sub4: {x} ({DateTime.Now})"));
+```
+
+This creates a source that will produce items regularly for 4 seconds. It attaches two subscribers before calling `Connect`. It then waits long enough for the first two events to emerge before attaching two more subscribers. But unlike with `Publish`, those late subscribers will see the events that happened before they subscribed:
+
+```
+Sub1: 0 (10/08/2023 16:18:22)
+Sub2: 0 (10/08/2023 16:18:22)
+Sub1: 1 (10/08/2023 16:18:23)
+Sub2: 1 (10/08/2023 16:18:23)
+
+Adding more subscribers
+
+Sub3: 0 (10/08/2023 16:18:24)
+Sub3: 1 (10/08/2023 16:18:24)
+Sub4: 0 (10/08/2023 16:18:24)
+Sub4: 1 (10/08/2023 16:18:24)
+Sub1: 2 (10/08/2023 16:18:24)
+Sub2: 2 (10/08/2023 16:18:24)
+Sub3: 2 (10/08/2023 16:18:24)
+Sub4: 2 (10/08/2023 16:18:24)
+Sub1: 3 (10/08/2023 16:18:25)
+Sub2: 3 (10/08/2023 16:18:25)
+Sub3: 3 (10/08/2023 16:18:25)
+Sub4: 3 (10/08/2023 16:18:25)
+```
+
+They receive them late of course, because they subscribed late. So we see a quick flurry of events reported as `Sub3` and `Sub4` catch up, but once they have caught up, they then receive all further events immediately.
+
+The `ReplaySubject<T>` that enables this behaviour will consume memory to store events. As you may recall, this subject type can be configured to store only a limited number of events, or not to hold onto events older than some specified time limit. The `Replay` operator provides overloads that enable you to configure these kinds of limits.
+
+`Replay` also supports the per-subscription-multicast model I showed for the other `Multicast`-based operators in this section.
+
+## RefCount
+
+We saw in the preceding section that `Multicast` (and also its various wrappers) supports two usage models:
+
+* returning an `IConnectableObservable<T>` to allow top-level control of when subscription to the underlying source occurs
+* returning an ordinary `IObservable<T>`, enabling us to avoid unnecessary multiple subscriptions to the source when using a query that uses the source in multiple places (e.g., `s.Zip(s.Take(1))`), but still making one `Subscribe` call to the underlying source for each top-level `Subscribe`
+
+`RefCount` offers a slightly different model. It enables subscription to the underlying source to be triggered by an ordinary `Subscribe`, but can still make just a single call to the underlying source. This might be useful in the AIS example used throughout this book. You might want to attach multiple subscribers to an observable source that reports the location messages broadcast by ships and other vessels, but you would normally want a library presenting an Rx-based API for this to connect only once to any underlying service providing those messages. And you would most likely want it to connect only when at least one subscriber is listening. `RefCount` would be ideal for this because it enables a single source to support multiple subscribers, and for the underlying source to know when we move between the "no subscribers" and "at least one subscriber" states.
+
+To be able to observe how `RefCount` operators, I'm going to use a modified version of the source that reports when subscription occurs:
+
+```csharp
+IObservable<int> src = Observable.Create<int>(async obs =>
+{
+    Console.WriteLine("Create callback called");
+    obs.OnNext(1);
+    await Task.Delay(250).ConfigureAwait(false);
+    obs.OnNext(2);
+    await Task.Delay(250).ConfigureAwait(false);
+    obs.OnNext(3);
+    await Task.Delay(250).ConfigureAwait(false);
+    obs.OnNext(4);
+    await Task.Delay(100).ConfigureAwait(false);
+    obs.OnCompleted();
+});
+```
+
+Unlike the earlier example, this uses `async` and delays between each `OnNext` to ensure that the main thread has time to set up multiple subscriptions before all the items are produced. We can then wrap this with `RefCount`:
+
+```csharp
+IObservable<int> rc = src
+    .Publish()
+    .RefCount();
+```
+
+Notice that I have to call `Publish` first. This is because `RefCount` expects an `IConnectableObservable<T>`. It wants to start the source only when something first subscribes. It will call `Connect` as soon as there's at least one subscriber. Let's try it:
+
+```csharp
+rc.Subscribe(x => Console.WriteLine($"Sub1: {x} ({DateTime.Now})"));
+rc.Subscribe(x => Console.WriteLine($"Sub2: {x} ({DateTime.Now})"));
+Thread.Sleep(600);
+Console.WriteLine();
+Console.WriteLine("Adding more subscribers");
+Console.WriteLine();
+rc.Subscribe(x => Console.WriteLine($"Sub3: {x} ({DateTime.Now})"));
+rc.Subscribe(x => Console.WriteLine($"Sub4: {x} ({DateTime.Now})"));
+```
+
+Here's the output:
+
+```
+Create callback called
+Sub1: 1 (10/08/2023 16:36:44)
+Sub1: 2 (10/08/2023 16:36:45)
+Sub2: 2 (10/08/2023 16:36:45)
+Sub1: 3 (10/08/2023 16:36:45)
+Sub2: 3 (10/08/2023 16:36:45)
+
+Adding more subscribers
+
+Sub1: 4 (10/08/2023 16:36:45)
+Sub2: 4 (10/08/2023 16:36:45)
+Sub3: 4 (10/08/2023 16:36:45)
+Sub4: 4 (10/08/2023 16:36:45)
+```
+
+Notice that only `Sub1` receives the very first event. That's because the callback passed to `Create` produces that immediately. Only when it invokes its first `await` does it return to the caller, enabling us to attach the second subscriber. That has already missed the first event, but as you can see it receives the 2nd and 3rd. The code waits long enough for the first three events to occur before attaching two more subscribers, and you can see that all four subscribers receive the final event.
+
+As the name suggests `RefCount` counts the number of active subscribers. If this ever drops to 0, it will call `Dispose` on the object that `Connect` returned, shutting down the subscription. If further subscribers attach, it will restart. This example shows that:
+
+```csharp
+IDisposable s1 = rc.Subscribe(x => Console.WriteLine($"Sub1: {x} ({DateTime.Now})"));
+IDisposable s2 = rc.Subscribe(x => Console.WriteLine($"Sub2: {x} ({DateTime.Now})"));
+Thread.Sleep(600);
+
+Console.WriteLine();
+Console.WriteLine("Removing subscribers");
+s1.Dispose();
+s2.Dispose();
+Thread.Sleep(600);
+Console.WriteLine();
+
+Console.WriteLine();
+Console.WriteLine("Adding more subscribers");
+Console.WriteLine();
+rc.Subscribe(x => Console.WriteLine($"Sub3: {x} ({DateTime.Now})"));
+rc.Subscribe(x => Console.WriteLine($"Sub4: {x} ({DateTime.Now})"));
+```
+
+We get this output:
+
+```
+Create callback called
+Sub1: 1 (10/08/2023 16:40:39)
+Sub1: 2 (10/08/2023 16:40:39)
+Sub2: 2 (10/08/2023 16:40:39)
+Sub1: 3 (10/08/2023 16:40:39)
+Sub2: 3 (10/08/2023 16:40:39)
+
+Removing subscribers
+
+
+Adding more subscribers
+
+Create callback called
+Sub3: 1 (10/08/2023 16:40:40)
+Sub3: 2 (10/08/2023 16:40:40)
+Sub4: 2 (10/08/2023 16:40:40)
+Sub3: 3 (10/08/2023 16:40:41)
+Sub4: 3 (10/08/2023 16:40:41)
+Sub3: 4 (10/08/2023 16:40:41)
+Sub4: 4 (10/08/2023 16:40:41)
+```
+
+This time, the `Create` callback ran twice. That's because the number of active subscribers dropped to 0, so `RefCount` called `Dispose` to shut things down. When new subscribers came along, it called `Connect` again to start things back up. There are some overloads enabling you to specify a `disconnectDelay`. This tells it to wait for the specified time after the number of subscribers drops to zero before disconnecting, to see if any new subscribers come along. But it will still disconnect if the specified time elapses. If that's not what you want, the next operator might be for you.
+
+## AutoConnect
+
+The `AutoConnect` operator behaves in much the same way as `RefCount`, in that it calls `Connect` on its underlying `IConnectableObservable<T>` when the first subscriber subscribers. The difference is that it doesn't attempt to detect when the number of active subscribers has dropped to zero: once it connects, it remains connected indefinitely, even if it has no subscribers.
+
+Although `AutoConnect` can be convenient, you need to be a little careful, because it can cause leaks: it will never disconnect automatically. It is still possible to tear down the connection it creates: `AutoConnect` accepts an optional argument of type `Action<IDisposable>`. It invokes this when it first connects to the source, passing you the `IDisposable` returned by the source's `Connect` method. You can shut it down by calling `Dispose`.
+
+The operators in this chapter can be useful whenever you have a source that is not well suited do dealing with multiple subscribers. It provides various ways to attach multiple subscribers while only triggering a single `Subscribe` to the underlying source.

+ 0 - 1362
Rx.NET/Documentation/IntroToRx/15_SchedulingAndThreading.md

@@ -1,1362 +0,0 @@
----
-title: Scheduling and threading
----
-
-#PART 4 - Concurrency				{#PART4 .SectionHeader}
-
-Rx is primarily a system for querying _data in motion_ asynchronously. 
-To effectively provide the level of asynchrony that developers require, some level of concurrency control is required. 
-We need the ability to generate sequence data concurrently to the consumption of the sequence data.
-
-In this fourth and final part of the book, we will look at the various concurrency considerations one must undertake when querying data in motion. 
-We will look how to avoid concurrency when possible and use it correctly when justifiable. 
-We will look at the excellent abstractions Rx provides, that enable concurrency to become declarative and also unit testable. 
-In my opinion, theses two features are enough reason alone to adopt Rx into your code base. 
-We will also look at the complex issue of querying concurrent sequences and analyzing data in sliding windows of time.
-
-#Scheduling and threading			{#SchedulingAndThreading}
-
-So far, we have managed to avoid any explicit usage of threading or concurrency.
-There are some methods that we have covered that implicitly introduce some level of concurrency to perform their jobs (e.g. `Buffer`, `Delay`, `Sample` each require a separate thread/scheduler/timer to work their magic). 
-Most of this however, has been kindly abstracted away from us. 
-This chapter will look at the elegant beauty of the Rx API and its ability to effectively remove the need for `WaitHandle` types, and any explicit calls to `Thread`s, the `ThreadPool` or `Task`s.
-
-##Rx is single-threaded by default	{#RxIsSingleThreadedByDefault}
-
-To be more accurate, Rx is a free threaded model.
-
-A popular misconception is that Rx is multithreaded by default. 
-It is perhaps more an idle assumption than a strong belief, much in the same way some assume that standard .NET events are multithreaded until they challenge that notion. 
-We debunk this myth and assert that events are most certainly single threaded and synchronous in the [Appendix](19_DispellingMyths.html#DispellingEventMyths).
-
-Like events, Rx is just a way of chaining callbacks together for a given notification.
-While Rx is a free-threaded model, this does not mean that subscribing or calling `OnNext` will introduce multi-threading to your sequence. 
-Being free-threaded means that you are not restricted to which thread you choose to do your work. 
-For example, you can choose to do your work such as invoking a subscription, observing or producing notifications, on any thread you like. 
-The alternative to a free-threaded model is a _Single Threaded Apartment_ (STA) model where you must interact with the system on a given thread. 
-It is common to use the STA model when working with User Interfaces and some COM interop. 
-So, just as a recap: if you do not introduce any scheduling, your callbacks will be invoked on the same thread that the `OnNext`/`OnError`/`OnCompleted` methods are invoked from.
-
-In this example, we create a subject then call `OnNext` on various threads and record the threadId in our handler.
-
-	Console.WriteLine("Starting on threadId:{0}", Thread.CurrentThread.ManagedThreadId);
-	var subject = new Subject<object>();
-
-	subject.Subscribe(
-		o => Console.WriteLine("Received {1} on threadId:{0}", 
-			Thread.CurrentThread.ManagedThreadId, 
-			o));
-
-	ParameterizedThreadStart notify = obj =>
-	{
-		Console.WriteLine("OnNext({1}) on threadId:{0}",
-							Thread.CurrentThread.ManagedThreadId, 
-							obj);
-		subject.OnNext(obj);
-	};
-
-	notify(1);
-	new Thread(notify).Start(2);
-	new Thread(notify).Start(3);
-
-Output:
-
-<div class="output">
-	<div class="line">Starting on threadId:9</div>
-	<div class="line">OnNext(1) on threadId:9</div>
-	<div class="line">Received 1 on threadId:9</div>
-	<div class="line">OnNext(2) on threadId:10</div>
-	<div class="line">Received 2 on threadId:10</div>
-	<div class="line">OnNext(3) on threadId:11</div>
-	<div class="line">Received 3 on threadId:11</div>
-</div>
-
-Note that each `OnNext` was called back on the same thread that it was notified on. 
-This is not always what we are looking for. 
-Rx introduces a very handy mechanism for introducing concurrency and multithreading to your code: Scheduling.
-
-##SubscribeOn and ObserveOn			{#SubscribeOnObserveOn}
-
-In the Rx world, there are generally two things you want to control the concurrency model for:
-
- * The invocation of the subscription
- * The observing of notifications
-
-
-As you could probably guess, these are exposed via two extension methods to `IObservable<T>` called `SubscribeOn` and `ObserveOn`. 
-Both methods have an overload that take an `IScheduler` (or `SynchronizationContext`) and return an `IObservable<T>` so you can chain methods together.
-
-	public static class Observable 
-	{
-		public static IObservable<TSource> ObserveOn<TSource>(
-			this IObservable<TSource> source, 
-			IScheduler scheduler)
-		{...}
-		public static IObservable<TSource> ObserveOn<TSource>(
-			this IObservable<TSource> source, 
-			SynchronizationContext context)
-		{...}
-		public static IObservable<TSource> SubscribeOn<TSource>(
-			this IObservable<TSource> source, 
-			IScheduler scheduler)
-		{...}
-		public static IObservable<TSource> SubscribeOn<TSource>(
-			this IObservable<TSource> source, 
-			SynchronizationContext context)
-		{...}
-	}
-
-One pitfall I want to point out here is, the first few times I used these overloads, I was confused as to what they actually do. 
-You should use the `SubscribeOn` method to describe how you want any warm-up and background processing code to be scheduled. 
-For example, if you were to use `SubscribeOn` with `Observable.Create`, the delegate passed to the `Create` method would be run on the specified scheduler.
-
-In this example, we have a sequence produced by `Observable.Create` with a standard subscription.
-
-	Console.WriteLine("Starting on threadId:{0}", Thread.CurrentThread.ManagedThreadId);
-	var source = Observable.Create<int>(
-		o =>
-		{
-			Console.WriteLine("Invoked on threadId:{0}", Thread.CurrentThread.ManagedThreadId);
-			o.OnNext(1);
-			o.OnNext(2);
-			o.OnNext(3);
-			o.OnCompleted();
-			Console.WriteLine("Finished on threadId:{0}",
-			Thread.CurrentThread.ManagedThreadId);
-			return Disposable.Empty;
-		});
-
-	source
-		//.SubscribeOn(Scheduler.ThreadPool)
-		.Subscribe(
-			o => Console.WriteLine("Received {1} on threadId:{0}",
-				Thread.CurrentThread.ManagedThreadId,
-				o),
-			() => Console.WriteLine("OnCompleted on threadId:{0}",
-				Thread.CurrentThread.ManagedThreadId));
-	Console.WriteLine("Subscribed on threadId:{0}", Thread.CurrentThread.ManagedThreadId);
-
-Output:
-
-<div class="output">
-	<div class="line">Starting on threadId:9</div>
-	<div class="line">Invoked on threadId:9</div>
-	<div class="line">Received 1 on threadId:9</div>
-	<div class="line">Received 2 on threadId:9</div>
-	<div class="line">Received 3 on threadId:9</div>
-	<div class="line">OnCompleted on threadId:9</div>
-	<div class="line">Finished on threadId:9</div>
-	<div class="line">Subscribed on threadId:9</div>
-</div>
-
-You will notice that all actions were performed on the same thread. 
-Also, note that everything is sequential. 
-When the subscription is made, the `Create` delegate is called. 
-When `OnNext(1)` is called, the `OnNext` handler is called, and so on. 
-This all stays synchronous until the `Create` delegate is finished, and the `Subscribe` line can move on to the final line that declares we are subscribed on thread 9.
-
-If we apply `SubscribeOn` to the chain (i.e. un-comment it), the order of execution is quite different.
-
-<div class="output">
-	<div class="line">Starting on threadId:9</div>
-	<div class="line">Subscribed on threadId:9</div>
-	<div class="line">Invoked on threadId:10</div>
-	<div class="line">Received 1 on threadId:10</div>
-	<div class="line">Received 2 on threadId:10</div>
-	<div class="line">Received 3 on threadId:10</div>
-	<div class="line">OnCompleted on threadId:10</div>
-	<div class="line">Finished on threadId:10</div>
-</div>
-
-Observe that the subscribe call is now non-blocking. 
-The `Create` delegate is executed on the thread pool and so are all our handlers.
-
-The `ObserveOn` method is used to declare where you want your notifications to be scheduled to. 
-I would suggest the `ObserveOn` method is most useful when working with STA systems, most commonly UI applications. 
-When writing UI applications, the `SubscribeOn`/`ObserveOn` pair is very useful for two reasons:
-
- * you do not want to block the UI thread
- * but you do need to update UI objects on the UI thread.
-
-
-It is critical to avoid blocking the UI thread, as doing so leads to a poor user experience. 
-General guidance for Silverlight and WPF is that any work that blocks for longer than 150-250ms should not be performed on the UI thread (Dispatcher).
-This is approximately the period of time over which a user can notice a lag in the UI (mouse becomes sticky, animations sluggish). 
-In the upcoming Metro style apps for Windows 8, the maximum allowed blocking time is only 50ms. 
-This more stringent rule is to ensure a consistent <q>fast and fluid</q> experience across applications.
-With the processing power offered by current desktop processors, you can achieve a lot of processing 50ms. 
-However, as processor become more varied (single/multi/many core, plus high power desktop vs. lower power ARM tablet/phones), how much you can do in 50ms fluctuates widely. 
-In general terms: any I/O, computational intensive work or any processing unrelated to the UI should be marshaled off the UI thread.
-The general pattern for creating responsive UI applications is:
-
- * respond to some sort of user action
- * do work on a background thread
- * pass the result back to the UI thread
- * update the UI
-
-This is a great fit for Rx: responding to events, potentially composing multiple events, passing data to chained method calls. 
-With the inclusion of scheduling, we even have the power to get off and back onto the UI thread for that responsive application feel that users demand.
-
-Consider a WPF application that used Rx to populate an `ObservableCollection<T>`.
-You would almost certainly want to use `SubscribeOn` to leave the `Dispatcher`, followed by `ObserveOn` to ensure you were notified back on the Dispatcher.
-If you failed to use the `ObserveOn` method, then your `OnNext` handlers would be invoked on the same thread that raised the notification. 
-In Silverlight/WPF, this would cause some sort of not-supported/cross-threading exception. 
-In this example, we subscribe to a sequence of `Customers`. 
-We perform the subscription on a new thread and ensure that as we receive `Customer` notifications, we add them to the `Customers` collection on the `Dispatcher`.
-
-	_customerService.GetCustomers()
-		.SubscribeOn(Scheduler.NewThread)
-		.ObserveOn(DispatcherScheduler.Instance) 
-		//or .ObserveOnDispatcher() 
-		.Subscribe(Customers.Add);
-
-##Schedulers						{#Schedulers}
-
-The `SubscribeOn` and `ObserveOn` methods required us to pass in an `IScheduler`. 
-Here we will dig a little deeper and see what schedulers are, and what implementations are available to us.
-
-There are two main types we use when working with schedulers:
-
-<dl>
-	<dt>The `IScheduler` interface</dt>
-	<dd>
-		A common interface for all schedulers</dd>
-	<dt>The static `Scheduler` class</dt>
-	<dd>
-		Exposes both implementations of `IScheduler` and helpful extension methods
-		to the `IScheduler` interface</dd>
-</dl>
-
-The `IScheduler` interface is of less importance right now than the types that implement the interface. 
-The key concept to understand is that an `IScheduler` in Rx is used to schedule some action to be performed, either as soon as possible or at a given point in the future. 
-The implementation of the `IScheduler` defines how that action will be invoked i.e. asynchronously via a thread pool, a new thread or a message pump, or synchronously on the current thread. 
-Depending on your platform (Silverlight 4, Silverlight 5, .NET 3.5, .NET 4.0), you will be exposed most of the implementations you will need via a static class `Scheduler`.
-
-Before we look at the `IScheduler` interface in detail, let's look at the extension method we will use the most often and then introduce the common implementations.
-
-This is the most commonly used (extension) method for `IScheduler`. 
-It simply sets an action to be performed as soon as possible.
-
-	public static IDisposable Schedule(this IScheduler scheduler, Action action)
-	{...}
-
-You could use the method like this:
-
-	IScheduler scheduler = ...;
-	scheduler.Schedule(()=>{ Console.WriteLine("Work to be scheduled"); });
-
-These are the static properties that you can find on the `Scheduler` type.
-
-`Scheduler.Immediate` will ensure the action is not scheduled, but rather executed immediately.
-
-`Scheduler.CurrentThread` ensures that the actions are performed on the thread that made the original call. 
-This is different from `Immediate`, as `CurrentThread` will queue the action to be performed. 
-We will compare these two schedulers using a code example soon.
-
-`Scheduler.NewThread` will schedule work to be done on a new thread.
-
-`Scheduler.ThreadPool` will schedule all actions to take place on the Thread Pool.
-
-`Scheduler.TaskPool` will schedule actions onto the TaskPool. 
-This is not available in Silverlight 4 or .NET 3.5 builds.
-
-If you are using WPF or Silverlight, then you will also have access to `DispatcherScheduler.Instance`.
-This allows you to schedule tasks onto the `Dispatcher` with the common interface, either now or in the future. 
-There is the `SubscribeOnDispatcher()` and `ObserveOnDispatcher()` extension methods to `IObservable<T>`, that also help you access the Dispatcher. 
-While they appear useful, you will want to avoid these two methods for production code, and we explain why in the [Testing Rx](16_TestingRx.html) chapter.
-
-Most of the schedulers listed above are quite self explanatory for basic usage.
-We will take an in-depth look at all of the implementations of `IScheduler` later in the chapter.
-
-##Concurrency pitfalls			{#ConcurrencyPitfalls}
-
-Introducing concurrency to your application will increase its complexity. 
-If your application is not noticeably improved by adding a layer of concurrency, then you should avoid doing so. 
-Concurrent applications can exhibit maintenance problems with symptoms surfacing in the areas of debugging, testing and refactoring.
-
-The common problem that concurrency introduces is unpredictable timing. 
-Unpredictable timing can be caused by variable load on a system, as well as variations in system configurations (e.g. varying core clock speed and availability of processors). 
-These can ultimately can result in race conditions. 
-Symptoms of race conditions include out-of-order execution, [deadlocks](http://en.wikipedia.org/wiki/Deadlock), [livelocks](http://en.wikipedia.org/wiki/Deadlock#Livelock) and corrupted state.
-
-In my opinion, the biggest danger when introducing concurrency haphazardly to an application, is that you can silently introduce bugs. 
-These defects may slip past Development, QA and UAT and only manifest themselves in Production environments.
-
-Rx, however, does such a good job of simplifying the concurrent processing of observable sequences that many of these concerns can be mitigated. 
-You can still create problems, but if you follow the guidelines then you can feel a lot safer in the knowledge that you have heavily reduced the capacity for unwanted race conditions.
-
-In a later chapter, [Testing Rx](16_TestingRx.html), we will look at how Rx improves your ability to test concurrent workflows.
-
-###Lock-ups							{#LockUps}
-
-When working on my first commercial application that used Rx, the team found out the hard way that Rx code can most certainly deadlock. 
-When you consider that some calls (like `First`, `Last`, `Single` and `ForEach`) are blocking, and that we can schedule work to be done in the future, it becomes obvious that a race condition can occur. 
-This example is the simplest block I could think of. 
-Admittedly, it is fairly elementary but it will get the ball rolling.
-
-	var sequence = new Subject&lt;int>();
-	Console.WriteLine("Next line should lock the system.");
-	var value = sequence.First();
-	sequence.OnNext(1);
-	Console.WriteLine("I can never execute....");
-
-Hopefully, we won't ever write such code though, and if we did, our tests would give us quick feedback that things went wrong.
-More realistically, race conditions often slip into the system at integration points.
-The next example may be a little harder to detect, but is only small step away from our first, unrealistic example.
-Here, we block in the constructor of a UI element which will always be created on the dispatcher. 
-The blocking call is waiting for an event that can only be raised from the dispatcher, thus creating a deadlock.
-
-	public Window1()
-	{
-		InitializeComponent();
-		DataContext = this;
-		Value = "Default value";
-		//Deadlock! 
-		//We need the dispatcher to continue to allow me to click the button to produce a value
-		Value = _subject.First();
-		//This will give same result but will not be blocking (deadlocking). 
-		_subject.Take(1).Subscribe(value => Value = value);
-	}
-	private void MyButton_Click(object sender, RoutedEventArgs e)
-	{
-		_subject.OnNext("New Value");
-	}
-	public string Value
-	{
-		get { return _value; }
-		set
-		{
-			_value = value;
-			var handler = PropertyChanged;
-			if (handler != null) handler(this, new PropertyChangedEventArgs("Value"));
-		}
-	}
-
-Next, we start seeing things that can become more sinister. 
-The button's click handler will try to get the first value from an observable sequence exposed via an interface.
-
-	public partial class Window1 : INotifyPropertyChanged
-	{
-		//Imagine DI here.
-		private readonly IMyService _service = new MyService(); 
-		private int _value2;
-
-		public Window1()
-		{
-			InitializeComponent();
-			DataContext = this;
-		}
-		public int Value2
-		{
-			get { return _value2; }
-			set
-			{
-				_value2 = value;
-				var handler = PropertyChanged;
-				if (handler != null) handler(this, new PropertyChangedEventArgs("Value2"));
-			}
-		}
-		#region INotifyPropertyChanged Members
-		public event PropertyChangedEventHandler PropertyChanged;
-		#endregion
-		private void MyButton2_Click(object sender, RoutedEventArgs e)
-		{
-			Value2 = _service.GetTemperature().First();
-		}
-	}
-
-There is only one small problem here in that we block on the `Dispatcher` thread (`First` is a blocking call), however this manifests itself into a deadlock if the service code is written incorrectly.
-
-	class MyService : IMyService
-	{
-		public IObservable<int> GetTemperature()
-		{
-			return Observable.Create<int>(
-				o =>
-				{
-					o.OnNext(27);
-					o.OnNext(26);
-					o.OnNext(24);
-					return () => { };
-				})
-			   .SubscribeOnDispatcher();
-		}
-	}
-
-This odd implementation, with explicit scheduling, will cause the three `OnNext` calls to be scheduled once the `First()` call has finished; however, `that` is waiting for an `OnNext` to be called: we are deadlocked.
-
-So far, this chapter may seem to say that concurrency is all doom and gloom by focusing on the problems you could face; this is not the intent though. 
-We do not magically avoid classic concurrency problems simply by adopting Rx. 
-Rx will however make it easier to get it right, provided you follow these two simple rules.
-
- * Only the final subscriber should be setting the scheduling
- * Avoid using blocking calls: e.g. `First`, `Last` and `Single`
-
-The last example came unstuck with one simple problem; the service was dictating the scheduling paradigm when, really, it had no business doing so. 
-Before we had a clear idea of where we should be doing the scheduling in my first Rx project, we had all sorts of layers adding 'helpful' scheduling code. 
-What it ended up creating was a threading nightmare. 
-When we removed all the scheduling code and then confined it it in a single layer (at least in the Silverlight client), most of our concurrency problems went away. 
-I recommend you do the same. 
-At least in WPF/Silverlight applications, the pattern should be simple: "Subscribe on a Background thread; Observe on the Dispatcher".
-
-##Advanced features of schedulers	{#AdvancedFeaturesOfSchedulers}
-
-We have only looked at the most simple usage of schedulers so far:
-
- * Scheduling an action to be executed as soon as possible
- * Scheduling the subscription of an observable sequence
- * Scheduling the observation of notifications coming from an observable sequence
-
-Schedulers also provide more advanced features that can help you with various problems.
-
-###Passing state					{#PassingState}
-
-In the extension method to `IScheduler` we have looked at, you could only provide an `Action` to execute. 
-This `Action` did not accept any parameters.
-If you want to pass state to the `Action`, you could use a closure to share the data like this:
-
-	var myName = "Lee";
-	Scheduler.NewThread.Schedule(
-		() => Console.WriteLine("myName = {0}", myName));
-
-This could create a problem, as you are sharing state across two different scopes.
-I could modify the variable `myName` and get unexpected results.
-
-In this example, we use a closure as above to pass state. 
-I immediately modify the closure and this creates a race condition: will my modification happen before or after the state is used by the scheduler?
-
-	var myName = "Lee";
-	scheduler.Schedule(
-		() => Console.WriteLine("myName = {0}", myName));
-	myName = "John";//What will get written to the console?
-
-
-In my tests, "John" is generally written to the console when `scheduler` is an instance of `NewThreadScheduler`. 
-If I use the `ImmediateScheduler` then "Lee" would be written. 
-The problem with this is the non-deterministic nature of the code.
-
-A preferable way to pass state is to use the `Schedule` overloads that accept state. 
-This example takes advantage of this overload, giving us certainty about our state.
-
-	var myName = "Lee";
-	scheduler.Schedule(myName, 
-		(_, state) =>
-		{
-			Console.WriteLine(state);
-			return Disposable.Empty;
-		});
-	myName = "John";
-
-
-Here, we pass `myName` as the state. 
-We also pass a delegate that will take the state and return a disposable. 
-The disposable is used for cancellation; we will look into that later. 
-The delegate also takes an `IScheduler` parameter, which we name "_" (underscore). 
-This is the convention to indicate we are ignoring the argument. 
-When we pass `myName` as the state, a reference to the state is kept internally. 
-So when we update the `myName` variable to "John", the reference to "Lee" is still maintained by the scheduler's internal workings.
-
-Note that in our previous example, we modify the `myName` variable to point to a new instance of a string. 
-If we were to instead have an instance that we actually modified, we could still get unpredictable behavior. 
-In the next example, we now use a list for our state. 
-After scheduling an action to print out the element count of the list, we modify that list.
-
-	var list = new List<int>();
-	scheduler.Schedule(list,
-		(innerScheduler, state) =>
-		{
-			Console.WriteLine(state.Count);
-			return Disposable.Empty;
-		});
-	list.Add(1);
-
-Now that we are modifying shared state, we can get unpredictable results. 
-In this example, we don't even know what type the scheduler is, so we cannot predict the race conditions we are creating. 
-As with any concurrent software, you should avoid modifying shared state.
-
-###Future scheduling				{#FutureScheduling}
-
-As you would expect with a type called "IScheduler", you are able to schedule an action to be executed in the future. 
-You can do so by specifying the exact point in time an action should be invoked, or you can specify the period of time to wait until the action is invoked. 
-This is clearly useful for features such as buffering, timers etc.
-
-Scheduling in the future is thus made possible by two styles of overloads, one that	takes a `TimeSpan` and one that takes a `DateTimeOffset`. 
-These are the two most simple overloads that execute an action in the future.
-
-	public static IDisposable Schedule(
-		this IScheduler scheduler, 
-		TimeSpan dueTime, 
-		Action action)
-	{...}
-	public static IDisposable Schedule(
-		this IScheduler scheduler, 
-		DateTimeOffset dueTime, 
-		Action action)
-	{...}
-
-You can use the `TimeSpan` overload like this:
-
-	var delay = TimeSpan.FromSeconds(1);
-	Console.WriteLine("Before schedule at {0:o}", DateTime.Now);
-	scheduler.Schedule(delay, 
-		() => Console.WriteLine("Inside schedule at {0:o}", DateTime.Now));
-	Console.WriteLine("After schedule at  {0:o}", DateTime.Now);
-
-Output:
-
-<div class="output">
-	<div class="line">Before schedule at 2012-01-01T12:00:00.000000+00:00</div>
-	<div class="line">After schedule at 2012-01-01T12:00:00.058000+00:00</div>
-	<div class="line">Inside schedule at 2012-01-01T12:00:01.044000+00:00</div>
-</div>
-
-We can see therefore that scheduling is non-blocking as the 'before' and 'after' calls are very close together in time. 
-You can also see that approximately one second after the action was scheduled, it was invoked.
-
-You can specify a specific point in time to schedule the task with the `DateTimeOffset` overload. 
-If, for some reason, the point in time you specify is in the past, then the action is scheduled as soon as possible.
-
-###Cancelation						{#Cancelation}
-
-Each of the overloads to `Schedule` returns an `IDisposable`; this way, a consumer can cancel the scheduled work. 
-In the previous example, we scheduled work to be invoked in one second. 
-We could cancel that work by disposing of the cancellation token (i.e. the return value).
-
-	var delay = TimeSpan.FromSeconds(1);
-	Console.WriteLine("Before schedule at {0:o}", DateTime.Now);
-	var token = scheduler.Schedule(delay, 
-		() => Console.WriteLine("Inside schedule at {0:o}", DateTime.Now));
-	Console.WriteLine("After schedule at  {0:o}", DateTime.Now);
-	token.Dispose();
-
-Output:
-
-<div class="output">
-	<div class="line">Before schedule at 2012-01-01T12:00:00.000000+00:00</div>
-	<div class="line">After schedule at 2012-01-01T12:00:00.058000+00:00</div>
-</div>
-
-Note that the scheduled action never occurs, as we have cancelled it almost immediately.
-
-When the user cancels the scheduled action method before the scheduler is able to invoke it, that action is just removed from the queue of work. 
-This is what we see in example above. 
-If you want to cancel scheduled work that is already running, then you can use one of the overloads to the `Schedule` method that takes a `Func<IDisposable>`. 
-This gives a way for users to cancel out of a job that may already be running. 
-This job could be some sort of I/O, heavy computations or perhaps usage of `Task` to perform some work.
-
-Now this may create a problem; if you want to cancel work that has already been started, you need to dispose of an instance of `IDisposable`, but how do you return the disposable if you are still doing the work? 
-You could fire up another thread so the work happens concurrently, but creating threads is something we are trying to steer away from.
-
-In this example, we have a method that we will use as the delegate to be scheduled.
-It just fakes some work by performing a spin wait and adding values to the `list` argument. 
-The key here is that we allow the user to cancel with the `CancellationToken` via the disposable we return.
-
-	public IDisposable Work(IScheduler scheduler, List<int> list)
-	{
-		var tokenSource = new CancellationTokenSource();
-		var cancelToken = tokenSource.Token;
-		var task = new Task(() =>
-		{
-			Console.WriteLine();
-			for (int i = 0; i < 1000; i++)
-			{
-				var sw = new SpinWait();
-				for (int j = 0; j < 3000; j++) sw.SpinOnce();
-				Console.Write(".");
-				list.Add(i);
-				if (cancelToken.IsCancellationRequested)
-				{
-					Console.WriteLine("Cancelation requested");
-					//cancelToken.ThrowIfCancellationRequested();
-					return;
-				}
-			}
-		}, cancelToken);
-		task.Start();
-		return Disposable.Create(tokenSource.Cancel);
-	}
-
-This code schedules the above code and allows the user to cancel the processing work by pressing Enter
-
-	var list = new List<int>();
-	Console.WriteLine("Enter to quit:");
-	var token = scheduler.Schedule(list, Work);
-	Console.ReadLine();
-	Console.WriteLine("Cancelling...");
-	token.Dispose();
-	Console.WriteLine("Cancelled");
-
-Output:
-
-<div class="output">
-	<div class="line">Enter to quit:</div>
-	<div class="line">........</div>
-	<div class="line">Cancelling...</div>
-	<div class="line">Cancelled</div>
-	<div class="line">Cancelation requested</div>
-</div>
-
-The problem here is that we have introduced explicit use of `Task`. 
-We can avoid explicit usage of a concurrency model if we use the Rx recursive scheduler features instead.
-
-###Recursion						{#Recursion}
-
-The more advanced overloads of `Schedule` extension methods take some strange looking delegates as parameters. 
-Take special note of the final parameter in each of these overloads of the `Schedule` extension method.
-
-	public static IDisposable Schedule(
-		this IScheduler scheduler, 
-		Action<Action> action)
-	{...}
-	public static IDisposable Schedule<TState>(
-		this IScheduler scheduler, 
-		TState state, 
-		Action<TState, Action<TState>> action)
-	{...}
-	public static IDisposable Schedule(
-		this IScheduler scheduler, 
-		TimeSpan dueTime, 
-		Action<Action<TimeSpan>> action)
-	{...}
-	public static IDisposable Schedule<TState>(
-		this IScheduler scheduler, 
-		TState state, 
-		TimeSpan dueTime, 
-		Action<TState, Action<TState, TimeSpan>> action)
-	{...}
-	public static IDisposable Schedule(
-		this IScheduler scheduler, 
-		DateTimeOffset dueTime, 
-		Action<Action<DateTimeOffset>> action)
-	{...}
-	public static IDisposable Schedule<TState>(
-		this IScheduler scheduler, 
-		TState state, DateTimeOffset dueTime, 
-		Action<TState, Action<TState, DateTimeOffset>> action)
-	{...}   
-
-
-Each of these overloads take a delegate "action" that allows you to call "action" recursively. 
-This may seem a very odd signature, but it makes for a great API. 
-This effectively allows you to create a recursive delegate call. 
-This may be best shown with an example.
-
-This example uses the most simple recursive overload. 
-We have an `Action` that can be called recursively.
-
-	Action<Action> work = (Action self) 
-		=>
-		{
-			Console.WriteLine("Running");
-			self();
-		};
-	var token = s.Schedule(work);
-		
-	Console.ReadLine();
-	Console.WriteLine("Cancelling");
-	token.Dispose();
-	Console.WriteLine("Cancelled");
-
-Output:
-
-<div class="output">
-	<div class="line">Enter to quit:</div>
-	<div class="line">Running</div>
-	<div class="line">Running</div>
-	<div class="line">Running</div>
-	<div class="line">Running</div>
-	<div class="line">Cancelling</div>
-	<div class="line">Cancelled</div>
-	<div class="line">Running</div>
-</div>
-
-Note that we didn't have to write any cancellation code in our delegate. 
-Rx handled the looping and checked for cancellation on our behalf. 
-Brilliant! 
-Unlike simple recursive methods in C#, we are also protected from stack overflows, as Rx provides an extra level of abstraction. 
-Indeed, Rx takes our recursive method and transforms it to a loop structure instead.
-
-####Creating your own iterator		{#CreatingYourOwnIterator}
-
-Earlier in the book, we looked at how we can use [Rx with APM](04_CreatingObservableSequences.html#FromAPM). 
-In our example, we just read the entire file into memory. 
-We also referenced Jeffrey van Gogh's [blog post](http://blogs.msdn.com/b/jeffva/archive/2010/07/23/rx-on-the-server-part-1-of-n-asynchronous-system-io-stream-reading.aspx), which sadly is now out of date; however, his concepts are still sound.
-Instead of the Iterator method from Jeffrey's post, we can use schedulers to achieve the same result.
-
-The goal of the following sample is to open a file and stream it in chunks. 
-This enables us to work with files that are larger than the memory available to us, as we would only ever read and cache a portion of the file at a time. 
-In addition to this, we can leverage the compositional nature of Rx to apply multiple transformations to the file such as encryption and compression. 
-By reading chunks at a time, we are able to start the other transformations before we have finished reading the file.
-
-First, let us refresh our memory with how to get from the `FileStream`'s APM methods into Rx.
-
-	var source = new FileStream(@"C:\Somefile.txt", FileMode.Open, FileAccess.Read);
-	var factory = Observable.FromAsyncPattern<byte[], int, int, int>(
-		source.BeginRead, 
-		source.EndRead);
-	var buffer = new byte[source.Length];
-	IObservable<int> reader = factory(buffer, 0, (int)source.Length);
-	reader.Subscribe(
-		bytesRead => 
-			Console.WriteLine("Read {0} bytes from file into buffer", bytesRead));
-			
-The example above uses `FromAsyncPattern` to create a factory. 
-The factory will take a byte array (`buffer`), an offset (`0`) and a length (`source.Length`); it effectively returns the count of the bytes read as a single-value sequence. 
-When the sequence (`reader`) is subscribed to, `BeginRead` will read values, starting from the offset, into the buffer. 
-In this case, we will read the whole file. 
-Once the file has been read into the buffer, the sequence (`reader`) will push the single value (`bytesRead`) in to the sequence.
-
-This is all fine, but if we want to read chunks of data at a time then this is not good enough. 
-We need to specify the buffer size we want to use. 
-Let's start with 4KB (4096 bytes).
-
-	var bufferSize = 4096;
-	var buffer = new byte[bufferSize];
-	IObservable<int> reader = factory(buffer, 0, bufferSize);
-	reader.Subscribe(
-		bytesRead => 
-			Console.WriteLine("Read {0} bytes from file", bytesRead));
-
-This works but will only read a max of 4KB from the file. 
-If the file is larger, we want to keep reading all of it. 
-As the `Position` of the `FileStream` will have advanced to the point it stopped reading, we can reuse the `factory` to reload the buffer. 
-Next, we want to start pushing these bytes into an observable sequence. 
-Let's start by creating the signature of an extension method.
-
-	public static IObservable<byte> ToObservable(
-		this FileStream source, 
-		int buffersize, 
-		IScheduler scheduler)
-	{...}
-
-We can ensure that our extension method is lazily evaluated by using `Observable.Create`.
-We can also ensure that the `FileStream` is closed when the consumer disposes of the subscription by taking advantage of the `Observable.Using` operator.
-
-	public static IObservable<byte> ToObservable(
-		this FileStream source, 
-		int buffersize, 
-		IScheduler scheduler)
-	{
-		var bytes = Observable.Create<byte>(o =>
-		{
-			...
-		});
-
-		return Observable.Using(() => source, _ => bytes);
-	}
-
-Next, we want to leverage the scheduler's recursive functionality to continuously read chunks of data while still providing the user with the ability to dispose/cancel when they choose. 
-This creates a bit of a pickle; we can only pass in one state parameter but need to manage multiple moving parts (buffer, factory, filestream).
-To do this, we create our own private helper class:
-
-	private sealed class StreamReaderState
-	{
-		private readonly int _bufferSize;
-		private readonly Func<byte[], int, int, IObservable<int>> _factory;
-
-		public StreamReaderState(FileStream source, int bufferSize)
-		{
-			_bufferSize = bufferSize;
-			_factory = Observable.FromAsyncPattern<byte[], int, int, int>(
-				source.BeginRead, 
-				source.EndRead);
-			Buffer = new byte[bufferSize];
-		}
-
-		public IObservable<int> ReadNext()
-		{
-			return _factory(Buffer, 0, _bufferSize);
-		}
-
-		public byte[] Buffer { get; set; }
-	}
-
-This class will allow us to read data into a buffer, then read the next chunk by calling `ReadNext()`. 
-In our `Observable.Create` delegate, we instantiate our helper class and use it to push the buffer into our observable sequence.
-
-	public static IObservable<byte> ToObservable(
-		this FileStream source, 
-		int buffersize, 
-		IScheduler scheduler)
-	{
-		var bytes = Observable.Create<byte>(o =>
-		{
-			var initialState = new StreamReaderState(source, buffersize);
-
-			initialState
-				.ReadNext()
-				.Subscribe(bytesRead =>
-				{
-					for (int i = 0; i < bytesRead; i++)
-					{
-						o.OnNext(initialState.Buffer[i]);
-					}
-				});
-			...
-		});
-
-		return Observable.Using(() => source, _ => bytes);
-	}
-
-So this gets us off the ground, but we are still do not support reading files larger than the buffer. 
-Now, we need to add recursive scheduling. 
-To do this, we need a delegate to fit the required signature. 
-We will need one that accepts a `StreamReaderState` and can recursively call an `Action<StreamReaderState>`.
-
-	public static IObservable<byte> ToObservable(
-		this FileStream source, 
-		int buffersize, 
-		IScheduler scheduler)
-	{
-		var bytes = Observable.Create<byte>(o =>
-		{
-			var initialState = new StreamReaderState(source, buffersize);
-
-			Action<StreamReaderState, Action<StreamReaderState>> iterator;
-			iterator = (state, self) =>
-			{
-				state.ReadNext()
-					 .Subscribe(bytesRead =>
-							{
-								for (int i = 0; i < bytesRead; i++)
-								{
-									o.OnNext(state.Buffer[i]);
-								}
-								self(state);
-							});
-			};
-			return scheduler.Schedule(initialState, iterator);
-		});
-
-		return Observable.Using(() => source, _ => bytes);
-	}
-	
-We now have an `iterator` action that will:
-
- * call `ReadNext()`
- * subscribe to the result
- * push the buffer into the observable sequence
- * and recursively call itself.
-
-We also schedule this recursive action to be called on the provided scheduler. 
-Next, we want to complete the sequence when we get to the end of the file. 
-This is easy, we maintain the recursion until the `bytesRead` is 0.
-
-	public static IObservable<byte> ToObservable(
-		this FileStream source, 
-		int buffersize, 
-		IScheduler scheduler)
-	{
-		var bytes = Observable.Create<byte>(o =>
-		{
-			var initialState = new StreamReaderState(source, buffersize);
-
-			Action<StreamReaderState, Action<StreamReaderState>> iterator;
-			iterator = (state, self) =>
-			{
-				state.ReadNext()
-					 .Subscribe(bytesRead =>
-							{
-								for (int i = 0; i < bytesRead; i++)
-								{
-									o.OnNext(state.Buffer[i]);
-								}
-								if (bytesRead > 0)
-									self(state);
-								else
-									o.OnCompleted();
-							});
-			};
-			return scheduler.Schedule(initialState, iterator);
-		});
-
-		return Observable.Using(() => source, _ => bytes);
-	}
-
-At this point, we have an extension method that iterates on the bytes from a file stream. 
-Finally, let us apply some clean up so that we correctly manage our resources and exceptions, and the finished method looks something like this:
-
-	public static IObservable<byte> ToObservable(
-		this FileStream source, 
-		int buffersize, 
-		IScheduler scheduler)
-	{
-		var bytes = Observable.Create<byte>(o =>
-		{
-			var initialState = new StreamReaderState(source, buffersize);
-			var currentStateSubscription = new SerialDisposable();
-			Action<StreamReaderState, Action<StreamReaderState>> iterator =
-			(state, self) =>
-				currentStateSubscription.Disposable = state.ReadNext()
-					 .Subscribe(
-						bytesRead =>
-						{
-							for (int i = 0; i < bytesRead; i++)
-							{
-								o.OnNext(state.Buffer[i]);
-							}
-
-							if (bytesRead > 0)
-								self(state);
-							else
-								o.OnCompleted();
-						},
-						o.OnError);
-
-			var scheduledWork = scheduler.Schedule(initialState, iterator);
-			return new CompositeDisposable(currentStateSubscription, scheduledWork);
-		});
-
-		return Observable.Using(() => source, _ => bytes);
-	}
-
-This is example code and your mileage may vary. 
-I find that increasing the buffer size and returning `IObservable<IList<byte>>` suits me better, but the example above works fine too. 
-The goal here was to provide an example of an iterator that provides concurrent I/O access with cancellation and resource-efficient buffering.
-
-<!--<a name="ScheduledExceptions"></a>
-<h4>Exceptions from scheduled code</h4>
-<p>
-	TODO:
-</p>-->
-
-####Combinations of scheduler features		{#CombinationsOfSchedulerFeatures}
-
-We have discussed many features that you can use with the `IScheduler` interface.
-Most of these examples, however, are actually using extension methods to invoke the functionality that we are looking for. 
-The interface itself exposes the richest overloads. 
-The extension methods are effectively just making a trade-off; improving usability/discoverability by reducing the richness of the overload. 
-If you want access to passing state, cancellation, future scheduling and recursion, it is all available directly from the interface methods.
-
-	namespace System.Reactive.Concurrency
-	{
-	  public interface IScheduler
-	  {
-		//Gets the scheduler's notion of current time.
-		DateTimeOffset Now { get; }
-
-		// Schedules an action to be executed with given state. 
-		//  Returns a disposable object used to cancel the scheduled action (best effort).
-		IDisposable Schedule<TState>(
-			TState state, 
-			Func<IScheduler, TState, IDisposable> action);
-
-		// Schedules an action to be executed after dueTime with given state. 
-		//  Returns a disposable object used to cancel the scheduled action (best effort).
-		IDisposable Schedule<TState>(
-			TState state, 
-			TimeSpan dueTime, 
-			Func<IScheduler, TState, IDisposable> action);
-
-		//Schedules an action to be executed at dueTime with given state. 
-		//  Returns a disposable object used to cancel the scheduled action (best effort).
-		IDisposable Schedule<TState>(
-			TState state, 
-			DateTimeOffset dueTime, 
-			Func<IScheduler, TState, IDisposable> action);
-	  }
-	}
-	
-##Schedulers in-depth				{#SchedulersIndepth}
-
-We have largely been concerned with the abstract concept of a scheduler and the `IScheduler` interface. 
-This abstraction allows low-level plumbing to remain agnostic towards the implementation of the concurrency model. 
-As in the file reader example above, there was no need for the code to know which implementation of `IScheduler` was passed, as this is a concern of the consuming code.
-
-Now we take an in-depth look at each implementation of `IScheduler`, consider the benefits and tradeoffs they each make, and when each is appropriate to use.
-
-###ImmediateScheduler				{#ImmediateScheduler}
-
-The `ImmediateScheduler` is exposed via the `Scheduler.Immediate` static property. 
-This is the most simple of schedulers as it does not actually schedule anything. 
-If you call `Schedule(Action)` then it will just invoke the action.
-If you schedule the action to be invoked in the future, the `ImmediateScheduler` will invoke a `Thread.Sleep` for the given period of time and then execute the action. 
-In summary, the `ImmediateScheduler` is synchronous.
-
-###CurrentThreadScheduler			{#Current}
-
-Like the `ImmediateScheduler`, the `CurrentThreadScheduler` is single-threaded.
-It is exposed via the `Scheduler.Current` static property. 
-The key difference is that the `CurrentThreadScheduler` acts like a message queue or a _Trampoline_.
-If you schedule an action that itself schedules an action, the `CurrentThreadScheduler` will queue the inner action to be performed later; in contrast, the `ImmediateScheduler` would start working on the inner action straight away. 
-This is probably best explained with an example.
-
-In this example, we analyze how `ImmediateScheduler` and `CurrentThreadScheduler` perform nested scheduling differently.
-
-	private static void ScheduleTasks(IScheduler scheduler)
-	{
-		Action leafAction = () => Console.WriteLine("----leafAction.");
-		Action innerAction = () =>
-		{
-			Console.WriteLine("--innerAction start.");
-			scheduler.Schedule(leafAction);
-			Console.WriteLine("--innerAction end.");
-		};
-		Action outerAction = () =>
-		{
-			Console.WriteLine("outer start.");
-			scheduler.Schedule(innerAction);
-			Console.WriteLine("outer end.");
-		};
-		scheduler.Schedule(outerAction);
-	}
-	public void CurrentThreadExample()
-	{
-		ScheduleTasks(Scheduler.CurrentThread);
-		/*Output: 
-		outer start. 
-		outer end. 
-		--innerAction start. 
-		--innerAction end. 
-		----leafAction. 
-		*/ 
-	}
-	public void ImmediateExample()
-	{
-		ScheduleTasks(Scheduler.Immediate);
-		/*Output: 
-		outer start. 
-		--innerAction start. 
-		----leafAction. 
-		--innerAction end. 
-		outer end. 
-		*/ 
-	}
-
-Note how the `ImmediateScheduler` does not really "schedule" anything at all, all work is performed immediately (synchronously). 
-As soon as `Schedule` is called with a delegate, that delegate is invoked. 
-The `CurrentThreadScheduler`, however, invokes the first delegate, and, when nested delegates are scheduled, queues them to be invoked later. 
-Once the initial delegate is complete, the queue is checked for any remaining delegates (i.e. nested calls to `Schedule`) and they are invoked. 
-The difference here is quite important as you can potentially get out-of-order execution, unexpected blocking, or even deadlocks by using the wrong one.
-
-###DispatcherScheduler				{#Dispatcher}
-
-The `DispatcherScheduler` is found in `System.Reactive.Window.Threading.dll` (for WPF, Silverlight 4 and Silverlight 5). 
-When actions are scheduled using the `DispatcherScheduler`, they are effectively marshaled to the `Dispatcher`'s `BeginInvoke` method. 
-This will add the action to the end of the dispatcher's _Normal_ priority queue of work. 
-This provides similar queuing semantics to the `CurrentThreadScheduler` for nested calls to `Schedule`.
-
-When an action is scheduled for future work, then a `DispatcherTimer` is created with a matching interval. 
-The callback for the timer's tick will stop the timer and re-schedule the work onto the `DispatcherScheduler`. 
-If the `DispatcherScheduler` determines that the `dueTime` is actually not in the future then no timer is created, and the action will just be scheduled normally.
-
-
-I would like to highlight a hazard of using the `DispatcherScheduler`. 
-You can construct your own instance of a `DispatcherScheduler` by passing in a reference to a `Dispatcher`. 
-The alternative way is to use the static property `DispatcherScheduler.Instance`. 
-This can introduce hard to understand problems if it is not used properly. 
-The static property does not return a reference to a static field, but creates a new instance each time, with the static property `Dispatcher.CurrentDispatcher` as the constructor argument. 
-If you access `Dispatcher.CurrentDispatcher` from a thread that is not the UI thread, it will thus give you a new instance of a `Dispatcher`, but it will not be the instance you were hoping for.
-
-For example, imagine that we have a WPF application with an `Observable.Create` method. 
-In the delegate that we pass to `Observable.Create`, we want to schedule the notifications on the dispatcher. 
-We think this is a good idea because any consumers of the sequence would get the notifications on the dispatcher for free.
-
-	var fileLines = Observable.Create<string>(
-		o =>
-		{
-			var dScheduler = DispatcherScheduler.Instance;
-			var lines = File.ReadAllLines(filePath);
-			foreach (var line in lines)
-			{
-				var localLine = line;
-				dScheduler.Schedule(
-					() => o.OnNext(localLine));
-			}
-			return Disposable.Empty;
-		});
-
-This code may intuitively seem correct, but actually takes away power from consumers of the sequence. 
-When we subscribe to the sequence, we decide that reading a file on the UI thread is a bad idea. 
-So we add in a `SubscribeOn(Scheduler.NewThread)` to the chain as below:
-
-	fileLines
-		.SubscribeOn(Scheduler.ThreadPool)
-		.Subscribe(line => Lines.Add(line));
-
-This causes the create delegate to be executed on a new thread. 
-The delegate will read the file then get an instance of a `DispatcherScheduler`. 
-The `DispatcherScheduler` tries to get the `Dispatcher` for the current thread, but we are no longer on the UI thread, so there isn't one. 
-As such, it creates a new dispatcher that is used for the `DispatcherScheduler` instance. 
-We schedule some work (the notifications), but, as the underlying `Dispatcher` has not been run, nothing happens; we do not even get an exception. 
-I have seen this on a commercial project and it left quite a few people scratching their heads.
-
-This takes us to one of our guidelines regarding scheduling: 
-<q>the use of `SubscribeOn` and `ObserveOn` should only be invoked by the final subscriber</q>. 
-If you introduce scheduling in your own extension methods or service methods, you should allow the consumer to specify their own scheduler. 
-We will see more reasons for this guidance in the next chapter.
-
-###EventLoopScheduler				{#EventLoopScheduler}
-
-The `EventLoopScheduler` allows you to designate a specific thread to a scheduler.
-Like the `CurrentThreadScheduler` that acts like a trampoline for nested scheduled actions, the `EventLoopScheduler` provides the same trampoline mechanism. 
-The difference is that you provide an `EventLoopScheduler` with the thread you want it to use for scheduling instead, of just picking up the current thread.
-
-The `EventLoopScheduler` can be created with an empty constructor, or you can pass it a thread factory delegate.
-
-	// Creates an object that schedules units of work on a designated thread.
-	public EventLoopScheduler()
-	{...}
-
-	// Creates an object that schedules units of work on a designated thread created by the 
-	//  provided factory function.
-	public EventLoopScheduler(Func&lt;ThreadStart, Thread> threadFactory)
-	{...}
-
-The overload that allows you to pass a factory enables you to customize the thread before it is assigned to the `EventLoopScheduler`. 
-For example, you can set the thread name, priority, culture and most importantly whether the thread is a background thread or not. 
-Remember that if you do not set the thread's property `IsBackground` to false, then your application will not terminate until it the thread is terminated. 
-The `EventLoopScheduler` implements `IDisposable`, and calling Dispose will allow the thread to terminate. 
-As with any implementation of `IDisposable`, it is appropriate that you explicitly manage the lifetime of the resources you create.
-
-This can work nicely with the `Observable.Using` method, if you are so inclined.
-This allows you to bind the lifetime of your `EventLoopScheduler` to that of an observable sequence - for example, this `GetPrices` method that takes an `IScheduler` for an argument and returns an observable sequence.
-
-	private IObservable&lt;Price> GetPrices(IScheduler scheduler)
-	{...}
-
-Here we bind the lifetime of the `EventLoopScheduler` to that of the result from the `GetPrices` method.
-
-	Observable.Using(()=>new EventLoopScheduler(), els=> GetPrices(els))
-			.Subscribe(...)
-
-###New Thread						{#NewThread}
-
-If you do not wish to manage the resources of a thread or an `EventLoopScheduler`, then you can use `NewThreadScheduler`. 
-You can create your own instance of `NewThreadScheduler` or get access to the static instance via the property `Scheduler.NewThread`. 
-Like `EventLoopScheduler`, you can use the parameterless constructor or provide your own thread factory function. 
-If you do provide your own factory, be careful to set the `IsBackground` property appropriately.
-
-When you call `Schedule` on the `NewThreadScheduler`, you are actually creating an `EventLoopScheduler` under the covers. 
-This way, any nested scheduling will happen on the same thread. 
-Subsequent (non-nested) calls to `Schedule` will create a new `EventLoopScheduler` and call the thread factory function for a new thread too.
-
-In this example we run a piece of code reminiscent of our comparison between `Immediate` and `Current` schedulers. 
-The difference here, however, is that we track the `ThreadId` that the action is performed on. 
-We use the `Schedule` overload that allows us to pass the Scheduler instance into our nested delegates.
-This allows us to correctly nest calls.
-
-	private static IDisposable OuterAction(IScheduler scheduler, string state)
-	{
-		Console.WriteLine("{0} start. ThreadId:{1}", 
-			state, 
-			Thread.CurrentThread.ManagedThreadId);
-		scheduler.Schedule(state + ".inner", InnerAction);
-		Console.WriteLine("{0} end. ThreadId:{1}", 
-			state, 
-			Thread.CurrentThread.ManagedThreadId);
-		return Disposable.Empty;
-	}
-	private static IDisposable InnerAction(IScheduler scheduler, string state)
-	{
-		Console.WriteLine("{0} start. ThreadId:{1}", 
-			state, 
-			Thread.CurrentThread.ManagedThreadId);
-		scheduler.Schedule(state + ".Leaf", LeafAction);
-		Console.WriteLine("{0} end. ThreadId:{1}", 
-			state, 
-			Thread.CurrentThread.ManagedThreadId);
-		return Disposable.Empty;
-	}
-	private static IDisposable LeafAction(IScheduler scheduler, string state)
-	{
-		Console.WriteLine("{0}. ThreadId:{1}", 
-			state, 
-			Thread.CurrentThread.ManagedThreadId);
-		return Disposable.Empty;
-	}
-
-When executed with the `NewThreadScheduler` like this:
-
-	Console.WriteLine("Starting on thread :{0}", 
-		Thread.CurrentThread.ManagedThreadId);
-	Scheduler.NewThread.Schedule("A", OuterAction);
-
-Output:
-
-<div class="output">
-	<div class="line">Starting on thread :9</div>
-	<div class="line">A start. ThreadId:10</div>
-	<div class="line">A end. ThreadId:10</div>
-	<div class="line">A.inner start . ThreadId:10</div>
-	<div class="line">A.inner end. ThreadId:10</div>
-	<div class="line">A.inner.Leaf. ThreadId:10</div>
-</div>
-
-As you can see, the results are very similar to the `CurrentThreadScheduler`, except that the trampoline happens on a separate thread. 
-This is in fact exactly the output we would get if we used an `EventLoopScheduler`. 
-The differences between usages of the `EventLoopScheduler` and the `NewThreadScheduler`	start to appear when we introduce a second (non-nested) scheduled task.
-
-	Console.WriteLine("Starting on thread :{0}", 
-		Thread.CurrentThread.ManagedThreadId);
-	Scheduler.NewThread.Schedule("A", OuterAction);
-	Scheduler.NewThread.Schedule("B", OuterAction);
-
-Output:
-
-<div class="output">
-	<div class="line">Starting on thread :9</div>
-	<div class="line">A start. ThreadId:10</div>
-	<div class="line">A end. ThreadId:10</div>
-	<div class="line">A.inner start . ThreadId:10</div>
-	<div class="line">A.inner end. ThreadId:10</div>
-	<div class="line">A.inner.Leaf. ThreadId:10</div>
-	<div class="line">B start. ThreadId:11</div>
-	<div class="line">B end. ThreadId:11</div>
-	<div class="line">B.inner start . ThreadId:11</div>
-	<div class="line">B.inner end. ThreadId:11</div>
-	<div class="line">B.inner.Leaf. ThreadId:11</div>
-</div>
-
-Note that there are now three threads at play here. 
-Thread 9 is the thread we started on and threads 10 and 11 are performing the work for our two calls to Schedule.
-
-###Thread Pool						{#ThreadPool}
-
-The `ThreadPoolScheduler` will simply just tunnel requests to the `ThreadPool`.
-For requests that are scheduled as soon as possible, the action is just sent to `ThreadPool.QueueUserWorkItem`. 
-For requests that are scheduled in the future, a `System.Threading.Timer` is used.
-
-As all actions are sent to the `ThreadPool`, actions can potentially run out of order. 
-Unlike the previous schedulers we have looked at, nested calls are not guaranteed to be processed serially. 
-We can see this by running the same test as above but with the `ThreadPoolScheduler`.
-
-	Console.WriteLine("Starting on thread :{0}", 
-		Thread.CurrentThread.ManagedThreadId);
-	Scheduler.ThreadPool.Schedule("A", OuterAction);
-	Scheduler.ThreadPool.Schedule("B", OuterAction);
-
-The output
-
-<div class="output">
-	<div class="line">Starting on thread :9</div>
-	<div class="line">A start. ThreadId:10</div>
-	<div class="line">A end. ThreadId:10</div>
-	<div class="line">A.inner start . ThreadId:10</div>
-	<div class="line">A.inner end. ThreadId:10</div>
-	<div class="line">A.inner.Leaf. ThreadId:10</div>
-	<div class="line">B start. ThreadId:11</div>
-	<div class="line">B end. ThreadId:11</div>
-	<div class="line">B.inner start . ThreadId:10</div>
-	<div class="line">B.inner end. ThreadId:10</div>
-	<div class="line">B.inner.Leaf. ThreadId:11</div>
-</div>
-
-Note, that as per the `NewThreadScheduler` test, we initially start on one thread but all the scheduling happens on two other threads. 
-The difference is that we can see that part of the second run "B" runs on thread 11 while another part of it runs on 10.
-
-###TaskPool							{#TaskPool}
-
-The `TaskPoolScheduler` is very similar to the `ThreadPoolScheduler` and, when available (depending on your target framework), you should favor it over	the later. 
-Like the `ThreadPoolScheduler`, nested scheduled actions are not guaranteed to be run on the same thread. 
-Running the same test with the `TaskPoolScheduler` shows us similar results.
-
-	Console.WriteLine("Starting on thread :{0}", 
-		Thread.CurrentThread.ManagedThreadId);
-	Scheduler.TaskPool.Schedule("A", OuterAction);
-	Scheduler.TaskPool.Schedule("B", OuterAction);
-
-Output:
-
-<div class="output">
-	<div class="line">Starting on thread :9</div>
-	<div class="line">A start. ThreadId:10</div>
-	<div class="line">A end. ThreadId:10</div>
-	<div class="line">B start. ThreadId:11</div>
-	<div class="line">B end. ThreadId:11</div>
-	<div class="line">A.inner start . ThreadId:10</div>
-	<div class="line">A.inner end. ThreadId:10</div>
-	<div class="line">A.inner.Leaf. ThreadId:10</div>
-	<div class="line">B.inner start . ThreadId:11</div>
-	<div class="line">B.inner end. ThreadId:11</div>
-	<div class="line">B.inner.Leaf. ThreadId:10</div>
-</div>
-
-###TestScheduler					{#TestScheduler}
-
-It is worth noting that there is also a `TestScheduler` accompanied by its base classes `VirtualTimeScheduler` and `VirtualTimeSchedulerBase`.
-The latter two are not really in the scope of an introduction to Rx, but the former is. 
-We will cover all things testing including the `TestScheduler` in the next chapter, [Testing Rx](16_TestingRx.html).
-
-##Selecting an appropriate scheduler	{#SelectingAScheduler}
-
-With all of these options to choose from, it can be hard to know which scheduler to use and when. 
-Here is a simple check list to help you in this daunting task:
-
-###UI Applications					{#UIApplications}
-
- * The final subscriber is normally the presentation layer and should control the scheduling.
- * Observe on the `DispatcherScheduler` to allow updating of ViewModels
- * Subscribe on a background thread to prevent the UI from becoming unresponsive
-	* If the subscription will not block for more than 50ms then
-		* Use the `TaskPoolScheduler` if available, or
-		* Use the `ThreadPoolScheduler`
-	* If any part of the subscription could block for longer than 50ms, then you should	use the `NewThreadScheduler`. 
-
-###Service layer					{#ServiceLayer}
-
- * If your service is reading data from a queue of some sort, consider using a dedicated `EventLoopScheduler`. 
-This way, you can preserve order of events
- * If processing an item is expensive (>50ms or requires I/O), then consider using a `NewThreadScheduler`
- * If you just need the scheduler for a timer, e.g. for `Observable.Interval` or `Observable.Timer`, then favor the `TaskPool`. 
-Use the `ThreadPool` if the `TaskPool` is not available for your platform.
-
-
-<p class="comment">
-	The `ThreadPool` (and the `TaskPool` by proxy) have a time delay before	they will increase the number of threads that they use. 
-	This delay is 500ms. 
-	Let	us consider a PC with two cores that we will schedule four actions onto. 
-	By default,	the thread pool size will be the number of cores (2). 
-	If each action takes 1000ms, then two actions will be sitting in the queue for 500ms before the thread pool size is increased. 
-	Instead of running all four actions in parallel, which would take one second in total, the work is not completed for 1.5 seconds as two of the actions sat in the queue for 500ms. 
-	For this reason, you should only schedule work that	is very fast to execute (guideline 50ms) onto the ThreadPool or TaskPool. 
-	Conversely,	creating a new thread is not free, but with the power of processors today the creation of a thread for work over 50ms is a small cost.
-</p>
-
-Concurrency is hard. 
-We can choose to make our life easier by taking advantage of Rx and its scheduling features. 
-We can improve it even further by only using Rx where appropriate.
-While Rx has concurrency features, these should not be mistaken for a concurrency framework. 
-Rx is designed for querying data, and as discussed in [the first chapter](01_WhyRx.html#Could), parallel computations or composition of asynchronous methods is more appropriate for other frameworks.
-
-Rx solves the issues for concurrently generating and consuming data via the `ObserveOn`/`SubscribeOn` methods. 
-By using these appropriately, we can simplify our code base, increase responsiveness and reduce the surface area of our concurrency concerns. 
-Schedulers provide a rich platform for processing work concurrently without the need to be exposed directly to threading primitives. 
-They also help with common troublesome areas of concurrency such as cancellation, passing state and recursion. 
-By reducing the concurrency surface area, Rx provides a (relatively) simple yet powerful set of concurrency features paving the way to the [pit of success](http://blogs.msdn.com/b/brada/archive/2003/10/02/50420.aspx).
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<!--Concurrent Programming on Windows: Architecture, Principles, and Patterns (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B0015DYKI4&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Parallel Programming with Microsoft® .NET: Design Patterns for Decomposition and Coordination on Multicore Architectures (Patterns & Practices) (Kindle) Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B0043EWUG6&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-	</div>
</div>

+ 717 - 846
Rx.NET/Documentation/IntroToRx/16_TestingRx.md

@@ -1,846 +1,717 @@
----
-title: Testing Rx
----
-
-#Testing Rx							{#TestingRx}
-
-Testing software has its roots in debugging and demonstrating code. 
-Having largely matured past manual tests that try to "break the application", modern quality assurance standards demand a level of automation that can help evaluate and prevent bugs.
-While teams of testing specialists are common, more and more coders are expected to provide quality guarantees via automated test suites.
-
-Up to this point, we have covered a broad scope of Rx, and we have almost enough knowledge to start using Rx in anger! 
-Still, many developers would not dream of coding without first being able to write tests. 
-Tests can be used to prove that code is in fact satisfying requirements, provide a safety net against regression and can even help document the code. 
-This chapter makes the assumption that you are familiar with the concepts of dependency injection and unit testing with test-doubles, such as mocks or stubs.
-
-Rx poses some interesting problems to our Test-Driven community:
-
- * Scheduling, and therefore threading, is generally avoided in test scenarios as it can introduce race conditions which may lead to non-deterministic tests
- * Tests should run as fast as possible
- * For many, Rx is a new technology/library. 
-Naturally, as we progress on our journey to mastering Rx, we may want to refactor some of our previous Rx code. 
-We want to use tests to ensure that our refactoring has not altered the internal behavior of our code base
- * Likewise, tests will ensure nothing breaks when we upgrade versions of Rx.
-
-While we do want to test our code, we don't want to introduce slow or non-deterministic tests; indeed, the later would introduce false-negatives or false-positives. 
-If we look at the Rx library, there are plenty of methods that involve scheduling (implicitly or explicitly), so using Rx effectively makes it hard to avoid scheduling. 
-This LINQ query shows us that there are at least 26 extension methods that accept an `IScheduler` as a parameter.
-
-
-	var query = from method in typeof(Observable).GetMethods()
-				from parameter in method.GetParameters()
-				where typeof (IScheduler).IsAssignableFrom(parameter.ParameterType)
-				group method by method.Name into m
-				orderby m.Key
-				select m.Key;
-	foreach (var methodName in query)
-	{
-		Console.WriteLine(methodName);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Buffer</div>
-	<div class="line">Delay</div>
-	<div class="line">Empty</div>
-	<div class="line">Generate</div>
-	<div class="line">Interval</div>
-	<div class="line">Merge</div>
-	<div class="line">ObserveOn</div>
-	<div class="line">Range</div>
-	<div class="line">Repeat</div>
-	<div class="line">Replay</div>
-	<div class="line">Return</div>
-	<div class="line">Sample</div>
-	<div class="line">Start</div>
-	<div class="line">StartWith</div>
-	<div class="line">Subscribe</div>
-	<div class="line">SubscribeOn</div>
-	<div class="line">Take</div>
-	<div class="line">Throttle</div>
-	<div class="line">Throw</div>
-	<div class="line">TimeInterval</div>
-	<div class="line">Timeout</div>
-	<div class="line">Timer</div>
-	<div class="line">Timestamp</div>
-	<div class="line">ToAsync</div>
-	<div class="line">ToObservable</div>
-	<div class="line">Window</div>
-</div>
-
-Many of these methods also have an overload that does not take an `IScheduler` and instead uses a default instance. 
-TDD/Test First coders will want to opt for the overload that accepts the `IScheduler`, so that they can have some control over scheduling in our tests. 
-I will explain why soon.
-
-Consider this example, where we create a sequence that publishes values every second for five seconds.
-
-	var interval = Observable
-		.Interval(TimeSpan.FromSeconds(1))
-		.Take(5);
-
-If we were to write a test that ensured that we received five values and they were each one second apart, it would take five seconds to run. 
-That would be no good; I want hundreds if not thousands of tests to run in five seconds. 
-Another very common requirement is to test a timeout. 
-Here, we try to test a timeout of one minute.
-
-	var never = Observable.Never<int>();
-	var exceptionThrown = false;
-	never.Timeout(TimeSpan.FromMinutes(1))
-		.Subscribe(
-			i => Console.WriteLine("This will never run."),
-			ex => exceptionThrown = true);
-	Assert.IsTrue(exceptionThrown);
-
-We have two problems here:
-
- * either the `Assert` runs too soon, and the test is pointless as it always fails, or
- * we have to add a delay of one minute to perform an accurate test
-
-For this test to be useful, it would therefore take one minute to run. 
-Unit tests that take one minute to run are not acceptable.
-
-##TestScheduler						{#TestScheduler}
-
-To our rescue comes the `TestScheduler`; it introduces the concept of a virtual scheduler to allow us to emulate and control time.
-
-A virtual scheduler can be conceptualized as a queue of actions to be executed.
-Each are assigned a point in time when they should be executed. 
-We use the `TestScheduler` as a substitute, or [test double](http://xunitpatterns.com/Test%20Double.html), for the production `IScheduler` types. 
-Using this virtual scheduler, we can either execute all queued actions, or only those up to a specified point in time.
-
-In this example, we schedule a task onto the queue to be run immediately by using the simple overload (`Schedule(Action)`). 
-We then advance the virtual clock forward by one tick. 
-By doing so, we execute everything scheduled up to that point in time. 
-Note that even though we schedule an action to be executed immediately, it will not actually be executed until the clock is manually advanced.
-
-	var scheduler = new TestScheduler();
-	var wasExecuted = false;
-	scheduler.Schedule(() => wasExecuted = true);
-	Assert.IsFalse(wasExecuted);
-	scheduler.AdvanceBy(1); //execute 1 tick of queued actions
-	Assert.IsTrue(wasExecuted);
-
-<p class="comment">
-	Running and debugging this example may help you to better understand the basics	of the `TestScheduler`.
-</p>
-
-The `TestScheduler` implements the `IScheduler` interface (naturally) and also extends it to allow us to control and monitor virtual time. 
-We are already familiar with the `IScheduler.Schedule` methods, however the `AdvanceBy(long)`, `AdvanceTo(long)` and `Start()` methods unique to the `TestScheduler` are of most interest. 
-Likewise, the `Clock` property will also be of interest, as it can help us understand what is happening internally.
-
-	public class TestScheduler : ...
-	{
-		//Implementation of IScheduler
-		public DateTimeOffset Now { get; }
-		public IDisposable Schedule<TState>(
-			TState state, 
-			Func<IScheduler, TState, IDisposable> action)
-		public IDisposable Schedule<TState>(
-			TState state, 
-			TimeSpan dueTime, 
-			Func<IScheduler, TState, IDisposable> action)
-		public IDisposable Schedule<TState>(
-			TState state, 
-			DateTimeOffset dueTime, 
-			Func<IScheduler, TState, IDisposable> action)
-
-		//Useful extensions for testing
-		public bool IsEnabled { get; private set; }
-		public TAbsolute Clock { get; protected set; }
-		public void Start()
-		public void Stop()
-		public void AdvanceTo(long time)
-		public void AdvanceBy(long time)
-		
-		//Other methods
-		...
-	}
-
-###AdvanceTo						{#AdvanceTo}
-
-The `AdvanceTo(long)` method will execute all the actions that have been scheduled up to the absolute time specified. 
-The `TestScheduler` uses ticks as its measurement of time. 
-In this example, we schedule actions to be invoked now, in 10 ticks, and in 20 ticks.
-
-	var scheduler = new TestScheduler();
-	scheduler.Schedule(() => Console.WriteLine("A")); //Schedule immediately
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
-	scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
-
-	Console.WriteLine("scheduler.AdvanceTo(1);");
-	scheduler.AdvanceTo(1);
-	Console.WriteLine("scheduler.AdvanceTo(10);");
-	scheduler.AdvanceTo(10);
-	Console.WriteLine("scheduler.AdvanceTo(15);");
-	scheduler.AdvanceTo(15);
-	Console.WriteLine("scheduler.AdvanceTo(20);");
-	scheduler.AdvanceTo(20);
-
-Output:
-
-<div class="output">
-	<div class="line">scheduler.AdvanceTo(1);</div>
-	<div class="line">A</div>
-	<div class="line">scheduler.AdvanceTo(10);</div>
-	<div class="line">B</div>
-	<div class="line">scheduler.AdvanceTo(15);</div>
-	<div class="line">scheduler.AdvanceTo(20);</div>
-	<div class="line">C</div>
-</div>
-
-Note that nothing happened when we advanced to 15 ticks. 
-All work scheduled before 15 ticks had been performed and we had not advanced far enough yet to get to the next scheduled action.
-
-
-###AdvanceBy						{#AdvanceBy}
-    
-The `AdvanceBy(long)` method allows us to move the clock forward a relative amount of time. 
-Again, the measurements are in ticks. 
-We can take the last example and modify it to use `AdvanceBy(long)`.
-
-	var scheduler = new TestScheduler();
-	scheduler.Schedule(() => Console.WriteLine("A")); //Schedule immediately
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
-	scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
-
-	Console.WriteLine("scheduler.AdvanceBy(1);");
-	scheduler.AdvanceBy(1);
-	Console.WriteLine("scheduler.AdvanceBy(9);");
-	scheduler.AdvanceBy(9);
-	Console.WriteLine("scheduler.AdvanceBy(5);");
-	scheduler.AdvanceBy(5);
-	Console.WriteLine("scheduler.AdvanceBy(5);");
-	scheduler.AdvanceBy(5);
-
-Output:
-<div class="output">
-	<div class="line">scheduler.AdvanceBy(1);</div>
-	<div class="line">A</div>
-	<div class="line">scheduler.AdvanceBy(9);</div>
-	<div class="line">B</div>
-	<div class="line">scheduler.AdvanceBy(5);</div>
-	<div class="line">scheduler.AdvanceBy(5);</div>
-	<div class="line">C</div>
-</div>
-
-###Start							{#Start}
-    
-The `TestScheduler`'s `Start()` method is an effective way to execute everything that has been scheduled. 
-We take the same example again and swap out the `AdvanceBy(long)` calls for a single `Start()` call.
-
-	var scheduler = new TestScheduler();
-	scheduler.Schedule(() => Console.WriteLine("A")); //Schedule immediately
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
-	scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
-
-	Console.WriteLine("scheduler.Start();");
-	scheduler.Start();
-	Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
-
-Output:
-
-<div class="output">
-	<div class="line">scheduler.Start();</div>
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">C</div>
-	<div class="line">scheduler.Clock:20</div>
-</div>
-
-Note that once all of the scheduled actions have been executed, the virtual clock matches our last scheduled item (20 ticks).
-
-We further extend our example by scheduling a new action to happen after `Start()` has already been called.
-
-	var scheduler = new TestScheduler();
-	scheduler.Schedule(() => Console.WriteLine("A"));
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
-	scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
-
-	Console.WriteLine("scheduler.Start();");
-	scheduler.Start();
-	Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
-	
-	scheduler.Schedule(() => Console.WriteLine("D"));
-
-Output:
-
-<div class="output">
-	<div class="line">scheduler.Start();</div>
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">C</div>
-	<div class="line">scheduler.Clock:20</div>
-</div>
-
-Note that the output is exactly the same; If we want our fourth action to be executed, we will have to call `Start()` again.
-
-###Stop								{#Stop}
-
-In previous releases of Rx, the `Start()` method was called `Run()`.
-Now there is a `Stop()` method whose name seems to imply some symmetry with	`Start()`. 
-All it does however, is set the `IsEnabled` property to	false. 
-This property is used as an internal flag to check whether the internal queue of actions should continue being executed. 
-The processing of the queue may indeed be instigated by `Start()`, however `AdvanceTo` or `AdvanceBy` can be used too.
-
-In this example, we show how you could use `Stop()` to pause processing of scheduled actions.
-
-	var scheduler = new TestScheduler();
-	scheduler.Schedule(() => Console.WriteLine("A"));
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
-	scheduler.Schedule(TimeSpan.FromTicks(15), scheduler.Stop);
-	scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
-
-	Console.WriteLine("scheduler.Start();");
-	scheduler.Start();
-	Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
-
-Output:
-<div class="output">
-	<div class="line">scheduler.Start();</div>
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">scheduler.Clock:15</div>
-</div>
-
-Note that "C" never gets printed as we stop the clock at 15 ticks. 
-I have been testing Rx successfully for nearly two years now, yet I have not found the need to use the `Stop()` method. 
-I imagine that there are cases that warrant its use; however I just wanted to make the point that you do not have to be concerned about the lack of use of it in your tests.
-
-###Schedule collisions				{#ScheduleCollisions}
-
-When scheduling actions, it is possible and even likely that many actions will be scheduled for the same point in time. 
-This most commonly would occur when scheduling multiple actions for _now_. 
-It could also happen that there are multiple actions scheduled for the same point in the future. 
-The `TestScheduler` has a simple way to deal with this. 
-When actions are scheduled, they are marked with the clock time they are scheduled for. 
-If multiple items are scheduled for the same point in time, they are queued in order that they were scheduled; when the clock advances, all items for that point in time are executed in the order that they were scheduled.
-
-	var scheduler = new TestScheduler();
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("A"));
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
-	scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("C"));
-
-	Console.WriteLine("scheduler.Start();");
-	scheduler.Start();
-	Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
-
-Output:
-
-<div class="output">
-	<div class="line">scheduler.AdvanceTo(10);</div>
-	<div class="line">A</div>
-	<div class="line">B</div>
-	<div class="line">C</div>
-	<div class="line">scheduler.Clock:10</div>
-</div>
-
-Note that the virtual clock is at 10 ticks, the time we advanced to.
-
-##Testing Rx code					{#TestingRxCode}
-
-Now that we have learnt a little bit about the `TestScheduler`, let's look at how we could use it to test our two initial code snippets that use `Interval` and `Timeout`. 
-We want to execute tests as fast as possible but still maintain the semantics of time. 
-In this example we generate our five values one second apart but pass in our `TestScheduler` to the `Interval` method to use instead of the default scheduler.
-
-	[TestMethod]
-	public void Testing_with_test_scheduler()
-	{
-		var expectedValues = new long[] {0, 1, 2, 3, 4};
-		var actualValues = new List<long>();
-		var scheduler = new TestScheduler();
-
-		var interval = Observable
-			.Interval(TimeSpan.FromSeconds(1), scheduler)
-			.Take(5);
-		interval.Subscribe(actualValues.Add);
-
-		scheduler.Start();
-		CollectionAssert.AreEqual(expectedValues, actualValues);
-		//Executes in less than 0.01s "on my machine"
-	}
-
-While this is mildly interesting, what I think is more important is how we would test a real piece of code. 
-Imagine, if you will, a ViewModel that subscribes to a stream of prices. 
-As prices are published, it adds them to a collection. 
-Assuming this is a WPF or Silverlight implementation, we take the liberty of enforcing that	the subscription be done on the `ThreadPool` and the observing is executed on the `Dispatcher`.
-
-	public class MyViewModel : IMyViewModel
-	{
-		private readonly IMyModel _myModel;
-		private readonly ObservableCollection<decimal> _prices;
-
-		public MyViewModel(IMyModel myModel)
-		{
-			_myModel = myModel;
-			_prices = new ObservableCollection<decimal>();
-		}
-
-		public void Show(string symbol)
-		{
-			//TODO: resource mgt, exception handling etc...
-			_myModel.PriceStream(symbol)
-					.SubscribeOn(Scheduler.ThreadPool)
-					.ObserveOn(Scheduler.Dispatcher)
-					.Timeout(TimeSpan.FromSeconds(10), Scheduler.ThreadPool)
-					.Subscribe(
-						Prices.Add,
-						ex=>
-							{
-								if(ex is TimeoutException)
-									IsConnected = false;
-							});
-			IsConnected = true;
-		}
-
-		public ObservableCollection<decimal> Prices
-		{
-			get { return _prices; }
-		}
-
-		public bool IsConnected { get; private set; }
-	}
-	
-###Injecting scheduler dependencies	{#SchedulerDI}
-
-While the snippet of code above may do what we want it to, it will be hard to test as it is accessing the schedulers via static properties. 
-To help my testing, I have created my own interface that exposes the same `IScheduler` implementations that the `Scheduler` type does, i suggest you adopt this interface too.
-
-	public interface ISchedulerProvider
-	{
-		IScheduler CurrentThread { get; }
-		IScheduler Dispatcher { get; }
-		IScheduler Immediate { get; }
-		IScheduler NewThread { get; }
-		IScheduler ThreadPool { get; }
-		//IScheduler TaskPool { get; } 
-	}
-
-Whether the `TaskPool` property should be included or not depends on your target platform. 
-If you adopt this concept, feel free to name this type in accordance with your naming conventions e.g. `SchedulerService`, `Schedulers`.
-The default implementation that we would run in production is implemented as follows:
-
-	public sealed class SchedulerProvider : ISchedulerProvider
-	{
-		public IScheduler CurrentThread 
-		{ 
-			get { return Scheduler.CurrentThread; } 
-		}
-		public IScheduler Dispatcher 
-		{ 
-			get { return DispatcherScheduler.Instance; }
-		}
-		public IScheduler Immediate 
-		{ 
-			get { return Scheduler.Immediate; } 
-		}
-		public IScheduler NewThread 
-		{ 
-			get { return Scheduler.NewThread; } 
-		}
-		public IScheduler ThreadPool 
-		{ 
-			get { return Scheduler.ThreadPool; } 
-		}
-		//public IScheduler TaskPool { get { return Scheduler.TaskPool; } } 
-	}
-
-This now allows me to substitute implementations of `ISchedulerProvider` to help with testing.
-I could mock the `ISchedulerProvider`, but I find it easier to provide a test implementation. 
-My implementation for testing is as follows.
-
-	public sealed class TestSchedulers : ISchedulerProvider
-	{
-		private readonly TestScheduler _currentThread = new TestScheduler();
-		private readonly TestScheduler _dispatcher = new TestScheduler();
-		private readonly TestScheduler _immediate = new TestScheduler();
-		private readonly TestScheduler _newThread = new TestScheduler();
-		private readonly TestScheduler _threadPool = new TestScheduler();
-		#region Explicit implementation of ISchedulerService
-		IScheduler ISchedulerProvider.CurrentThread { get { return _currentThread; } }
-		IScheduler ISchedulerProvider.Dispatcher { get { return _dispatcher; } }
-		IScheduler ISchedulerProvider.Immediate { get { return _immediate; } }
-		IScheduler ISchedulerProvider.NewThread { get { return _newThread; } }
-		IScheduler ISchedulerProvider.ThreadPool { get { return _threadPool; } }
-		#endregion
-		public TestScheduler CurrentThread { get { return _currentThread; } }
-		public TestScheduler Dispatcher { get { return _dispatcher; } }
-		public TestScheduler Immediate { get { return _immediate; } }
-		public TestScheduler NewThread { get { return _newThread; } }
-		public TestScheduler ThreadPool { get { return _threadPool; } }
-	}
-
-Note that `ISchedulerProvider` is implemented explicitly. 
-This means that, in our tests, we can access the `TestScheduler` instances directly, but our system under test (SUT) still just sees the interface implementation. 
-I can now write some tests for my ViewModel. 
-Below, we test a modified version of the `MyViewModel` class that takes an `ISchedulerProvider` and uses that instead of the static schedulers from the `Scheduler` class. 
-We also use the popular [Moq](http://code.google.com/p/moq) framework in order to mock out our model.
-
-	[TestInitialize]
-	public void SetUp()
-	{
-		_myModelMock = new Mock<IMyModel>();
-		_schedulerProvider = new TestSchedulers();
-		_viewModel = new MyViewModel(_myModelMock.Object, _schedulerProvider);
-	}
-
-	[TestMethod]
-	public void Should_add_to_Prices_when_Model_publishes_price()
-	{
-		decimal expected = 1.23m;
-		var priceStream = new Subject<decimal>();
-		_myModelMock.Setup(svc => svc.PriceStream(It.IsAny<string>())).Returns(priceStream);
-
-		_viewModel.Show("SomeSymbol");
-		//Schedule the OnNext
-		_schedulerProvider.ThreadPool.Schedule(() => priceStream.OnNext(expected));  
-
-		Assert.AreEqual(0, _viewModel.Prices.Count);
-		//Execute the OnNext action
-		_schedulerProvider.ThreadPool.AdvanceBy(1);  
-		Assert.AreEqual(0, _viewModel.Prices.Count);
-		//Execute the OnNext handler
-		_schedulerProvider.Dispatcher.AdvanceBy(1);  
-		Assert.AreEqual(1, _viewModel.Prices.Count);
-		Assert.AreEqual(expected, _viewModel.Prices.First());
-	}
-
-	[TestMethod]
-	public void Should_disconnect_if_no_prices_for_10_seconds()
-	{
-		var timeoutPeriod = TimeSpan.FromSeconds(10);
-		var priceStream = Observable.Never<decimal>();
-		_myModelMock.Setup(svc => svc.PriceStream(It.IsAny<string>())).Returns(priceStream);
-
-		_viewModel.Show("SomeSymbol");
-
-		_schedulerProvider.ThreadPool.AdvanceBy(timeoutPeriod.Ticks - 1);
-		Assert.IsTrue(_viewModel.IsConnected);
-		_schedulerProvider.ThreadPool.AdvanceBy(timeoutPeriod.Ticks);
-		Assert.IsFalse(_viewModel.IsConnected);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">2 passed, 0 failed, 0 skipped, took 0.41 seconds (MSTest 10.0).</div>
-</div>
-
-These two tests ensure five things:
-
- * That the `Price` property has prices added to it as the model produces them
- * That the sequence is subscribed to on the ThreadPool
- * That the `Price` property is updated on the Dispatcher i.e. the sequence	is observed on the Dispatcher
- * That a timeout of 10 seconds between prices will set the ViewModel to disconnected.
- * The tests run fast. 
-While the time to run the tests is not that impressive, most of that time seems to be spent warming up my test harness. 
-Moreover, increasing the test count to 10 only adds 0.03seconds. 
-In general, on a modern CPU, I expect to see unit tests run at a rate of +1000 tests per second
-
-Usually, I would not have more than one assert/verify per test, but here it does help illustrate a point. 
-In the first test, we can see that only once both the `ThreadPool` and the `Dispatcher` schedulers have been run will we get a result. 
-In the second test, it helps to verify that the timeout is not less than 10 seconds.
-
-In some scenarios, you are not interested in the scheduler and you want to be focusing your tests on other functionality. 
-If this is the case, then you may want to create another test implementation of the `ISchedulerProvider` that returns the `ImmediateScheduler` for all of its members. 
-That can help reduce the noise in your tests.
-
-	public sealed class ImmediateSchedulers : ISchedulerService
-	{
-		public IScheduler CurrentThread { get { return Scheduler.Immediate; } }
-		public IScheduler Dispatcher { get { return Scheduler.Immediate; } }
-		public IScheduler Immediate { get { return Scheduler.Immediate; } }
-		public IScheduler NewThread { get { return Scheduler.Immediate; } }
-		public IScheduler ThreadPool { get { return Scheduler.Immediate; } }
-	}
-
-##Advanced features - ITestableObserver 	{#AdvancedFeatures}
-
-The `TestScheduler` provides further advanced features. 
-I find that I am able to get by quite well without these methods, but others may find them useful.
-Perhaps this is because I have found myself accustomed to testing without them from using earlier versions of Rx.
-
-###Start(Func&lt;IObservable&lt;T&gt;&gt;)		{#StartIOb}
-
-There are three overloads to `Start`, which are used to start an observable	sequence at a given time, record the notifications it makes and dispose of the subscription	at a given time. 
-This can be confusing at first, as the parameterless overload of `Start` is quite unrelated. 
-These three overloads return an `ITestableObserver<T>` which allows you to record the notifications from an observable sequence, much like the `Materialize` method we saw in the [Transformation chapter](08_Transformation.html#MaterializeAndDematerialize).
-
-	public interface ITestableObserver<T> : IObserver<T>
-	{
-		// Gets recorded notifications received by the observer.
-		IList<Recorded<Notification<T>>> Messages { get; }
-	}
-
-While there are three overloads, we will look at the most specific one first. 
-This overload takes four parameters:
-
- * an observable sequence factory delegate
- * the point in time to invoke the factory
- * the point in time to subscribe to the observable sequence returned from the factory
- * the point in time to dispose of the subscription
-
-The _time_ for the last three parameters is measured in ticks, as per the rest of the `TestScheduler` members.
-
-	public ITestableObserver<T> Start<T>(
-		Func<IObservable<T>> create, 
-		long created, 
-		long subscribed, 
-		long disposed)
-	{...}
-
-We could use this method to test the `Observable.Interval` factory method.
-Here, we create an observable sequence that spawns a value every second for 4 seconds.
-We use the `TestScheduler.Start` method to create and subscribe to it immediately (by passing 0 for the second and third parameters). 
-We dispose of our subscription after 5 seconds. 
-Once the `Start` method has run, we output what we have recorded.
-
-	var scheduler = new TestScheduler();
-	var source = Observable.Interval(TimeSpan.FromSeconds(1), scheduler)
-		.Take(4);
-
-	var testObserver = scheduler.Start(
-		() => source, 
-		0, 
-		0, 
-		TimeSpan.FromSeconds(5).Ticks);
-
-	Console.WriteLine("Time is {0} ticks", scheduler.Clock);
-	Console.WriteLine("Received {0} notifications", testObserver.Messages.Count);
-	foreach (Recorded<Notification<long>> message in testObserver.Messages)
-	{
-		Console.WriteLine("{0} @ {1}", message.Value, message.Time);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Time is 50000000 ticks</div>
-	<div class="line">Received 5 notifications</div>
-	<div class="line">OnNext(0) @ 10000001</div>
-	<div class="line">OnNext(1) @ 20000001</div>
-	<div class="line">OnNext(2) @ 30000001</div>
-	<div class="line">OnNext(3) @ 40000001</div>
-	<div class="line">OnCompleted() @ 40000001</div>
-</div>
-
-Note that the `ITestObserver<T>` records `OnNext` and `OnCompleted` notifications. 
-If the sequence was to terminate in error, the `ITestObserver<T>` would record the `OnError` notification instead.
-
-We can play with the input variables to see the impact it makes. 
-We know that the `Observable.Interval` method is a Cold Observable, so the virtual time of the creation is not relevant. 
-Changing the virtual time of the subscription can change our results. 
-If we change it to 2 seconds, we will notice that if we leave the disposal time at 5 seconds, we will miss some messages.
-
-	var testObserver = scheduler.Start(
-		() => Observable.Interval(TimeSpan.FromSeconds(1), scheduler).Take(4), 
-		0,
-		TimeSpan.FromSeconds(2).Ticks,
-		TimeSpan.FromSeconds(5).Ticks);
-
-Output:
-
-<div class="output">
-	<div class="line">Time is 50000000 ticks</div>
-	<div class="line">Received 2 notifications</div>
-	<div class="line">OnNext(0) @ 30000000</div>
-	<div class="line">OnNext(1) @ 40000000</div>
-</div>
-
-We start the subscription at 2 seconds; the `Interval` produces values after each second (i.e. second 3 and 4), and we dispose on second 5. 
-So we miss the other two `OnNext` messages as well as the `OnCompleted` message.
-
-There are two other overloads to this `TestScheduler.Start` method.
-
-	public ITestableObserver<T> Start<T>(Func<IObservable<T>> create, long disposed)
-	{
-	  if (create == null)
-		throw new ArgumentNullException("create");
-	  else
-		return this.Start<T>(create, 100L, 200L, disposed);
-	}
-
-	public ITestableObserver<T> Start<T>(Func<IObservable<T>> create)
-	{
-	  if (create == null)
-		throw new ArgumentNullException("create");
-	  else
-		return this.Start<T>(create, 100L, 200L, 1000L);
-	}
-
-As you can see, these overloads just call through to the variant we have been looking at, but passing some default values. 
-I am not sure why these default values are special; I can not imagine why you would want to use these two methods, unless your specific use case matched that specific configuration exactly.
-
-###CreateColdObservable				{#CreateColdObservable}
-
-Just as we can record an observable sequence, we can also use `CreateColdObservable` to playback a set of `Recorded<Notification<int>>`. 
-The signature for `CreateColdObservable` simply takes a `params` array of recorded notifications.
-
-	// Creates a cold observable from an array of notifications.
-	// Returns a cold observable exhibiting the specified message behavior.
-	public ITestableObservable<T> CreateColdObservable<T>(
-		params Recorded<Notification<T>>[] messages)
-	{...}
-
-The `CreateColdObservable` returns an `ITestableObservable<T>`.
-This interface extends `IObservable<T>` by exposing the list of "subscriptions" and the list of messages it will produce.
-
-	public interface ITestableObservable<T> : IObservable<T>
-	{
-		// Gets the subscriptions to the observable.
-		IList<Subscription> Subscriptions { get; }
-
-		// Gets the recorded notifications sent by the observable.
-		IList<Recorded<Notification<T>>> Messages { get; }
-	}
-
-Using `CreateColdObservable`, we can emulate the `Observable.Interval` test we had earlier.
-
-	var scheduler = new TestScheduler();
-	var source = scheduler.CreateColdObservable(
-		new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
-		new Recorded<Notification<long>>(20000000, Notification.CreateOnNext(1L)),
-		new Recorded<Notification<long>>(30000000, Notification.CreateOnNext(2L)),
-		new Recorded<Notification<long>>(40000000, Notification.CreateOnNext(3L)),
-		new Recorded<Notification<long>>(40000000, Notification.CreateOnCompleted<long>())
-		);
-
-	var testObserver = scheduler.Start(
-		() => source,
-		0,
-		0,
-		TimeSpan.FromSeconds(5).Ticks);
-
-	Console.WriteLine("Time is {0} ticks", scheduler.Clock);
-	Console.WriteLine("Received {0} notifications", testObserver.Messages.Count);
-	foreach (Recorded<Notification<long>> message in testObserver.Messages)
-	{
-		Console.WriteLine("  {0} @ {1}", message.Value, message.Time);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Time is 50000000 ticks</div>
-	<div class="line">Received 5 notifications</div>
-	<div class="line">OnNext(0) @ 10000001</div>
-	<div class="line">OnNext(1) @ 20000001</div>
-	<div class="line">OnNext(2) @ 30000001</div>
-	<div class="line">OnNext(3) @ 40000001</div>
-	<div class="line">OnCompleted() @ 40000001</div>
-</div>
-
-Note that our output is exactly the same as the previous example with `Observable.Interval`.
-
-###CreateHotObservable			{#CreateHotObservable}
-
-We can also create hot test observable sequences using the `CreateHotObservable` method. 
-It has the same parameters and return value as `CreateColdObservable`; the difference is that the virtual time specified for each message is now relative to when the observable was created, not when it is subscribed to as per the `CreateColdObservable` method.
-
-This example is just that last "cold" sample, but creating a Hot observable instead.
-
-	var scheduler = new TestScheduler();
-	var source = scheduler.CreateHotObservable(
-		new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
-	...    
-
-Output:
-
-<div class="output">
-	<div class="line">Time is 50000000 ticks</div>
-	<div class="line">Received 5 notifications</div>
-	<div class="line">OnNext(0) @ 10000000</div>
-	<div class="line">OnNext(1) @ 20000000</div>
-	<div class="line">OnNext(2) @ 30000000</div>
-	<div class="line">OnNext(3) @ 40000000</div>
-	<div class="line">OnCompleted() @ 40000000</div>
-</div>
-
-Note that the output is almost the same. 
-Scheduling of the creation and subscription do not affect the Hot Observable, therefore the notifications happen 1 tick earlier than their Cold counterparts.
-
-We can see the major difference a Hot Observable bears by changing the virtual create time and virtual subscribe time to be different values. 
-With a Cold Observable, the virtual create time has no real impact, as subscription is what initiates any action. 
-This means we can not miss any early message on a Cold Observable. 
-For Hot Observables, we can miss messages if we subscribe too late. 
-Here, we create the Hot Observable immediately, but only subscribe to it after 1 second (thus missing the first message).
-
-	var scheduler = new TestScheduler();
-	var source = scheduler.CreateHotObservable(
-		new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
-		new Recorded<Notification<long>>(20000000, Notification.CreateOnNext(1L)),
-		new Recorded<Notification<long>>(30000000, Notification.CreateOnNext(2L)),
-		new Recorded<Notification<long>>(40000000, Notification.CreateOnNext(3L)),
-		new Recorded<Notification<long>>(40000000, Notification.CreateOnCompleted<long>())
-		);
-
-	var testObserver = scheduler.Start(
-		() => source,
-		0,
-		TimeSpan.FromSeconds(1).Ticks,
-		TimeSpan.FromSeconds(5).Ticks);
-
-	Console.WriteLine("Time is {0} ticks", scheduler.Clock);
-	Console.WriteLine("Received {0} notifications", testObserver.Messages.Count);
-	foreach (Recorded<Notification<long>> message in testObserver.Messages)
-	{
-		Console.WriteLine("  {0} @ {1}", message.Value, message.Time);
-	}
-
-Output:
-
-<div class="output">
-	<div class="line">Time is 50000000 ticks</div>
-	<div class="line">Received 4 notifications</div>
-	<div class="line">OnNext(1) @ 20000000</div>
-	<div class="line">OnNext(2) @ 30000000</div>
-	<div class="line">OnNext(3) @ 40000000</div>
-	<div class="line">OnCompleted() @ 40000000</div>
-</div>
-
-###CreateObserver				{#CreateObserver}
-
-Finally, if you do not want to use the `TestScheduler.Start` methods, and you need more fine-grained control over your observer, you can use `TestScheduler.CreateObserver()`.
-This will return an `ITestObserver` that you can use to manage the subscriptions to your observable sequences with. 
-Furthermore, you will still be exposed to the recorded messages and any subscribers.
-
-Current industry standards demand broad coverage of automated unit tests to meet quality assurance standards. 
-Concurrent programming, however, is often a difficult area to test well. 
-Rx delivers a well-designed implementation of testing features, allowing deterministic and high-throughput testing. 
-The `TestScheduler` provides methods to control virtual time and produce observable sequences for testing. 
-This ability to easily and reliably test concurrent systems sets Rx apart from many other libraries.
-
----
-
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-
-		<!--Test Driven development (By example) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0321146530&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		
-		<!--Art of Unit testing Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988274&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		
-		<!--Refactoring (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B007WTFWJ6&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<!--Domain Driven Design (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00794TAUG&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-	</div>
</div>
+# Testing Rx
+
+Modern quality assurance standards demand comprehensive automated testing that can help evaluate and prevent bugs. It is good practice to have a suite of tests that verify correct behaviour and to run this as part of the build process to detect regressions early.
+
+The `System.Reactive` source code includes a comprehensive tests suite. Testing Rx-based code presents some challenges, especially when time-sensitive operators are involved. Rx.NET's test suite includes many tests designed to exercise awkward edge cases to ensure predictable behaviour under load. This is only possible because Rx.NET was designed to be testable.
+
+In this chapter, we'll show how you can take advantage of Rx's testability in your own code.
+
+## Virtual Time
+
+It's common to deal with timing in Rx. As you've seen, it offers several operators that take time into account, and this presents a challenge. We don't want to introduce slow tests, because that can make test suites take too long to execute, but how might we test an application that waits for the user to stop typing for half a second before submitting a query? Non-deterministic tests can also be a problem: when there are race conditions it can be very hard to recreate these reliably.
+
+The [Scheduling and Threading](11_SchedulingAndThreading.md) chapter described how schedulers use a virtualized representation of time. This is critical for enabling tests to validate time-related behaviour. It lets us control Rx's perception of the progression of time, enabling us to write tests that logically take seconds, but which execute in microseconds.
+
+Consider this example, where we create a sequence that publishes values every second for five seconds.
+
+```csharp
+IObservable<long> interval = Observable
+    .Interval(TimeSpan.FromSeconds(1))
+    .Take(5);
+```
+
+A naive a test to ensure that this produces five values at one second intervals would take five seconds to run. That would be no good; we want hundreds if not thousands of tests to run in five seconds. Another very common requirement is to test a timeout. Here, we try to test a timeout of one minute.
+
+```csharp
+var never = Observable.Never<int>();
+var exceptionThrown = false;
+
+never.Timeout(TimeSpan.FromMinutes(1))
+     .Subscribe(
+        i => Console.WriteLine("This will never run."),
+        ex => exceptionThrown = true);
+
+Assert.IsTrue(exceptionThrown);
+```
+
+It looks like we would have no choice but to make our test wait for a minute before running that assert. In practice, we'd want to wait a little over a minute, because if the computer running the test is busy, it might trigger the timeout bit later than we've asked. This kind of scenario is notorious for causing tests to fail occasionally even when there's no real problem in the code being tested.
+
+Nobody wants slow, inconsistent tests. So let's look at how Rx helps us to avoid these problems.
+
+## TestScheduler
+
+The [Scheduling and Threading](11_SchedulingAndThreading.md) chapter explained that schedulers determine when and how to execute code, and that they keep track of time. Most of the schedulers we looked at in that chapter addressed various threading concerns, and when it came to timing, they all attempted to run work at the time requested. But Rx provides `TestScheduler`, which handles time completely differently. It takes advantage of the fact that schedulers control all time-related behaviour to allow us to emulate and control time.
+
+**Note:** `TestScheduler` is not in the main `System.Reactive` package. You will need to add a reference to `Microsoft.Reactive.Testing` to use it.
+
+Any scheduler maintains a queue of actions to be executed. Each action is assigned a point in time when it should be executed. (Sometimes that time is "as soon as possible" but time-based operators will often schedule work to run at some specific time in the future.) If we use the `TestScheduler` it will effectively act as though time stands still until we tell it we want time to move on.
+
+In this example, we schedule a task to be run immediately by using the simplest `Schedule` overload. Even though this effectively asks for the work to be run as soon as possible, the `TestScheduler` always waits for us to tell it we're ready before processing newly queued work. We advance the virtual clock forward by one tick, at which point it will execute that queued work. (It runs all newly-queued "as soon as possible" work any time we advance the virtual time. If we advance the time far enough to mean that work that was previously logically in the future is now runnable, it runs that too.)
+
+```csharp
+var scheduler = new TestScheduler();
+var wasExecuted = false;
+scheduler.Schedule(() => wasExecuted = true);
+Assert.IsFalse(wasExecuted);
+scheduler.AdvanceBy(1); // execute 1 tick of queued actions
+Assert.IsTrue(wasExecuted);
+```
+
+The `TestScheduler` implements the `IScheduler` interface and also defines methods allowing us to control and monitor virtual time. This shows these additional methods:
+
+```csharp
+public class TestScheduler : // ...
+{
+    public bool IsEnabled { get; private set; }
+    public TAbsolute Clock { get; protected set; }
+    public void Start()
+    public void Stop()
+    public void AdvanceTo(long time)
+    public void AdvanceBy(long time)
+    
+    ...
+}
+```
+
+`TestScheduler` works in the same units as [`TimeSpan.Ticks`](https://learn.microsoft.com/en-us/dotnet/api/system.timespan.ticks). If you want to move time forward by 1 second, you can call `scheduler.AdvanceBy(TimeSpan.FromSeconds(1).Ticks)`. One tick corresponds to 100ns, so 1 second is 10,000,000 ticks.
+
+### AdvanceTo
+
+The `AdvanceTo(long)` method sets the virtual time to the specified number of ticks. This will execute all the actions that have been scheduled up to that absolute time specified. The `TestScheduler` uses ticks as its measurement of time. In this example, we schedule actions to be invoked now, in 10 ticks, and in 20 ticks (1 and 2 microseconds respectively).
+
+```csharp
+var scheduler = new TestScheduler();
+scheduler.Schedule(() => Console.WriteLine("A")); // Schedule immediately
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
+scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
+
+Console.WriteLine("scheduler.AdvanceTo(1);");
+scheduler.AdvanceTo(1);
+
+Console.WriteLine("scheduler.AdvanceTo(10);");
+scheduler.AdvanceTo(10);
+
+Console.WriteLine("scheduler.AdvanceTo(15);");
+scheduler.AdvanceTo(15);
+
+Console.WriteLine("scheduler.AdvanceTo(20);");
+scheduler.AdvanceTo(20);
+```
+
+Output:
+
+```
+scheduler.AdvanceTo(1);
+A
+scheduler.AdvanceTo(10);
+B
+scheduler.AdvanceTo(15);
+scheduler.AdvanceTo(20);
+C
+```
+
+Note that nothing happened when we advanced to 15 ticks. All work scheduled before 15 ticks had been performed and we had not advanced far enough yet to get to the next scheduled action.
+
+### AdvanceBy
+    
+The `AdvanceBy(long)` method allows us to move the clock forward by some amount of time. Unlike `AdvanceTo`, the argument here is relative to the current virtual time. Again, the measurements are in ticks. We can take the last example and modify it to use `AdvanceBy(long)`.
+
+```csharp
+var scheduler = new TestScheduler();
+scheduler.Schedule(() => Console.WriteLine("A")); // Schedule immediately
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
+scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
+
+Console.WriteLine("scheduler.AdvanceBy(1);");
+scheduler.AdvanceBy(1);
+
+Console.WriteLine("scheduler.AdvanceBy(9);");
+scheduler.AdvanceBy(9);
+
+Console.WriteLine("scheduler.AdvanceBy(5);");
+scheduler.AdvanceBy(5);
+
+Console.WriteLine("scheduler.AdvanceBy(5);");
+scheduler.AdvanceBy(5);
+```
+
+Output:
+
+```
+scheduler.AdvanceBy(1);
+A
+scheduler.AdvanceBy(9);
+B
+scheduler.AdvanceBy(5);
+scheduler.AdvanceBy(5);
+C
+```
+
+### Start
+    
+The `TestScheduler`'s `Start()` method runs everything that has been scheduled, advancing virtual time as necessary for work items that were queued for a specific time. We take the same example again and swap out the `AdvanceBy(long)` calls for a single `Start()` call.
+
+```csharp
+var scheduler = new TestScheduler();
+scheduler.Schedule(() => Console.WriteLine("A")); // Schedule immediately
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
+scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
+
+Console.WriteLine("scheduler.Start();");
+scheduler.Start();
+
+Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
+```
+
+Output:
+
+```
+scheduler.Start();
+A
+B
+C
+scheduler.Clock:20
+```
+
+Note that once all of the scheduled actions have been executed, the virtual clock matches our last scheduled item (20 ticks).
+
+We further extend our example by scheduling a new action to happen after `Start()` has already been called.
+
+```csharp
+var scheduler = new TestScheduler();
+scheduler.Schedule(() => Console.WriteLine("A"));
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
+scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
+
+Console.WriteLine("scheduler.Start();");
+scheduler.Start();
+
+Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
+
+scheduler.Schedule(() => Console.WriteLine("D"));
+```
+
+Output:
+
+```
+scheduler.Start();
+A
+B
+C
+scheduler.Clock:20
+```
+
+Note that the output is exactly the same; If we want our fourth action to be executed, we will have to call `Start()` (or `AdvanceTo` or `AdvanceBy`) again.
+
+### Stop
+
+There is a `Stop()` method whose name seems to imply some symmetry with `Start()`. This sets the scheduler's `IsEnabled` property to false, and if `Start` is currently running, this means that it will stop inspecting the queue for further work, and will return as soon as the work item currently being processed completes.
+
+In this example, we show how you could use `Stop()` to pause processing of scheduled actions.
+
+```csharp
+var scheduler = new TestScheduler();
+scheduler.Schedule(() => Console.WriteLine("A"));
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
+scheduler.Schedule(TimeSpan.FromTicks(15), scheduler.Stop);
+scheduler.Schedule(TimeSpan.FromTicks(20), () => Console.WriteLine("C"));
+
+Console.WriteLine("scheduler.Start();");
+scheduler.Start();
+Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
+```
+
+Output:
+
+```
+scheduler.Start();
+A
+B
+scheduler.Clock:15
+```
+
+Note that "C" never gets printed as we stop the clock at 15 ticks.
+
+Since `Start` automatically stops when it has drained the work queue, you're under no obligation to call `Stop`. It's there only if you want to call `Start` but then pause processing part way through the test.
+
+### Schedule collision
+
+When scheduling actions, it is possible and even likely that many actions will be scheduled for the same point in time. This most commonly would occur when scheduling multiple actions for _now_. It could also happen that there are multiple actions scheduled for the same point in the future. The `TestScheduler` has a simple way to deal with this. When actions are scheduled, they are marked with the clock time they are scheduled for. If multiple items are scheduled for the same point in time, they are queued in order that they were scheduled; when the clock advances, all items for that point in time are executed in the order that they were scheduled.
+
+```csharp
+var scheduler = new TestScheduler();
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("A"));
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("B"));
+scheduler.Schedule(TimeSpan.FromTicks(10), () => Console.WriteLine("C"));
+
+Console.WriteLine("scheduler.Start();");
+scheduler.Start();
+Console.WriteLine("scheduler.Clock:{0}", scheduler.Clock);
+```
+
+Output:
+
+```
+scheduler.AdvanceTo(10);
+A
+B
+C
+scheduler.Clock:10
+```
+
+Note that the virtual clock is at 10 ticks, the time we advanced to.
+
+## Testing Rx code
+
+Now that we have learnt a little bit about the `TestScheduler`, let's look at how we could use it to test our two initial code snippets that use `Interval` and `Timeout`. We want to execute tests as fast as possible but still maintain the semantics of time. In this example we generate our five values one second apart but pass in our `TestScheduler` to the `Interval` method to use instead of the default scheduler.
+
+```csharp
+[TestMethod]
+public void Testing_with_test_scheduler()
+{
+    var expectedValues = new long[] {0, 1, 2, 3, 4};
+    var actualValues = new List<long>();
+    var scheduler = new TestScheduler();
+
+    var interval = Observable.Interval(TimeSpan.FromSeconds(1), scheduler).Take(5);
+    
+    interval.Subscribe(actualValues.Add);
+
+    scheduler.Start();
+    CollectionAssert.AreEqual(expectedValues, actualValues);
+    // Executes in less than 0.01s "on my machine"
+}
+```
+
+While this is mildly interesting, what I think is more important is how we would test a real piece of code. Imagine, if you will, a ViewModel that subscribes to a stream of prices. As prices are published, it adds them to a collection. Assuming this is a WPF implementation, we take the liberty of enforcing that the subscription be done on the `ThreadPool` and the observing is executed on the `Dispatcher`.
+
+```csharp
+public class MyViewModel : IMyViewModel
+{
+    private readonly IMyModel _myModel;
+    private readonly ObservableCollection<decimal> _prices;
+
+    public MyViewModel(IMyModel myModel)
+    {
+        _myModel = myModel;
+        _prices = new ObservableCollection<decimal>();
+    }
+
+    public void Show(string symbol)
+    {
+        // TODO: resource mgt, exception handling etc...
+        _myModel.PriceStream(symbol)
+                .SubscribeOn(Scheduler.ThreadPool)
+                .ObserveOn(Scheduler.Dispatcher)
+                .Timeout(TimeSpan.FromSeconds(10), Scheduler.ThreadPool)
+                .Subscribe(
+                    Prices.Add,
+                    ex=>
+                        {
+                            if(ex is TimeoutException)
+                                IsConnected = false;
+                        });
+        IsConnected = true;
+    }
+
+    public ObservableCollection<decimal> Prices
+    {
+        get { return _prices; }
+    }
+
+    public bool IsConnected { get; private set; }
+}
+```
+
+### Injecting scheduler dependencies
+
+While the snippet of code above may do what we want it to, it will be hard to test as it is accessing the schedulers via static properties. You will need some way of enabling tests to supply different schedulers during testing. In this example, we're going to define an interface for this purpose:
+
+```csharp
+public interface ISchedulerProvider
+{
+    IScheduler CurrentThread { get; }
+    IScheduler Dispatcher { get; }
+    IScheduler Immediate { get; }
+    IScheduler NewThread { get; }
+    IScheduler ThreadPool { get; }
+    IScheduler TaskPool { get; } 
+}
+```
+
+The default implementation that we would run in production is implemented as follows:
+
+```csharp
+public sealed class SchedulerProvider : ISchedulerProvider
+{
+    public IScheduler CurrentThread => Scheduler.CurrentThread;
+    public IScheduler Dispatcher => DispatcherScheduler.Instance;
+    public IScheduler Immediate => Scheduler.Immediate;
+    public IScheduler NewThread => Scheduler.NewThread;
+    public IScheduler ThreadPool => Scheduler.ThreadPool;
+    public IScheduler TaskPool => Scheduler.TaskPool;
+}
+```
+
+We can substitute implementations of `ISchedulerProvider` to help with testing. For example:
+
+```csharp
+public sealed class TestSchedulers : ISchedulerProvider
+{
+    // Schedulers available as TestScheduler type
+    public TestScheduler CurrentThread { get; }  = new TestScheduler();
+    public TestScheduler Dispatcher { get; }  = new TestScheduler();
+    public TestScheduler Immediate { get; }  = new TestScheduler();
+    public TestScheduler NewThread { get; }  = new TestScheduler();
+    public TestScheduler ThreadPool { get; }  = new TestScheduler();
+    
+    // ISchedulerService needs us to return IScheduler, but we want the properties
+    // to return TestScheduler for the convenience of test code, so we provide
+    // explicit implementations of all the properties to match ISchedulerService.
+    IScheduler ISchedulerProvider.CurrentThread => CurrentThread;
+    IScheduler ISchedulerProvider.Dispatcher => Dispatcher;
+    IScheduler ISchedulerProvider.Immediate => Immediate;
+    IScheduler ISchedulerProvider.NewThread => NewThread;
+    IScheduler ISchedulerProvider.ThreadPool => ThreadPool;
+}
+```
+
+Note that `ISchedulerProvider` is implemented explicitly because that interface requires each property to return an `IScheduler`, but our tests will need to access the `TestScheduler` instances directly. I can now write some tests for my ViewModel. Below, we test a modified version of the `MyViewModel` class that takes an `ISchedulerProvider` and uses that instead of the static schedulers from the `Scheduler` class. We also use the popular [Moq](https://github.com/Moq) framework to provide a suitable fake implementation of our model.
+
+```csharp
+[TestInitialize]
+public void SetUp()
+{
+    _myModelMock = new Mock<IMyModel>();
+    _schedulerProvider = new TestSchedulers();
+    _viewModel = new MyViewModel(_myModelMock.Object, _schedulerProvider);
+}
+
+[TestMethod]
+public void Should_add_to_Prices_when_Model_publishes_price()
+{
+    decimal expected = 1.23m;
+    var priceStream = new Subject<decimal>();
+    _myModelMock.Setup(svc => svc.PriceStream(It.IsAny<string>())).Returns(priceStream);
+
+    _viewModel.Show("SomeSymbol");
+    
+    // Schedule the OnNext
+    _schedulerProvider.ThreadPool.Schedule(() => priceStream.OnNext(expected));  
+
+    Assert.AreEqual(0, _viewModel.Prices.Count);
+
+    // Execute the OnNext action
+    _schedulerProvider.ThreadPool.AdvanceBy(1);  
+    Assert.AreEqual(0, _viewModel.Prices.Count);
+    
+    // Execute the OnNext handler
+    _schedulerProvider.Dispatcher.AdvanceBy(1);  
+    Assert.AreEqual(1, _viewModel.Prices.Count);
+    Assert.AreEqual(expected, _viewModel.Prices.First());
+}
+
+[TestMethod]
+public void Should_disconnect_if_no_prices_for_10_seconds()
+{
+    var timeoutPeriod = TimeSpan.FromSeconds(10);
+    var priceStream = Observable.Never<decimal>();
+    _myModelMock.Setup(svc => svc.PriceStream(It.IsAny<string>())).Returns(priceStream);
+
+    _viewModel.Show("SomeSymbol");
+
+    _schedulerProvider.ThreadPool.AdvanceBy(timeoutPeriod.Ticks - 1);
+    Assert.IsTrue(_viewModel.IsConnected);
+    _schedulerProvider.ThreadPool.AdvanceBy(timeoutPeriod.Ticks);
+    Assert.IsFalse(_viewModel.IsConnected);
+}
+```
+
+Output:
+
+```
+2 passed, 0 failed, 0 skipped, took 0.41 seconds (MSTest 10.0).
+```
+
+These two tests ensure five things:
+
+* That the `Price` property has prices added to it as the model produces them
+* That the sequence is subscribed to on the ThreadPool
+* That the `Price` property is updated on the Dispatcher i.e. the sequence is observed on the Dispatcher
+* That a timeout of 10 seconds between prices will set the ViewModel to disconnected
+* The tests run fast.
+  
+While the time to run the tests is not that impressive, most of that time seems to be spent warming up my test harness. Moreover, increasing the test count to 10 only adds 0.03seconds. In general, a modern CPU should be able to execute thousands of unit tests per second.
+
+In the first test, we can see that only once both the `ThreadPool` and the `Dispatcher` schedulers have been run will we get a result. In the second test, it helps to verify that the timeout is not less than 10 seconds.
+
+In some scenarios, you are not interested in the scheduler and you want to be focusing your tests on other functionality. If this is the case, then you may want to create another test implementation of the `ISchedulerProvider` that returns the `ImmediateScheduler` for all of its members. That can help reduce the noise in your tests.
+
+```csharp
+public sealed class ImmediateSchedulers : ISchedulerService
+{
+    public IScheduler CurrentThread => Scheduler.Immediate;
+    public IScheduler Dispatcher => Scheduler.Immediate;
+    public IScheduler Immediate => Scheduler.Immediate;
+    public IScheduler NewThread => Scheduler.Immediate;
+    public IScheduler ThreadPool => Scheduler.Immediate;
+}
+```
+
+## Advanced features - ITestableObserver
+
+The `TestScheduler` provides further advanced features. These can be useful when parts of your test setup need to run at particular virtual times.
+
+### `Start(Func<IObservable<T>>)`
+
+There are three overloads to `Start`, which are used to start an observable sequence at a given time, record the notifications it makes and dispose of the subscription at a given time. This can be confusing at first, as the parameterless overload of `Start` is quite unrelated. These three overloads return an `ITestableObserver<T>` which allows you to record the notifications from an observable sequence, much like the `Materialize` method we saw in the [Transformation chapter](06_Transformation.md#materialize-and-dematerialize).
+
+```csharp
+public interface ITestableObserver<T> : IObserver<T>
+{
+    // Gets recorded notifications received by the observer.
+    IList<Recorded<Notification<T>>> Messages { get; }
+}
+```
+
+While there are three overloads, we will look at the most specific one first. This overload takes four parameters:
+
+* an observable sequence factory delegate
+* the point in time to invoke the factory
+* the point in time to subscribe to the observable sequence returned from the factory
+* the point in time to dispose of the subscription
+
+The _time_ for the last three parameters is measured in ticks, as per the rest of the `TestScheduler` members.
+
+```csharp
+public ITestableObserver<T> Start<T>(
+    Func<IObservable<T>> create, 
+    long created, 
+    long subscribed, 
+    long disposed)
+{...}
+```
+
+We could use this method to test the `Observable.Interval` factory method. Here, we create an observable sequence that spawns a value every second for 4 seconds. We use the `TestScheduler.Start` method to create and subscribe to it immediately (by passing 0 for the second and third parameters). We dispose of our subscription after 5 seconds. Once the `Start` method has run, we output what we have recorded.
+
+```csharp
+var scheduler = new TestScheduler();
+var source = Observable.Interval(TimeSpan.FromSeconds(1), scheduler)
+    .Take(4);
+
+var testObserver = scheduler.Start(
+    () => source, 
+    0, 
+    0, 
+    TimeSpan.FromSeconds(5).Ticks);
+
+Console.WriteLine("Time is {0} ticks", scheduler.Clock);
+Console.WriteLine("Received {0} notifications", testObserver.Messages.Count);
+
+foreach (Recorded<Notification<long>> message in testObserver.Messages)
+{
+    Console.WriteLine("{0} @ {1}", message.Value, message.Time);
+}
+```
+
+Output:
+
+```
+Time is 50000000 ticks
+Received 5 notifications
+OnNext(0) @ 10000001
+OnNext(1) @ 20000001
+OnNext(2) @ 30000001
+OnNext(3) @ 40000001
+OnCompleted() @ 40000001
+```
+
+Note that the `ITestObserver<T>` records `OnNext` and `OnCompleted` notifications. If the sequence was to terminate in error, the `ITestObserver<T>` would record the `OnError` notification instead.
+
+We can play with the input variables to see the impact it makes. We know that the `Observable.Interval` method is a Cold Observable, so the virtual time of the creation is not relevant. Changing the virtual time of the subscription can change our results. If we change it to 2 seconds, we will notice that if we leave the disposal time at 5 seconds, we will miss some messages.
+
+```csharp
+var testObserver = scheduler.Start(
+    () => Observable.Interval(TimeSpan.FromSeconds(1), scheduler).Take(4), 
+    0,
+    TimeSpan.FromSeconds(2).Ticks,
+    TimeSpan.FromSeconds(5).Ticks);
+```
+
+Output:
+
+```
+Time is 50000000 ticks
+Received 2 notifications
+OnNext(0) @ 30000000
+OnNext(1) @ 40000000
+```
+
+We start the subscription at 2 seconds; the `Interval` produces values after each second (i.e. second 3 and 4), and we dispose on second 5. So we miss the other two `OnNext` messages as well as the `OnCompleted` message.
+
+There are two other overloads to this `TestScheduler.Start` method.
+
+```csharp
+public ITestableObserver<T> Start<T>(Func<IObservable<T>> create, long disposed)
+{
+    if (create == null)
+    {
+        throw new ArgumentNullException("create");
+    }
+    else
+    {
+        return this.Start<T>(create, 100L, 200L, disposed);
+    }
+}
+
+public ITestableObserver<T> Start<T>(Func<IObservable<T>> create)
+{
+    if (create == null)
+    {
+        throw new ArgumentNullException("create");
+    }
+    else
+    {
+        return this.Start<T>(create, 100L, 200L, 1000L);
+    }
+}
+```
+
+As you can see, these overloads just call through to the variant we have been looking at, but passing some default values. These default values provide short gaps before creation and between creation and subscription, giving enough space to configure other things to happen between them. And then the disposal happens a bit later, allowing a little longer for the thing to run. There's nothing particularly magical about these default values, but if you value a lack of clutter over it being completely obvious what happens when, and are happy to rely on the invisible effects of convention, then you might prefer this. The Rx source code itself contains thousands of tests, and a very large number of them use the simplest `Start` overload, and developers working in the code base day in, day out soon get used to the idea that creation occurs at time 100, and subscription at time 200, and that you test everything you need to before 1000.
+
+### CreateColdObservable
+
+Just as we can record an observable sequence, we can also use `CreateColdObservable` to play back a set of `Recorded<Notification<int>>`. The signature for `CreateColdObservable` simply takes a `params` array of recorded notifications.
+
+```csharp
+// Creates a cold observable from an array of notifications.
+// Returns a cold observable exhibiting the specified message behavior.
+public ITestableObservable<T> CreateColdObservable<T>(
+    params Recorded<Notification<T>>[] messages)
+{...}
+```
+
+The `CreateColdObservable` returns an `ITestableObservable<T>`. This interface extends `IObservable<T>` by exposing the list of "subscriptions" and the list of messages it will produce.
+
+```csharp
+public interface ITestableObservable<T> : IObservable<T>
+{
+    // Gets the subscriptions to the observable.
+    IList<Subscription> Subscriptions { get; }
+
+    // Gets the recorded notifications sent by the observable.
+    IList<Recorded<Notification<T>>> Messages { get; }
+}
+```
+
+Using `CreateColdObservable`, we can emulate the `Observable.Interval` test we had earlier.
+
+```csharp
+var scheduler = new TestScheduler();
+var source = scheduler.CreateColdObservable(
+    new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
+    new Recorded<Notification<long>>(20000000, Notification.CreateOnNext(1L)),
+    new Recorded<Notification<long>>(30000000, Notification.CreateOnNext(2L)),
+    new Recorded<Notification<long>>(40000000, Notification.CreateOnNext(3L)),
+    new Recorded<Notification<long>>(40000000, Notification.CreateOnCompleted<long>())
+    );
+
+var testObserver = scheduler.Start(
+    () => source,
+    0,
+    0,
+    TimeSpan.FromSeconds(5).Ticks);
+
+Console.WriteLine("Time is {0} ticks", scheduler.Clock);
+Console.WriteLine("Received {0} notifications", testObserver.Messages.Count);
+
+foreach (Recorded<Notification<long>> message in testObserver.Messages)
+{
+    Console.WriteLine("  {0} @ {1}", message.Value, message.Time);
+}
+```
+
+Output:
+
+```
+Time is 50000000 ticks
+Received 5 notifications
+OnNext(0) @ 10000001
+OnNext(1) @ 20000001
+OnNext(2) @ 30000001
+OnNext(3) @ 40000001
+OnCompleted() @ 40000001
+```
+
+Note that our output is exactly the same as the previous example with `Observable.Interval`.
+
+### CreateHotObservable
+
+We can also create hot test observable sequences using the `CreateHotObservable` method. It has the same parameters and return value as `CreateColdObservable`; the difference is that the virtual time specified for each message is now relative to when the observable was created, not when it is subscribed to as per the `CreateColdObservable` method.
+
+This example is just that last "cold" sample, but creating a Hot observable instead.
+
+```csharp
+var scheduler = new TestScheduler();
+var source = scheduler.CreateHotObservable(
+    new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
+// ...    
+```
+
+Output:
+
+```
+Time is 50000000 ticks
+Received 5 notifications
+OnNext(0) @ 10000000
+OnNext(1) @ 20000000
+OnNext(2) @ 30000000
+OnNext(3) @ 40000000
+OnCompleted() @ 40000000
+```
+
+Note that the output is almost the same. Scheduling of the creation and subscription do not affect the Hot Observable, therefore the notifications happen 1 tick earlier than their Cold counterparts.
+
+We can see the major difference a Hot Observable bears by changing the virtual create time and virtual subscribe time to be different values. With a Cold Observable, the virtual create time has no real impact, as subscription is what initiates any action. This means we cannot miss any early message on a Cold Observable. For Hot Observables, we can miss messages if we subscribe too late. Here, we create the Hot Observable immediately, but only subscribe to it after 1 second (thus missing the first message).
+
+```csharp
+var scheduler = new TestScheduler();
+var source = scheduler.CreateHotObservable(
+    new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
+    new Recorded<Notification<long>>(20000000, Notification.CreateOnNext(1L)),
+    new Recorded<Notification<long>>(30000000, Notification.CreateOnNext(2L)),
+    new Recorded<Notification<long>>(40000000, Notification.CreateOnNext(3L)),
+    new Recorded<Notification<long>>(40000000, Notification.CreateOnCompleted<long>())
+    );
+
+var testObserver = scheduler.Start(
+    () => source,
+    0,
+    TimeSpan.FromSeconds(1).Ticks,
+    TimeSpan.FromSeconds(5).Ticks);
+
+Console.WriteLine("Time is {0} ticks", scheduler.Clock);
+Console.WriteLine("Received {0} notifications", testObserver.Messages.Count);
+
+foreach (Recorded<Notification<long>> message in testObserver.Messages)
+{
+    Console.WriteLine("  {0} @ {1}", message.Value, message.Time);
+}
+```
+
+Output:
+
+```
+Time is 50000000 ticks
+Received 4 notifications
+OnNext(1) @ 20000000
+OnNext(2) @ 30000000
+OnNext(3) @ 40000000
+OnCompleted() @ 40000000
+```
+
+### CreateObserver 
+
+Finally, if you do not want to use the `TestScheduler.Start` methods, and you need more fine-grained control over your observer, you can use `TestScheduler.CreateObserver()`. This will return an `ITestObserver` that you can use to manage the subscriptions to your observable sequences with. Furthermore, you will still be exposed to the recorded messages and any subscribers.
+
+Current industry standards demand broad coverage of automated unit tests to meet quality assurance standards. Concurrent programming, however, is often a difficult area to test well. Rx delivers a well-designed implementation of testing features, allowing deterministic and high-throughput testing. The `TestScheduler` provides methods to control virtual time and produce observable sequences for testing. This ability to easily and reliably test concurrent systems sets Rx apart from many other libraries.

+ 0 - 653
Rx.NET/Documentation/IntroToRx/17_SequencesOfCoincidence.md

@@ -1,653 +0,0 @@
----
-title: Sequences of coincidence title
----
-
-#Sequences of coincidence {#SequencesOfCoincidence}
-
-We can conceptualize events that have _duration_ as `windows`. For example;
-
- * a server is up
- * a person is in a room
- * a button is pressed (and not yet released).
-
- 
-The first example could be re-worded as "for this window of time, the server was up". 
-An event from one source may have a greater value if it coincides with an event from another source. 
-For example, while at a music festival, you may only be interested in tweets (event) about an artist while they are playing (window). 
-In finance, you may only be interested in trades (event) for a certain instrument while the New York market is open (window). 
-In operations, you may be interested in the user sessions (window) that remained active during an upgrade of a system (window). 
-In that example, we would be querying for coinciding windows.
-    
-Rx provides the power to query sequences of coincidence, sometimes called 'sliding windows'. 
-We already recognize the benefit that Rx delivers when querying data in	motion. 
-By additionally providing the power to query sequences of coincidence, Rx exposes yet another dimension of possibilities.
-
-##Buffer revisited					{#BufferRevisted}
-
-[`Buffer`](13_TimeShiftedSequences.html#Buffer) is not a new operator to us; however, it can now be conceptually grouped with the window operators. 
-Each of these windowing operators act on a sequence and a window of time. 
-Each operator will open a window when the source sequence produces a value. 
-The way the window is closed, and which values are exposed, are the main differences between each of the operators.
-Let us just quickly recap the internal working of the `Buffer` operator and see how this maps to the concept of "windows of time".
-
-`Buffer` will create a window when the first value is produced. 
-It will then put that value into an internal cache. 
-The window will stay open until the count of values has been reached; each of these values will have been cached. 
-When the count has been reached, the window will close and the cache will be published to the result sequence as an `IList<T>`. 
-When the next value is produced from the source, the cache is cleared and we start again. 
-This means that `Buffer` will take an `IObservable<T>` and return an `IObservable<IList<T>>`.
-
-`Example Buffer with count of 3`
-
-<div class="marble">
-<pre class="line">source|-0-1-2-3-4-5-6-7-8-9|</pre>
-<pre class="line">result|-----0-----3-----6-9|</pre>
-<pre class="line">            1     4     7</pre>
-<pre class="line">            2     5     8</pre>
-</div>
-
-<p class="comment">
-In this marble diagram, I have represented the list of values being returned at a point in time as a column of data. 
-That is, the values 0, 1 &amp; 2 are all returned in the first buffer.
-</p>
-
-Understanding buffer with time is only a small step away from understanding buffer with count; instead of passing a count, we pass a `TimeSpan`. 
-The closing of the window (and therefore the buffer's cache) is now dictated by time instead of the number of values. 
-This is now more complicated as we have introduced some sort of scheduling. 
-To produce the `IList<T>` at the correct point in time, we need a scheduler assigned to perform the timing. 
-Incidentally, this makes testing a lot easier.
-
-`Example Buffer with time of 5 units`
-
-<div class="marble">
-<pre class="line">source|-0-1-2-3-4-5-6-7-8-9-|</pre>
-<pre class="line">result|----0----2----5----7-|</pre>
-<pre class="line">           1    3    6    8</pre>
-<pre class="line">                4         9</pre>
-</div>
-
-##Window							{#Window}
-
-The `Window` operators are very similar to the `Buffer` operators; they only really differ by their return type. 
-Where `Buffer` would take an `IObservable<T>` and return an `IObservable<IList<T>>`, the Window operators return an `IObservable<IObservable<T>>`.
-It is also worth noting that the `Buffer` operators will not yield their buffers until the window closes.
-
-Here we can see the simple overloads to `Window`. 
-There is a surprising symmetry with the `Window` and `Buffer` overloads.
-
-
-
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		int count)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		int count, 
-		int skip)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		int count)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		TimeSpan timeShift)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		IScheduler scheduler)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		TimeSpan timeShift, 
-		IScheduler scheduler)
-	{...}
-	public static IObservable<IObservable<TSource>> Window<TSource>(
-		this IObservable<TSource> source, 
-		TimeSpan timeSpan, 
-		int count, 
-		IScheduler scheduler)
-	{...}
-
-
-This is an example of `Window` with a count of 3 as a marble diagram:
-
-<div class="marble">
-<pre class="line">source |-0-1-2-3-4-5-6-7-8-9|</pre>
-<pre class="line">window0|-0-1-2|</pre>
-<pre class="line">window1        3-4-5|</pre>
-<pre class="line">window2              6-7-8|</pre>
-<pre class="line">window3                    9|</pre>
-</div>
-
-For demonstration purposes, we could reconstruct that with this code.
-
-	var windowIdx = 0;
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
-	source.Window(3)
-			.Subscribe(window =>
-			{
-				var id = windowIdx++;
-				Console.WriteLine("--Starting new window");
-				var windowName = "Window" + thisWindowIdx;
-				window.Subscribe(
-					value => Console.WriteLine("{0} : {1}", windowName, value),
-					ex => Console.WriteLine("{0} : {1}", windowName, ex),
-					() => Console.WriteLine("{0} Completed", windowName));
-			},
-			() => Console.WriteLine("Completed"));
-
-Output:
-
-<div class="output">
-<div class="line">--Starting new window</div>
-<div class="line">window0 : 0</div>
-<div class="line">window0 : 1</div>
-<div class="line">window0 : 2</div>
-<div class="line">window0 Completed</div>
-<div class="line">--Starting new window</div>
-<div class="line">window1 : 3</div>
-<div class="line">window1 : 4</div>
-<div class="line">window1 : 5</div>
-<div class="line">window1 Completed</div>
-<div class="line">--Starting new window</div>
-<div class="line">window2 : 6</div>
-<div class="line">window2 : 7</div>
-<div class="line">window2 : 8</div>
-<div class="line">window2 Completed</div>
-<div class="line">--Starting new window</div>
-<div class="line">window3 : 9</div>
-<div class="line">window3 Completed</div>
-<div class="line">Completed</div>
-</div>
-
-`Example of Window with time of 5 units`
-
-<div class="marble">
-<pre class="line">source |-0-1-2-3-4-5-6-7-8-9|</pre>
-<pre class="line">window0|-0-1-|</pre>
-<pre class="line">window1      2-3-4|</pre>
-<pre class="line">window2           -5-6-|</pre>
-<pre class="line">window3                7-8-9|</pre>
-</div>
-
-A major difference we see here is that the `Window` operators can notify you of values from the source as soon as they are produced. 
-The `Buffer` operators, on the other hand, must wait until the window closes before the values can be notified as an entire list.
-
-###Flattening a Window operation 	{#FlatteningAWindowOperation}
-I think it is worth noting, at least from an academic standpoint, that the `Window` operators produce `IObservable<IObservable<T>>`. 
-We have explored the concept of [nested observables](07_Aggregation.html#NestedObservables) in the earlier chapter on [Aggregation](07_Aggregation.html).
-`Concat`, `Merge` and `Switch` each have an overload that takes an `IObservable<IObservable<T>>` and returns an `IObservable<T>`. 
-As the `Window` operators ensure that the windows (child sequences) do not overlap, we can use either of the `Concat`, `Switch` or `Merge` operators to turn a windowed sequence back into its original form.
-
-	//is the same as Observable.Interval(TimeSpan.FromMilliseconds(200)).Take(10) 
-	 var switchedWindow = Observable.Interval(TimeSpan.FromMilliseconds(200)).Take(10)
-		.Window(TimeSpan.FromMilliseconds(500))
-		.Switch();
-
-###Customizing windows				{#CustomizingWindows}
-
-The overloads above provide simple ways to break a sequence into smaller nested windows using a count and/or a time span. 
-Now we will look at the other overloads, that provide more flexibility over how windows are managed.
-
-	//Projects each element of an observable sequence into consecutive non-overlapping windows.
-	//windowClosingSelector : A function invoked to define the boundaries of the produced 
-	//  windows. A new window is started when the previous one is closed.
-	public static IObservable<IObservable<TSource>> Window<TSource, TWindowClosing>
-	(
-		this IObservable<TSource> source, 
-		Func<IObservable<TWindowClosing>> windowClosingSelector
-	)
-	{...}
-
-
-The first of these complex overloads allows us to control when windows should close.
-The `windowClosingSelector` function is called each time a window is created.
-Windows are created on subscription and immediately after a window closes; windows close when the sequence from the `windowClosingSelector` produces a value.
-The value is disregarded so it doesn't matter what type the sequence values are; in fact you can just complete the sequence from `windowClosingSelector` to close the window instead.
-
-In this example, we create a window with a closing selector. 
-We return the same subject from that selector every time, then notify from the subject whenever a user presses enter from the console.
-
-	var windowIdx = 0;
-	var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
-	var closer = new Subject<Unit>();
-	source.Window(() => closer)
-			.Subscribe(window =>
-			{
-				var thisWindowIdx = windowIdx++;
-				Console.WriteLine("--Starting new window");
-				var windowName = "Window" + thisWindowIdx;
-				window.Subscribe(
-					value => Console.WriteLine("{0} : {1}", windowName, value),
-					ex => Console.WriteLine("{0} : {1}", windowName, ex),
-					() => Console.WriteLine("{0} Completed", windowName));
-			},
-			() => Console.WriteLine("Completed"));
-
-	var input = "";
-	while (input!="exit")
-	{
-		input = Console.ReadLine();
-		closer.OnNext(Unit.Default);
-	}
-
-
-Output (when I hit enter after '1' and '5' are displayed):
-<div class="output">
-<div class="line">--Starting new window</div>
-<div class="line">window0 : 0</div>
-<div class="line">window0 : 1</div>
-<div class="line"></div>
-<div class="line">window0 Completed</div>
-<div class="line">--Starting new window</div>
-<div class="line">window1 : 2</div>
-<div class="line">window1 : 3</div>
-<div class="line">window1 : 4</div>
-<div class="line">window1 : 5</div>
-<div class="line"></div>
-<div class="line">window1 Completed</div>
-<div class="line">--Starting new window</div>
-<div class="line">window2 : 6</div>
-<div class="line">window2 : 7</div>
-<div class="line">window2 : 8</div>
-<div class="line">window2 : 9</div>
-<div class="line">window2 Completed</div>
-<div class="line">Completed</div>
-</div>
-
-The most complex overload of `Window` allows us to create potentially overlapping windows.
-
-	//Projects each element of an observable sequence into zero or more windows.
-	// windowOpenings : Observable sequence whose elements denote the creation of new windows.
-	// windowClosingSelector : A function invoked to define the closing of each produced window.
-	public static IObservable<IObservable<TSource>> Window
-		<TSource, TWindowOpening, TWindowClosing>
-	(
-		this IObservable<TSource> source, 
-		IObservable<TWindowOpening> windowOpenings, 
-		Func<TWindowOpening, IObservable<TWindowClosing>> windowClosingSelector
-	)
-	{...}
-
-This overload takes three arguments
-
- 1. The source sequence
- 2. A sequence that indicates when a new window should be opened
- 3. A function that takes a window opening value, and returns a window closing sequence
-
-
-This overload offers great flexibility in the way windows are opened and closed.
-Windows can be largely independent from each other; they can overlap, vary in size and even skip values from the source.
-
-To ease our way into this more complex overload, let's first try to use it to recreate a simpler version of `Window` (the overload that takes a count). 
-To do so, we need to open a window once on the initial subscription, and once each time the source has produced then specified count. 
-The window needs to close each time that count is reached. 
-To achieve this we only need the source sequence. 
-We will share it by using the `Publish` method, then supply 'views' of the source as each of the arguments.
-
-	public static IObservable<IObservable<T>> MyWindow<T>(
-		this IObservable<T> source, 
-		int count)
-	{
-		var shared = source.Publish().RefCount();
-		var windowEdge = shared
-			.Select((i, idx) => idx % count)
-			.Where(mod => mod == 0)
-			.Publish()
-			.RefCount();
-		return shared.Window(windowEdge, _ => windowEdge);
-	}
-
-If we now want to extend this method to offer skip functionality, we need to havetwo different sequences: one for opening and one for closing. 
-We open a window on subscription and again after the `skip` items have passed. 
-We close thosewindows after '`count`' items have passed since the window opened.
-
-	public static IObservable<IObservable<T>> MyWindow<T>(
-		this IObservable<T> source, 
-		int count, 
-		int skip)
-	{
-		if (count <= 0) throw new ArgumentOutOfRangeException();
-		if (skip <= 0) throw new ArgumentOutOfRangeException();
-
-		var shared = source.Publish().RefCount();
-		var index = shared
-			.Select((i, idx) => idx)
-			.Publish()
-			.RefCount();
-		var windowOpen = index.Where(idx => idx % skip == 0);
-		var windowClose = index.Skip(count-1);
-		return shared.Window(windowOpen, _ => windowClose);
-	}
-
-We can see here that the `windowClose` sequence is re-subscribed to each time a window is opened, due to it being returned from a function. 
-This allows us to reapply the skip (`Skip(count-1)`) for each window. 
-Currently, we ignore the value that the `windowOpen` pushes to the `windowClose` selector, but if you require it for some logic, it is available to you.
-
-As you can see, the `Window` operator can be quite powerful. 
-We can even use `Window` to replicate other operators; for instance we can create our own implementation of `Buffer` that way. 
-We can have the `SelectMany` operator take a single value (the window) to produce zero or more values of another type (in our case, a single `IList<T>`). 
-To create the `IList<T>` without blocking, we can apply the `Aggregate` method and use a new `List<T>` as the seed.
-
-	public static IObservable<IList<T>> MyBuffer<T>(
-		this IObservable<T> source, 
-		int count)
-	{
-		return source.Window(count)
-			.SelectMany(window => 
-				window.Aggregate(
-					new List<T>(), 
-					(list, item) =>
-					{
-						list.Add(item);
-						return list;
-					}));
-	}
-
-It may be an interesting exercise to try implementing other time shifting methods, like `Sample` or `Throttle`, with `Window`.
-
-##Join								{#Join}
-
-The `Join` operator allows you to logically join two sequences. 
-Whereas the `Zip` operator would pair values from the two sequences together by index, the `Join` operator allows you join sequences by intersecting windows. 
-Like the `Window` overload we just looked at, you can specify when a window should close via an observable sequence; this sequence is returned from a function that takes an opening value. 
-The `Join` operator has two such functions, one for the first source sequence and one for the second source sequence. 
-Like the `Zip` operator, we also need to provide a selector function to produce the result item from the pair of values.
-
-	public static IObservable<TResult> Join
-		<TLeft, TRight, TLeftDuration, TRightDuration, TResult>
-	(
-		this IObservable<TLeft> left,
-		IObservable<TRight> right,
-		Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector,
-		Func<TRight, IObservable<TRightDuration>> rightDurationSelector,
-		Func<TLeft, TRight, TResult> resultSelector
-	)
-
-This is a complex signature to try and understand in one go, so let's take it one parameter at a time.
-
-`IObservable<TLeft> left` is the source sequence that defines when a window starts. 
-This is just like the `Buffer` and `Window` operators, except that every value published from this source opens a new window. 
-In `Buffer` and `Window`, by contrast, some values just fell into an existing window.
-
-I like to think of `IObservable<TRight> right` as the window value sequence. 
-While the left sequence controls opening the windows, the right sequence will try to pair up with a value from the left sequence.
-
-Let us imagine that our left sequence produces a value, which creates a new window.
-If the right sequence produces a value while the window is open, then the `resultSelector` function is called with the two values. 
-This is the crux of join, pairing two values from a sequence that occur within the same window. 
-This then leads us to our next question; when does the window close? 
-The answer illustrates both the power and the complexity of the `Join` operator.
-
-When `left` produces a value, a window is opened. 
-That value is also passed, at that time, to the `leftDurationSelector` function, which returns an `IObservable<TLeftDuration>`.
-When that sequence produces a value or completes, the window for that value is closed.
-Note that it is irrelevant what the type of `TLeftDuration` is. 
-This initially left me with the feeling that `IObservable<TLeftDuration>` was a bit excessive as you effectively just need some sort of event to say 'Closed'. 
-However, by being allowed to use `IObservable<T>`, you can do some clever manipulation as we will see later.
-
-Let us now imagine a scenario where the left sequence produces values twice as fast as the right sequence. 
-Imagine that in addition we never close the windows; we could do this by always returning `Observable.Never<Unit>()` from the `leftDurationSelector` function. 
-This would result in the following pairs being produced.
-
-Left Sequence
-
-<div class="marble">
-<pre class="line">L 0-1-2-3-4-5-</pre>
-</div>
-
-Right Sequence
-
-<div class="marble">
-<pre class="line">R --A---B---C-</pre>
-</div>
-<div class="output">
-<div class="line">0, A</div>
-<div class="line">1, A</div>
-<div class="line">0, B</div>
-<div class="line">1, B</div>
-<div class="line">2, B</div>
-<div class="line">3, B</div>
-<div class="line">0, C</div>
-<div class="line">1, C</div>
-<div class="line">2, C</div>
-<div class="line">3, C</div>
-<div class="line">4, C</div>
-<div class="line">5, C</div>
-</div>
-
-As you can see, the left values are cached and replayed each time the right produces a value.
-
-Now it seems fairly obvious that, if I immediately closed the window by returning `Observable.Empty<Unit>`, or perhaps `Observable.Return(0)`, windows would never be opened thus no pairs would ever get produced. 
-However, what could I do to make sure that these windows did not overlap- so that, once a second value was produced I would no longer see the first value? 
-Well, if we returned the `left` sequence from the `leftDurationSelector`, that could do the trick. 
-But wait, when we return the sequence `left` from the `leftDurationSelector`, it would try to create another subscription and that may introduce side effects. 
-The quick answer to that is to `Publish` and `RefCount` the `left` sequence. 
-If we do that, the results look more like this.
-
-<div class="marble">
-<pre class="line">left  |-0-1-2-3-4-5|</pre>
-<pre class="line">right |---A---B---C|</pre>
-<pre class="line">result|---1---3---5</pre>
-<pre class="line">          A   B   C</pre>
-</div>
-
-The last example is very similar to `CombineLatest`, except that it is only producing a pair when the right sequence changes. 
-We could use `Join` to produce our own version of [`CombineLatest`](12_CombiningSequences.html#CombineLatest).
-If the values from the left sequence expire when the next value from left was notified, then I would be well on my way to implementing my version of `CombineLatest`.
-However I need the same thing to happen for the right.
-Luckily the `Join` operator provides a `rightDurationSelector` that works just like the `leftDurationSelector`. 
-This is simple to implement; all I need to do is return a reference to the same left sequence when a left value is produced, and do the same for the right. 
-The code looks like this.
-
-	public static IObservable<TResult> MyCombineLatest<TLeft, TRight, TResult>
-	(
-		IObservable<TLeft> left,
-		IObservable<TRight> right,
-		Func<TLeft, TRight, TResult> resultSelector
-	)
-	{
-		var refcountedLeft = left.Publish().RefCount();
-		var refcountedRight = right.Publish().RefCount();
-		return Observable.Join(
-			refcountedLeft,
-			refcountedRight,
-			value => refcountedLeft,
-			value => refcountedRight,
-			resultSelector);
-	}
-
-While the code above is not production quality (it would need to have some gates in place to mitigate race conditions), it shows how powerful `Join` is; we can actually use it to create other operators!
-
-##GroupJoin							{#GroupJoin}
-
-When the `Join` operator pairs up values that coincide within a window, it will pass the scalar values left and right to the `resultSelector`. 
-The `GroupJoin` operator takes this one step further by passing the left (scalar) value immediately to the `resultSelector` with the right (sequence) value. 
-The right parameter represents all of the values from the right sequences that occur within the window.
-Its signature is very similar to `Join`, but note the difference in the `resultSelector` parameter.
-
-	public static IObservable<TResult> GroupJoin
-		<TLeft, TRight, TLeftDuration, TRightDuration, TResult>
-	(
-		this IObservable<TLeft> left,
-		IObservable<TRight> right,
-		Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector,
-		Func<TRight, IObservable<TRightDuration>> rightDurationSelector,
-		Func<TLeft, IObservable<TRight>, TResult> resultSelector
-	)
-
-
-If we went back to our first `Join` example where we had
-
- * the `left` producing values twice as fast as the right,
- * the left never expiring
- * the right immediately expiring
-
-
-this is what the result may look like
-
-<div class="marble">
-<pre class="line">left              |-0-1-2-3-4-5|</pre>
-<pre class="line">right             |---A---B---C|</pre>
-<pre class="line">0th window values   --A---B---C|</pre>
-<pre class="line">1st window values     A---B---C|</pre>
-<pre class="line">2nd window values       --B---C|</pre>
-<pre class="line">3rd window values         B---C|</pre>
-<pre class="line">4th window values           --C|</pre>
-<pre class="line">5th window values             C|</pre>
-</div>
-
-We could switch it around and have the left expired immediately and the right never expire. 
-The result would then look like this:
-
-<div class="marble">
-<pre class="line">left              |-0-1-2-3-4-5|</pre>
-<pre class="line">right             |---A---B---C|</pre>
-<pre class="line">0th window values   |</pre>
-<pre class="line">1st window values     A|</pre>
-<pre class="line">2nd window values       A|</pre>
-<pre class="line">3rd window values         AB|</pre>
-<pre class="line">4th window values           AB|</pre>
-<pre class="line">5th window values             ABC|</pre>
-</div>
-
-This starts to make things interesting. 
-Perceptive readers may have noticed that with `GroupJoin` you could effectively re-create your own `Join` method by doing something like this:
-
-	public IObservable<TResult> MyJoin<TLeft, TRight, TLeftDuration, TRightDuration, TResult>(
-		IObservable<TLeft> left,
-		IObservable<TRight> right,
-		Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector,
-		Func<TRight, IObservable<TRightDuration>> rightDurationSelector,
-		Func<TLeft, TRight, TResult> resultSelector)
-	{
-		return Observable.GroupJoin
-		(
-			left,
-			right,
-			leftDurationSelector,
-			rightDurationSelector,
-			(leftValue, rightValues)=>
-				rightValues.Select(rightValue=>resultSelector(leftValue, rightValue))
-		)
-		.Merge();
-	}
-
-
-You could even create a crude version of `Window` with this code:
-
-	public IObservable<IObservable<T>> MyWindow<T>(
-		IObservable<T> source, 
-		TimeSpan windowPeriod)
-	{
-		return Observable.Create<IObservable<T>>(o 
-			=>;
-			{
-			var sharedSource = source
-				.Publish()
-				.RefCount();
-
-			var intervals = Observable.Return(0L)
-				.Concat(Observable.Interval(windowPeriod))
-				.TakeUntil(sharedSource.TakeLast(1))
-				.Publish()
-				.RefCount();
-
-			return intervals.GroupJoin(
-					sharedSource, 
-					_ => intervals, 
-					_ => Observable.Empty<Unit>(), 
-					(left, sourceValues) => sourceValues)
-				.Subscribe(o);
-		});
-	}
-
-
-For an alternative summary of reducing operators to a primitive set see Bart DeSmet's
-[excellent MINLINQ post](http://blogs.bartdesmet.net/blogs/bart/archive/2010/01/01/the-essence-of-linq-minlinq.aspx "The essence of LINQ - MinLINQ")
-(and [follow-up video](http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-MinLINQ-The-Essence-of-LINQ "The essence of LINQ - MINLINQ - Channel9") ). 
-Bart is one of the key members of the team that built Rx, so it is great to get some insight on how the creators of Rx think.
-
-Showcasing `GroupJoin` and the use of other operators turned out to be a fun academic exercise. 
-While watching videos and reading books on Rx will increase your familiarity with it, nothing replaces the experience of actually picking it apart and using it in earnest.
-
-`GroupJoin` and other window operators reduce the need for low-level plumbing of state and concurrency. 
-By exposing a high-level API, code that would be otherwise difficult to write, becomes a cinch to put together. 
-For example, those in the finance industry could use `GroupJoin` to easily produce real-time Volume or Time Weighted Average Prices (VWAP/TWAP).
-
-Rx delivers yet another way to query data in motion by allowing you to interrogate sequences of coincidence. 
-This enables you to solve the intrinsically complex problem of managing state and concurrency while performing matching from multiple sources.
-By encapsulating these low level operations, you are able to leverage Rx to design your software in an expressive and testable fashion.
-Using the Rx operators as building blocks, your code effectively becomes a composition of many simple operators. 
-This allows the complexity of the domain code to be the focus, not the otherwise incidental supporting code.
-
----
-
-#Summary							{#Summary}
-
-When LINQ was first released, it brought the ability to query static data sources directly into the language. 
-With the volume of data produced in modern times, only being able to query data-at-rest, limits your competitive advantage. 
-Being able to make sense of information as it flows, opens an entirely new spectrum of software.
-We need more than just the ability to react to events, we have been able to do this for years. 
-We need the ability to construct complex queries across multiple sources of flowing data.
-
-Rx brings event processing to the masses by allowing you to query data-in-motion directly from your favorite .NET language. 
-Composition is king: you compose operators to create queries and you compose sequences to enrich the data. 
-Rx leverages common types, patterns and language features to deliver an incredibly powerful library that can change the way you write modern software.
-
-Throughout the book you will have learnt the basic types and principle of Rx. 
-You have discovered functional programming concepts and how they apply to observable sequences. 
-You can identify potential pitfalls of certain patterns and how to avoid them. 
-You understand the internal working of the operators and are even able to build your own implementations of many of them. 
-Finally you are able to construct complex queries that manage concurrency in a safe and declarative way while still being testable.
-
-You have everything you need to confidently build applications using the Reactive Extensions for .NET. 
-If you do find yourself at any time stuck, and not sure how to solve a problem or need help, you can probably solve it without outside stimulus.
-Remember to first draw a marble diagram of what you think the problem space is.
-This should allow you to see the patterns in the flow which will help you choose the correct operators. 
-Secondly, remember to follow the [Guidelines](18_UsageGuidelines.html). 
-Third, write a spike. 
-Use [LINQPad](http://www.linqpad.net/) or a blank Visual Studio project to flesh out a small sample. 
-Finally, if you are still stuck, your best place to look for help is the MSDN [Rx forum](http://social.msdn.microsoft.com/Forums/en-US/rx/). 
-[StackOverflow.com](http://stackoverflow.com/) is another useful resource too, but with regards to Rx questions, the MSDN forum is dedicated to Rx and seems to have a higher quality of answers.
-
----
-
-<div class="webonly">
-<h1 class="ignoreToc">Additional recommended reading</h1>
-<div align="center">
-<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-<!--C# in a nutshell Amazon.co.uk-->
-<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-	style="width:120px;height:240px;margin: 10px" 
-	scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-</div>
-<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-<!--C# Linq pocket reference Amazon.co.uk-->
-<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-		style="width:120px;height:240px;margin: 10px" 
-		scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-</div>
-<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-<!--CLR via C# v4 Amazon.co.uk-->
-<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-		style="width:120px;height:240px;margin: 10px" 
-		scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-</div>
-<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-<!--Real-world functional programming Amazon.co.uk-->
-<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-		style="width:120px;height:240px;margin: 10px" 
-		scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-</div>           
-</div>
</div>

+ 0 - 74
Rx.NET/Documentation/IntroToRx/18_UsageGuidelines.md

@@ -1,74 +0,0 @@
----
-title : Appendix A Usage guidelines
----
-
-#Appendix				{#Appendix .SectionHeader}
- 
-#Usage guidelines		{#UsageGuidelines}
-
-This is a list of quick guidelines intended to help you when writing Rx queries.
-
- * Members that return a sequence should never return null. 
-This applies to `IEnumerable<T>` and `IObservable<T>` sequences. 
-Return an empty sequence instead.
- * Dispose of subscriptions.
- * Subscriptions should match their scope.
- * Always provide an `OnError` handler.
- * Avoid breaking the monad with blocking operators such as `First`, `FirstOrDefault`, `Last`, `LastOrDefault`, `Single`, `SingleOrDefault` and `ForEach`.
- * Avoid switching between monads, i.e. going from `IObservable<T>` to `IEnumerable<T>` and back to `IObservable<T>`.
- * Favor lazy evaluation over eager evaluation.
- * Break large queries up into parts. Key indicators of a large query:		
-	 1. nesting
-	 2. over 10 lines of query comprehension syntax
-	 3. using the into statement
- * Name your queries well, i.e. avoid using the names like `query`, `q`, `xs`, `ys`, `subject` etc.
- * Avoid creating side effects. 
-If you must create side effects, be explicit by using the `Do` operator.
- * Avoid the use of the subject types. 
-Rx is effectively a functional programming paradigm.
-Using subjects means we are now managing state, which is potentially mutating. 
-Dealing with both mutating state and asynchronous programming at the same time is very hard to get right.
-Furthermore, many of the operators (extension methods) have been carefully written to ensure that correct and consistent lifetime of subscriptions and sequences is maintained;
-when you introduce subjects, you can break this. 
-Future releases may also see significant performance degradation if you explicitly use subjects.
- * Avoid creating your own implementations of the `IObservable<T>` interface.
-Favor using the `Observable.Create` factory method overloads instead.
- * Avoid creating your own implementations of the `IObserver<T>` interface.
-Favor using the `Subscribe` extension method overloads instead.
- * The subscriber should define the concurrency model. 
-The `SubscribeOn` and `ObserveOn` operators should only ever precede a `Subscribe` method.
-
----
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		
-		<!--Framework Design Guidelines 2nd Edition (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B0017SWPNO&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<!--Refactoring (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B007WTFWJ6&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-		
-		<!--CLR via C# v4 Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-
-		<!--Domain Driven Design (Kindle) Amazon.co.uk-->
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00794TAUG&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-	</div>
</div>

+ 0 - 101
Rx.NET/Documentation/IntroToRx/19_DispellingMyths.md

@@ -1,101 +0,0 @@
----
-title : Appendix B Dispelling myths
----
-
-#Dispelling event myths			{#DispellingEventMyths}
-
-The previous parts in this book should have given you a solid and broad foundation in the fundamentals of Rx. 
-We will use this based to learn the really fun and sometimes complex parts of Rx. 
-Just before we do, I want to first make sure we are all on the same page and dispel some common myths and misunderstandings. 
-Carrying these misconceptions into a world of concurrency will make things seem magic and mysterious.
-This normally leads to problematic code.
-
-##Event myths			{#EventMyths}
-
-Often in my career, I have found myself involved in the process of interviewing new candidates for developer roles. 
-I have often been surprised about the lack of understanding developers had surrounding .NET events. 
-Carrying these misconception into a world of concurrency will make things seem magic and mysterious. 
-This normally leads to problematic code. 
-Here is a short list of verifiable facts about events.
-
-<dl>
-	<dt>Events are just a syntactic implementation of the observer pattern</dt>
-	<dd>
-		The += and -= syntax in c# may lead you to think that there is something clever
-		going on here, but it is just the observer pattern; you are providing a delegate
-		to get called back on. Most events pass you data in the form of the sender and the
-		<em>EventArgs</em>.
-	</dd>
-	<dt>Events are multicast</dt>
-	<dd>
-		Many consumers can register for the same event. Each delegate (handler) will be
-		internally added to a callback list.
-	</dd>
-	<dt>Events are single threaded.</dt>
-	<dd>
-		There is nothing multithreaded about an event. Each of the callback handlers are
-		each just called in the order that they registered, and they are called sequentially.
-	</dd>
-	<dt>Event handlers that throw exceptions stop other handlers being called</dt>
-	<dd>
-		Since handlers are called sequentially, they are also called on the same thread
-		that raised the event. This means that, if one handler throws an exception, there
-		cannot be a chance for any user code to intercept the exception. This means that
-		the remaining handlers will not be called.
-	</dd>
-</dl>
-
-Common myths about events that I have heard (or even believed at some point) include:
- * Handlers are called all at the same time on the thread pool, in parallel
- * All handlers will get called. Throwing an exception from a handler will not affect
-	other handlers
- * You don't need to unregister an event handler, .NET is managed so it will garbage
-	collect everything for you.
-
-The silly thing about these myths is that it only takes fifteen minutes to prove them all wrong; you just open up Visual Studio or [LINQPad](http://www.linqpad.net/) and test them out. 
-In my opinion, there is something satisfying about proving something you only believed in good faith to be true.
-
-TODO
-##Memory management myths		(#MemoryManagementMyths)
- 
-  * Event handles 
-  * IDispose pattern 
-  * Finalise is just as good as Dispose 
-  * GC is free 
-  * Setting to NULL is the same as Dispose or finalise
-
-#Concurrency myths				{#ConcurrencyMyths}
-
----
-<div class="webonly">
-	<h1 class="ignoreToc">Additional recommended reading</h1>
-	<div align="center">
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# in a nutshell Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--C# Linq pocket reference Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-		</div>
-
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--CLR via C# v4 Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>
-		<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-			<!--Real-world functional programming Amazon.co.uk-->
-			<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-					style="width:120px;height:240px;margin: 10px" 
-					scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-		</div>           
-	</div>
</div>

+ 0 - 156
Rx.NET/Documentation/IntroToRx/20_Disposables.md

@@ -1,156 +0,0 @@
----
-title : Appendix C Disposables
----
-
-#Disposables			{#Disposables}
-    
-Rx leverages the existing `IDisposable` interface for subscription management.
-This is an incredibly useful design decision, as users can work with a familiar type and reuse existing language features. 
-Rx further extends its usage of the `IDisposable` type by providing several public implementations of the interface. 
-These can be found in the `System.Reactive.Disposables` namespace. 
-Here, we will briefly enumerate each of them.
-
-
-<dl>
-    <dt>Disposable.Empty</dt>
-    <dd>
-        This static property exposes an implementation of <em>IDisposable</em> that performs
-        no action when the <em>Dispose</em> method is invoked. This can be useful whenever
-        you need to fulfil an interface requirement, like <em>Observable.Create</em>, but
-        do not have any resource management that needs to take place.</dd>
-    <dt>Disposable.Create(Action)</dt>
-    <dd>
-        This static method exposes an implementation of <em>IDisposable</em> that performs
-        the action provided when the <em>Dispose</em> method is invoked. As the implementation
-        follows the guidance to be idempotent, the action will only be called on the first
-        time the <em>Dispose</em> method is invoked.</dd>
-    <dt>BooleanDisposable</dt>
-    <dd>
-        This class simply has the <em>Dispose</em> method and a read-only property <em>IsDisposed</em>.
-        <em>IsDisposed</em> is <code>false</code> when the class is constructed, and is
-        set to <code>true</code> when the <em>Dispose</em> method is invoked.
-    </dd>
-    <dt>CancellationDisposable</dt>
-    <dd>
-        The <em>CancellationDisposable</em> class offers an integration point between the
-        .NET <a href="http://msdn.microsoft.com/en-us/library/dd997364.aspx">cancellation paradigm</a>
-        (<em>CancellationTokenSource</em>) and the resource management paradigm (<em>IDisposable</em>).
-        You can create an instance of the <em>CancellationDisposable</em> class by providing
-        a <em>CancellationTokenSource</em> to the constructor, or by having the parameterless
-        constructor create one for you. Calling <em>Dispose</em> will invoke the <em>Cancel</em>
-        method on the <em>CancellationTokenSource</em>. There are two properties (<em>Token</em>
-        and <em>IsDisposed</em>) that <em>CancellationDisposable</em> exposes; they are
-        wrappers for the <em>CancellationTokenSource</em> properties, respectively <em>Token</em>
-        and <em>IsCancellationRequested</em>.
-    </dd>
-    <dt>CompositeDisposable</dt>
-    <dd>
-        The <em>CompositeDisposable</em> type allows you to treat many disposable resources
-        as one. Common usage is to create an instance of <em>CompositeDisposable</em> by
-        passing in a <code>params</code> array of disposable resources. Calling <em>Dispose</em>
-        on the <em>CompositeDisposable</em> will call dispose on each of these resources
-        in the order they were provided. Additionally, the <em>CompositeDisposable</em>
-        class implements <em>ICollection&lt;IDisposable&gt;</em>; this allows you to add
-        and remove resources from the collection. After the <em>CompositeDisposable</em>
-        has been disposed of, any further resources that are added to this collection will
-        be disposed of instantly. Any item that is removed from the collection is also disposed
-        of, regardless of whether the collection itself has been disposed of. This includes
-        usage of both the <em>Remove</em> and <em>Clear</em> methods.
-    </dd>
-    <dt>ContextDisposable</dt>
-    <dd>
-        <em>ContextDisposable</em> allows you to enforce that disposal of a resource is
-        performed on a given <em>SynchronizationContext</em>. The constructor requires both
-        a <em>SynchronizationContext</em> and an <em>IDisposable</em> resource. When the
-        <em>Dispose</em> method is invoked on the <em>ContextDisposable</em>, the provided
-        resource will be disposed of on the specified context.
-    </dd>
-    <dt>MultipleAssignmentDisposable</dt>
-    <dd>
-        The <em>MultipleAssignmentDisposable</em> exposes a read-only <em>IsDisposed</em>
-        property and a read/write property <em>Disposable</em>. Invoking the <em>Dispose</em>
-        method on the <em>MultipleAssignmentDisposable</em> will dispose of the current
-        value held by the <em>Disposable</em> property. It will then set that value to null.
-        As long as the <em>MultipleAssignmentDisposable</em> has not been disposed of, you
-        are able to set the <em>Disposable</em> property to <em>IDisposable</em> values
-        as you would expect. Once the <em>MultipleAssignmentDisposable</em> has been disposed,
-        attempting to set the <em>Disposable</em> property will cause the value to be instantly
-        disposed of; meanwhile, <em>Disposable</em> will remain null.
-    </dd>
-    <dt>RefCountDisposable</dt>
-    <dd>
-        The <em>RefCountDisposable</em> offers the ability to prevent the disposal of an
-        underlying resource until all dependent resources have been disposed. You need an
-        underlying <em>IDisposable</em> value to construct a <em>RefCountDisposable</em>.
-        You can then call the <em>GetDisposable</em> method on the <em>RefCountDisposable</em>
-        instance to retrieve a dependent resource. Each time a call to <em>GetDisposable</em>
-        is made, an internal counter is incremented. Each time one of the dependent disposables
-        from <em>GetDisposable</em> is disposed, the counter is decremented. Only if the
-        counter reaches zero will the underlying be disposed of. This allows you to call
-        <em>Dispose</em> on the <em>RefCountDisposable</em> itself before or after the count is
-        zero.
-    </dd>
-    <dt>ScheduledDisposable</dt>
-    <dd>
-        In a similar fashion to <em>ContextDisposable</em>, the <em>ScheduledDisposable</em> type
-        allows you to specify a scheduler, onto which the underlying resource will be disposed. You need
-        to pass both the instance of <em>IScheduler</em> and instance of <em>IDisposable</em>
-        to the constructor. When the <em>ScheduledDisposable</em> instance is disposed of, the disposal
-        of the underlying resource will be scheduled onto the provided scheduler.
-    </dd>
-    <dt>SerialDisposable</dt>
-    <dd>
-        <em>SerialDisposable</em> is very similar to <em>MultipleAssignmentDisposable</em>,
-        as they both expose a read/write <em>Disposable</em> property. The contrast between
-        them is that whenever the <em>Disposable</em> property is set on a <em>SerialDisposable</em>,
-        the previous value is disposed of. Like the <em>MultipleAssignmentDisposable</em>,
-        once the <em>SerialDisposable</em> has been disposed of, the <em>Disposable</em>
-        property will be set to null and any further attempts to set it will have the value
-        disposed of. The value will remain as null.
-    </dd>
-    <dt>SingleAssignmentDisposable</dt>
-    <dd>
-        The <em>SingleAssignmentDisposable</em> class also exposes <em>IsDisposed</em> and
-        <em>Disposable</em> properties. Like <em>MultipleAssignmentDisposable</em> and
-        <em>SerialDisposable</em>, the <em>Disposable</em> value will be set to null when the
-        <em>SingleAssignmentDisposable</em> is disposed of. The difference in implementation
-        here is that the <em>SingleAssignmentDisposable</em> will throw an <em>InvalidOperationException</em>
-        if there is an attempt to set the <em>Disposable</em> property while the value is not null and the <em>SingleAssignmentDisposable</em>
-        has not been disposed of.
-    </dd>
-</dl>
-
----
-
-<div class="webonly">
-    <h1 class="ignoreToc">Additional recommended reading</h1>
-    <div align="center">
-        <div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-            <!--C# in a nutshell Amazon.co.uk-->
-            <iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B008E6I1K8&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-                    style="width:120px;height:240px;margin: 10px" 
-                    scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-        </div>
-        <div style="display:inline-block; vertical-align: top;  margin: 10px; width: 140px; font-size: 11px; text-align: center">
-            <!--C# Linq pocket reference Amazon.co.uk-->
-            <iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=0596519249&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-                    style="width:120px;height:240px;margin: 10px" 
-                    scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-        </div>
-
-        <div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-            <!--CLR via C# v4 Amazon.co.uk-->
-            <iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=B00AA36R4U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-                    style="width:120px;height:240px;margin: 10px" 
-                    scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-        </div>
-        <div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
-            <!--Real-world functional programming Amazon.co.uk-->
-            <iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&amp;o=2&amp;p=8&amp;l=as1&amp;asins=1933988924&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" 
-                    style="width:120px;height:240px;margin: 10px" 
-                    scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
-
-        </div>           
-    </div>
</div>

+ 25 - 0
Rx.NET/Documentation/IntroToRx/A_IoStreams.md

@@ -0,0 +1,25 @@
+# Appendix A: What's Wrong with Classic IO Streams
+
+In the [Key Types](02_KeyTypes.md#what-about-streams) chapter, I stated that `System.IO.Stream` is not a good fit for modelling the kinds of event streams we work with in Rx. This appendix explains why.
+
+The abstraction that `System.IO.Stream` represents was designed as a way for an operating system to enable application code to communicate with devices that could receive and/or produce streams of bytes. This makes them a good model for the [reel to reel tape storage devices](https://en.wikipedia.org/wiki/IBM_7-track) that were commonplace back when this kind of stream was designed, but unnecessarily cumbersome if you just want to represent a sequence of values. Over the years, streams have been co-opted to represent an increasingly diverse range of things, including files, keyboards, network connections, and OS status information, meaning that by the time .NET came along in 2002, its `Stream` type needed a mixture of features to accommodate some quite diverse scenarios. And since not all streams are alike, it's quite common for some of these features to not to work on some streams.
+
+IO streams were designed to support efficient delivery of fairly high volumes of byte data, often with devices that inherently work with data in big chunks. In the main scenarios for which they were designed, read and write operations would involve calls into operating system APIs, which are typically relatively expensive, so the basic read and write operations expect to work with arrays of bytes. (If you make one system call to deliver thousands of bytes, the overhead of that single call is far lower than if you work one byte at a time.) While that's good for efficiency, it can be inconvenient for developers (and irksome if you were hoping to use streams purely to represent in-process event streams that don't actually need to make system calls, and therefore don't get to enjoy the upside of this performance/convenience trade off).
+
+There is a standard band-aid kind of a fix for this: libraries that present streams to application code often don't represent the underlying OS stream directly. Instead, they are often _buffered_, meaning that the library will perform reads fairly large chunks, and hold recently-fetched bytes in memory until the application code asks for them. This can enable methods like .NET's single-byte [`Stream.ReadByte`](https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.readbyte) method to work reasonably efficiently: several thousand calls to that method might cause only one call to the operating system API that provides access to whatever physical device the stream represents. Likewise, if you're sending data into an IO stream, a buffered stream will wait until you've supplied some minimum quantity of data (4096 bytes is a common default with certain .NET `Stream`s) before it actually sends any data to its destination.
+
+But this could be a serious problem for the kinds of event sources we represent in Rx. If an IO stream deliberately insulates you from the real movement of data, that could introduce delays that might be disastrous in a financial application where delays in delivery and receipt of information can have enormous financial consequences. And even if there aren't direct financial implications, this kind of buffering would be unhelpful in representing events in a user interface. Nobody wants to have to click a button several thousand times before the application starts to act on that input.
+
+There's also the problem that you don't always know which kind of stream you've been given. If you know for a fact that you've got an unbuffered stream representing a file on disk (because you created that stream yourself) you'd typically write quite different code than you would if you knew you had a buffered stream. But if you've written a method that takes a `Stream` argument, it's not clear what you've got, so you don't necessarily know which coding strategy is best.
+
+Another problem is that because they are byte-oriented, there's no such thing as a `System.IO.Stream` that produces more complex values. If you want a stream of `int` values (which isn't a _much_ more complex idea than a stream of _byte_ values) `System.IO.Stream` does nothing to help you, and until very recently it might even hinder you. If you use the normal `Read` or `ReadAsync` methods, you can try reading four bytes at a time but a `System.IO.Stream` is at liberty to decide that it's only going to return three. (The reason streams are allowed to be petty in this way is that the original design presumes that a stream represents some underlying device that might inherently work with fixed size units of data. Disk drives and SSDs are incapable of reading or writing individual bytes; instead, each operation works with some whole number of 'sectors' each of which are hundreds or thousands of bytes long. So a read operation might simply be unable to give you exactly as many bytes as you asked for. This can also come into play for a stream that represents data coming in over the network: such streams might already have received some data, but less than you've asked for, and they might decide to return what they've already got instead of making you wait until the next network message arrives.) It's now the consuming code's problem to work out how to deal with that. .NET 7.0 finally fixed this problem (only about two decades after `Stream` first appeared) by adding the [`ReadExactly`](https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.readexactly) and [`ReadExactlyAsync`](https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.readexactlyasync) methods, but if you have to target .NET Framework, these methods are unavailable and you still have to solve this entirely yourself.
+
+Even if you use the new methods (or you write wrappers to deal with these issues caused by `Stream`'s origins as an abstraction for a magnetic tape storage device) there are still shortcomings. If you want the type system to help you to distinguish between a stream of `int` values and a stream of `float` values, `Stream` won't help you. You'll end up needing some different abstraction that has a type parameter. Something like `IObservable<T>`. The fact that we know exactly what shape of data to expect from `IObservable<T>` is critical to making many of the LINQ operators it supports practical.
+
+Another potential source of confusion is Unix's "everything is a file" design feature. The operating system represents all manner of things through the same OS abstractions as files, and this simplifies the OS design, and in some cases enables you to apply tools originally designed for files in creative ways. But the downside is that some streams are finicky. It's possible to end up with a stream that looks like any other from a .NET type system point of view, but which only works if you read or write in blocks of some particular size.
+
+Conversely, Rx's strictly defined rules for how observable sources interact with their subscribers means we know exactly where we stand.
+
+There isn't a clear model for how streams might support multiple subscribers. Programs such as the Unix `tail` command are able to 'follow' changes to a file, but the way they achieve this is nothing like as simple as two observers both calling `Subscribe`.
+
+And these are just the problems on the consumer side. It's not much fun if you want to implement a source of events as a `Stream` either. To implement your own type that derives from `Stream`, you'll need to implement all ten of the abstract members it defines: 5 properties and 5 methods. This is a far cry from the simple ways `System.Reactive` provides to implement an Rx event source.

+ 93 - 0
Rx.NET/Documentation/IntroToRx/B_Disposables.md

@@ -0,0 +1,93 @@
+# Appendix B: Disposables
+    
+Rx represents subscriptions using the existing `IDisposable` interface. This design choice means we can use existing language features that know how to work with this interface. Rx also provides several public implementations of `IDisposable`. These can be found in the `System.Reactive.Disposables` namespace. This appendix briefly describes each of them.
+
+With the exception of [`ScheduledDisposable`](#scheduleddisposable), these have no particular connection to Rx, and can be useful in any code that needs to work with `IDisposable`. (This code all lives in `System.Reactive` though, so although you could uses these features entirely outside of Rx-based code, you will still be taking a dependency on Rx.NET if you do so.)
+
+## `Disposable.Empty`
+This static property exposes an implementation of `IDisposable` that performs no action when the `Dispose` method is invoked. This can be useful when you are obliged to supply an `IDisposable` (which can happen if you use `Observable.Create`) but don't need to do anything upon disposal.
+
+## `Disposable.Create(Action)`
+
+This static method exposes an implementation of `IDisposable` that invokes the method supplied when the `Dispose` method is invoked. As the implementation follows the guidance to be idempotent, the action will only be called on the first time the `Dispose` method is invoked.
+
+## `BooleanDisposable`
+
+This class implements `IDisposable.Dispose` method and also defines a read-only property `IsDisposed`. `IsDisposed` is <code>false</code> when the class is constructed, and is set to <code>true</code> when the `Dispose` method is invoked.
+
+## `CancellationDisposable`
+
+The `CancellationDisposable` class offers an integration point between the .NET [cancellation paradigm](https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation) (`CancellationTokenSource`) and the resource management paradigm (`IDisposable`). You can create an instance of the `CancellationDisposable` class by providing a `CancellationTokenSource` to the constructor, or by having the parameterless constructor create one for you. Calling `Dispose` will invoke the `Cancel` method on the `CancellationTokenSource`. There are two properties (`Token` and `IsDisposed`) that `CancellationDisposable` exposes; they are wrappers for the `CancellationTokenSource` properties, respectively `Token` and `IsCancellationRequested`.
+
+## `CompositeDisposable`
+
+The `CompositeDisposable` type allows you to treat many disposable resources as one. You can create an instance of `CompositeDisposable` by passing in a <code>params</code> array of disposable resources. Calling `Dispose` on the `CompositeDisposable` will call dispose on each of these resources in the order they were provided. Additionally, the `CompositeDisposable` class implements `ICollection<IDisposable>`; this allows you to add and remove resources from the collection. After the `CompositeDisposable` has been disposed of, any further resources that are added to this collection will be disposed of instantly. Any item that is removed from the collection is also disposed of, regardless of whether the collection itself has been disposed of. This includes usage of both the `Remove` and `Clear` methods.
+
+## `ContextDisposable`
+`ContextDisposable` allows you to enforce that disposal of a resource is performed on a given `SynchronizationContext`. The constructor requires both a `SynchronizationContext` and an `IDisposable` resource. When the `Dispose` method is invoked on the `ContextDisposable`, the provided resource will be disposed of on the specified context.
+
+## `MultipleAssignmentDisposable`
+
+The `MultipleAssignmentDisposable` exposes a read-only `IsDisposed` property and a read/write property `Disposable`. Invoking the `Dispose` method on the `MultipleAssignmentDisposable` will dispose of the current value held by the `Disposable` property. It will then set that value to null. As long as the `MultipleAssignmentDisposable` has not been disposed of, you are able to set the `Disposable` property to `IDisposable` values as you would expect. Once the `MultipleAssignmentDisposable` has been disposed, attempting to set the `Disposable` property will cause the value to be instantly disposed of; meanwhile, `Disposable` will remain null.
+
+## `RefCountDisposable`
+
+The `RefCountDisposable` offers the ability to prevent the disposal of an underlying resource until all dependent resources have been disposed. You need an underlying `IDisposable` value to construct a `RefCountDisposable`. You can then call the `GetDisposable` method on the `RefCountDisposable` instance to retrieve a dependent resource. Each time a call to `GetDisposable` is made, an internal counter is incremented. Each time one of the dependent disposables from `GetDisposable` is disposed, the counter is decremented. Only if the counter reaches zero will the underlying be disposed of. This allows you to call `Dispose` on the `RefCountDisposable` itself before or after the count is zero.
+
+## `ScheduledDisposable`
+
+In a similar fashion to `ContextDisposable`, the `ScheduledDisposable` type allows you to specify a scheduler, onto which the underlying resource will be disposed. You need to pass both the instance of `IScheduler` and instance of `IDisposable` to the constructor. When the `ScheduledDisposable` instance is disposed of, the disposal of the underlying resource will be executed through the provided scheduler.
+
+## `SerialDisposable`
+
+`SerialDisposable` is very similar to `MultipleAssignmentDisposable`, as they both expose a read/write `Disposable` property. The contrast between them is that whenever the `Disposable` property is set on a `SerialDisposable`, the previous value is disposed of. Like the `MultipleAssignmentDisposable`, once the `SerialDisposable` has been disposed of, the `Disposable` property will be set to null and any further attempts to set it will have the value disposed of. The value will remain as null.
+
+## `SingleAssignmentDisposable`
+
+The `SingleAssignmentDisposable` class also exposes `IsDisposed` and `Disposable` properties. Like `MultipleAssignmentDisposable` and `SerialDisposable`, the `Disposable` value will be set to null when the `SingleAssignmentDisposable` is disposed of. The difference in implementation here is that the `SingleAssignmentDisposable` will throw an `InvalidOperationException` if there is an attempt to set the `Disposable` property while the value is not null and the `SingleAssignmentDisposable` has not been disposed of.
+
+<!-- 
+TODO: we recently made SingleAssignmentDisposableValue public after a request to do so. This also doesn't mention MultipleAssignmentDisposableValue, which has been around for a while.
+
+TODO: ICancelable?
+
+TODO: StableCompositeDisposable?
+
+TODO: fit this in?
+
+```csharp
+namespace System.Reactive.Disposables
+{
+    public static class Disposable
+    {
+    // Gets the disposable that does nothing when disposed.
+    public static IDisposable Empty { get {...} }
+
+    // Creates the disposable that invokes the specified action when disposed.
+    public static IDisposable Create(Action dispose)
+    {...}
+    }
+}
+```
+
+As you can see it exposes two members: `Empty` and `Create`. The `Empty` method allows you get a stub instance of an `IDisposable` that does nothing when `Dispose()` is called. This is useful for when you need to fulfil an interface requirement that returns an `IDisposable` but you have no specific implementation that is relevant.
+
+The other overload is the `Create` factory method which allows you to pass an `Action` to be invoked when the instance is disposed. The `Create` method will ensure the standard Dispose semantics, so calling `Dispose()` multiple times will only invoke the delegate you provide once:
+
+```csharp
+var disposable = Disposable.Create(() => Console.WriteLine("Being disposed."));
+Console.WriteLine("Calling dispose...");
+disposable.Dispose();
+Console.WriteLine("Calling again...");
+disposable.Dispose();
+```
+
+Output:
+
+```
+Calling dispose...
+Being disposed.
+Calling again...
+```
+
+Note that "Being disposed." is only printed once. -->

+ 22 - 0
Rx.NET/Documentation/IntroToRx/C_UsageGuidelines.md

@@ -0,0 +1,22 @@
+# Appendix C: Usage guidelines
+
+This is a list of quick guidelines intended to help you when writing Rx queries.
+
+- Members that return a sequence should never return null. This applies to `IEnumerable<T>` and `IObservable<T>` sequences. Return an empty sequence instead.
+- Dispose of subscriptions only if you need to unsubscribe from them early.
+- Always provide an `OnError` handler.
+- Avoid blocking operators such as `First`, `FirstOrDefault`, `Last`, `LastOrDefault`, `Single`, `SingleOrDefault` and `ForEach`.; use the non-blocking alternative such as `FirstAsync`.
+- Avoid switching back and forth between `IObservable<T>` and `IEnumerable<T>`
+- Favour lazy evaluation over eager evaluation.
+- Break large queries up into parts. Key indicators of a large query:
+    1. nesting
+    2. over 10 lines of query expression syntax
+    3. using the `into` keyword
+- Name your observables well, i.e. avoid using variable names like `query`, `q`, `xs`, `ys`, `subject` etc.
+- Avoid creating side effects. If you really can't avoid it, don't bury the side effects in callbacks for operators designed to be use functionally such as `Select` or `Where`. be explicit by using the `Do` operator.
+- Where possible, prefer `Observable.Create` to subjects as a means of defining new Rx sources.
+- Avoid creating your own implementations of the `IObservable<T>` interface. Use `Observable.Create` (or subjects if you really need to).
+- Avoid creating your own implementations of the `IObserver<T>` interface. Favour using the `Subscribe` extension method overloads instead.
+- The application should define the concurrency model.
+    - If you need to schedule deferred work, use schedulers
+    - The `SubscribeOn` and `ObserveOn` operators should always be right before a `Subscribe` method. (So don't sandwich it, e.g. `source.SubscribeOn(s).Where(x => x.Foo)`.)

+ 593 - 0
Rx.NET/Documentation/IntroToRx/D_AlgebraicUnderpinnings.md

@@ -0,0 +1,593 @@
+# Appendix D: Rx's Algebraic Underpinnings
+
+Rx operators can be combined together in more or less any way you can imagine, and they generally combine without any problems. The fact that this works is not merely a happy accident. In general, integration between software components is often one of the largest sources of pain in software development, so the fact that it works so well is remarkable. This is in large part thanks to the fact that Rx relies on some underlying theory. Rx has been designed so that you don't need to know these details to use it, but curious developers typically want to know these things.
+
+The earlier sections of the book have already talked about one formal aspect of Rx: the contract between observable sources and their observables. There is a clearly defined grammar for what constitutes acceptable use of `IObserver<T>`. This goes beyond what the .NET type system is able to enforce, so we are reliant on code doing the right thing. However, the `System.Reactive` library does always adhere to this contract, and it also has some guard types in place that detect when application code has not quite played by the rules, and to prevent this from wreaking havoc.
+
+The `IObserver<T>` grammar is important. Components rely on it to ensure correct operation. Consider the `Where` operator, for example. It provides its own `IObserver<T>` implementation with which it subscribes to the underlying source. This receives items from that source, and then decides which to forward to the observer that subscribed to the `IObservable<T>` presented by `Where`. You could imagine it looking something like this:
+
+```csharp
+public class OverSimplifiedWhereObserver<T> : IObserver<T>
+{
+    private IObserver<T> downstreamSubscriber;
+    private readonly Func<T, bool> predicate;
+
+    public OverSimplifiedWhereObserver(
+        IObserver<T> downstreamSubscriber, Func<T, bool> predicate)
+    {
+        this.downstreamSubscriber = downstreamSubscriber;
+        this.predicate = predicate;
+    }
+
+    public void OnNext(T value)
+    {
+        if (this.predicate(value))
+        {
+            this.downstreamSubscriber.OnNext(value);
+        }
+    }
+
+    public void OnCompleted()
+    {
+        this.downstreamSubscriber.OnCompleted();
+    }
+
+    public void OnError(Exception x)
+    {
+        this.downstreamSubscriber.OnCompleted(x);
+    }
+}
+```
+
+This does not take any explicit steps to follow the `IObserver<T>` grammar. It doesn't need to if the source to which it is subscribes also obeys those rules. Since this only ever calls its subscriber's `OnNext` in its own `OnNext`, and likewise for `OnCompleted` and `OnError`, then as long as the underlying source to which this operator is subscribed obeys the rules for how to call those three methods, this class will in turn also follow those rules automatically.
+
+In fact, `System.Reactive` is not quite that trusting. It does have some code that detects certain violations of the grammar, but even these measures just ensure that the grammar is adhered to once execution enters Rx. There are some checks at the boundaries of the system, but Rx's innards rely heavily on the fact that upstream sources will abide by the rules.
+
+However, the grammar for `IObservable<T>` is not the only place where Rx relies on formalism to ensure correct operation. It also depends on a particular set of mathematical concepts:
+
+* Monads
+* Catamorphisms
+* Anamorphisms
+
+Standard LINQ operators can be expressed purely in terms of these three ideas.
+
+These concepts come from [category theory](https://en.wikipedia.org/wiki/Category_theory), a pretty abstract branch of mathematics concerned with mathematical structures. In the late 1980s, a few computer scientists were exploring this area of maths with a view to using them to model the behaviour of programs. [Eugenio Moggi](https://en.wikipedia.org/wiki/Eugenio_Moggi) (an Italian computer scientist who was, at the time, working at the University of Edinburgh) is generally credited for realising that monads in particular are well suited to describing computations, as his 1991 paper, [Notions of computations and monads](https://person.dibris.unige.it/moggi-eugenio/ftp/ic91.pdf) explains. These theoretical ideas and were incorporated into the Haskell programming language, primarily by Philip Wadler and Simon Peyton Jones, who published a proposal for [monadic handling of IO](https://www.microsoft.com/en-us/research/wp-content/uploads/1993/01/imperative.pdf) in 1992. By 1996, this had been fully incorporated into Haskell in its v1.3 release to enable programs' handling of input and output (e.g., handling user input, or writing data to files) to work in a way that was underpinned by strong mathematical foundations. This has widely been recognized as a significant improvement on Haskell's earlier attempts to model the messy realities of IO in a purely functional language.
+
+Why does any of this matter? These mathematical foundations are exactly why LINQ operators can be freely composed.
+
+The mathematical discipline of category theory has developed a very deep understanding of various mathematical structures, and one of the most useful upshots for programmers is that it offers certain rules which, if followed, can ensure that software elements will behave well when combined together. This is, admittedly, a rather hand-wavey explanation. If you'd like a detailed explanation of exactly how category theory can be applied to programming, and why it is useful to do so, I can highly recommend [Bartosz Milewski's 'Category Theory for Programmers'](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/). The sheer volume of information available there should make it clear why I'm not about to attempt a full explanation in this appendix. Instead, my goal is just to outline the basic concepts, and explain how they correspond to features of Rx.
+
+## Monads
+
+Monads are the most important mathematical concept underpinning LINQ's (and therefore Rx's) design. It's not necessary to have the faintest idea of what a monad is to be able to use Rx. The most important fact is that their mathematical characteristics (and in particular, their support for composition) are what enable Rx operators to combine together freely. From a practical perspective, all that really matters is that it just works, but if you've read this far, that probably won't satisfy you.
+
+It is often hard to describe precisely what mathematical objects really are, because they are inherently abstract. So before I get to the definition of a monad, it may be helpful to understand how LINQ uses this concept. LINQ treats a monad as a general purpose representation of a container of items. As developers, we know that there are many kinds of things that can contain items. There are arrays, and other collection types such as `IList<T>`. There are also databases, and although there are many ways in which a database table is quite different from an array, there are also some ways in which they are similar. The basic insight underpinning LINQ is that there is a mathematical abstraction that captures the essence of what containers have in common. If we determine that some .NET type represents a monad, then all of the work that mathematicians have done over the years to understand the characteristics and behaviours of monads will be applicable to that .NET type.
+
+For example, `IEnumerable<T>` is a monad, as is `IQueryable<T>`. And crucially for Rx, `IObservable<T>` is as well. LINQ's design relies on the properties of monads, so if you can determine that some .NET type is a monad, then it is a candidate for a LINQ implementation. (Conversely, if you try to create a LINQ provider for a type that is not a monad, you are likely to have problems.)
+
+So what are these characteristics that LINQ relies on? The first relates directly to containment: it must be possible to take some value and put it inside your monad. You'll notice that all the examples I've given so far are generic types, and that's no coincidence: monads are essentially type constructors, and the type argument indicates the kind of thing you want the monad to contain. So given some value of type `T`, it must be possible to wrap that in a monad for that type. Given an `int` we can get an `IEnumerable<int>`, and if we couldn't do that, `IEnumerable<T>` would not be monadic. The second characteristic is slightly harder to pin down without getting lost in high abstraction, but it essentially boils down to the idea that if we have functions that we can apply to individual contained items, and if those functions compose in useful ways, we can create new functions that operate not on individual values but on the containers, and crucially, those functions can also be composed in the same ways.
+
+This enables us to work with entire containers as freely as we can work with individual values.
+
+### The monadic operations: return and bind
+
+We've just seen that monads aren't just a type. They need to supply certain operations. This first operation, the ability to wrap a value in the monad, is sometimes called _unit_ in mathematical texts, but in a computing context it is more often known as _return_. This is how [`Observable.Return`](03_CreatingObservableSequences.md#observablereturn) got its name.
+
+There doesn't technically need to be an actual function. The monadic laws are satisfied as long as some mechanism is available to put a value into the monad. For example, unlike `Observable`, the `Enumerable` type does _not_ define a `Return` method, but it doesn't matter. You can just write `new[] { value }`, and that's enough.
+
+Monads are required to provide just one other operation. The mathematical literature calls it _bind_, some programming systems call it `flatMap`, and LINQ refers to it as `SelectMany`. This is the one that tends to cause the most head scratching, because although it has a clear formal definition, it's harder to say what it really does than with _return_. However, we're looking at monads through their ability to represent containers, and this offers a fairly straightforward way to understand bind/`SelectMany`: it lets us take a container where every item is a nested container (e.g., an array of arrays, or an `IEnumerable<IEnumerable<T>>`) and flatten it out. For example, a list of lists would become one list, containing every item from every list. As we'll soon see, this is not obviously related to the formal mathematical definition of bind, which is altogether more abstract, but it is compatible with it, which is all that's needed for us to enjoy the fruits of the mathematicians' labours.
+
+Critically, to qualify as a monad, the two operations just described (return and bind) must conform to certain rules, or _laws_ as they are often described in the literature. There are three laws. All of them govern how the bind operation works, and two of these are concerned with how return and bind interact with one another. These laws are the foundation of the composability of operations based on monads. The laws are somewhat abstract, so it isn't exactly obvious _why_ they enable this, but they are non-negotiable. If your type and operations don't follow these laws, then you don't have a monad, so you can't rely on the characteristics monads guarantee.
+
+So what does bind actually look like? Here's how it looks for `IEnumerable<T>`:
+
+```csharp
+public static IEnumerable<TResult> SelectMany<TSource, TResult> (
+    this IEnumerable<TSource> source,
+    Func<TSource,IEnumerable<TResult>> selector);
+```
+
+So it is a function that takes two inputs. The first is an `IEnumerable<TSource>`. The second input is itself a function which, when supplied with a `TSource` produces an `IEnumerable<TResult>`. And when you invoke `SelectMany` (aka _bind_) with these two arguments, you get back an `IEnumerable<TResult>`. Although formal definition of bind requires it to have this shape, it doesn't dictate any particular behaviour—anything that conforms to the laws is acceptable. But in the context of LINQ, we do expect a specific behaviour: this will invoke the function (the second argument) once for every `TSource` in the source enumerable (the first argument), and then collect all of the `TResult` values produced by all of the `IEnumerable<TResult>` collections returned by all of the invocations of that function, wrapping them as a one big `IEnumerable<TResult>`. In this specific case of `IEnumerable<T>` we could describe `SelectMany` as getting one output collection for each input value, and then concatenating all of those output collections.
+
+But we've now got a little too specific. Even if we're looking specifically at LINQ's use of monads to represent generalised containers, `SelectMany` doesn't necessarily entail concatenation. It merely requires that the container returned by `SelectMany` contains all of the items produced by the function. Concatenation is one strategy, but Rx does something different. Since observables tend to produce values as and when they want to, the `IObservable<TResult>` returned by `Observable.SelectMany` just produces a value each time any of the individual per-`TSource` `IObservable<TResult>`s produced by the function produces a value. (It performs some synchronization to ensure that it follows Rx's rules for calls into `IObserver<T>`, so if one of these observables produces a value while a call to the subscriber's `OnNext` is in progress, it will wait for that to return before pushing the next value. But other than that, it just pushes all values straight through.) So the source values are essentially interleaved here, instead of being concatenated. But the broader principle—that the result is a container with every value produced by the callback for the individual inputs—applies.
+
+The mathematical definition of a monadic bind has the same essential shape, it just doesn't dictate a particular behaviour. So any monad will have a bind operation that takes two inputs: an instance of the monadic type constructed for some input value type (`TSource`), and a function that takes a `TSource` as its input and produces an instance of the monadic type constructed for some output value type (`TResult`). When you invoke bind with these two inputs the result is an instance of the monadic type constructed for the output value type. We can't precisely represent this general idea in C#'s type system, but this sort of gives the broad flavour:
+
+```csharp
+// An impressionistic sketch of the general form of a monadic bind
+public static M<TResult> SelectMany<TSource, TResult> (
+    this M<TSource> source,
+    Func<TSource, M<TResult>> selector);
+```
+
+Substitute your chosen monadic type (`IObservable<T>`, `IEnumerable<T>`, `IQueryable<T>`, or whatever) for `M<T>`, and that tells you what bind should look like for that particular type.
+
+But it's not enough to provide the two functions, return and bind. Not only must they have the correct shape, they must also abide by the laws.
+
+### The monadic laws
+
+So a monad consists of a type constructor (e.g., `IObservable<T>`) and two functions, `Return` and `SelectMany`. (From now on I'm just going to use these LINQy names.) But to qualify as a monad, these  features must abide by three "laws" (given in a very compact form here, which I'll explain in the following sections):
+
+1. `Return` is a 'left-identity' for `SelectMany`
+2. `Return` is a 'right-identity' for `SelectMany`
+3. `SelectMany` should be, in effect, associative
+
+Let's look at each of these in a bit more detail
+
+#### Monadic law 1: `Return` is a 'left-identity' for `SelectMany`
+
+This law means that if you pass some value `x` into `Return` and then pass the result as one of the inputs to `SelectMany` where the other input is a function `SomeFunc`, then the result should be identical to just passing `x` directly into `SomeFunc`. For example:
+
+```csharp
+// Given a function like this:
+//  IObservable<bool> SomeFunc(int)
+// then these two should be identical.
+IObservable<bool> o1 = Observable.Return(42).SelectMany(SomeFunc);
+IObservable<bool> o2 = SomeFunc(42);
+```
+
+Here's an informal way to understand this. `SelectMany` pushes every item in its input container through `SomeFunc`, and each such call produces a container of type `IObservable<bool>`, and it collects all these containers together into one big `IObservable<bool>` that contains items from all of the individual `IObservable<bool>` containers. But in this example, the input we provide to `SelectMany` contains just a single item, meaning that there's no collection work to be done. `SelectMany` is going to invoke our function just once with that one and only input, and that's going to produce just one output `IObservable<bool>`. `SelectMany` is obliged to return an `IObservable<bool>` that contains everything in the single `IObservable<bool>` it got from that single call to `SomeFunc`. There's no actual further processing for it to do in this case. Since there was only one call to `SomeFunc` it doesn't need to combine items from multiple containers in this case: that single output produced by the single call to `SomeFunc` contains everything that should be in the container that `SelectMany` is going to return. We can therefore just invoke `SomeFunc` directly with the single input item.
+
+It would be odd if `SelectMany` did anything else. If `o1` were different in some way, that would mean one of three things:
+
+* `o1` would contain items that aren't in `o2` (meaning it had somehow included items _not_ produced by `SomeFunc`)
+* `o2` would contain items that aren't in `o1` (meaning that `SelectMany` had omitted some of the items produced by `SomeFunc`)
+* `o1` and `o2` contain the same items but are different in some detectable sense specific to the monad type in use (e.g., the items came out in a different order)
+
+So this law essentially formalizes the idea that `SelectMany` shouldn't add or remove items, or fail to preserve characteristics that the monad in use would normally preserve such as ordering. (Note that in .NET LINQ providers, this doesn't generally require these to be exactly the same objects. They normally won't be. It just means that they must represent exactly the same thing. For example, in this case `o1` and `o2` are both `IEnumerable<bool>`, so it means they should each produce exactly the same sequence of `bool` values.)
+
+#### Monadic law 2: `Return` is a 'left-identity' for `SelectMany`
+
+This law means that if you pass `Return` as the function input to `SelectMany`, and then pass some value of the constructed monadic type in as the other argument, you should get that same value as the output. For example:
+
+```csharp
+// These two should be identical.
+IObservable<int> o1 = GetAnySource();
+IObservable<int> o2 = o1.SelectMany(Observable.Return);
+```
+
+By using `Return` as the function for `SelectMany`, we are essentially asking to take every item in the input container and to wrap it in its very own container (`Return` wraps a single item) and then to flatten all of those containers back out into a single container. We are adding a layer of wrapping and then removing it again, so it makes sense that this should have no effect.
+
+#### Monadic law 3: `SelectMany` should be, in effect, associative
+
+Suppose we have two functions, `Tx1` and `Tx2`, each of a form suitable for passing as the argument to `SelectMany`. There are two ways we could apply these:
+
+```csharp
+// These two should be identical.
+IObservable<int> o1 = source.SelectMany(x => Tx1(x).SelectMany(Tx2));
+IObservable<int> o2 = source.SelectMany(x => Tx1(x)).SelectMany(Tx2);
+```
+
+The difference here is just a slight change in the placements of the parentheses: all that changes is whether the call to `SelectMany` on the right-hand side is invoked inside the function passed to the other `SelectMany`, or it is invoked on the result of the other `SelectMany`. This next example adjusts the layout, and also replaces the lambda `x => Tx1(x)` with the exactly equivalent `Tx1`, which might make the difference in structure a bit easier to see:
+
+```csharp
+IObservable<int> o1 = source
+    .SelectMany(x => Tx1(x).SelectMany(Tx2));
+IObservable<int> o2 = source
+    .SelectMany(Tx1)
+    .SelectMany(Tx2);
+```
+
+The third law says that either of these should have the same effect. It shouldn't matter whether the second `SelectMany` call (for `Tx2`) happens "inside" or after the first `SelectMany` call.
+
+An informal way to think about this is that `SelectMany` effectively applies two operations: a transformation and an unwrap. The transformation is defined by whatever function you pass to `SelectMany`, but because that function returns the monad type (in LINQ terms it returns a container which may contain any number of items) `SelectMany` unwraps each container returned when it passes an item to the function, in order to collect all the items together into the single container it ultimately returns. When you nest this sort of operation, it doesn't matter which order that unwrapping occurs in. For example, consider these functions:
+
+```csharp
+IObservable<int> Tx1(int i) => Observable.Range(1, i);
+IObservable<string> Tx2(int i) => Observable.Return(i.ToString());
+```
+
+The first converts a number into a range of numbers of the same length. `1` becomes `[1]`, `3` becomes `[1,2,3]` and so on. Before we get to `SelectMany`, imagine what will happen if we use this with `Select` on an observable source that produces a range of numbers:
+
+```csharp
+IObservable<int> input = Observable.Range(1, 3); // [1,2,3]
+IObservable<IObservable<int>> expandTx1 = input.Select(Tx1);
+```
+
+We get a sequence of sequences. `expand2` is effectively this:
+
+```
+[
+    [1],
+    [1,2],
+    [1,2,3],
+]
+```
+
+If instead we had used `SelectMany`:
+
+```csharp
+IObservable<int> expandTx1Collect = input.SelectMany(Tx1);
+```
+
+it would apply the same transformation, but then flatten the results back out into a single list:
+
+```
+[
+    1,
+    1,2,
+    1,2,3,
+]
+```
+
+I've kept the line breaks to emphasize the connection between this and the preceding output, but I could just have written `[1,1,2,1,2,3]`.
+
+If we then want to apply the second transform, we could use `Select`:
+
+```csharp
+IObservable<IObservable<string>> expandTx1CollectExpandTx2 = expandTx1Collect
+    .SelectMany(Tx1)
+    .Select(Tx2);
+```
+
+This passes each number in `expandTx1Collect` to `Tx2`, which converts it into a sequence containing a single string:
+
+```
+[
+    ["1"],
+    ["1"],["2"],
+    ["1"],["2"],["3"]
+]
+```
+
+But if we use `SelectMany` on that final position too:
+
+```csharp
+IObservable<string> expandTx1CollectExpandTx2Collect = expandTx1Collect
+    .SelectMany(Tx1)
+    .SelectMany(Tx2);
+```
+
+it flattens these back out into just the strings:
+
+```
+[
+    "1",
+    "1","2",
+    "1","2","3"
+]
+```
+
+The associative-like requirement says it shouldn't matter if we apply `Tx1` inside the function passed to the first `SelectMany` instead of applying it to the result of that first `SelectMany`. So instead of starting with this:
+
+```csharp
+IObservable<IObservable<int>> expandTx1 = input.Select(Tx1);
+```
+
+we might write this:
+
+```csharp
+IObservable<IObservable<IObservable<string>>> expandTx1ExpandTx2 =
+    input.Select(x => Tx1(x).Select(Tx2));
+```
+
+That's going to produce this:
+
+```
+[
+    [["1"]],
+    [["1"],["2"]],
+    [["1"],["2"],["3"]]
+]
+```
+
+If we change that to use `SelectMany` for the nested call:
+
+```csharp
+IObservable<IObservable<string>> expandTx1ExpandTx2Collect =
+    input.Select(x => Tx1(x).SelectMany(Tx2));
+```
+
+That's going to flatten out the inner items (but we're still using `Select` on the outside, so we still get a list of lists) producing this:
+
+```
+[
+    ["1"],
+    ["1","2"],
+    ["1","2","3"]
+]
+```
+
+And then if we change that first `Select` to `SelectMany`:
+
+```csharp
+IObservable<string> expandTx1ExpandTx2CollectCollect =
+    input.SelectMany(x => Tx1(x).SelectMany(Tx2));
+```
+
+it will flatten that outer layer of lists, giving us:
+
+```
+[
+    "1",
+    "1","2",
+    "1","2","3"
+]
+```
+
+That's the same final result we got earlier, as the 3rd monad law requires.
+
+To summarize, the two processes here were:
+
+* expand and transform Tx1, flatten, expand and transform Tx2, flatten
+* expand and transform Tx1, expand and transform Tx2, flatten, flatten
+
+Both of these apply both transforms, and flatten out the extra layers of containment added by these transforms, and so although the intermediate steps looked different, we ended up with the same result, because it doesn't matter whether you unwrap after each transform, or you perform both transforms before unwrapping.
+
+#### Why these laws matter
+
+These three laws directly reflect laws that hold true for composition of straightforward functions over numbers. If we have two functions, $f$, and $g$, we could write a new function $h$, defined as $g(f(x))$. This way of combining function is called _composition_, and is often written as $g \circ f$. If the identity function is called $id$, then the following statements are true:
+
+* $id \circ f$ is equivalent to just $f$
+* $f \circ id$ is equivalent to just $f$
+* $(f \circ g) \circ s$ is equivalent to $f \circ (g \circ s)$
+
+These correspond directly to the three monad laws. Informally speaking, this reflects the fact that the monadic bind operation (`SelectMany`) has deep structurally similarity to function composition. This is why we can combine LINQ operators together freely.
+
+### Recreating other operators with `SelectMany`
+
+Remember that there are three mathematical concepts at the heart of LINQ: monads, anamorphisms and catamorphisms. So although the preceding discussion has focused on `SelectMany`, the significance is much wider because we can express other standard LINQ operators in terms of these primitives. For example, this shows how we could implement [`Where`](05_Filtering.md#where) using just `Return` and `SelectMany`:
+
+```csharp
+public static IObservable<T> Where<T>(this IObservable<T> source, Func<T, bool> predicate)
+{
+    return source.SelectMany(item =>
+        predicate(item)
+            ? Observable.Return(item)
+            : Observable.Empty<T>());
+}
+```
+
+This implements `Select`:
+
+```csharp
+public static IObservable<TResult> Select<TSource, TResult>(
+    this IObservable<TSource> source, Func<TSource, TResult> f)
+{
+    return source.SelectMany(item => Observable.Return(f(item)));
+}
+```
+
+Some operators require anamorphisms or catamorphisms, so let's look at those now.
+
+## Catamorphisms
+
+A catamorphism is essentially a generalization of any kind of processing that takes every item in a container into account. In practice in LINQ, this typically means processes that inspect all of the values, and produce a single value as a result, such as [Observable.Sum](07_Aggregation.md#sum). More generally, aggregation of any kind constitutes catamorphism. The mathematical definition of catamorphism is more general than this—it doesn't necessarily have to reduce things all the way down to a single value for example—but for the purposes of understanding LINQ, this container-oriented viewpoint is the most straightforward way to think about this construct.
+
+Catamorphisms are one of the fundamental building blocks of LINQ because you can't construct catamorphisms out of the other elements. But there are numerous LINQ operators that can be built out of LINQ's most elemental catamorphism, the [`Aggregate`](07_Aggregation.md#aggregate) operator. For example, here's one way to implement `Count` in terms of `Aggregate`:
+
+```csharp
+public static IObservable<int> MyCount<T>(this IObservable<T> items)
+    => items.Aggregate(0, (total, _) => total + 1);
+```
+
+We could implement `Sum` thus:
+
+```csharp
+public static IObservable<T> MySum<T>(this IObservable<T> items)
+    where T : INumber<T>
+    => items.Aggregate(T.Zero, (total, x) => x + total);
+```
+
+This is more flexible than the similar sum example I showed in the [Aggregation chapter](07_Aggregation.md), because that worked only with an `IObservable<int>`. Here I'm using the _generic math_ feature added in C# 11.0 and .NET 7.0 to enable `MySum` to work across any number-like type. But the basic principle of operation is the same.
+
+If you came here for the theory, it probably won't be enough for you just to see that the various aggregating operators are all special cases of `Aggregate`. What really is a catamorphism? One definition is as "the unique homomorphism from an initial algebra into some other algebra" but as is typical with category theory, that's one of those explanations that's easiest to understand if you already understand the concepts it's trying to describe. If you try to understand this description in terms of the school mathematics form of algebra, in which we write equations where some values are represented by letters, it's hard to make sense of this definition. That's because catamorphisms take a much more general view of what constitutes "algebra," meaning essentially some system by which expressions of some kind can be constructed and evaluated.
+
+To be more precise, Catamorphisms are described in relation to something called an F-algebra. That's a combination of three things:
+
+1. a Functor, _F_, that defines some sort of structure over some category _C_
+2. some object _A_ in the category _C_
+3. a morphism from _F A_ to _A_ that effectively evaluates the structure
+
+But that opens up more questions than it answers. So let's start with the obvious one: what's a Functor? From a LINQ perspective, it's essentially anything that implements `Select`. (Some programming systems call this `fmap`.) From our container-oriented viewpoint it's two things: 1) a type constructor that is container-like (e.g. something like `IEnumerable<T>` or `IObservable<T>`) and 2) some means of applying a function to everything in the container. So if you have a function that converts from `string` to `int`, a Functor lets you apply that to everything it contains in a single step.
+
+The combination of `IEnumerable<T>` and its `Select` extension method is a Functor. You can use `Select` to convert an `IEnumerable<string>` to an `IEnumerable<int>`. `IObservable<T>` and its `Select` form another Functor, and we can use these to get from an `IObservable<string>` to an `IObservable<int>`. What about that "over some category _C_" part? That alludes to the fact that the mathematical description of a Functor is rather broader. When developers use category theory, we generally stick to a category that represents types (as in programming language types like `int`) and functions. (Strictly speaking a Functor maps from one category to another, so in the most general case, a Functor maps objects and morphisms in some category _C_ into objects and morphisms in some category _D_. But for programming purposes, we are always using the category representing types, so for the Functors we use _C_ and _D_ will be the same thing. Strictly speaking this means we should be calling them Endofunctors, but nobody seems to bother. In practice we use the name for the more general form, Functor, and it's just taken as read that we mean an Endofunctor over the category of types and functions.)
+
+So, that's the Functor part. Let's move onto 2, "some object _A_ in the category _C_." Well _C_ is the Functor's category, and we just established that objects in that category are types, so _A_ here might be the `string` type. If our chosen Functor is the combination of `IObservable<T>` and its `Select` method, then _F A_ would be `IObservable<string>`.
+
+So what about the "morphisms" in 3? Again, for our purposes we're just using Endofunctors over types and functions, so in this context, morphisms are just functions. So we could recast the definition of an F-algebra in more familiar terms as:
+
+1. some container-like generic type such as `IObservable<T>`
+2. an item type `A` (e.g., `string`, or `int`)
+3. a function that takes an `IObservable<A>` and returns a value of type `A` (e.g. `Observable.Aggregate<A>`)
+
+This is a good deal more specific. Category theory is typically concerned with capturing the most general truths about mathematical structures, and this reformulation throws that generality away. However, from the perspective of a programmer looking to lean on mathematical theory, this is fine. As long as what we're doing fits the F-algebra mould, all the general results that mathematicians have derived will apply to our more specialized application of the theory.
+
+Nonetheless, to give you an idea of the sorts of things the general concept of F-algebras can enable, it's possible for the Functor to be a type that represents expressions in a programming language, and you could create an F-algebra that evaluates those expressions. That's a similar idea to LINQ's `Aggregate`, in that it walks over the entire structure represented by the Functor (every element in a list if it's an `IEnumerable<T>`; every subexpression if you're representing an expression) and reduces the whole thing to a single value, but instead of our Functor representing a sequence of things, it has a more complex structure: expressions in some programming language.
+
+So that's an F-algebra. And from a theory point of view, it's important that the third part doesn't necessarily have to reduce things. Theoretically, the types can be recursive, with the item type _A_ being _F A_. (This is important for inherently recursive structures such as expressions.) And there is typically a maximally general F-algebra in which the function (or morphism) in 3 only deals with the structure, and which doesn't actually perform any reduction at all. (E.g., given some expression syntax, you could imagine code that embodies all of the knowledge required to walk through every single subexpression of an expression, but which has no particular opinion on what processing to apply.) The idea of a catamorphism is that there are less other F-algebras available for the same Functor that are less general.
+
+For example, with `IObservable<T>` the general purpose notion is that every item produced by some source can be processed by repeatedly applying some function of two arguments, one of which is a value of type `T` from the container, and the other of which is some sort of accumulator, representing all information aggregated so far. And this function would return the updated accumulator, ready to be passed into the function again along with the next `T`. And then there are more specific forms in which specific accumulation logic (e.g., summation, or determination of a maximum value) is applied. Technically, the catamorphism here is the connection from the general form to the more specialized form. But in practice it's common to refer to the specific specialized forms (such as [`Sum`](07_Aggregation.md#sum) or [`Average`](07_Aggregation.md#average)) as catamorphisms.
+
+### Remaining inside the container
+
+Although in general a catamorphism can strip off the container (e.g., `Sum` for `IEnumerable<int>` produces an `int`), this isn't absolutely necessary, and with Rx most catamorphisms don't do this. As described in the threading and scheduling chapter's [Lock-ups](11_SchedulingAndThreading.md#lock-ups) section, blocking some thread while waiting for a result that will only occur once an `IObservable<T>` has done something in particular (e.g., if you want to calculate the sum of items, you have to wait until you've seen all the items) is a recipe for deadlock in practice.
+
+For this reason, most of the catamorphisms perform some sort of reduction but continue to produce a result wrapped in an `IObservable<T>`.
+
+## Anamorphisms
+
+Anamorphisms are, roughly speaking, the opposite of catamorphisms. While catamorphisms essentially collapse some sort of structure down to something simpler, an anamorphism expands some input into a more complex structure. For example, given some number (e.g., 5) we could imagine a mechanism for turning that into a sequence with the specified number of elements in it (e.g., [0,1,2,3,4]).
+
+In fact we don't have to imagine such a thing: that's what [`Observable.Range`](03_CreatingObservableSequences.md#observablerange) does.
+
+We could think of the monadic `Return` operation as a very simple anamorphism. Given some value of type `T`, [`Observable.Return`](03_CreatingObservableSequences.md#observablereturn) expands this into an `IObservable<T>`. Anamorphisms are essentially the generalization of this sort of idea.
+
+The mathematical definition of an anamorphism is "the assignment of a coalgebra to its unique morphism to the final coalgebra of an endofunctor." This is the "dual" of the definition of a catamorphism, which from a category theory point of view essentially means that you reverse the direction of all of the morphisms. In our not-completely-general application of category theory, the morphisms in question here are the reduction of items to some output in a catamorphism, and so with an anamorphism this turns into the expansion of some value into the some instance of the container type (e.g., from an `int` to an `IObservable<int>`).
+
+I'm not going to go into as much detail as with catamorphisms. Instead, I'm going to point out the key part at the heart of this: the most general F-algebra for a Functor embodies some understanding of the essential structure of the Functor, and catamorphisms make use of that to define various reductions. Similarly, the most general coalgebra for a Functor also embodies some understanding of the essential structure of the Functor and anamorphisms make use of that to define various expansions.
+
+[`Observable.Generate`](03_CreatingObservableSequences.md#observablegenerate) represents this most general capability: it has the capability to produce an `IObservable<T>` but needs to be supplied with some specialized expansion function to generate any particular observable.
+
+## So much for theory
+
+Now we've reviewed the theoretical concepts behind LINQ, let's step back and look at how we use them. We have three kinds of operations:
+
+* Anamorphisms enter the sequence: `T1 --> IObservable<T2>`
+* Bind modifies the sequence. `IObservable<T1> --> IObservable<T2>`
+* Catamorphisms leave the sequence. Logically `IObservable<T1> --> T2`, but in practice typically `IObservable<T1> --> IObservable<T2>` where the output observable produces just a single value
+
+As an aside, bind and catamorphism were made famous by Google's [MapReduce](http://en.wikipedia.org/wiki/MapReduce) framework from Google. Here Google, refer to Bind and Catamorphism by names more commonly used in some functional languages, Map and Reduce.
+
+Most Rx operators are actually specializations of the higher order functional concepts. To give a few examples:
+
+- Anamorphisms:
+  - [`Generate`](03_CreatingObservableSequences.md#observablegenerate)
+  - [`Range`](03_CreatingObservableSequences.md#observablerange)
+  - [`Return`](03_CreatingObservableSequences.md#observablereturn)
+- Bind:
+  - [`SelectMany`](06_Transformation.md#selectmany)
+  - [`Select`](06_Transformation.md#select)
+  - [`Where`](05_Filtering.md)
+- Catamorphism:
+  - [`Aggregate`](07_Aggregation.md#aggregate)
+  - [`Sum`](07_Aggregation.md#sum)
+  - [`Min` and `Max`](07_Aggregation.md#min-and-max)
+
+## Amb
+
+The `Amb` method was a new concept to me when I started using Rx. This function was first introduced by [John McCarthy](https://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)), in his 1961 paper ['A Basis for a Mathematical Theory of Computation'](https://www.cambridge.org/core/journals/journal-of-symbolic-logic/article/abs/john-mccarthy-a-basis-for-a-mathematical-theory-of-computation-preliminary-report-proceedings-of-the-western-joint-computer-conference-papers-presented-at-the-joint-ireaieeacm-computer-conference-los-angeles-calif-may-911-1961-western-joint-computer-conference-1961-pp-225238-john-mccarthy-a-basis-for-a-mathematical-theory-of-computation-computer-programming-and-formal-systems-edited-by-p-braffort-and-d-hirschberg-studies-in-logic-and-the-foundations-of-mathematics-northholland-publishing-company-amsterdam1963-pp-3370/D1AD4E0CDB7FBE099B04BB4DAF24AFFA) in the Proceedings of the Western Joint Computer Conference. (A digital copy of this is hard to find, but a later version was published in [1963](http://www-formal.stanford.edu/jmc/basis1.pdf) in 'Computer Programming and Format Systems'.) It is an abbreviation of the word _Ambiguous_. Rx diverges slightly from normal .NET class library naming conventions here in using this abbreviation, partly because `amb` is the established name for this operator, but also as a tribute to McCarthy, whose work was an inspiration for the design of Rx.
+
+But what does `Amb` do? The basic idea of an [_ambiguous function_](http://www-formal.stanford.edu/jmc/basis1/node7.html) is that we are allowed to define multiple ways to produce a result, and that some or all of these might in practice prove unable to produce a result. Suppose we've defined some ambiguous function called `equivocate`, and perhaps that for some particular input value, all of `equivocate`'s component parts—all the different ways we gave it of calculating a result—are unable to process the value. (Maybe every one of them divides a number by the input. If we supply an input of `0`, then none of the components can produce a value for this input because they would all attempt to divide by 0.) In cases such as these where none of `equivocate`'s component parts is able to produce a result, `equivocate` itself is unable to produce a result. But suppose we supply some input where exactly one of its component parts is able to produce a result. In that case this result becomes the result of `equivocate` for that input.
+
+So in essence, we're supplying a bunch of different ways to process the input, and if exactly one of those is able to produce a result, we select that result. And if none of the ways of processing the input produces anything, then our ambiguous function also produces nothing.
+
+Where it gets slightly more weird (and where Rx departs from the original definition of `amb`) is when more than one of an ambiguous function's constituents produces a result. In McCarthy's theoretical formulation, the ambiguous function effectively produces all of the results as possible outputs. (This is technically known as _nondeterministic_ computation, although that name can be misleading: it makes it sound like the result will be unpredictable. But that's not what we mean by _nondeterministic_ when talking about computation. It is as though the computer evaluating the ambiguous function clones itself, producing a copy for each possible result, continuing to execute every single copy. You could imagine an multithreaded implementation of such a system, where every time an ambiguous function produces multiple possible results, we create that many new threads so as to be able to evaluate all possible outcomes. This is a reasonable mental model for nondeterministic computation, but it's not what actually happens with Rx's `Amb` operator.) In the kinds of theoretical work ambiguous functions were introduced for, the ambiguity often vanishes in the end. There may have been an enormous number of ways in which a computation could have proceeded, but they might all, finally, produce the same result. However, such theoretical concerns are taking us away from what Rx's `Amb` does, and how we might use it in practice.
+
+[Rx's `Amb`](09_CombiningSequences.md#amb) provides the behaviour described in the cases where either none of the inputs produces anything, or exactly one of them does. However, it makes no attempt to support non-deterministic computation, so its handling of the case where multiple constituents are able to produce value is oversimplified, but then McCarthy's `amb` was first and foremost an analytical construct, so any practical implementation of it is always going to fall short.
+
+## Staying inside the monad
+
+It can be tempting to flip between programming styles when using Rx. For the parts where it's easy to see how Rx applies, then we will naturally use Rx. But when things get tricky, it might seem easiest to change tracks. It might seem like the easiest thing to do would be to `await` an observable, and then proceed with ordinary sequential code. Or maybe it might seem simplest to make callbacks passed to operators like `Select` or `Where` perform operations in addition to their main jobs—to have side effects that do useful things.
+
+Although this can sometimes work, switching between paradigms should be done with caution, as this is a common root cause for concurrency problems such as deadlock and scalability issues. The basic reason for this is that for as long as you remain within Rx's way of doing things, you will benefit from the basic soundness of the mathematical underpinnings. But for this to work, you need to use a functional style. Functions should process their inputs and deterministically produce outputs based on those inputs, and they should neither depend on external state nor change it. This can be a tall order, and it won't always be possible, but a lot of the theory falls apart if you break these rules. Composition doesn't work as reliably as it can. So using a functional style, and keeping your code within Rx's idiom will tend to improve reliability.
+
+## Issues with side effects
+
+Programs always have to have some side effects if they are to do anything useful—if the world is no different as a result of a program having run, then you may as well not have run it—so it can be useful to explore the issues with side effects, so that we can know how best to deal with them when they are necessary. So we will now discuss the consequences of introducing side effects when working with an observable sequence. A function is considered to have a side effect if, in addition to any return value, it has some other observable effect. Generally the 'observable effect' is a modification of state. This observable effect could be:
+
+* modification of a variable with a wider scope than the function (i.e. global, static or perhaps an argument)
+* I/O such as a read from or modifying a file, sending or receiving network messages, or updating a display
+* causing physical activity, such as when a vending machine dispenses an item, or directs a coin into its coin box
+
+Functional programming in general tries to avoid creating any side effects. Functions with side effects, especially those which modify state, require the programmer to understand more than just the inputs and outputs of the function. Fully understanding the function's operation could entail knowing the full history and context of the state being modified. This can greatly increase the complexity of a function, and making it harder to correctly understand and maintain.
+
+Side effects are not always intentional. An easy way to reduce accidental side effects is to reduce the surface area for change. Here are two simple action coders can take: reduce the visibility or scope of state and make what you can immutable. You can reduce the visibility of a variable by scoping it to a code block like a method (instead of a field or property). You can reduce visibility of class members by making them private or protected. By definition immutable data can't be modified so it can't exhibit side effects. These are sensible encapsulation rules that will dramatically improve the maintainability of your Rx code.
+
+To provide a simple example of a query that has a side effect, we will try to output the index and value of the elements that a subscription receives by updating a variable (closure).
+
+```csharp
+IObservable<char> letters = Observable
+    .Range(0, 3)
+    .Select(i => (char)(i + 65));
+
+int index = -1;
+IObservable<char> result = letters.Select(
+    c =>
+    {
+        index++;
+        return c;
+    });
+
+result.Subscribe(
+    c => Console.WriteLine("Received {0} at index {1}", c, index),
+    () => Console.WriteLine("completed"));
+```
+
+Output:
+
+```
+Received A at index 0
+Received B at index 1
+Received C at index 2
+completed
+```
+
+While this seems harmless enough, imagine if another person sees this code and understands it to be the pattern the team is using. They in turn adopt this style themselves. For the sake of the example, we will add a duplicate subscription to our previous example.
+
+```csharp
+var letters = Observable.Range(0, 3)
+                        .Select(i => (char)(i + 65));
+
+var index = -1;
+var result = letters.Select(
+    c =>
+    {
+        index++;
+        return c;
+    });
+
+result.Subscribe(
+    c => Console.WriteLine("Received {0} at index {1}", c, index),
+    () => Console.WriteLine("completed"));
+
+result.Subscribe(
+    c => Console.WriteLine("Also received {0} at index {1}", c, index),
+    () => Console.WriteLine("2nd completed"));
+```
+
+Output
+
+```
+Received A at index 0
+Received B at index 1
+Received C at index 2
+completed
+Also received A at index 3
+Also received B at index 4
+Also received C at index 5
+2nd completed
+```
+
+Now the second person's output is clearly nonsense. They will be expecting index values to be 0, 1 and 2 but get 3, 4 and 5 instead. I have seen far more sinister versions of side effects in code bases. The nasty ones often modify state that is a Boolean value e.g. `hasValues`, `isStreaming` etc.
+
+In addition to creating potentially unpredictable results in existing software, programs that exhibit side effects are far more difficult to test and maintain. Future refactoring, enhancements or other maintenance on programs that exhibits side effects are far more likely to be brittle. This is especially so in asynchronous or concurrent software.
+
+## Composing data in a pipeline
+
+The preferred way of capturing state is as part of the information flowing through the pipeline of Rx operators making up your subscription. Ideally, we want each part of the pipeline to be independent and deterministic. That is, each function that makes up the pipeline should have its inputs and output as its only state. To correct our example we could enrich the data in the pipeline so that there is no shared state. This would be a great example where we could use the `Select` overload that exposes the index.
+
+```csharp
+IObservable<int> source = Observable.Range(0, 3);
+IObservable<(int Index, char Letter)> result = source.Select(
+    (idx, value) => (Index: idx, Letter: (char) (value + 65)));
+
+result.Subscribe(
+    x => Console.WriteLine($"Received {x.Letter} at index {x.Index}"),
+    () => Console.WriteLine("completed"));
+
+result.Subscribe(
+    x => Console.WriteLine($"Also received {x.Letter} at index {x.Index}"),
+    () => Console.WriteLine("2nd completed"));
+```
+
+Output:
+
+```
+Received A at index 0
+Received B at index 1
+Received C at index 2
+completed
+Also received A at index 0
+Also received B at index 1
+Also received C at index 2
+2nd completed
+```
+
+Thinking outside of the box, we could also use other features like `Scan` to achieve similar results. Here is an example.
+
+```csharp
+var result = source.Scan(
+                new
+                {
+                    Index = -1,
+                    Letter = new char()
+                },
+                (acc, value) => new
+                {
+                    Index = acc.Index + 1,
+                    Letter = (char)(value + 65)
+                });
+```
+
+The key here is to isolate the state, and reduce or remove any side effects like mutating state.

+ 152 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-Input-And-Output.svg

@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 504.81 168.65">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-3 {
+        stroke-width: 0px;
+      }
+
+      .cls-2 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-1" x1="30.52" y1="48.3" x2="482.24" y2="48.3"/>
+  <line id="Quiescent_line" data-name="Quiescent line" class="cls-1" x1="30.52" y1="129.88" x2="483.57" y2="129.88"/>
+  <g>
+    <path class="cls-3" d="M33.67,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-3" d="M40.73,22.49c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,22.54c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-3" d="M46.93,25.48h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-3" d="M49.04,19.6h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-3" d="M59.97,25.26c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-3" d="M66.97,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+  </g>
+  <g>
+    <path class="cls-3" d="M33.67,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-3" d="M40.73,99.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,99.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-3" d="M46.93,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-3" d="M49.04,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-3" d="M59.97,101.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-3" d="M66.97,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M70.91,100.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-3" d="M76.99,102.27c-.41-.06-.76-.19-1.06-.39s-.55-.46-.75-.79-.35-.71-.45-1.15-.15-.93-.15-1.47c0-.7.08-1.3.24-1.8s.38-.93.65-1.26.6-.57.96-.73.76-.24,1.17-.24c.49,0,.92.09,1.29.27s.67.43.91.77.42.74.54,1.21.18,1.01.18,1.6c0,.62-.07,1.17-.2,1.64s-.31.87-.54,1.2-.5.59-.81.77-.65.31-1.01.37c.06.34.2.62.41.83s.52.31.91.31c.19,0,.37-.03.55-.09s.37-.17.55-.32l.46.72c-.26.21-.52.36-.8.45s-.55.13-.84.13c-.31,0-.6-.04-.86-.13s-.49-.21-.68-.38-.35-.38-.47-.64-.19-.55-.21-.89ZM79.45,98.41c0-.45-.03-.87-.1-1.24s-.18-.69-.33-.96-.35-.48-.59-.62-.53-.22-.87-.22-.61.08-.85.23-.43.37-.58.64-.27.58-.34.94-.11.74-.11,1.14c0,.46.04.89.11,1.26s.18.7.33.97.34.48.58.62.53.22.86.22.61-.08.85-.23.43-.37.59-.64.27-.58.34-.95.11-.75.11-1.16Z"/>
+    <path class="cls-3" d="M86.52,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-3" d="M90.39,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM90.75,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-3" d="M99.95,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM98.89,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M106.24,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-3" d="M112.75,101.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-3" d="M119.75,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M121.38,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-3" d="M132.71,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-3" d="M138.09,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-3" d="M146.33,95.44h-2.27v6.77h-1.05v-6.77h-2.27v-.89h5.59v.89Z"/>
+    <path class="cls-3" d="M149.77,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM150.13,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-3" d="M158.56,102.2v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.25-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-3" d="M165.93,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM164.87,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M172.46,100.13c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-3" d="M179.18,99.16c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM178.14,99.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-3" d="M184.53,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM184.42,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-3" d="M187.35,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-3" d="M196.26,100.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-3" d="M205.13,95.44h-3.25v2.48h3.08v.87h-3.08v3.41h-1.07v-7.66h4.32v.89Z"/>
+    <path class="cls-3" d="M207.39,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-3" d="M218.86,99.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM217.82,99.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-3" d="M224.54,102.2v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.25-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-3" d="M231.84,100.13c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-3" d="M238.5,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM237.44,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M244.7,101.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-3" d="M251.85,99.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM250.81,99.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-3" d="M253.33,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-3" d="M259.63,99.38c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM260.67,99.32c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-3" d="M271.18,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-3" d="M276.64,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-3" d="M284.69,102.2h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-3" d="M287.52,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-3" d="M293.37,103.4c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-3" d="M311.01,100.13c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-3" d="M317.28,101.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-3" d="M324.03,102.2h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-3" d="M330.87,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM329.81,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M332.2,99.38c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM333.25,99.32c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-3" d="M343.83,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-3" d="M347.7,94.76h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-3" d="M357.26,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM356.2,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M359.13,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-3" d="M367.8,100.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-3" d="M377.32,98.29c0,.37-.03.72-.08,1.05s-.15.65-.27.94-.29.55-.49.79-.44.44-.73.61-.62.3-1.01.39-.82.14-1.31.14h-1.64v-7.66h1.97c1.2,0,2.09.31,2.67.92s.88,1.56.88,2.82ZM376.22,98.37c0-.54-.05-1-.15-1.38s-.26-.68-.46-.91-.47-.4-.78-.5-.68-.16-1.1-.16h-.9v5.88h.78c1.74,0,2.61-.98,2.61-2.94Z"/>
+    <path class="cls-3" d="M383.65,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM382.59,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-3" d="M390.5,94.87c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-3" d="M395.66,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM395.55,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-3" d="M403.21,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-3" d="M407.08,94.76h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-3" d="M416.41,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-3" d="M419.47,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="61.2" cy="48.3" r="13.56"/>
+    <path class="cls-3" d="M63.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="92.28" cy="48.3" r="13.56"/>
+    <path class="cls-3" d="M95.03,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="145.36" cy="129.88" r="13.56"/>
+    <g>
+      <path class="cls-3" d="M138.15,133.81h-2.03v-7.61h2.03v.56h-1.35v6.49h1.35v.56Z"/>
+      <path class="cls-3" d="M142.25,132.28h-2.84v-.59h1.05v-3.9h-1.05v-.53c.4,0,.69-.06.88-.17s.29-.33.32-.64h.61v5.24h1.03v.59Z"/>
+      <path class="cls-3" d="M144.86,131.17l-1.09,2.56h-.57l.69-2.56h.98Z"/>
+      <path class="cls-3" d="M151.84,132.28h-3.59v-.82c.26-.24.5-.48.73-.7s.45-.46.67-.7c.44-.49.74-.88.91-1.17s.24-.6.24-.91c0-.16-.03-.3-.08-.43s-.12-.22-.21-.3c-.09-.08-.2-.14-.32-.18s-.25-.06-.39-.06-.28.02-.42.05-.28.08-.41.13c-.11.04-.21.1-.32.16s-.18.12-.25.16h-.04v-.83c.16-.08.39-.16.67-.24s.56-.12.82-.12c.54,0,.97.14,1.27.43s.46.68.46,1.17c0,.23-.03.44-.08.63s-.13.37-.22.54c-.1.17-.21.34-.35.5s-.28.33-.43.49c-.24.27-.52.54-.82.83s-.54.51-.72.68h2.86v.67Z"/>
+      <path class="cls-3" d="M154.61,133.81h-2.03v-.56h1.35v-6.49h-1.35v-.56h2.03v7.61Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-2" cx="334.9" cy="129.88" r="13.56"/>
+    <g>
+      <path class="cls-3" d="M325.59,133.81h-2.03v-7.61h2.03v.56h-1.35v6.49h1.35v.56Z"/>
+      <path class="cls-3" d="M327.97,127.02c-.14,0-.28.02-.42.05s-.28.08-.41.13c-.12.05-.23.11-.33.16s-.18.11-.25.16h-.05v-.82c.17-.09.4-.17.69-.25s.57-.11.83-.11.49.03.69.08.37.14.53.25c.17.12.3.28.39.45s.13.38.13.62c0,.32-.11.6-.32.84s-.46.4-.76.46v.05c.12.02.25.06.39.12s.27.14.39.25.22.26.29.43.11.39.11.64-.04.5-.13.72-.22.41-.38.58c-.17.18-.37.31-.61.4s-.51.14-.82.14-.58-.04-.87-.11-.53-.15-.72-.25v-.82h.05c.16.12.38.23.66.34s.55.16.83.16c.16,0,.32-.03.48-.08s.29-.13.4-.25c.1-.11.18-.24.24-.38s.08-.31.08-.52-.03-.38-.09-.52-.15-.24-.26-.32-.24-.13-.39-.16-.31-.04-.49-.04h-.33v-.65h.26c.35,0,.64-.08.86-.25s.33-.41.33-.73c0-.15-.03-.27-.09-.38s-.13-.19-.22-.25c-.1-.07-.21-.11-.33-.14s-.25-.04-.38-.04Z"/>
+      <path class="cls-3" d="M332.29,131.17l-1.09,2.56h-.57l.69-2.56h.98Z"/>
+      <path class="cls-3" d="M336.93,130.28h-.69v2h-.75v-2h-2.57v-.82l2.6-3h.72v3.19h.69v.62ZM335.49,129.65v-2.27l-1.96,2.27h1.96Z"/>
+      <path class="cls-3" d="M339,131.17l-1.09,2.56h-.57l.69-2.56h.98Z"/>
+      <path class="cls-3" d="M343.42,130.43c0,.28-.04.54-.13.78s-.22.45-.38.62c-.16.18-.37.32-.61.42s-.52.15-.82.15c-.28,0-.55-.03-.82-.09s-.5-.14-.7-.24v-.82h.05c.06.04.15.09.26.15s.24.11.37.16c.15.05.29.1.42.13s.27.04.43.04.31-.03.46-.08.28-.15.38-.27c.1-.11.17-.25.22-.4s.08-.33.08-.54-.03-.38-.08-.51-.14-.24-.24-.33c-.11-.1-.25-.17-.41-.21s-.34-.06-.54-.06c-.21,0-.42.02-.64.05s-.38.06-.51.09v-3h3.19v.68h-2.44v1.55c.09-.01.19-.02.28-.02s.17,0,.25,0c.3,0,.55.02.75.07s.4.15.59.29c.19.15.34.33.44.55s.15.5.15.86Z"/>
+      <path class="cls-3" d="M346.25,133.81h-2.03v-.56h1.35v-6.49h-1.35v-.56h2.03v7.61Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-2" cx="428.67" cy="129.88" r="13.56"/>
+    <g>
+      <path class="cls-3" d="M426.1,133.81h-2.03v-7.61h2.03v.56h-1.35v6.49h1.35v.56Z"/>
+      <path class="cls-3" d="M430.59,130.39c0,.3-.05.58-.15.83s-.23.46-.4.63c-.17.18-.37.32-.59.41s-.45.14-.71.14-.5-.04-.72-.13-.4-.22-.57-.39c-.2-.21-.36-.49-.47-.85s-.17-.79-.17-1.3.05-.96.16-1.37.26-.76.48-1.06c.21-.29.48-.52.82-.69s.72-.25,1.16-.25c.13,0,.25,0,.36.02s.21.03.3.06v.75h-.04c-.07-.04-.17-.07-.3-.11s-.27-.05-.43-.05c-.48,0-.88.16-1.17.49s-.47.81-.53,1.46c.19-.13.38-.23.57-.3s.41-.11.64-.11.43.02.6.07.35.14.53.28c.21.16.37.37.48.61s.16.54.16.87ZM429.8,130.42c0-.24-.03-.44-.09-.6s-.16-.3-.3-.41c-.1-.08-.22-.14-.35-.16s-.26-.04-.4-.04c-.18,0-.36.03-.53.08s-.34.13-.51.24c0,.06,0,.11-.01.17s0,.12,0,.2c0,.4.04.73.12.98s.18.44.29.56c.11.12.23.21.35.26s.25.07.38.07c.31,0,.57-.11.76-.34s.29-.56.29-1Z"/>
+      <path class="cls-3" d="M433.26,133.81h-2.03v-.56h1.35v-6.49h-1.35v-.56h2.03v7.61Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-2" cx="203.84" cy="48.3" r="13.56"/>
+    <path class="cls-3" d="M203.56,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="235.18" cy="48.3" r="13.56"/>
+    <path class="cls-3" d="M238.15,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM235.99,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="280.82" cy="48.3" r="13.56"/>
+    <path class="cls-3" d="M283.47,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="375.58" cy="48.3" r="13.56"/>
+    <path class="cls-3" d="M378.46,49.02c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM377.27,49.06c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line class="cls-1" x1="30.52" y1="34.73" x2="30.52" y2="61.86"/>
+  <line class="cls-1" x1="30.52" y1="116.31" x2="30.52" y2="143.44"/>
+  <polyline class="cls-1" points="469.19 34.73 482.24 48.24 470.14 60.76"/>
+  <polyline class="cls-1" points="470.51 116.31 483.57 129.82 471.46 142.34"/>
+</svg>

+ 479 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-On-Offs.svg

@@ -0,0 +1,479 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 504.81 492.57">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #2c32c8;
+      }
+
+      .cls-1, .cls-2 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #f0ff8b;
+      }
+
+      .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8, .cls-9 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-4 {
+        fill: none;
+      }
+
+      .cls-5 {
+        fill: #ff8be8;
+      }
+
+      .cls-6 {
+        fill: #ff8b8b;
+      }
+
+      .cls-7 {
+        fill: #8be2ff;
+      }
+
+      .cls-8 {
+        fill: #8bffbc;
+      }
+
+      .cls-9 {
+        fill: #ffb68b;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-4" x1="61.2" y1="165.14" x2="112.66" y2="165.4"/>
+  <g>
+    <circle class="cls-8" cx="114.28" cy="165.14" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M112.66,165.4h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M118.77,168.69h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line class="cls-4" x1="61.2" y1="147.76" x2="61.2" y2="182.77"/>
+  <line id="Quiescent_line" data-name="Quiescent line" class="cls-4" x1="30.52" y1="449.88" x2="483.57" y2="449.88"/>
+  <g>
+    <path class="cls-2" d="M34.13,419.22c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM33.09,419.27c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-2" d="M40.33,422.21h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-2" d="M46.94,422.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-2" d="M53.46,420.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-2" d="M60.14,422.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-2" d="M65.78,422.21l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM65.67,419.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-2" d="M68.59,416.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-2" d="M74.89,419.39c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM75.94,419.32c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-2" d="M83.79,417.17h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM84.15,413.86c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-2" d="M88.39,416.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-2" d="M99.22,417.16c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM95.68,423.06c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM95.99,418.25c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="145.36" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M148.15,449.06c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM146.65,451.72c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="333.9" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M336.69,449.06c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM335.19,451.72c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-9" cx="428.67" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M431.46,449.06c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM429.96,451.72c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-8" cx="61.2" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M63.5,453.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="203.84" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M206.14,453.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-9" cx="375.58" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M377.88,453.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line class="cls-4" x1="30.52" y1="436.32" x2="30.52" y2="463.45"/>
+  <polyline class="cls-4" points="470.51 436.32 483.57 449.82 471.46 462.34"/>
+  <g>
+    <circle class="cls-6" cx="235.18" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M237.92,453.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="92.28" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M95.03,453.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-8" cx="114.28" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M116.59,453.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="256.38" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M258.68,453.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="280.82" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M274.57,453.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="288.26" cy="449.88" r="13.56"/>
+    <path class="cls-2" d="M290.56,453.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-2" data-name="source line" class="cls-4" x1="30.52" y1="48.3" x2="482.24" y2="48.3"/>
+  <g>
+    <path class="cls-2" d="M33.67,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-2" d="M40.73,22.49c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,22.54c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-2" d="M46.93,25.48h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-2" d="M49.04,19.59h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-2" d="M59.97,25.26c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-2" d="M66.97,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+  </g>
+  <g>
+    <path class="cls-2" d="M34.13,342.11c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM33.09,342.16c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-2" d="M35.61,339.22h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-2" d="M47.33,342.11c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM46.28,342.16c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-2" d="M54.02,337.77c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-2" d="M60.62,337.77c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-2" d="M66.66,343.5c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-2" d="M75.57,347.52h-1.34c-.68-.81-1.21-1.66-1.6-2.57s-.58-1.97-.58-3.2.19-2.26.58-3.18.92-1.78,1.61-2.59h1.34v.06c-.32.29-.62.61-.91.99s-.55.81-.8,1.3c-.23.48-.42,1.01-.57,1.59s-.22,1.19-.22,1.83.07,1.28.21,1.83.33,1.08.58,1.58c.23.48.5.92.8,1.3s.6.72.9.99v.06Z"/>
+    <path class="cls-2" d="M79.4,345.25c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+    <path class="cls-2" d="M87.72,341.83c0,1.1-.27,1.95-.8,2.55s-1.24.9-2.12.9-1.63-.31-2.15-.93-.78-1.46-.78-2.52.27-1.94.81-2.55,1.25-.91,2.12-.91,1.59.3,2.12.91.8,1.45.8,2.55ZM86.58,341.83c0-.85-.15-1.48-.46-1.89s-.75-.62-1.32-.62-1.02.21-1.33.62-.47,1.04-.47,1.89.16,1.44.47,1.87.75.64,1.33.64,1-.21,1.32-.62.47-1.04.47-1.88Z"/>
+    <path class="cls-2" d="M89.98,345.1h-1.1v-9.12h1.1v9.12Z"/>
+    <path class="cls-2" d="M92.75,345.1h-1.1v-9.12h1.1v9.12Z"/>
+    <path class="cls-2" d="M97.21,345.25c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM98.5,341.1c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+    <path class="cls-2" d="M103.29,345.25c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+    <path class="cls-2" d="M108.2,345.23c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    <path class="cls-2" d="M113.08,345.25c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM114.37,341.1c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+    <path class="cls-2" d="M121.59,345.1h-1.1v-.67c-.17.14-.32.26-.45.36s-.27.18-.44.26c-.16.07-.32.13-.49.17s-.36.06-.59.06c-.36,0-.68-.07-.99-.22s-.56-.37-.77-.65c-.21-.29-.38-.65-.5-1.07s-.18-.91-.18-1.46.07-1.07.22-1.49.35-.79.62-1.1c.24-.29.53-.51.86-.67s.69-.24,1.06-.24c.33,0,.61.04.86.11s.5.18.77.34v-2.84h1.1v9.12ZM120.49,343.51v-3.77c-.27-.13-.52-.22-.74-.28s-.45-.08-.71-.08c-.57,0-1.01.21-1.33.64s-.48,1.04-.48,1.84.12,1.36.37,1.77.64.61,1.18.61c.29,0,.58-.07.87-.2s.57-.31.83-.53Z"/>
+    <path class="cls-2" d="M132.43,341.72c0,1.07-.26,1.93-.78,2.58s-1.17.98-1.95.98c-.36,0-.66-.04-.91-.13s-.5-.21-.75-.35l-.07.3h-1.03v-9.12h1.1v3.26c.28-.25.58-.46.9-.62s.69-.25,1.1-.25c.74,0,1.32.3,1.75.89s.64,1.41.64,2.46ZM131.29,341.81c0-.78-.12-1.37-.36-1.78s-.62-.61-1.15-.61c-.3,0-.6.07-.91.21s-.58.32-.83.53v3.75c.28.14.52.23.74.29s.45.08.71.08c.56,0,1-.2,1.32-.6s.48-1.03.48-1.89Z"/>
+    <path class="cls-2" d="M138.69,338.56l-3.52,8.96h-1.18l1.17-2.73-2.38-6.23h1.19l1.79,4.85,1.78-4.85h1.15Z"/>
+    <path class="cls-1" d="M148.07,343.5c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-1" d="M154.98,341.85c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM153.92,341.7c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-1" d="M158.61,337.66h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-1" d="M168.17,341.85c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM167.11,341.7c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-1" d="M174.37,344.88c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-1" d="M181.14,345.02c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-2" d="M189.3,342.28c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM190.34,342.22c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-2" d="M201.16,341.85c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM200.1,341.7c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-2" d="M204.8,337.66h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-2" d="M214.13,345.02c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-2" d="M219.77,345.1l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM219.66,342.42h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-2" d="M224.58,343.43l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+    <path class="cls-2" d="M237.76,338.56l-1.66,6.54h-1.02l-1.6-5.04-1.59,5.04h-1.01l-1.68-6.54h1.15l1.15,5.07,1.55-5.07h.91l1.59,5.07,1.09-5.07h1.11Z"/>
+    <path class="cls-2" d="M243.88,345.1h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-9.12h1.1v3.3c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+    <path class="cls-2" d="M246.63,337.46h-1.25v-1.14h1.25v1.14ZM246.55,345.1h-1.1v-6.54h1.1v6.54Z"/>
+    <path class="cls-2" d="M250.77,345.25c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+    <path class="cls-2" d="M258.85,345.1h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-9.12h1.1v3.3c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+    <path class="cls-2" d="M269.24,345.1h-1.1v-.73c-.34.3-.66.52-.97.68s-.64.23-1.02.23c-.29,0-.55-.05-.81-.14s-.47-.24-.66-.45-.33-.46-.44-.77-.16-.68-.16-1.12v-4.25h1.1v3.73c0,.35.01.64.04.86s.08.43.17.6c.09.17.21.29.37.37s.38.12.67.12c.27,0,.56-.08.86-.23s.58-.34.84-.56v-4.89h1.1v6.54Z"/>
+    <path class="cls-2" d="M272.61,345.26c-.44,0-.85-.06-1.23-.18s-.7-.24-.95-.38v-1.24h.06c.09.07.2.16.33.25s.3.18.51.28c.19.09.39.16.62.23s.46.1.7.1c.18,0,.36-.02.56-.06s.35-.09.45-.16c.14-.09.24-.19.3-.29s.09-.25.09-.46c0-.26-.07-.46-.21-.59s-.4-.24-.76-.33c-.14-.04-.32-.08-.55-.12s-.44-.1-.63-.15c-.5-.14-.86-.37-1.09-.67s-.34-.67-.34-1.1c0-.59.22-1.07.67-1.44s1.04-.56,1.78-.56c.36,0,.73.04,1.1.13s.68.2.93.34v1.18h-.06c-.28-.22-.59-.4-.94-.53s-.69-.19-1.05-.19-.67.08-.92.23-.38.38-.38.69c0,.27.07.48.22.61s.39.25.71.33c.16.04.35.08.55.13s.41.09.64.14c.48.12.85.32,1.09.6s.37.66.37,1.15c0,.28-.06.55-.17.8s-.27.47-.49.65c-.23.2-.5.34-.79.45s-.67.15-1.11.15Z"/>
+    <path class="cls-2" d="M279.03,345.25c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM280.32,341.1c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+    <path class="cls-2" d="M284.28,345.26c-.44,0-.85-.06-1.23-.18s-.7-.24-.95-.38v-1.24h.06c.09.07.2.16.33.25s.3.18.51.28c.19.09.39.16.62.23s.46.1.7.1c.18,0,.36-.02.56-.06s.35-.09.45-.16c.14-.09.24-.19.3-.29s.09-.25.09-.46c0-.26-.07-.46-.21-.59s-.4-.24-.76-.33c-.14-.04-.32-.08-.55-.12s-.44-.1-.63-.15c-.5-.14-.86-.37-1.09-.67s-.34-.67-.34-1.1c0-.59.22-1.07.67-1.44s1.04-.56,1.78-.56c.36,0,.73.04,1.1.13s.68.2.93.34v1.18h-.06c-.28-.22-.59-.4-.94-.53s-.69-.19-1.05-.19-.67.08-.92.23-.38.38-.38.69c0,.27.07.48.22.61s.39.25.71.33c.16.04.35.08.55.13s.41.09.64.14c.48.12.85.32,1.09.6s.37.66.37,1.15c0,.28-.06.55-.17.8s-.27.47-.49.65c-.23.2-.5.34-.79.45s-.67.15-1.11.15Z"/>
+    <path class="cls-2" d="M296.66,343.03c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-2" d="M303.32,341.85c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM302.26,341.7c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-2" d="M306.95,337.66h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-2" d="M316.52,341.85c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM315.46,341.7c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-2" d="M322.72,344.88c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-2" d="M329.48,345.02c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-2" d="M336.71,345.1h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-2" d="M341.72,345.1l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM341.61,342.42h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-2" d="M344.54,339.22h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-2" d="M356.37,339.22l-2,5.26c-.21.54-.42,1-.64,1.38s-.46.7-.72.95-.55.43-.86.55-.66.18-1.05.18c-.1,0-.19,0-.28,0s-.17,0-.27-.02v-.93c.09.01.18.02.28.03s.21.01.32.01c.19,0,.36-.03.52-.08s.32-.14.46-.27.28-.28.42-.48.26-.43.39-.71l-2.35-5.88h1.16l1.49,3.89.3.91.34-.94,1.38-3.87h1.12Z"/>
+    <path class="cls-2" d="M360.75,341.75c0,1.21-.19,2.27-.58,3.18s-.92,1.78-1.61,2.58h-1.34v-.06c.3-.27.6-.6.91-.99s.57-.83.8-1.3c.24-.5.43-1.04.58-1.6s.21-1.17.21-1.82-.07-1.25-.22-1.83-.34-1.1-.57-1.59-.51-.92-.81-1.31-.6-.71-.9-.98v-.06h1.34c.68.81,1.21,1.67,1.6,2.58s.58,1.97.58,3.19Z"/>
+  </g>
+  <g>
+    <path class="cls-1" d="M33.2,83.73c-.45-.09-.83-.14-1.15-.14-.77,0-1.15.4-1.15,1.2v.86h2.15v.71h-2.15v3.48h-.86v-3.48h-1.58v-.71h1.58v-.81c0-1.3.68-1.96,2.04-1.96.34,0,.71.04,1.12.12v.73Z"/>
+    <path class="cls-1" d="M34.55,84.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-1" d="M44.12,87.35c0,.38-.05.73-.16,1.05s-.26.59-.46.82c-.2.23-.45.4-.74.53-.29.12-.62.19-.99.19s-.67-.05-.94-.16c-.28-.11-.51-.27-.71-.48-.19-.21-.34-.47-.44-.79s-.15-.67-.15-1.08c0-.38.05-.73.16-1.04.11-.31.26-.58.46-.81.2-.23.45-.4.74-.53.29-.13.62-.19.99-.19s.67.05.94.16c.28.11.51.27.71.48s.34.47.44.78.15.67.15,1.07ZM43.25,87.39c0-.3-.03-.57-.1-.79-.07-.23-.16-.42-.29-.57s-.27-.27-.45-.34c-.18-.08-.38-.12-.59-.12-.25,0-.47.05-.65.15-.18.1-.33.23-.44.4s-.2.36-.25.58-.08.45-.08.69c0,.3.03.57.1.8.07.23.16.42.29.57s.27.26.45.34c.18.08.37.11.6.11.25,0,.47-.05.65-.15.18-.1.33-.23.44-.4s.2-.36.25-.58.08-.45.08-.7Z"/>
+    <path class="cls-1" d="M48.84,89.84v-3.52c0-.15,0-.28-.02-.38s-.03-.17-.05-.23c-.02-.06-.06-.1-.09-.12-.04-.02-.08-.03-.14-.03-.06,0-.13.02-.18.06s-.11.1-.18.19-.13.2-.21.35c-.08.14-.17.32-.27.53v3.15h-.78v-3.43c0-.18,0-.32-.02-.43-.01-.11-.03-.2-.05-.26-.02-.06-.06-.1-.1-.13-.04-.02-.09-.03-.14-.03-.06,0-.11.02-.17.05-.05.03-.11.09-.17.18-.06.08-.13.2-.21.35s-.17.33-.28.56v3.15h-.78v-4.9h.65l.04.93c.08-.19.17-.34.25-.47.08-.13.16-.24.25-.31.08-.08.17-.14.27-.18.1-.04.2-.06.32-.06.26,0,.46.09.6.26.14.17.21.44.21.8.08-.17.15-.32.23-.45s.16-.24.24-.33c.09-.09.18-.16.29-.21.1-.05.22-.07.36-.07.62,0,.92.47.92,1.42v3.57h-.78Z"/>
+    <path class="cls-2" d="M61.06,91.84h-5.5v-.7h5.5v.7Z"/>
+    <path class="cls-1" d="M69.01,85.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM69.31,82.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-1" d="M72.84,84.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M87.71,88.5c0,.17-.03.33-.09.46s-.14.26-.24.36c-.1.11-.22.2-.35.27-.13.08-.28.14-.43.19s-.31.08-.47.11c-.16.02-.32.03-.47.03-.33,0-.64-.01-.92-.04s-.55-.08-.82-.14v-.78c.29.08.57.14.85.19.28.04.56.06.84.06.41,0,.71-.05.9-.17.2-.11.29-.27.29-.47,0-.09-.02-.17-.05-.24-.03-.07-.09-.14-.17-.2s-.21-.13-.38-.2-.4-.15-.7-.23c-.22-.06-.43-.14-.61-.22s-.35-.18-.49-.3c-.14-.11-.24-.25-.32-.4-.08-.15-.12-.33-.12-.54,0-.14.03-.29.1-.45.06-.16.17-.31.32-.45.15-.14.36-.26.62-.35s.59-.14.98-.14c.19,0,.41.01.64.03.23.02.48.06.73.11v.76c-.27-.06-.52-.11-.76-.14-.24-.03-.45-.05-.62-.05-.21,0-.39.02-.53.05-.15.03-.26.08-.35.13-.09.06-.15.12-.19.2-.04.08-.06.16-.06.25s.02.17.05.24c.03.07.1.14.19.21.09.07.22.13.39.2.17.07.38.14.65.22.29.08.53.17.73.27s.36.2.48.31c.12.11.21.24.27.39.05.14.08.31.08.49Z"/>
+    <path class="cls-2" d="M89.53,84.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M98.64,89.66c-.22.08-.45.15-.68.19-.23.04-.47.06-.72.06-.77,0-1.37-.21-1.79-.63s-.63-1.03-.63-1.84c0-.39.06-.74.18-1.05.12-.32.29-.59.51-.81s.48-.4.78-.52.64-.18,1-.18c.25,0,.49.02.71.05.22.04.43.09.63.18v.81c-.21-.11-.43-.19-.65-.24-.22-.05-.45-.08-.68-.08-.22,0-.42.04-.62.12s-.36.2-.51.36-.26.35-.35.57-.13.48-.13.76c0,.59.14,1.04.43,1.33.29.29.69.44,1.2.44.23,0,.46-.03.67-.08.22-.05.43-.13.63-.23v.79Z"/>
+    <path class="cls-1" d="M33.2,95.73c-.45-.09-.83-.14-1.15-.14-.77,0-1.15.4-1.15,1.2v.86h2.15v.71h-2.15v3.48h-.86v-3.48h-1.58v-.71h1.58v-.81c0-1.3.68-1.96,2.04-1.96.34,0,.71.04,1.12.12v.73Z"/>
+    <path class="cls-1" d="M34.55,96.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-1" d="M44.12,99.35c0,.38-.05.73-.16,1.05s-.26.59-.46.82c-.2.23-.45.4-.74.53-.29.12-.62.19-.99.19s-.67-.05-.94-.16c-.28-.11-.51-.27-.71-.48-.19-.21-.34-.47-.44-.79s-.15-.67-.15-1.08c0-.38.05-.73.16-1.04.11-.31.26-.58.46-.81.2-.23.45-.4.74-.53.29-.13.62-.19.99-.19s.67.05.94.16c.28.11.51.27.71.48s.34.47.44.78.15.67.15,1.07ZM43.25,99.39c0-.3-.03-.57-.1-.79-.07-.23-.16-.42-.29-.57s-.27-.27-.45-.34c-.18-.08-.38-.12-.59-.12-.25,0-.47.05-.65.15-.18.1-.33.23-.44.4s-.2.36-.25.58-.08.45-.08.69c0,.3.03.57.1.8.07.23.16.42.29.57s.27.26.45.34c.18.08.37.11.6.11.25,0,.47-.05.65-.15.18-.1.33-.23.44-.4s.2-.36.25-.58.08-.45.08-.7Z"/>
+    <path class="cls-1" d="M48.84,101.84v-3.52c0-.15,0-.28-.02-.38s-.03-.17-.05-.23c-.02-.06-.06-.1-.09-.12-.04-.02-.08-.03-.14-.03-.06,0-.13.02-.18.06s-.11.1-.18.19-.13.2-.21.35c-.08.14-.17.32-.27.53v3.15h-.78v-3.43c0-.18,0-.32-.02-.43-.01-.11-.03-.2-.05-.26-.02-.06-.06-.1-.1-.13-.04-.02-.09-.03-.14-.03-.06,0-.11.02-.17.05-.05.03-.11.09-.17.18-.06.08-.13.2-.21.35s-.17.33-.28.56v3.15h-.78v-4.9h.65l.04.93c.08-.19.17-.34.25-.47.08-.13.16-.24.25-.31.08-.08.17-.14.27-.18.1-.04.2-.06.32-.06.26,0,.46.09.6.26.14.17.21.44.21.8.08-.17.15-.32.23-.45s.16-.24.24-.33c.09-.09.18-.16.29-.21.1-.05.22-.07.36-.07.62,0,.92.47.92,1.42v3.57h-.78Z"/>
+    <path class="cls-2" d="M56.09,99.49c0-.42.06-.79.17-1.11.11-.32.28-.6.49-.82.21-.22.46-.39.76-.51.29-.12.62-.17.98-.17.16,0,.31,0,.46.03s.3.05.45.09v-2.06h.85v6.9h-.76l-.03-.93c-.24.35-.49.6-.77.77s-.58.25-.9.25c-.28,0-.53-.06-.74-.18s-.39-.28-.53-.5c-.14-.21-.25-.47-.32-.77-.07-.3-.11-.63-.11-1ZM56.96,99.43c0,.59.09,1.03.26,1.33.17.29.42.44.74.44.21,0,.44-.1.68-.29.24-.19.49-.48.75-.85v-2.28c-.14-.06-.29-.11-.46-.15s-.34-.05-.5-.05c-.46,0-.82.15-1.08.45-.26.3-.39.77-.39,1.41Z"/>
+    <path class="cls-2" d="M65.98,99.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM65.1,99c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M69.01,95.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M76.79,101.77c-.19.05-.39.08-.6.11-.21.02-.41.03-.62.03-.62,0-1.07-.14-1.38-.42s-.45-.71-.45-1.28v-2.56h-1.37v-.71h1.37v-1.35l.85-.22v1.57h2.2v.71h-2.2v2.49c0,.35.09.61.28.79.19.17.46.26.83.26.16,0,.33-.01.51-.04s.38-.06.58-.12v.73Z"/>
+    <path class="cls-2" d="M81.48,101.84l-.02-.66c-.27.26-.54.45-.81.57s-.56.18-.87.18c-.28,0-.52-.04-.72-.11-.2-.07-.36-.17-.49-.29-.13-.13-.22-.27-.28-.44-.06-.17-.09-.35-.09-.55,0-.49.18-.88.55-1.15s.91-.42,1.62-.42h1.02v-.43c0-.29-.09-.52-.28-.7-.19-.17-.47-.26-.85-.26-.28,0-.55.03-.82.09-.27.06-.55.15-.83.26v-.77c.11-.04.23-.08.36-.11.13-.04.27-.07.42-.1s.3-.05.46-.07c.16-.02.32-.03.48-.03.3,0,.56.03.8.1.24.07.44.17.6.3.16.13.29.3.38.5.09.2.13.44.13.71v3.38h-.76ZM81.39,99.61h-1.08c-.21,0-.39.02-.55.06-.15.04-.28.1-.38.18s-.17.17-.22.28c-.05.11-.07.23-.07.37,0,.09.01.18.04.27.03.09.08.16.14.23.06.07.15.12.25.16s.23.06.38.06c.2,0,.42-.06.67-.18.25-.12.52-.31.8-.56v-.87Z"/>
+    <path class="cls-1" d="M91,97.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM91.3,94.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-1" d="M94.83,96.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M110.27,98.6c0,.57-.07,1.07-.2,1.48-.14.42-.32.76-.55,1.03-.23.27-.5.47-.81.61s-.63.2-.97.2c-.41,0-.77-.07-1.07-.22-.3-.15-.56-.36-.76-.64-.2-.28-.35-.62-.45-1.02-.1-.4-.15-.86-.15-1.36,0-.57.07-1.06.2-1.47.13-.42.31-.76.54-1.03.23-.27.5-.47.8-.61s.63-.2.97-.2c.41,0,.77.08,1.07.22.3.15.56.36.76.64s.35.62.45,1.02.15.85.15,1.35ZM109.37,98.67c0-.37-.03-.72-.09-1.03-.06-.31-.15-.58-.28-.8s-.29-.4-.49-.52c-.2-.12-.44-.19-.73-.19s-.51.07-.71.2-.36.31-.49.54c-.13.23-.22.49-.28.8-.06.3-.09.63-.09.97,0,.38.03.72.09,1.03.06.31.15.58.28.8.13.22.29.4.49.52.2.12.44.19.72.19s.51-.07.71-.2.36-.31.49-.54c.13-.23.22-.49.29-.79s.09-.63.09-.97Z"/>
+    <path class="cls-2" d="M115.51,99.3c0,.41-.06.77-.17,1.09-.11.32-.27.59-.48.82-.21.22-.46.39-.75.51-.3.12-.63.18-1,.18-.29,0-.59-.03-.89-.08-.3-.05-.6-.14-.9-.26v-6.61h.85v1.9l-.04.91c.24-.33.51-.56.78-.7.28-.14.58-.2.9-.2.28,0,.53.06.74.18s.39.28.53.5c.14.21.25.47.32.77.07.3.11.64.11,1.01ZM114.64,99.34c0-.26-.02-.49-.06-.71s-.1-.4-.18-.55c-.08-.15-.19-.27-.31-.36-.13-.09-.28-.13-.45-.13-.11,0-.22.02-.33.05s-.23.09-.34.17c-.12.08-.24.19-.38.32s-.27.29-.42.49v2.38c.17.07.34.12.51.15.17.04.34.06.49.06.2,0,.38-.03.56-.09.18-.06.33-.17.47-.31.14-.15.24-.34.32-.58s.12-.54.12-.89Z"/>
+    <path class="cls-2" d="M120.7,100.5c0,.17-.03.33-.09.46s-.14.26-.24.36c-.1.11-.22.2-.35.27-.13.08-.28.14-.43.19s-.31.08-.47.11c-.16.02-.32.03-.47.03-.33,0-.64-.01-.92-.04s-.55-.08-.82-.14v-.78c.29.08.57.14.85.19.28.04.56.06.84.06.41,0,.71-.05.9-.17.2-.11.29-.27.29-.47,0-.09-.02-.17-.05-.24-.03-.07-.09-.14-.17-.2s-.21-.13-.38-.2-.4-.15-.7-.23c-.22-.06-.43-.14-.61-.22s-.35-.18-.49-.3c-.14-.11-.24-.25-.32-.4-.08-.15-.12-.33-.12-.54,0-.14.03-.29.1-.45.06-.16.17-.31.32-.45.15-.14.36-.26.62-.35s.59-.14.98-.14c.19,0,.41.01.64.03.23.02.48.06.73.11v.76c-.27-.06-.52-.11-.76-.14-.24-.03-.45-.05-.62-.05-.21,0-.39.02-.53.05-.15.03-.26.08-.35.13-.09.06-.15.12-.19.2-.04.08-.06.16-.06.25s.02.17.05.24c.03.07.1.14.19.21.09.07.22.13.39.2.17.07.38.14.65.22.29.08.53.17.73.27s.36.2.48.31c.12.11.21.24.27.39.05.14.08.31.08.49Z"/>
+    <path class="cls-2" d="M126.46,99.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM125.58,99c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M128.02,96.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M132.86,96.93h.97l1.2,3.24.26.79.27-.81,1.19-3.22h.93l-1.92,4.9h-.98l-1.92-4.9Z"/>
+    <path class="cls-2" d="M141.96,101.84l-.02-.66c-.27.26-.54.45-.81.57s-.56.18-.87.18c-.28,0-.52-.04-.72-.11-.2-.07-.36-.17-.49-.29-.13-.13-.22-.27-.28-.44-.06-.17-.09-.35-.09-.55,0-.49.18-.88.55-1.15s.91-.42,1.62-.42h1.02v-.43c0-.29-.09-.52-.28-.7-.19-.17-.47-.26-.85-.26-.28,0-.55.03-.82.09-.27.06-.55.15-.83.26v-.77c.11-.04.23-.08.36-.11.13-.04.27-.07.42-.1s.3-.05.46-.07c.16-.02.32-.03.48-.03.3,0,.56.03.8.1.24.07.44.17.6.3.16.13.29.3.38.5.09.2.13.44.13.71v3.38h-.76ZM141.87,99.61h-1.08c-.21,0-.39.02-.55.06-.15.04-.28.1-.38.18s-.17.17-.22.28c-.05.11-.07.23-.07.37,0,.09.01.18.04.27.03.09.08.16.14.23.06.07.15.12.25.16s.23.06.38.06c.2,0,.42-.06.67-.18.25-.12.52-.31.8-.56v-.87Z"/>
+    <path class="cls-2" d="M148.5,99.3c0,.41-.06.77-.17,1.09-.11.32-.27.59-.48.82-.21.22-.46.39-.75.51-.3.12-.63.18-1,.18-.29,0-.59-.03-.89-.08-.3-.05-.6-.14-.9-.26v-6.61h.85v1.9l-.04.91c.24-.33.51-.56.78-.7.28-.14.58-.2.9-.2.28,0,.53.06.74.18s.39.28.53.5c.14.21.25.47.32.77.07.3.11.64.11,1.01ZM147.63,99.34c0-.26-.02-.49-.06-.71s-.1-.4-.18-.55c-.08-.15-.19-.27-.31-.36-.13-.09-.28-.13-.45-.13-.11,0-.22.02-.33.05s-.23.09-.34.17c-.12.08-.24.19-.38.32s-.27.29-.42.49v2.38c.17.07.34.12.51.15.17.04.34.06.49.06.2,0,.38-.03.56-.09.18-.06.33-.17.47-.31.14-.15.24-.34.32-.58s.12-.54.12-.89Z"/>
+    <path class="cls-2" d="M151.48,95.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M159.45,99.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM158.56,99c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M47.28,112.3c.11,0,.22.02.31.06.1.04.19.1.26.18.07.08.13.16.17.26.04.1.06.21.06.32s-.02.21-.06.31-.1.18-.17.26-.16.13-.26.17c-.1.04-.2.06-.31.06s-.22-.02-.32-.06c-.1-.04-.18-.1-.26-.17s-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.32c.04-.1.1-.19.17-.26.07-.07.16-.13.26-.18.1-.04.2-.06.32-.06Z"/>
+    <path class="cls-2" d="M55.2,113.84h-.98l-.95-2.04c-.07-.16-.15-.29-.22-.39s-.16-.18-.24-.24c-.09-.06-.18-.1-.28-.13-.1-.03-.22-.04-.34-.04h-.41v2.84h-.87v-6.38h1.71c.37,0,.69.04.96.12.27.08.49.2.66.34s.3.32.38.53c.08.21.12.44.12.69,0,.2-.03.39-.09.56-.06.18-.15.34-.26.48-.12.14-.26.27-.43.38-.17.11-.37.18-.59.24.18.06.33.17.46.33.13.15.25.36.38.62l1.01,2.1ZM53.8,109.21c0-.34-.11-.6-.32-.77-.21-.17-.51-.25-.9-.25h-.82v2.11h.7c.21,0,.39-.02.55-.07.16-.05.3-.12.42-.21s.21-.21.27-.34c.06-.14.1-.29.1-.47Z"/>
+    <path class="cls-2" d="M60.48,111.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM59.6,111c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M65.79,113.77c-.19.05-.39.08-.6.11-.21.02-.41.03-.62.03-.62,0-1.07-.14-1.38-.42s-.45-.71-.45-1.28v-2.56h-1.37v-.71h1.37v-1.35l.85-.22v1.57h2.2v.71h-2.2v2.49c0,.35.09.61.28.79.19.17.46.26.83.26.16,0,.33-.01.51-.04s.38-.06.58-.12v.73Z"/>
+    <path class="cls-2" d="M71.28,113.84h-.76l-.03-.79c-.15.17-.29.31-.42.42s-.26.2-.39.27-.26.12-.39.14c-.13.03-.27.04-.42.04-.5,0-.89-.15-1.14-.44-.26-.3-.39-.74-.39-1.34v-3.2h.85v3.13c0,.75.28,1.13.85,1.13.1,0,.21-.02.31-.05.1-.03.2-.08.31-.16.11-.08.23-.18.35-.31.13-.13.27-.29.42-.49v-3.25h.85v4.9Z"/>
+    <path class="cls-2" d="M73.04,108.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M78.33,108.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M86.77,115.89c-1.5-1.39-2.25-2.93-2.25-4.61,0-.39.04-.79.12-1.18.08-.39.21-.79.39-1.18.18-.39.41-.79.7-1.18.29-.39.65-.78,1.06-1.17l.49.5c-1.26,1.25-1.89,2.63-1.89,4.15,0,.76.16,1.48.48,2.18.32.7.79,1.35,1.42,1.97l-.51.52Z"/>
+    <path class="cls-2" d="M93.42,113.84h-4.01v-.79h1.64v-4.66l-1.53.83-.31-.72,2.03-1.07h.75v5.62h1.43v.79Z"/>
+    <path class="cls-2" d="M95.21,114.84c.17,0,.33,0,.48-.04.16-.04.29-.09.41-.16.12-.07.21-.16.29-.26.07-.1.11-.22.11-.36s-.02-.25-.07-.33c-.05-.08-.1-.16-.16-.23-.06-.07-.11-.15-.16-.23-.05-.08-.07-.19-.07-.33,0-.07.01-.14.04-.21.03-.07.07-.14.12-.21.05-.06.12-.11.21-.15s.18-.06.3-.06.22.02.33.07c.11.05.2.12.28.22s.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66c-.2.19-.44.35-.74.46-.29.11-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-2" d="M109.71,112.5c0,.17-.03.33-.09.46s-.14.26-.24.36c-.1.11-.22.2-.35.27-.13.08-.28.14-.43.19s-.31.08-.47.11c-.16.02-.32.03-.47.03-.33,0-.64-.01-.92-.04s-.55-.08-.82-.14v-.78c.29.08.57.14.85.19.28.04.56.06.84.06.41,0,.71-.05.9-.17.2-.11.29-.27.29-.47,0-.09-.02-.17-.05-.24-.03-.07-.09-.14-.17-.2s-.21-.13-.38-.2-.4-.15-.7-.23c-.22-.06-.43-.14-.61-.22s-.35-.18-.49-.3c-.14-.11-.24-.25-.32-.4-.08-.15-.12-.33-.12-.54,0-.14.03-.29.1-.45.06-.16.17-.31.32-.45.15-.14.36-.26.62-.35s.59-.14.98-.14c.19,0,.41.01.64.03.23.02.48.06.73.11v.76c-.27-.06-.52-.11-.76-.14-.24-.03-.45-.05-.62-.05-.21,0-.39.02-.53.05-.15.03-.26.08-.35.13-.09.06-.15.12-.19.2-.04.08-.06.16-.06.25s.02.17.05.24c.03.07.1.14.19.21.09.07.22.13.39.2.17.07.38.14.65.22.29.08.53.17.73.27s.36.2.48.31c.12.11.21.24.27.39.05.14.08.31.08.49Z"/>
+    <path class="cls-2" d="M115.13,113.66c-.22.08-.45.15-.68.19-.23.04-.47.06-.72.06-.77,0-1.37-.21-1.79-.63s-.63-1.03-.63-1.84c0-.39.06-.74.18-1.05.12-.32.29-.59.51-.81s.48-.4.78-.52.64-.18,1-.18c.25,0,.49.02.71.05.22.04.43.09.63.18v.81c-.21-.11-.43-.19-.65-.24-.22-.05-.45-.08-.68-.08-.22,0-.42.04-.62.12s-.36.2-.51.36-.26.35-.35.57-.13.48-.13.76c0,.59.14,1.04.43,1.33.29.29.69.44,1.2.44.23,0,.46-.03.67-.08.22-.05.43-.13.63-.23v.79Z"/>
+    <path class="cls-2" d="M120.76,113.84h-.85v-3.13c0-.38-.07-.66-.21-.85-.14-.19-.34-.28-.61-.28-.11,0-.22.02-.32.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.44.49v3.25h-.85v-6.9h.85v2l-.03.77c.13-.16.26-.29.39-.4.13-.11.26-.2.39-.27s.26-.12.39-.15.27-.04.42-.04c.49,0,.87.15,1.13.45s.4.75.4,1.34v3.2Z"/>
+    <path class="cls-2" d="M126.46,111.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM125.58,111c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M127.57,111.49c0-.42.06-.79.17-1.11.11-.32.28-.6.49-.82.21-.22.46-.39.76-.51.29-.12.62-.17.98-.17.16,0,.31,0,.46.03s.3.05.45.09v-2.06h.85v6.9h-.76l-.03-.93c-.24.35-.49.6-.77.77s-.58.25-.9.25c-.28,0-.53-.06-.74-.18s-.39-.28-.53-.5c-.14-.21-.25-.47-.32-.77-.07-.3-.11-.63-.11-1ZM128.44,111.43c0,.59.09,1.03.26,1.33.17.29.42.44.74.44.21,0,.44-.1.68-.29.24-.19.49-.48.75-.85v-2.28c-.14-.06-.29-.11-.46-.15s-.34-.05-.5-.05c-.46,0-.82.15-1.08.45-.26.3-.39.77-.39,1.41Z"/>
+    <path class="cls-2" d="M137.26,113.84h-.76l-.03-.79c-.15.17-.29.31-.42.42s-.26.2-.39.27-.26.12-.39.14c-.13.03-.27.04-.42.04-.5,0-.89-.15-1.14-.44-.26-.3-.39-.74-.39-1.34v-3.2h.85v3.13c0,.75.28,1.13.85,1.13.1,0,.21-.02.31-.05.1-.03.2-.08.31-.16.11-.08.23-.18.35-.31.13-.13.27-.29.42-.49v-3.25h.85v4.9Z"/>
+    <path class="cls-2" d="M140.48,107.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M148.45,111.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM147.57,111c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M150.01,108.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M156.31,106.57c1.5,1.39,2.25,2.94,2.25,4.64,0,.35-.04.72-.11,1.09-.07.38-.19.76-.37,1.16s-.4.8-.7,1.2c-.29.41-.66.82-1.1,1.23l-.49-.5c.63-.63,1.11-1.28,1.42-1.97s.47-1.4.47-2.15c0-1.55-.63-2.94-1.89-4.18l.51-.52Z"/>
+    <path class="cls-2" d="M47.28,124.3c.11,0,.22.02.31.06.1.04.19.1.26.18.07.08.13.16.17.26.04.1.06.21.06.32s-.02.21-.06.31-.1.18-.17.26-.16.13-.26.17c-.1.04-.2.06-.31.06s-.22-.02-.32-.06c-.1-.04-.18-.1-.26-.17s-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.32c.04-.1.1-.19.17-.26.07-.07.16-.13.26-.18.1-.04.2-.06.32-.06Z"/>
+    <path class="cls-2" d="M54.92,125.6c-.51.21-1.05.32-1.61.32-.9,0-1.59-.27-2.08-.81-.48-.54-.73-1.34-.73-2.39,0-.51.07-.97.2-1.39.13-.41.32-.76.57-1.05s.55-.51.9-.67.75-.23,1.18-.23c.3,0,.57.03.83.08.25.05.5.13.73.23v.85c-.23-.13-.47-.22-.72-.29-.25-.07-.52-.1-.81-.1s-.57.06-.81.17-.45.27-.62.49c-.17.21-.3.47-.39.78s-.14.66-.14,1.05c0,.83.17,1.45.5,1.87s.83.63,1.47.63c.27,0,.54-.03.79-.09s.49-.15.72-.27v.82Z"/>
+    <path class="cls-2" d="M60.61,123.35c0,.38-.05.73-.16,1.05s-.26.59-.46.82c-.2.23-.45.4-.74.53-.29.12-.62.19-.99.19s-.67-.05-.94-.16c-.28-.11-.51-.27-.71-.48-.19-.21-.34-.47-.44-.79s-.15-.67-.15-1.08c0-.38.05-.73.16-1.04.11-.31.26-.58.46-.81.2-.23.45-.4.74-.53.29-.13.62-.19.99-.19s.67.05.94.16c.28.11.51.27.71.48s.34.47.44.78.15.67.15,1.07ZM59.74,123.39c0-.3-.03-.57-.1-.79-.07-.23-.16-.42-.29-.57s-.27-.27-.45-.34c-.18-.08-.38-.12-.59-.12-.25,0-.47.05-.65.15-.18.1-.33.23-.44.4s-.2.36-.25.58-.08.45-.08.69c0,.3.03.57.1.8.07.23.16.42.29.57s.27.26.45.34c.18.08.37.11.6.11.25,0,.47-.05.65-.15.18-.1.33-.23.44-.4s.2-.36.25-.58.08-.45.08-.7Z"/>
+    <path class="cls-2" d="M61.84,120.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M71.15,125.66c-.22.08-.45.15-.68.19-.23.04-.47.06-.72.06-.77,0-1.37-.21-1.79-.63s-.63-1.03-.63-1.84c0-.39.06-.74.18-1.05.12-.32.29-.59.51-.81s.48-.4.78-.52.64-.18,1-.18c.25,0,.49.02.71.05.22.04.43.09.63.18v.81c-.21-.11-.43-.19-.65-.24-.22-.05-.45-.08-.68-.08-.22,0-.42.04-.62.12s-.36.2-.51.36-.26.35-.35.57-.13.48-.13.76c0,.59.14,1.04.43,1.33.29.29.69.44,1.2.44.23,0,.46-.03.67-.08.22-.05.43-.13.63-.23v.79Z"/>
+    <path class="cls-2" d="M75.99,125.84l-.02-.66c-.27.26-.54.45-.81.57s-.56.18-.87.18c-.28,0-.52-.04-.72-.11-.2-.07-.36-.17-.49-.29-.13-.13-.22-.27-.28-.44-.06-.17-.09-.35-.09-.55,0-.49.18-.88.55-1.15s.91-.42,1.62-.42h1.02v-.43c0-.29-.09-.52-.28-.7-.19-.17-.47-.26-.85-.26-.28,0-.55.03-.82.09-.27.06-.55.15-.83.26v-.77c.11-.04.23-.08.36-.11.13-.04.27-.07.42-.1s.3-.05.46-.07c.16-.02.32-.03.48-.03.3,0,.56.03.8.1.24.07.44.17.6.3.16.13.29.3.38.5.09.2.13.44.13.71v3.38h-.76ZM75.89,123.61h-1.08c-.21,0-.39.02-.55.06-.15.04-.28.1-.38.18s-.17.17-.22.28c-.05.11-.07.23-.07.37,0,.09.01.18.04.27.03.09.08.16.14.23.06.07.15.12.25.16s.23.06.38.06c.2,0,.42-.06.67-.18.25-.12.52-.31.8-.56v-.87Z"/>
+    <path class="cls-2" d="M82.29,125.77c-.19.05-.39.08-.6.11-.21.02-.41.03-.62.03-.62,0-1.07-.14-1.38-.42s-.45-.71-.45-1.28v-2.56h-1.37v-.71h1.37v-1.35l.85-.22v1.57h2.2v.71h-2.2v2.49c0,.35.09.61.28.79.19.17.46.26.83.26.16,0,.33-.01.51-.04s.38-.06.58-.12v.73Z"/>
+    <path class="cls-2" d="M86.77,127.89c-1.5-1.39-2.25-2.93-2.25-4.61,0-.39.04-.79.12-1.18.08-.39.21-.79.39-1.18.18-.39.41-.79.7-1.18.29-.39.65-.78,1.06-1.17l.49.5c-1.26,1.25-1.89,2.63-1.89,4.15,0,.76.16,1.48.48,2.18.32.7.79,1.35,1.42,1.97l-.51.52Z"/>
+    <path class="cls-2" d="M93.78,122.6c0,.57-.07,1.07-.2,1.48-.14.42-.32.76-.55,1.03-.23.27-.5.47-.81.61s-.63.2-.97.2c-.41,0-.77-.07-1.07-.22-.3-.15-.56-.36-.76-.64-.2-.28-.35-.62-.45-1.02-.1-.4-.15-.86-.15-1.36,0-.57.07-1.06.2-1.47.13-.42.31-.76.54-1.03.23-.27.5-.47.8-.61s.63-.2.97-.2c.41,0,.77.08,1.07.22.3.15.56.36.76.64s.35.62.45,1.02.15.85.15,1.35ZM92.88,122.67c0-.37-.03-.72-.09-1.03-.06-.31-.15-.58-.28-.8s-.29-.4-.49-.52c-.2-.12-.44-.19-.73-.19s-.51.07-.71.2-.36.31-.49.54c-.13.23-.22.49-.28.8-.06.3-.09.63-.09.97,0,.38.03.72.09,1.03.06.31.15.58.28.8.13.22.29.4.49.52.2.12.44.19.72.19s.51-.07.71-.2.36-.31.49-.54c.13-.23.22-.49.29-.79s.09-.63.09-.97Z"/>
+    <path class="cls-2" d="M99.02,123.3c0,.41-.06.77-.17,1.09-.11.32-.27.59-.48.82-.21.22-.46.39-.75.51-.3.12-.63.18-1,.18-.29,0-.59-.03-.89-.08-.3-.05-.6-.14-.9-.26v-6.61h.85v1.9l-.04.91c.24-.33.51-.56.78-.7.28-.14.58-.2.9-.2.28,0,.53.06.74.18s.39.28.53.5c.14.21.25.47.32.77.07.3.11.64.11,1.01ZM98.15,123.34c0-.26-.02-.49-.06-.71s-.1-.4-.18-.55c-.08-.15-.19-.27-.31-.36-.13-.09-.28-.13-.45-.13-.11,0-.22.02-.33.05s-.23.09-.34.17c-.12.08-.24.19-.38.32s-.27.29-.42.49v2.38c.17.07.34.12.51.15.17.04.34.06.49.06.2,0,.38-.03.56-.09.18-.06.33-.17.47-.31.14-.15.24-.34.32-.58s.12-.54.12-.89Z"/>
+    <path class="cls-2" d="M104.21,124.5c0,.17-.03.33-.09.46s-.14.26-.24.36c-.1.11-.22.2-.35.27-.13.08-.28.14-.43.19s-.31.08-.47.11c-.16.02-.32.03-.47.03-.33,0-.64-.01-.92-.04s-.55-.08-.82-.14v-.78c.29.08.57.14.85.19.28.04.56.06.84.06.41,0,.71-.05.9-.17.2-.11.29-.27.29-.47,0-.09-.02-.17-.05-.24-.03-.07-.09-.14-.17-.2s-.21-.13-.38-.2-.4-.15-.7-.23c-.22-.06-.43-.14-.61-.22s-.35-.18-.49-.3c-.14-.11-.24-.25-.32-.4-.08-.15-.12-.33-.12-.54,0-.14.03-.29.1-.45.06-.16.17-.31.32-.45.15-.14.36-.26.62-.35s.59-.14.98-.14c.19,0,.41.01.64.03.23.02.48.06.73.11v.76c-.27-.06-.52-.11-.76-.14-.24-.03-.45-.05-.62-.05-.21,0-.39.02-.53.05-.15.03-.26.08-.35.13-.09.06-.15.12-.19.2-.04.08-.06.16-.06.25s.02.17.05.24c.03.07.1.14.19.21.09.07.22.13.39.2.17.07.38.14.65.22.29.08.53.17.73.27s.36.2.48.31c.12.11.21.24.27.39.05.14.08.31.08.49Z"/>
+    <path class="cls-2" d="M109.97,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM109.08,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M111.52,120.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M116.36,120.93h.97l1.2,3.24.26.79.27-.81,1.19-3.22h.93l-1.92,4.9h-.98l-1.92-4.9Z"/>
+    <path class="cls-2" d="M125.47,125.84l-.02-.66c-.27.26-.54.45-.81.57s-.56.18-.87.18c-.28,0-.52-.04-.72-.11-.2-.07-.36-.17-.49-.29-.13-.13-.22-.27-.28-.44-.06-.17-.09-.35-.09-.55,0-.49.18-.88.55-1.15s.91-.42,1.62-.42h1.02v-.43c0-.29-.09-.52-.28-.7-.19-.17-.47-.26-.85-.26-.28,0-.55.03-.82.09-.27.06-.55.15-.83.26v-.77c.11-.04.23-.08.36-.11.13-.04.27-.07.42-.1s.3-.05.46-.07c.16-.02.32-.03.48-.03.3,0,.56.03.8.1.24.07.44.17.6.3.16.13.29.3.38.5.09.2.13.44.13.71v3.38h-.76ZM125.38,123.61h-1.08c-.21,0-.39.02-.55.06-.15.04-.28.1-.38.18s-.17.17-.22.28c-.05.11-.07.23-.07.37,0,.09.01.18.04.27.03.09.08.16.14.23.06.07.15.12.25.16s.23.06.38.06c.2,0,.42-.06.67-.18.25-.12.52-.31.8-.56v-.87Z"/>
+    <path class="cls-2" d="M132.01,123.3c0,.41-.06.77-.17,1.09-.11.32-.27.59-.48.82-.21.22-.46.39-.75.51-.3.12-.63.18-1,.18-.29,0-.59-.03-.89-.08-.3-.05-.6-.14-.9-.26v-6.61h.85v1.9l-.04.91c.24-.33.51-.56.78-.7.28-.14.58-.2.9-.2.28,0,.53.06.74.18s.39.28.53.5c.14.21.25.47.32.77.07.3.11.64.11,1.01ZM131.14,123.34c0-.26-.02-.49-.06-.71s-.1-.4-.18-.55c-.08-.15-.19-.27-.31-.36-.13-.09-.28-.13-.45-.13-.11,0-.22.02-.33.05s-.23.09-.34.17c-.12.08-.24.19-.38.32s-.27.29-.42.49v2.38c.17.07.34.12.51.15.17.04.34.06.49.06.2,0,.38-.03.56-.09.18-.06.33-.17.47-.31.14-.15.24-.34.32-.58s.12-.54.12-.89Z"/>
+    <path class="cls-2" d="M134.99,119.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M142.95,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM142.07,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M146.24,124.3c.11,0,.22.02.31.06.1.04.19.1.26.18.07.08.13.16.17.26.04.1.06.21.06.32s-.02.21-.06.31-.1.18-.17.26-.16.13-.26.17c-.1.04-.2.06-.31.06s-.22-.02-.32-.06c-.1-.04-.18-.1-.26-.17s-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.32c.04-.1.1-.19.17-.26.07-.07.16-.13.26-.18.1-.04.2-.06.32-.06Z"/>
+    <path class="cls-2" d="M154.16,125.84h-.98l-.95-2.04c-.07-.16-.15-.29-.22-.39s-.16-.18-.24-.24c-.09-.06-.18-.1-.28-.13-.1-.03-.22-.04-.34-.04h-.41v2.84h-.87v-6.38h1.71c.37,0,.69.04.96.12.27.08.49.2.66.34s.3.32.38.53c.08.21.12.44.12.69,0,.2-.03.39-.09.56-.06.18-.15.34-.26.48-.12.14-.26.27-.43.38-.17.11-.37.18-.59.24.18.06.33.17.46.33.13.15.25.36.38.62l1.01,2.1ZM152.77,121.21c0-.34-.11-.6-.32-.77-.21-.17-.51-.25-.9-.25h-.82v2.11h.7c.21,0,.39-.02.55-.07.16-.05.3-.12.42-.21s.21-.21.27-.34c.06-.14.1-.29.1-.47Z"/>
+    <path class="cls-2" d="M159.45,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM158.56,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M164.76,125.77c-.19.05-.39.08-.6.11-.21.02-.41.03-.62.03-.62,0-1.07-.14-1.38-.42s-.45-.71-.45-1.28v-2.56h-1.37v-.71h1.37v-1.35l.85-.22v1.57h2.2v.71h-2.2v2.49c0,.35.09.61.28.79.19.17.46.26.83.26.16,0,.33-.01.51-.04s.38-.06.58-.12v.73Z"/>
+    <path class="cls-2" d="M170.24,125.84h-.76l-.03-.79c-.15.17-.29.31-.42.42s-.26.2-.39.27-.26.12-.39.14c-.13.03-.27.04-.42.04-.5,0-.89-.15-1.14-.44-.26-.3-.39-.74-.39-1.34v-3.2h.85v3.13c0,.75.28,1.13.85,1.13.1,0,.21-.02.31-.05.1-.03.2-.08.31-.16.11-.08.23-.18.35-.31.13-.13.27-.29.42-.49v-3.25h.85v4.9Z"/>
+    <path class="cls-2" d="M172,120.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M177.3,120.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M185.73,127.89c-1.5-1.39-2.25-2.93-2.25-4.61,0-.39.04-.79.12-1.18.08-.39.21-.79.39-1.18.18-.39.41-.79.7-1.18.29-.39.65-.78,1.06-1.17l.49.5c-1.26,1.25-1.89,2.63-1.89,4.15,0,.76.16,1.48.48,2.18.32.7.79,1.35,1.42,1.97l-.51.52Z"/>
+    <path class="cls-2" d="M191.72,123.58h-2.92v-.8h2.92v.8Z"/>
+    <path class="cls-2" d="M197.88,125.84h-4.01v-.79h1.64v-4.66l-1.53.83-.31-.72,2.03-1.07h.75v5.62h1.43v.79Z"/>
+    <path class="cls-2" d="M199.67,126.84c.17,0,.33,0,.48-.04.16-.04.29-.09.41-.16.12-.07.21-.16.29-.26.07-.1.11-.22.11-.36s-.02-.25-.07-.33c-.05-.08-.1-.16-.16-.23-.06-.07-.11-.15-.16-.23-.05-.08-.07-.19-.07-.33,0-.07.01-.14.04-.21.03-.07.07-.14.12-.21.05-.06.12-.11.21-.15s.18-.06.3-.06.22.02.33.07c.11.05.2.12.28.22s.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66c-.2.19-.44.35-.74.46-.29.11-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-2" d="M214.17,124.5c0,.17-.03.33-.09.46s-.14.26-.24.36c-.1.11-.22.2-.35.27-.13.08-.28.14-.43.19s-.31.08-.47.11c-.16.02-.32.03-.47.03-.33,0-.64-.01-.92-.04s-.55-.08-.82-.14v-.78c.29.08.57.14.85.19.28.04.56.06.84.06.41,0,.71-.05.9-.17.2-.11.29-.27.29-.47,0-.09-.02-.17-.05-.24-.03-.07-.09-.14-.17-.2s-.21-.13-.38-.2-.4-.15-.7-.23c-.22-.06-.43-.14-.61-.22s-.35-.18-.49-.3c-.14-.11-.24-.25-.32-.4-.08-.15-.12-.33-.12-.54,0-.14.03-.29.1-.45.06-.16.17-.31.32-.45.15-.14.36-.26.62-.35s.59-.14.98-.14c.19,0,.41.01.64.03.23.02.48.06.73.11v.76c-.27-.06-.52-.11-.76-.14-.24-.03-.45-.05-.62-.05-.21,0-.39.02-.53.05-.15.03-.26.08-.35.13-.09.06-.15.12-.19.2-.04.08-.06.16-.06.25s.02.17.05.24c.03.07.1.14.19.21.09.07.22.13.39.2.17.07.38.14.65.22.29.08.53.17.73.27s.36.2.48.31c.12.11.21.24.27.39.05.14.08.31.08.49Z"/>
+    <path class="cls-2" d="M219.59,125.66c-.22.08-.45.15-.68.19-.23.04-.47.06-.72.06-.77,0-1.37-.21-1.79-.63s-.63-1.03-.63-1.84c0-.39.06-.74.18-1.05.12-.32.29-.59.51-.81s.48-.4.78-.52.64-.18,1-.18c.25,0,.49.02.71.05.22.04.43.09.63.18v.81c-.21-.11-.43-.19-.65-.24-.22-.05-.45-.08-.68-.08-.22,0-.42.04-.62.12s-.36.2-.51.36-.26.35-.35.57-.13.48-.13.76c0,.59.14,1.04.43,1.33.29.29.69.44,1.2.44.23,0,.46-.03.67-.08.22-.05.43-.13.63-.23v.79Z"/>
+    <path class="cls-2" d="M225.22,125.84h-.85v-3.13c0-.38-.07-.66-.21-.85-.14-.19-.34-.28-.61-.28-.11,0-.22.02-.32.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.44.49v3.25h-.85v-6.9h.85v2l-.03.77c.13-.16.26-.29.39-.4.13-.11.26-.2.39-.27s.26-.12.39-.15.27-.04.42-.04c.49,0,.87.15,1.13.45s.4.75.4,1.34v3.2Z"/>
+    <path class="cls-2" d="M230.92,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM230.04,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M232.03,123.49c0-.42.06-.79.17-1.11.11-.32.28-.6.49-.82.21-.22.46-.39.76-.51.29-.12.62-.17.98-.17.16,0,.31,0,.46.03s.3.05.45.09v-2.06h.85v6.9h-.76l-.03-.93c-.24.35-.49.6-.77.77s-.58.25-.9.25c-.28,0-.53-.06-.74-.18s-.39-.28-.53-.5c-.14-.21-.25-.47-.32-.77-.07-.3-.11-.63-.11-1ZM232.9,123.43c0,.59.09,1.03.26,1.33.17.29.42.44.74.44.21,0,.44-.1.68-.29.24-.19.49-.48.75-.85v-2.28c-.14-.06-.29-.11-.46-.15s-.34-.05-.5-.05c-.46,0-.82.15-1.08.45-.26.3-.39.77-.39,1.41Z"/>
+    <path class="cls-2" d="M241.72,125.84h-.76l-.03-.79c-.15.17-.29.31-.42.42s-.26.2-.39.27-.26.12-.39.14c-.13.03-.27.04-.42.04-.5,0-.89-.15-1.14-.44-.26-.3-.39-.74-.39-1.34v-3.2h.85v3.13c0,.75.28,1.13.85,1.13.1,0,.21-.02.31-.05.1-.03.2-.08.31-.16.11-.08.23-.18.35-.31.13-.13.27-.29.42-.49v-3.25h.85v4.9Z"/>
+    <path class="cls-2" d="M244.95,119.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M252.92,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM252.03,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M254.47,120.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M260.77,118.57c1.5,1.39,2.25,2.94,2.25,4.64,0,.35-.04.72-.11,1.09-.07.38-.19.76-.37,1.16s-.4.8-.7,1.2c-.29.41-.66.82-1.1,1.23l-.49-.5c.63-.63,1.11-1.28,1.42-1.97s.47-1.4.47-2.15c0-1.55-.63-2.94-1.89-4.18l.51-.52Z"/>
+    <path class="cls-2" d="M267.2,124.3c.11,0,.22.02.31.06.1.04.19.1.26.18.07.08.13.16.17.26.04.1.06.21.06.32s-.02.21-.06.31-.1.18-.17.26-.16.13-.26.17c-.1.04-.2.06-.31.06s-.22-.02-.32-.06c-.1-.04-.18-.1-.26-.17s-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.32c.04-.1.1-.19.17-.26.07-.07.16-.13.26-.18.1-.04.2-.06.32-.06Z"/>
+    <path class="cls-2" d="M275.13,122.57c0,.31-.02.6-.07.88-.05.28-.12.54-.23.78-.1.24-.24.46-.41.66-.17.2-.37.37-.61.5-.24.14-.52.25-.84.33-.32.08-.68.11-1.09.11h-1.37v-6.38h1.65c1,0,1.74.26,2.23.77s.73,1.3.73,2.35ZM274.21,122.64c0-.45-.04-.83-.13-1.15s-.21-.56-.39-.76c-.17-.19-.39-.33-.65-.42-.26-.09-.57-.13-.92-.13h-.75v4.9h.65c1.45,0,2.18-.82,2.18-2.45Z"/>
+    <path class="cls-2" d="M280.41,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM279.52,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M283.43,119.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M290.41,125.84l-.02-.66c-.27.26-.54.45-.81.57s-.56.18-.87.18c-.28,0-.52-.04-.72-.11-.2-.07-.36-.17-.49-.29-.13-.13-.22-.27-.28-.44-.06-.17-.09-.35-.09-.55,0-.49.18-.88.55-1.15s.91-.42,1.62-.42h1.02v-.43c0-.29-.09-.52-.28-.7-.19-.17-.47-.26-.85-.26-.28,0-.55.03-.82.09-.27.06-.55.15-.83.26v-.77c.11-.04.23-.08.36-.11.13-.04.27-.07.42-.1s.3-.05.46-.07c.16-.02.32-.03.48-.03.3,0,.56.03.8.1.24.07.44.17.6.3.16.13.29.3.38.5.09.2.13.44.13.71v3.38h-.76ZM290.32,123.61h-1.08c-.21,0-.39.02-.55.06-.15.04-.28.1-.38.18s-.17.17-.22.28c-.05.11-.07.23-.07.37,0,.09.01.18.04.27.03.09.08.16.14.23.06.07.15.12.25.16s.23.06.38.06c.2,0,.42-.06.67-.18.25-.12.52-.31.8-.56v-.87Z"/>
+    <path class="cls-2" d="M297.12,120.93l-1.67,4.38c-.17.45-.35.83-.53,1.15s-.38.59-.6.79c-.22.21-.46.36-.72.46s-.55.15-.87.15c-.08,0-.16,0-.23,0-.07,0-.14,0-.22-.01v-.77c.07,0,.15.02.23.03.08,0,.17.01.27.01.16,0,.3-.02.44-.07.14-.04.26-.12.38-.22s.24-.24.35-.4c.11-.16.22-.36.32-.59l-1.96-4.9h.97l1.24,3.24.25.76.28-.78,1.15-3.22h.93Z"/>
+    <path class="cls-2" d="M301.19,127.89c-1.5-1.39-2.25-2.93-2.25-4.61,0-.39.04-.79.12-1.18.08-.39.21-.79.39-1.18.18-.39.41-.79.7-1.18.29-.39.65-.78,1.06-1.17l.49.5c-1.26,1.25-1.89,2.63-1.89,4.15,0,.76.16,1.48.48,2.18.32.7.79,1.35,1.42,1.97l-.51.52Z"/>
+    <path class="cls-2" d="M307.25,125.84v-3.52c0-.15,0-.28-.02-.38s-.03-.17-.05-.23c-.02-.06-.06-.1-.09-.12-.04-.02-.08-.03-.14-.03-.06,0-.13.02-.18.06s-.11.1-.18.19-.13.2-.21.35c-.08.14-.17.32-.27.53v3.15h-.78v-3.43c0-.18,0-.32-.02-.43-.01-.11-.03-.2-.05-.26-.02-.06-.06-.1-.1-.13-.04-.02-.09-.03-.14-.03-.06,0-.11.02-.17.05-.05.03-.11.09-.17.18-.06.08-.13.2-.21.35s-.17.33-.28.56v3.15h-.78v-4.9h.65l.04.93c.08-.19.17-.34.25-.47.08-.13.16-.24.25-.31.08-.08.17-.14.27-.18.1-.04.2-.06.32-.06.26,0,.46.09.6.26.14.17.21.44.21.8.08-.17.15-.32.23-.45s.16-.24.24-.33c.09-.09.18-.16.29-.21.1-.05.22-.07.36-.07.62,0,.92.47.92,1.42v3.57h-.78Z"/>
+    <path class="cls-2" d="M310.92,121.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM311.22,118.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-2" d="M314.75,120.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M321.92,121.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM322.22,118.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-2" d="M329.24,125.84v-3.52c0-.15,0-.28-.02-.38s-.03-.17-.05-.23c-.02-.06-.06-.1-.09-.12-.04-.02-.08-.03-.14-.03-.06,0-.13.02-.18.06s-.11.1-.18.19-.13.2-.21.35c-.08.14-.17.32-.27.53v3.15h-.78v-3.43c0-.18,0-.32-.02-.43-.01-.11-.03-.2-.05-.26-.02-.06-.06-.1-.1-.13-.04-.02-.09-.03-.14-.03-.06,0-.11.02-.17.05-.05.03-.11.09-.17.18-.06.08-.13.2-.21.35s-.17.33-.28.56v3.15h-.78v-4.9h.65l.04.93c.08-.19.17-.34.25-.47.08-.13.16-.24.25-.31.08-.08.17-.14.27-.18.1-.04.2-.06.32-.06.26,0,.46.09.6.26.14.17.21.44.21.8.08-.17.15-.32.23-.45s.16-.24.24-.33c.09-.09.18-.16.29-.21.1-.05.22-.07.36-.07.62,0,.92.47.92,1.42v3.57h-.78Z"/>
+    <path class="cls-2" d="M335.19,125.84h-.76l-.03-.79c-.15.17-.29.31-.42.42s-.26.2-.39.27-.26.12-.39.14c-.13.03-.27.04-.42.04-.5,0-.89-.15-1.14-.44-.26-.3-.39-.74-.39-1.34v-3.2h.85v3.13c0,.75.28,1.13.85,1.13.1,0,.21-.02.31-.05.1-.03.2-.08.31-.16.11-.08.23-.18.35-.31.13-.13.27-.29.42-.49v-3.25h.85v4.9Z"/>
+    <path class="cls-2" d="M340.24,125.84v-3.52c0-.15,0-.28-.02-.38s-.03-.17-.05-.23c-.02-.06-.06-.1-.09-.12-.04-.02-.08-.03-.14-.03-.06,0-.13.02-.18.06s-.11.1-.18.19-.13.2-.21.35c-.08.14-.17.32-.27.53v3.15h-.78v-3.43c0-.18,0-.32-.02-.43-.01-.11-.03-.2-.05-.26-.02-.06-.06-.1-.1-.13-.04-.02-.09-.03-.14-.03-.06,0-.11.02-.17.05-.05.03-.11.09-.17.18-.06.08-.13.2-.21.35s-.17.33-.28.56v3.15h-.78v-4.9h.65l.04.93c.08-.19.17-.34.25-.47.08-.13.16-.24.25-.31.08-.08.17-.14.27-.18.1-.04.2-.06.32-.06.26,0,.46.09.6.26.14.17.21.44.21.8.08-.17.15-.32.23-.45s.16-.24.24-.33c.09-.09.18-.16.29-.21.1-.05.22-.07.36-.07.62,0,.92.47.92,1.42v3.57h-.78Z"/>
+    <path class="cls-2" d="M343.77,120.19h-1.47v-.73h3.82v.73h-1.47v4.91h1.47v.74h-3.82v-.74h1.47v-4.91Z"/>
+    <path class="cls-2" d="M347.74,120.93h.76l.03.79c.14-.17.28-.31.42-.42s.26-.2.39-.27.26-.12.39-.14c.13-.03.27-.04.42-.04.5,0,.89.15,1.15.45s.39.75.39,1.34v3.2h-.85v-3.13c0-.38-.07-.67-.21-.85-.14-.18-.36-.28-.64-.28-.1,0-.21.02-.31.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.42.49v3.25h-.85v-4.9Z"/>
+    <path class="cls-2" d="M356.39,125.84l-.02-.66c-.27.26-.54.45-.81.57s-.56.18-.87.18c-.28,0-.52-.04-.72-.11-.2-.07-.36-.17-.49-.29-.13-.13-.22-.27-.28-.44-.06-.17-.09-.35-.09-.55,0-.49.18-.88.55-1.15s.91-.42,1.62-.42h1.02v-.43c0-.29-.09-.52-.28-.7-.19-.17-.47-.26-.85-.26-.28,0-.55.03-.82.09-.27.06-.55.15-.83.26v-.77c.11-.04.23-.08.36-.11.13-.04.27-.07.42-.1s.3-.05.46-.07c.16-.02.32-.03.48-.03.3,0,.56.03.8.1.24.07.44.17.6.3.16.13.29.3.38.5.09.2.13.44.13.71v3.38h-.76ZM356.29,123.61h-1.08c-.21,0-.39.02-.55.06-.15.04-.28.1-.38.18s-.17.17-.22.28c-.05.11-.07.23-.07.37,0,.09.01.18.04.27.03.09.08.16.14.23.06.07.15.12.25.16s.23.06.38.06c.2,0,.42-.06.67-.18.25-.12.52-.31.8-.56v-.87Z"/>
+    <path class="cls-2" d="M362.54,125.66c-.22.08-.45.15-.68.19-.23.04-.47.06-.72.06-.77,0-1.37-.21-1.79-.63s-.63-1.03-.63-1.84c0-.39.06-.74.18-1.05.12-.32.29-.59.51-.81s.48-.4.78-.52.64-.18,1-.18c.25,0,.49.02.71.05.22.04.43.09.63.18v.81c-.21-.11-.43-.19-.65-.24-.22-.05-.45-.08-.68-.08-.22,0-.42.04-.62.12s-.36.2-.51.36-.26.35-.35.57-.13.48-.13.76c0,.59.14,1.04.43,1.33.29.29.69.44,1.2.44.23,0,.46-.03.67-.08.22-.05.43-.13.63-.23v.79Z"/>
+    <path class="cls-2" d="M368.18,125.77c-.19.05-.39.08-.6.11-.21.02-.41.03-.62.03-.62,0-1.07-.14-1.38-.42s-.45-.71-.45-1.28v-2.56h-1.37v-.71h1.37v-1.35l.85-.22v1.57h2.2v.71h-2.2v2.49c0,.35.09.61.28.79.19.17.46.26.83.26.16,0,.33-.01.51-.04s.38-.06.58-.12v.73Z"/>
+    <path class="cls-2" d="M371.4,121.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM371.7,118.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-2" d="M374.77,120.93h.97l1.2,3.24.26.79.27-.81,1.19-3.22h.93l-1.92,4.9h-.98l-1.92-4.9Z"/>
+    <path class="cls-2" d="M382.4,121.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM382.7,118.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-2" d="M390.18,125.77c-.19.05-.39.08-.6.11-.21.02-.41.03-.62.03-.62,0-1.07-.14-1.38-.42s-.45-.71-.45-1.28v-2.56h-1.37v-.71h1.37v-1.35l.85-.22v1.57h2.2v.71h-2.2v2.49c0,.35.09.61.28.79.19.17.46.26.83.26.16,0,.33-.01.51-.04s.38-.06.58-.12v.73Z"/>
+    <path class="cls-2" d="M396.08,120.93l-1.67,4.38c-.17.45-.35.83-.53,1.15s-.38.59-.6.79c-.22.21-.46.36-.72.46s-.55.15-.87.15c-.08,0-.16,0-.23,0-.07,0-.14,0-.22-.01v-.77c.07,0,.15.02.23.03.08,0,.17.01.27.01.16,0,.3-.02.44-.07.14-.04.26-.12.38-.22s.24-.24.35-.4c.11-.16.22-.36.32-.59l-1.96-4.9h.97l1.24,3.24.25.76.28-.78,1.15-3.22h.93Z"/>
+    <path class="cls-2" d="M401.4,121.41c0,.26-.05.52-.15.77-.1.25-.25.48-.45.69-.21.2-.47.37-.79.49-.32.12-.7.19-1.14.19h-.79v2.29h-.87v-6.38h1.8c.32,0,.62.04.91.11.29.07.54.18.76.34s.39.36.52.61c.13.25.2.55.2.9ZM400.5,121.45c0-.41-.13-.72-.4-.94-.27-.22-.64-.33-1.13-.33h-.89v2.63h.81c.51,0,.91-.11,1.19-.34s.42-.56.42-1.02Z"/>
+    <path class="cls-2" d="M406.86,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM405.98,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M408.42,120.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M415.39,121.64h-1.45v-.7h2.31v4.19h1.46v.71h-3.93v-.71h1.61v-3.49ZM415.68,118.88c.09,0,.18.02.26.05s.15.08.21.14c.06.06.11.13.14.21.03.08.05.17.05.26s-.02.18-.05.26c-.03.08-.08.15-.14.21-.06.06-.13.11-.21.14s-.17.05-.26.05-.18-.02-.26-.05-.15-.08-.21-.14c-.06-.06-.11-.13-.14-.21-.03-.08-.05-.17-.05-.26s.02-.18.05-.26c.03-.08.08-.15.14-.21.06-.06.13-.11.21-.14s.17-.05.26-.05Z"/>
+    <path class="cls-2" d="M423.48,123.35c0,.38-.05.73-.16,1.05s-.26.59-.46.82c-.2.23-.45.4-.74.53-.29.12-.62.19-.99.19s-.67-.05-.94-.16c-.28-.11-.51-.27-.71-.48-.19-.21-.34-.47-.44-.79s-.15-.67-.15-1.08c0-.38.05-.73.16-1.04.11-.31.26-.58.46-.81.2-.23.45-.4.74-.53.29-.13.62-.19.99-.19s.67.05.94.16c.28.11.51.27.71.48s.34.47.44.78.15.67.15,1.07ZM422.61,123.39c0-.3-.03-.57-.1-.79-.07-.23-.16-.42-.29-.57s-.27-.27-.45-.34c-.18-.08-.38-.12-.59-.12-.25,0-.47.05-.65.15-.18.1-.33.23-.44.4s-.2.36-.25.58-.08.45-.08.69c0,.3.03.57.1.8.07.23.16.42.29.57s.27.26.45.34c.18.08.37.11.6.11.25,0,.47-.05.65-.15.18-.1.33-.23.44-.4s.2-.36.25-.58.08-.45.08-.7Z"/>
+    <path class="cls-2" d="M424.46,123.49c0-.42.06-.79.17-1.11.11-.32.28-.6.49-.82.21-.22.46-.39.76-.51.29-.12.62-.17.98-.17.16,0,.31,0,.46.03s.3.05.45.09v-2.06h.85v6.9h-.76l-.03-.93c-.24.35-.49.6-.77.77s-.58.25-.9.25c-.28,0-.53-.06-.74-.18s-.39-.28-.53-.5c-.14-.21-.25-.47-.32-.77-.07-.3-.11-.63-.11-1ZM425.33,123.43c0,.59.09,1.03.26,1.33.17.29.42.44.74.44.21,0,.44-.1.68-.29.24-.19.49-.48.75-.85v-2.28c-.14-.06-.29-.11-.46-.15s-.34-.05-.5-.05c-.46,0-.82.15-1.08.45-.26.3-.39.77-.39,1.41Z"/>
+    <path class="cls-2" d="M430.59,126.84c.17,0,.33,0,.48-.04.16-.04.29-.09.41-.16.12-.07.21-.16.29-.26.07-.1.11-.22.11-.36s-.02-.25-.07-.33c-.05-.08-.1-.16-.16-.23-.06-.07-.11-.15-.16-.23-.05-.08-.07-.19-.07-.33,0-.07.01-.14.04-.21.03-.07.07-.14.12-.21.05-.06.12-.11.21-.15s.18-.06.3-.06.22.02.33.07c.11.05.2.12.28.22s.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66c-.2.19-.44.35-.74.46-.29.11-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-2" d="M445.09,124.5c0,.17-.03.33-.09.46s-.14.26-.24.36c-.1.11-.22.2-.35.27-.13.08-.28.14-.43.19s-.31.08-.47.11c-.16.02-.32.03-.47.03-.33,0-.64-.01-.92-.04s-.55-.08-.82-.14v-.78c.29.08.57.14.85.19.28.04.56.06.84.06.41,0,.71-.05.9-.17.2-.11.29-.27.29-.47,0-.09-.02-.17-.05-.24-.03-.07-.09-.14-.17-.2s-.21-.13-.38-.2-.4-.15-.7-.23c-.22-.06-.43-.14-.61-.22s-.35-.18-.49-.3c-.14-.11-.24-.25-.32-.4-.08-.15-.12-.33-.12-.54,0-.14.03-.29.1-.45.06-.16.17-.31.32-.45.15-.14.36-.26.62-.35s.59-.14.98-.14c.19,0,.41.01.64.03.23.02.48.06.73.11v.76c-.27-.06-.52-.11-.76-.14-.24-.03-.45-.05-.62-.05-.21,0-.39.02-.53.05-.15.03-.26.08-.35.13-.09.06-.15.12-.19.2-.04.08-.06.16-.06.25s.02.17.05.24c.03.07.1.14.19.21.09.07.22.13.39.2.17.07.38.14.65.22.29.08.53.17.73.27s.36.2.48.31c.12.11.21.24.27.39.05.14.08.31.08.49Z"/>
+    <path class="cls-2" d="M450.51,125.66c-.22.08-.45.15-.68.19-.23.04-.47.06-.72.06-.77,0-1.37-.21-1.79-.63s-.63-1.03-.63-1.84c0-.39.06-.74.18-1.05.12-.32.29-.59.51-.81s.48-.4.78-.52.64-.18,1-.18c.25,0,.49.02.71.05.22.04.43.09.63.18v.81c-.21-.11-.43-.19-.65-.24-.22-.05-.45-.08-.68-.08-.22,0-.42.04-.62.12s-.36.2-.51.36-.26.35-.35.57-.13.48-.13.76c0,.59.14,1.04.43,1.33.29.29.69.44,1.2.44.23,0,.46-.03.67-.08.22-.05.43-.13.63-.23v.79Z"/>
+    <path class="cls-2" d="M456.14,125.84h-.85v-3.13c0-.38-.07-.66-.21-.85-.14-.19-.34-.28-.61-.28-.11,0-.22.02-.32.05-.1.03-.2.08-.31.16-.11.08-.22.18-.35.31-.13.13-.27.29-.44.49v3.25h-.85v-6.9h.85v2l-.03.77c.13-.16.26-.29.39-.4.13-.11.26-.2.39-.27s.26-.12.39-.15.27-.04.42-.04c.49,0,.87.15,1.13.45s.4.75.4,1.34v3.2Z"/>
+    <path class="cls-2" d="M461.84,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM460.96,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M462.95,123.49c0-.42.06-.79.17-1.11.11-.32.28-.6.49-.82.21-.22.46-.39.76-.51.29-.12.62-.17.98-.17.16,0,.31,0,.46.03s.3.05.45.09v-2.06h.85v6.9h-.76l-.03-.93c-.24.35-.49.6-.77.77s-.58.25-.9.25c-.28,0-.53-.06-.74-.18s-.39-.28-.53-.5c-.14-.21-.25-.47-.32-.77-.07-.3-.11-.63-.11-1ZM463.82,123.43c0,.59.09,1.03.26,1.33.17.29.42.44.74.44.21,0,.44-.1.68-.29.24-.19.49-.48.75-.85v-2.28c-.14-.06-.29-.11-.46-.15s-.34-.05-.5-.05c-.46,0-.82.15-1.08.45-.26.3-.39.77-.39,1.41Z"/>
+    <path class="cls-2" d="M472.64,125.84h-.76l-.03-.79c-.15.17-.29.31-.42.42s-.26.2-.39.27-.26.12-.39.14c-.13.03-.27.04-.42.04-.5,0-.89-.15-1.14-.44-.26-.3-.39-.74-.39-1.34v-3.2h.85v3.13c0,.75.28,1.13.85,1.13.1,0,.21-.02.31-.05.1-.03.2-.08.31-.16.11-.08.23-.18.35-.31.13-.13.27-.29.42-.49v-3.25h.85v4.9Z"/>
+    <path class="cls-2" d="M475.86,119.64h-1.45v-.7h2.31v6.19h1.46v.71h-3.93v-.71h1.61v-5.49Z"/>
+    <path class="cls-2" d="M483.83,123.13c0,.12,0,.22,0,.3,0,.08,0,.16-.01.23h-3.44c0,.5.14.89.42,1.16s.68.4,1.21.4c.14,0,.29,0,.43-.02.14-.01.28-.03.42-.05s.26-.04.38-.07.24-.05.34-.08v.7c-.23.07-.49.12-.78.16-.29.04-.59.06-.91.06-.42,0-.78-.06-1.08-.17-.3-.11-.55-.28-.74-.5-.19-.22-.34-.48-.43-.8-.09-.31-.14-.67-.14-1.07,0-.34.05-.67.15-.98s.24-.58.43-.81c.19-.23.42-.42.7-.55s.59-.21.94-.21.64.05.91.16.49.26.67.46c.18.2.32.44.41.72.09.28.14.6.14.94ZM482.95,123c0-.22-.01-.42-.06-.6s-.13-.34-.24-.47c-.11-.13-.25-.23-.41-.3s-.35-.11-.57-.11c-.19,0-.35.04-.51.11-.15.07-.28.17-.4.3-.11.13-.2.29-.27.47-.07.18-.11.38-.13.6h2.58Z"/>
+    <path class="cls-2" d="M485.39,120.93h.78l.02.9c.29-.35.58-.6.86-.76s.57-.23.85-.23c.51,0,.89.17,1.15.49.26.33.38.82.36,1.46h-.86c0-.43-.05-.74-.19-.93-.14-.19-.33-.29-.59-.29-.11,0-.23.02-.34.06-.12.04-.23.11-.36.2-.12.09-.25.2-.39.34-.14.14-.28.31-.44.51v3.15h-.86v-4.9Z"/>
+    <path class="cls-2" d="M491.69,118.57c1.5,1.39,2.25,2.94,2.25,4.64,0,.35-.04.72-.11,1.09-.07.38-.19.76-.37,1.16s-.4.8-.7,1.2c-.29.41-.66.82-1.1,1.23l-.49-.5c.63-.63,1.11-1.28,1.42-1.97s.47-1.4.47-2.15c0-1.55-.63-2.94-1.89-4.18l.51-.52Z"/>
+    <path class="cls-2" d="M497.19,118.57c1.5,1.39,2.25,2.94,2.25,4.64,0,.35-.04.72-.11,1.09-.07.38-.19.76-.37,1.16s-.4.8-.7,1.2c-.29.41-.66.82-1.1,1.23l-.49-.5c.63-.63,1.11-1.28,1.42-1.97s.47-1.4.47-2.15c0-1.55-.63-2.94-1.89-4.18l.51-.52Z"/>
+  </g>
+  <g>
+    <circle class="cls-8" cx="61.2" cy="48.3" r="13.56"/>
+    <path class="cls-2" d="M63.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="92.28" cy="48.3" r="13.56"/>
+    <path class="cls-2" d="M95.03,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="203.84" cy="48.3" r="13.56"/>
+    <path class="cls-2" d="M203.56,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="235.18" cy="48.3" r="13.56"/>
+    <path class="cls-2" d="M238.15,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM235.99,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="280.82" cy="48.3" r="13.56"/>
+    <path class="cls-2" d="M283.47,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-9" cx="375.58" cy="48.3" r="13.56"/>
+    <path class="cls-2" d="M378.46,49.02c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM377.27,49.06c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line class="cls-4" x1="30.52" y1="34.73" x2="30.52" y2="61.86"/>
+  <polyline class="cls-4" points="469.19 34.73 482.24 48.24 470.14 60.76"/>
+  <line id="source_line-3" data-name="source line" class="cls-4" x1="30.52" y1="378.32" x2="482.24" y2="378.32"/>
+  <line class="cls-4" x1="30.52" y1="364.76" x2="30.52" y2="391.89"/>
+  <polyline class="cls-4" points="469.19 364.76 482.24 378.26 470.14 390.78"/>
+  <g>
+    <circle class="cls-8" cx="61.2" cy="165.14" r="13.56"/>
+    <path class="cls-2" d="M63.5,168.69h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-8" cx="61.2" cy="378.32" r="13.56"/>
+    <path class="cls-2" d="M63.5,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-4" data-name="source line" class="cls-4" x1="92.23" y1="190.59" x2="143.69" y2="190.85"/>
+  <g>
+    <circle class="cls-7" cx="145.31" cy="190.59" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M143.69,190.85h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M149.79,194.14h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line class="cls-4" x1="92.23" y1="173.22" x2="92.23" y2="208.23"/>
+  <g>
+    <circle class="cls-7" cx="92.23" cy="190.59" r="13.56"/>
+    <path class="cls-2" d="M94.53,194.14h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="145.31" cy="378.32" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M143.69,378.58h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M149.79,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-7" cx="92.23" cy="378.32" r="13.56"/>
+    <path class="cls-2" d="M94.53,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-5" data-name="source line" class="cls-4" x1="203.84" y1="211.52" x2="255.3" y2="211.78"/>
+  <g>
+    <circle class="cls-3" cx="256.92" cy="211.52" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M255.3,211.78h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M261.41,215.06h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line class="cls-4" x1="203.84" y1="194.14" x2="203.84" y2="229.15"/>
+  <g>
+    <circle class="cls-3" cx="203.84" cy="211.52" r="13.56"/>
+    <path class="cls-2" d="M206.14,215.06h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="203.84" cy="378.32" r="13.56"/>
+    <path class="cls-2" d="M206.14,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-6" data-name="source line" class="cls-4" x1="235.18" y1="237.78" x2="286.64" y2="238.04"/>
+  <g>
+    <circle class="cls-6" cx="288.26" cy="237.78" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M286.64,238.04h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M292.74,241.33h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line class="cls-4" x1="235.18" y1="220.4" x2="235.18" y2="255.41"/>
+  <g>
+    <circle class="cls-6" cx="235.18" cy="237.78" r="13.56"/>
+    <path class="cls-2" d="M237.48,241.33h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="235.18" cy="378.32" r="13.56"/>
+    <path class="cls-2" d="M237.48,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-7" data-name="source line" class="cls-4" x1="280.82" y1="268.72" x2="332.28" y2="268.98"/>
+  <g>
+    <circle class="cls-5" cx="333.9" cy="268.72" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M332.28,268.98h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M338.39,272.27h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line class="cls-4" x1="280.82" y1="251.34" x2="280.82" y2="286.35"/>
+  <g>
+    <circle class="cls-5" cx="280.82" cy="268.72" r="13.56"/>
+    <path class="cls-2" d="M283.12,272.27h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="333.9" cy="378.32" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M332.28,378.58h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M338.39,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line id="source_line-8" data-name="source line" class="cls-4" x1="375.58" y1="289.64" x2="427.04" y2="289.91"/>
+  <g>
+    <circle class="cls-9" cx="428.67" cy="289.64" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M427.04,289.91h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M433.15,293.19h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <line class="cls-4" x1="375.58" y1="272.27" x2="375.58" y2="307.28"/>
+  <g>
+    <circle class="cls-9" cx="375.58" cy="289.64" r="13.56"/>
+    <path class="cls-2" d="M377.88,293.19h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-9" cx="428.67" cy="377.77" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M427.04,378.03h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M433.15,381.32h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-9" cx="375.58" cy="377.77" r="13.56"/>
+    <path class="cls-2" d="M377.88,381.32h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-8" cx="114.28" cy="378.32" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M112.66,378.58h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M118.77,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="256.92" cy="378.32" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M255.3,378.58h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M261.41,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-5" cx="280.82" cy="378.32" r="13.56"/>
+    <path class="cls-2" d="M274.12,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="288.26" cy="378.32" r="13.56"/>
+    <g>
+      <path class="cls-2" d="M286.64,378.58h-3.3v-1.06h3.3v1.06Z"/>
+      <path class="cls-2" d="M292.74,381.87h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+    </g>
+  </g>
+</svg>

+ 108 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-Outstanding-Value.svg

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 504.81 205.48">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8be8;
+      }
+
+      .cls-4 {
+        fill: #ff8b8b;
+      }
+
+      .cls-9 {
+        stroke-width: 0px;
+      }
+
+      .cls-5 {
+        fill: #8be2ff;
+      }
+
+      .cls-6 {
+        fill: #e3e3e3;
+      }
+
+      .cls-7 {
+        fill: #8bffbc;
+      }
+
+      .cls-8 {
+        fill: #ffb68b;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="30.52" y1="48.3" x2="482.24" y2="48.3"/>
+  <g>
+    <path class="cls-9" d="M33.67,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-9" d="M40.73,22.49c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,22.54c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-9" d="M46.93,25.48h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-9" d="M49.04,19.59h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-9" d="M59.97,25.26c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-9" d="M66.97,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+  </g>
+  <g>
+    <path class="cls-9" d="M34.13,99.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM33.09,99.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-9" d="M40.33,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-9" d="M46.94,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-9" d="M53.46,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-9" d="M60.14,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-9" d="M65.78,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM65.67,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-9" d="M68.59,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-9" d="M74.89,99.38c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM75.94,99.32c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-9" d="M83.79,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM84.15,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-9" d="M88.39,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-9" d="M99.22,97.15c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM95.68,103.05c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM95.99,98.24c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-9" d="M110.34,95.66l-2.47,6.54h-.99l-2.45-6.54h1.19l1.79,5.05,1.78-5.05h1.15Z"/>
+    <path class="cls-9" d="M114.6,101.51c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM114.6,100.59v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+    <path class="cls-9" d="M118.36,102.2h-1.1v-9.12h1.1v9.12Z"/>
+    <path class="cls-9" d="M125.08,102.2h-1.1v-.73c-.34.3-.66.52-.97.68s-.64.23-1.02.23c-.29,0-.55-.05-.81-.14s-.47-.24-.66-.45-.33-.46-.44-.77-.16-.68-.16-1.12v-4.25h1.1v3.73c0,.35.01.64.04.86s.08.43.17.6c.09.17.21.29.37.37s.38.12.67.12c.27,0,.56-.08.86-.23s.58-.34.84-.56v-4.89h1.1v6.54Z"/>
+    <path class="cls-9" d="M129.51,102.36c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM130.8,98.2c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="61.2" cy="48.3" r="13.56"/>
+    <path class="cls-9" d="M63.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="92.28" cy="48.3" r="13.56"/>
+    <path class="cls-9" d="M95.03,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="203.84" cy="48.3" r="13.56"/>
+    <path class="cls-9" d="M203.56,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="235.18" cy="48.3" r="13.56"/>
+    <path class="cls-9" d="M238.15,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM235.99,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="280.82" cy="48.3" r="13.56"/>
+    <path class="cls-9" d="M283.47,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-8" cx="375.58" cy="48.3" r="13.56"/>
+    <path class="cls-9" d="M378.46,49.02c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM377.27,49.06c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line class="cls-2" x1="30.52" y1="34.73" x2="30.52" y2="61.86"/>
+  <polyline class="cls-2" points="469.19 34.73 482.24 48.24 470.14 60.76"/>
+  <line class="cls-2" x1="21.27" y1="117.06" x2="30.52" y2="117.06"/>
+  <line class="cls-2" x1="21.27" y1="155.37" x2="30.52" y2="155.37"/>
+  <line class="cls-2" x1="21.27" y1="193.68" x2="30.52" y2="193.68"/>
+  <polyline class="cls-2" points="30.52 112.21 30.52 193.68 483.57 193.68"/>
+  <path class="cls-9" d="M17.42,193.48c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM15.92,196.14c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  <path class="cls-9" d="M16.94,159.86h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  <path class="cls-9" d="M17.38,121.38h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  <polygon class="cls-6" points="30.52 193.68 61.2 193.68 61.2 155.37 92.28 155.37 92.28 116.29 114.28 116.29 114.28 155.37 145.36 155.37 145.36 193.68 203.84 193.68 203.84 155.37 235.18 155.37 235.18 116.29 256.38 116.29 256.38 155.37 280.82 155.37 280.82 116.29 288.26 116.29 288.26 155.37 333.9 155.37 333.9 193.68 375.58 193.68 375.58 154.98 428.67 154.98 428.67 193.68 30.52 193.68"/>
+</svg>

+ 142 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles-Outstanding.svg

@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 504.81 168.65">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8be8;
+      }
+
+      .cls-4 {
+        fill: #ff8b8b;
+      }
+
+      .cls-8 {
+        stroke-width: 0px;
+      }
+
+      .cls-5 {
+        fill: #8be2ff;
+      }
+
+      .cls-6 {
+        fill: #8bffbc;
+      }
+
+      .cls-7 {
+        fill: #ffb68b;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="30.52" y1="48.3" x2="482.24" y2="48.3"/>
+  <line id="Quiescent_line" data-name="Quiescent line" class="cls-2" x1="30.52" y1="129.88" x2="483.57" y2="129.88"/>
+  <g>
+    <path class="cls-8" d="M33.67,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-8" d="M40.73,22.49c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,22.54c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-8" d="M46.93,25.48h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-8" d="M49.04,19.6h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-8" d="M59.97,25.26c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-8" d="M66.97,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+  </g>
+  <g>
+    <path class="cls-8" d="M34.13,99.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM33.09,99.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-8" d="M40.33,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-8" d="M46.94,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-8" d="M53.46,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-8" d="M60.14,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-8" d="M65.78,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM65.67,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-8" d="M68.59,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-8" d="M74.89,99.38c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM75.94,99.32c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-8" d="M83.79,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM84.15,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-8" d="M88.39,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-8" d="M99.22,97.15c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM95.68,103.05c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM95.99,98.24c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="61.2" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M63.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="145.36" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M148.15,129.06c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM146.65,131.72c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="333.9" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M336.69,129.06c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM335.19,131.72c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="428.67" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M431.46,129.06c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM429.96,131.72c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="61.2" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M63.5,133.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="203.84" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M206.14,133.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="375.58" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M377.88,133.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="92.28" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M95.03,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="203.84" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M203.56,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="235.18" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M238.15,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM235.99,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="280.82" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M283.47,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-7" cx="375.58" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M378.46,49.02c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM377.27,49.06c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line class="cls-2" x1="30.52" y1="34.73" x2="30.52" y2="61.86"/>
+  <line class="cls-2" x1="30.52" y1="116.31" x2="30.52" y2="143.44"/>
+  <polyline class="cls-2" points="469.19 34.73 482.24 48.24 470.14 60.76"/>
+  <polyline class="cls-2" points="470.51 116.31 483.57 129.82 471.46 142.34"/>
+  <g>
+    <circle class="cls-4" cx="235.18" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M237.92,133.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="92.28" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M95.03,133.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="114.28" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M116.59,133.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="256.38" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M258.68,133.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="280.82" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M274.57,133.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="288.26" cy="129.88" r="13.56"/>
+    <path class="cls-8" d="M290.56,133.43h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch02-Quiescent-Marbles.ai


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Creating-Marbles.ai


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 18 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Sequence-CreateWrappers.ai


+ 21 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Sequence-CreateWrappers.md

@@ -0,0 +1,21 @@
+```mermaid
+sequenceDiagram
+    participant Subscriber as Subscriber
+    participant SrcWrapper as Rx IObservable Wrapper
+    participant Scheduler as Scheduler
+    participant Observable as Observable.Create
+    participant RcvWrapper as Rx IObserver Wrapper
+    participant Observer as Observer
+    Subscriber->>SrcWrapper: Subscribe()
+    SrcWrapper->>Scheduler: Schedule Subscribe()
+    SrcWrapper->>Subscriber: IDisposable (subscription)
+    Subscriber->>Observer: Set subscription IDisposable
+    Scheduler->>Observable: Subscribe()
+    Observable->>RcvWrapper: OnNext(1)
+    RcvWrapper->>Observer: OnNext(1)
+    Observable->>RcvWrapper: OnNext(2)
+    RcvWrapper->>Observer: OnNext(2)
+    Observer->>SrcWrapper: subscription.Dispose()
+    Observable->>RcvWrapper: OnNext(3)
+    Observable->>RcvWrapper: OnCompleted()
+```

+ 1950 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch03-Sequence-CreateWrappers.svg

@@ -0,0 +1,1950 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="mermaid-1702921444416" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+	 x="0px" y="0px" width="586px" height="382px" viewBox="11.5 194.5 586 382" enable-background="new 11.5 194.5 586 382"
+	 xml:space="preserve">
+<g>
+	<path fill="#EAEAEA" stroke="#666666" d="M518.902,531.909h65.352c0.752,0,1.363,0.609,1.363,1.361v26.776
+		c0,0.752-0.611,1.361-1.363,1.361h-65.352c-0.752,0-1.361-0.609-1.361-1.361v-26.776
+		C517.541,532.519,518.15,531.909,518.902,531.909z"/>
+	<g enable-background="new    ">
+		<path d="M536.998,544.127c0-0.863,0.232-1.538,0.695-2.026s1.063-0.732,1.795-0.732c0.48,0,0.912,0.114,1.297,0.344
+			c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.396c0,0.527-0.107,0.999-0.32,1.415s-0.514,0.73-0.904,0.944
+			c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.354c-0.385-0.236-0.676-0.56-0.875-0.968
+			C537.098,545.016,536.998,544.583,536.998,544.127z M537.709,544.138c0,0.626,0.168,1.119,0.504,1.479
+			c0.338,0.361,0.76,0.541,1.268,0.541c0.518,0,0.943-0.182,1.279-0.546c0.334-0.364,0.502-0.881,0.502-1.55
+			c0-0.423-0.072-0.792-0.215-1.107c-0.145-0.315-0.354-0.561-0.629-0.734s-0.584-0.261-0.926-0.261
+			c-0.488,0-0.906,0.168-1.258,0.502C537.883,542.797,537.709,543.354,537.709,544.138z"/>
+		<path d="M543.363,546.658h-0.592v-5.198h0.639v1.854c0.27-0.338,0.613-0.507,1.031-0.507c0.232,0,0.451,0.047,0.658,0.14
+			c0.207,0.094,0.377,0.225,0.51,0.394c0.135,0.17,0.238,0.373,0.314,0.612c0.076,0.238,0.113,0.494,0.113,0.766
+			c0,0.646-0.16,1.145-0.479,1.496c-0.32,0.353-0.703,0.528-1.148,0.528s-0.793-0.186-1.047-0.557V546.658z M543.357,544.747
+			c0,0.451,0.061,0.777,0.184,0.979c0.201,0.329,0.473,0.493,0.814,0.493c0.279,0,0.521-0.121,0.725-0.363s0.305-0.604,0.305-1.084
+			c0-0.491-0.098-0.854-0.293-1.088c-0.195-0.234-0.43-0.352-0.707-0.352c-0.279,0-0.52,0.121-0.723,0.364
+			C543.459,543.938,543.357,544.289,543.357,544.747z"/>
+		<path d="M546.559,545.534l0.631-0.1c0.035,0.253,0.133,0.447,0.295,0.582s0.389,0.202,0.68,0.202c0.293,0,0.51-0.06,0.652-0.18
+			c0.143-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34c-0.088-0.057-0.305-0.129-0.652-0.217
+			c-0.469-0.118-0.793-0.22-0.975-0.307c-0.18-0.086-0.316-0.205-0.41-0.358c-0.094-0.152-0.141-0.32-0.141-0.505
+			c0-0.168,0.039-0.323,0.115-0.466c0.076-0.144,0.182-0.262,0.314-0.356c0.1-0.073,0.234-0.136,0.406-0.187
+			c0.17-0.051,0.354-0.076,0.551-0.076c0.295,0,0.555,0.043,0.777,0.128c0.225,0.085,0.389,0.2,0.496,0.346
+			c0.105,0.146,0.18,0.34,0.219,0.583l-0.623,0.085c-0.029-0.193-0.111-0.345-0.248-0.454c-0.135-0.108-0.326-0.163-0.576-0.163
+			c-0.293,0-0.502,0.049-0.627,0.146c-0.125,0.098-0.188,0.211-0.188,0.341c0,0.083,0.025,0.157,0.078,0.224
+			c0.051,0.068,0.133,0.125,0.244,0.17c0.064,0.023,0.252,0.078,0.564,0.163c0.451,0.12,0.766,0.219,0.945,0.296
+			c0.178,0.077,0.318,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.188,0.602
+			c-0.123,0.188-0.303,0.333-0.537,0.436c-0.232,0.103-0.498,0.154-0.793,0.154c-0.49,0-0.863-0.102-1.119-0.305
+			S546.629,545.934,546.559,545.534z"/>
+		<path d="M553.021,545.445l0.66,0.082c-0.105,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.988-0.17-1.311-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.164-1.125,0.49-1.476c0.326-0.35,0.75-0.524,1.27-0.524
+			c0.504,0,0.914,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446c0,0.038-0.002,0.095-0.004,0.17h-2.809
+			c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+			C552.793,545.911,552.924,545.715,553.021,545.445z M550.926,544.414h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.738,0.295S550.947,544.085,550.926,544.414z"/>
+		<path d="M554.475,546.658v-3.766h0.574v0.571c0.146-0.268,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.264,0.042-0.375,0.126
+			s-0.189,0.2-0.238,0.35c-0.07,0.227-0.105,0.475-0.105,0.744v1.972H554.475z"/>
+		<path d="M557.945,546.658l-1.432-3.766h0.674l0.809,2.255c0.088,0.244,0.168,0.497,0.24,0.759
+			c0.057-0.198,0.137-0.437,0.238-0.716l0.836-2.298h0.656l-1.426,3.766H557.945z"/>
+		<path d="M563.109,545.445l0.658,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.986-0.17-1.309-0.509c-0.324-0.339-0.484-0.814-0.484-1.427c0-0.634,0.162-1.125,0.488-1.476
+			c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.916,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+			c0,0.038,0,0.095-0.004,0.17h-2.807c0.023,0.414,0.141,0.73,0.35,0.95c0.211,0.22,0.473,0.33,0.787,0.33
+			c0.234,0,0.434-0.062,0.6-0.185S563.012,545.715,563.109,545.445z M561.014,544.414h2.102c-0.027-0.317-0.107-0.555-0.24-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.74,0.295C561.145,543.823,561.035,544.085,561.014,544.414z"/>
+		<path d="M564.563,546.658v-3.766h0.574v0.571c0.146-0.268,0.281-0.443,0.406-0.528c0.123-0.085,0.26-0.128,0.408-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.219,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.266,0.042-0.375,0.126
+			c-0.111,0.084-0.191,0.2-0.238,0.35c-0.07,0.227-0.107,0.475-0.107,0.744v1.972H564.563z"/>
+	</g>
+</g>
+<g>
+	<path fill="#EAEAEA" stroke="#666666" d="M416.334,531.909h77.152c0.752,0,1.363,0.609,1.363,1.361v26.776
+		c0,0.752-0.611,1.361-1.363,1.361h-77.152c-0.752,0-1.361-0.609-1.361-1.361v-26.776
+		C414.973,532.519,415.582,531.909,416.334,531.909z"/>
+	<g enable-background="new    ">
+		<path d="M419.232,546.658v-5.198h2.303c0.465,0,0.816,0.047,1.057,0.141c0.242,0.093,0.436,0.258,0.578,0.494
+			c0.145,0.236,0.217,0.498,0.217,0.784c0,0.368-0.119,0.68-0.357,0.933s-0.607,0.413-1.107,0.481
+			c0.184,0.088,0.32,0.174,0.416,0.259c0.201,0.185,0.391,0.415,0.57,0.691l0.904,1.415h-0.865l-0.688-1.081
+			c-0.201-0.313-0.367-0.551-0.496-0.717c-0.131-0.165-0.246-0.281-0.35-0.348c-0.104-0.065-0.207-0.112-0.314-0.138
+			c-0.078-0.017-0.205-0.025-0.383-0.025h-0.797v2.309H419.232z M419.92,543.754h1.479c0.314,0,0.561-0.032,0.736-0.097
+			c0.178-0.065,0.313-0.169,0.404-0.313c0.092-0.143,0.139-0.298,0.139-0.466c0-0.246-0.09-0.448-0.268-0.606
+			s-0.461-0.237-0.846-0.237h-1.645V543.754z"/>
+		<path d="M423.957,546.658l1.377-1.957l-1.273-1.809h0.799l0.576,0.883c0.109,0.168,0.197,0.309,0.264,0.422
+			c0.104-0.155,0.199-0.294,0.287-0.414l0.635-0.891h0.762l-1.301,1.773l1.4,1.992h-0.783l-0.773-1.17l-0.205-0.315l-0.99,1.485
+			H423.957z"/>
+		<path d="M430.23,546.658v-5.198h0.688v5.198H430.23z"/>
+		<path d="M431.922,544.127c0-0.863,0.232-1.538,0.695-2.026s1.061-0.732,1.793-0.732c0.48,0,0.912,0.114,1.299,0.344
+			c0.385,0.229,0.678,0.549,0.881,0.959c0.201,0.41,0.303,0.875,0.303,1.396c0,0.527-0.105,0.999-0.318,1.415
+			s-0.516,0.73-0.904,0.944c-0.391,0.214-0.811,0.321-1.262,0.321c-0.49,0-0.928-0.118-1.313-0.354s-0.678-0.56-0.877-0.968
+			C432.021,545.016,431.922,544.583,431.922,544.127z M432.631,544.138c0,0.626,0.168,1.119,0.506,1.479
+			c0.336,0.361,0.758,0.541,1.268,0.541c0.518,0,0.943-0.182,1.277-0.546s0.502-0.881,0.502-1.55c0-0.423-0.072-0.792-0.215-1.107
+			s-0.352-0.561-0.627-0.734s-0.584-0.261-0.928-0.261c-0.486,0-0.906,0.168-1.256,0.502
+			C432.807,542.797,432.631,543.354,432.631,544.138z"/>
+		<path d="M438.287,546.658h-0.592v-5.198h0.637v1.854c0.27-0.338,0.613-0.507,1.033-0.507c0.23,0,0.449,0.047,0.656,0.14
+			c0.207,0.094,0.377,0.225,0.512,0.394c0.133,0.17,0.238,0.373,0.313,0.612c0.076,0.238,0.113,0.494,0.113,0.766
+			c0,0.646-0.158,1.145-0.479,1.496c-0.318,0.353-0.701,0.528-1.148,0.528c-0.443,0-0.793-0.186-1.045-0.557V546.658z
+			 M438.279,544.747c0,0.451,0.061,0.777,0.184,0.979c0.201,0.329,0.473,0.493,0.816,0.493c0.279,0,0.52-0.121,0.723-0.363
+			s0.305-0.604,0.305-1.084c0-0.491-0.098-0.854-0.291-1.088c-0.195-0.234-0.432-0.352-0.709-0.352s-0.52,0.121-0.723,0.364
+			C438.381,543.938,438.279,544.289,438.279,544.747z"/>
+		<path d="M441.48,545.534l0.631-0.1c0.035,0.253,0.135,0.447,0.297,0.582s0.389,0.202,0.678,0.202c0.295,0,0.512-0.06,0.652-0.18
+			c0.143-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34c-0.088-0.057-0.305-0.129-0.652-0.217
+			c-0.467-0.118-0.793-0.22-0.973-0.307c-0.182-0.086-0.318-0.205-0.412-0.358c-0.094-0.152-0.139-0.32-0.139-0.505
+			c0-0.168,0.037-0.323,0.115-0.466c0.076-0.144,0.18-0.262,0.313-0.356c0.1-0.073,0.234-0.136,0.406-0.187s0.355-0.076,0.551-0.076
+			c0.297,0,0.555,0.043,0.779,0.128c0.223,0.085,0.389,0.2,0.494,0.346c0.107,0.146,0.18,0.34,0.221,0.583l-0.625,0.085
+			c-0.027-0.193-0.109-0.345-0.246-0.454c-0.137-0.108-0.328-0.163-0.576-0.163c-0.293,0-0.502,0.049-0.627,0.146
+			c-0.125,0.098-0.189,0.211-0.189,0.341c0,0.083,0.027,0.157,0.078,0.224c0.053,0.068,0.135,0.125,0.246,0.17
+			c0.063,0.023,0.252,0.078,0.563,0.163c0.451,0.12,0.768,0.219,0.945,0.296s0.318,0.188,0.42,0.335s0.152,0.329,0.152,0.546
+			c0,0.213-0.063,0.413-0.186,0.602c-0.125,0.188-0.303,0.333-0.537,0.436s-0.498,0.154-0.795,0.154
+			c-0.488,0-0.861-0.102-1.117-0.305C441.715,546.235,441.551,545.934,441.48,545.534z"/>
+		<path d="M447.945,545.445l0.658,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.986-0.17-1.309-0.509c-0.324-0.339-0.484-0.814-0.484-1.427c0-0.634,0.162-1.125,0.488-1.476
+			c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.916,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+			c0,0.038,0,0.095-0.004,0.17h-2.807c0.023,0.414,0.141,0.73,0.35,0.95c0.211,0.22,0.473,0.33,0.787,0.33
+			c0.234,0,0.434-0.062,0.6-0.185S447.848,545.715,447.945,545.445z M445.85,544.414h2.102c-0.027-0.317-0.107-0.555-0.24-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.74,0.295C445.98,543.823,445.871,544.085,445.85,544.414z"/>
+		<path d="M449.398,546.658v-3.766h0.574v0.571c0.146-0.268,0.281-0.443,0.406-0.528c0.123-0.085,0.26-0.128,0.408-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.219,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.266,0.042-0.375,0.126
+			c-0.111,0.084-0.191,0.2-0.238,0.35c-0.07,0.227-0.107,0.475-0.107,0.744v1.972H449.398z"/>
+		<path d="M452.869,546.658l-1.434-3.766h0.674l0.809,2.255c0.088,0.244,0.168,0.497,0.242,0.759
+			c0.057-0.198,0.135-0.437,0.236-0.716l0.838-2.298h0.656l-1.426,3.766H452.869z"/>
+		<path d="M458.031,545.445l0.66,0.082c-0.105,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.988-0.17-1.311-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.164-1.125,0.49-1.476c0.326-0.35,0.75-0.524,1.27-0.524
+			c0.504,0,0.914,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446c0,0.038-0.002,0.095-0.004,0.17H455.9
+			c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+			C457.803,545.911,457.934,545.715,458.031,545.445z M455.936,544.414h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.738,0.295S455.957,544.085,455.936,544.414z"/>
+		<path d="M459.484,546.658v-3.766h0.574v0.571c0.146-0.268,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.264,0.042-0.375,0.126
+			s-0.189,0.2-0.238,0.35c-0.07,0.227-0.105,0.475-0.105,0.744v1.972H459.484z"/>
+		<path d="M464.916,546.658l-1.379-5.198h0.705l0.791,3.407c0.086,0.357,0.158,0.712,0.221,1.064
+			c0.133-0.556,0.209-0.876,0.234-0.961l0.988-3.511h0.83l0.744,2.631c0.188,0.652,0.322,1.267,0.404,1.841
+			c0.066-0.329,0.152-0.706,0.26-1.131l0.814-3.341h0.691l-1.426,5.198h-0.662l-1.096-3.96c-0.092-0.331-0.146-0.534-0.164-0.61
+			c-0.053,0.239-0.104,0.442-0.152,0.61l-1.102,3.96H464.916z"/>
+		<path d="M470.643,546.658v-3.766h0.574v0.571c0.146-0.268,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.264,0.042-0.375,0.126
+			s-0.189,0.2-0.238,0.35c-0.07,0.227-0.105,0.475-0.105,0.744v1.972H470.643z"/>
+		<path d="M475.525,546.193c-0.236,0.201-0.465,0.343-0.684,0.426s-0.453,0.124-0.703,0.124c-0.414,0-0.732-0.101-0.953-0.303
+			c-0.223-0.202-0.334-0.461-0.334-0.775c0-0.184,0.043-0.353,0.127-0.505c0.082-0.152,0.193-0.274,0.328-0.367
+			c0.137-0.092,0.289-0.162,0.459-0.209c0.127-0.033,0.314-0.065,0.568-0.096c0.516-0.062,0.895-0.135,1.139-0.22
+			c0.002-0.088,0.002-0.144,0.002-0.167c0-0.26-0.059-0.443-0.18-0.549c-0.164-0.145-0.406-0.217-0.727-0.217
+			c-0.301,0-0.521,0.053-0.666,0.158c-0.143,0.104-0.248,0.291-0.316,0.558l-0.625-0.085c0.057-0.267,0.15-0.482,0.281-0.646
+			c0.129-0.165,0.318-0.291,0.563-0.38c0.246-0.089,0.531-0.133,0.855-0.133c0.32,0,0.582,0.038,0.783,0.113
+			c0.201,0.076,0.35,0.171,0.443,0.286c0.094,0.114,0.16,0.259,0.199,0.434c0.021,0.109,0.031,0.306,0.031,0.589v0.851
+			c0,0.594,0.014,0.969,0.041,1.126s0.08,0.308,0.16,0.452h-0.666C475.586,546.525,475.545,546.371,475.525,546.193z
+			 M475.473,544.769c-0.232,0.095-0.58,0.175-1.043,0.241c-0.262,0.037-0.447,0.08-0.557,0.127
+			c-0.109,0.048-0.193,0.117-0.252,0.208s-0.088,0.192-0.088,0.303c0,0.171,0.064,0.313,0.193,0.426s0.316,0.17,0.564,0.17
+			c0.246,0,0.465-0.054,0.656-0.161s0.332-0.255,0.422-0.441c0.068-0.145,0.104-0.356,0.104-0.639V544.769z"/>
+		<path d="M477.105,548.102v-5.209h0.582v0.489c0.137-0.191,0.291-0.335,0.465-0.431c0.172-0.096,0.381-0.144,0.627-0.144
+			c0.322,0,0.605,0.083,0.852,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.188,0.632,0.188,0.991
+			c0,0.386-0.068,0.732-0.207,1.041s-0.34,0.545-0.604,0.709s-0.541,0.246-0.83,0.246c-0.213,0-0.404-0.045-0.574-0.135
+			c-0.168-0.09-0.307-0.203-0.416-0.34v1.833H477.105z M477.684,544.797c0,0.484,0.098,0.843,0.295,1.074
+			c0.195,0.231,0.434,0.348,0.713,0.348c0.283,0,0.525-0.12,0.729-0.36c0.201-0.239,0.303-0.611,0.303-1.115
+			c0-0.479-0.098-0.839-0.297-1.077c-0.197-0.239-0.432-0.358-0.707-0.358c-0.271,0-0.512,0.127-0.721,0.381
+			C477.789,543.943,477.684,544.313,477.684,544.797z"/>
+		<path d="M481.145,548.102v-5.209h0.582v0.489c0.137-0.191,0.291-0.335,0.463-0.431c0.174-0.096,0.383-0.144,0.629-0.144
+			c0.32,0,0.604,0.083,0.85,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.189,0.632,0.189,0.991
+			c0,0.386-0.07,0.732-0.209,1.041c-0.137,0.309-0.338,0.545-0.602,0.709s-0.541,0.246-0.832,0.246
+			c-0.213,0-0.404-0.045-0.572-0.135c-0.17-0.09-0.309-0.203-0.416-0.34v1.833H481.145z M481.723,544.797
+			c0,0.484,0.098,0.843,0.293,1.074c0.197,0.231,0.434,0.348,0.713,0.348c0.285,0,0.527-0.12,0.729-0.36
+			c0.203-0.239,0.305-0.611,0.305-1.115c0-0.479-0.1-0.839-0.297-1.077c-0.197-0.239-0.434-0.358-0.707-0.358
+			c-0.271,0-0.514,0.127-0.723,0.381C481.826,543.943,481.723,544.313,481.723,544.797z"/>
+		<path d="M487.76,545.445l0.66,0.082c-0.105,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.988-0.17-1.311-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.164-1.125,0.49-1.476c0.326-0.35,0.75-0.524,1.27-0.524
+			c0.504,0,0.914,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446c0,0.038-0.002,0.095-0.004,0.17h-2.809
+			c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+			C487.531,545.911,487.662,545.715,487.76,545.445z M485.664,544.414h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.738,0.295S485.686,544.085,485.664,544.414z"/>
+		<path d="M489.213,546.658v-3.766h0.574v0.571c0.146-0.268,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.264,0.042-0.375,0.126
+			s-0.189,0.2-0.238,0.35c-0.07,0.227-0.105,0.475-0.105,0.744v1.972H489.213z"/>
+	</g>
+</g>
+<g>
+	<path fill="#EAEAEA" stroke="#666666" d="M325.567,531.909h65.353c0.752,0,1.361,0.609,1.361,1.361v26.776
+		c0,0.752-0.609,1.361-1.361,1.361h-65.353c-0.752,0-1.362-0.609-1.362-1.361v-26.776
+		C324.205,532.519,324.815,531.909,325.567,531.909z"/>
+	<g enable-background="new    ">
+		<path d="M328.122,544.127c0-0.863,0.231-1.538,0.694-2.026c0.464-0.488,1.063-0.732,1.795-0.732c0.479,0,0.912,0.114,1.297,0.344
+			c0.386,0.229,0.68,0.549,0.882,0.959s0.303,0.875,0.303,1.396c0,0.527-0.106,0.999-0.319,1.415s-0.514,0.73-0.904,0.944
+			c-0.39,0.214-0.811,0.321-1.262,0.321c-0.489,0-0.927-0.118-1.313-0.354c-0.385-0.236-0.677-0.56-0.875-0.968
+			C328.221,545.016,328.122,544.583,328.122,544.127z M328.831,544.138c0,0.626,0.169,1.119,0.505,1.479
+			c0.338,0.361,0.76,0.541,1.268,0.541c0.518,0,0.944-0.182,1.279-0.546c0.334-0.364,0.501-0.881,0.501-1.55
+			c0-0.423-0.071-0.792-0.214-1.107c-0.144-0.315-0.354-0.561-0.629-0.734s-0.584-0.261-0.926-0.261
+			c-0.488,0-0.906,0.168-1.258,0.502C329.007,542.797,328.831,543.354,328.831,544.138z"/>
+		<path d="M334.486,546.658h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.231,0,0.45,0.047,0.657,0.14
+			c0.207,0.094,0.377,0.225,0.511,0.394c0.133,0.17,0.238,0.373,0.313,0.612c0.075,0.238,0.114,0.494,0.114,0.766
+			c0,0.646-0.16,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V546.658z
+			 M334.479,544.747c0,0.451,0.063,0.777,0.186,0.979c0.2,0.329,0.473,0.493,0.814,0.493c0.279,0,0.521-0.121,0.724-0.363
+			s0.306-0.604,0.306-1.084c0-0.491-0.098-0.854-0.293-1.088c-0.195-0.234-0.432-0.352-0.707-0.352
+			c-0.279,0-0.521,0.121-0.724,0.364C334.58,543.938,334.479,544.289,334.479,544.747z"/>
+		<path d="M337.681,545.534l0.632-0.1c0.035,0.253,0.134,0.447,0.295,0.582c0.162,0.135,0.389,0.202,0.68,0.202
+			c0.293,0,0.511-0.06,0.652-0.18c0.142-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34
+			c-0.088-0.057-0.306-0.129-0.652-0.217c-0.469-0.118-0.793-0.22-0.975-0.307c-0.18-0.086-0.317-0.205-0.41-0.358
+			c-0.094-0.152-0.141-0.32-0.141-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.144,0.182-0.262,0.314-0.356
+			c0.099-0.073,0.234-0.136,0.405-0.187s0.355-0.076,0.552-0.076c0.295,0,0.555,0.043,0.777,0.128
+			c0.225,0.085,0.389,0.2,0.495,0.346s0.18,0.34,0.22,0.583l-0.623,0.085c-0.029-0.193-0.111-0.345-0.247-0.454
+			c-0.136-0.108-0.328-0.163-0.576-0.163c-0.293,0-0.503,0.049-0.628,0.146c-0.125,0.098-0.188,0.211-0.188,0.341
+			c0,0.083,0.025,0.157,0.078,0.224c0.052,0.068,0.133,0.125,0.244,0.17c0.064,0.023,0.252,0.078,0.564,0.163
+			c0.451,0.12,0.766,0.219,0.944,0.296s0.319,0.188,0.421,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.187,0.602
+			c-0.124,0.188-0.304,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.794,0.154c-0.49,0-0.863-0.102-1.119-0.305
+			S337.752,545.934,337.681,545.534z"/>
+		<path d="M344.145,545.445l0.66,0.082c-0.105,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.311-0.509c-0.322-0.339-0.483-0.814-0.483-1.427c0-0.634,0.163-1.125,0.489-1.476
+			c0.326-0.35,0.749-0.524,1.27-0.524c0.503,0,0.914,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+			c0,0.038-0.002,0.095-0.004,0.17h-2.809c0.023,0.414,0.141,0.73,0.352,0.95c0.21,0.22,0.473,0.33,0.787,0.33
+			c0.233,0,0.434-0.062,0.599-0.185S344.048,545.715,344.145,545.445z M342.049,544.414h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+			c-0.203-0.246-0.467-0.369-0.79-0.369c-0.294,0-0.54,0.099-0.739,0.295S342.07,544.085,342.049,544.414z"/>
+		<path d="M345.599,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528s0.261-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.265,0.042-0.375,0.126
+			c-0.111,0.084-0.19,0.2-0.238,0.35c-0.07,0.227-0.106,0.475-0.106,0.744v1.972H345.599z"/>
+		<path d="M349.069,546.658l-1.433-3.766h0.674l0.809,2.255c0.088,0.244,0.168,0.497,0.241,0.759
+			c0.057-0.198,0.136-0.437,0.237-0.716l0.837-2.298h0.656l-1.426,3.766H349.069z"/>
+		<path d="M354.111,546.193c-0.236,0.201-0.464,0.343-0.683,0.426s-0.453,0.124-0.703,0.124c-0.414,0-0.732-0.101-0.954-0.303
+			c-0.223-0.202-0.333-0.461-0.333-0.775c0-0.184,0.042-0.353,0.126-0.505c0.083-0.152,0.193-0.274,0.329-0.367
+			c0.136-0.092,0.289-0.162,0.459-0.209c0.126-0.033,0.314-0.065,0.567-0.096c0.516-0.062,0.895-0.135,1.139-0.22
+			c0.002-0.088,0.003-0.144,0.003-0.167c0-0.26-0.06-0.443-0.181-0.549c-0.163-0.145-0.405-0.217-0.727-0.217
+			c-0.3,0-0.521,0.053-0.665,0.158c-0.143,0.104-0.249,0.291-0.317,0.558l-0.624-0.085c0.057-0.267,0.15-0.482,0.28-0.646
+			c0.13-0.165,0.318-0.291,0.563-0.38c0.246-0.089,0.531-0.133,0.854-0.133c0.321,0,0.583,0.038,0.784,0.113
+			c0.2,0.076,0.349,0.171,0.443,0.286c0.094,0.114,0.16,0.259,0.198,0.434c0.021,0.109,0.032,0.306,0.032,0.589v0.851
+			c0,0.594,0.013,0.969,0.04,1.126s0.081,0.308,0.161,0.452h-0.666C354.173,546.525,354.131,546.371,354.111,546.193z
+			 M354.059,544.769c-0.231,0.095-0.579,0.175-1.043,0.241c-0.262,0.037-0.447,0.08-0.557,0.127
+			c-0.108,0.048-0.192,0.117-0.251,0.208c-0.06,0.091-0.089,0.192-0.089,0.303c0,0.171,0.064,0.313,0.193,0.426
+			s0.317,0.17,0.565,0.17c0.245,0,0.464-0.054,0.655-0.161s0.332-0.255,0.422-0.441c0.069-0.145,0.104-0.356,0.104-0.639V544.769z"
+			/>
+		<path d="M356.281,546.658h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.231,0,0.45,0.047,0.657,0.14
+			c0.207,0.094,0.377,0.225,0.511,0.394c0.134,0.17,0.238,0.373,0.313,0.612c0.076,0.238,0.113,0.494,0.113,0.766
+			c0,0.646-0.159,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V546.658z
+			 M356.274,544.747c0,0.451,0.061,0.777,0.184,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.521-0.121,0.724-0.363
+			s0.305-0.604,0.305-1.084c0-0.491-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.352-0.708-0.352c-0.278,0-0.52,0.121-0.723,0.364
+			C356.376,543.938,356.274,544.289,356.274,544.747z"/>
+		<path d="M359.717,546.658v-5.198h0.638v5.198H359.717z"/>
+		<path d="M363.922,545.445l0.659,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509c-0.323-0.339-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476
+			c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.915,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+			c0,0.038-0.001,0.095-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+			C363.693,545.911,363.824,545.715,363.922,545.445z M361.826,544.414h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.739,0.295C361.958,543.823,361.848,544.085,361.826,544.414z"/>
+		<path d="M365.563,546.658v-0.727h0.728v0.727H365.563z"/>
+		<path d="M371.189,544.836l0.688,0.174c-0.145,0.564-0.404,0.995-0.778,1.292c-0.375,0.297-0.833,0.445-1.374,0.445
+			c-0.561,0-1.016-0.114-1.367-0.343c-0.351-0.228-0.618-0.558-0.801-0.99c-0.184-0.433-0.275-0.897-0.275-1.394
+			c0-0.541,0.104-1.014,0.311-1.417c0.207-0.402,0.501-0.709,0.883-0.918s0.802-0.313,1.261-0.313c0.52,0,0.957,0.132,1.312,0.396
+			s0.602,0.638,0.741,1.117l-0.678,0.159c-0.12-0.378-0.295-0.653-0.524-0.826c-0.229-0.172-0.518-0.259-0.865-0.259
+			c-0.399,0-0.733,0.096-1.001,0.287c-0.269,0.191-0.457,0.449-0.566,0.771c-0.108,0.322-0.163,0.655-0.163,0.998
+			c0,0.442,0.064,0.828,0.193,1.158c0.129,0.329,0.329,0.576,0.602,0.739c0.271,0.163,0.565,0.244,0.883,0.244
+			c0.385,0,0.711-0.111,0.979-0.333C370.914,545.603,371.096,545.273,371.189,544.836z"/>
+		<path d="M372.637,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528s0.261-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.265,0.042-0.375,0.126
+			c-0.111,0.084-0.19,0.2-0.238,0.35c-0.07,0.227-0.106,0.475-0.106,0.744v1.972H372.637z"/>
+		<path d="M377.64,545.445l0.659,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509c-0.323-0.339-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476
+			c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.915,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+			c0,0.038-0.001,0.095-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+			C377.411,545.911,377.542,545.715,377.64,545.445z M375.544,544.414h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.739,0.295C375.676,543.823,375.565,544.085,375.544,544.414z"/>
+		<path d="M381.557,546.193c-0.236,0.201-0.464,0.343-0.683,0.426s-0.453,0.124-0.703,0.124c-0.414,0-0.732-0.101-0.954-0.303
+			c-0.223-0.202-0.333-0.461-0.333-0.775c0-0.184,0.042-0.353,0.126-0.505c0.083-0.152,0.193-0.274,0.329-0.367
+			c0.136-0.092,0.289-0.162,0.459-0.209c0.126-0.033,0.314-0.065,0.567-0.096c0.516-0.062,0.895-0.135,1.139-0.22
+			c0.002-0.088,0.003-0.144,0.003-0.167c0-0.26-0.06-0.443-0.181-0.549c-0.163-0.145-0.405-0.217-0.727-0.217
+			c-0.3,0-0.521,0.053-0.665,0.158c-0.143,0.104-0.249,0.291-0.317,0.558l-0.624-0.085c0.057-0.267,0.15-0.482,0.28-0.646
+			c0.13-0.165,0.318-0.291,0.563-0.38c0.246-0.089,0.531-0.133,0.854-0.133c0.321,0,0.583,0.038,0.784,0.113
+			c0.2,0.076,0.349,0.171,0.443,0.286c0.094,0.114,0.16,0.259,0.198,0.434c0.021,0.109,0.032,0.306,0.032,0.589v0.851
+			c0,0.594,0.013,0.969,0.04,1.126s0.081,0.308,0.161,0.452h-0.666C381.618,546.525,381.576,546.371,381.557,546.193z
+			 M381.504,544.769c-0.231,0.095-0.579,0.175-1.043,0.241c-0.262,0.037-0.447,0.08-0.557,0.127
+			c-0.108,0.048-0.192,0.117-0.251,0.208c-0.06,0.091-0.089,0.192-0.089,0.303c0,0.171,0.064,0.313,0.193,0.426
+			s0.317,0.17,0.565,0.17c0.245,0,0.464-0.054,0.655-0.161s0.332-0.255,0.422-0.441c0.069-0.145,0.104-0.356,0.104-0.639V544.769z"
+			/>
+		<path d="M384.531,546.087l0.092,0.564c-0.18,0.037-0.34,0.057-0.481,0.057c-0.232,0-0.412-0.037-0.539-0.11
+			c-0.128-0.073-0.218-0.169-0.27-0.289c-0.052-0.119-0.078-0.37-0.078-0.753v-2.167h-0.468v-0.496h0.468v-0.933l0.635-0.383v1.315
+			h0.642v0.496h-0.642v2.202c0,0.183,0.011,0.299,0.033,0.352c0.022,0.052,0.06,0.093,0.11,0.124
+			c0.051,0.03,0.123,0.046,0.218,0.046C384.322,546.112,384.415,546.104,384.531,546.087z"/>
+		<path d="M387.733,545.445l0.659,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509c-0.323-0.339-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476
+			c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.915,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+			c0,0.038-0.001,0.095-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+			C387.505,545.911,387.636,545.715,387.733,545.445z M385.638,544.414h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+			c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.739,0.295C385.77,543.823,385.659,544.085,385.638,544.414z"/>
+	</g>
+</g>
+<g>
+	<path fill="#EAEAEA" stroke="#666666" d="M234.8,531.909h65.353c0.752,0,1.362,0.609,1.362,1.361v26.776
+		c0,0.752-0.61,1.361-1.362,1.361H234.8c-0.752,0-1.361-0.609-1.361-1.361v-26.776C233.438,532.519,234.048,531.909,234.8,531.909z"
+		/>
+	<g enable-background="new    ">
+		<path d="M251.453,544.988l0.649-0.057c0.031,0.26,0.102,0.474,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+			s0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.32
+			c0.098-0.137,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.428c-0.095-0.121-0.25-0.224-0.468-0.307
+			c-0.139-0.054-0.448-0.139-0.925-0.253c-0.478-0.115-0.812-0.223-1.003-0.324c-0.248-0.13-0.433-0.292-0.555-0.484
+			c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.507,0.223-0.735c0.149-0.228,0.366-0.401,0.652-0.52
+			s0.604-0.177,0.954-0.177c0.385,0,0.725,0.062,1.019,0.186c0.294,0.124,0.521,0.307,0.679,0.548
+			c0.158,0.241,0.243,0.515,0.255,0.819l-0.66,0.05c-0.036-0.329-0.155-0.577-0.36-0.745s-0.506-0.252-0.906-0.252
+			c-0.416,0-0.719,0.077-0.91,0.229s-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+			c0.559,0.126,0.943,0.236,1.151,0.331c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.781
+			c-0.159,0.245-0.386,0.436-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.068-1.182-0.206
+			c-0.318-0.137-0.567-0.343-0.748-0.618C251.558,545.647,251.462,545.336,251.453,544.988z"/>
+		<path d="M258.906,545.279l0.628,0.081c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+			c-0.515,0-0.93-0.168-1.243-0.505s-0.47-0.819-0.47-1.448c0-0.407,0.067-0.763,0.202-1.067s0.34-0.534,0.615-0.687
+			s0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.311c0.26,0.207,0.427,0.5,0.5,0.881l-0.62,0.096
+			c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191c-0.321,0-0.583,0.115-0.784,0.346
+			c-0.201,0.23-0.301,0.596-0.301,1.094c0,0.506,0.097,0.874,0.291,1.104c0.194,0.229,0.447,0.344,0.759,0.344
+			c0.25,0,0.459-0.077,0.627-0.23C258.755,545.834,258.861,545.598,258.906,545.279z"/>
+		<path d="M260.08,546.658v-5.198h0.638v1.865c0.298-0.345,0.674-0.518,1.127-0.518c0.279,0,0.521,0.055,0.727,0.165
+			c0.206,0.109,0.353,0.262,0.441,0.455c0.089,0.194,0.133,0.476,0.133,0.845v2.386h-0.638v-2.386c0-0.319-0.069-0.552-0.207-0.697
+			c-0.139-0.146-0.334-0.218-0.587-0.218c-0.189,0-0.367,0.049-0.534,0.146c-0.167,0.099-0.286,0.231-0.356,0.399
+			s-0.106,0.399-0.106,0.695v2.06H260.08z"/>
+		<path d="M266.696,545.445l0.66,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476c0.326-0.35,0.749-0.524,1.269-0.524
+			c0.503,0,0.915,0.172,1.234,0.515c0.319,0.342,0.479,0.824,0.479,1.446c0,0.038-0.001,0.095-0.004,0.17h-2.808
+			c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185S266.599,545.715,266.696,545.445z
+			 M264.601,544.414h2.103c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369
+			c-0.293,0-0.54,0.099-0.739,0.295S264.622,544.085,264.601,544.414z"/>
+		<path d="M270.6,546.658v-0.476c-0.239,0.374-0.589,0.561-1.053,0.561c-0.3,0-0.576-0.083-0.828-0.248
+			c-0.251-0.165-0.447-0.396-0.585-0.693s-0.208-0.638-0.208-1.022c0-0.376,0.063-0.717,0.188-1.023
+			c0.125-0.306,0.313-0.54,0.564-0.703s0.53-0.245,0.84-0.245c0.227,0,0.429,0.048,0.606,0.144s0.322,0.221,0.433,0.374v-1.865
+			h0.635v5.198H270.6z M268.583,544.779c0,0.482,0.102,0.843,0.305,1.081c0.203,0.239,0.443,0.358,0.72,0.358
+			c0.279,0,0.516-0.114,0.711-0.343c0.195-0.228,0.292-0.576,0.292-1.044c0-0.515-0.099-0.894-0.298-1.135
+			c-0.198-0.241-0.443-0.361-0.734-0.361c-0.284,0-0.521,0.116-0.711,0.348S268.583,544.28,268.583,544.779z"/>
+		<path d="M274.663,546.658v-0.553c-0.293,0.425-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.128
+			c-0.193-0.085-0.336-0.191-0.429-0.32s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.323-0.039-0.596v-2.333h0.638v2.089
+			c0,0.333,0.013,0.558,0.039,0.674c0.04,0.167,0.125,0.299,0.255,0.395s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.146
+			c0.168-0.099,0.287-0.231,0.356-0.401c0.07-0.169,0.104-0.414,0.104-0.735v-2.018h0.638v3.766H274.663z"/>
+		<path d="M276.22,546.658v-5.198h0.638v5.198H276.22z"/>
+		<path d="M280.425,545.445l0.66,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476c0.326-0.35,0.749-0.524,1.269-0.524
+			c0.503,0,0.915,0.172,1.234,0.515c0.319,0.342,0.479,0.824,0.479,1.446c0,0.038-0.001,0.095-0.004,0.17h-2.808
+			c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185S280.328,545.715,280.425,545.445z
+			 M278.33,544.414h2.103c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369
+			c-0.293,0-0.54,0.099-0.739,0.295S278.351,544.085,278.33,544.414z"/>
+		<path d="M281.879,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.139-0.468-0.139c-0.14,0-0.265,0.042-0.376,0.126
+			c-0.111,0.084-0.19,0.2-0.237,0.35c-0.071,0.227-0.106,0.475-0.106,0.744v1.972H281.879z"/>
+	</g>
+</g>
+<g>
+	<path fill="#EAEAEA" stroke="#666666" d="M125.425,531.909h83.96c0.752,0,1.362,0.609,1.362,1.361v26.776
+		c0,0.752-0.61,1.361-1.362,1.361h-83.96c-0.752,0-1.361-0.609-1.361-1.361v-26.776
+		C124.063,532.519,124.673,531.909,125.425,531.909z"/>
+	<g enable-background="new    ">
+		<path d="M128.089,546.658v-5.198h2.305c0.463,0,0.815,0.047,1.057,0.141c0.241,0.093,0.434,0.258,0.578,0.494
+			c0.144,0.236,0.216,0.498,0.216,0.784c0,0.368-0.119,0.68-0.358,0.933s-0.607,0.413-1.106,0.481
+			c0.182,0.088,0.32,0.174,0.415,0.259c0.201,0.185,0.391,0.415,0.571,0.691l0.904,1.415h-0.865l-0.688-1.081
+			c-0.201-0.313-0.366-0.551-0.496-0.717c-0.13-0.165-0.247-0.281-0.35-0.348c-0.103-0.065-0.207-0.112-0.313-0.138
+			c-0.078-0.017-0.206-0.025-0.383-0.025h-0.798v2.309H128.089z M128.777,543.754h1.479c0.314,0,0.56-0.032,0.737-0.097
+			c0.177-0.065,0.312-0.169,0.404-0.313c0.092-0.143,0.138-0.298,0.138-0.466c0-0.246-0.089-0.448-0.268-0.606
+			c-0.179-0.158-0.46-0.237-0.846-0.237h-1.645V543.754z"/>
+		<path d="M132.816,546.658l1.375-1.957l-1.272-1.809h0.797l0.578,0.883c0.109,0.168,0.196,0.309,0.262,0.422
+			c0.104-0.155,0.2-0.294,0.287-0.414l0.635-0.891h0.762l-1.301,1.773l1.401,1.992h-0.784l-0.773-1.17l-0.206-0.315l-0.989,1.485
+			H132.816z"/>
+		<path d="M139.088,546.658v-5.198h0.688v5.198H139.088z"/>
+		<path d="M140.78,544.127c0-0.863,0.231-1.538,0.695-2.026s1.062-0.732,1.794-0.732c0.48,0,0.913,0.114,1.298,0.344
+			s0.679,0.549,0.881,0.959c0.202,0.41,0.303,0.875,0.303,1.396c0,0.527-0.106,0.999-0.319,1.415s-0.514,0.73-0.904,0.944
+			s-0.811,0.321-1.262,0.321c-0.489,0-0.927-0.118-1.312-0.354s-0.677-0.56-0.875-0.968
+			C140.879,545.016,140.78,544.583,140.78,544.127z M141.489,544.138c0,0.626,0.168,1.119,0.505,1.479
+			c0.337,0.361,0.759,0.541,1.268,0.541c0.518,0,0.944-0.182,1.278-0.546s0.501-0.881,0.501-1.55c0-0.423-0.071-0.792-0.214-1.107
+			s-0.353-0.561-0.628-0.734s-0.584-0.261-0.927-0.261c-0.487,0-0.906,0.168-1.257,0.502
+			C141.665,542.797,141.489,543.354,141.489,544.138z"/>
+		<path d="M147.144,546.658h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+			c0.207,0.094,0.377,0.225,0.511,0.394c0.133,0.17,0.238,0.373,0.313,0.612c0.076,0.238,0.114,0.494,0.114,0.766
+			c0,0.646-0.16,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V546.658z
+			 M147.137,544.747c0,0.451,0.062,0.777,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.363
+			s0.305-0.604,0.305-1.084c0-0.491-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.352-0.708-0.352c-0.279,0-0.52,0.121-0.723,0.364
+			C147.238,543.938,147.137,544.289,147.137,544.747z"/>
+		<path d="M150.338,545.534l0.631-0.1c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+			c0.293,0,0.511-0.06,0.652-0.18c0.142-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34
+			c-0.087-0.057-0.305-0.129-0.652-0.217c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.205-0.411-0.358
+			c-0.093-0.152-0.14-0.32-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.144,0.182-0.262,0.314-0.356
+			c0.099-0.073,0.234-0.136,0.406-0.187s0.355-0.076,0.552-0.076c0.295,0,0.555,0.043,0.778,0.128
+			c0.224,0.085,0.389,0.2,0.495,0.346c0.106,0.146,0.18,0.34,0.22,0.583l-0.624,0.085c-0.029-0.193-0.111-0.345-0.247-0.454
+			c-0.136-0.108-0.328-0.163-0.576-0.163c-0.293,0-0.502,0.049-0.627,0.146c-0.125,0.098-0.188,0.211-0.188,0.341
+			c0,0.083,0.026,0.157,0.078,0.224c0.052,0.068,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163
+			c0.452,0.12,0.767,0.219,0.945,0.296c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546
+			c0,0.213-0.062,0.413-0.186,0.602c-0.124,0.188-0.303,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.794,0.154
+			c-0.489,0-0.862-0.102-1.119-0.305S150.41,545.934,150.338,545.534z"/>
+		<path d="M156.802,545.445l0.66,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476c0.326-0.35,0.749-0.524,1.269-0.524
+			c0.503,0,0.915,0.172,1.234,0.515c0.319,0.342,0.479,0.824,0.479,1.446c0,0.038-0.001,0.095-0.004,0.17h-2.808
+			c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185S156.706,545.715,156.802,545.445z
+			 M154.707,544.414h2.103c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369
+			c-0.293,0-0.54,0.099-0.739,0.295S154.728,544.085,154.707,544.414z"/>
+		<path d="M158.256,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.139-0.468-0.139c-0.14,0-0.265,0.042-0.376,0.126
+			c-0.111,0.084-0.19,0.2-0.237,0.35c-0.071,0.227-0.106,0.475-0.106,0.744v1.972H158.256z"/>
+		<path d="M161.727,546.658l-1.432-3.766h0.673l0.809,2.255c0.087,0.244,0.168,0.497,0.241,0.759
+			c0.057-0.198,0.136-0.437,0.237-0.716l0.837-2.298h0.656l-1.425,3.766H161.727z"/>
+		<path d="M166.769,546.193c-0.236,0.201-0.464,0.343-0.682,0.426c-0.219,0.083-0.454,0.124-0.704,0.124
+			c-0.414,0-0.731-0.101-0.954-0.303s-0.333-0.461-0.333-0.775c0-0.184,0.042-0.353,0.126-0.505s0.194-0.274,0.33-0.367
+			c0.136-0.092,0.289-0.162,0.459-0.209c0.125-0.033,0.314-0.065,0.567-0.096c0.515-0.062,0.895-0.135,1.138-0.22
+			c0.002-0.088,0.003-0.144,0.003-0.167c0-0.26-0.061-0.443-0.181-0.549c-0.163-0.145-0.405-0.217-0.727-0.217
+			c-0.3,0-0.522,0.053-0.665,0.158c-0.143,0.104-0.249,0.291-0.317,0.558l-0.624-0.085c0.057-0.267,0.15-0.482,0.28-0.646
+			c0.13-0.165,0.318-0.291,0.564-0.38c0.246-0.089,0.53-0.133,0.854-0.133c0.321,0,0.583,0.038,0.783,0.113
+			c0.201,0.076,0.349,0.171,0.443,0.286c0.095,0.114,0.161,0.259,0.199,0.434c0.021,0.109,0.032,0.306,0.032,0.589v0.851
+			c0,0.594,0.014,0.969,0.041,1.126c0.027,0.157,0.081,0.308,0.161,0.452h-0.667C166.831,546.525,166.788,546.371,166.769,546.193z
+			 M166.716,544.769c-0.232,0.095-0.58,0.175-1.042,0.241c-0.263,0.037-0.448,0.08-0.557,0.127
+			c-0.109,0.048-0.193,0.117-0.252,0.208s-0.088,0.192-0.088,0.303c0,0.171,0.064,0.313,0.193,0.426s0.317,0.17,0.565,0.17
+			c0.246,0,0.465-0.054,0.656-0.161s0.332-0.255,0.422-0.441c0.068-0.145,0.103-0.356,0.103-0.639V544.769z"/>
+		<path d="M168.939,546.658h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+			c0.207,0.094,0.377,0.225,0.511,0.394c0.133,0.17,0.238,0.373,0.313,0.612c0.076,0.238,0.114,0.494,0.114,0.766
+			c0,0.646-0.16,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V546.658z
+			 M168.932,544.747c0,0.451,0.062,0.777,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.363
+			s0.305-0.604,0.305-1.084c0-0.491-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.352-0.708-0.352c-0.279,0-0.52,0.121-0.723,0.364
+			C169.034,543.938,168.932,544.289,168.932,544.747z"/>
+		<path d="M172.375,546.658v-5.198h0.638v5.198H172.375z"/>
+		<path d="M176.58,545.445l0.66,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476c0.326-0.35,0.749-0.524,1.269-0.524
+			c0.503,0,0.915,0.172,1.234,0.515c0.319,0.342,0.479,0.824,0.479,1.446c0,0.038-0.001,0.095-0.004,0.17h-2.808
+			c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185S176.483,545.715,176.58,545.445z
+			 M174.485,544.414h2.103c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369
+			c-0.293,0-0.54,0.099-0.739,0.295S174.506,544.085,174.485,544.414z"/>
+		<path d="M181.048,546.658l-1.379-5.198h0.706l0.791,3.407c0.085,0.357,0.158,0.712,0.22,1.064c0.132-0.556,0.21-0.876,0.234-0.961
+			l0.989-3.511h0.83l0.745,2.631c0.187,0.652,0.322,1.267,0.404,1.841c0.066-0.329,0.152-0.706,0.259-1.131l0.815-3.341h0.691
+			l-1.425,5.198h-0.663l-1.095-3.96c-0.092-0.331-0.147-0.534-0.163-0.61c-0.055,0.239-0.105,0.442-0.153,0.61l-1.103,3.96H181.048z
+			"/>
+		<path d="M186.774,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.139-0.468-0.139c-0.14,0-0.265,0.042-0.376,0.126
+			c-0.111,0.084-0.19,0.2-0.237,0.35c-0.071,0.227-0.106,0.475-0.106,0.744v1.972H186.774z"/>
+		<path d="M191.656,546.193c-0.236,0.201-0.464,0.343-0.682,0.426c-0.219,0.083-0.454,0.124-0.704,0.124
+			c-0.414,0-0.731-0.101-0.954-0.303s-0.333-0.461-0.333-0.775c0-0.184,0.042-0.353,0.126-0.505s0.194-0.274,0.33-0.367
+			c0.136-0.092,0.289-0.162,0.459-0.209c0.125-0.033,0.314-0.065,0.567-0.096c0.515-0.062,0.895-0.135,1.138-0.22
+			c0.002-0.088,0.003-0.144,0.003-0.167c0-0.26-0.061-0.443-0.181-0.549c-0.163-0.145-0.405-0.217-0.727-0.217
+			c-0.3,0-0.522,0.053-0.665,0.158c-0.143,0.104-0.249,0.291-0.317,0.558l-0.624-0.085c0.057-0.267,0.15-0.482,0.28-0.646
+			c0.13-0.165,0.318-0.291,0.564-0.38c0.246-0.089,0.53-0.133,0.854-0.133c0.321,0,0.583,0.038,0.783,0.113
+			c0.201,0.076,0.349,0.171,0.443,0.286c0.095,0.114,0.161,0.259,0.199,0.434c0.021,0.109,0.032,0.306,0.032,0.589v0.851
+			c0,0.594,0.014,0.969,0.041,1.126c0.027,0.157,0.081,0.308,0.161,0.452h-0.667C191.717,546.525,191.675,546.371,191.656,546.193z
+			 M191.603,544.769c-0.232,0.095-0.58,0.175-1.042,0.241c-0.263,0.037-0.448,0.08-0.557,0.127
+			c-0.109,0.048-0.193,0.117-0.252,0.208s-0.088,0.192-0.088,0.303c0,0.171,0.064,0.313,0.193,0.426s0.317,0.17,0.565,0.17
+			c0.246,0,0.465-0.054,0.656-0.161s0.332-0.255,0.422-0.441c0.068-0.145,0.103-0.356,0.103-0.639V544.769z"/>
+		<path d="M193.237,548.102v-5.209h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+			c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.188,0.632,0.188,0.991
+			c0,0.386-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709s-0.541,0.246-0.832,0.246
+			c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H193.237z M193.815,544.797
+			c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+			c0.202-0.239,0.303-0.611,0.303-1.115c0-0.479-0.099-0.839-0.296-1.077c-0.197-0.239-0.433-0.358-0.708-0.358
+			c-0.272,0-0.512,0.127-0.721,0.381C193.92,543.943,193.815,544.313,193.815,544.797z"/>
+		<path d="M197.276,548.102v-5.209h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+			c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.188,0.632,0.188,0.991
+			c0,0.386-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709s-0.541,0.246-0.832,0.246
+			c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H197.276z M197.854,544.797
+			c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+			c0.202-0.239,0.303-0.611,0.303-1.115c0-0.479-0.099-0.839-0.296-1.077c-0.197-0.239-0.433-0.358-0.708-0.358
+			c-0.272,0-0.512,0.127-0.721,0.381C197.958,543.943,197.854,544.313,197.854,544.797z"/>
+		<path d="M203.892,545.445l0.66,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476c0.326-0.35,0.749-0.524,1.269-0.524
+			c0.503,0,0.915,0.172,1.234,0.515c0.319,0.342,0.479,0.824,0.479,1.446c0,0.038-0.001,0.095-0.004,0.17h-2.808
+			c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185S203.795,545.715,203.892,545.445z
+			 M201.797,544.414h2.103c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369
+			c-0.293,0-0.54,0.099-0.739,0.295S201.818,544.085,201.797,544.414z"/>
+		<path d="M205.346,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.139-0.468-0.139c-0.14,0-0.265,0.042-0.376,0.126
+			c-0.111,0.084-0.19,0.2-0.237,0.35c-0.071,0.227-0.106,0.475-0.106,0.744v1.972H205.346z"/>
+	</g>
+</g>
+<g>
+	<path fill="#EAEAEA" stroke="#666666" d="M20.361,531.909h65.353c0.751,0,1.361,0.609,1.361,1.361v26.776
+		c0,0.752-0.61,1.361-1.361,1.361H20.361c-0.752,0-1.361-0.609-1.361-1.361v-26.776C19,532.519,19.609,531.909,20.361,531.909z"/>
+	<g enable-background="new    ">
+		<path d="M36.01,544.988l0.649-0.057c0.031,0.26,0.102,0.474,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+			s0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.32
+			c0.098-0.137,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.428c-0.095-0.121-0.25-0.224-0.468-0.307
+			c-0.139-0.054-0.448-0.139-0.925-0.253c-0.478-0.115-0.812-0.223-1.003-0.324c-0.248-0.13-0.433-0.292-0.555-0.484
+			c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.507,0.223-0.735c0.149-0.228,0.366-0.401,0.652-0.52
+			s0.604-0.177,0.954-0.177c0.385,0,0.725,0.062,1.019,0.186c0.294,0.124,0.521,0.307,0.679,0.548
+			c0.158,0.241,0.243,0.515,0.255,0.819l-0.66,0.05c-0.036-0.329-0.155-0.577-0.36-0.745s-0.506-0.252-0.906-0.252
+			c-0.416,0-0.719,0.077-0.91,0.229s-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+			c0.559,0.126,0.943,0.236,1.151,0.331c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.781
+			c-0.159,0.245-0.386,0.436-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.068-1.182-0.206
+			c-0.318-0.137-0.567-0.343-0.748-0.618C36.114,545.647,36.019,545.336,36.01,544.988z"/>
+		<path d="M43.473,546.658v-0.553c-0.293,0.425-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.128
+			c-0.193-0.085-0.336-0.191-0.429-0.32s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.323-0.039-0.596v-2.333h0.638v2.089
+			c0,0.333,0.013,0.558,0.039,0.674c0.04,0.167,0.125,0.299,0.255,0.395s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.146
+			c0.168-0.099,0.287-0.231,0.356-0.401c0.07-0.169,0.104-0.414,0.104-0.735v-2.018h0.638v3.766H43.473z"/>
+		<path d="M45.633,546.658h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+			c0.207,0.094,0.377,0.225,0.511,0.394c0.133,0.17,0.238,0.373,0.313,0.612c0.076,0.238,0.114,0.494,0.114,0.766
+			c0,0.646-0.16,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V546.658z
+			 M45.625,544.747c0,0.451,0.062,0.777,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.363
+			s0.305-0.604,0.305-1.084c0-0.491-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.352-0.708-0.352c-0.279,0-0.52,0.121-0.723,0.364
+			C45.727,543.938,45.625,544.289,45.625,544.747z"/>
+		<path d="M48.827,545.534l0.631-0.1c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+			c0.293,0,0.511-0.06,0.652-0.18c0.142-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34
+			c-0.087-0.057-0.305-0.129-0.652-0.217c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.205-0.411-0.358
+			c-0.093-0.152-0.14-0.32-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.144,0.182-0.262,0.314-0.356
+			c0.099-0.073,0.234-0.136,0.406-0.187s0.355-0.076,0.552-0.076c0.295,0,0.555,0.043,0.778,0.128
+			c0.224,0.085,0.389,0.2,0.495,0.346c0.106,0.146,0.18,0.34,0.22,0.583l-0.624,0.085c-0.029-0.193-0.111-0.345-0.247-0.454
+			c-0.136-0.108-0.328-0.163-0.576-0.163c-0.293,0-0.502,0.049-0.627,0.146c-0.125,0.098-0.188,0.211-0.188,0.341
+			c0,0.083,0.026,0.157,0.078,0.224c0.052,0.068,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163
+			c0.452,0.12,0.767,0.219,0.945,0.296c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546
+			c0,0.213-0.062,0.413-0.186,0.602c-0.124,0.188-0.303,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.794,0.154
+			c-0.489,0-0.862-0.102-1.119-0.305S48.898,545.934,48.827,545.534z"/>
+		<path d="M55.17,545.279l0.628,0.081c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+			c-0.515,0-0.93-0.168-1.243-0.505s-0.47-0.819-0.47-1.448c0-0.407,0.067-0.763,0.202-1.067s0.34-0.534,0.615-0.687
+			s0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.311c0.26,0.207,0.427,0.5,0.5,0.881l-0.62,0.096
+			c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191c-0.321,0-0.583,0.115-0.784,0.346
+			c-0.201,0.23-0.301,0.596-0.301,1.094c0,0.506,0.097,0.874,0.291,1.104c0.194,0.229,0.447,0.344,0.759,0.344
+			c0.25,0,0.459-0.077,0.627-0.23C55.02,545.834,55.125,545.598,55.17,545.279z"/>
+		<path d="M56.337,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.139-0.468-0.139c-0.14,0-0.265,0.042-0.376,0.126
+			c-0.111,0.084-0.19,0.2-0.237,0.35c-0.071,0.227-0.106,0.475-0.106,0.744v1.972H56.337z"/>
+		<path d="M58.766,542.194v-0.734h0.638v0.734H58.766z M58.766,546.658v-3.766h0.638v3.766H58.766z"/>
+		<path d="M60.964,546.658h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+			c0.207,0.094,0.377,0.225,0.511,0.394c0.133,0.17,0.238,0.373,0.313,0.612c0.076,0.238,0.114,0.494,0.114,0.766
+			c0,0.646-0.16,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V546.658z
+			 M60.957,544.747c0,0.451,0.062,0.777,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.363
+			s0.305-0.604,0.305-1.084c0-0.491-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.352-0.708-0.352c-0.279,0-0.52,0.121-0.723,0.364
+			C61.059,543.938,60.957,544.289,60.957,544.747z"/>
+		<path d="M66.992,545.445l0.66,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+			c-0.551,0-0.987-0.17-1.31-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476c0.326-0.35,0.749-0.524,1.269-0.524
+			c0.503,0,0.915,0.172,1.234,0.515c0.319,0.342,0.479,0.824,0.479,1.446c0,0.038-0.001,0.095-0.004,0.17h-2.808
+			c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185S66.895,545.715,66.992,545.445z
+			 M64.896,544.414h2.103c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369
+			c-0.293,0-0.54,0.099-0.739,0.295S64.917,544.085,64.896,544.414z"/>
+		<path d="M68.446,546.658v-3.766h0.574v0.571c0.146-0.268,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+			c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.139-0.468-0.139c-0.14,0-0.265,0.042-0.376,0.126
+			c-0.111,0.084-0.19,0.2-0.237,0.35c-0.071,0.227-0.106,0.475-0.106,0.744v1.972H68.446z"/>
+	</g>
+</g>
+<g>
+	<line id="actor5" fill="none" stroke="#999999" stroke-width="0.5" x1="551.578" y1="212.407" x2="551.578" y2="531.909"/>
+	<g id="root-5">
+		<path fill="#EAEAEA" stroke="#666666" d="M518.902,210.138h65.352c0.752,0,1.363,0.61,1.363,1.362v26.776
+			c0,0.752-0.611,1.361-1.363,1.361h-65.352c-0.752,0-1.361-0.609-1.361-1.361V211.5
+			C517.541,210.748,518.15,210.138,518.902,210.138z"/>
+		<g enable-background="new    ">
+			<path d="M536.998,222.356c0-0.863,0.232-1.538,0.695-2.026c0.463-0.488,1.063-0.732,1.795-0.732c0.48,0,0.912,0.115,1.297,0.344
+				c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.395c0,0.527-0.107,0.999-0.32,1.415
+				s-0.514,0.731-0.904,0.945c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.355
+				c-0.385-0.236-0.676-0.559-0.875-0.968C537.098,223.245,536.998,222.813,536.998,222.356z M537.709,222.367
+				c0,0.626,0.168,1.12,0.504,1.48c0.338,0.36,0.76,0.541,1.268,0.541c0.518,0,0.943-0.182,1.279-0.546
+				c0.334-0.364,0.502-0.88,0.502-1.549c0-0.423-0.072-0.792-0.215-1.108c-0.145-0.315-0.354-0.56-0.629-0.734
+				c-0.275-0.173-0.584-0.26-0.926-0.26c-0.488,0-0.906,0.167-1.258,0.501S537.709,221.584,537.709,222.367z"/>
+			<path d="M543.363,224.888h-0.592v-5.198h0.639v1.854c0.27-0.338,0.613-0.507,1.031-0.507c0.232,0,0.451,0.047,0.658,0.14
+				s0.377,0.225,0.51,0.394c0.135,0.169,0.238,0.373,0.314,0.612s0.113,0.494,0.113,0.766c0,0.646-0.16,1.144-0.479,1.496
+				c-0.32,0.353-0.703,0.528-1.148,0.528s-0.793-0.186-1.047-0.557V224.888z M543.357,222.977c0,0.452,0.061,0.778,0.184,0.979
+				c0.201,0.329,0.473,0.493,0.814,0.493c0.279,0,0.521-0.121,0.725-0.364c0.203-0.242,0.305-0.603,0.305-1.083
+				c0-0.492-0.098-0.854-0.293-1.088c-0.195-0.234-0.43-0.351-0.707-0.351c-0.279,0-0.52,0.121-0.723,0.363
+				S543.357,222.518,543.357,222.977z"/>
+			<path d="M546.559,223.764l0.631-0.099c0.035,0.253,0.133,0.447,0.295,0.582s0.389,0.202,0.68,0.202
+				c0.293,0,0.51-0.06,0.652-0.179c0.143-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+				c-0.088-0.057-0.305-0.128-0.652-0.216c-0.469-0.118-0.793-0.22-0.975-0.307c-0.18-0.086-0.316-0.206-0.41-0.358
+				s-0.141-0.321-0.141-0.505c0-0.168,0.039-0.323,0.115-0.466s0.182-0.262,0.314-0.356c0.1-0.073,0.234-0.135,0.406-0.186
+				c0.17-0.051,0.354-0.076,0.551-0.076c0.295,0,0.555,0.042,0.777,0.128c0.225,0.085,0.389,0.2,0.496,0.346
+				c0.105,0.145,0.18,0.339,0.219,0.583l-0.623,0.085c-0.029-0.194-0.111-0.345-0.248-0.454c-0.135-0.109-0.326-0.163-0.576-0.163
+				c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.025,0.157,0.078,0.223
+				c0.051,0.069,0.133,0.125,0.244,0.17c0.064,0.023,0.252,0.078,0.564,0.163c0.451,0.121,0.766,0.219,0.945,0.296
+				c0.178,0.077,0.318,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.188,0.601
+				c-0.123,0.188-0.303,0.333-0.537,0.436c-0.232,0.103-0.498,0.154-0.793,0.154c-0.49,0-0.863-0.102-1.119-0.305
+				S546.629,224.163,546.559,223.764z"/>
+			<path d="M553.021,223.675l0.66,0.082c-0.105,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.988-0.169-1.311-0.509c-0.322-0.339-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.914,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.002,0.094-0.004,0.17h-2.809c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.6-0.185C552.793,224.141,552.924,223.944,553.021,223.675z M550.926,222.644h2.104
+				c-0.029-0.317-0.109-0.555-0.242-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.738,0.294
+				C551.059,222.052,550.947,222.315,550.926,222.644z"/>
+			<path d="M554.475,224.888v-3.766h0.574v0.571c0.146-0.267,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.264,0.042-0.375,0.126
+				c-0.111,0.083-0.189,0.2-0.238,0.349c-0.07,0.227-0.105,0.475-0.105,0.745v1.971H554.475z"/>
+			<path d="M557.945,224.888l-1.432-3.766h0.674l0.809,2.255c0.088,0.243,0.168,0.496,0.24,0.759
+				c0.057-0.199,0.137-0.438,0.238-0.716l0.836-2.298h0.656l-1.426,3.766H557.945z"/>
+			<path d="M563.109,223.675l0.658,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.986-0.169-1.309-0.509c-0.324-0.339-0.484-0.815-0.484-1.427c0-0.634,0.162-1.125,0.488-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.916,0.171,1.234,0.514s0.479,0.825,0.479,1.447c0,0.038,0,0.094-0.004,0.17h-2.807
+				c0.023,0.414,0.141,0.73,0.35,0.95c0.211,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+				S563.012,223.944,563.109,223.675z M561.014,222.644h2.102c-0.027-0.317-0.107-0.555-0.24-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.74,0.294C561.145,222.052,561.035,222.315,561.014,222.644z"/>
+			<path d="M564.563,224.888v-3.766h0.574v0.571c0.146-0.267,0.281-0.443,0.406-0.528c0.123-0.085,0.26-0.128,0.408-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.219,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.266,0.042-0.375,0.126
+				c-0.111,0.083-0.191,0.2-0.238,0.349c-0.07,0.227-0.107,0.475-0.107,0.745v1.971H564.563z"/>
+		</g>
+	</g>
+</g>
+<g>
+	<line id="actor4" fill="none" stroke="#999999" stroke-width="0.5" x1="454.91" y1="212.407" x2="454.91" y2="531.909"/>
+	<g id="root-4">
+		<path fill="#EAEAEA" stroke="#666666" d="M416.334,210.138h77.152c0.752,0,1.363,0.61,1.363,1.362v26.776
+			c0,0.752-0.611,1.361-1.363,1.361h-77.152c-0.752,0-1.361-0.609-1.361-1.361V211.5
+			C414.973,210.748,415.582,210.138,416.334,210.138z"/>
+		<g enable-background="new    ">
+			<path d="M419.232,224.888v-5.198h2.303c0.465,0,0.816,0.046,1.057,0.14c0.242,0.093,0.436,0.258,0.578,0.495
+				c0.145,0.236,0.217,0.498,0.217,0.783c0,0.369-0.119,0.68-0.357,0.933s-0.607,0.414-1.107,0.482
+				c0.184,0.087,0.32,0.173,0.416,0.259c0.201,0.184,0.391,0.415,0.57,0.691l0.904,1.415h-0.865l-0.688-1.082
+				c-0.201-0.312-0.367-0.551-0.496-0.716c-0.131-0.165-0.246-0.281-0.35-0.347c-0.104-0.066-0.207-0.112-0.314-0.138
+				c-0.078-0.017-0.205-0.025-0.383-0.025h-0.797v2.308H419.232z M419.92,221.984h1.479c0.314,0,0.561-0.033,0.736-0.098
+				c0.178-0.065,0.313-0.169,0.404-0.312s0.139-0.298,0.139-0.466c0-0.246-0.09-0.448-0.268-0.606
+				c-0.178-0.159-0.461-0.238-0.846-0.238h-1.645V221.984z"/>
+			<path d="M423.957,224.888l1.377-1.957l-1.273-1.809h0.799l0.576,0.883c0.109,0.168,0.197,0.309,0.264,0.422
+				c0.104-0.156,0.199-0.294,0.287-0.415l0.635-0.89h0.762l-1.301,1.773l1.4,1.993h-0.783l-0.773-1.17l-0.205-0.316l-0.99,1.486
+				H423.957z"/>
+			<path d="M430.23,224.888v-5.198h0.688v5.198H430.23z"/>
+			<path d="M431.922,222.356c0-0.863,0.232-1.538,0.695-2.026c0.463-0.488,1.061-0.732,1.793-0.732c0.48,0,0.912,0.115,1.299,0.344
+				c0.385,0.229,0.678,0.549,0.881,0.959c0.201,0.41,0.303,0.875,0.303,1.395c0,0.527-0.105,0.999-0.318,1.415
+				s-0.516,0.731-0.904,0.945c-0.391,0.214-0.811,0.321-1.262,0.321c-0.49,0-0.928-0.118-1.313-0.355
+				c-0.385-0.236-0.678-0.559-0.877-0.968C432.021,223.245,431.922,222.813,431.922,222.356z M432.631,222.367
+				c0,0.626,0.168,1.12,0.506,1.48c0.336,0.36,0.758,0.541,1.268,0.541c0.518,0,0.943-0.182,1.277-0.546
+				c0.334-0.364,0.502-0.88,0.502-1.549c0-0.423-0.072-0.792-0.215-1.108c-0.143-0.315-0.352-0.56-0.627-0.734
+				c-0.275-0.173-0.584-0.26-0.928-0.26c-0.486,0-0.906,0.167-1.256,0.501C432.807,221.026,432.631,221.584,432.631,222.367z"/>
+			<path d="M438.287,224.888h-0.592v-5.198h0.637v1.854c0.27-0.338,0.613-0.507,1.033-0.507c0.23,0,0.449,0.047,0.656,0.14
+				s0.377,0.225,0.512,0.394c0.133,0.169,0.238,0.373,0.313,0.612c0.076,0.239,0.113,0.494,0.113,0.766
+				c0,0.646-0.158,1.144-0.479,1.496c-0.318,0.353-0.701,0.528-1.148,0.528c-0.443,0-0.793-0.186-1.045-0.557V224.888z
+				 M438.279,222.977c0,0.452,0.061,0.778,0.184,0.979c0.201,0.329,0.473,0.493,0.816,0.493c0.279,0,0.52-0.121,0.723-0.364
+				c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.291-1.088c-0.195-0.234-0.432-0.351-0.709-0.351
+				s-0.52,0.121-0.723,0.363S438.279,222.518,438.279,222.977z"/>
+			<path d="M441.48,223.764l0.631-0.099c0.035,0.253,0.135,0.447,0.297,0.582s0.389,0.202,0.678,0.202
+				c0.295,0,0.512-0.06,0.652-0.179c0.143-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+				c-0.088-0.057-0.305-0.128-0.652-0.216c-0.467-0.118-0.793-0.22-0.973-0.307c-0.182-0.086-0.318-0.206-0.412-0.358
+				s-0.139-0.321-0.139-0.505c0-0.168,0.037-0.323,0.115-0.466c0.076-0.143,0.18-0.262,0.313-0.356
+				c0.1-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.551-0.076c0.297,0,0.555,0.042,0.779,0.128c0.223,0.085,0.389,0.2,0.494,0.346
+				c0.107,0.145,0.18,0.339,0.221,0.583l-0.625,0.085c-0.027-0.194-0.109-0.345-0.246-0.454s-0.328-0.163-0.576-0.163
+				c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.189,0.21-0.189,0.34c0,0.083,0.027,0.157,0.078,0.223
+				c0.053,0.069,0.135,0.125,0.246,0.17c0.063,0.023,0.252,0.078,0.563,0.163c0.451,0.121,0.768,0.219,0.945,0.296
+				s0.318,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.186,0.601c-0.125,0.188-0.303,0.333-0.537,0.436
+				c-0.234,0.103-0.498,0.154-0.795,0.154c-0.488,0-0.861-0.102-1.117-0.305C441.715,224.465,441.551,224.163,441.48,223.764z"/>
+			<path d="M447.945,223.675l0.658,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.986-0.169-1.309-0.509c-0.324-0.339-0.484-0.815-0.484-1.427c0-0.634,0.162-1.125,0.488-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.916,0.171,1.234,0.514s0.479,0.825,0.479,1.447c0,0.038,0,0.094-0.004,0.17h-2.807
+				c0.023,0.414,0.141,0.73,0.35,0.95c0.211,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+				S447.848,223.944,447.945,223.675z M445.85,222.644h2.102c-0.027-0.317-0.107-0.555-0.24-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.74,0.294C445.98,222.052,445.871,222.315,445.85,222.644z"/>
+			<path d="M449.398,224.888v-3.766h0.574v0.571c0.146-0.267,0.281-0.443,0.406-0.528c0.123-0.085,0.26-0.128,0.408-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.219,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.266,0.042-0.375,0.126
+				c-0.111,0.083-0.191,0.2-0.238,0.349c-0.07,0.227-0.107,0.475-0.107,0.745v1.971H449.398z"/>
+			<path d="M452.869,224.888l-1.434-3.766h0.674l0.809,2.255c0.088,0.243,0.168,0.496,0.242,0.759
+				c0.057-0.199,0.135-0.438,0.236-0.716l0.838-2.298h0.656l-1.426,3.766H452.869z"/>
+			<path d="M458.031,223.675l0.66,0.082c-0.105,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.988-0.169-1.311-0.509c-0.322-0.339-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.914,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.002,0.094-0.004,0.17H455.9c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.6-0.185C457.803,224.141,457.934,223.944,458.031,223.675z M455.936,222.644h2.104
+				c-0.029-0.317-0.109-0.555-0.242-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.738,0.294
+				C456.068,222.052,455.957,222.315,455.936,222.644z"/>
+			<path d="M459.484,224.888v-3.766h0.574v0.571c0.146-0.267,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.264,0.042-0.375,0.126
+				c-0.111,0.083-0.189,0.2-0.238,0.349c-0.07,0.227-0.105,0.475-0.105,0.745v1.971H459.484z"/>
+			<path d="M464.916,224.888l-1.379-5.198h0.705l0.791,3.407c0.086,0.357,0.158,0.711,0.221,1.063
+				c0.133-0.555,0.209-0.875,0.234-0.96l0.988-3.51h0.83l0.744,2.631c0.188,0.652,0.322,1.266,0.404,1.84
+				c0.066-0.328,0.152-0.706,0.26-1.131l0.814-3.34h0.691l-1.426,5.198h-0.662l-1.096-3.96c-0.092-0.331-0.146-0.534-0.164-0.61
+				c-0.053,0.239-0.104,0.442-0.152,0.61l-1.102,3.96H464.916z"/>
+			<path d="M470.643,224.888v-3.766h0.574v0.571c0.146-0.267,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.264,0.042-0.375,0.126
+				c-0.111,0.083-0.189,0.2-0.238,0.349c-0.07,0.227-0.105,0.475-0.105,0.745v1.971H470.643z"/>
+			<path d="M475.525,224.423c-0.236,0.201-0.465,0.343-0.684,0.425c-0.219,0.083-0.453,0.124-0.703,0.124
+				c-0.414,0-0.732-0.101-0.953-0.303c-0.223-0.202-0.334-0.46-0.334-0.774c0-0.185,0.043-0.353,0.127-0.505
+				c0.082-0.152,0.193-0.275,0.328-0.367c0.137-0.092,0.289-0.162,0.459-0.209c0.127-0.033,0.314-0.065,0.568-0.096
+				c0.516-0.062,0.895-0.135,1.139-0.22c0.002-0.087,0.002-0.143,0.002-0.167c0-0.26-0.059-0.443-0.18-0.55
+				c-0.164-0.144-0.406-0.216-0.727-0.216c-0.301,0-0.521,0.053-0.666,0.158c-0.143,0.105-0.248,0.292-0.316,0.559l-0.625-0.085
+				c0.057-0.267,0.15-0.483,0.281-0.647c0.129-0.164,0.318-0.291,0.563-0.379c0.246-0.088,0.531-0.133,0.855-0.133
+				c0.32,0,0.582,0.038,0.783,0.113c0.201,0.076,0.35,0.171,0.443,0.286s0.16,0.259,0.199,0.435
+				c0.021,0.108,0.031,0.305,0.031,0.588v0.851c0,0.593,0.014,0.968,0.041,1.125s0.08,0.308,0.16,0.452h-0.666
+				C475.586,224.755,475.545,224.601,475.525,224.423z M475.473,222.998c-0.232,0.094-0.58,0.175-1.043,0.241
+				c-0.262,0.038-0.447,0.081-0.557,0.128s-0.193,0.116-0.252,0.208c-0.059,0.091-0.088,0.192-0.088,0.303
+				c0,0.17,0.064,0.312,0.193,0.425s0.316,0.17,0.564,0.17c0.246,0,0.465-0.054,0.656-0.161s0.332-0.255,0.422-0.441
+				c0.068-0.144,0.104-0.357,0.104-0.638V222.998z"/>
+			<path d="M477.105,226.331v-5.208h0.582v0.489c0.137-0.191,0.291-0.335,0.465-0.431c0.172-0.096,0.381-0.144,0.627-0.144
+				c0.322,0,0.605,0.083,0.852,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.188,0.631,0.188,0.991
+				c0,0.385-0.068,0.732-0.207,1.041c-0.139,0.309-0.34,0.545-0.604,0.709c-0.264,0.164-0.541,0.246-0.83,0.246
+				c-0.213,0-0.404-0.045-0.574-0.135c-0.168-0.09-0.307-0.203-0.416-0.34v1.833H477.105z M477.684,223.026
+				c0,0.484,0.098,0.843,0.295,1.074c0.195,0.231,0.434,0.348,0.713,0.348c0.283,0,0.525-0.12,0.729-0.36
+				c0.201-0.24,0.303-0.612,0.303-1.115c0-0.48-0.098-0.839-0.297-1.078c-0.197-0.239-0.432-0.358-0.707-0.358
+				c-0.271,0-0.512,0.127-0.721,0.381C477.789,222.172,477.684,222.542,477.684,223.026z"/>
+			<path d="M481.145,226.331v-5.208h0.582v0.489c0.137-0.191,0.291-0.335,0.463-0.431c0.174-0.096,0.383-0.144,0.629-0.144
+				c0.32,0,0.604,0.083,0.85,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.189,0.631,0.189,0.991
+				c0,0.385-0.07,0.732-0.209,1.041c-0.137,0.309-0.338,0.545-0.602,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+				c-0.213,0-0.404-0.045-0.572-0.135c-0.17-0.09-0.309-0.203-0.416-0.34v1.833H481.145z M481.723,223.026
+				c0,0.484,0.098,0.843,0.293,1.074c0.197,0.231,0.434,0.348,0.713,0.348c0.285,0,0.527-0.12,0.729-0.36
+				c0.203-0.24,0.305-0.612,0.305-1.115c0-0.48-0.1-0.839-0.297-1.078s-0.434-0.358-0.707-0.358c-0.271,0-0.514,0.127-0.723,0.381
+				C481.826,222.172,481.723,222.542,481.723,223.026z"/>
+			<path d="M487.76,223.675l0.66,0.082c-0.105,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.988-0.169-1.311-0.509c-0.322-0.339-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.914,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.002,0.094-0.004,0.17h-2.809c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.6-0.185C487.531,224.141,487.662,223.944,487.76,223.675z M485.664,222.644h2.104
+				c-0.029-0.317-0.109-0.555-0.242-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.738,0.294
+				C485.797,222.052,485.686,222.315,485.664,222.644z"/>
+			<path d="M489.213,224.888v-3.766h0.574v0.571c0.146-0.267,0.283-0.443,0.406-0.528c0.125-0.085,0.262-0.128,0.41-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.221,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.264,0.042-0.375,0.126
+				c-0.111,0.083-0.189,0.2-0.238,0.349c-0.07,0.227-0.105,0.475-0.105,0.745v1.971H489.213z"/>
+		</g>
+	</g>
+</g>
+<g>
+	<line id="actor3" fill="none" stroke="#999999" stroke-width="0.5" x1="358.244" y1="212.407" x2="358.244" y2="531.909"/>
+	<g id="root-3">
+		<path fill="#EAEAEA" stroke="#666666" d="M325.567,210.138h65.353c0.752,0,1.361,0.61,1.361,1.362v26.776
+			c0,0.752-0.609,1.361-1.361,1.361h-65.353c-0.752,0-1.362-0.609-1.362-1.361V211.5
+			C324.205,210.748,324.815,210.138,325.567,210.138z"/>
+		<g enable-background="new    ">
+			<path d="M328.122,222.356c0-0.863,0.231-1.538,0.694-2.026c0.464-0.488,1.063-0.732,1.795-0.732c0.479,0,0.912,0.115,1.297,0.344
+				c0.386,0.229,0.68,0.549,0.882,0.959c0.202,0.41,0.303,0.875,0.303,1.395c0,0.527-0.106,0.999-0.319,1.415
+				s-0.514,0.731-0.904,0.945c-0.39,0.214-0.811,0.321-1.262,0.321c-0.489,0-0.927-0.118-1.313-0.355
+				c-0.385-0.236-0.677-0.559-0.875-0.968C328.221,223.245,328.122,222.813,328.122,222.356z M328.831,222.367
+				c0,0.626,0.169,1.12,0.505,1.48c0.338,0.36,0.76,0.541,1.268,0.541c0.518,0,0.944-0.182,1.279-0.546
+				c0.334-0.364,0.501-0.88,0.501-1.549c0-0.423-0.071-0.792-0.214-1.108c-0.144-0.315-0.354-0.56-0.629-0.734
+				c-0.275-0.173-0.584-0.26-0.926-0.26c-0.488,0-0.906,0.167-1.258,0.501C329.007,221.026,328.831,221.584,328.831,222.367z"/>
+			<path d="M334.486,224.888h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.231,0,0.45,0.047,0.657,0.14
+				s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+				c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V224.888z M334.479,222.977
+				c0,0.452,0.063,0.778,0.186,0.979c0.2,0.329,0.473,0.493,0.814,0.493c0.279,0,0.521-0.121,0.724-0.364
+				c0.203-0.242,0.306-0.603,0.306-1.083c0-0.492-0.098-0.854-0.293-1.088c-0.195-0.234-0.432-0.351-0.707-0.351
+				c-0.279,0-0.521,0.121-0.724,0.363C334.58,222.167,334.479,222.518,334.479,222.977z"/>
+			<path d="M337.681,223.764l0.632-0.099c0.035,0.253,0.134,0.447,0.295,0.582c0.162,0.135,0.389,0.202,0.68,0.202
+				c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+				c-0.088-0.057-0.306-0.128-0.652-0.216c-0.469-0.118-0.793-0.22-0.975-0.307c-0.18-0.086-0.317-0.206-0.41-0.358
+				c-0.094-0.152-0.141-0.321-0.141-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+				c0.099-0.073,0.234-0.135,0.405-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.777,0.128
+				c0.225,0.085,0.389,0.2,0.495,0.346c0.106,0.145,0.18,0.339,0.22,0.583l-0.623,0.085c-0.029-0.194-0.111-0.345-0.247-0.454
+				s-0.328-0.163-0.576-0.163c-0.293,0-0.503,0.048-0.628,0.146c-0.125,0.097-0.188,0.21-0.188,0.34
+				c0,0.083,0.025,0.157,0.078,0.223c0.052,0.069,0.133,0.125,0.244,0.17c0.064,0.023,0.252,0.078,0.564,0.163
+				c0.451,0.121,0.766,0.219,0.944,0.296s0.319,0.188,0.421,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.187,0.601
+				s-0.304,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.794,0.154c-0.49,0-0.863-0.102-1.119-0.305
+				S337.752,224.163,337.681,223.764z"/>
+			<path d="M344.145,223.675l0.66,0.082c-0.105,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.311-0.509c-0.322-0.339-0.483-0.815-0.483-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.27-0.525c0.503,0,0.914,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.002,0.094-0.004,0.17h-2.809c0.023,0.414,0.141,0.73,0.352,0.95c0.21,0.22,0.473,0.33,0.787,0.33
+				c0.233,0,0.434-0.062,0.599-0.185S344.048,223.944,344.145,223.675z M342.049,222.644h2.104
+				c-0.029-0.317-0.109-0.555-0.242-0.713c-0.203-0.246-0.467-0.369-0.79-0.369c-0.294,0-0.54,0.098-0.739,0.294
+				C342.182,222.052,342.07,222.315,342.049,222.644z"/>
+			<path d="M345.599,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.261-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.265,0.042-0.375,0.126
+				c-0.111,0.083-0.19,0.2-0.238,0.349c-0.07,0.227-0.106,0.475-0.106,0.745v1.971H345.599z"/>
+			<path d="M349.069,224.888l-1.433-3.766h0.674l0.809,2.255c0.088,0.243,0.168,0.496,0.241,0.759
+				c0.057-0.199,0.136-0.438,0.237-0.716l0.837-2.298h0.656l-1.426,3.766H349.069z"/>
+			<path d="M354.111,224.423c-0.236,0.201-0.464,0.343-0.683,0.425c-0.219,0.083-0.453,0.124-0.703,0.124
+				c-0.414,0-0.732-0.101-0.954-0.303c-0.223-0.202-0.333-0.46-0.333-0.774c0-0.185,0.042-0.353,0.126-0.505
+				c0.083-0.152,0.193-0.275,0.329-0.367c0.136-0.092,0.289-0.162,0.459-0.209c0.126-0.033,0.314-0.065,0.567-0.096
+				c0.516-0.062,0.895-0.135,1.139-0.22c0.002-0.087,0.003-0.143,0.003-0.167c0-0.26-0.06-0.443-0.181-0.55
+				c-0.163-0.144-0.405-0.216-0.727-0.216c-0.3,0-0.521,0.053-0.665,0.158c-0.143,0.105-0.249,0.292-0.317,0.559l-0.624-0.085
+				c0.057-0.267,0.15-0.483,0.28-0.647c0.13-0.164,0.318-0.291,0.563-0.379c0.246-0.088,0.531-0.133,0.854-0.133
+				c0.321,0,0.583,0.038,0.784,0.113c0.2,0.076,0.349,0.171,0.443,0.286c0.094,0.115,0.16,0.259,0.198,0.435
+				c0.021,0.108,0.032,0.305,0.032,0.588v0.851c0,0.593,0.013,0.968,0.04,1.125s0.081,0.308,0.161,0.452h-0.666
+				C354.173,224.755,354.131,224.601,354.111,224.423z M354.059,222.998c-0.231,0.094-0.579,0.175-1.043,0.241
+				c-0.262,0.038-0.447,0.081-0.557,0.128c-0.108,0.047-0.192,0.116-0.251,0.208c-0.06,0.091-0.089,0.192-0.089,0.303
+				c0,0.17,0.064,0.312,0.193,0.425s0.317,0.17,0.565,0.17c0.245,0,0.464-0.054,0.655-0.161s0.332-0.255,0.422-0.441
+				c0.069-0.144,0.104-0.357,0.104-0.638V222.998z"/>
+			<path d="M356.281,224.888h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.231,0,0.45,0.047,0.657,0.14
+				s0.377,0.225,0.511,0.394s0.238,0.373,0.313,0.612c0.076,0.239,0.113,0.494,0.113,0.766c0,0.646-0.159,1.144-0.479,1.496
+				c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V224.888z M356.274,222.977
+				c0,0.452,0.061,0.778,0.184,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.521-0.121,0.724-0.364
+				c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+				c-0.278,0-0.52,0.121-0.723,0.363S356.274,222.518,356.274,222.977z"/>
+			<path d="M359.717,224.888v-5.198h0.638v5.198H359.717z"/>
+			<path d="M363.922,223.675l0.659,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.915,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+				C363.693,224.141,363.824,223.944,363.922,223.675z M361.826,222.644h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.739,0.294C361.958,222.052,361.848,222.315,361.826,222.644z"/>
+			<path d="M365.563,224.888v-0.727h0.728v0.727H365.563z"/>
+			<path d="M371.189,223.065l0.688,0.173c-0.145,0.565-0.404,0.996-0.778,1.292c-0.375,0.297-0.833,0.445-1.374,0.445
+				c-0.561,0-1.016-0.114-1.367-0.342c-0.351-0.228-0.618-0.559-0.801-0.991c-0.184-0.433-0.275-0.897-0.275-1.393
+				c0-0.542,0.104-1.014,0.311-1.417c0.207-0.403,0.501-0.709,0.883-0.918c0.382-0.209,0.802-0.314,1.261-0.314
+				c0.52,0,0.957,0.132,1.312,0.397c0.354,0.265,0.602,0.637,0.741,1.117l-0.678,0.16c-0.12-0.378-0.295-0.654-0.524-0.826
+				c-0.229-0.173-0.518-0.259-0.865-0.259c-0.399,0-0.733,0.096-1.001,0.287c-0.269,0.191-0.457,0.448-0.566,0.771
+				c-0.108,0.323-0.163,0.655-0.163,0.998c0,0.442,0.064,0.828,0.193,1.158s0.329,0.576,0.602,0.739
+				c0.271,0.163,0.565,0.245,0.883,0.245c0.385,0,0.711-0.111,0.979-0.333C370.914,223.833,371.096,223.502,371.189,223.065z"/>
+			<path d="M372.637,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.261-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.313-0.138-0.469-0.138c-0.139,0-0.265,0.042-0.375,0.126
+				c-0.111,0.083-0.19,0.2-0.238,0.349c-0.07,0.227-0.106,0.475-0.106,0.745v1.971H372.637z"/>
+			<path d="M377.64,223.675l0.659,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.915,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+				C377.411,224.141,377.542,223.944,377.64,223.675z M375.544,222.644h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.739,0.294C375.676,222.052,375.565,222.315,375.544,222.644z"/>
+			<path d="M381.557,224.423c-0.236,0.201-0.464,0.343-0.683,0.425c-0.219,0.083-0.453,0.124-0.703,0.124
+				c-0.414,0-0.732-0.101-0.954-0.303c-0.223-0.202-0.333-0.46-0.333-0.774c0-0.185,0.042-0.353,0.126-0.505
+				c0.083-0.152,0.193-0.275,0.329-0.367c0.136-0.092,0.289-0.162,0.459-0.209c0.126-0.033,0.314-0.065,0.567-0.096
+				c0.516-0.062,0.895-0.135,1.139-0.22c0.002-0.087,0.003-0.143,0.003-0.167c0-0.26-0.06-0.443-0.181-0.55
+				c-0.163-0.144-0.405-0.216-0.727-0.216c-0.3,0-0.521,0.053-0.665,0.158c-0.143,0.105-0.249,0.292-0.317,0.559l-0.624-0.085
+				c0.057-0.267,0.15-0.483,0.28-0.647c0.13-0.164,0.318-0.291,0.563-0.379c0.246-0.088,0.531-0.133,0.854-0.133
+				c0.321,0,0.583,0.038,0.784,0.113c0.2,0.076,0.349,0.171,0.443,0.286c0.094,0.115,0.16,0.259,0.198,0.435
+				c0.021,0.108,0.032,0.305,0.032,0.588v0.851c0,0.593,0.013,0.968,0.04,1.125s0.081,0.308,0.161,0.452h-0.666
+				C381.618,224.755,381.576,224.601,381.557,224.423z M381.504,222.998c-0.231,0.094-0.579,0.175-1.043,0.241
+				c-0.262,0.038-0.447,0.081-0.557,0.128c-0.108,0.047-0.192,0.116-0.251,0.208c-0.06,0.091-0.089,0.192-0.089,0.303
+				c0,0.17,0.064,0.312,0.193,0.425s0.317,0.17,0.565,0.17c0.245,0,0.464-0.054,0.655-0.161s0.332-0.255,0.422-0.441
+				c0.069-0.144,0.104-0.357,0.104-0.638V222.998z"/>
+			<path d="M384.531,224.317l0.092,0.563c-0.18,0.038-0.34,0.057-0.481,0.057c-0.232,0-0.412-0.037-0.539-0.11
+				c-0.128-0.073-0.218-0.17-0.27-0.289c-0.052-0.12-0.078-0.371-0.078-0.753v-2.167h-0.468v-0.497h0.468v-0.932l0.635-0.383v1.315
+				h0.642v0.497h-0.642v2.202c0,0.182,0.011,0.299,0.033,0.351c0.022,0.052,0.06,0.093,0.11,0.124s0.123,0.046,0.218,0.046
+				C384.322,224.342,384.415,224.333,384.531,224.317z"/>
+			<path d="M387.733,223.675l0.659,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.915,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+				C387.505,224.141,387.636,223.944,387.733,223.675z M385.638,222.644h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.739,0.294C385.77,222.052,385.659,222.315,385.638,222.644z"/>
+		</g>
+	</g>
+</g>
+<g>
+	<line id="actor2" fill="none" stroke="#999999" stroke-width="0.5" x1="267.476" y1="212.407" x2="267.476" y2="531.909"/>
+	<g id="root-2">
+		<path fill="#EAEAEA" stroke="#666666" d="M234.8,210.138h65.353c0.752,0,1.362,0.61,1.362,1.362v26.776
+			c0,0.752-0.61,1.361-1.362,1.361H234.8c-0.752,0-1.361-0.609-1.361-1.361V211.5C233.438,210.748,234.048,210.138,234.8,210.138z"
+			/>
+		<g enable-background="new    ">
+			<path d="M251.453,223.218l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+				c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+				c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+				c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+				c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+				c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+				c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+				c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+				c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+				c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+				c-0.318-0.137-0.567-0.343-0.748-0.619C251.558,223.876,251.462,223.565,251.453,223.218z"/>
+			<path d="M258.906,223.508l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+				c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+				c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+				c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+				c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+				c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C258.755,224.064,258.861,223.828,258.906,223.508z"/>
+			<path d="M260.08,224.888v-5.198h0.638v1.865c0.298-0.345,0.674-0.518,1.127-0.518c0.279,0,0.521,0.055,0.727,0.165
+				s0.353,0.262,0.441,0.456c0.089,0.194,0.133,0.475,0.133,0.844v2.386h-0.638v-2.386c0-0.319-0.069-0.551-0.207-0.697
+				c-0.139-0.146-0.334-0.218-0.587-0.218c-0.189,0-0.367,0.049-0.534,0.147s-0.286,0.231-0.356,0.399s-0.106,0.399-0.106,0.695
+				v2.06H260.08z"/>
+			<path d="M266.696,223.675l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.599-0.185S266.599,223.944,266.696,223.675z M264.601,222.644h2.103
+				c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294
+				C264.732,222.052,264.622,222.315,264.601,222.644z"/>
+			<path d="M270.6,224.888v-0.475c-0.239,0.374-0.589,0.56-1.053,0.56c-0.3,0-0.576-0.083-0.828-0.248
+				c-0.251-0.166-0.447-0.396-0.585-0.693c-0.138-0.296-0.208-0.637-0.208-1.023c0-0.375,0.063-0.716,0.188-1.022
+				c0.125-0.306,0.313-0.541,0.564-0.704s0.53-0.245,0.84-0.245c0.227,0,0.429,0.048,0.606,0.144s0.322,0.221,0.433,0.374v-1.865
+				h0.635v5.198H270.6z M268.583,223.008c0,0.482,0.102,0.843,0.305,1.082s0.443,0.358,0.72,0.358c0.279,0,0.516-0.114,0.711-0.342
+				s0.292-0.576,0.292-1.044c0-0.515-0.099-0.893-0.298-1.134c-0.198-0.241-0.443-0.362-0.734-0.362
+				c-0.284,0-0.521,0.116-0.711,0.348C268.677,222.145,268.583,222.51,268.583,223.008z"/>
+			<path d="M274.663,224.888v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+				c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+				c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+				c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H274.663z"/>
+			<path d="M276.22,224.888v-5.198h0.638v5.198H276.22z"/>
+			<path d="M280.425,223.675l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.599-0.185S280.328,223.944,280.425,223.675z M278.33,222.644h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C278.461,222.052,278.351,222.315,278.33,222.644z"/>
+			<path d="M281.879,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+				c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H281.879z"/>
+		</g>
+	</g>
+</g>
+<g>
+	<line id="actor1" fill="none" stroke="#999999" stroke-width="0.5" x1="167.405" y1="212.407" x2="167.405" y2="531.909"/>
+	<g id="root-1">
+		<path fill="#EAEAEA" stroke="#666666" d="M125.425,210.138h83.96c0.752,0,1.362,0.61,1.362,1.362v26.776
+			c0,0.752-0.61,1.361-1.362,1.361h-83.96c-0.752,0-1.361-0.609-1.361-1.361V211.5C124.063,210.748,124.673,210.138,125.425,210.138
+			z"/>
+		<g enable-background="new    ">
+			<path d="M128.089,224.888v-5.198h2.305c0.463,0,0.815,0.046,1.057,0.14c0.241,0.093,0.434,0.258,0.578,0.495
+				c0.144,0.236,0.216,0.498,0.216,0.783c0,0.369-0.119,0.68-0.358,0.933s-0.607,0.414-1.106,0.482
+				c0.182,0.087,0.32,0.173,0.415,0.259c0.201,0.184,0.391,0.415,0.571,0.691l0.904,1.415h-0.865l-0.688-1.082
+				c-0.201-0.312-0.366-0.551-0.496-0.716c-0.13-0.165-0.247-0.281-0.35-0.347c-0.103-0.066-0.207-0.112-0.313-0.138
+				c-0.078-0.017-0.206-0.025-0.383-0.025h-0.798v2.308H128.089z M128.777,221.984h1.479c0.314,0,0.56-0.033,0.737-0.098
+				s0.312-0.169,0.404-0.312s0.138-0.298,0.138-0.466c0-0.246-0.089-0.448-0.268-0.606c-0.179-0.159-0.46-0.238-0.846-0.238h-1.645
+				V221.984z"/>
+			<path d="M132.816,224.888l1.375-1.957l-1.272-1.809h0.797l0.578,0.883c0.109,0.168,0.196,0.309,0.262,0.422
+				c0.104-0.156,0.2-0.294,0.287-0.415l0.635-0.89h0.762l-1.301,1.773l1.401,1.993h-0.784l-0.773-1.17l-0.206-0.316l-0.989,1.486
+				H132.816z"/>
+			<path d="M139.088,224.888v-5.198h0.688v5.198H139.088z"/>
+			<path d="M140.78,222.356c0-0.863,0.231-1.538,0.695-2.026c0.463-0.488,1.062-0.732,1.794-0.732c0.48,0,0.913,0.115,1.298,0.344
+				c0.385,0.229,0.679,0.549,0.881,0.959c0.202,0.41,0.303,0.875,0.303,1.395c0,0.527-0.106,0.999-0.319,1.415
+				s-0.514,0.731-0.904,0.945c-0.39,0.214-0.811,0.321-1.262,0.321c-0.489,0-0.927-0.118-1.312-0.355
+				c-0.385-0.236-0.677-0.559-0.875-0.968C140.879,223.245,140.78,222.813,140.78,222.356z M141.489,222.367
+				c0,0.626,0.168,1.12,0.505,1.48s0.759,0.541,1.268,0.541c0.518,0,0.944-0.182,1.278-0.546c0.334-0.364,0.501-0.88,0.501-1.549
+				c0-0.423-0.071-0.792-0.214-1.108c-0.143-0.315-0.353-0.56-0.628-0.734c-0.275-0.173-0.584-0.26-0.927-0.26
+				c-0.487,0-0.906,0.167-1.257,0.501C141.665,221.026,141.489,221.584,141.489,222.367z"/>
+			<path d="M147.144,224.888h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+				s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+				c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V224.888z M147.137,222.977
+				c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+				c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+				c-0.279,0-0.52,0.121-0.723,0.363C147.238,222.167,147.137,222.518,147.137,222.977z"/>
+			<path d="M150.338,223.764l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+				c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+				c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+				s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+				c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128
+				c0.224,0.085,0.389,0.2,0.495,0.346c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454
+				c-0.136-0.109-0.328-0.163-0.576-0.163c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34
+				c0,0.083,0.026,0.157,0.078,0.223c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163
+				c0.452,0.121,0.767,0.219,0.945,0.296c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546
+				c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.794,0.154
+				c-0.489,0-0.862-0.102-1.119-0.305S150.41,224.163,150.338,223.764z"/>
+			<path d="M156.802,223.675l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.599-0.185S156.706,223.944,156.802,223.675z M154.707,222.644h2.103
+				c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294
+				C154.839,222.052,154.728,222.315,154.707,222.644z"/>
+			<path d="M158.256,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+				c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H158.256z"/>
+			<path d="M161.727,224.888l-1.432-3.766h0.673l0.809,2.255c0.087,0.243,0.168,0.496,0.241,0.759
+				c0.057-0.199,0.136-0.438,0.237-0.716l0.837-2.298h0.656l-1.425,3.766H161.727z"/>
+			<path d="M166.769,224.423c-0.236,0.201-0.464,0.343-0.682,0.425c-0.219,0.083-0.454,0.124-0.704,0.124
+				c-0.414,0-0.731-0.101-0.954-0.303c-0.222-0.202-0.333-0.46-0.333-0.774c0-0.185,0.042-0.353,0.126-0.505s0.194-0.275,0.33-0.367
+				c0.136-0.092,0.289-0.162,0.459-0.209c0.125-0.033,0.314-0.065,0.567-0.096c0.515-0.062,0.895-0.135,1.138-0.22
+				c0.002-0.087,0.003-0.143,0.003-0.167c0-0.26-0.061-0.443-0.181-0.55c-0.163-0.144-0.405-0.216-0.727-0.216
+				c-0.3,0-0.522,0.053-0.665,0.158c-0.143,0.105-0.249,0.292-0.317,0.559l-0.624-0.085c0.057-0.267,0.15-0.483,0.28-0.647
+				c0.13-0.164,0.318-0.291,0.564-0.379c0.246-0.088,0.53-0.133,0.854-0.133c0.321,0,0.583,0.038,0.783,0.113
+				c0.201,0.076,0.349,0.171,0.443,0.286s0.161,0.259,0.199,0.435c0.021,0.108,0.032,0.305,0.032,0.588v0.851
+				c0,0.593,0.014,0.968,0.041,1.125c0.027,0.157,0.081,0.308,0.161,0.452h-0.667C166.831,224.755,166.788,224.601,166.769,224.423z
+				 M166.716,222.998c-0.232,0.094-0.58,0.175-1.042,0.241c-0.263,0.038-0.448,0.081-0.557,0.128
+				c-0.109,0.047-0.193,0.116-0.252,0.208c-0.059,0.091-0.088,0.192-0.088,0.303c0,0.17,0.064,0.312,0.193,0.425
+				s0.317,0.17,0.565,0.17c0.246,0,0.465-0.054,0.656-0.161s0.332-0.255,0.422-0.441c0.068-0.144,0.103-0.357,0.103-0.638V222.998z"
+				/>
+			<path d="M168.939,224.888h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+				s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+				c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V224.888z M168.932,222.977
+				c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+				c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+				c-0.279,0-0.52,0.121-0.723,0.363C169.034,222.167,168.932,222.518,168.932,222.977z"/>
+			<path d="M172.375,224.888v-5.198h0.638v5.198H172.375z"/>
+			<path d="M176.58,223.675l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.599-0.185S176.483,223.944,176.58,223.675z M174.485,222.644h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C174.617,222.052,174.506,222.315,174.485,222.644z"/>
+			<path d="M181.048,224.888l-1.379-5.198h0.706l0.791,3.407c0.085,0.357,0.158,0.711,0.22,1.063c0.132-0.555,0.21-0.875,0.234-0.96
+				l0.989-3.51h0.83l0.745,2.631c0.187,0.652,0.322,1.266,0.404,1.84c0.066-0.328,0.152-0.706,0.259-1.131l0.815-3.34h0.691
+				l-1.425,5.198h-0.663l-1.095-3.96c-0.092-0.331-0.147-0.534-0.163-0.61c-0.055,0.239-0.105,0.442-0.153,0.61l-1.103,3.96H181.048
+				z"/>
+			<path d="M186.774,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+				c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H186.774z"/>
+			<path d="M191.656,224.423c-0.236,0.201-0.464,0.343-0.682,0.425c-0.219,0.083-0.454,0.124-0.704,0.124
+				c-0.414,0-0.731-0.101-0.954-0.303c-0.222-0.202-0.333-0.46-0.333-0.774c0-0.185,0.042-0.353,0.126-0.505s0.194-0.275,0.33-0.367
+				c0.136-0.092,0.289-0.162,0.459-0.209c0.125-0.033,0.314-0.065,0.567-0.096c0.515-0.062,0.895-0.135,1.138-0.22
+				c0.002-0.087,0.003-0.143,0.003-0.167c0-0.26-0.061-0.443-0.181-0.55c-0.163-0.144-0.405-0.216-0.727-0.216
+				c-0.3,0-0.522,0.053-0.665,0.158c-0.143,0.105-0.249,0.292-0.317,0.559l-0.624-0.085c0.057-0.267,0.15-0.483,0.28-0.647
+				c0.13-0.164,0.318-0.291,0.564-0.379c0.246-0.088,0.53-0.133,0.854-0.133c0.321,0,0.583,0.038,0.783,0.113
+				c0.201,0.076,0.349,0.171,0.443,0.286s0.161,0.259,0.199,0.435c0.021,0.108,0.032,0.305,0.032,0.588v0.851
+				c0,0.593,0.014,0.968,0.041,1.125c0.027,0.157,0.081,0.308,0.161,0.452h-0.667C191.717,224.755,191.675,224.601,191.656,224.423z
+				 M191.603,222.998c-0.232,0.094-0.58,0.175-1.042,0.241c-0.263,0.038-0.448,0.081-0.557,0.128
+				c-0.109,0.047-0.193,0.116-0.252,0.208c-0.059,0.091-0.088,0.192-0.088,0.303c0,0.17,0.064,0.312,0.193,0.425
+				s0.317,0.17,0.565,0.17c0.246,0,0.465-0.054,0.656-0.161s0.332-0.255,0.422-0.441c0.068-0.144,0.103-0.357,0.103-0.638V222.998z"
+				/>
+			<path d="M193.237,226.331v-5.208h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+				c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.188,0.631,0.188,0.991
+				c0,0.385-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+				c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H193.237z M193.815,223.026
+				c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+				c0.202-0.24,0.303-0.612,0.303-1.115c0-0.48-0.099-0.839-0.296-1.078s-0.433-0.358-0.708-0.358c-0.272,0-0.512,0.127-0.721,0.381
+				C193.92,222.172,193.815,222.542,193.815,223.026z"/>
+			<path d="M197.276,226.331v-5.208h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+				c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.188,0.631,0.188,0.991
+				c0,0.385-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+				c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H197.276z M197.854,223.026
+				c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+				c0.202-0.24,0.303-0.612,0.303-1.115c0-0.48-0.099-0.839-0.296-1.078s-0.433-0.358-0.708-0.358c-0.272,0-0.512,0.127-0.721,0.381
+				C197.958,222.172,197.854,222.542,197.854,223.026z"/>
+			<path d="M203.892,223.675l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.599-0.185S203.795,223.944,203.892,223.675z M201.797,222.644h2.103
+				c-0.028-0.317-0.109-0.555-0.241-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294
+				C201.929,222.052,201.818,222.315,201.797,222.644z"/>
+			<path d="M205.346,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+				c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H205.346z"/>
+		</g>
+	</g>
+</g>
+<g>
+	<line id="actor0" fill="none" stroke="#999999" stroke-width="0.5" x1="53.038" y1="212.407" x2="53.038" y2="531.909"/>
+	<g id="root-0">
+		<path fill="#EAEAEA" stroke="#666666" d="M20.361,210.138h65.353c0.751,0,1.361,0.61,1.361,1.362v26.776
+			c0,0.752-0.61,1.361-1.361,1.361H20.361c-0.752,0-1.361-0.609-1.361-1.361V211.5C19,210.748,19.609,210.138,20.361,210.138z"/>
+		<g enable-background="new    ">
+			<path d="M36.01,223.218l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+				c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+				c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+				c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+				c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+				c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+				c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+				c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+				c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+				c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+				c-0.318-0.137-0.567-0.343-0.748-0.619C36.114,223.876,36.019,223.565,36.01,223.218z"/>
+			<path d="M43.473,224.888v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+				c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+				c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+				c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H43.473z"/>
+			<path d="M45.633,224.888h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+				s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+				c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V224.888z M45.625,222.977
+				c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+				c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+				c-0.279,0-0.52,0.121-0.723,0.363C45.727,222.167,45.625,222.518,45.625,222.977z"/>
+			<path d="M48.827,223.764l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+				c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+				c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+				s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+				c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128
+				c0.224,0.085,0.389,0.2,0.495,0.346c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454
+				c-0.136-0.109-0.328-0.163-0.576-0.163c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34
+				c0,0.083,0.026,0.157,0.078,0.223c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163
+				c0.452,0.121,0.767,0.219,0.945,0.296c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546
+				c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.794,0.154
+				c-0.489,0-0.862-0.102-1.119-0.305S48.898,224.163,48.827,223.764z"/>
+			<path d="M55.17,223.508l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+				c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+				c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+				c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+				c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+				c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C55.02,224.064,55.125,223.828,55.17,223.508z"/>
+			<path d="M56.337,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+				c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H56.337z"/>
+			<path d="M58.766,220.424v-0.734h0.638v0.734H58.766z M58.766,224.888v-3.766h0.638v3.766H58.766z"/>
+			<path d="M60.964,224.888h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+				s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+				c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V224.888z M60.957,222.977
+				c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+				c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+				c-0.279,0-0.52,0.121-0.723,0.363C61.059,222.167,60.957,222.518,60.957,222.977z"/>
+			<path d="M66.992,223.675l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+				c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+				c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+				c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33
+				c0.234,0,0.434-0.062,0.599-0.185S66.895,223.944,66.992,223.675z M64.896,222.644h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+				c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C65.028,222.052,64.917,222.315,64.896,222.644z"/>
+			<path d="M68.446,224.888v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+				c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+				c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H68.446z"/>
+		</g>
+	</g>
+</g>
+<g enable-background="new    ">
+	<path d="M91.984,252.036l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+		c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+		c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+		c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+		c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+		c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+		c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+		c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+		c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+		c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+		c-0.318-0.137-0.567-0.343-0.748-0.619C92.089,252.695,91.994,252.383,91.984,252.036z"/>
+	<path d="M99.448,253.706v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+		c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+		c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H99.448z"/>
+	<path d="M101.607,253.706h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V253.706z M101.6,251.795c0,0.452,0.062,0.778,0.185,0.979
+		c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364c0.203-0.242,0.305-0.603,0.305-1.083
+		c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351c-0.279,0-0.52,0.121-0.723,0.363
+		C101.702,250.986,101.6,251.336,101.6,251.795z"/>
+	<path d="M104.802,252.582l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S104.873,252.981,104.802,252.582z"/>
+	<path d="M111.145,252.327l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+		c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+		c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+		c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+		c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+		c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C110.994,252.882,111.1,252.646,111.145,252.327z"/>
+	<path d="M112.312,253.706v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+		c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+		c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H112.312z"/>
+	<path d="M114.741,249.242v-0.734h0.638v0.734H114.741z M114.741,253.706v-3.766h0.638v3.766H114.741z"/>
+	<path d="M116.939,253.706h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V253.706z M116.932,251.795
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C117.033,250.986,116.932,251.336,116.932,251.795z"/>
+	<path d="M122.966,252.494l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185
+		S122.87,252.763,122.966,252.494z M120.871,251.462h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C121.003,250.871,120.892,251.133,120.871,251.462z"/>
+	<path d="M125.647,255.234c-0.352-0.445-0.65-0.964-0.894-1.56c-0.243-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.091-1.102,0.273-1.617c0.212-0.598,0.541-1.194,0.985-1.787h0.458c-0.286,0.492-0.475,0.843-0.567,1.053
+		c-0.144,0.326-0.258,0.667-0.34,1.021c-0.102,0.442-0.152,0.887-0.152,1.333c0,1.137,0.353,2.273,1.06,3.408H125.647z"/>
+	<path d="M127.264,255.234h-0.458c0.707-1.135,1.061-2.271,1.061-3.408c0-0.444-0.051-0.885-0.153-1.322
+		c-0.08-0.354-0.192-0.695-0.337-1.021c-0.092-0.213-0.282-0.567-0.571-1.064h0.458c0.444,0.593,0.773,1.189,0.986,1.787
+		c0.182,0.515,0.273,1.054,0.273,1.617c0,0.638-0.123,1.255-0.367,1.851S127.614,254.79,127.264,255.234z"/>
+</g>
+<path d="M163.32,260.968l4.539,2.269l-4.539,2.27V260.968z"/>
+<path marker-end="url(#arrowhead)" d="M167.405,263.237"/>
+<g enable-background="new    ">
+	<path d="M182.941,275.636l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+		c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+		c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+		c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+		c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+		c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+		c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+		c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+		c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+		c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+		c-0.318-0.137-0.567-0.343-0.748-0.619C183.046,276.294,182.951,275.983,182.941,275.636z"/>
+	<path d="M190.394,275.926l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+		c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+		c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+		c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+		c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+		c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C190.243,276.482,190.349,276.246,190.394,275.926z"/>
+	<path d="M191.568,277.306v-5.198h0.638v1.865c0.298-0.345,0.674-0.518,1.127-0.518c0.279,0,0.521,0.055,0.727,0.165
+		s0.353,0.262,0.441,0.456c0.089,0.194,0.133,0.475,0.133,0.844v2.386h-0.638v-2.386c0-0.319-0.069-0.551-0.207-0.697
+		c-0.139-0.146-0.334-0.218-0.587-0.218c-0.189,0-0.367,0.049-0.534,0.147s-0.286,0.231-0.356,0.399s-0.106,0.399-0.106,0.695v2.06
+		H191.568z"/>
+	<path d="M198.184,276.093l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185
+		S198.087,276.362,198.184,276.093z M196.089,275.062h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C196.221,274.47,196.11,274.733,196.089,275.062z"/>
+	<path d="M202.088,277.306v-0.475c-0.239,0.374-0.589,0.56-1.053,0.56c-0.3,0-0.576-0.083-0.828-0.248
+		c-0.251-0.166-0.447-0.396-0.585-0.693c-0.138-0.296-0.208-0.637-0.208-1.023c0-0.375,0.063-0.716,0.188-1.022
+		c0.125-0.306,0.313-0.541,0.564-0.704s0.53-0.245,0.84-0.245c0.227,0,0.429,0.048,0.606,0.144s0.322,0.221,0.433,0.374v-1.865
+		h0.635v5.198H202.088z M200.071,275.426c0,0.482,0.102,0.843,0.305,1.082s0.443,0.358,0.72,0.358c0.279,0,0.516-0.114,0.711-0.342
+		s0.292-0.576,0.292-1.044c0-0.515-0.099-0.893-0.298-1.134c-0.198-0.241-0.443-0.362-0.734-0.362c-0.284,0-0.521,0.116-0.711,0.348
+		C200.166,274.563,200.071,274.928,200.071,275.426z"/>
+	<path d="M206.151,277.306v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+		c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+		c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H206.151z"/>
+	<path d="M207.708,277.306v-5.198h0.638v5.198H207.708z"/>
+	<path d="M211.913,276.093l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185
+		S211.816,276.362,211.913,276.093z M209.818,275.062h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C209.95,274.47,209.839,274.733,209.818,275.062z"/>
+	<path d="M215.239,275.636l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+		c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+		c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+		c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+		c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+		c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+		c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+		c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+		c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+		c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+		c-0.318-0.137-0.567-0.343-0.748-0.619C215.344,276.294,215.249,275.983,215.239,275.636z"/>
+	<path d="M222.703,277.306v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+		c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+		c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H222.703z"/>
+	<path d="M224.862,277.306h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V277.306z M224.855,275.395
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C224.957,274.585,224.855,274.936,224.855,275.395z"/>
+	<path d="M228.057,276.182l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S228.128,276.581,228.057,276.182z"/>
+	<path d="M234.4,275.926l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+		c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+		c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+		c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+		c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+		c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C234.249,276.482,234.355,276.246,234.4,275.926z"/>
+	<path d="M235.567,277.306v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+		c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+		c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H235.567z"/>
+	<path d="M237.996,272.842v-0.734h0.638v0.734H237.996z M237.996,277.306v-3.766h0.638v3.766H237.996z"/>
+	<path d="M240.194,277.306h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V277.306z M240.187,275.395
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C240.288,274.585,240.187,274.936,240.187,275.395z"/>
+	<path d="M246.221,276.093l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185
+		S246.125,276.362,246.221,276.093z M244.126,275.062h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C244.258,274.47,244.147,274.733,244.126,275.062z"/>
+	<path d="M248.902,278.834c-0.352-0.445-0.65-0.964-0.894-1.56c-0.243-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.091-1.102,0.273-1.617c0.212-0.598,0.541-1.194,0.985-1.787h0.458c-0.286,0.492-0.475,0.843-0.567,1.053
+		c-0.144,0.326-0.258,0.667-0.34,1.021c-0.102,0.442-0.152,0.887-0.152,1.333c0,1.137,0.353,2.273,1.06,3.408H248.902z"/>
+	<path d="M250.519,278.834h-0.458c0.707-1.135,1.061-2.271,1.061-3.408c0-0.444-0.051-0.885-0.153-1.322
+		c-0.08-0.354-0.192-0.695-0.337-1.021c-0.092-0.213-0.282-0.567-0.571-1.064h0.458c0.444,0.593,0.773,1.189,0.986,1.787
+		c0.182,0.515,0.273,1.054,0.273,1.617c0,0.638-0.123,1.255-0.367,1.851S250.869,278.389,250.519,278.834z"/>
+</g>
+<path d="M263.392,284.567l4.538,2.269l-4.538,2.269V284.567z"/>
+<path marker-end="url(#arrowhead)" d="M267.476,286.836"/>
+<g enable-background="new    ">
+	<path d="M69.127,300.905v-5.198h0.688v5.198H69.127z"/>
+	<path d="M71.028,300.905v-5.198h1.791c0.404,0,0.713,0.025,0.926,0.074c0.297,0.069,0.552,0.193,0.762,0.373
+		c0.274,0.231,0.479,0.528,0.615,0.888c0.136,0.36,0.204,0.772,0.204,1.235c0,0.395-0.046,0.745-0.138,1.05
+		c-0.092,0.305-0.21,0.557-0.354,0.757c-0.145,0.2-0.302,0.357-0.474,0.472s-0.378,0.202-0.62,0.26
+		c-0.243,0.06-0.521,0.089-0.835,0.089H71.028z M71.716,300.292h1.11c0.343,0,0.611-0.032,0.807-0.096
+		c0.195-0.064,0.35-0.154,0.466-0.27c0.163-0.163,0.29-0.382,0.381-0.658c0.091-0.275,0.137-0.609,0.137-1.001
+		c0-0.544-0.089-0.961-0.268-1.253c-0.179-0.292-0.396-0.488-0.651-0.587c-0.184-0.071-0.481-0.106-0.89-0.106h-1.092V300.292z"/>
+	<path d="M76.194,296.441v-0.734h0.638v0.734H76.194z M76.194,300.905v-3.766h0.638v3.766H76.194z"/>
+	<path d="M77.548,299.781l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S77.62,300.181,77.548,299.781z"/>
+	<path d="M81.435,302.348v-5.208h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+		c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.188,0.631,0.188,0.991
+		c0,0.385-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+		c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H81.435z M82.013,299.044
+		c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+		c0.202-0.24,0.303-0.612,0.303-1.115c0-0.48-0.099-0.839-0.296-1.078s-0.433-0.358-0.708-0.358c-0.272,0-0.512,0.127-0.721,0.381
+		C82.117,298.19,82.013,298.559,82.013,299.044z"/>
+	<path d="M85.236,299.022c0-0.697,0.194-1.214,0.582-1.549c0.324-0.279,0.718-0.418,1.184-0.418c0.518,0,0.941,0.17,1.27,0.509
+		c0.328,0.339,0.493,0.808,0.493,1.406c0,0.485-0.073,0.866-0.218,1.144c-0.145,0.278-0.357,0.494-0.634,0.647
+		c-0.278,0.154-0.581,0.23-0.91,0.23c-0.527,0-0.953-0.169-1.278-0.507C85.398,300.146,85.236,299.658,85.236,299.022z
+		 M85.892,299.022c0,0.482,0.105,0.843,0.315,1.083c0.21,0.24,0.475,0.36,0.794,0.36c0.317,0,0.58-0.121,0.791-0.362
+		s0.316-0.609,0.316-1.103c0-0.466-0.106-0.819-0.317-1.059c-0.212-0.24-0.475-0.36-0.789-0.36c-0.319,0-0.584,0.12-0.794,0.358
+		C85.997,298.18,85.892,298.541,85.892,299.022z"/>
+	<path d="M89.256,299.781l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S89.328,300.181,89.256,299.781z"/>
+	<path d="M95.6,300.441c-0.236,0.201-0.464,0.343-0.682,0.425c-0.219,0.083-0.454,0.124-0.704,0.124
+		c-0.414,0-0.731-0.101-0.954-0.303c-0.222-0.202-0.333-0.46-0.333-0.774c0-0.185,0.042-0.353,0.126-0.505s0.194-0.275,0.33-0.367
+		c0.136-0.092,0.289-0.162,0.459-0.209c0.125-0.033,0.314-0.065,0.567-0.096c0.515-0.062,0.895-0.135,1.138-0.22
+		c0.002-0.087,0.003-0.143,0.003-0.167c0-0.26-0.061-0.443-0.181-0.55c-0.163-0.144-0.405-0.216-0.727-0.216
+		c-0.3,0-0.522,0.053-0.665,0.158c-0.143,0.105-0.249,0.292-0.317,0.559l-0.624-0.085c0.057-0.267,0.15-0.483,0.28-0.647
+		c0.13-0.164,0.318-0.291,0.564-0.379c0.246-0.088,0.53-0.133,0.854-0.133c0.321,0,0.583,0.038,0.783,0.113
+		c0.201,0.076,0.349,0.171,0.443,0.286s0.161,0.259,0.199,0.435c0.021,0.108,0.032,0.305,0.032,0.588v0.851
+		c0,0.593,0.014,0.968,0.041,1.125c0.027,0.157,0.081,0.308,0.161,0.452h-0.667C95.661,300.773,95.619,300.618,95.6,300.441z
+		 M95.547,299.016c-0.232,0.094-0.58,0.175-1.042,0.241c-0.263,0.038-0.448,0.081-0.557,0.128c-0.109,0.047-0.193,0.116-0.252,0.208
+		c-0.059,0.091-0.088,0.192-0.088,0.303c0,0.17,0.064,0.312,0.193,0.425s0.317,0.17,0.565,0.17c0.246,0,0.465-0.054,0.656-0.161
+		s0.332-0.255,0.422-0.441c0.068-0.144,0.103-0.357,0.103-0.638V299.016z"/>
+	<path d="M97.77,300.905h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V300.905z M97.763,298.994
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C97.864,298.185,97.763,298.536,97.763,298.994z"/>
+	<path d="M101.206,300.905v-5.198h0.638v5.198H101.206z"/>
+	<path d="M105.411,299.693l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185
+		S105.314,299.962,105.411,299.693z M103.315,298.661h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C103.447,298.07,103.336,298.333,103.315,298.661z"/>
+	<path d="M110.109,302.434c-0.352-0.445-0.65-0.964-0.894-1.56c-0.243-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.091-1.102,0.273-1.617c0.212-0.598,0.541-1.194,0.985-1.787h0.458c-0.286,0.492-0.475,0.843-0.567,1.053
+		c-0.144,0.326-0.258,0.667-0.34,1.021c-0.102,0.442-0.152,0.887-0.152,1.333c0,1.137,0.353,2.273,1.06,3.408H110.109z"/>
+	<path d="M111.052,299.781l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S111.123,300.181,111.052,299.781z"/>
+	<path d="M117.406,300.905v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+		c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+		c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H117.406z"/>
+	<path d="M119.565,300.905h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V300.905z M119.558,298.994
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C119.66,298.185,119.558,298.536,119.558,298.994z"/>
+	<path d="M122.76,299.781l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S122.831,300.181,122.76,299.781z"/>
+	<path d="M129.103,299.526l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+		c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+		c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+		c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+		c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+		c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C128.952,300.082,129.058,299.845,129.103,299.526z"/>
+	<path d="M130.27,300.905v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+		c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+		c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H130.27z"/>
+	<path d="M132.699,296.441v-0.734h0.638v0.734H132.699z M132.699,300.905v-3.766h0.638v3.766H132.699z"/>
+	<path d="M134.308,302.348v-5.208h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+		c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.188,0.631,0.188,0.991
+		c0,0.385-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+		c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H134.308z M134.886,299.044
+		c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+		c0.202-0.24,0.303-0.612,0.303-1.115c0-0.48-0.099-0.839-0.296-1.078s-0.433-0.358-0.708-0.358c-0.272,0-0.512,0.127-0.721,0.381
+		C134.991,298.19,134.886,298.559,134.886,299.044z"/>
+	<path d="M139.74,300.334l0.092,0.563c-0.18,0.038-0.34,0.057-0.482,0.057c-0.231,0-0.411-0.037-0.539-0.11
+		c-0.128-0.073-0.218-0.17-0.27-0.289c-0.052-0.12-0.078-0.371-0.078-0.753v-2.167h-0.468v-0.497h0.468v-0.932l0.635-0.383v1.315
+		h0.642v0.497h-0.642v2.202c0,0.182,0.011,0.299,0.034,0.351c0.022,0.052,0.059,0.093,0.11,0.124s0.124,0.046,0.218,0.046
+		C139.531,300.359,139.625,300.351,139.74,300.334z"/>
+	<path d="M140.368,296.441v-0.734h0.638v0.734H140.368z M140.368,300.905v-3.766h0.638v3.766H140.368z"/>
+	<path d="M141.74,299.022c0-0.697,0.194-1.214,0.582-1.549c0.324-0.279,0.718-0.418,1.184-0.418c0.518,0,0.941,0.17,1.27,0.509
+		c0.328,0.339,0.493,0.808,0.493,1.406c0,0.485-0.073,0.866-0.218,1.144c-0.145,0.278-0.357,0.494-0.634,0.647
+		c-0.278,0.154-0.581,0.23-0.91,0.23c-0.527,0-0.953-0.169-1.278-0.507C141.903,300.146,141.74,299.658,141.74,299.022z
+		 M142.396,299.022c0,0.482,0.105,0.843,0.315,1.083c0.21,0.24,0.475,0.36,0.794,0.36c0.317,0,0.58-0.121,0.791-0.362
+		s0.316-0.609,0.316-1.103c0-0.466-0.106-0.819-0.317-1.059c-0.212-0.24-0.475-0.36-0.789-0.36c-0.319,0-0.584,0.12-0.794,0.358
+		C142.501,298.18,142.396,298.541,142.396,299.022z"/>
+	<path d="M146.016,300.905v-3.766h0.575v0.536c0.276-0.414,0.676-0.621,1.198-0.621c0.227,0,0.436,0.041,0.626,0.123
+		c0.19,0.082,0.333,0.188,0.427,0.321c0.094,0.132,0.161,0.29,0.198,0.472c0.024,0.118,0.036,0.325,0.036,0.62v2.315h-0.638v-2.291
+		c0-0.26-0.025-0.454-0.075-0.583c-0.049-0.129-0.138-0.232-0.264-0.309s-0.274-0.115-0.445-0.115c-0.272,0-0.506,0.086-0.704,0.259
+		c-0.198,0.172-0.296,0.5-0.296,0.982v2.057H146.016z"/>
+	<path d="M150.473,302.434h-0.458c0.707-1.135,1.061-2.271,1.061-3.408c0-0.444-0.051-0.885-0.153-1.322
+		c-0.08-0.354-0.192-0.695-0.337-1.021c-0.092-0.213-0.282-0.567-0.571-1.064h0.458c0.444,0.593,0.773,1.189,0.986,1.787
+		c0.182,0.515,0.273,1.054,0.273,1.617c0,0.638-0.123,1.255-0.367,1.851S150.823,301.989,150.473,302.434z"/>
+</g>
+<path d="M57.123,312.705l-4.539-2.269l4.539-2.269V312.705z"/>
+<path marker-end="url(#arrowhead)" d="M53.038,310.436"/>
+<g enable-background="new    ">
+	<path d="M256.71,322.835l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+		c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+		c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+		c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+		c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+		c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+		c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+		c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+		c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+		c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+		c-0.318-0.137-0.567-0.343-0.748-0.619C256.814,323.494,256.719,323.182,256.71,322.835z"/>
+	<path d="M264.283,323.292l0.66,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.749-0.525,1.269-0.525c0.503,0,0.915,0.171,1.234,0.514c0.319,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.024,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.599-0.185
+		S264.187,323.562,264.283,323.292z M262.188,322.261h2.103c-0.028-0.317-0.109-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.54,0.098-0.739,0.294C262.32,321.669,262.209,321.932,262.188,322.261z"/>
+	<path d="M267.138,323.934l0.092,0.563c-0.18,0.038-0.34,0.057-0.482,0.057c-0.231,0-0.411-0.037-0.539-0.11
+		c-0.128-0.073-0.218-0.17-0.27-0.289c-0.052-0.12-0.078-0.371-0.078-0.753v-2.167h-0.468v-0.497h0.468v-0.932l0.635-0.383v1.315
+		h0.642v0.497h-0.642v2.202c0,0.182,0.011,0.299,0.034,0.351c0.022,0.052,0.059,0.093,0.11,0.124s0.124,0.046,0.218,0.046
+		C266.929,323.959,267.022,323.951,267.138,323.934z"/>
+	<path d="M269.524,323.381l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S269.595,323.78,269.524,323.381z"/>
+	<path d="M275.878,324.505v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+		c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+		c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H275.878z"/>
+	<path d="M278.038,324.505h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V324.505z M278.03,322.594
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C278.132,321.785,278.03,322.135,278.03,322.594z"/>
+	<path d="M281.232,323.381l0.631-0.099c0.036,0.253,0.134,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.206-0.411-0.358
+		s-0.14-0.321-0.14-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.406-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.778,0.128c0.224,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.624,0.085c-0.029-0.194-0.111-0.345-0.247-0.454c-0.136-0.109-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.048-0.627,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.767,0.219,0.945,0.296
+		c0.179,0.077,0.319,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.119-0.305S281.303,323.78,281.232,323.381z"/>
+	<path d="M287.575,323.125l0.628,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+		c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+		c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.575-0.229,0.898-0.229c0.409,0,0.744,0.104,1.003,0.31
+		c0.26,0.207,0.427,0.501,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.314-0.571c-0.15-0.127-0.332-0.191-0.544-0.191
+		c-0.321,0-0.583,0.115-0.784,0.346c-0.201,0.23-0.301,0.595-0.301,1.094c0,0.506,0.097,0.874,0.291,1.103
+		c0.194,0.229,0.447,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C287.424,323.681,287.53,323.445,287.575,323.125z"/>
+	<path d="M288.742,324.505v-3.766h0.574v0.571c0.146-0.267,0.282-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+		c0.215,0,0.434,0.069,0.656,0.206l-0.22,0.592c-0.156-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+		c-0.111,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H288.742z"/>
+	<path d="M291.171,320.041v-0.734h0.638v0.734H291.171z M291.171,324.505v-3.766h0.638v3.766H291.171z"/>
+	<path d="M292.78,325.948v-5.208h0.582v0.489c0.137-0.191,0.292-0.335,0.464-0.431c0.173-0.096,0.382-0.144,0.628-0.144
+		c0.321,0,0.605,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.125,0.301,0.188,0.631,0.188,0.991
+		c0,0.385-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+		c-0.212,0-0.403-0.045-0.572-0.135c-0.169-0.09-0.308-0.203-0.417-0.34v1.833H292.78z M293.358,322.644
+		c0,0.484,0.098,0.843,0.294,1.074c0.196,0.231,0.434,0.348,0.712,0.348c0.284,0,0.526-0.12,0.729-0.36
+		c0.202-0.24,0.303-0.612,0.303-1.115c0-0.48-0.099-0.839-0.296-1.078s-0.433-0.358-0.708-0.358c-0.272,0-0.512,0.127-0.721,0.381
+		C293.463,321.79,293.358,322.159,293.358,322.644z"/>
+	<path d="M298.212,323.934l0.092,0.563c-0.18,0.038-0.34,0.057-0.482,0.057c-0.231,0-0.411-0.037-0.539-0.11
+		c-0.128-0.073-0.218-0.17-0.27-0.289c-0.052-0.12-0.078-0.371-0.078-0.753v-2.167h-0.468v-0.497h0.468v-0.932l0.635-0.383v1.315
+		h0.642v0.497h-0.642v2.202c0,0.182,0.011,0.299,0.034,0.351c0.022,0.052,0.059,0.093,0.11,0.124s0.124,0.046,0.218,0.046
+		C298.003,323.959,298.097,323.951,298.212,323.934z"/>
+	<path d="M298.84,320.041v-0.734h0.638v0.734H298.84z M298.84,324.505v-3.766h0.638v3.766H298.84z"/>
+	<path d="M300.212,322.622c0-0.697,0.194-1.214,0.582-1.549c0.324-0.279,0.718-0.418,1.184-0.418c0.518,0,0.941,0.17,1.27,0.509
+		c0.328,0.339,0.493,0.808,0.493,1.406c0,0.485-0.073,0.866-0.218,1.144c-0.145,0.278-0.357,0.494-0.634,0.647
+		c-0.278,0.154-0.581,0.23-0.91,0.23c-0.527,0-0.953-0.169-1.278-0.507C300.375,323.745,300.212,323.258,300.212,322.622z
+		 M300.868,322.622c0,0.482,0.105,0.843,0.315,1.083c0.21,0.24,0.475,0.36,0.794,0.36c0.317,0,0.58-0.121,0.791-0.362
+		s0.316-0.609,0.316-1.103c0-0.466-0.106-0.819-0.317-1.059c-0.212-0.24-0.475-0.36-0.789-0.36c-0.319,0-0.584,0.12-0.794,0.358
+		C300.973,321.779,300.868,322.14,300.868,322.622z"/>
+	<path d="M304.488,324.505v-3.766h0.575v0.536c0.276-0.414,0.676-0.621,1.198-0.621c0.227,0,0.436,0.041,0.625,0.123
+		c0.19,0.082,0.333,0.188,0.428,0.321c0.094,0.132,0.16,0.29,0.198,0.472c0.024,0.118,0.036,0.325,0.036,0.62v2.315h-0.639v-2.291
+		c0-0.26-0.025-0.454-0.074-0.583c-0.05-0.129-0.139-0.232-0.265-0.309c-0.126-0.077-0.274-0.115-0.445-0.115
+		c-0.272,0-0.506,0.086-0.704,0.259c-0.198,0.172-0.296,0.5-0.296,0.982v2.057H304.488z"/>
+	<path d="M310.743,324.505v-5.198h0.688v5.198H310.743z"/>
+	<path d="M312.644,324.505v-5.198h1.79c0.404,0,0.713,0.025,0.926,0.074c0.298,0.069,0.553,0.193,0.763,0.373
+		c0.274,0.231,0.479,0.528,0.615,0.888s0.204,0.772,0.204,1.235c0,0.395-0.047,0.745-0.139,1.05
+		c-0.092,0.305-0.211,0.557-0.354,0.757c-0.145,0.2-0.302,0.357-0.474,0.472s-0.378,0.202-0.62,0.26
+		c-0.243,0.06-0.521,0.089-0.835,0.089H312.644z M313.332,323.892h1.109c0.343,0,0.611-0.032,0.807-0.096
+		c0.195-0.064,0.35-0.154,0.467-0.27c0.162-0.163,0.289-0.382,0.381-0.658c0.091-0.275,0.137-0.609,0.137-1.001
+		c0-0.544-0.09-0.961-0.268-1.253c-0.18-0.292-0.396-0.488-0.651-0.587c-0.185-0.071-0.481-0.106-0.89-0.106h-1.092V323.892z"/>
+	<path d="M317.811,320.041v-0.734h0.638v0.734H317.811z M317.811,324.505v-3.766h0.638v3.766H317.811z"/>
+	<path d="M319.164,323.381l0.631-0.099c0.036,0.253,0.135,0.447,0.297,0.582s0.388,0.202,0.679,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.087-0.057-0.305-0.128-0.652-0.216c-0.468-0.118-0.792-0.22-0.973-0.307c-0.182-0.086-0.318-0.206-0.412-0.358
+		c-0.093-0.152-0.14-0.321-0.14-0.505c0-0.168,0.038-0.323,0.115-0.466s0.182-0.262,0.313-0.356c0.1-0.073,0.234-0.135,0.406-0.186
+		s0.355-0.076,0.552-0.076c0.296,0,0.555,0.042,0.778,0.128c0.223,0.085,0.389,0.2,0.494,0.346c0.106,0.145,0.18,0.339,0.221,0.583
+		l-0.625,0.085c-0.028-0.194-0.11-0.345-0.246-0.454c-0.137-0.109-0.328-0.163-0.576-0.163c-0.293,0-0.502,0.048-0.627,0.146
+		c-0.126,0.097-0.188,0.21-0.188,0.34c0,0.083,0.026,0.157,0.078,0.223c0.052,0.069,0.134,0.125,0.245,0.17
+		c0.063,0.023,0.251,0.078,0.563,0.163c0.452,0.121,0.768,0.219,0.945,0.296c0.179,0.077,0.318,0.188,0.42,0.335
+		s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.186,0.601s-0.303,0.333-0.537,0.436c-0.234,0.103-0.499,0.154-0.795,0.154
+		c-0.488,0-0.861-0.102-1.118-0.305S319.235,323.78,319.164,323.381z"/>
+	<path d="M323.051,325.948v-5.208h0.581v0.489c0.138-0.191,0.292-0.335,0.464-0.431c0.174-0.096,0.383-0.144,0.629-0.144
+		c0.32,0,0.604,0.083,0.85,0.248c0.246,0.166,0.432,0.399,0.557,0.701c0.126,0.301,0.188,0.631,0.188,0.991
+		c0,0.385-0.069,0.732-0.207,1.041c-0.139,0.309-0.339,0.545-0.603,0.709c-0.264,0.164-0.541,0.246-0.832,0.246
+		c-0.213,0-0.403-0.045-0.572-0.135c-0.17-0.09-0.309-0.203-0.417-0.34v1.833H323.051z M323.629,322.644
+		c0,0.484,0.098,0.843,0.294,1.074s0.434,0.348,0.712,0.348c0.284,0,0.527-0.12,0.729-0.36c0.203-0.24,0.304-0.612,0.304-1.115
+		c0-0.48-0.099-0.839-0.296-1.078s-0.434-0.358-0.707-0.358c-0.272,0-0.513,0.127-0.722,0.381
+		C323.732,321.79,323.629,322.159,323.629,322.644z"/>
+	<path d="M326.852,322.622c0-0.697,0.193-1.214,0.582-1.549c0.323-0.279,0.718-0.418,1.184-0.418c0.518,0,0.941,0.17,1.27,0.509
+		c0.328,0.339,0.492,0.808,0.492,1.406c0,0.485-0.072,0.866-0.218,1.144s-0.356,0.494-0.634,0.647
+		c-0.278,0.154-0.582,0.23-0.91,0.23c-0.527,0-0.953-0.169-1.278-0.507S326.852,323.258,326.852,322.622z M327.508,322.622
+		c0,0.482,0.104,0.843,0.314,1.083c0.211,0.24,0.476,0.36,0.795,0.36c0.316,0,0.58-0.121,0.791-0.362
+		c0.21-0.241,0.315-0.609,0.315-1.103c0-0.466-0.106-0.819-0.317-1.059c-0.212-0.24-0.475-0.36-0.789-0.36
+		c-0.319,0-0.584,0.12-0.795,0.358C327.612,321.779,327.508,322.14,327.508,322.622z"/>
+	<path d="M330.872,323.381l0.632-0.099c0.035,0.253,0.134,0.447,0.295,0.582c0.162,0.135,0.389,0.202,0.68,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.088-0.057-0.306-0.128-0.652-0.216c-0.469-0.118-0.793-0.22-0.975-0.307c-0.18-0.086-0.317-0.206-0.41-0.358
+		c-0.094-0.152-0.141-0.321-0.141-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.405-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.777,0.128c0.225,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.623,0.085c-0.029-0.194-0.111-0.345-0.247-0.454s-0.328-0.163-0.576-0.163
+		c-0.293,0-0.503,0.048-0.628,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.025,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.244,0.17c0.064,0.023,0.252,0.078,0.564,0.163c0.451,0.121,0.766,0.219,0.944,0.296
+		s0.319,0.188,0.421,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.187,0.601s-0.304,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.49,0-0.863-0.102-1.119-0.305S330.943,323.78,330.872,323.381z"/>
+	<path d="M337.215,324.041c-0.236,0.201-0.463,0.343-0.682,0.425c-0.219,0.083-0.453,0.124-0.704,0.124
+		c-0.413,0-0.731-0.101-0.954-0.303c-0.222-0.202-0.333-0.46-0.333-0.774c0-0.185,0.042-0.353,0.126-0.505s0.193-0.275,0.33-0.367
+		c0.136-0.092,0.289-0.162,0.459-0.209c0.125-0.033,0.314-0.065,0.567-0.096c0.515-0.062,0.895-0.135,1.138-0.22
+		c0.002-0.087,0.004-0.143,0.004-0.167c0-0.26-0.061-0.443-0.182-0.55c-0.162-0.144-0.404-0.216-0.727-0.216
+		c-0.3,0-0.521,0.053-0.664,0.158c-0.144,0.105-0.249,0.292-0.318,0.559l-0.623-0.085c0.057-0.267,0.15-0.483,0.279-0.647
+		c0.131-0.164,0.318-0.291,0.564-0.379c0.246-0.088,0.53-0.133,0.854-0.133c0.321,0,0.583,0.038,0.783,0.113
+		c0.201,0.076,0.349,0.171,0.443,0.286s0.161,0.259,0.198,0.435c0.021,0.108,0.032,0.305,0.032,0.588v0.851
+		c0,0.593,0.014,0.968,0.041,1.125c0.026,0.157,0.081,0.308,0.161,0.452h-0.666C337.277,324.373,337.234,324.218,337.215,324.041z
+		 M337.162,322.615c-0.231,0.094-0.579,0.175-1.042,0.241c-0.263,0.038-0.448,0.081-0.557,0.128s-0.192,0.116-0.252,0.208
+		c-0.06,0.091-0.089,0.192-0.089,0.303c0,0.17,0.064,0.312,0.193,0.425s0.317,0.17,0.565,0.17c0.246,0,0.465-0.054,0.656-0.161
+		s0.332-0.255,0.422-0.441c0.068-0.144,0.103-0.357,0.103-0.638V322.615z"/>
+	<path d="M339.386,324.505h-0.593v-5.198h0.639v1.854c0.27-0.338,0.613-0.507,1.031-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394s0.237,0.373,0.313,0.612s0.113,0.494,0.113,0.766c0,0.646-0.159,1.144-0.479,1.496
+		c-0.318,0.353-0.701,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V324.505z M339.379,322.594
+		c0,0.452,0.061,0.778,0.184,0.979c0.201,0.329,0.473,0.493,0.816,0.493c0.278,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.278,0-0.52,0.121-0.723,0.363S339.379,322.135,339.379,322.594z"/>
+	<path d="M342.821,324.505v-5.198h0.638v5.198H342.821z"/>
+	<path d="M347.026,323.292l0.659,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.169-1.31-0.509c-0.323-0.339-0.484-0.815-0.484-1.427c0-0.634,0.163-1.125,0.489-1.475
+		c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.915,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C346.798,323.758,346.929,323.562,347.026,323.292z M344.931,322.261h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.739,0.294C345.063,321.669,344.952,321.932,344.931,322.261z"/>
+</g>
+<path d="M547.494,331.767l4.539,2.269l-4.539,2.269V331.767z"/>
+<path marker-end="url(#arrowhead)" d="M551.578,334.036"/>
+<g enable-background="new    ">
+	<path d="M294.85,346.435l0.649-0.057c0.031,0.26,0.102,0.473,0.214,0.64c0.112,0.167,0.287,0.302,0.523,0.404
+		c0.236,0.103,0.502,0.154,0.798,0.154c0.262,0,0.494-0.039,0.695-0.117c0.201-0.078,0.351-0.185,0.449-0.321
+		c0.098-0.136,0.147-0.284,0.147-0.445c0-0.163-0.047-0.306-0.142-0.427c-0.095-0.122-0.25-0.224-0.468-0.307
+		c-0.139-0.054-0.448-0.139-0.925-0.253s-0.812-0.223-1.003-0.325c-0.248-0.13-0.433-0.291-0.555-0.484
+		c-0.122-0.192-0.183-0.408-0.183-0.647c0-0.262,0.074-0.508,0.223-0.736s0.366-0.401,0.652-0.52s0.604-0.177,0.954-0.177
+		c0.385,0,0.725,0.062,1.019,0.186c0.294,0.125,0.521,0.307,0.679,0.548c0.158,0.241,0.243,0.514,0.255,0.819l-0.66,0.049
+		c-0.036-0.328-0.155-0.577-0.36-0.744c-0.205-0.168-0.506-0.252-0.906-0.252c-0.416,0-0.719,0.076-0.91,0.229
+		c-0.19,0.153-0.285,0.336-0.285,0.551c0,0.187,0.067,0.341,0.202,0.461c0.133,0.121,0.479,0.244,1.037,0.371
+		c0.559,0.126,0.943,0.237,1.151,0.332c0.302,0.14,0.526,0.316,0.67,0.53s0.216,0.46,0.216,0.739c0,0.276-0.079,0.537-0.237,0.782
+		c-0.159,0.245-0.386,0.435-0.683,0.571c-0.297,0.136-0.631,0.204-1.002,0.204c-0.47,0-0.864-0.069-1.182-0.206
+		c-0.318-0.137-0.567-0.343-0.748-0.619C294.954,347.093,294.859,346.782,294.85,346.435z"/>
+	<path d="M302.313,348.104v-0.553c-0.293,0.426-0.691,0.638-1.195,0.638c-0.222,0-0.43-0.042-0.622-0.127
+		c-0.193-0.085-0.336-0.192-0.429-0.321s-0.159-0.287-0.197-0.474c-0.026-0.125-0.039-0.324-0.039-0.596v-2.333h0.638v2.088
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.168,0.125,0.3,0.255,0.396s0.291,0.144,0.482,0.144c0.191,0,0.371-0.049,0.539-0.147
+		c0.168-0.098,0.287-0.231,0.356-0.4s0.104-0.414,0.104-0.736v-2.018h0.638v3.766H302.313z"/>
+	<path d="M304.473,348.104h-0.592v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.232,0,0.451,0.047,0.658,0.14
+		s0.377,0.225,0.511,0.394c0.133,0.169,0.238,0.373,0.313,0.612s0.114,0.494,0.114,0.766c0,0.646-0.16,1.144-0.479,1.496
+		c-0.319,0.353-0.702,0.528-1.148,0.528c-0.444,0-0.793-0.186-1.046-0.557V348.104z M304.465,346.193
+		c0,0.452,0.062,0.778,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.305-0.603,0.305-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.431-0.351-0.708-0.351
+		c-0.279,0-0.52,0.121-0.723,0.363C304.567,345.384,304.465,345.735,304.465,346.193z"/>
+	<path d="M307.667,346.98l0.632-0.099c0.035,0.253,0.134,0.447,0.295,0.582c0.162,0.135,0.389,0.202,0.68,0.202
+		c0.293,0,0.511-0.06,0.652-0.179c0.142-0.12,0.213-0.259,0.213-0.42c0-0.144-0.063-0.257-0.188-0.34
+		c-0.088-0.057-0.306-0.128-0.652-0.216c-0.469-0.118-0.793-0.22-0.975-0.307c-0.18-0.086-0.317-0.206-0.41-0.358
+		c-0.094-0.152-0.141-0.321-0.141-0.505c0-0.168,0.039-0.323,0.115-0.466c0.077-0.143,0.182-0.262,0.314-0.356
+		c0.099-0.073,0.234-0.135,0.405-0.186s0.355-0.076,0.552-0.076c0.295,0,0.555,0.042,0.777,0.128c0.225,0.085,0.389,0.2,0.495,0.346
+		c0.106,0.145,0.18,0.339,0.22,0.583l-0.623,0.085c-0.029-0.194-0.111-0.345-0.247-0.454s-0.328-0.163-0.576-0.163
+		c-0.293,0-0.503,0.048-0.628,0.146c-0.125,0.097-0.188,0.21-0.188,0.34c0,0.083,0.025,0.157,0.078,0.223
+		c0.052,0.069,0.133,0.125,0.244,0.17c0.064,0.023,0.252,0.078,0.564,0.163c0.451,0.121,0.766,0.219,0.944,0.296
+		s0.319,0.188,0.421,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.187,0.601s-0.304,0.333-0.537,0.436
+		c-0.234,0.103-0.499,0.154-0.794,0.154c-0.49,0-0.863-0.102-1.119-0.305S307.738,347.38,307.667,346.98z"/>
+	<path d="M314.01,346.725l0.629,0.082c-0.069,0.433-0.244,0.771-0.527,1.016c-0.282,0.245-0.629,0.367-1.041,0.367
+		c-0.515,0-0.93-0.168-1.242-0.505c-0.313-0.337-0.47-0.82-0.47-1.449c0-0.406,0.067-0.762,0.202-1.067
+		c0.135-0.305,0.34-0.534,0.615-0.687c0.275-0.152,0.574-0.229,0.898-0.229c0.409,0,0.744,0.104,1.004,0.31
+		c0.26,0.207,0.426,0.501,0.5,0.881l-0.621,0.096c-0.059-0.253-0.164-0.443-0.313-0.571c-0.15-0.127-0.331-0.191-0.544-0.191
+		c-0.322,0-0.583,0.115-0.784,0.346c-0.2,0.23-0.302,0.595-0.302,1.094c0,0.506,0.098,0.874,0.291,1.103
+		c0.194,0.229,0.447,0.344,0.76,0.344c0.25,0,0.459-0.077,0.627-0.23C313.859,347.281,313.965,347.044,314.01,346.725z"/>
+	<path d="M315.178,348.104v-3.766h0.574v0.571c0.146-0.267,0.281-0.443,0.406-0.528c0.123-0.085,0.26-0.128,0.408-0.128
+		c0.216,0,0.435,0.069,0.656,0.206l-0.22,0.592c-0.155-0.092-0.312-0.138-0.468-0.138c-0.14,0-0.265,0.042-0.376,0.126
+		c-0.11,0.083-0.19,0.2-0.237,0.349c-0.071,0.227-0.106,0.475-0.106,0.745v1.971H315.178z"/>
+	<path d="M317.605,343.641v-0.734h0.639v0.734H317.605z M317.605,348.104v-3.766h0.639v3.766H317.605z"/>
+	<path d="M319.805,348.104h-0.593v-5.198h0.638v1.854c0.27-0.338,0.613-0.507,1.032-0.507c0.231,0,0.45,0.047,0.657,0.14
+		s0.377,0.225,0.512,0.394c0.133,0.169,0.237,0.373,0.313,0.612c0.076,0.239,0.114,0.494,0.114,0.766
+		c0,0.646-0.159,1.144-0.479,1.496c-0.318,0.353-0.701,0.528-1.148,0.528c-0.443,0-0.793-0.186-1.045-0.557V348.104z
+		 M319.797,346.193c0,0.452,0.062,0.778,0.185,0.979c0.2,0.329,0.473,0.493,0.815,0.493c0.279,0,0.52-0.121,0.723-0.364
+		c0.203-0.242,0.306-0.603,0.306-1.083c0-0.492-0.098-0.854-0.292-1.088c-0.195-0.234-0.432-0.351-0.708-0.351
+		c-0.278,0-0.521,0.121-0.724,0.363S319.797,345.735,319.797,346.193z"/>
+	<path d="M325.832,346.892l0.659,0.082c-0.104,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.077,0.319
+		c-0.551,0-0.988-0.169-1.311-0.509c-0.322-0.339-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475
+		c0.326-0.35,0.748-0.525,1.269-0.525c0.503,0,0.915,0.171,1.233,0.514c0.32,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.001,0.094-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.233,0,0.434-0.062,0.599-0.185
+		C325.604,347.357,325.734,347.161,325.832,346.892z M323.736,345.86h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.738,0.294C323.868,345.269,323.758,345.532,323.736,345.86z"/>
+	<path d="M328.512,349.633c-0.352-0.445-0.649-0.964-0.893-1.56c-0.244-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.091-1.102,0.273-1.617c0.212-0.598,0.541-1.194,0.984-1.787h0.458c-0.286,0.492-0.476,0.843-0.567,1.053
+		c-0.145,0.326-0.258,0.667-0.34,1.021c-0.102,0.442-0.152,0.887-0.152,1.333c0,1.137,0.353,2.273,1.06,3.408H328.512z"/>
+	<path d="M330.129,349.633h-0.457c0.707-1.135,1.061-2.271,1.061-3.408c0-0.444-0.052-0.885-0.153-1.322
+		c-0.08-0.354-0.192-0.695-0.337-1.021c-0.092-0.213-0.282-0.567-0.57-1.064h0.457c0.444,0.593,0.773,1.189,0.986,1.787
+		c0.182,0.515,0.272,1.054,0.272,1.617c0,0.638-0.122,1.255-0.367,1.851S330.479,349.188,330.129,349.633z"/>
+</g>
+<path d="M354.158,355.366l4.539,2.269l-4.539,2.269V355.366z"/>
+<path marker-end="url(#arrowhead)" d="M358.244,357.635"/>
+<g enable-background="new    ">
+	<path d="M390.182,369.173c0-0.863,0.232-1.538,0.695-2.026c0.463-0.488,1.063-0.732,1.795-0.732c0.48,0,0.912,0.115,1.297,0.344
+		c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.395c0,0.527-0.107,0.999-0.32,1.415s-0.514,0.731-0.904,0.945
+		c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.355c-0.385-0.236-0.676-0.559-0.875-0.968
+		C390.281,370.063,390.182,369.63,390.182,369.173z M390.893,369.184c0,0.626,0.168,1.12,0.504,1.48
+		c0.338,0.36,0.76,0.541,1.268,0.541c0.518,0,0.943-0.182,1.279-0.546c0.334-0.364,0.502-0.88,0.502-1.549
+		c0-0.423-0.072-0.792-0.215-1.108c-0.145-0.315-0.354-0.56-0.629-0.734c-0.275-0.173-0.584-0.26-0.926-0.26
+		c-0.488,0-0.906,0.167-1.258,0.501S390.893,368.402,390.893,369.184z"/>
+	<path d="M395.959,371.705v-3.766h0.574v0.536c0.277-0.414,0.676-0.621,1.197-0.621c0.229,0,0.436,0.041,0.627,0.123
+		c0.189,0.082,0.332,0.188,0.428,0.321c0.094,0.132,0.16,0.29,0.197,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.637v-2.291
+		c0-0.26-0.025-0.454-0.074-0.583c-0.051-0.129-0.139-0.232-0.266-0.309c-0.125-0.077-0.273-0.115-0.443-0.115
+		c-0.273,0-0.508,0.086-0.705,0.259s-0.295,0.5-0.295,0.982v2.057H395.959z"/>
+	<path d="M400.07,371.705v-5.198h0.707l2.73,4.081v-4.081h0.658v5.198h-0.705l-2.73-4.084v4.084H400.07z"/>
+	<path d="M407.818,370.493l0.66,0.082c-0.105,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.988-0.169-1.311-0.509c-0.322-0.339-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475
+		c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.914,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.002,0.094-0.004,0.17h-2.809c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33
+		c0.234,0,0.434-0.062,0.6-0.185C407.59,370.958,407.721,370.762,407.818,370.493z M405.723,369.461h2.104
+		c-0.029-0.317-0.109-0.555-0.242-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.738,0.294
+		C405.855,368.87,405.744,369.132,405.723,369.461z"/>
+	<path d="M408.854,371.705l1.375-1.957l-1.271-1.809h0.797l0.578,0.883c0.109,0.168,0.195,0.309,0.262,0.422
+		c0.105-0.156,0.201-0.294,0.287-0.415l0.635-0.89h0.764l-1.303,1.773l1.4,1.993h-0.783l-0.773-1.17l-0.205-0.316l-0.988,1.486
+		H408.854z"/>
+	<path d="M414.303,371.134l0.092,0.563c-0.18,0.038-0.34,0.057-0.48,0.057c-0.232,0-0.412-0.037-0.539-0.11
+		c-0.129-0.073-0.219-0.17-0.27-0.289c-0.053-0.12-0.078-0.371-0.078-0.753v-2.167h-0.469v-0.497h0.469v-0.932l0.635-0.383v1.315
+		h0.641v0.497h-0.641v2.202c0,0.182,0.01,0.299,0.033,0.351c0.021,0.052,0.059,0.093,0.109,0.124s0.123,0.046,0.219,0.046
+		C414.094,371.159,414.188,371.151,414.303,371.134z"/>
+	<path d="M416.146,373.233c-0.352-0.445-0.65-0.964-0.893-1.56c-0.244-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.09-1.102,0.273-1.617c0.213-0.598,0.541-1.194,0.984-1.787h0.457c-0.285,0.492-0.475,0.843-0.566,1.053
+		c-0.145,0.326-0.258,0.667-0.34,1.021c-0.102,0.442-0.152,0.887-0.152,1.333c0,1.137,0.354,2.273,1.059,3.408H416.146z"/>
+	<path d="M419.572,371.705h-0.639v-4.067c-0.154,0.146-0.355,0.293-0.604,0.44c-0.25,0.146-0.475,0.256-0.672,0.33v-0.617
+		c0.355-0.167,0.668-0.371,0.936-0.61c0.268-0.238,0.455-0.47,0.566-0.695h0.412V371.705z"/>
+	<path d="M421.803,373.233h-0.459c0.707-1.135,1.061-2.271,1.061-3.408c0-0.444-0.051-0.885-0.152-1.322
+		c-0.08-0.354-0.193-0.695-0.336-1.021c-0.094-0.213-0.283-0.567-0.572-1.064h0.459c0.443,0.593,0.771,1.189,0.984,1.787
+		c0.182,0.515,0.273,1.054,0.273,1.617c0,0.638-0.123,1.255-0.367,1.851S422.152,372.789,421.803,373.233z"/>
+</g>
+<path d="M450.826,378.965l4.539,2.27l-4.539,2.269V378.965z"/>
+<path marker-end="url(#arrowhead)" d="M454.91,381.235"/>
+<g enable-background="new    ">
+	<path d="M486.85,392.772c0-0.863,0.232-1.538,0.695-2.026c0.463-0.488,1.063-0.732,1.795-0.732c0.48,0,0.912,0.115,1.297,0.344
+		c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.395c0,0.527-0.107,0.999-0.32,1.415s-0.514,0.731-0.904,0.945
+		c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.355c-0.385-0.236-0.676-0.559-0.875-0.968
+		C486.949,393.661,486.85,393.229,486.85,392.772z M487.561,392.783c0,0.626,0.168,1.12,0.504,1.48
+		c0.338,0.36,0.76,0.541,1.268,0.541c0.518,0,0.943-0.182,1.279-0.546c0.334-0.364,0.502-0.88,0.502-1.549
+		c0-0.423-0.072-0.792-0.215-1.108c-0.145-0.315-0.354-0.56-0.629-0.734c-0.275-0.173-0.584-0.26-0.926-0.26
+		c-0.488,0-0.906,0.167-1.258,0.501S487.561,392,487.561,392.783z"/>
+	<path d="M492.627,395.304v-3.766h0.574v0.536c0.277-0.414,0.676-0.621,1.197-0.621c0.229,0,0.436,0.041,0.627,0.123
+		c0.189,0.082,0.332,0.188,0.428,0.321c0.094,0.132,0.16,0.29,0.197,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.637v-2.291
+		c0-0.26-0.025-0.454-0.074-0.583c-0.051-0.129-0.139-0.232-0.266-0.309c-0.125-0.077-0.273-0.115-0.443-0.115
+		c-0.273,0-0.508,0.086-0.705,0.259s-0.295,0.5-0.295,0.982v2.057H492.627z"/>
+	<path d="M496.738,395.304v-5.198h0.707l2.73,4.081v-4.081h0.658v5.198h-0.705l-2.73-4.084v4.084H496.738z"/>
+	<path d="M504.486,394.091l0.66,0.082c-0.105,0.385-0.297,0.684-0.578,0.897c-0.281,0.212-0.641,0.319-1.078,0.319
+		c-0.551,0-0.988-0.169-1.311-0.509c-0.322-0.339-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475
+		c0.326-0.35,0.75-0.525,1.27-0.525c0.504,0,0.914,0.171,1.234,0.514c0.318,0.343,0.479,0.825,0.479,1.447
+		c0,0.038-0.002,0.094-0.004,0.17h-2.809c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33
+		c0.234,0,0.434-0.062,0.6-0.185C504.258,394.557,504.389,394.36,504.486,394.091z M502.391,393.06h2.104
+		c-0.029-0.317-0.109-0.555-0.242-0.713c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.098-0.738,0.294
+		C502.523,392.468,502.412,392.731,502.391,393.06z"/>
+	<path d="M505.521,395.304l1.375-1.957l-1.271-1.809h0.797l0.578,0.883c0.109,0.168,0.195,0.309,0.262,0.422
+		c0.105-0.156,0.201-0.294,0.287-0.415l0.635-0.89h0.764l-1.303,1.773l1.4,1.993h-0.783l-0.773-1.17l-0.205-0.316l-0.988,1.486
+		H505.521z"/>
+	<path d="M510.971,394.733l0.092,0.563c-0.18,0.038-0.34,0.057-0.48,0.057c-0.232,0-0.412-0.037-0.539-0.11
+		c-0.129-0.073-0.219-0.17-0.27-0.289c-0.053-0.12-0.078-0.371-0.078-0.753v-2.167h-0.469v-0.497h0.469v-0.932l0.635-0.383v1.315
+		h0.641v0.497h-0.641v2.202c0,0.182,0.01,0.299,0.033,0.351c0.021,0.052,0.059,0.093,0.109,0.124s0.123,0.046,0.219,0.046
+		C510.762,394.758,510.855,394.75,510.971,394.733z"/>
+	<path d="M512.814,396.832c-0.352-0.445-0.65-0.964-0.893-1.56c-0.244-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.09-1.102,0.273-1.617c0.213-0.598,0.541-1.194,0.984-1.787h0.457c-0.285,0.492-0.475,0.843-0.566,1.053
+		c-0.145,0.326-0.258,0.667-0.34,1.021c-0.102,0.442-0.152,0.887-0.152,1.333c0,1.137,0.354,2.273,1.059,3.408H512.814z"/>
+	<path d="M516.24,395.304h-0.639v-4.067c-0.154,0.146-0.355,0.293-0.604,0.44c-0.25,0.146-0.475,0.256-0.672,0.33v-0.617
+		c0.355-0.167,0.668-0.371,0.936-0.61c0.268-0.238,0.455-0.47,0.566-0.695h0.412V395.304z"/>
+	<path d="M518.471,396.832h-0.459c0.707-1.135,1.061-2.271,1.061-3.408c0-0.444-0.051-0.885-0.152-1.322
+		c-0.08-0.354-0.193-0.695-0.336-1.021c-0.094-0.213-0.283-0.567-0.572-1.064h0.459c0.443,0.593,0.771,1.189,0.984,1.787
+		c0.182,0.515,0.273,1.054,0.273,1.617c0,0.638-0.123,1.255-0.367,1.851S518.82,396.387,518.471,396.832z"/>
+</g>
+<path d="M547.494,402.564l4.539,2.27l-4.539,2.27V402.564z"/>
+<path marker-end="url(#arrowhead)" d="M551.578,404.834"/>
+<g enable-background="new    ">
+	<path d="M390.182,416.371c0-0.862,0.232-1.537,0.695-2.025s1.063-0.732,1.795-0.732c0.48,0,0.912,0.115,1.297,0.344
+		c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.396c0,0.526-0.107,0.999-0.32,1.415s-0.514,0.73-0.904,0.944
+		c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.355c-0.385-0.236-0.676-0.559-0.875-0.967
+		C390.281,417.261,390.182,416.828,390.182,416.371z M390.893,416.383c0,0.626,0.168,1.119,0.504,1.48
+		c0.338,0.359,0.76,0.54,1.268,0.54c0.518,0,0.943-0.183,1.279-0.546c0.334-0.364,0.502-0.881,0.502-1.549
+		c0-0.424-0.072-0.793-0.215-1.109c-0.145-0.314-0.354-0.56-0.629-0.733c-0.275-0.173-0.584-0.261-0.926-0.261
+		c-0.488,0-0.906,0.168-1.258,0.502S390.893,415.6,390.893,416.383z"/>
+	<path d="M395.959,418.903v-3.766h0.574v0.536c0.277-0.414,0.676-0.621,1.197-0.621c0.229,0,0.436,0.041,0.627,0.123
+		c0.189,0.081,0.332,0.188,0.428,0.32c0.094,0.133,0.16,0.289,0.197,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.637v-2.29
+		c0-0.26-0.025-0.455-0.074-0.584c-0.051-0.129-0.139-0.231-0.266-0.309c-0.125-0.076-0.273-0.115-0.443-0.115
+		c-0.273,0-0.508,0.087-0.705,0.26c-0.197,0.172-0.295,0.5-0.295,0.981v2.057H395.959z"/>
+	<path d="M400.07,418.903v-5.198h0.707l2.73,4.082v-4.082h0.658v5.198h-0.705l-2.73-4.085v4.085H400.07z"/>
+	<path d="M407.818,417.691l0.66,0.081c-0.105,0.386-0.297,0.685-0.578,0.897c-0.281,0.212-0.641,0.318-1.078,0.318
+		c-0.551,0-0.988-0.17-1.311-0.509s-0.484-0.815-0.484-1.427c0-0.634,0.164-1.125,0.49-1.475c0.326-0.351,0.75-0.525,1.27-0.525
+		c0.504,0,0.914,0.172,1.234,0.514c0.318,0.344,0.479,0.826,0.479,1.447c0,0.037-0.002,0.094-0.004,0.17h-2.809
+		c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C407.59,418.156,407.721,417.96,407.818,417.691z M405.723,416.659h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+		c-0.203-0.245-0.467-0.368-0.791-0.368c-0.293,0-0.539,0.098-0.738,0.294S405.744,416.33,405.723,416.659z"/>
+	<path d="M408.854,418.903l1.375-1.957l-1.271-1.809h0.797l0.578,0.883c0.109,0.168,0.195,0.309,0.262,0.423
+		c0.105-0.156,0.201-0.295,0.287-0.416l0.635-0.89h0.764l-1.303,1.772l1.4,1.993h-0.783l-0.773-1.17l-0.205-0.315l-0.988,1.485
+		H408.854z"/>
+	<path d="M414.303,418.332l0.092,0.564c-0.18,0.037-0.34,0.057-0.48,0.057c-0.232,0-0.412-0.037-0.539-0.109
+		c-0.129-0.074-0.219-0.17-0.27-0.289c-0.053-0.12-0.078-0.371-0.078-0.754v-2.166h-0.469v-0.497h0.469v-0.933l0.635-0.383v1.315
+		h0.641v0.497h-0.641v2.201c0,0.182,0.01,0.299,0.033,0.352c0.021,0.052,0.059,0.093,0.109,0.123
+		c0.051,0.031,0.123,0.047,0.219,0.047C414.094,418.357,414.188,418.35,414.303,418.332z"/>
+	<path d="M416.146,420.432c-0.352-0.445-0.65-0.965-0.893-1.561c-0.244-0.596-0.365-1.213-0.365-1.851
+		c0-0.563,0.09-1.102,0.273-1.616c0.213-0.599,0.541-1.194,0.984-1.787h0.457c-0.285,0.491-0.475,0.842-0.566,1.053
+		c-0.145,0.326-0.258,0.666-0.34,1.021c-0.102,0.441-0.152,0.887-0.152,1.332c0,1.138,0.354,2.273,1.059,3.408H416.146z"/>
+	<path d="M420.521,418.29v0.613h-3.436c-0.004-0.153,0.021-0.302,0.074-0.443c0.088-0.233,0.229-0.464,0.422-0.691
+		c0.191-0.227,0.471-0.489,0.834-0.787c0.564-0.463,0.947-0.83,1.145-1.101c0.199-0.271,0.299-0.527,0.299-0.768
+		c0-0.253-0.09-0.467-0.271-0.641s-0.416-0.26-0.707-0.26c-0.307,0-0.553,0.092-0.738,0.276c-0.184,0.185-0.277,0.439-0.279,0.766
+		l-0.656-0.067c0.045-0.489,0.215-0.862,0.508-1.119c0.293-0.256,0.686-0.385,1.18-0.385c0.498,0,0.895,0.139,1.184,0.416
+		c0.291,0.275,0.438,0.619,0.438,1.027c0,0.209-0.043,0.412-0.129,0.613c-0.084,0.201-0.227,0.413-0.424,0.635
+		c-0.197,0.223-0.525,0.527-0.982,0.915c-0.383,0.321-0.629,0.54-0.738,0.654s-0.199,0.229-0.27,0.346H420.521z"/>
+	<path d="M421.803,420.432h-0.459c0.707-1.135,1.061-2.271,1.061-3.408c0-0.443-0.051-0.885-0.152-1.322
+		c-0.08-0.354-0.193-0.694-0.336-1.021c-0.094-0.213-0.283-0.567-0.572-1.063h0.459c0.443,0.593,0.771,1.188,0.984,1.787
+		c0.182,0.515,0.273,1.054,0.273,1.616c0,0.638-0.123,1.255-0.367,1.851S422.152,419.986,421.803,420.432z"/>
+</g>
+<path d="M450.826,426.165l4.539,2.269l-4.539,2.27V426.165z"/>
+<path marker-end="url(#arrowhead)" d="M454.91,428.434"/>
+<g enable-background="new    ">
+	<path d="M486.85,439.972c0-0.863,0.232-1.538,0.695-2.026s1.063-0.732,1.795-0.732c0.48,0,0.912,0.114,1.297,0.344
+		c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.396c0,0.527-0.107,0.999-0.32,1.415s-0.514,0.73-0.904,0.944
+		c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.354c-0.385-0.236-0.676-0.56-0.875-0.968
+		C486.949,440.86,486.85,440.428,486.85,439.972z M487.561,439.982c0,0.626,0.168,1.119,0.504,1.479
+		c0.338,0.361,0.76,0.541,1.268,0.541c0.518,0,0.943-0.182,1.279-0.546c0.334-0.364,0.502-0.881,0.502-1.55
+		c0-0.423-0.072-0.792-0.215-1.107c-0.145-0.315-0.354-0.561-0.629-0.734s-0.584-0.261-0.926-0.261
+		c-0.488,0-0.906,0.168-1.258,0.502C487.734,438.642,487.561,439.199,487.561,439.982z"/>
+	<path d="M492.627,442.503v-3.766h0.574v0.535c0.277-0.413,0.676-0.62,1.197-0.62c0.229,0,0.436,0.041,0.627,0.122
+		c0.189,0.082,0.332,0.188,0.428,0.321c0.094,0.132,0.16,0.289,0.197,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.637v-2.29
+		c0-0.261-0.025-0.455-0.074-0.584c-0.051-0.129-0.139-0.231-0.266-0.309c-0.125-0.076-0.273-0.115-0.443-0.115
+		c-0.273,0-0.508,0.087-0.705,0.259c-0.197,0.173-0.295,0.5-0.295,0.982v2.057H492.627z"/>
+	<path d="M496.738,442.503v-5.198h0.707l2.73,4.081v-4.081h0.658v5.198h-0.705l-2.73-4.085v4.085H496.738z"/>
+	<path d="M504.486,441.29l0.66,0.082c-0.105,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+		c-0.551,0-0.988-0.17-1.311-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.164-1.125,0.49-1.476c0.326-0.35,0.75-0.524,1.27-0.524
+		c0.504,0,0.914,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446c0,0.038-0.002,0.095-0.004,0.17h-2.809
+		c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C504.258,441.756,504.389,441.56,504.486,441.29z M502.391,440.259h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.738,0.295S502.412,439.93,502.391,440.259z"/>
+	<path d="M505.521,442.503l1.375-1.957l-1.271-1.809h0.797L507,439.62c0.109,0.168,0.195,0.309,0.262,0.422
+		c0.105-0.155,0.201-0.294,0.287-0.414l0.635-0.891h0.764l-1.303,1.773l1.4,1.992h-0.783l-0.773-1.17l-0.205-0.315l-0.988,1.485
+		H505.521z"/>
+	<path d="M510.971,441.932l0.092,0.564c-0.18,0.037-0.34,0.057-0.48,0.057c-0.232,0-0.412-0.037-0.539-0.11
+		c-0.129-0.073-0.219-0.169-0.27-0.289c-0.053-0.119-0.078-0.37-0.078-0.753v-2.167h-0.469v-0.496h0.469v-0.933l0.635-0.383v1.315
+		h0.641v0.496h-0.641v2.202c0,0.183,0.01,0.299,0.033,0.352c0.021,0.052,0.059,0.093,0.109,0.124
+		c0.051,0.03,0.123,0.046,0.219,0.046C510.762,441.957,510.855,441.948,510.971,441.932z"/>
+	<path d="M512.814,444.031c-0.352-0.444-0.65-0.965-0.893-1.561c-0.244-0.596-0.365-1.212-0.365-1.851
+		c0-0.563,0.09-1.102,0.273-1.617c0.213-0.598,0.541-1.193,0.984-1.786h0.457c-0.285,0.491-0.475,0.843-0.566,1.053
+		c-0.145,0.326-0.258,0.667-0.34,1.021c-0.102,0.441-0.152,0.886-0.152,1.333c0,1.137,0.354,2.272,1.059,3.407H512.814z"/>
+	<path d="M517.189,441.89v0.613h-3.436c-0.004-0.153,0.021-0.302,0.074-0.443c0.088-0.233,0.229-0.464,0.422-0.691
+		c0.191-0.227,0.471-0.489,0.834-0.787c0.564-0.463,0.947-0.83,1.145-1.101c0.199-0.271,0.299-0.526,0.299-0.768
+		c0-0.253-0.09-0.467-0.271-0.641c-0.182-0.173-0.416-0.26-0.707-0.26c-0.307,0-0.553,0.092-0.738,0.276
+		c-0.184,0.185-0.277,0.439-0.279,0.766l-0.656-0.067c0.045-0.489,0.215-0.862,0.508-1.118c0.293-0.257,0.686-0.385,1.18-0.385
+		c0.498,0,0.895,0.138,1.184,0.414c0.291,0.277,0.438,0.62,0.438,1.028c0,0.208-0.043,0.413-0.129,0.613
+		c-0.084,0.201-0.227,0.413-0.424,0.635c-0.197,0.223-0.525,0.527-0.982,0.915c-0.383,0.321-0.629,0.54-0.738,0.654
+		s-0.199,0.229-0.27,0.346H517.189z"/>
+	<path d="M518.471,444.031h-0.459c0.707-1.135,1.061-2.271,1.061-3.407c0-0.444-0.051-0.886-0.152-1.323
+		c-0.08-0.354-0.193-0.694-0.336-1.021c-0.094-0.213-0.283-0.567-0.572-1.063h0.459c0.443,0.593,0.771,1.188,0.984,1.786
+		c0.182,0.516,0.273,1.055,0.273,1.617c0,0.639-0.123,1.255-0.367,1.851S518.82,443.587,518.471,444.031z"/>
+</g>
+<path d="M547.494,449.765l4.539,2.269l-4.539,2.27V449.765z"/>
+<path marker-end="url(#arrowhead)" d="M551.578,452.033"/>
+<g enable-background="new    ">
+	<path d="M323.684,464.979l0.632-0.1c0.036,0.253,0.134,0.447,0.296,0.582s0.389,0.202,0.68,0.202c0.293,0,0.51-0.06,0.652-0.18
+		c0.141-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34c-0.087-0.057-0.306-0.129-0.652-0.217
+		c-0.468-0.118-0.792-0.22-0.974-0.307c-0.181-0.086-0.318-0.205-0.411-0.358c-0.093-0.152-0.14-0.32-0.14-0.505
+		c0-0.168,0.038-0.323,0.115-0.466c0.076-0.144,0.182-0.262,0.313-0.356c0.099-0.073,0.234-0.136,0.405-0.187
+		c0.172-0.051,0.355-0.076,0.553-0.076c0.295,0,0.555,0.043,0.777,0.128c0.224,0.085,0.389,0.2,0.494,0.346
+		c0.107,0.146,0.18,0.34,0.221,0.583l-0.624,0.085c-0.028-0.193-0.11-0.345-0.247-0.454c-0.136-0.108-0.328-0.163-0.576-0.163
+		c-0.293,0-0.502,0.049-0.627,0.146c-0.125,0.098-0.188,0.211-0.188,0.341c0,0.083,0.025,0.157,0.078,0.224
+		c0.051,0.068,0.133,0.125,0.244,0.17c0.063,0.023,0.252,0.078,0.563,0.163c0.452,0.12,0.767,0.219,0.944,0.296
+		c0.18,0.077,0.319,0.188,0.421,0.335s0.152,0.329,0.152,0.546c0,0.213-0.062,0.413-0.187,0.602
+		c-0.123,0.188-0.303,0.333-0.537,0.436s-0.498,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.118-0.305
+		C323.919,465.68,323.756,465.378,323.684,464.979z"/>
+	<path d="M330.038,466.103v-0.553c-0.293,0.425-0.691,0.638-1.194,0.638c-0.223,0-0.43-0.042-0.623-0.128
+		c-0.192-0.085-0.336-0.191-0.429-0.32s-0.159-0.287-0.196-0.474c-0.026-0.125-0.039-0.323-0.039-0.596v-2.333h0.638v2.089
+		c0,0.333,0.013,0.558,0.039,0.674c0.04,0.167,0.126,0.299,0.255,0.395c0.131,0.096,0.291,0.144,0.482,0.144
+		s0.371-0.049,0.539-0.146c0.168-0.099,0.287-0.231,0.356-0.401c0.069-0.169,0.104-0.414,0.104-0.735v-2.018h0.639v3.766H330.038z"
+		/>
+	<path d="M332.197,466.103h-0.592v-5.198h0.639v1.854c0.27-0.338,0.613-0.507,1.031-0.507c0.232,0,0.451,0.047,0.658,0.14
+		c0.207,0.094,0.377,0.225,0.51,0.394c0.134,0.17,0.238,0.373,0.314,0.612c0.075,0.238,0.113,0.494,0.113,0.766
+		c0,0.646-0.16,1.145-0.479,1.496c-0.319,0.353-0.702,0.528-1.148,0.528c-0.445,0-0.793-0.186-1.047-0.557V466.103z M332.19,464.191
+		c0,0.451,0.062,0.777,0.185,0.979c0.201,0.329,0.473,0.493,0.815,0.493c0.278,0,0.521-0.121,0.724-0.363s0.305-0.604,0.305-1.084
+		c0-0.491-0.098-0.854-0.293-1.088c-0.195-0.234-0.431-0.352-0.707-0.352c-0.279,0-0.52,0.121-0.723,0.364
+		C332.292,463.383,332.19,463.733,332.19,464.191z"/>
+	<path d="M335.393,464.979l0.631-0.1c0.035,0.253,0.135,0.447,0.296,0.582c0.162,0.135,0.388,0.202,0.679,0.202
+		c0.293,0,0.512-0.06,0.652-0.18c0.143-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34
+		c-0.088-0.057-0.305-0.129-0.652-0.217c-0.469-0.118-0.793-0.22-0.974-0.307c-0.181-0.086-0.317-0.205-0.411-0.358
+		c-0.094-0.152-0.141-0.32-0.141-0.505c0-0.168,0.039-0.323,0.115-0.466c0.078-0.144,0.182-0.262,0.314-0.356
+		c0.1-0.073,0.234-0.136,0.406-0.187c0.171-0.051,0.355-0.076,0.551-0.076c0.296,0,0.555,0.043,0.778,0.128s0.389,0.2,0.495,0.346
+		c0.105,0.146,0.18,0.34,0.22,0.583l-0.624,0.085c-0.029-0.193-0.111-0.345-0.246-0.454c-0.137-0.108-0.328-0.163-0.576-0.163
+		c-0.293,0-0.503,0.049-0.628,0.146c-0.126,0.098-0.188,0.211-0.188,0.341c0,0.083,0.026,0.157,0.078,0.224
+		c0.053,0.068,0.134,0.125,0.245,0.17c0.063,0.023,0.251,0.078,0.563,0.163c0.451,0.12,0.767,0.219,0.945,0.296
+		c0.178,0.077,0.318,0.188,0.42,0.335s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.186,0.602
+		c-0.125,0.188-0.304,0.333-0.537,0.436c-0.234,0.103-0.5,0.154-0.795,0.154c-0.489,0-0.862-0.102-1.119-0.305
+		C335.627,465.68,335.463,465.378,335.393,464.979z"/>
+	<path d="M341.735,464.724l0.628,0.081c-0.068,0.433-0.244,0.771-0.527,1.016c-0.281,0.245-0.629,0.367-1.04,0.367
+		c-0.515,0-0.93-0.168-1.243-0.505c-0.313-0.337-0.469-0.819-0.469-1.448c0-0.407,0.066-0.763,0.201-1.067s0.34-0.534,0.615-0.687
+		s0.575-0.229,0.898-0.229c0.41,0,0.744,0.104,1.004,0.311s0.427,0.5,0.5,0.881l-0.62,0.096c-0.06-0.253-0.164-0.443-0.313-0.571
+		c-0.15-0.127-0.332-0.191-0.545-0.191c-0.321,0-0.582,0.115-0.783,0.346s-0.302,0.596-0.302,1.094c0,0.506,0.097,0.874,0.291,1.104
+		c0.194,0.229,0.446,0.344,0.759,0.344c0.25,0,0.459-0.077,0.627-0.23C341.584,465.278,341.69,465.042,341.735,464.724z"/>
+	<path d="M342.902,466.103v-3.766h0.574v0.571c0.146-0.268,0.281-0.443,0.406-0.528c0.124-0.085,0.26-0.128,0.409-0.128
+		c0.215,0,0.434,0.068,0.656,0.206l-0.22,0.592c-0.156-0.092-0.313-0.139-0.469-0.139c-0.139,0-0.264,0.042-0.375,0.126
+		s-0.191,0.2-0.238,0.35c-0.07,0.227-0.105,0.475-0.105,0.744v1.972H342.902z"/>
+	<path d="M345.331,461.639v-0.734h0.638v0.734H345.331z M345.331,466.103v-3.766h0.638v3.766H345.331z"/>
+	<path d="M346.94,467.546v-5.209h0.582v0.489c0.137-0.191,0.291-0.335,0.464-0.431s0.382-0.144,0.628-0.144
+		c0.321,0,0.604,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.188,0.632,0.188,0.991
+		c0,0.386-0.069,0.732-0.208,1.041c-0.138,0.309-0.339,0.545-0.603,0.709s-0.541,0.246-0.831,0.246
+		c-0.213,0-0.404-0.045-0.573-0.135s-0.308-0.203-0.416-0.34v1.833H346.94z M347.519,464.241c0,0.484,0.098,0.843,0.294,1.074
+		s0.434,0.348,0.713,0.348c0.284,0,0.526-0.12,0.729-0.36c0.202-0.239,0.304-0.611,0.304-1.115c0-0.479-0.099-0.839-0.297-1.077
+		c-0.197-0.239-0.433-0.358-0.707-0.358c-0.271,0-0.513,0.127-0.722,0.381C347.623,463.388,347.519,463.757,347.519,464.241z"/>
+	<path d="M352.372,465.531l0.092,0.564c-0.18,0.037-0.34,0.057-0.481,0.057c-0.232,0-0.412-0.037-0.539-0.11
+		c-0.128-0.073-0.218-0.169-0.27-0.289c-0.052-0.119-0.078-0.37-0.078-0.753v-2.167h-0.468v-0.496h0.468v-0.933l0.635-0.383v1.315
+		h0.642v0.496h-0.642v2.202c0,0.183,0.011,0.299,0.033,0.352c0.022,0.052,0.06,0.093,0.11,0.124c0.051,0.03,0.123,0.046,0.218,0.046
+		C352.163,465.557,352.256,465.548,352.372,465.531z"/>
+	<path d="M353,461.639v-0.734h0.638v0.734H353z M353,466.103v-3.766h0.638v3.766H353z"/>
+	<path d="M354.372,464.22c0-0.697,0.193-1.214,0.581-1.55c0.324-0.278,0.719-0.418,1.185-0.418c0.518,0,0.94,0.17,1.27,0.509
+		c0.328,0.339,0.492,0.808,0.492,1.406c0,0.484-0.072,0.865-0.218,1.144c-0.146,0.277-0.356,0.493-0.635,0.646
+		c-0.277,0.153-0.581,0.23-0.909,0.23c-0.527,0-0.953-0.169-1.278-0.507S354.372,464.855,354.372,464.22z M355.028,464.22
+		c0,0.482,0.104,0.844,0.315,1.083c0.21,0.24,0.475,0.36,0.794,0.36c0.316,0,0.58-0.121,0.791-0.362
+		c0.21-0.24,0.315-0.608,0.315-1.103c0-0.465-0.106-0.818-0.317-1.058c-0.212-0.24-0.475-0.36-0.789-0.36
+		c-0.319,0-0.584,0.119-0.794,0.358C355.133,463.377,355.028,463.737,355.028,464.22z"/>
+	<path d="M358.647,466.103v-3.766h0.574v0.535c0.277-0.413,0.677-0.62,1.198-0.62c0.228,0,0.436,0.041,0.626,0.122
+		c0.19,0.082,0.333,0.188,0.428,0.321c0.095,0.132,0.16,0.289,0.198,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.638v-2.29
+		c0-0.261-0.025-0.455-0.074-0.584c-0.05-0.129-0.138-0.231-0.265-0.309c-0.126-0.076-0.274-0.115-0.444-0.115
+		c-0.272,0-0.507,0.087-0.704,0.259c-0.197,0.173-0.296,0.5-0.296,0.982v2.057H358.647z"/>
+	<path d="M362.866,466.103v-0.727h0.728v0.727H362.866z"/>
+	<path d="M364.785,466.103v-5.198h1.79c0.404,0,0.713,0.025,0.926,0.075c0.298,0.068,0.552,0.192,0.762,0.372
+		c0.274,0.231,0.479,0.527,0.615,0.888s0.204,0.772,0.204,1.236c0,0.395-0.046,0.744-0.139,1.049
+		c-0.092,0.306-0.21,0.558-0.354,0.757c-0.144,0.2-0.302,0.357-0.473,0.472c-0.172,0.115-0.379,0.202-0.621,0.261
+		c-0.242,0.06-0.521,0.089-0.835,0.089H364.785z M365.473,465.489h1.109c0.343,0,0.612-0.032,0.807-0.096
+		c0.195-0.063,0.351-0.153,0.467-0.27c0.163-0.163,0.29-0.383,0.381-0.658s0.137-0.608,0.137-1.001c0-0.544-0.089-0.962-0.268-1.254
+		s-0.396-0.487-0.65-0.587c-0.185-0.07-0.481-0.105-0.891-0.105h-1.092V465.489z"/>
+	<path d="M369.951,461.639v-0.734h0.638v0.734H369.951z M369.951,466.103v-3.766h0.638v3.766H369.951z"/>
+	<path d="M371.306,464.979l0.631-0.1c0.035,0.253,0.134,0.447,0.296,0.582s0.389,0.202,0.679,0.202c0.294,0,0.511-0.06,0.652-0.18
+		c0.143-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34c-0.088-0.057-0.305-0.129-0.652-0.217
+		c-0.468-0.118-0.793-0.22-0.974-0.307c-0.181-0.086-0.317-0.205-0.411-0.358c-0.094-0.152-0.14-0.32-0.14-0.505
+		c0-0.168,0.038-0.323,0.115-0.466c0.076-0.144,0.181-0.262,0.313-0.356c0.1-0.073,0.234-0.136,0.406-0.187
+		c0.171-0.051,0.354-0.076,0.551-0.076c0.296,0,0.555,0.043,0.778,0.128s0.389,0.2,0.495,0.346s0.18,0.34,0.22,0.583l-0.624,0.085
+		c-0.028-0.193-0.11-0.345-0.247-0.454c-0.136-0.108-0.327-0.163-0.576-0.163c-0.293,0-0.502,0.049-0.627,0.146
+		c-0.125,0.098-0.188,0.211-0.188,0.341c0,0.083,0.026,0.157,0.078,0.224c0.052,0.068,0.134,0.125,0.245,0.17
+		c0.063,0.023,0.252,0.078,0.563,0.163c0.451,0.12,0.767,0.219,0.945,0.296c0.178,0.077,0.318,0.188,0.42,0.335
+		s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.187,0.602c-0.124,0.188-0.303,0.333-0.537,0.436
+		c-0.233,0.103-0.498,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.118-0.305C371.54,465.68,371.376,465.378,371.306,464.979z"/>
+	<path d="M375.191,467.546v-5.209h0.582v0.489c0.137-0.191,0.291-0.335,0.464-0.431s0.382-0.144,0.628-0.144
+		c0.321,0,0.604,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.188,0.632,0.188,0.991
+		c0,0.386-0.069,0.732-0.208,1.041c-0.138,0.309-0.339,0.545-0.603,0.709s-0.541,0.246-0.831,0.246
+		c-0.213,0-0.404-0.045-0.573-0.135s-0.308-0.203-0.416-0.34v1.833H375.191z M375.77,464.241c0,0.484,0.098,0.843,0.294,1.074
+		s0.434,0.348,0.713,0.348c0.284,0,0.526-0.12,0.729-0.36c0.202-0.239,0.304-0.611,0.304-1.115c0-0.479-0.099-0.839-0.297-1.077
+		c-0.197-0.239-0.433-0.358-0.707-0.358c-0.271,0-0.513,0.127-0.722,0.381C375.874,463.388,375.77,463.757,375.77,464.241z"/>
+	<path d="M378.992,464.22c0-0.697,0.193-1.214,0.581-1.55c0.324-0.278,0.719-0.418,1.185-0.418c0.518,0,0.94,0.17,1.27,0.509
+		c0.328,0.339,0.492,0.808,0.492,1.406c0,0.484-0.072,0.865-0.218,1.144c-0.146,0.277-0.356,0.493-0.635,0.646
+		c-0.277,0.153-0.581,0.23-0.909,0.23c-0.527,0-0.953-0.169-1.278-0.507S378.992,464.855,378.992,464.22z M379.648,464.22
+		c0,0.482,0.104,0.844,0.315,1.083c0.21,0.24,0.475,0.36,0.794,0.36c0.316,0,0.58-0.121,0.791-0.362
+		c0.21-0.24,0.315-0.608,0.315-1.103c0-0.465-0.106-0.818-0.317-1.058c-0.212-0.24-0.475-0.36-0.789-0.36
+		c-0.319,0-0.584,0.119-0.794,0.358C379.753,463.377,379.648,463.737,379.648,464.22z"/>
+	<path d="M383.013,464.979l0.631-0.1c0.035,0.253,0.134,0.447,0.296,0.582s0.389,0.202,0.679,0.202c0.294,0,0.511-0.06,0.652-0.18
+		c0.143-0.119,0.213-0.259,0.213-0.42c0-0.144-0.063-0.258-0.188-0.34c-0.088-0.057-0.305-0.129-0.652-0.217
+		c-0.468-0.118-0.793-0.22-0.974-0.307c-0.181-0.086-0.317-0.205-0.411-0.358c-0.094-0.152-0.14-0.32-0.14-0.505
+		c0-0.168,0.038-0.323,0.115-0.466c0.076-0.144,0.181-0.262,0.313-0.356c0.1-0.073,0.234-0.136,0.406-0.187
+		c0.171-0.051,0.354-0.076,0.551-0.076c0.296,0,0.555,0.043,0.778,0.128s0.389,0.2,0.495,0.346s0.18,0.34,0.22,0.583l-0.624,0.085
+		c-0.028-0.193-0.11-0.345-0.247-0.454c-0.136-0.108-0.327-0.163-0.576-0.163c-0.293,0-0.502,0.049-0.627,0.146
+		c-0.125,0.098-0.188,0.211-0.188,0.341c0,0.083,0.026,0.157,0.078,0.224c0.052,0.068,0.134,0.125,0.245,0.17
+		c0.063,0.023,0.252,0.078,0.563,0.163c0.451,0.12,0.767,0.219,0.945,0.296c0.178,0.077,0.318,0.188,0.42,0.335
+		s0.152,0.329,0.152,0.546c0,0.213-0.063,0.413-0.187,0.602c-0.124,0.188-0.303,0.333-0.537,0.436
+		c-0.233,0.103-0.498,0.154-0.794,0.154c-0.489,0-0.862-0.102-1.118-0.305C383.247,465.68,383.083,465.378,383.013,464.979z"/>
+	<path d="M389.477,464.89l0.659,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.17-1.31-0.509c-0.323-0.339-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476
+		c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.915,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+		c0,0.038-0.001,0.095-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C389.248,465.355,389.379,465.159,389.477,464.89z M387.381,463.858h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.739,0.295C387.513,463.268,387.402,463.529,387.381,463.858z"/>
+	<path d="M392.156,467.631c-0.353-0.444-0.65-0.965-0.894-1.561s-0.365-1.212-0.365-1.851c0-0.563,0.091-1.102,0.273-1.617
+		c0.213-0.598,0.541-1.193,0.985-1.786h0.457c-0.285,0.491-0.475,0.843-0.566,1.053c-0.145,0.326-0.258,0.667-0.341,1.021
+		c-0.102,0.441-0.152,0.886-0.152,1.333c0,1.137,0.354,2.272,1.06,3.407H392.156z"/>
+	<path d="M393.773,467.631h-0.458c0.707-1.135,1.061-2.271,1.061-3.407c0-0.444-0.051-0.886-0.152-1.323
+		c-0.081-0.354-0.193-0.694-0.337-1.021c-0.093-0.213-0.283-0.567-0.571-1.063h0.458c0.444,0.593,0.772,1.188,0.985,1.786
+		c0.182,0.516,0.272,1.055,0.272,1.617c0,0.639-0.122,1.255-0.366,1.851C394.42,466.666,394.123,467.187,393.773,467.631z"/>
+</g>
+<path d="M171.489,477.902l-4.538-2.27l4.538-2.269V477.902z"/>
+<path marker-end="url(#arrowhead)" d="M167.405,475.633"/>
+<g enable-background="new    ">
+	<path d="M390.182,487.171c0-0.863,0.232-1.538,0.695-2.026s1.063-0.732,1.795-0.732c0.48,0,0.912,0.114,1.297,0.344
+		c0.387,0.229,0.68,0.549,0.881,0.959c0.203,0.41,0.305,0.875,0.305,1.396c0,0.527-0.107,0.999-0.32,1.415s-0.514,0.73-0.904,0.944
+		c-0.389,0.214-0.811,0.321-1.262,0.321c-0.488,0-0.926-0.118-1.313-0.354c-0.385-0.236-0.676-0.56-0.875-0.968
+		C390.281,488.06,390.182,487.627,390.182,487.171z M390.893,487.182c0,0.626,0.168,1.119,0.504,1.479
+		c0.338,0.361,0.76,0.541,1.268,0.541c0.518,0,0.943-0.182,1.279-0.546c0.334-0.364,0.502-0.881,0.502-1.55
+		c0-0.423-0.072-0.792-0.215-1.107c-0.145-0.315-0.354-0.561-0.629-0.734s-0.584-0.261-0.926-0.261
+		c-0.488,0-0.906,0.168-1.258,0.502C391.066,485.841,390.893,486.398,390.893,487.182z"/>
+	<path d="M395.959,489.702v-3.766h0.574v0.535c0.277-0.413,0.676-0.62,1.197-0.62c0.229,0,0.436,0.041,0.627,0.122
+		c0.189,0.082,0.332,0.188,0.428,0.321c0.094,0.132,0.16,0.289,0.197,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.637v-2.29
+		c0-0.261-0.025-0.455-0.074-0.584c-0.051-0.129-0.139-0.231-0.266-0.309c-0.125-0.076-0.273-0.115-0.443-0.115
+		c-0.273,0-0.508,0.087-0.705,0.259c-0.197,0.173-0.295,0.5-0.295,0.982v2.057H395.959z"/>
+	<path d="M400.07,489.702v-5.198h0.707l2.73,4.081v-4.081h0.658v5.198h-0.705l-2.73-4.085v4.085H400.07z"/>
+	<path d="M407.818,488.489l0.66,0.082c-0.105,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+		c-0.551,0-0.988-0.17-1.311-0.509s-0.484-0.814-0.484-1.427c0-0.634,0.164-1.125,0.49-1.476c0.326-0.35,0.75-0.524,1.27-0.524
+		c0.504,0,0.914,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446c0,0.038-0.002,0.095-0.004,0.17h-2.809
+		c0.023,0.414,0.141,0.73,0.352,0.95c0.209,0.22,0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C407.59,488.955,407.721,488.759,407.818,488.489z M405.723,487.458h2.104c-0.029-0.317-0.109-0.555-0.242-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.738,0.295S405.744,487.129,405.723,487.458z"/>
+	<path d="M408.854,489.702l1.375-1.957l-1.271-1.809h0.797l0.578,0.883c0.109,0.168,0.195,0.309,0.262,0.422
+		c0.105-0.155,0.201-0.294,0.287-0.414l0.635-0.891h0.764l-1.303,1.773l1.4,1.992h-0.783l-0.773-1.17l-0.205-0.315l-0.988,1.485
+		H408.854z"/>
+	<path d="M414.303,489.131l0.092,0.564c-0.18,0.037-0.34,0.057-0.48,0.057c-0.232,0-0.412-0.037-0.539-0.11
+		c-0.129-0.073-0.219-0.169-0.27-0.289c-0.053-0.119-0.078-0.37-0.078-0.753v-2.167h-0.469v-0.496h0.469v-0.933l0.635-0.383v1.315
+		h0.641v0.496h-0.641v2.202c0,0.183,0.01,0.299,0.033,0.352c0.021,0.052,0.059,0.093,0.109,0.124
+		c0.051,0.03,0.123,0.046,0.219,0.046C414.094,489.156,414.188,489.147,414.303,489.131z"/>
+	<path d="M416.146,491.23c-0.352-0.444-0.65-0.965-0.893-1.561c-0.244-0.596-0.365-1.212-0.365-1.851
+		c0-0.563,0.09-1.102,0.273-1.617c0.213-0.598,0.541-1.193,0.984-1.786h0.457c-0.285,0.491-0.475,0.843-0.566,1.053
+		c-0.145,0.326-0.258,0.667-0.34,1.021c-0.102,0.441-0.152,0.886-0.152,1.333c0,1.137,0.354,2.272,1.059,3.407H416.146z"/>
+	<path d="M417.172,488.33l0.639-0.085c0.072,0.361,0.197,0.622,0.373,0.781c0.176,0.16,0.391,0.239,0.645,0.239
+		c0.299,0,0.553-0.104,0.76-0.312s0.311-0.466,0.311-0.773c0-0.293-0.096-0.534-0.287-0.725s-0.436-0.285-0.73-0.285
+		c-0.121,0-0.271,0.023-0.451,0.07l0.072-0.56c0.041,0.005,0.076,0.007,0.102,0.007c0.271,0,0.518-0.071,0.734-0.213
+		s0.326-0.36,0.326-0.656c0-0.233-0.08-0.428-0.238-0.581s-0.361-0.23-0.613-0.23c-0.248,0-0.455,0.078-0.619,0.234
+		c-0.166,0.155-0.271,0.39-0.32,0.701l-0.637-0.113c0.076-0.428,0.254-0.759,0.531-0.994c0.275-0.235,0.621-0.353,1.031-0.353
+		c0.283,0,0.545,0.061,0.783,0.183c0.24,0.121,0.422,0.287,0.549,0.498c0.127,0.21,0.189,0.434,0.189,0.67
+		c0,0.225-0.061,0.429-0.182,0.613c-0.119,0.185-0.299,0.331-0.535,0.439c0.309,0.071,0.547,0.219,0.717,0.441
+		c0.17,0.224,0.256,0.503,0.256,0.839c0,0.454-0.166,0.839-0.498,1.154c-0.33,0.315-0.748,0.473-1.254,0.473
+		c-0.457,0-0.836-0.136-1.137-0.407S417.215,488.763,417.172,488.33z"/>
+	<path d="M421.803,491.23h-0.459c0.707-1.135,1.061-2.271,1.061-3.407c0-0.444-0.051-0.886-0.152-1.323
+		c-0.08-0.354-0.193-0.694-0.336-1.021c-0.094-0.213-0.283-0.567-0.572-1.063h0.459c0.443,0.593,0.771,1.188,0.984,1.786
+		c0.182,0.516,0.273,1.055,0.273,1.617c0,0.639-0.123,1.255-0.367,1.851S422.152,490.786,421.803,491.23z"/>
+</g>
+<path d="M450.826,496.963l4.539,2.27l-4.539,2.27V496.963z"/>
+<path marker-end="url(#arrowhead)" d="M454.91,499.232"/>
+<g enable-background="new    ">
+	<path d="M382.108,510.771c0-0.863,0.232-1.538,0.695-2.026s1.062-0.732,1.794-0.732c0.48,0,0.912,0.114,1.298,0.344
+		s0.679,0.549,0.881,0.959s0.304,0.875,0.304,1.396c0,0.527-0.106,0.999-0.319,1.415s-0.515,0.73-0.904,0.944
+		s-0.811,0.321-1.262,0.321c-0.489,0-0.927-0.118-1.313-0.354c-0.385-0.236-0.677-0.56-0.876-0.968
+		C382.208,511.659,382.108,511.227,382.108,510.771z M382.818,510.781c0,0.626,0.168,1.119,0.505,1.479
+		c0.337,0.361,0.759,0.541,1.268,0.541c0.518,0,0.943-0.182,1.278-0.546c0.334-0.364,0.502-0.881,0.502-1.55
+		c0-0.423-0.072-0.792-0.215-1.107c-0.144-0.315-0.353-0.561-0.628-0.734s-0.584-0.261-0.927-0.261
+		c-0.487,0-0.906,0.168-1.257,0.502C382.993,509.44,382.818,509.998,382.818,510.781z"/>
+	<path d="M387.885,513.302v-3.766h0.574v0.535c0.277-0.413,0.677-0.62,1.198-0.62c0.228,0,0.436,0.041,0.626,0.122
+		c0.19,0.082,0.333,0.188,0.428,0.321c0.095,0.132,0.16,0.289,0.198,0.472c0.023,0.118,0.035,0.325,0.035,0.62v2.315h-0.638v-2.29
+		c0-0.261-0.025-0.455-0.074-0.584c-0.05-0.129-0.138-0.231-0.265-0.309c-0.126-0.076-0.274-0.115-0.444-0.115
+		c-0.272,0-0.507,0.087-0.704,0.259c-0.197,0.173-0.296,0.5-0.296,0.982v2.057H387.885z"/>
+	<path d="M395.713,511.479l0.688,0.174c-0.145,0.564-0.404,0.995-0.778,1.292c-0.375,0.297-0.833,0.445-1.374,0.445
+		c-0.561,0-1.016-0.114-1.367-0.343c-0.351-0.228-0.618-0.558-0.801-0.99c-0.184-0.433-0.275-0.897-0.275-1.394
+		c0-0.541,0.104-1.014,0.311-1.417c0.207-0.402,0.501-0.709,0.883-0.918s0.802-0.313,1.261-0.313c0.52,0,0.957,0.132,1.312,0.396
+		s0.602,0.638,0.741,1.117l-0.678,0.159c-0.12-0.378-0.295-0.653-0.524-0.826c-0.229-0.172-0.518-0.259-0.865-0.259
+		c-0.399,0-0.733,0.096-1.001,0.287c-0.269,0.191-0.457,0.449-0.566,0.771c-0.108,0.322-0.163,0.655-0.163,0.998
+		c0,0.442,0.064,0.828,0.193,1.158c0.129,0.329,0.329,0.576,0.602,0.739c0.271,0.163,0.565,0.244,0.883,0.244
+		c0.385,0,0.711-0.111,0.979-0.333C395.438,512.246,395.619,511.917,395.713,511.479z"/>
+	<path d="M396.93,511.419c0-0.697,0.193-1.214,0.581-1.55c0.324-0.278,0.719-0.418,1.185-0.418c0.518,0,0.94,0.17,1.27,0.509
+		c0.328,0.339,0.492,0.808,0.492,1.406c0,0.484-0.072,0.865-0.218,1.144c-0.146,0.277-0.356,0.493-0.635,0.646
+		c-0.277,0.153-0.581,0.23-0.909,0.23c-0.527,0-0.953-0.169-1.278-0.507S396.93,512.055,396.93,511.419z M397.586,511.419
+		c0,0.482,0.104,0.844,0.315,1.083c0.21,0.24,0.475,0.36,0.794,0.36c0.316,0,0.58-0.121,0.791-0.362
+		c0.21-0.24,0.315-0.608,0.315-1.103c0-0.465-0.106-0.818-0.317-1.058c-0.212-0.24-0.475-0.36-0.789-0.36
+		c-0.319,0-0.584,0.119-0.794,0.358C397.69,510.576,397.586,510.937,397.586,511.419z"/>
+	<path d="M401.205,513.302v-3.766h0.571v0.528c0.118-0.185,0.275-0.332,0.472-0.444c0.195-0.112,0.419-0.169,0.67-0.169
+		c0.278,0,0.508,0.058,0.686,0.174c0.179,0.116,0.305,0.277,0.378,0.485c0.298-0.439,0.686-0.659,1.163-0.659
+		c0.373,0,0.66,0.104,0.861,0.311s0.302,0.525,0.302,0.955v2.585h-0.635v-2.372c0-0.255-0.021-0.439-0.063-0.552
+		c-0.041-0.111-0.116-0.202-0.225-0.271c-0.109-0.068-0.236-0.104-0.383-0.104c-0.265,0-0.485,0.089-0.66,0.265
+		s-0.262,0.458-0.262,0.846v2.188h-0.639v-2.446c0-0.284-0.052-0.496-0.156-0.639c-0.104-0.142-0.273-0.213-0.51-0.213
+		c-0.18,0-0.346,0.048-0.499,0.143c-0.152,0.095-0.263,0.232-0.331,0.414c-0.068,0.183-0.103,0.445-0.103,0.787v1.954H401.205z"/>
+	<path d="M407.254,514.745v-5.209h0.582v0.489c0.137-0.191,0.291-0.335,0.464-0.431s0.382-0.144,0.628-0.144
+		c0.321,0,0.604,0.083,0.851,0.248c0.246,0.166,0.432,0.399,0.557,0.7c0.125,0.302,0.188,0.632,0.188,0.991
+		c0,0.386-0.069,0.732-0.208,1.041c-0.138,0.309-0.339,0.545-0.603,0.709s-0.541,0.246-0.831,0.246
+		c-0.213,0-0.404-0.045-0.573-0.135s-0.308-0.203-0.416-0.34v1.833H407.254z M407.832,511.44c0,0.484,0.098,0.843,0.294,1.074
+		s0.434,0.348,0.713,0.348c0.284,0,0.526-0.12,0.729-0.36c0.202-0.239,0.304-0.611,0.304-1.115c0-0.479-0.099-0.839-0.297-1.077
+		c-0.197-0.239-0.433-0.358-0.707-0.358c-0.271,0-0.513,0.127-0.722,0.381C407.937,510.587,407.832,510.956,407.832,511.44z"/>
+	<path d="M411.278,513.302v-5.198h0.638v5.198H411.278z"/>
+	<path d="M415.483,512.089l0.659,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.17-1.31-0.509c-0.323-0.339-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476
+		c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.915,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+		c0,0.038-0.001,0.095-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C415.255,512.555,415.386,512.358,415.483,512.089z M413.388,511.058h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.739,0.295C413.52,510.467,413.409,510.729,413.388,511.058z"/>
+	<path d="M418.337,512.73l0.092,0.564c-0.18,0.037-0.34,0.057-0.481,0.057c-0.232,0-0.412-0.037-0.539-0.11
+		c-0.128-0.073-0.218-0.169-0.27-0.289c-0.052-0.119-0.078-0.37-0.078-0.753v-2.167h-0.468v-0.496h0.468v-0.933l0.635-0.383v1.315
+		h0.642v0.496h-0.642v2.202c0,0.183,0.011,0.299,0.033,0.352c0.022,0.052,0.06,0.093,0.11,0.124c0.051,0.03,0.123,0.046,0.218,0.046
+		C418.128,512.756,418.221,512.747,418.337,512.73z"/>
+	<path d="M421.539,512.089l0.659,0.082c-0.104,0.385-0.297,0.685-0.578,0.896c-0.281,0.213-0.641,0.319-1.078,0.319
+		c-0.551,0-0.987-0.17-1.31-0.509c-0.323-0.339-0.484-0.814-0.484-1.427c0-0.634,0.163-1.125,0.489-1.476
+		c0.326-0.35,0.75-0.524,1.27-0.524c0.504,0,0.915,0.172,1.234,0.515c0.318,0.342,0.479,0.824,0.479,1.446
+		c0,0.038-0.001,0.095-0.004,0.17h-2.808c0.023,0.414,0.141,0.73,0.351,0.95s0.473,0.33,0.787,0.33c0.234,0,0.434-0.062,0.6-0.185
+		C421.311,512.555,421.441,512.358,421.539,512.089z M419.443,511.058h2.103c-0.028-0.317-0.108-0.555-0.241-0.713
+		c-0.203-0.246-0.467-0.369-0.791-0.369c-0.293,0-0.539,0.099-0.739,0.295C419.575,510.467,419.465,510.729,419.443,511.058z"/>
+	<path d="M425.442,513.302v-0.476c-0.239,0.374-0.59,0.561-1.054,0.561c-0.3,0-0.576-0.083-0.827-0.248
+		c-0.252-0.165-0.447-0.396-0.585-0.693c-0.139-0.297-0.208-0.638-0.208-1.022c0-0.376,0.063-0.717,0.188-1.023
+		c0.125-0.306,0.313-0.54,0.563-0.703c0.25-0.163,0.53-0.245,0.84-0.245c0.228,0,0.43,0.048,0.606,0.144
+		c0.178,0.096,0.321,0.221,0.433,0.374v-1.865h0.635v5.198H425.442z M423.425,511.423c0,0.482,0.102,0.843,0.305,1.081
+		c0.203,0.239,0.443,0.358,0.72,0.358c0.279,0,0.516-0.114,0.711-0.343c0.195-0.228,0.293-0.576,0.293-1.044
+		c0-0.515-0.1-0.894-0.298-1.135c-0.199-0.241-0.443-0.361-0.734-0.361c-0.283,0-0.521,0.116-0.711,0.348
+		S423.425,510.924,423.425,511.423z"/>
+	<path d="M428.257,514.83c-0.353-0.444-0.65-0.965-0.894-1.561s-0.365-1.212-0.365-1.851c0-0.563,0.091-1.102,0.273-1.617
+		c0.213-0.598,0.541-1.193,0.985-1.786h0.457c-0.285,0.491-0.475,0.843-0.566,1.053c-0.145,0.326-0.258,0.667-0.341,1.021
+		c-0.102,0.441-0.152,0.886-0.152,1.333c0,1.137,0.354,2.272,1.06,3.407H428.257z"/>
+	<path d="M429.874,514.83h-0.458c0.707-1.135,1.061-2.271,1.061-3.407c0-0.444-0.051-0.886-0.152-1.323
+		c-0.081-0.354-0.193-0.694-0.337-1.021c-0.093-0.213-0.283-0.567-0.571-1.063h0.458c0.444,0.593,0.772,1.188,0.985,1.786
+		c0.182,0.516,0.272,1.055,0.272,1.617c0,0.639-0.122,1.255-0.366,1.851C430.521,513.865,430.224,514.386,429.874,514.83z"/>
+</g>
+<path d="M450.826,520.563l4.539,2.27l-4.539,2.27V520.563z"/>
+<path marker-end="url(#arrowhead)" d="M454.91,522.832"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="163.32" y1="263.237" x2="53.038" y2="263.237"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="263.392" y1="286.836" x2="167.405" y2="286.836"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="354.158" y1="357.635" x2="267.93" y2="357.635"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="451.75" y1="381.234" x2="358.243" y2="381.235"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="453.096" y1="428.434" x2="358.697" y2="428.434"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="548.5" y1="334.036" x2="53.038" y2="334.036"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="548.5" y1="404.834" x2="455.365" y2="404.834"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="547.494" y1="452.033" x2="455.365" y2="452.033"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="451.75" y1="499.232" x2="358.243" y2="499.232"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="450.826" y1="522.832" x2="358.697" y2="522.832"/>
+<path fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" d="M169.22,475.633"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="551.579" y1="475.633" x2="169.22" y2="475.633"/>
+<line fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" x1="54.854" y1="310.436" x2="166.951" y2="310.436"/>
+</svg>

+ 295 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch06-Transformation-Marbles-Select-Many-Marbles-Delay.svg

@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 504.81 363.68">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8be8;
+      }
+
+      .cls-4 {
+        fill: #ff8b8b;
+      }
+
+      .cls-7 {
+        stroke-width: 0px;
+      }
+
+      .cls-5 {
+        fill: #8be2ff;
+      }
+
+      .cls-6 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="30.52" y1="48.3" x2="278.9" y2="48.3"/>
+  <g>
+    <path class="cls-7" d="M34.23,25.48h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,19.92c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-7" d="M39.39,25.48l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.84s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,22.8h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M42.2,19.59h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M53.04,20.43c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.31.06-.58.17-.84s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM49.5,26.33c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM49.81,21.52c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.48Z"/>
+    <path class="cls-7" d="M60.37,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17.12-.37.29-.69.52-.97s.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86c.11.34.17.72.17,1.13ZM59.31,22.08c.01-.26-.01-.5-.08-.72-.06-.22-.16-.4-.29-.56s-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56c-.08.22-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M65.52,27.94c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42.1-.47.25-.94.46-1.42s.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.98,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M73.5,25.48h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-7" d="M75.65,26.68c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-7" d="M93.16,23.03c0,.38-.08.72-.25,1.04s-.39.58-.68.81-.63.4-1.02.52-.81.19-1.27.19c-.11,0-.24,0-.37,0s-.26-.01-.39-.02-.25-.02-.38-.03-.23-.03-.33-.04v-.93c.21.05.45.09.72.11s.55.04.82.04c.31,0,.59-.04.84-.11s.46-.18.64-.32.31-.31.4-.5.14-.42.14-.67c0-.48-.17-.82-.51-1.04s-.83-.33-1.47-.33h-1.45v-3.91h4.12v.89h-3.16v2.15h.67c.37,0,.72.03,1.07.1s.66.18.93.35c.27.17.49.39.66.67s.25.63.25,1.05Z"/>
+    <path class="cls-7" d="M96.19,16.75c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <g>
+    <path class="cls-7" d="M31.32,102.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-7" d="M40.51,102.13c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-7" d="M47.17,100.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM46.11,100.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M50.81,96.76h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M60.37,100.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,100.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M66.57,103.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-7" d="M73.33,104.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-7" d="M80.57,104.2h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-7" d="M85.57,104.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM85.46,101.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M88.39,98.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M100.22,98.32l-2,5.26c-.21.54-.42,1-.64,1.38s-.46.7-.72.95-.55.43-.86.55-.66.18-1.05.18c-.1,0-.19,0-.28,0s-.17,0-.27-.02v-.93c.09.01.18.02.28.03s.21.01.32.01c.19,0,.36-.03.52-.08s.32-.14.46-.27.28-.28.42-.48.26-.43.39-.71l-2.35-5.88h1.16l1.49,3.89.3.91.34-.94,1.38-3.87h1.12Z"/>
+    <path class="cls-7" d="M105.1,106.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M110.18,99.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM110.54,95.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M126.26,100.42h-5.04v-.86h5.04v.86ZM126.26,102.46h-5.04v-.86h5.04v.86Z"/>
+    <path class="cls-7" d="M128.26,98.37l.63-.65,3.94,3.29-3.94,3.29-.63-.64,3.19-2.63-3.19-2.65Z"/>
+    <path class="cls-7" d="M146.51,100.32c0,.69-.08,1.28-.24,1.78s-.38.91-.66,1.24-.6.57-.97.73-.76.24-1.17.24c-.49,0-.92-.09-1.29-.27s-.67-.43-.91-.77-.42-.75-.54-1.23-.18-1.03-.18-1.63c0-.68.08-1.27.24-1.77s.38-.91.65-1.24.6-.57.96-.73.76-.24,1.17-.24c.49,0,.92.09,1.29.27s.67.44.91.77.42.74.54,1.22.18,1.02.18,1.62ZM145.42,100.4c0-.45-.03-.86-.1-1.23s-.18-.69-.33-.96-.35-.48-.59-.63-.53-.22-.87-.22-.61.08-.85.24-.43.37-.58.64-.27.59-.34.96-.11.75-.11,1.16c0,.45.04.87.11,1.24s.18.69.33.96.34.48.58.62.53.22.86.22.61-.08.85-.24.43-.37.59-.64.27-.59.34-.95.11-.75.11-1.17Z"/>
+    <path class="cls-7" d="M152.79,101.16c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM151.75,101.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-7" d="M159.02,102.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-7" d="M165.93,100.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM164.87,100.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M167.8,98.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-7" d="M173.61,98.32h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-7" d="M184.53,104.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM184.42,101.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M192.38,101.16c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM191.34,101.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-7" d="M195.95,96.76h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M205.52,100.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM204.46,100.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M57.71,116.76c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-7" d="M67.22,118.6h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM65.55,113.05c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-7" d="M73.56,115.35c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM72.5,115.2c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M80.22,115.56c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,115.6c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-7" d="M86.76,115.35c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM85.7,115.2c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M92.17,118.6l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM92.06,115.93h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M99.73,118.52c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-7" d="M105.1,121.06c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M111.7,121.06c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M119.35,118.39c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-7" d="M126.1,118.6h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-7" d="M131.75,118.6l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM131.64,115.93h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M134.81,112.72h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-7" d="M142.37,109.88c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M151.29,121.06c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M156.37,113.56h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM156.73,110.25c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M166.13,115.86h-2.3v2.39h-1.01v-2.39h-2.3v-.89h2.3v-2.37h1.01v2.37h2.3v.89Z"/>
+    <path class="cls-7" d="M172.62,116.18c0,.35-.06.68-.19.99s-.31.58-.54.81-.52.41-.85.54-.7.2-1.1.2-.79-.07-1.12-.2-.6-.34-.81-.62-.38-.63-.5-1.06-.17-.93-.17-1.51c0-.39.03-.77.08-1.14s.13-.71.25-1.04.27-.62.47-.89.44-.5.73-.69.63-.34,1.03-.45.85-.16,1.37-.16h.76v.89h-.82c-.46,0-.85.05-1.19.16s-.62.26-.84.46-.4.44-.52.72-.2.6-.23.94l-.02.24c.25-.14.53-.26.85-.35s.67-.13,1.05-.13.73.06,1.02.17.53.27.73.47.34.44.44.72.15.59.15.93ZM171.56,116.24c0-.23-.03-.45-.08-.64s-.15-.35-.27-.48-.27-.23-.46-.3-.41-.11-.67-.11c-.15,0-.3.01-.45.04s-.3.07-.45.11-.29.1-.42.17-.25.13-.36.2c0,.5.04.92.11,1.26s.17.61.31.81.31.35.51.43.44.13.7.13c.22,0,.43-.04.61-.11s.35-.18.48-.32.24-.31.32-.51.11-.43.11-.69Z"/>
+    <path class="cls-7" d="M179.51,116.91h-1.31v1.69h-1.04v-1.69h-3.69v-.9l3.26-5.07h1.46v5.07h1.31v.9ZM177.16,111.93l-2.67,4.08h2.67v-4.08Z"/>
+    <path class="cls-7" d="M181.96,109.88c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M187.81,119.8c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-7" d="M202.55,113.56h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM202.91,110.25c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M208.35,109.88c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M57.71,131.16c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-7" d="M67.23,129.09c0,.37-.03.72-.08,1.05s-.15.65-.27.94-.29.55-.49.79-.44.44-.73.61-.62.3-1.01.39-.82.14-1.31.14h-1.64v-7.66h1.97c1.2,0,2.09.31,2.67.92s.88,1.56.88,2.82ZM66.13,129.16c0-.54-.05-1-.15-1.38s-.26-.68-.46-.91-.47-.4-.78-.5-.68-.16-1.1-.16h-.9v5.88h.78c1.74,0,2.61-.98,2.61-2.94Z"/>
+    <path class="cls-7" d="M73.56,129.75c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM72.5,129.6c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M77.2,125.56h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M85.57,133l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM85.46,130.32h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M93.62,127.12l-2,5.26c-.21.54-.42,1-.64,1.38s-.46.7-.72.95-.55.43-.86.55-.66.18-1.05.18c-.1,0-.19,0-.28,0s-.17,0-.27-.02v-.93c.09.01.18.02.28.03s.21.01.32.01c.19,0,.36-.03.52-.08s.32-.14.46-.27.28-.28.42-.48.26-.43.39-.71l-2.35-5.88h1.16l1.49,3.89.3.91.34-.94,1.38-3.87h1.12Z"/>
+    <path class="cls-7" d="M98.51,135.46c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M106.74,126.24h-2.27v6.77h-1.05v-6.77h-2.27v-.89h5.59v.89Z"/>
+    <path class="cls-7" d="M110.18,127.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM110.54,124.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M118.97,133v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.25-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-7" d="M126.34,129.75c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM125.28,129.6c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M132.88,130.93c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-7" d="M139.6,129.96c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM138.56,130c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-7" d="M144.95,133l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM144.84,130.32h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M147.77,127.12h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M156.68,131.16c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-7" d="M165.54,126.24h-3.25v2.48h3.08v.87h-3.08v3.41h-1.07v-7.66h4.32v.89Z"/>
+    <path class="cls-7" d="M167.8,127.12h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-7" d="M179.28,130.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM178.24,130.06c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-7" d="M184.95,133v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.25-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-7" d="M192.73,133h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-7" d="M195.95,127.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM196.31,124.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M202.55,125.56h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M209.15,125.56h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M215.75,127.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM216.1,124.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M225,131.4c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-7" d="M231.91,129.75c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM230.85,129.6c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M238.11,132.79c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-7" d="M245.25,130.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM244.21,130.06c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-7" d="M246.73,127.12h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M253.03,130.18c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM254.07,130.12c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-7" d="M264.58,131.4c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-7" d="M270.05,135.46c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M275.13,127.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM275.48,124.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M291.01,128.08l-.4.7-1.65-1.09.13,2h-.84l.13-2-1.68,1.09-.37-.69,1.8-.88-1.8-.9.4-.69,1.66,1.11-.14-2h.84l-.15,2,1.66-1.12.41.72-1.8.89,1.79.86Z"/>
+    <path class="cls-7" d="M304.42,133h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-7" d="M311.25,129.18c0,.59-.06,1.12-.18,1.6s-.29.9-.53,1.24-.53.61-.89.8-.77.28-1.25.28c-.41,0-.78-.08-1.12-.23s-.62-.39-.86-.71-.42-.73-.55-1.22-.19-1.08-.19-1.76c0-.59.06-1.12.18-1.61s.3-.9.53-1.25.53-.61.89-.8.77-.28,1.24-.28c.41,0,.78.08,1.12.23s.62.39.86.71.42.73.55,1.23.19,1.08.19,1.76ZM306.72,129.14c0,.12,0,.24,0,.36s0,.24.02.35l3.24-2.4c-.06-.2-.13-.38-.22-.54s-.2-.31-.32-.42-.27-.21-.43-.28-.34-.1-.54-.1c-.27,0-.51.06-.72.19s-.4.32-.55.58-.27.57-.35.95-.12.81-.12,1.31ZM310.22,129.21c0-.13,0-.26-.01-.4s-.02-.26-.03-.38l-3.24,2.41c.06.2.13.39.22.56s.2.32.33.44.27.22.43.29.35.1.55.1c.27,0,.51-.06.72-.19s.4-.32.55-.57.27-.57.35-.95.12-.81.12-1.31Z"/>
+    <path class="cls-7" d="M317.85,129.18c0,.59-.06,1.12-.18,1.6s-.29.9-.53,1.24-.53.61-.89.8-.77.28-1.25.28c-.41,0-.78-.08-1.12-.23s-.62-.39-.86-.71-.42-.73-.55-1.22-.19-1.08-.19-1.76c0-.59.06-1.12.18-1.61s.3-.9.53-1.25.53-.61.89-.8.77-.28,1.24-.28c.41,0,.78.08,1.12.23s.62.39.86.71.42.73.55,1.23.19,1.08.19,1.76ZM313.32,129.14c0,.12,0,.24,0,.36s0,.24.02.35l3.24-2.4c-.06-.2-.13-.38-.22-.54s-.2-.31-.32-.42-.27-.21-.43-.28-.34-.1-.54-.1c-.27,0-.51.06-.72.19s-.4.32-.55.58-.27.57-.35.95-.12.81-.12,1.31ZM316.82,129.21c0-.13,0-.26-.01-.4s-.02-.26-.03-.38l-3.24,2.41c.06.2.13.39.22.56s.2.32.33.44.27.22.43.29.35.1.55.1c.27,0,.51-.06.72-.19s.4-.32.55-.57.27-.57.35-.95.12-.81.12-1.31Z"/>
+    <path class="cls-7" d="M320.51,124.28c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M327.1,124.28c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M333.7,124.28c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="30.52" y1="321.91" x2="463.63" y2="321.91"/>
+  <line class="cls-2" x1="107.42" y1="148.86" x2="107.42" y2="183.87"/>
+  <line class="cls-2" x1="30.52" y1="30.79" x2="30.52" y2="65.8"/>
+  <line class="cls-2" x1="30.52" y1="304.4" x2="30.52" y2="339.41"/>
+  <g>
+    <circle class="cls-6" cx="30.2" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M32.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="43.23" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M45.97,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="56.48" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M56.2,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="69.73" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M72.71,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM70.55,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="82.76" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M85.41,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="107.42" cy="166.24" r="13.56"/>
+    <path class="cls-7" d="M103.76,169.79l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM108.73,166.36l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="107.42" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M103.76,325.46l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM108.73,322.03l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="183.8" y1="191.69" x2="214.88" y2="191.69"/>
+  <line class="cls-2" x1="183.8" y1="174.32" x2="183.8" y2="209.33"/>
+  <g>
+    <circle class="cls-5" cx="183.8" cy="191.69" r="13.56"/>
+    <path class="cls-7" d="M187.07,192.57c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM185.45,188.65c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM185.86,192.61c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="259.71" y1="212.62" x2="300.68" y2="212.62"/>
+  <line class="cls-2" x1="260.71" y1="195.24" x2="260.71" y2="230.25"/>
+  <g>
+    <circle class="cls-1" cx="260.71" cy="212.62" r="13.56"/>
+    <path class="cls-7" d="M261.4,216.32c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="335.24" y1="238.88" x2="376.94" y2="238.88"/>
+  <line class="cls-2" x1="337.24" y1="221.51" x2="337.24" y2="256.52"/>
+  <g>
+    <circle class="cls-4" cx="337.24" cy="238.88" r="13.56"/>
+    <path class="cls-7" d="M340.94,238.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM339.73,238.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="408.49" y1="269.82" x2="473.69" y2="269.82"/>
+  <line class="cls-2" x1="413.81" y1="252.45" x2="413.81" y2="287.46"/>
+  <g>
+    <circle class="cls-3" cx="413.81" cy="269.82" r="13.56"/>
+    <path class="cls-7" d="M411.33,273.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="197.88" cy="191.69" r="13.56"/>
+    <path class="cls-7" d="M201.15,192.57c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM199.53,188.65c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM199.94,192.61c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="183.8" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M187.07,322.78c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM185.45,318.86c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM185.86,322.82c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="197.88" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M201.15,322.78c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM199.53,318.86c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM199.94,322.82c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="273.73" cy="212.62" r="13.56"/>
+    <path class="cls-7" d="M274.42,216.32c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="286.68" cy="212.62" r="13.56"/>
+    <path class="cls-7" d="M287.37,216.32c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="260.71" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M261.4,325.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="273.73" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M274.42,325.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="286.68" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M287.37,325.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="350.22" cy="238.88" r="13.56"/>
+    <path class="cls-7" d="M353.92,238.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM352.71,238.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="363.38" cy="238.88" r="13.56"/>
+    <path class="cls-7" d="M367.07,238.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM365.87,238.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="376.43" cy="238.88" r="13.56"/>
+    <path class="cls-7" d="M380.13,238.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM378.92,238.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="337.24" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M340.94,321.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM339.73,321.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="350.22" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M353.92,321.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM352.71,321.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="363.38" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M367.07,321.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM365.87,321.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="376.43" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M380.13,321.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM378.92,321.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="427.01" cy="269.82" r="13.56"/>
+    <path class="cls-7" d="M424.53,273.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="440.07" cy="269.82" r="13.56"/>
+    <path class="cls-7" d="M437.59,273.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="452.66" cy="269.82" r="13.56"/>
+    <path class="cls-7" d="M450.18,273.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="465.69" cy="269.82" r="13.56"/>
+    <path class="cls-7" d="M463.21,273.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="413.81" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M411.33,325.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="427.01" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M424.53,325.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="440.07" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M437.59,325.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="452.66" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M450.18,325.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="465.69" cy="321.91" r="13.56"/>
+    <path class="cls-7" d="M463.21,325.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+</svg>

+ 262 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch06-Transformation-Marbles-Select-Many-Marbles.svg

@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 504.81 337.68">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8be8;
+      }
+
+      .cls-4 {
+        fill: #ff8b8b;
+      }
+
+      .cls-7 {
+        stroke-width: 0px;
+      }
+
+      .cls-5 {
+        fill: #8be2ff;
+      }
+
+      .cls-6 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="30.52" y1="48.3" x2="278.9" y2="48.3"/>
+  <g>
+    <path class="cls-7" d="M34.23,25.48h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,19.92c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-7" d="M39.39,25.48l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,22.8h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M42.2,19.6h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M53.04,20.43c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM49.5,26.33c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM49.81,21.52c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-7" d="M60.37,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M65.52,27.94c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M73.5,25.48h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-7" d="M75.65,26.68c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-7" d="M93.16,23.03c0,.38-.08.72-.25,1.04s-.39.58-.68.81-.63.4-1.02.52-.81.19-1.27.19c-.11,0-.24,0-.37,0s-.26-.01-.39-.02-.25-.02-.38-.03-.23-.03-.33-.04v-.93c.21.05.45.09.72.11s.55.04.82.04c.31,0,.59-.04.84-.11s.46-.18.64-.32.31-.31.4-.5.14-.42.14-.67c0-.48-.17-.82-.51-1.04s-.83-.33-1.47-.33h-1.45v-3.91h4.12v.89h-3.16v2.15h.67c.37,0,.72.03,1.07.1s.66.18.93.35.49.39.66.67.25.63.25,1.05Z"/>
+    <path class="cls-7" d="M96.19,16.75c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <g>
+    <path class="cls-7" d="M31.32,100.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-7" d="M40.51,100.13c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-7" d="M47.17,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM46.11,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M50.81,94.76h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M60.37,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M66.57,101.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-7" d="M73.33,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-7" d="M80.57,102.2h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-7" d="M85.57,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM85.46,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M88.39,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M100.22,96.32l-2,5.26c-.21.54-.42,1-.64,1.38s-.46.7-.72.95-.55.43-.86.55-.66.18-1.05.18c-.1,0-.19,0-.28,0s-.17,0-.27-.02v-.93c.09.01.18.02.28.03s.21.01.32.01c.19,0,.36-.03.52-.08s.32-.14.46-.27.28-.28.42-.48.26-.43.39-.71l-2.35-5.88h1.16l1.49,3.89.3.91.34-.94,1.38-3.87h1.12Z"/>
+    <path class="cls-7" d="M105.1,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M110.18,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM110.54,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M126.26,98.42h-5.04v-.86h5.04v.86ZM126.26,100.46h-5.04v-.86h5.04v.86Z"/>
+    <path class="cls-7" d="M128.26,96.37l.63-.65,3.94,3.29-3.94,3.29-.63-.64,3.19-2.63-3.19-2.65Z"/>
+    <path class="cls-7" d="M141.17,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M152.74,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM151.67,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M159.81,96.32l-.86,5.88h-1.24l-.85-2.46-.17-.6-.19.63-.81,2.43h-1.2l-.85-5.88h1l.49,4,.11.89.25-.78.86-2.64h.73l.92,2.61.26.78.09-.83.46-4.03h1.01Z"/>
+    <path class="cls-7" d="M172.22,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-7" d="M178.9,102.12c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-7" d="M181,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-7" d="M189.36,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM189.71,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M193.95,96.32h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-7" d="M204.78,97.15c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM201.25,103.05c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM201.56,98.24c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-7" d="M210.67,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M217.26,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M224.91,101.99c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-7" d="M231.67,102.2h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-7" d="M237.32,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM237.2,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M240.37,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-7" d="M247.93,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M256.85,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M261.93,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM262.29,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M271.69,99.46h-2.3v2.39h-1.01v-2.39h-2.3v-.89h2.3v-2.37h1.01v2.37h2.3v.89Z"/>
+    <path class="cls-7" d="M278.18,99.78c0,.35-.06.68-.19.99s-.31.58-.54.81-.52.41-.85.54-.7.2-1.1.2-.79-.07-1.12-.2-.6-.34-.81-.62-.38-.63-.5-1.06-.17-.93-.17-1.51c0-.39.03-.77.08-1.14s.13-.71.25-1.04.27-.62.47-.89.44-.5.73-.69.63-.34,1.03-.45.85-.16,1.37-.16h.76v.89h-.82c-.46,0-.85.05-1.19.16s-.62.26-.84.46-.4.44-.52.72-.2.6-.23.94l-.02.24c.25-.14.53-.26.85-.35s.67-.13,1.05-.13.73.06,1.02.17.53.27.73.47.34.44.44.72.15.59.15.93ZM277.12,99.84c0-.23-.03-.45-.08-.64s-.15-.35-.27-.48-.27-.23-.46-.3-.41-.11-.67-.11c-.15,0-.3.01-.45.04s-.3.07-.45.11-.29.1-.42.17-.25.13-.36.2c0,.5.04.92.11,1.26s.17.61.31.81.31.35.51.43.44.13.7.13c.22,0,.43-.04.61-.11s.35-.18.48-.32.24-.31.32-.51.11-.43.11-.69Z"/>
+    <path class="cls-7" d="M285.07,100.51h-1.31v1.69h-1.04v-1.69h-3.69v-.9l3.26-5.07h1.46v5.07h1.31v.9ZM282.72,95.53l-2.67,4.08h2.67v-4.08Z"/>
+    <path class="cls-7" d="M287.52,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M293.37,103.4c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-7" d="M308.11,97.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM308.47,93.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-7" d="M313.91,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M321.62,100.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-7" d="M331.06,95.44h-2.27v6.77h-1.05v-6.77h-2.27v-.89h5.59v.89Z"/>
+    <path class="cls-7" d="M337.62,99.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM336.58,99.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-7" d="M344.44,98.32c0,.69-.08,1.28-.24,1.78s-.38.91-.66,1.24-.6.57-.97.73-.76.24-1.17.24c-.49,0-.92-.09-1.29-.27s-.67-.43-.91-.77-.42-.75-.54-1.23-.18-1.03-.18-1.63c0-.68.08-1.27.24-1.77s.38-.91.65-1.24.6-.57.96-.73.76-.24,1.17-.24c.49,0,.92.09,1.29.27s.67.44.91.77.42.74.54,1.22.18,1.02.18,1.62ZM343.35,98.4c0-.45-.03-.86-.1-1.23s-.18-.69-.33-.96-.35-.48-.59-.63-.53-.22-.87-.22-.61.08-.85.24-.43.37-.58.64-.27.59-.34.96-.11.75-.11,1.16c0,.45.04.87.11,1.24s.18.69.33.96.34.48.58.62.53.22.86.22.61-.08.85-.24.43-.37.59-.64.27-.59.34-.95.11-.75.11-1.17Z"/>
+    <path class="cls-7" d="M350.72,99.16c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM349.68,99.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-7" d="M356.95,100.6c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-7" d="M363.86,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM362.8,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M365.73,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-7" d="M371.54,96.32h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-7" d="M382.46,102.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM382.35,99.53h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-7" d="M390.31,99.16c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM389.27,99.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-7" d="M393.88,94.76h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-7" d="M403.45,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM402.39,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-7" d="M408.6,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-7" d="M412.87,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-7" d="M419.47,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="30.52" y1="302.91" x2="463.63" y2="302.91"/>
+  <line class="cls-2" x1="30.2" y1="129.86" x2="30.2" y2="164.87"/>
+  <line class="cls-2" x1="30.52" y1="30.79" x2="30.52" y2="65.8"/>
+  <line class="cls-2" x1="30.52" y1="285.4" x2="30.52" y2="320.41"/>
+  <g>
+    <circle class="cls-6" cx="30.2" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M32.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="61.23" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M63.97,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="123.73" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M123.45,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="185.79" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M188.76,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM186.6,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="278.9" cy="48.3" r="13.56"/>
+    <path class="cls-7" d="M281.55,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="30.2" cy="147.24" r="13.56"/>
+    <path class="cls-7" d="M26.54,150.79l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM31.52,147.36l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="30.2" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M26.54,306.46l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM31.52,303.03l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="61.23" y1="172.69" x2="92.31" y2="172.69"/>
+  <g>
+    <circle class="cls-5" cx="92.31" cy="172.69" r="13.56"/>
+    <path class="cls-7" d="M95.57,173.56c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM93.96,169.65c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM94.37,173.61c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <line class="cls-2" x1="61.23" y1="155.32" x2="61.23" y2="190.33"/>
+  <g>
+    <circle class="cls-5" cx="61.23" cy="172.69" r="13.56"/>
+    <path class="cls-7" d="M64.49,173.56c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM62.88,169.65c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM63.29,173.61c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="92.31" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M95.57,303.78c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM93.96,299.86c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM94.37,303.83c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="61.23" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M64.49,303.78c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM62.88,299.86c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM63.29,303.83c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="122.73" y1="193.62" x2="216.71" y2="193.62"/>
+  <g>
+    <circle class="cls-1" cx="154.76" cy="193.62" r="13.56"/>
+    <path class="cls-7" d="M155.45,197.32c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="216.71" cy="193.62" r="13.56"/>
+    <path class="cls-7" d="M217.4,197.32c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line class="cls-2" x1="123.73" y1="176.24" x2="123.73" y2="211.25"/>
+  <g>
+    <circle class="cls-1" cx="123.73" cy="193.62" r="13.56"/>
+    <path class="cls-7" d="M124.42,197.32c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="154.76" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M155.45,306.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="216.71" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M217.4,306.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="123.73" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M124.42,306.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="184.79" y1="219.88" x2="372.25" y2="219.88"/>
+  <g>
+    <circle class="cls-4" cx="247.77" cy="219.88" r="13.56"/>
+    <path class="cls-7" d="M251.46,219.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM250.26,219.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="308.93" cy="219.88" r="13.56"/>
+    <path class="cls-7" d="M312.62,219.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM311.41,219.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="370.98" cy="219.88" r="13.56"/>
+    <path class="cls-7" d="M374.67,219.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM373.47,219.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <line class="cls-2" x1="185.79" y1="202.51" x2="185.79" y2="237.52"/>
+  <g>
+    <circle class="cls-4" cx="185.79" cy="219.88" r="13.56"/>
+    <path class="cls-7" d="M189.48,219.08c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM188.27,219.06c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="247.77" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M251.46,302.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM250.26,302.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="308.93" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M312.62,302.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM311.41,302.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="370.98" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M374.67,302.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM373.47,302.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="185.79" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M189.48,302.1c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM188.27,302.08c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="277.75" y1="250.82" x2="463.63" y2="250.82"/>
+  <g>
+    <circle class="cls-3" cx="339.95" cy="250.82" r="13.56"/>
+    <path class="cls-7" d="M337.47,254.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="402.01" cy="250.82" r="13.56"/>
+    <path class="cls-7" d="M399.53,254.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="432.6" cy="250.82" r="13.56"/>
+    <path class="cls-7" d="M430.12,254.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="463.63" cy="250.82" r="13.56"/>
+    <path class="cls-7" d="M461.15,254.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <line class="cls-2" x1="277.75" y1="233.45" x2="277.75" y2="268.46"/>
+  <g>
+    <circle class="cls-3" cx="277.75" cy="250.82" r="13.56"/>
+    <path class="cls-7" d="M275.27,254.37v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="339.95" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M337.47,306.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="402.01" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M399.53,306.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="432.6" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M430.12,306.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="463.63" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M461.15,306.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="277.75" cy="302.91" r="13.56"/>
+    <path class="cls-7" d="M275.27,306.46v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch06-Transformation-Marbles.ai


+ 127 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch08-Partitioning-Marbles-Buffer-Marbles.svg

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 227.37 191.02">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8be8;
+      }
+
+      .cls-4 {
+        fill: #ff8b8b;
+      }
+
+      .cls-8 {
+        stroke-width: 0px;
+      }
+
+      .cls-5 {
+        fill: #8be2ff;
+      }
+
+      .cls-6 {
+        fill: #ffa532;
+      }
+
+      .cls-7 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="30.52" y1="48.3" x2="216.71" y2="48.3"/>
+  <g>
+    <path class="cls-8" d="M34.23,25.48h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,19.92c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-8" d="M39.39,25.48l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,22.8h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-8" d="M42.2,19.6h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-8" d="M53.04,20.43c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM49.5,26.33c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM49.81,21.52c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-8" d="M60.37,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-8" d="M65.52,27.94c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-8" d="M73.5,25.48h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-8" d="M75.65,26.68c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-8" d="M93.45,23.05c0,.35-.06.68-.19.99s-.31.58-.54.81-.52.41-.85.54-.7.2-1.1.2-.79-.07-1.12-.2-.6-.34-.81-.62-.38-.63-.5-1.06-.17-.93-.17-1.51c0-.39.03-.77.08-1.14s.13-.71.25-1.04.27-.62.47-.89.44-.5.73-.69.63-.34,1.03-.45.85-.16,1.37-.16h.76v.89h-.82c-.46,0-.85.05-1.19.16s-.62.26-.84.46-.4.44-.52.72-.2.6-.23.94l-.02.24c.25-.14.53-.26.85-.35s.67-.13,1.05-.13.73.06,1.02.17.53.27.73.47.34.44.44.72.15.59.15.93ZM92.38,23.12c0-.23-.03-.45-.08-.64s-.15-.35-.27-.48-.27-.23-.46-.3-.41-.11-.67-.11c-.15,0-.3.01-.45.04s-.3.07-.45.11-.29.1-.42.17-.25.13-.36.2c0,.5.04.92.11,1.26s.17.61.31.81.31.35.51.43.44.13.7.13c.22,0,.43-.04.61-.11s.35-.18.48-.32.24-.31.32-.51.11-.43.11-.69Z"/>
+    <path class="cls-8" d="M96.19,16.75c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <g>
+    <path class="cls-8" d="M31.32,100.36c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-8" d="M40.62,99.91c0,.37-.07.69-.21.98s-.35.52-.61.72-.58.34-.96.45-.79.15-1.25.15h-2v-7.66h2.19c1.71,0,2.56.62,2.56,1.86,0,.41-.1.77-.3,1.07s-.52.52-.96.66c.21.04.4.11.59.2s.35.21.49.36.25.32.33.53.12.43.12.69ZM39.26,96.55c0-.16-.02-.3-.07-.44s-.13-.26-.25-.36-.28-.18-.47-.24-.45-.09-.76-.09h-1.08v2.4h1.04c.24,0,.45-.03.65-.08s.36-.13.5-.23.25-.24.32-.4.11-.35.11-.57ZM39.51,99.95c0-.2-.04-.37-.12-.53s-.2-.29-.36-.4-.35-.19-.57-.25-.48-.09-.76-.09h-1.07v2.64h1.1c.6,0,1.04-.11,1.34-.33s.44-.57.44-1.04Z"/>
+    <path class="cls-8" d="M46.93,102.2h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-8" d="M54.02,94.87c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-8" d="M60.62,94.87c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-8" d="M66.97,98.95c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,98.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-8" d="M68.83,96.32h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-8" d="M78.71,104.66c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-8" d="M87.14,100.51h-1.31v1.69h-1.04v-1.69h-3.69v-.9l3.26-5.07h1.46v5.07h1.31v.9ZM84.79,95.53l-2.67,4.08h2.67v-4.08Z"/>
+    <path class="cls-8" d="M88.84,103.4c.2,0,.39,0,.58-.05s.35-.11.5-.19.26-.19.34-.31.13-.27.13-.43-.03-.3-.08-.4-.12-.2-.19-.28-.13-.18-.19-.28-.08-.23-.08-.39c0-.08.02-.17.05-.26s.08-.17.14-.25.15-.13.25-.18.22-.07.35-.07.27.03.4.08.24.14.33.26.17.26.23.44.08.38.08.62c0,.32-.06.64-.18.93s-.3.56-.53.79-.53.41-.88.55-.76.21-1.23.21v-.8Z"/>
+    <path class="cls-8" d="M106.49,102.2h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-8" d="M109.38,93.48c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <line class="cls-2" x1="30.2" y1="129.86" x2="30.2" y2="164.87"/>
+  <line class="cls-2" x1="30.52" y1="30.79" x2="30.52" y2="65.8"/>
+  <g>
+    <circle class="cls-7" cx="30.2" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M32.5,51.85h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-5" cx="61.23" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M63.97,51.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="92.48" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M92.2,43.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="123.73" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M126.71,48.85h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM124.55,47.91v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="154.76" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M157.41,49.07c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-6" cx="185.79" cy="48.3" r="13.56"/>
+    <path class="cls-8" d="M188.67,49.02c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM187.48,49.06c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="29.78" y1="147.24" x2="216.71" y2="147.24"/>
+  <circle class="cls-4" cx="123.73" cy="147.24" r="13.56"/>
+  <circle class="cls-3" cx="154.76" cy="147.24" r="13.56"/>
+  <g>
+    <path class="cls-8" d="M120.6,144.14h-4.01v-.79h1.64v-4.66l-1.53.83-.31-.72,2.03-1.07h.75v5.62h1.43v.79Z"/>
+    <path class="cls-8" d="M122.4,145.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M131.65,144.14h-4.2v-.76l1.65-1.64c.27-.27.49-.5.66-.69s.3-.37.4-.53.16-.31.19-.46.05-.3.05-.46c0-.16-.02-.31-.06-.45s-.11-.27-.2-.37-.2-.19-.34-.25-.31-.09-.5-.09c-.27,0-.52.06-.74.18s-.42.28-.61.47l-.47-.56c.24-.25.52-.46.83-.61s.68-.23,1.1-.23c.28,0,.54.04.77.13s.43.21.6.37.3.35.39.59.14.49.14.78c0,.24-.03.47-.1.68s-.16.42-.3.62-.3.42-.5.64-.44.46-.71.73l-1.16,1.13h3.1v.81Z"/>
+    <path class="cls-8" d="M133.39,145.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M120.54,154.2c0,.28-.06.54-.17.79s-.28.46-.51.64-.51.33-.86.43-.75.16-1.21.16c-.25,0-.48,0-.68-.02s-.39-.04-.57-.06v-.76c.2.04.42.06.64.08s.45.03.69.03c.32,0,.59-.03.82-.09s.41-.14.55-.25.25-.24.31-.39.1-.33.1-.52c0-.18-.04-.33-.12-.46s-.19-.24-.33-.33-.31-.15-.51-.2-.41-.07-.65-.07h-.73v-.7h.74c.19,0,.37-.03.52-.08s.29-.12.41-.22.2-.21.26-.35.09-.3.09-.47c0-.34-.1-.59-.31-.75s-.51-.23-.92-.23c-.21,0-.44.02-.66.06s-.47.11-.73.19v-.74c.11-.04.23-.07.35-.1s.25-.06.38-.08.25-.04.37-.05.24-.02.36-.02c.34,0,.64.04.89.11s.47.18.64.31.3.3.39.5.13.42.13.66c0,.36-.09.67-.28.92s-.44.44-.77.59c.17.03.33.08.49.16s.31.18.43.3.23.27.31.43.12.35.12.55Z"/>
+    <path class="cls-8" d="M122.4,157.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M131.97,154.73h-1.09v1.41h-.87v-1.41h-3.07v-.75l2.72-4.22h1.22v4.22h1.09v.75ZM130.01,150.58l-2.22,3.4h2.22v-3.4Z"/>
+  </g>
+  <g>
+    <path class="cls-8" d="M150.69,144.14h-4.2v-.76l1.65-1.64c.27-.27.49-.5.66-.69s.3-.37.4-.53.16-.31.19-.46.05-.3.05-.46c0-.16-.02-.31-.06-.45s-.11-.27-.2-.37-.2-.19-.34-.25-.31-.09-.5-.09c-.27,0-.52.06-.74.18s-.42.28-.61.47l-.47-.56c.24-.25.52-.46.83-.61s.68-.23,1.1-.23c.28,0,.54.04.77.13s.43.21.6.37.3.35.39.59.14.49.14.78c0,.24-.03.47-.1.68s-.16.42-.3.62-.3.42-.5.64-.44.46-.71.73l-1.16,1.13h3.1v.81Z"/>
+    <path class="cls-8" d="M152.42,145.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M161.56,142.2c0,.28-.06.54-.17.79s-.28.46-.51.64-.51.33-.86.43-.75.16-1.21.16c-.25,0-.48,0-.68-.02s-.39-.04-.57-.06v-.76c.2.04.42.06.64.08s.45.03.69.03c.32,0,.59-.03.82-.09s.41-.14.55-.25.25-.24.31-.39.1-.33.1-.52c0-.18-.04-.33-.12-.46s-.19-.24-.33-.33-.31-.15-.51-.2-.41-.07-.65-.07h-.73v-.7h.74c.19,0,.37-.03.52-.08s.29-.12.41-.22.2-.21.26-.35.09-.3.09-.47c0-.34-.1-.59-.31-.75s-.51-.23-.92-.23c-.21,0-.44.02-.66.06s-.47.11-.73.19v-.74c.11-.04.23-.07.35-.1s.25-.06.38-.08.25-.04.37-.05.24-.02.36-.02c.34,0,.64.04.89.11s.47.18.64.31.3.3.39.5.13.42.13.66c0,.36-.09.67-.28.92s-.44.44-.77.59c.17.03.33.08.49.16s.31.18.43.3.23.27.31.43.12.35.12.55Z"/>
+    <path class="cls-8" d="M163.42,145.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M151,154.73h-1.09v1.41h-.87v-1.41h-3.07v-.75l2.72-4.22h1.22v4.22h1.09v.75ZM149.04,150.58l-2.22,3.4h2.22v-3.4Z"/>
+    <path class="cls-8" d="M152.42,157.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M161.52,154.1c0,.32-.07.6-.21.86s-.32.48-.56.67-.52.33-.85.44-.68.16-1.05.16c-.09,0-.2,0-.31,0s-.22-.01-.32-.02-.21-.02-.31-.03-.19-.02-.28-.03v-.77c.18.04.38.07.6.09s.46.03.69.03c.26,0,.49-.03.7-.09s.39-.15.53-.27.26-.26.34-.42.12-.35.12-.55c0-.4-.14-.69-.43-.87s-.69-.27-1.23-.27h-1.21v-3.26h3.44v.74h-2.64v1.79h.56c.31,0,.6.03.89.08s.55.15.77.29.41.32.55.56.21.52.21.88Z"/>
+  </g>
+  <circle class="cls-6" cx="185.79" cy="147.37" r="13.56"/>
+  <g>
+    <path class="cls-8" d="M182.59,142.2c0,.28-.06.54-.17.79s-.28.46-.51.64-.51.33-.86.43-.75.16-1.21.16c-.25,0-.48,0-.68-.02s-.39-.04-.57-.06v-.76c.2.04.42.06.64.08s.45.03.69.03c.32,0,.59-.03.82-.09s.41-.14.55-.25.25-.24.31-.39.1-.33.1-.52c0-.18-.04-.33-.12-.46s-.19-.24-.33-.33-.31-.15-.51-.2-.41-.07-.65-.07h-.73v-.7h.74c.19,0,.37-.03.52-.08s.29-.12.41-.22.2-.21.26-.35.09-.3.09-.47c0-.34-.1-.59-.31-.75s-.51-.23-.92-.23c-.21,0-.44.02-.66.06s-.47.11-.73.19v-.74c.11-.04.23-.07.35-.1s.25-.06.38-.08.25-.04.37-.05.24-.02.36-.02c.34,0,.64.04.89.11s.47.18.64.31.3.3.39.5.13.42.13.66c0,.36-.09.67-.28.92s-.44.44-.77.59c.17.03.33.08.49.16s.31.18.43.3.23.27.31.43.12.35.12.55Z"/>
+    <path class="cls-8" d="M184.45,145.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M194.03,142.73h-1.09v1.41h-.87v-1.41h-3.07v-.75l2.72-4.22h1.22v4.22h1.09v.75ZM192.07,138.58l-2.22,3.4h2.22v-3.4Z"/>
+    <path class="cls-8" d="M195.45,145.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M182.55,154.1c0,.32-.07.6-.21.86s-.32.48-.56.67-.52.33-.85.44-.68.16-1.05.16c-.09,0-.2,0-.31,0s-.22-.01-.32-.02-.21-.02-.31-.03-.19-.02-.28-.03v-.77c.18.04.38.07.6.09s.46.03.69.03c.26,0,.49-.03.7-.09s.39-.15.53-.27.26-.26.34-.42.12-.35.12-.55c0-.4-.14-.69-.43-.87s-.69-.27-1.23-.27h-1.21v-3.26h3.44v.74h-2.64v1.79h.56c.31,0,.6.03.89.08s.55.15.77.29.41.32.55.56.21.52.21.88Z"/>
+    <path class="cls-8" d="M184.45,157.14c.17,0,.33,0,.48-.04s.29-.09.41-.16.21-.16.29-.26.11-.22.11-.36-.02-.25-.07-.33-.1-.16-.16-.23-.11-.15-.16-.23-.07-.19-.07-.33c0-.07.01-.14.04-.21s.07-.14.12-.21.12-.11.21-.15.18-.06.3-.06.22.02.33.07.2.12.28.22.14.22.19.37.07.32.07.52c0,.27-.05.53-.15.78s-.25.47-.44.66-.44.35-.74.46-.64.17-1.03.17v-.67Z"/>
+    <path class="cls-8" d="M193.79,154.12c0,.29-.05.57-.16.83s-.26.48-.45.67-.43.34-.71.45-.58.16-.92.16-.66-.06-.93-.17-.5-.28-.68-.52-.32-.53-.42-.88-.14-.77-.14-1.26c0-.33.02-.64.06-.95s.11-.59.21-.86.23-.52.39-.74.37-.42.61-.58.53-.29.86-.38.71-.13,1.14-.13h.63v.74h-.68c-.38,0-.71.05-.99.14s-.51.22-.7.39-.33.37-.43.6-.16.5-.19.79l-.02.2c.21-.12.44-.22.71-.29s.56-.11.87-.11.6.05.85.14.44.23.61.39.28.37.36.6.12.49.12.77ZM192.9,154.17c0-.2-.02-.37-.07-.53s-.12-.29-.22-.4-.23-.19-.38-.25-.34-.09-.55-.09c-.12,0-.25.01-.38.03s-.25.05-.37.1-.24.09-.35.14-.21.11-.3.17c0,.42.03.77.09,1.05s.15.51.26.68.26.29.43.36.36.11.59.11c.19,0,.36-.03.51-.09s.29-.15.4-.27.2-.26.26-.43.1-.36.1-.57Z"/>
+  </g>
+</svg>

+ 715 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch08-Partitioning-Marbles-Status-Changes.svg

@@ -0,0 +1,715 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 767.72 562.01">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8be2ff;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="61.2" y1="520.39" x2="747.9" y2="520.39"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="183.98" y1="447.64" x2="747.9" y2="447.64"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="165.94" y1="236.57" x2="747.9" y2="236.57"/>
+  <line class="cls-2" x1="165.94" y1="219.19" x2="165.94" y2="254.2"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="114.65" y1="186.3" x2="747.9" y2="186.3"/>
+  <line class="cls-2" x1="104.38" y1="168.92" x2="104.38" y2="203.93"/>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="61.2" y1="139.85" x2="747.9" y2="139.85"/>
+  <line class="cls-2" x1="61.2" y1="122.47" x2="61.2" y2="157.48"/>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="30.52" y1="48.3" x2="747.9" y2="48.3"/>
+  <g>
+    <path class="cls-5" d="M29.25,19.59h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M40.57,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M46.77,25.26c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M53.77,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM52.71,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M57.4,20.44h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM57.76,17.13c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M61.45,19.59h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M73.56,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM72.5,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M75.43,19.59h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M86.81,25.48h-1.04v-3.52h-3.22v3.52h-1.04v-7.66h1.04v3.24h3.22v-3.24h1.04v7.66Z"/>
+    <path class="cls-5" d="M93.51,22.49c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM92.47,22.54c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.32,25.4c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M110.49,23.63c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-5" d="M120.15,25.48h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-5" d="M126.34,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM125.28,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M132.63,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M139.23,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M144.95,25.48l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM144.84,22.8h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M152,20.43c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM148.46,26.33c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM148.77,21.52c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M159.33,22.23c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM158.27,22.08c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M165.62,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.33,304.42h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M44.21,299.38h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM44.57,296.07c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M53.83,301.37c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM52.79,301.42c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M60.77,304.42h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-5" d="M66.97,301.16c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM65.91,301.02c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M73.25,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M79.85,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M85.57,304.42l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM85.46,301.74h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M92.62,299.36c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM89.08,305.26c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM89.4,300.45c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M99.95,301.16c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM98.89,301.02c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M106.24,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M110.49,302.57c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-5" d="M120.12,300.54c0,.69-.08,1.28-.24,1.78s-.38.91-.66,1.24-.6.57-.97.73-.76.24-1.17.24c-.49,0-.92-.09-1.29-.27s-.67-.43-.91-.77-.42-.75-.54-1.23-.18-1.03-.18-1.63c0-.68.08-1.27.24-1.77s.38-.91.65-1.24.6-.57.96-.73.76-.24,1.17-.24c.49,0,.92.09,1.29.27s.67.44.91.77.42.74.54,1.22.18,1.02.18,1.62ZM119.03,300.61c0-.45-.03-.86-.1-1.23s-.18-.69-.33-.96-.35-.48-.59-.63-.53-.22-.87-.22-.61.08-.85.24-.43.37-.58.64-.27.59-.34.96-.11.75-.11,1.16c0,.45.04.87.11,1.24s.18.69.33.96.34.48.58.62.53.22.86.22.61-.08.85-.24.43-.37.59-.64.27-.59.34-.95.11-.75.11-1.17Z"/>
+    <path class="cls-5" d="M126.6,297.08c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M133.13,297.65h-2.27v6.77h-1.05v-6.77h-2.27v-.89h5.59v.89Z"/>
+    <path class="cls-5" d="M139.8,298.53l-2,5.26c-.21.54-.42,1-.64,1.38s-.46.7-.72.95-.55.43-.86.55-.66.18-1.05.18c-.1,0-.19,0-.28,0s-.17,0-.27-.02v-.93c.09.01.18.02.28.03s.21.01.32.01c.19,0,.36-.03.52-.08s.32-.14.46-.27.28-.28.42-.48.26-.43.39-.71l-2.35-5.88h1.16l1.49,3.89.3.91.34-.94,1.38-3.87h1.12Z"/>
+    <path class="cls-5" d="M146.2,301.37c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM145.15,301.42c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M152.74,301.16c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM151.67,301.02c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M158.81,303.86l-.64.64-3.94-3.29,3.94-3.29.64.65-3.19,2.62,3.19,2.65Z"/>
+    <path class="cls-5" d="M162.8,297.64h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-5" d="M173.16,304.42h-1.14l-.53-1.67h-3.19l-.54,1.67h-1.08l2.54-7.66h1.43l2.51,7.66ZM171.19,301.81l-1.29-4.1-1.29,4.1h2.59Z"/>
+    <path class="cls-5" d="M176.16,299.38h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM176.52,296.07c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M185.41,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M192.73,304.42h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-5" d="M198.92,301.16c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM197.86,301.02c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M205.21,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M211.8,302.81c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M217.52,304.42l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM217.41,301.74h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M224.58,299.36c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM221.04,305.26c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM221.35,300.45c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M231.91,301.16c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM230.85,301.02c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M238.69,297.65h-2.27v6.77h-1.05v-6.77h-2.27v-.89h5.59v.89Z"/>
+    <path class="cls-5" d="M245.37,298.53l-2,5.26c-.21.54-.42,1-.64,1.38s-.46.7-.72.95-.55.43-.86.55-.66.18-1.05.18c-.1,0-.19,0-.28,0s-.17,0-.27-.02v-.93c.09.01.18.02.28.03s.21.01.32.01c.19,0,.36-.03.52-.08s.32-.14.46-.27.28-.28.42-.48.26-.43.39-.71l-2.35-5.88h1.16l1.49,3.89.3.91.34-.94,1.38-3.87h1.12Z"/>
+    <path class="cls-5" d="M251.76,301.37c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM250.72,301.42c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M258.3,301.16c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM257.24,301.02c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M264.83,304.42h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M271.26,304.33c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M278.24,301.43c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM277.2,301.47c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M284.54,302.09c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M286.6,298.58l.63-.65,3.94,3.29-3.94,3.29-.63-.64,3.19-2.63-3.19-2.65Z"/>
+    <path class="cls-5" d="M296.44,306.88c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-5" d="M300.71,295.69c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-5" d="M57.71,316.97c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-5" d="M67.23,314.9c0,.37-.03.72-.08,1.05s-.15.65-.27.94-.29.55-.49.79-.44.44-.73.61-.62.3-1.01.39-.82.14-1.31.14h-1.64v-7.66h1.97c1.2,0,2.09.31,2.67.92s.88,1.56.88,2.82ZM66.13,314.98c0-.54-.05-1-.15-1.38s-.26-.68-.46-.91-.47-.4-.78-.5-.68-.16-1.1-.16h-.9v5.88h.78c1.74,0,2.61-.98,2.61-2.94Z"/>
+    <path class="cls-5" d="M70.6,313.78h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM70.96,310.47c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M79.85,317.21c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M86.53,318.73c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M90.39,313.78h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM90.75,310.47c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M94.99,312.93h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M106.15,318.6c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M112.92,318.73c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M119.81,316.15c0,.42-.06.8-.18,1.15s-.29.63-.52.87-.51.43-.85.56-.72.2-1.15.2c-.48,0-.88-.06-1.21-.19s-.6-.3-.81-.53-.36-.5-.46-.82-.14-.68-.14-1.07v-5.15h1.04v5.07c0,.3.03.56.08.79s.15.42.28.57.3.27.5.35.46.12.75.12c.55,0,.96-.16,1.23-.48s.4-.77.4-1.35v-5.06h1.04v4.99Z"/>
+    <path class="cls-5" d="M121.38,312.93h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M132.71,318.73c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M136.57,313.78h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM136.93,310.47c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M143.17,311.37h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M152.66,318.53c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-5" d="M159.09,318.81h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M164.74,318.81l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM164.63,316.14h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M167.56,312.93h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M178.39,313.76c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM174.85,319.66c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM175.16,314.85c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M185.72,315.56c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM184.66,315.42c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M187.05,316c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM188.1,315.93c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M197.47,321.28c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-5" d="M204.74,318.81v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.25-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-5" d="M218.62,315.03h-5.04v-.86h5.04v.86ZM218.62,317.07h-5.04v-.86h5.04v.86Z"/>
+    <path class="cls-5" d="M220.63,312.98l.63-.65,3.94,3.29-3.94,3.29-.63-.64,3.19-2.63-3.19-2.65Z"/>
+    <path class="cls-5" d="M237.73,318.81v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.25-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-5" d="M242.45,316.97c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-5" d="M251.7,318.81h-1.36l-2.23-4.78-.64-1.54v6.31h-.97v-7.66h1.34l2.13,4.52.77,1.75v-6.28h.97v7.66Z"/>
+    <path class="cls-5" d="M257.11,318.81l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM257,316.14h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M259.38,312.93h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M268.53,313.78h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM268.89,310.47c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M277.36,313.76c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM273.82,319.66c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM274.13,314.85c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M283.5,318.81l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM283.39,316.14h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M291.06,318.73c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M294.92,313.78h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM295.28,310.47c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M304.63,315.83c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM303.59,315.87c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M306.11,312.93h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M317.61,316.74c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-5" d="M324.05,318.73c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M329.68,318.81l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM329.57,316.14h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M337.24,318.73c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M343.83,318.81h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M350.35,317.21c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M353.49,310.09c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-5" d="M361.21,316.97c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-5" d="M370.39,316.74c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-5" d="M377.38,318.81h-1.4l-2.74-3.15v3.15h-1.02v-8.28h1.02v5.09l2.64-2.69h1.35l-2.76,2.71,2.91,3.17Z"/>
+    <path class="cls-5" d="M380.69,313.78h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM381.05,310.47c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M390.31,315.77c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM389.27,315.81c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M395.4,321.28c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-5" d="M403.38,318.81h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M406.28,310.09c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M34.04,111.81c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,111.86c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M40.57,111.61c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,111.46c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M42.44,108.98h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M53.71,112.79c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-5" d="M60.13,114.86h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M64,109.82h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,106.51c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.62,111.81c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM72.58,111.86c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M80.53,110.98c0,.69-.08,1.28-.24,1.78s-.38.91-.66,1.24-.6.57-.97.73-.76.24-1.17.24c-.49,0-.92-.09-1.29-.27s-.67-.43-.91-.77-.42-.75-.54-1.23-.18-1.03-.18-1.63c0-.68.08-1.27.24-1.77s.38-.91.65-1.24.6-.57.96-.73.76-.24,1.17-.24c.49,0,.92.09,1.29.27s.67.44.91.77.42.74.54,1.22.18,1.02.18,1.62ZM79.45,111.06c0-.45-.03-.86-.1-1.23s-.18-.69-.33-.96-.35-.48-.59-.63-.53-.22-.87-.22-.61.08-.85.24-.43.37-.58.64-.27.59-.34.96-.11.75-.11,1.16c0,.45.04.87.11,1.24s.18.69.33.96.34.48.58.62.53.22.86.22.61-.08.85-.24.43-.37.59-.64.27-.59.34-.95.11-.75.11-1.17Z"/>
+    <path class="cls-5" d="M86.82,111.81c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM85.77,111.86c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M93.05,113.26c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M99.95,111.61c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM98.89,111.46c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M101.82,108.98h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M107.63,108.98h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M118.56,114.86l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM118.45,112.18h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M126.4,111.81c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM125.36,111.86c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M129.98,107.42h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M139.54,111.61c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM138.48,111.46c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M145.83,113.26c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,490.97c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.33,492.57h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M44.21,487.53h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM44.57,484.22c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M53.83,489.52c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM52.79,489.57c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M60.3,490.5c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-5" d="M66.74,492.49c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M72.37,492.57l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM72.26,489.89h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M79.93,492.49c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.52,492.57h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M93.05,490.97c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M99.88,492.28c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-5" d="M106.31,492.57h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M111.96,492.57l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,489.89h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M114.78,486.69h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M125.61,487.52c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM122.07,493.42c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM122.38,488.61c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M132.94,489.32c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,489.17c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M139.23,490.97c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="61.2" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M57.54,51.85l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM62.52,48.42l-1.35-4.11-1.34,4.11h2.69Z"/>
+      <path class="cls-5" d="M51.71,72.25h-.97v-6.26l-1.89,4.26h-.59l-1.88-4.26v6.26h-.9v-7.27h1.32l1.82,4.05,1.75-4.05h1.34v7.27Z"/>
+      <path class="cls-5" d="M57.6,69.52c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM56.65,69.52c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M63.03,69.52c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM62.08,69.52c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M66.86,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M69.9,72.37c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM70.97,68.91c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M76.99,72.25h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM76.07,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="270.3" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M266.64,51.85l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM271.61,48.42l-1.35-4.11-1.34,4.11h2.69Z"/>
+      <path class="cls-5" d="M260.81,72.25h-.97v-6.26l-1.89,4.26h-.59l-1.88-4.26v6.26h-.9v-7.27h1.32l1.82,4.05,1.75-4.05h1.34v7.27Z"/>
+      <path class="cls-5" d="M266.7,69.52c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM265.75,69.52c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M272.13,69.52c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM271.18,69.52c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M275.96,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M278.99,72.37c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM280.07,68.91c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M286.09,72.25h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM285.17,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="61.2" cy="140.5" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M57.54,144.05l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM62.52,140.62l-1.35-4.11-1.34,4.11h2.69Z"/>
+      <path class="cls-5" d="M51.71,164.45h-.97v-6.26l-1.89,4.26h-.59l-1.88-4.26v6.26h-.9v-7.27h1.32l1.82,4.05,1.75-4.05h1.34v7.27Z"/>
+      <path class="cls-5" d="M57.6,161.72c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM56.65,161.72c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M63.03,161.72c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM62.08,161.72c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M66.86,159.98h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M69.9,164.58c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM70.97,161.11c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M76.99,164.45h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM76.07,163.12v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="270.3" cy="140.5" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M266.64,144.05l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM271.61,140.62l-1.35-4.11-1.34,4.11h2.69Z"/>
+      <path class="cls-5" d="M260.81,164.45h-.97v-6.26l-1.89,4.26h-.59l-1.88-4.26v6.26h-.9v-7.27h1.32l1.82,4.05,1.75-4.05h1.34v7.27Z"/>
+      <path class="cls-5" d="M266.7,161.72c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM265.75,161.72c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M272.13,161.72c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM271.18,161.72c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M275.96,159.98h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M278.99,164.58c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM280.07,161.11c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M286.09,164.45h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM285.17,163.12v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="714.6" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M710.95,51.85l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM715.92,48.42l-1.35-4.11-1.34,4.11h2.69Z"/>
+      <path class="cls-5" d="M705.11,72.25h-.97v-6.26l-1.89,4.26h-.59l-1.88-4.26v6.26h-.9v-7.27h1.32l1.82,4.05,1.75-4.05h1.34v7.27Z"/>
+      <path class="cls-5" d="M711,69.52c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.33.25,1.77.75c.44.5.66,1.21.66,2.13ZM710.06,69.52c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M716.43,69.52c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.33.25,1.77.75c.44.5.66,1.21.66,2.13ZM715.49,69.52c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M720.27,67.78h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M723.3,72.37c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM724.37,68.91c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M730.39,72.25h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM729.47,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="714.6" cy="140.5" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M710.95,144.05l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM715.92,140.62l-1.35-4.11-1.34,4.11h2.69Z"/>
+      <path class="cls-5" d="M705.11,164.45h-.97v-6.26l-1.89,4.26h-.59l-1.88-4.26v6.26h-.9v-7.27h1.32l1.82,4.05,1.75-4.05h1.34v7.27Z"/>
+      <path class="cls-5" d="M711,161.72c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.33.25,1.77.75c.44.5.66,1.21.66,2.13ZM710.06,161.72c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M716.43,161.72c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.33.25,1.77.75c.44.5.66,1.21.66,2.13ZM715.49,161.72c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M720.27,159.98h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M723.3,164.58c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM724.37,161.11c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M730.39,164.45h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM729.47,163.12v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="104.38" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M107.65,49.17c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM106.03,45.25c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM106.44,49.22c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M84.3,72.25l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM88.45,69.39l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M92.59,72.35c-.5,0-.89-.14-1.17-.43s-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64s.05.29.11.42c.06.11.15.2.27.26s.29.09.5.09c.15,0,.29-.02.43-.07s.24-.08.3-.11h.05v.83c-.17.05-.35.09-.52.11s-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M93.57,72.25l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM97.72,69.39l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M104.57,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M108.03,72.37c-.37,0-.72-.06-1.03-.17s-.58-.29-.81-.52-.4-.53-.52-.89-.19-.78-.19-1.26.06-.89.19-1.24.3-.64.52-.88.48-.42.8-.55.67-.19,1.03-.19c.3,0,.59.04.87.13s.53.18.74.29v1.03h-.05c-.06-.06-.15-.12-.25-.19s-.23-.15-.37-.22c-.13-.06-.28-.12-.45-.17s-.34-.07-.5-.07c-.48,0-.86.18-1.15.54s-.43.87-.43,1.53.14,1.15.42,1.51.67.54,1.16.54c.3,0,.58-.06.85-.19s.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15s-.26.1-.37.13c-.16.05-.3.08-.42.1s-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M114.76,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M120.54,69.52c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM119.59,69.52c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M124.37,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="417.18" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M420.45,49.17c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM418.83,45.25c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM419.24,49.22c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M371.32,72.4c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M379.55,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M385.04,72.25h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM384.12,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M388.74,72.37c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM389.81,68.91c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M394.52,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M401.85,66.79l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M405.62,71.67c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM405.62,70.9v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M412.04,66.79l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M415.34,72.4c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M420.76,72.38c-.36,0-.71-.05-1.02-.15s-.58-.2-.79-.31v-1.03h.05c.08.06.17.13.28.21s.25.15.42.23c.16.07.33.14.52.19s.38.08.58.08c.15,0,.3-.02.47-.05s.29-.08.37-.13c.11-.07.2-.15.25-.24s.08-.21.08-.38c0-.22-.06-.38-.18-.49s-.33-.2-.63-.28c-.12-.03-.27-.06-.46-.1s-.36-.08-.52-.13c-.42-.12-.72-.31-.91-.56s-.28-.56-.28-.92c0-.49.19-.89.56-1.2s.86-.46,1.48-.46c.3,0,.61.04.91.11s.56.17.77.28v.98h-.05c-.23-.19-.5-.33-.78-.44s-.58-.16-.87-.16-.56.06-.77.19-.31.32-.31.58c0,.23.06.4.19.51s.32.2.6.28c.14.04.29.07.46.1s.34.07.53.12c.4.1.71.27.91.5s.31.55.31.96c0,.23-.05.46-.14.67s-.23.39-.41.54c-.2.16-.42.29-.66.37s-.55.13-.93.13Z"/>
+      <path class="cls-5" d="M424.75,65.88h-1.04v-.95h1.04v.95ZM424.69,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M430.32,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M431.81,73.12c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1s.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM434.9,70.77v-2.99c-.23-.11-.44-.19-.63-.24s-.39-.07-.58-.07c-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M437.22,72.25v-7.27h4.55v.86h-3.58v1.99h3.33v.86h-3.33v2.7h3.58v.86h-4.55Z"/>
+      <path class="cls-5" d="M447.04,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M448.52,73.12c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.73.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM451.61,70.77v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.47,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.3,1.38c.2.32.53.47.99.47.24,0,.48-.05.73-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M454.86,65.88h-1.04v-.95h1.04v.95ZM454.79,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M460.43,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M464.09,72.37c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.46-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.34.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.53-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.14.03-.33.04-.55.04ZM465.16,68.91c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="412.18" cy="185.8" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M415.45,186.67c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM413.83,182.76c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM414.24,186.72c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M366.32,209.9c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M374.55,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M380.04,209.75h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM379.12,208.42v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M383.74,209.87c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM384.81,206.41c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M389.52,205.28h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M396.85,204.29l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M400.62,209.17c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM400.62,208.4v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M407.04,204.29l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M410.34,209.9c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M415.76,209.88c-.36,0-.71-.05-1.02-.15s-.58-.2-.79-.31v-1.03h.05c.08.06.17.13.28.21s.25.15.42.23c.16.07.33.14.52.19s.38.08.58.08c.15,0,.3-.02.47-.05s.29-.08.37-.13c.11-.07.2-.15.25-.24s.08-.21.08-.38c0-.22-.06-.38-.18-.49s-.33-.2-.63-.28c-.12-.03-.27-.06-.46-.1s-.36-.08-.52-.13c-.42-.12-.72-.31-.91-.56s-.28-.56-.28-.92c0-.49.19-.89.56-1.2s.86-.46,1.48-.46c.3,0,.61.04.91.11s.56.17.77.28v.98h-.05c-.23-.19-.5-.33-.78-.44s-.58-.16-.87-.16-.56.06-.77.19-.31.32-.31.58c0,.23.06.4.19.51s.32.2.6.28c.14.04.29.07.46.1s.34.07.53.12c.4.1.71.27.91.5s.31.55.31.96c0,.23-.05.46-.14.67s-.23.39-.41.54c-.2.16-.42.29-.66.37s-.55.13-.93.13Z"/>
+      <path class="cls-5" d="M419.75,203.38h-1.04v-.95h1.04v.95ZM419.69,209.75h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M425.32,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M426.81,210.62c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1s.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM429.9,208.27v-2.99c-.23-.11-.44-.19-.63-.24s-.39-.07-.58-.07c-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M432.21,209.75v-7.27h4.55v.86h-3.58v1.99h3.33v.86h-3.33v2.7h3.58v.86h-4.55Z"/>
+      <path class="cls-5" d="M442.04,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M443.52,210.62c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.73.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM446.61,208.27v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.47,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.3,1.38c.2.32.53.47.99.47.24,0,.48-.05.73-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M449.86,203.38h-1.04v-.95h1.04v.95ZM449.79,209.75h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M455.43,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M459.09,209.87c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.46-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.34.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.53-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.14.03-.33.04-.55.04ZM460.16,206.41c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="645.23" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M648.49,49.17c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM646.88,45.25c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM647.29,49.22c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M599.37,72.4c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M607.6,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M613.09,72.25h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM612.17,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M616.78,72.37c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM617.86,68.91c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M622.57,67.78h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M629.89,66.79l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M633.66,71.67c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.27.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.31-.12-.07-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM633.66,70.9v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M640.08,66.79l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M643.39,72.4c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M648.81,72.38c-.36,0-.71-.05-1.02-.15s-.58-.2-.79-.31v-1.03h.05c.08.06.17.13.28.21.11.07.25.15.42.23.16.07.33.14.52.19.19.06.38.08.58.08.15,0,.3-.02.47-.05s.29-.08.37-.13c.11-.07.2-.15.25-.24.05-.08.08-.21.08-.38,0-.22-.06-.38-.18-.49-.12-.11-.33-.2-.63-.28-.12-.03-.27-.06-.46-.1-.19-.04-.36-.08-.52-.13-.42-.12-.72-.31-.91-.56-.19-.25-.28-.56-.28-.92,0-.49.19-.89.56-1.2s.86-.46,1.48-.46c.3,0,.61.04.91.11.31.07.56.17.77.28v.98h-.05c-.23-.19-.5-.33-.78-.44s-.58-.16-.87-.16-.56.06-.77.19c-.21.13-.31.32-.31.58,0,.23.06.4.19.51.12.11.32.2.6.28.14.04.29.07.46.1.17.03.34.07.53.12.4.1.71.27.91.5.2.23.3.55.3.96,0,.23-.05.46-.14.67s-.23.39-.41.54c-.2.16-.42.29-.66.37-.25.08-.55.13-.93.13Z"/>
+      <path class="cls-5" d="M652.8,65.88h-1.04v-.95h1.04v.95ZM652.74,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M658.37,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M659.85,73.12c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM662.94,70.77v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M665.26,72.25v-7.27h4.55v.86h-3.58v1.99h3.33v.86h-3.33v2.7h3.58v.86h-4.55Z"/>
+      <path class="cls-5" d="M675.08,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M676.57,73.12c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM679.65,70.77v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M682.9,65.88h-1.04v-.95h1.04v.95ZM682.84,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M688.47,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M692.13,72.37c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM693.2,68.91c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="640.23" cy="185.8" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M643.49,186.67c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM641.88,182.76c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM642.29,186.72c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M594.37,209.9c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M602.6,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M608.09,209.75h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM607.17,208.42v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M611.78,209.87c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM612.86,206.41c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M617.57,205.28h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M624.89,204.29l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M628.66,209.17c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.27.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.31-.12-.07-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM628.66,208.4v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M635.08,204.29l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M638.39,209.9c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M643.81,209.88c-.36,0-.71-.05-1.02-.15s-.58-.2-.79-.31v-1.03h.05c.08.06.17.13.28.21.11.07.25.15.42.23.16.07.33.14.52.19.19.06.38.08.58.08.15,0,.3-.02.47-.05s.29-.08.37-.13c.11-.07.2-.15.25-.24.05-.08.08-.21.08-.38,0-.22-.06-.38-.18-.49-.12-.11-.33-.2-.63-.28-.12-.03-.27-.06-.46-.1-.19-.04-.36-.08-.52-.13-.42-.12-.72-.31-.91-.56-.19-.25-.28-.56-.28-.92,0-.49.19-.89.56-1.2s.86-.46,1.48-.46c.3,0,.61.04.91.11.31.07.56.17.77.28v.98h-.05c-.23-.19-.5-.33-.78-.44s-.58-.16-.87-.16-.56.06-.77.19c-.21.13-.31.32-.31.58,0,.23.06.4.19.51.12.11.32.2.6.28.14.04.29.07.46.1.17.03.34.07.53.12.4.1.71.27.91.5.2.23.3.55.3.96,0,.23-.05.46-.14.67s-.23.39-.41.54c-.2.16-.42.29-.66.37-.25.08-.55.13-.93.13Z"/>
+      <path class="cls-5" d="M647.8,203.38h-1.04v-.95h1.04v.95ZM647.74,209.75h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M653.37,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M654.85,210.62c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM657.94,208.27v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M660.26,209.75v-7.27h4.55v.86h-3.58v1.99h3.33v.86h-3.33v2.7h3.58v.86h-4.55Z"/>
+      <path class="cls-5" d="M670.08,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M671.57,210.62c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM674.65,208.27v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M677.9,203.38h-1.04v-.95h1.04v.95ZM677.84,209.75h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M683.47,209.75h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M687.13,209.87c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM688.2,206.41c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="227.76" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M231.03,49.17c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM229.41,45.25c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM229.82,49.22c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M207.68,72.25l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM211.82,69.39l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M215.97,72.35c-.5,0-.89-.14-1.17-.43s-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64s.05.29.11.42c.06.11.15.2.27.26s.29.09.5.09c.15,0,.29-.02.43-.07s.24-.08.3-.11h.05v.83c-.17.05-.35.09-.52.11s-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M216.95,72.25l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM221.09,69.39l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M227.95,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M231.4,72.37c-.37,0-.72-.06-1.03-.17s-.58-.29-.81-.52-.4-.53-.52-.89-.19-.78-.19-1.26.06-.89.19-1.24.3-.64.52-.88.48-.42.8-.55.67-.19,1.03-.19c.3,0,.59.04.87.13s.53.18.74.29v1.03h-.05c-.06-.06-.15-.12-.25-.19s-.23-.15-.37-.22c-.13-.06-.28-.12-.45-.17s-.34-.07-.5-.07c-.48,0-.86.18-1.15.54s-.43.87-.43,1.53.14,1.15.42,1.51.67.54,1.16.54c.3,0,.58-.06.85-.19s.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15s-.26.1-.37.13c-.16.05-.3.08-.42.1s-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M238.14,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M243.91,69.52c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM242.97,69.52c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M247.75,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="104.38" cy="186.78" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M107.65,187.65c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM106.03,183.74c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM106.44,187.7c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M84.3,210.73l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM88.45,207.87l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M92.59,210.84c-.5,0-.89-.14-1.17-.43s-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64s.05.29.11.42c.06.11.15.2.27.26s.29.09.5.09c.15,0,.29-.02.43-.07s.24-.08.3-.11h.05v.83c-.17.05-.35.09-.52.11s-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M93.57,210.73l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM97.72,207.87l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M104.57,210.73h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M108.03,210.85c-.37,0-.72-.06-1.03-.17s-.58-.29-.81-.52-.4-.53-.52-.89-.19-.78-.19-1.26.06-.89.19-1.24.3-.64.52-.88.48-.42.8-.55.67-.19,1.03-.19c.3,0,.59.04.87.13s.53.18.74.29v1.03h-.05c-.06-.06-.15-.12-.25-.19s-.23-.15-.37-.22c-.13-.06-.28-.12-.45-.17s-.34-.07-.5-.07c-.48,0-.86.18-1.15.54s-.43.87-.43,1.53.14,1.15.42,1.51.67.54,1.16.54c.3,0,.58-.06.85-.19s.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15s-.26.1-.37.13c-.16.05-.3.08-.42.1s-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M114.76,210.73h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M120.54,208.01c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM119.59,208.01c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M124.37,206.26h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="227.76" cy="186.78" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M231.03,187.65c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM229.41,183.74c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM229.82,187.7c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M207.68,210.73l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM211.82,207.87l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M215.97,210.84c-.5,0-.89-.14-1.17-.43s-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64s.05.29.11.42c.06.11.15.2.27.26s.29.09.5.09c.15,0,.29-.02.43-.07s.24-.08.3-.11h.05v.83c-.17.05-.35.09-.52.11s-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M216.95,210.73l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM221.09,207.87l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M227.95,210.73h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M231.4,210.85c-.37,0-.72-.06-1.03-.17s-.58-.29-.81-.52-.4-.53-.52-.89-.19-.78-.19-1.26.06-.89.19-1.24.3-.64.52-.88.48-.42.8-.55.67-.19,1.03-.19c.3,0,.59.04.87.13s.53.18.74.29v1.03h-.05c-.06-.06-.15-.12-.25-.19s-.23-.15-.37-.22c-.13-.06-.28-.12-.45-.17s-.34-.07-.5-.07c-.48,0-.86.18-1.15.54s-.43.87-.43,1.53.14,1.15.42,1.51.67.54,1.16.54c.3,0,.58-.06.85-.19s.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15s-.26.1-.37.13c-.16.05-.3.08-.42.1s-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M238.14,210.73h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M243.91,208.01c0,.92-.22,1.63-.66,2.13s-1.03.75-1.77.75-1.35-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12,1.04-.76,1.77-.76,1.32.25,1.77.75.66,1.21.66,2.13ZM242.97,208.01c0-.71-.13-1.23-.39-1.57s-.62-.52-1.1-.52-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M247.75,206.26h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="165.94" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M166.63,52c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M132.81,72.4c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M141.04,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M146.53,72.25h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM145.61,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M150.23,72.37c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM151.3,68.91c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M156.01,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M163.34,66.79l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M167.11,71.67c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM167.11,70.9v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M173.53,66.79l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M176.32,72.38c-.53,0-.98-.05-1.35-.16s-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7s.79.25,1.17.25c.53,0,.94-.11,1.21-.33s.41-.52.41-.88c0-.29-.07-.53-.21-.71s-.37-.32-.68-.41c-.22-.06-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.06-.48-.15-.67-.25s-.37-.23-.53-.4c-.15-.16-.27-.35-.35-.56s-.12-.47-.12-.75c0-.59.23-1.08.69-1.48s1.04-.6,1.76-.6c.41,0,.79.04,1.15.12s.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55s-.74-.24-1.14-.24c-.45,0-.81.1-1.09.31s-.42.49-.42.83c0,.31.08.56.24.74s.4.32.71.4c.21.06.46.12.75.19s.54.13.74.19c.5.15.87.38,1.1.69s.35.69.35,1.14c0,.28-.06.56-.17.84s-.28.51-.49.7c-.23.21-.5.37-.79.49s-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M182.84,71.67c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM182.84,70.9v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M186.04,65.88h-1.04v-.95h1.04v.95ZM185.98,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M188.27,72.25h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M190.63,65.88h-1.04v-.95h1.04v.95ZM190.57,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M196.2,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M197.69,73.12c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1s.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM200.77,70.77v-2.99c-.23-.11-.44-.19-.63-.24s-.39-.07-.58-.07c-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="165.94" cy="236.57" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M166.63,240.27c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M132.81,260.67c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M141.04,260.52h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M146.53,260.52h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM145.61,259.19v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M150.23,260.64c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM151.3,257.18c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M156.01,256.05h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M163.34,255.06l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M167.11,259.93c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM167.11,259.17v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M173.53,255.06l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M176.32,260.65c-.53,0-.98-.05-1.35-.16s-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7s.79.25,1.17.25c.53,0,.94-.11,1.21-.33s.41-.52.41-.88c0-.29-.07-.53-.21-.71s-.37-.32-.68-.41c-.22-.06-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.06-.48-.15-.67-.25s-.37-.23-.53-.4c-.15-.16-.27-.35-.35-.56s-.12-.47-.12-.75c0-.59.23-1.08.69-1.48s1.04-.6,1.76-.6c.41,0,.79.04,1.15.12s.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55s-.74-.24-1.14-.24c-.45,0-.81.1-1.09.31s-.42.49-.42.83c0,.31.08.56.24.74s.4.32.71.4c.21.06.46.12.75.19s.54.13.74.19c.5.15.87.38,1.1.69s.35.69.35,1.14c0,.28-.06.56-.17.84s-.28.51-.49.7c-.23.21-.5.37-.79.49s-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M182.84,259.93c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM182.84,259.17v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M186.04,254.15h-1.04v-.95h1.04v.95ZM185.98,260.52h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M188.27,260.52h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M190.63,254.15h-1.04v-.95h1.04v.95ZM190.57,260.52h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M196.2,260.52h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M197.69,261.39c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1s.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM200.77,259.04v-2.99c-.23-.11-.44-.19-.63-.24s-.39-.07-.58-.07c-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="328.59" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M329.28,52c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M295.45,72.4c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M303.69,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M309.18,72.25h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM308.26,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M312.87,72.37c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM313.95,68.91c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M318.66,67.78h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M325.98,66.79l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M329.75,71.67c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM329.75,70.9v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M336.17,66.79l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M338.97,72.38c-.53,0-.98-.05-1.35-.16s-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7s.79.25,1.17.25c.53,0,.94-.11,1.21-.33s.41-.52.41-.88c0-.29-.07-.53-.21-.71s-.37-.32-.68-.41c-.22-.06-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.06-.48-.15-.67-.25s-.37-.23-.53-.4c-.15-.16-.27-.35-.35-.56s-.12-.47-.12-.75c0-.59.23-1.08.69-1.48s1.04-.6,1.76-.6c.41,0,.79.04,1.15.12s.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55s-.74-.24-1.14-.24c-.45,0-.81.1-1.09.31s-.42.49-.42.83c0,.31.08.56.24.74s.4.32.71.4c.21.06.46.12.75.19s.54.13.74.19c.5.15.87.38,1.1.69s.35.69.35,1.14c0,.28-.06.56-.17.84s-.28.51-.49.7c-.23.21-.5.37-.79.49s-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M345.48,71.67c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM345.48,70.9v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M348.69,65.88h-1.04v-.95h1.04v.95ZM348.62,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M350.92,72.25h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M353.28,65.88h-1.04v-.95h1.04v.95ZM353.21,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M358.85,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M360.33,73.12c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1s.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM363.42,70.77v-2.99c-.23-.11-.44-.19-.63-.24s-.39-.07-.58-.07c-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="555.05" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M555.74,52c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M521.91,72.4c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M530.15,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M535.63,72.25h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM534.72,70.92v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M539.33,72.37c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM540.4,68.91c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M545.12,67.78h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M552.44,66.79l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M556.21,71.67c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.27.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.31-.12-.07-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM556.21,70.9v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M562.63,66.79l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M565.42,72.38c-.53,0-.98-.05-1.34-.16-.37-.11-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7.4.16.79.25,1.17.25.53,0,.94-.11,1.21-.33s.41-.52.41-.88c0-.29-.07-.53-.21-.71-.14-.18-.37-.32-.68-.41-.22-.06-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.06-.47-.15-.67-.25-.2-.1-.37-.23-.53-.4-.15-.16-.27-.35-.35-.56s-.12-.47-.12-.75c0-.59.23-1.08.69-1.48s1.04-.6,1.76-.6c.41,0,.79.04,1.16.12.36.08.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55s-.74-.24-1.14-.24c-.45,0-.81.1-1.09.31-.28.21-.42.49-.42.83,0,.31.08.56.24.74.16.18.4.32.71.4.21.06.46.12.75.19.3.07.54.13.74.19.5.15.87.38,1.1.69.23.31.35.69.35,1.14,0,.28-.06.56-.17.84-.12.28-.28.51-.49.7-.23.21-.5.37-.79.49-.29.11-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M571.94,71.67c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.27.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.31-.12-.07-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM571.94,70.9v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M575.15,65.88h-1.04v-.95h1.04v.95ZM575.08,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M577.38,72.25h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M579.74,65.88h-1.04v-.95h1.04v.95ZM579.67,72.25h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M585.31,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M586.79,73.12c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM589.88,70.77v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="555.05" cy="236.07" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M555.74,239.77c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M521.91,260.17c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M530.15,260.01h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M535.63,260.01h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM534.72,258.69v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M539.33,260.14c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.34.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM540.4,256.68c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M545.12,255.55h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M552.44,254.56l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M556.21,259.43c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.27.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.31-.12-.07-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM556.21,258.67v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M562.63,254.56l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M565.42,260.15c-.53,0-.98-.05-1.34-.16-.37-.11-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7.4.16.79.25,1.17.25.53,0,.94-.11,1.21-.33s.41-.52.41-.88c0-.29-.07-.53-.21-.71-.14-.18-.37-.32-.68-.41-.22-.06-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.06-.47-.15-.67-.25-.2-.1-.37-.23-.53-.4-.15-.16-.27-.35-.35-.56s-.12-.47-.12-.75c0-.59.23-1.08.69-1.48s1.04-.6,1.76-.6c.41,0,.79.04,1.16.12.36.08.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55s-.74-.24-1.14-.24c-.45,0-.81.1-1.09.31-.28.21-.42.49-.42.83,0,.31.08.56.24.74.16.18.4.32.71.4.21.06.46.12.75.19.3.07.54.13.74.19.5.15.87.38,1.1.69.23.31.35.69.35,1.14,0,.28-.06.56-.17.84-.12.28-.28.51-.49.7-.23.21-.5.37-.79.49-.29.11-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M571.94,259.43c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.27.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.31-.12-.07-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM571.94,258.67v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M575.15,253.65h-1.04v-.95h1.04v.95ZM575.08,260.01h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M577.38,260.01h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M579.74,253.65h-1.04v-.95h1.04v.95ZM579.67,260.01h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M585.31,260.01h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M586.79,260.89c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM589.88,258.54v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="555.05" cy="447.77" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M555.74,451.48c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.79.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.24.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M521.91,471.87c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M530.15,471.72h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M535.63,471.72h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.04-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89-.1-.35-.15-.76-.15-1.22s.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM534.72,470.39v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47c.21.34.53.51.99.51.24,0,.48-.05.73-.16.24-.11.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M539.33,471.85c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.33.76.5,1.32.5.2,0,.4-.02.59-.07.19-.04.37-.1.52-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM540.4,468.39c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11c-.17.07-.33.18-.47.32-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M545.12,467.25h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.5.88-.63.25-.12.49-.18.72-.18.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M552.44,466.27l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M556.21,471.14c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55-.09-.22-.13-.45-.13-.7,0-.38.08-.7.24-.96.16-.26.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.3-.12-.07-.26-.12-.43-.15-.17-.03-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.15-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM556.21,470.38v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.08-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19.23-.13.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M562.63,466.27l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M565.42,471.85c-.53,0-.98-.05-1.34-.16-.37-.11-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7.4.16.79.25,1.17.25.53,0,.94-.11,1.21-.33.27-.22.41-.52.41-.88,0-.29-.07-.53-.21-.71-.14-.18-.37-.32-.68-.41-.22-.07-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.07-.47-.15-.67-.25-.2-.1-.37-.23-.53-.4-.15-.16-.27-.35-.35-.56-.08-.22-.12-.47-.12-.75,0-.59.23-1.08.69-1.48.46-.4,1.04-.6,1.76-.6.41,0,.79.04,1.16.12.36.08.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55-.36-.16-.74-.24-1.14-.24-.45,0-.81.1-1.09.32-.28.21-.42.49-.42.83,0,.31.08.56.24.74.16.18.4.32.71.4.21.05.46.12.75.19.3.07.54.13.74.19.5.15.87.38,1.1.69.23.31.35.69.35,1.14,0,.28-.06.56-.17.84-.12.28-.28.51-.49.7-.23.21-.5.38-.79.49-.29.11-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M571.94,471.14c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55-.09-.22-.13-.45-.13-.7,0-.38.08-.7.24-.96.16-.26.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.3-.12-.07-.26-.12-.43-.15-.17-.03-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.15-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM571.94,470.38v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.08-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19.23-.13.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M575.15,465.35h-1.04v-.95h1.04v.95ZM575.08,471.72h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M577.38,471.72h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M579.74,465.35h-1.04v-.95h1.04v.95ZM579.67,471.72h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M585.31,471.72h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M586.79,472.59c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2.13-.35.3-.65.51-.89.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM589.88,470.24v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.31,1.38c.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="555.05" cy="520.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M555.74,524.23c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M521.91,544.62c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.33.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15.23-.1.42-.25.55-.44.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5-.31.11-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M530.15,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M535.63,544.47h-.92v-.56c-.14.12-.27.22-.37.3-.1.08-.23.15-.37.21-.13.06-.26.11-.41.14-.14.03-.3.05-.49.05-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89-.1-.35-.15-.76-.15-1.22s.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.13.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM534.72,543.14v-3.14c-.23-.11-.43-.19-.61-.23-.18-.04-.38-.06-.59-.06-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47c.21.34.53.51.99.51.24,0,.48-.05.73-.16.24-.11.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M539.33,544.6c-.87,0-1.54-.25-2.02-.74-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46.2.21.35.46.45.76.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.33.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.08.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.09-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM540.4,541.14c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M545.12,540h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.47.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.72-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M552.44,539.02l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M556.21,543.89c-.07.05-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2-.15.04-.36.07-.64.07-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.26.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.3-.12-.08-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.09-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58.1.24.15.53.15.87v3.73h-.91v-.58ZM556.21,543.13v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.16-.24.37-.24.65,0,.31.09.55.26.71.18.16.43.24.77.24.29,0,.55-.06.79-.19.23-.12.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M562.63,539.02l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M565.42,544.6c-.53,0-.98-.05-1.34-.16-.37-.11-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7.4.17.79.25,1.17.25.53,0,.94-.11,1.21-.33.27-.22.41-.52.41-.88,0-.29-.07-.53-.21-.71-.14-.18-.37-.32-.68-.41-.22-.07-.43-.12-.62-.16-.19-.04-.42-.1-.7-.17-.25-.07-.47-.15-.67-.25-.2-.1-.37-.23-.53-.4-.15-.16-.27-.35-.35-.56-.08-.22-.12-.47-.12-.75,0-.59.23-1.08.69-1.48.46-.4,1.04-.6,1.76-.6.41,0,.79.04,1.16.12.36.08.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55-.36-.16-.74-.24-1.14-.24-.45,0-.81.1-1.09.31-.28.21-.42.49-.42.83,0,.31.08.55.24.74.16.18.4.32.71.4.21.05.46.12.75.19.3.07.54.13.74.19.5.15.87.38,1.1.69.23.31.35.69.35,1.14,0,.28-.06.56-.17.84-.12.28-.28.51-.49.7-.23.21-.5.37-.79.49-.29.11-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M571.94,543.89c-.07.05-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2-.15.04-.36.07-.64.07-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.26.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.3-.12-.08-.26-.12-.43-.15-.17-.02-.34-.04-.52-.04-.21,0-.46.03-.75.09-.29.06-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16.32-.06.63-.09.94-.09.38,0,.69.03.95.09.26.06.49.16.69.32.2.15.35.34.44.58.1.24.15.53.15.87v3.73h-.91v-.58ZM571.94,543.13v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.07-.45.19-.61.34-.16.16-.24.37-.24.65,0,.31.09.55.26.71.18.16.43.24.77.24.29,0,.55-.06.79-.19.23-.12.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M575.15,538.1h-1.04v-.95h1.04v.95ZM575.08,544.47h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M577.38,544.47h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M579.74,538.1h-1.04v-.95h1.04v.95ZM579.67,544.47h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M585.31,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M586.79,545.34c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.08.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2.13-.35.3-.65.51-.89.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.74.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06-.28-.04-.54-.1-.78-.17v-.96h.05ZM589.88,542.99v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.46,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47,0,.61.1,1.07.31,1.38.2.32.53.47.99.47.24,0,.48-.05.74-.14.25-.09.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="492.74" cy="48.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M493.43,52c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M472.66,72.25l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM476.8,69.39l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M480.95,72.35c-.5,0-.89-.14-1.17-.43-.28-.28-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64s.05.29.11.42c.05.11.14.2.27.26.12.06.29.09.5.09.15,0,.29-.02.43-.07.14-.04.24-.08.3-.11h.05v.83c-.17.05-.35.09-.53.11-.18.03-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M481.93,72.25l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM486.07,69.39l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M492.93,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M496.38,72.37c-.38,0-.72-.06-1.03-.17s-.58-.29-.81-.52-.4-.53-.52-.89c-.12-.36-.19-.78-.19-1.26s.06-.89.19-1.24c.13-.35.3-.64.52-.88s.48-.42.8-.55c.32-.13.67-.19,1.03-.19.3,0,.59.04.87.13s.53.18.75.29v1.03h-.05c-.07-.06-.15-.12-.25-.19s-.23-.15-.37-.22c-.13-.06-.28-.12-.45-.17-.17-.05-.34-.07-.5-.07-.48,0-.86.18-1.15.54s-.43.87-.43,1.53.14,1.15.42,1.51.67.54,1.16.54c.3,0,.58-.06.85-.19.27-.12.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15s-.26.1-.37.13c-.16.05-.3.08-.42.1-.12.02-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M503.12,72.25h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M508.89,69.52c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.36-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.32.25,1.77.75c.44.5.66,1.21.66,2.13ZM507.94,69.52c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M512.72,67.78h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.33-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="492.74" cy="236.7" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M493.43,240.4c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M472.66,260.64l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM476.8,257.79l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M480.95,260.75c-.5,0-.89-.14-1.17-.43-.28-.28-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64s.05.29.11.42c.05.11.14.2.27.26.12.06.29.09.5.09.15,0,.29-.02.43-.07.14-.04.24-.08.3-.11h.05v.83c-.17.05-.35.09-.53.11-.18.03-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M481.93,260.64l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM486.07,257.79l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M492.93,260.64h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M496.38,260.77c-.38,0-.72-.06-1.03-.17s-.58-.29-.81-.52-.4-.53-.52-.89c-.12-.36-.19-.78-.19-1.26s.06-.89.19-1.24c.13-.35.3-.64.52-.88s.48-.42.8-.55c.32-.13.67-.19,1.03-.19.3,0,.59.04.87.13s.53.18.75.29v1.03h-.05c-.07-.06-.15-.12-.25-.19s-.23-.15-.37-.22c-.13-.06-.28-.12-.45-.17-.17-.05-.34-.07-.5-.07-.48,0-.86.18-1.15.54s-.43.87-.43,1.53.14,1.15.42,1.51.67.54,1.16.54c.3,0,.58-.06.85-.19.27-.12.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15s-.26.1-.37.13c-.16.05-.3.08-.42.1-.12.02-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M503.12,260.64h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M508.89,257.92c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.36-.26-1.79-.77-.65-1.22-.65-2.1.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.32.25,1.77.75c.44.5.66,1.21.66,2.13ZM507.94,257.92c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52-.39.87-.39,1.57.13,1.2.39,1.56.63.53,1.11.53.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M512.72,256.18h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.33-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="492.74" cy="447.64" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M493.43,451.35c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M472.66,471.59l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM476.8,468.74l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M480.95,471.7c-.5,0-.89-.14-1.17-.43-.28-.29-.42-.74-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64,0,.15.05.29.11.42.05.11.14.2.27.26.12.06.29.08.5.08.15,0,.29-.02.43-.07.14-.04.24-.08.3-.11h.05v.83c-.17.05-.35.09-.53.12-.18.03-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M481.93,471.59l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM486.07,468.74l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M492.93,471.59h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M496.38,471.71c-.38,0-.72-.06-1.03-.17-.31-.12-.58-.29-.81-.53s-.4-.53-.52-.89c-.12-.36-.19-.78-.19-1.26s.06-.89.19-1.24c.13-.35.3-.64.52-.88.21-.24.48-.42.8-.55.32-.13.67-.19,1.03-.19.3,0,.59.04.87.13.28.08.53.18.75.29v1.03h-.05c-.07-.05-.15-.12-.25-.19-.1-.07-.23-.14-.37-.22-.13-.06-.28-.12-.45-.17-.17-.05-.34-.07-.5-.07-.48,0-.86.18-1.15.54-.29.36-.43.87-.43,1.53s.14,1.15.42,1.51c.28.36.67.54,1.16.54.3,0,.58-.06.85-.19.27-.12.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15-.14.06-.26.1-.37.13-.16.05-.3.08-.42.11-.12.02-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M503.12,471.59h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M508.89,468.87c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.36-.26-1.79-.77c-.43-.52-.65-1.22-.65-2.1s.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.32.25,1.77.75c.44.5.66,1.21.66,2.13ZM507.94,468.87c0-.71-.13-1.23-.39-1.57-.26-.34-.62-.52-1.1-.52s-.85.17-1.11.52c-.26.34-.39.87-.39,1.57s.13,1.2.39,1.56c.26.35.63.53,1.11.53s.84-.17,1.1-.52.39-.87.39-1.57Z"/>
+      <path class="cls-5" d="M512.72,467.12h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.33-.3.63-.5.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="492.74" cy="520.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M493.43,524.23c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M472.66,544.47l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM476.8,541.61l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M480.95,544.58c-.5,0-.89-.14-1.17-.43-.28-.28-.42-.73-.42-1.35v-3.02h-.62v-.76h.62v-1.57h.92v1.57h1.69v.76h-1.69v2.59c0,.28,0,.49.01.64,0,.15.05.29.11.42.05.11.14.2.27.26.12.06.29.09.5.09.15,0,.29-.02.43-.07.14-.04.24-.08.3-.11h.05v.83c-.17.05-.35.09-.53.11-.18.03-.34.04-.49.04Z"/>
+      <path class="cls-5" d="M481.93,544.47l2.45-7.27h1.19l2.45,7.27h-1.02l-.66-2.03h-2.78l-.66,2.03h-.98ZM486.07,541.61l-1.12-3.43-1.12,3.43h2.24Z"/>
+      <path class="cls-5" d="M492.93,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M496.38,544.59c-.38,0-.72-.06-1.03-.17-.31-.12-.58-.29-.81-.52s-.4-.53-.52-.89c-.12-.36-.19-.78-.19-1.26s.06-.89.19-1.24c.13-.35.3-.64.52-.88.21-.24.48-.42.8-.55.32-.13.67-.19,1.03-.19.3,0,.59.04.87.13.28.08.53.18.75.29v1.03h-.05c-.07-.06-.15-.12-.25-.19-.1-.07-.23-.15-.37-.22-.13-.07-.28-.12-.45-.17-.17-.05-.34-.07-.5-.07-.48,0-.86.18-1.15.54-.29.36-.43.87-.43,1.53s.14,1.15.42,1.51c.28.36.67.54,1.16.54.3,0,.58-.06.85-.19.27-.12.51-.28.72-.48h.05v1.03c-.09.04-.21.09-.34.15-.14.06-.26.11-.37.13-.16.04-.3.08-.42.1-.12.02-.28.04-.48.04Z"/>
+      <path class="cls-5" d="M503.12,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-7.6h.92v2.75c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M508.89,541.75c0,.92-.22,1.63-.66,2.13-.44.5-1.03.75-1.77.75s-1.36-.26-1.79-.77c-.43-.52-.65-1.22-.65-2.1s.22-1.62.67-2.12c.45-.5,1.04-.76,1.77-.76s1.32.25,1.77.75c.44.5.66,1.21.66,2.13ZM507.94,541.75c0-.71-.13-1.23-.39-1.58-.26-.34-.62-.51-1.1-.51s-.85.17-1.11.51c-.26.34-.39.87-.39,1.58s.13,1.2.39,1.55c.26.35.63.53,1.11.53s.84-.17,1.1-.52.39-.87.39-1.56Z"/>
+      <path class="cls-5" d="M512.72,540h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.33-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="328.59" cy="236.57" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M329.28,240.27c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+      <path class="cls-5" d="M295.45,260.67c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91s-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M303.69,260.52h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M309.18,260.52h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89s-.15-.76-.15-1.22.06-.89.19-1.24.29-.66.51-.92c.2-.24.44-.42.72-.56s.58-.2.89-.2c.27,0,.51.03.71.09s.42.15.64.28v-2.36h.92v7.6ZM308.26,259.19v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53s-.4.86-.4,1.53.1,1.13.31,1.47.53.51.99.51c.24,0,.48-.05.73-.16s.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M312.87,260.64c-.87,0-1.54-.25-2.02-.73s-.72-1.19-.72-2.09.23-1.6.7-2.12,1.07-.79,1.83-.79c.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22s.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11s-.33.04-.55.04ZM313.95,257.18c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48s-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M318.66,256.05h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M325.98,255.06l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M329.75,259.93c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM329.75,259.17v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M336.17,255.06l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M338.97,260.65c-.53,0-.98-.05-1.35-.16s-.72-.24-1.04-.4v-1.21h.07c.32.3.68.53,1.08.7s.79.25,1.17.25c.53,0,.94-.11,1.21-.33s.41-.52.41-.88c0-.29-.07-.53-.21-.71s-.37-.32-.68-.41c-.22-.06-.43-.12-.62-.16s-.42-.1-.7-.17c-.25-.06-.48-.15-.67-.25s-.37-.23-.53-.4c-.15-.16-.27-.35-.35-.56s-.12-.47-.12-.75c0-.59.23-1.08.69-1.48s1.04-.6,1.76-.6c.41,0,.79.04,1.15.12s.7.2,1.01.35v1.16h-.07c-.23-.21-.53-.4-.89-.55s-.74-.24-1.14-.24c-.45,0-.81.1-1.09.31s-.42.49-.42.83c0,.31.08.56.24.74s.4.32.71.4c.21.06.46.12.75.19s.54.13.74.19c.5.15.87.38,1.1.69s.35.69.35,1.14c0,.28-.06.56-.17.84s-.28.51-.49.7c-.23.21-.5.37-.79.49s-.66.17-1.11.17Z"/>
+      <path class="cls-5" d="M345.48,259.93c-.07.06-.17.13-.3.23s-.25.18-.36.24c-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96s.41-.48.76-.63c.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.31c-.12-.07-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.1s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM345.48,259.17v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34s-.24.37-.24.65c0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19s.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M348.69,254.15h-1.04v-.95h1.04v.95ZM348.62,260.52h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M350.92,260.52h-.92v-7.6h.92v7.6Z"/>
+      <path class="cls-5" d="M353.28,254.15h-1.04v-.95h1.04v.95ZM353.21,260.52h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M358.85,260.52h-.92v-3.11c0-.25-.01-.48-.04-.7s-.07-.39-.14-.52c-.07-.14-.18-.24-.31-.31s-.32-.1-.55-.1-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53s.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M360.33,261.39c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2s.3-.65.51-.89c.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1s.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM363.42,259.04v-2.99c-.23-.11-.44-.19-.63-.24s-.39-.07-.58-.07c-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+    </g>
+  </g>
+  <line class="cls-2" x1="30.52" y1="34.73" x2="30.52" y2="61.86"/>
+  <polyline class="cls-2" points="734.84 34.73 747.9 48.24 735.79 60.76"/>
+  <polyline class="cls-2" points="734.84 126.38 747.9 139.89 735.79 152.41"/>
+  <polyline class="cls-2" points="734.84 172.79 747.9 186.29 735.79 198.81"/>
+  <polyline class="cls-2" points="734.84 223.05 747.9 236.56 735.79 249.08"/>
+  <line class="cls-2" x1="183.98" y1="430.27" x2="183.98" y2="465.28"/>
+  <line id="source_line-7" data-name="source line" class="cls-2" x1="114.65" y1="397.38" x2="747.9" y2="397.38"/>
+  <line class="cls-2" x1="114.65" y1="380" x2="114.65" y2="415.01"/>
+  <line id="source_line-8" data-name="source line" class="cls-2" x1="61.2" y1="350.92" x2="747.9" y2="350.92"/>
+  <line class="cls-2" x1="61.2" y1="333.55" x2="61.2" y2="368.56"/>
+  <g>
+    <circle class="cls-3" cx="412.18" cy="396.88" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M415.45,397.75c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM413.83,393.83c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.05s.35-.12.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM414.24,397.79c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.32.48-.52s.15-.45.15-.75Z"/>
+      <path class="cls-5" d="M366.32,420.98c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M374.55,420.82h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M380.04,420.82h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14-.14.04-.3.05-.49.05-.3,0-.57-.06-.82-.19s-.47-.3-.64-.54c-.18-.24-.32-.54-.42-.89-.1-.35-.15-.76-.15-1.22s.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.14.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM379.12,419.5v-3.14c-.23-.11-.43-.19-.61-.23s-.38-.06-.59-.06c-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47c.21.34.53.51.99.51.24,0,.48-.05.73-.16.24-.11.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M383.74,420.95c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15s.49.25.68.46.35.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46s.76.5,1.32.5c.2,0,.4-.02.59-.07s.37-.1.52-.18c.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11s-.33.04-.55.04ZM384.81,417.49c0-.25-.04-.46-.09-.64s-.13-.33-.22-.45c-.11-.14-.25-.24-.41-.31s-.38-.11-.62-.11-.45.04-.62.11c-.17.07-.33.18-.47.32-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M389.52,416.36h-.05c-.07-.02-.14-.03-.22-.04-.08,0-.17,0-.28,0-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.5.88-.63.25-.12.49-.18.73-.18.09,0,.17,0,.21,0,.05,0,.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M396.85,415.37l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M400.62,420.24c-.07.06-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2s-.36.07-.64.07c-.22,0-.44-.04-.64-.13s-.38-.2-.53-.36c-.15-.15-.26-.33-.35-.55-.09-.22-.13-.45-.13-.7,0-.38.08-.7.24-.96.16-.26.41-.48.76-.63.31-.14.67-.24,1.08-.29.42-.05.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52-.06-.13-.16-.23-.27-.3-.12-.07-.26-.12-.43-.15-.17-.03-.34-.04-.52-.04-.21,0-.46.03-.75.1-.29.06-.57.15-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58s.15.53.15.87v3.73h-.91v-.58ZM400.62,419.48v-1.51c-.22.02-.49.05-.83.08-.33.03-.6.08-.81.14-.24.08-.45.19-.61.34-.16.15-.24.37-.24.65,0,.31.09.55.26.71s.43.24.77.24c.29,0,.55-.06.79-.19.23-.13.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M407.04,415.37l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M410.34,420.98c-.43,0-.8-.06-1.12-.17-.32-.11-.59-.28-.82-.5-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.34.02.62.06.85.04.23.13.44.25.62.13.2.31.34.53.44s.5.15.82.15c.3,0,.57-.05.81-.15s.42-.25.55-.44c.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5s-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M415.76,420.96c-.36,0-.71-.05-1.02-.15s-.58-.2-.79-.31v-1.03h.05c.08.06.17.13.28.21s.25.15.42.23c.16.07.33.13.52.19s.38.08.58.08c.15,0,.3-.02.47-.05.17-.04.29-.08.37-.13.11-.08.2-.16.25-.24s.08-.21.08-.38c0-.22-.06-.38-.18-.49s-.33-.2-.63-.28c-.12-.03-.27-.06-.46-.1s-.36-.08-.52-.13c-.42-.12-.72-.31-.91-.56-.19-.25-.28-.56-.28-.92,0-.49.19-.89.56-1.2s.86-.46,1.48-.46c.3,0,.61.04.91.11s.56.17.77.28v.98h-.05c-.23-.19-.5-.33-.78-.44s-.58-.16-.87-.16-.56.06-.77.19-.31.32-.31.58c0,.23.06.4.19.51.12.11.32.21.6.28.14.04.29.07.46.1.17.04.34.07.53.12.4.1.71.27.91.5s.31.55.31.96c0,.23-.05.46-.14.67-.09.21-.23.39-.41.54-.2.16-.42.29-.66.37s-.55.13-.93.13Z"/>
+      <path class="cls-5" d="M419.75,414.46h-1.04v-.95h1.04v.95ZM419.69,420.82h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M425.32,420.82h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56s.55-.2.84-.2c.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M426.81,421.7c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1s.3.04.47.04c.28,0,.52-.04.72-.11s.35-.18.46-.31c.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69s-.55-1.13-.55-1.99c0-.45.06-.85.19-1.2.13-.35.3-.65.51-.89.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04s-1.02.65-1.85.65c-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM429.9,419.34v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.47,0-.83.17-1.1.51s-.4.83-.4,1.47.1,1.07.31,1.38.53.47.99.47c.24,0,.48-.05.73-.14s.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M432.21,420.82v-7.27h4.55v.86h-3.58v1.99h3.33v.86h-3.33v2.7h3.58v.86h-4.55Z"/>
+      <path class="cls-5" d="M442.04,420.82h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M443.52,421.7c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.07.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2.13-.35.3-.65.51-.89.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.73.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06s-.54-.1-.78-.17v-.96h.05ZM446.61,419.34v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.47,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47s.1,1.07.3,1.38c.2.32.53.47.99.47.24,0,.48-.05.73-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M449.86,414.46h-1.04v-.95h1.04v.95ZM449.79,420.82h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M455.43,420.82h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.3-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M459.09,420.95c-.87,0-1.54-.25-2.02-.73-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.46-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46s.34.46.45.76c.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.33.76.5,1.32.5.2,0,.4-.02.59-.07.19-.04.37-.1.53-.18.17-.07.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.1-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.14.03-.33.04-.55.04ZM460.16,417.49c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11c-.17.07-.33.18-.47.32-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="412.18" cy="520.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M415.45,521.39c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM413.83,517.48c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM414.24,521.44c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+      <path class="cls-5" d="M366.32,544.62c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.33.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15.23-.1.42-.25.55-.44.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5-.31.11-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M374.55,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M380.04,544.47h-.92v-.56c-.14.12-.27.22-.37.3s-.23.15-.37.21c-.13.06-.27.11-.41.14s-.3.05-.49.05c-.3,0-.57-.06-.82-.19-.25-.12-.47-.3-.64-.54-.18-.24-.32-.54-.42-.89-.1-.35-.15-.76-.15-1.22s.06-.89.19-1.24c.12-.35.29-.66.51-.92.2-.24.44-.42.72-.56.28-.13.58-.2.89-.2.27,0,.51.03.71.09.2.06.42.15.64.28v-2.36h.92v7.6ZM379.12,543.14v-3.14c-.23-.11-.43-.19-.61-.23-.18-.04-.38-.06-.59-.06-.47,0-.84.18-1.11.53-.27.35-.4.86-.4,1.53s.1,1.13.31,1.47c.21.34.53.51.99.51.24,0,.48-.05.73-.16.24-.11.47-.26.69-.44Z"/>
+      <path class="cls-5" d="M383.74,544.6c-.87,0-1.54-.25-2.02-.74-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.47-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15s.49.25.68.46c.2.21.35.46.45.76.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.33.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.52-.18.17-.08.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.09-.4.16s-.3.11-.43.15c-.18.05-.34.09-.49.11-.15.03-.33.04-.55.04ZM384.81,541.14c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+      <path class="cls-5" d="M389.52,540h-.05c-.07-.02-.14-.03-.22-.04s-.17,0-.28,0c-.25,0-.49.05-.74.16s-.48.27-.69.48v3.87h-.92v-5.45h.92v.81c.34-.3.63-.51.88-.63s.49-.18.73-.18c.09,0,.17,0,.21,0s.1.01.16.02v.96Z"/>
+      <path class="cls-5" d="M396.85,539.02l-1.38,5.45h-.85l-1.33-4.2-1.32,4.2h-.84l-1.4-5.45h.96l.96,4.22,1.29-4.22h.76l1.33,4.22.91-4.22h.92Z"/>
+      <path class="cls-5" d="M400.62,543.89c-.07.05-.17.13-.3.23-.13.1-.25.18-.36.24-.16.08-.32.15-.47.2-.15.04-.36.07-.64.07-.22,0-.44-.04-.64-.13-.2-.08-.38-.2-.53-.36-.15-.15-.26-.33-.35-.55s-.13-.45-.13-.7c0-.38.08-.7.24-.96.16-.26.41-.48.76-.63.31-.14.67-.24,1.08-.29s.87-.09,1.35-.12v-.18c0-.21-.03-.39-.1-.52s-.16-.23-.27-.3c-.12-.08-.26-.12-.43-.15s-.34-.04-.52-.04c-.21,0-.46.03-.75.09s-.57.16-.86.28h-.05v-.93c.17-.05.41-.1.73-.16s.63-.09.94-.09c.37,0,.69.03.95.09s.49.16.69.32c.2.15.35.34.44.58.1.24.15.53.15.87v3.73h-.91v-.58ZM400.62,543.13v-1.51c-.22.02-.49.05-.83.08s-.6.08-.81.14c-.24.07-.45.19-.61.34-.16.16-.24.37-.24.65,0,.31.09.55.26.71.18.16.43.24.77.24.29,0,.55-.06.79-.19.23-.12.45-.28.66-.46Z"/>
+      <path class="cls-5" d="M407.04,539.02l-2.93,7.47h-.98l.98-2.28-1.98-5.19h.99l1.49,4.04,1.48-4.04h.96Z"/>
+      <path class="cls-5" d="M410.34,544.62c-.43,0-.8-.06-1.12-.17s-.59-.28-.82-.5c-.25-.25-.43-.56-.54-.91-.1-.35-.16-.79-.16-1.31v-4.54h.97v4.54c0,.33.02.62.06.85s.13.44.25.62c.13.2.31.34.53.44.22.1.5.15.82.15.3,0,.57-.05.81-.15.23-.1.42-.25.55-.44.12-.19.2-.39.25-.62s.07-.5.07-.83v-4.56h.97v4.54c0,.5-.05.94-.15,1.3s-.28.67-.54.92c-.23.22-.5.39-.81.5-.31.11-.68.17-1.13.17Z"/>
+      <path class="cls-5" d="M415.76,544.6c-.36,0-.71-.05-1.02-.15s-.58-.2-.79-.31v-1.03h.05c.08.06.17.13.28.21.11.07.25.15.42.23.16.07.33.13.52.19.19.05.38.08.58.08.15,0,.3-.02.47-.05s.29-.08.37-.13c.11-.08.2-.16.25-.24.05-.08.08-.21.08-.38,0-.22-.06-.38-.18-.49-.12-.11-.33-.2-.63-.28-.12-.03-.27-.06-.46-.1s-.36-.08-.52-.13c-.42-.12-.72-.31-.91-.56-.19-.25-.28-.56-.28-.92,0-.49.19-.89.56-1.2.37-.31.86-.46,1.48-.46.3,0,.61.04.91.11.31.07.56.17.77.28v.98h-.05c-.23-.19-.5-.33-.78-.44s-.58-.16-.87-.16-.56.06-.77.19-.31.32-.31.58c0,.23.06.4.19.51s.32.2.6.28c.14.04.29.07.46.1s.34.07.53.12c.4.1.71.27.91.5s.31.55.31.96c0,.23-.05.46-.14.67s-.23.39-.41.54c-.2.16-.42.29-.66.37-.25.08-.55.13-.93.13Z"/>
+      <path class="cls-5" d="M419.75,538.1h-1.04v-.95h1.04v.95ZM419.69,544.47h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M425.32,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.07-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M426.81,545.34c.06.03.15.06.27.1s.26.09.41.12c.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.08.35-.18.46-.31.1-.13.18-.29.22-.46s.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48s-.54.15-.89.15c-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2.13-.35.3-.65.51-.89.21-.23.45-.42.73-.54s.57-.19.87-.19c.28,0,.53.03.73.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06-.28-.04-.54-.1-.78-.17v-.96h.05ZM429.9,542.99v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.47,0-.83.17-1.1.51s-.4.83-.4,1.47c0,.61.1,1.07.31,1.38.2.32.53.47.99.47.24,0,.48-.05.73-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M432.21,544.47v-7.27h4.55v.86h-3.58v1.99h3.33v.86h-3.33v2.7h3.58v.86h-4.55Z"/>
+      <path class="cls-5" d="M442.04,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M443.52,545.34c.06.03.15.06.27.1.12.04.26.09.41.12.17.04.33.08.47.1.14.03.3.04.47.04.28,0,.52-.04.72-.11.2-.08.35-.18.46-.31.1-.13.18-.29.22-.46.04-.18.06-.38.06-.6v-.48c-.25.21-.49.37-.73.48-.24.1-.54.15-.89.15-.62,0-1.12-.23-1.48-.69-.37-.46-.55-1.13-.55-1.99,0-.45.06-.85.19-1.2.13-.35.3-.65.51-.89.21-.23.45-.42.73-.54.28-.13.57-.19.87-.19.28,0,.53.03.73.1.21.07.41.16.62.29l.05-.23h.86v4.83c0,.92-.2,1.6-.61,2.04-.4.43-1.02.65-1.85.65-.27,0-.54-.02-.82-.06-.28-.04-.54-.1-.78-.17v-.96h.05ZM446.61,542.99v-2.99c-.23-.11-.44-.19-.63-.24-.19-.05-.39-.07-.58-.07-.47,0-.83.17-1.1.51-.27.34-.4.83-.4,1.47,0,.61.1,1.07.3,1.38.2.32.53.47.99.47.24,0,.48-.05.73-.14.25-.09.48-.23.68-.4Z"/>
+      <path class="cls-5" d="M449.86,538.1h-1.04v-.95h1.04v.95ZM449.79,544.47h-.92v-5.45h.92v5.45Z"/>
+      <path class="cls-5" d="M455.43,544.47h-.92v-3.11c0-.25-.01-.48-.04-.7-.02-.22-.07-.39-.14-.52-.08-.14-.18-.24-.31-.31-.13-.07-.32-.1-.55-.1s-.46.06-.71.18c-.24.12-.48.28-.71.48v4.07h-.92v-5.45h.92v.61c.27-.24.54-.43.81-.56.27-.13.55-.2.84-.2.54,0,.96.18,1.26.53.3.35.45.87.45,1.54v3.54Z"/>
+      <path class="cls-5" d="M459.09,544.6c-.87,0-1.54-.25-2.02-.74-.48-.49-.72-1.19-.72-2.09s.23-1.6.7-2.12c.46-.53,1.07-.79,1.83-.79.34,0,.64.05.9.15.26.1.49.25.68.46.2.21.34.46.45.76.1.3.16.67.16,1.11v.5h-3.78c0,.63.16,1.12.48,1.46.32.33.76.5,1.32.5.2,0,.4-.02.59-.07.19-.05.37-.1.53-.18.17-.08.31-.15.42-.22.11-.07.21-.14.28-.2h.05v1c-.11.04-.24.09-.4.16-.16.06-.3.11-.43.15-.18.05-.34.09-.49.11-.14.03-.33.04-.55.04ZM460.16,541.14c0-.25-.04-.46-.09-.64-.05-.18-.13-.33-.22-.45-.11-.14-.25-.24-.41-.31-.17-.07-.38-.11-.62-.11s-.45.04-.62.11-.33.18-.47.32c-.14.14-.24.3-.31.48-.07.17-.12.38-.14.61h2.89Z"/>
+    </g>
+  </g>
+  <polyline class="cls-2" points="734.84 337.46 747.9 350.96 735.79 363.48"/>
+  <line class="cls-2" x1="61.2" y1="503.02" x2="61.2" y2="538.03"/>
+  <polyline class="cls-2" points="734.84 506.93 747.9 520.43 735.79 532.96"/>
+  <polyline class="cls-2" points="734.84 383.86 747.9 397.37 735.79 409.89"/>
+  <polyline class="cls-2" points="734.84 434.13 747.9 447.64 735.79 460.16"/>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch08-Partitioning-Marbles.ai


+ 120 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles.svg

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 299.49 177.91">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="71.26" y1="24.01" x2="275.12" y2="24.01"/>
+  <g>
+    <circle class="cls-4" cx="148.48" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M151.22,27.56h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="212.96" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M212.68,19.66c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="249.96" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M252.93,24.56h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM250.77,23.62v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <line class="cls-2" x1="70.94" y1="87.53" x2="70.94" y2="122.54"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="71.26" y1="105.03" x2="285.8" y2="105.03"/>
+  <g>
+    <path class="cls-5" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.51,26.29h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M44.57,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.58,68.07h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-5" d="M44.57,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,66.37c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.43,106.46c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M44.57,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="71.26" y1="6.5" x2="71.26" y2="41.51"/>
+  <line class="cls-2" x1="275.12" y1="6.5" x2="275.12" y2="41.51"/>
+  <g>
+    <circle class="cls-4" cx="90.71" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M93.01,27.56h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="71.26" y1="149.49" x2="275.12" y2="149.49"/>
+  <g>
+    <circle class="cls-4" cx="148.48" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M151.22,153.04h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="212.96" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M212.68,145.14c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="249.96" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M252.93,150.04h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM250.77,149.1v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <line class="cls-2" x1="71.26" y1="131.98" x2="71.26" y2="166.99"/>
+  <line class="cls-2" x1="275.12" y1="131.98" x2="275.12" y2="166.99"/>
+  <g>
+    <circle class="cls-4" cx="90.71" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M93.01,153.04h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="131.97" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M131.97,108.78c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM133.61,106.26c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM133.45,101.89c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="186.75" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M189.6,101.16l-3.77,7.42h-1.25l4-7.7h-4.51v-1.03h5.54v1.31Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="223.83" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M226.71,105.75c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM225.52,105.8c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="71.26" y1="64.52" x2="195.5" y2="64.52"/>
+  <line class="cls-2" x1="195.5" y1="47.02" x2="195.5" y2="82.03"/>
+  <line class="cls-2" x1="71.26" y1="47.02" x2="71.26" y2="82.03"/>
+  <g>
+    <circle class="cls-3" cx="104.27" cy="64.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M98.11,62.18c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.91s-.24-.81-.24-1.32ZM102.6,62.93c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.86c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.2.76-.35c0-.06,0-.14.01-.23s0-.2,0-.32Z"/>
+      <path class="cls-5" d="M104.67,62.18c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.91s-.24-.81-.24-1.32ZM109.15,62.93c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.86c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.2.76-.35c0-.06,0-.14.01-.23s0-.2,0-.32Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="172.2" cy="64.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M168.93,68.27c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM170.57,65.75c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM170.4,61.38c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+      <path class="cls-5" d="M175.48,68.27c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM177.12,65.75c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM176.95,61.38c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+    </g>
+  </g>
+  <line class="cls-2" x1="285.8" y1="87.53" x2="285.8" y2="122.54"/>
+  <g>
+    <path class="cls-5" d="M29.25,143.42h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.03-.41.07s-.28.13-.43.23-.3.24-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.97,143.31c.12,0,.24.03.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,147.61c.12,0,.24.03.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+</svg>

+ 118 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles2.svg

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 302.18 177.91">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-2" x1="71.26" y1="87.53" x2="71.26" y2="122.54"/>
+  <line id="source_line" data-name="source line" class="cls-2" x1="71.58" y1="105.03" x2="286.12" y2="105.03"/>
+  <g>
+    <path class="cls-5" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.51,26.29h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M44.57,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.58,68.07h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-5" d="M44.57,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,66.37c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.43,106.46c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M44.57,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="132.29" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M132.29,108.78c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM133.93,106.26c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM133.76,101.89c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="187.07" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M189.91,101.16l-3.77,7.42h-1.25l4-7.7h-4.51v-1.03h5.54v1.31Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="224.15" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M227.03,105.75c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM225.84,105.8c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="71.26" y1="64.52" x2="195.5" y2="64.52"/>
+  <line class="cls-2" x1="195.5" y1="47.02" x2="195.5" y2="82.03"/>
+  <line class="cls-2" x1="71.26" y1="47.02" x2="71.26" y2="82.03"/>
+  <g>
+    <circle class="cls-3" cx="104.27" cy="64.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M98.11,62.18c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.91s-.24-.81-.24-1.32ZM102.6,62.93c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.86c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.2.76-.35c0-.06,0-.14.01-.23s0-.2,0-.32Z"/>
+      <path class="cls-5" d="M104.67,62.18c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.91s-.24-.81-.24-1.32ZM109.15,62.93c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.86c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.2.76-.35c0-.06,0-.14.01-.23s0-.2,0-.32Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="172.2" cy="64.52" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M168.93,68.27c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM170.57,65.75c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM170.4,61.38c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+      <path class="cls-5" d="M175.48,68.27c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM177.12,65.75c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM176.95,61.38c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+    </g>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="71.26" y1="144.31" x2="195.5" y2="144.31"/>
+  <line class="cls-2" x1="195.5" y1="126.81" x2="195.5" y2="161.82"/>
+  <line class="cls-2" x1="71.26" y1="126.81" x2="71.26" y2="161.82"/>
+  <g>
+    <circle class="cls-3" cx="104.27" cy="144.31" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M98.11,141.97c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.9s-.24-.81-.24-1.32ZM102.6,142.72c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.87c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.21.76-.35c0-.06,0-.13.01-.23s0-.2,0-.32Z"/>
+      <path class="cls-5" d="M104.67,141.97c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.9s-.24-.81-.24-1.32ZM109.15,142.72c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.87c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.21.76-.35c0-.06,0-.13.01-.23s0-.2,0-.32Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="172.2" cy="144.31" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M168.93,148.06c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM170.57,145.54c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.07c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.21ZM170.4,141.17c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.8s.18-.59.18-.95Z"/>
+      <path class="cls-5" d="M175.48,148.06c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM177.12,145.54c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.07c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.21ZM176.95,141.17c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.8s.18-.59.18-.95Z"/>
+    </g>
+  </g>
+  <line class="cls-2" x1="286.12" y1="87.53" x2="286.12" y2="122.54"/>
+  <g>
+    <path class="cls-5" d="M29.25,143.42h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.03-.41.07s-.28.13-.43.23-.3.24-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.97,143.31c.12,0,.24.03.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,147.61c.12,0,.24.03.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="71.26" y1="24.01" x2="275.12" y2="24.01"/>
+  <g>
+    <circle class="cls-4" cx="148.48" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M151.22,27.56h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="212.96" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M212.68,19.66c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="249.96" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M252.93,24.56h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM250.77,23.62v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <line class="cls-2" x1="71.26" y1="6.5" x2="71.26" y2="41.51"/>
+  <line class="cls-2" x1="275.12" y1="6.5" x2="275.12" y2="41.51"/>
+  <g>
+    <circle class="cls-4" cx="115.88" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M118.18,27.56h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+</svg>

+ 78 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Amb-Marbles3.svg

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 433.8 177.91">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <g>
+    <path class="cls-5" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.51,26.29h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M44.57,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.57,68.07h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-5" d="M44.57,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,66.37c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.43,106.46c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M44.57,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M29.25,143.42h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.97,143.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,147.61c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line id="source_line" data-name="source line" class="cls-2" x1="64.71" y1="150.27" x2="214.46" y2="150.27"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="202.51" y1="24.79" x2="270.96" y2="24.79"/>
+  <line class="cls-2" x1="202.19" y1="88.31" x2="202.19" y2="123.32"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="202.51" y1="105.82" x2="215.38" y2="105.82"/>
+  <line class="cls-2" x1="202.51" y1="7.28" x2="202.51" y2="42.29"/>
+  <line class="cls-2" x1="270.96" y1="7.28" x2="270.96" y2="42.29"/>
+  <g>
+    <circle class="cls-4" cx="270.96" cy="24.79" r="13.56"/>
+    <path class="cls-5" d="M273.26,28.34h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line class="cls-2" x1="64.71" y1="132.77" x2="64.71" y2="167.78"/>
+  <line class="cls-2" x1="214.89" y1="132.77" x2="214.89" y2="167.78"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="202.19" y1="65.3" x2="228.57" y2="65.3"/>
+  <line class="cls-2" x1="228.57" y1="47.8" x2="228.57" y2="82.81"/>
+  <line class="cls-2" x1="202.19" y1="47.8" x2="202.19" y2="82.81"/>
+  <g>
+    <circle class="cls-3" cx="228.57" cy="65.3" r="13.56"/>
+    <path class="cls-5" d="M231.32,68.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <line class="cls-2" x1="215.38" y1="88.31" x2="215.38" y2="123.32"/>
+  <g>
+    <circle class="cls-1" cx="215.38" cy="105.82" r="13.56"/>
+    <path class="cls-5" d="M215.1,101.47c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.04-.37s.85-.17,1.24-.17.74.04,1.04.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.04-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.49-.61.49-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="214.89" cy="150.27" r="13.56"/>
+    <path class="cls-5" d="M214.61,145.93c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+</svg>

+ 24 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Artboard 26.svg

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98.96 13.46">
+  <defs>
+    <style>
+      .cls-1 {
+        stroke-width: 0px;
+      }
+    </style>
+  </defs>
+  <path class="cls-1" d="M5.84,7.75c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+  <path class="cls-1" d="M12.98,3.95l-.86,5.88h-1.24l-.85-2.46-.17-.6-.19.63-.81,2.43h-1.2l-.85-5.88h1l.49,4,.11.89.25-.78.86-2.64h.73l.92,2.61.26.78.09-.83.46-4.03h1.01Z"/>
+  <path class="cls-1" d="M16.14,4.79h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM16.49,1.48c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+  <path class="cls-1" d="M25.47,9.75c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+  <path class="cls-1" d="M31.9,9.61c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+  <path class="cls-1" d="M38.65,9.83h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02V1.55h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+  <path class="cls-1" d="M47.36,3.95h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03V3.95Z"/>
+  <path class="cls-1" d="M58.69,6.58c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM57.63,6.43c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+  <path class="cls-1" d="M64.97,8.22c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+  <path class="cls-1" d="M71.64,9.83h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+  <path class="cls-1" d="M75.52,2.39h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93V2.39Z"/>
+  <path class="cls-1" d="M84.85,9.75c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+  <path class="cls-1" d="M91.37,8.22c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+  <path class="cls-1" d="M95.67,3.84c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM95.67,8.14c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+</svg>

+ 123 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-CombineLatest-Marbles.svg

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 368.18 136.45">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="131.49" y1="89.36" x2="131.49" y2="124.37"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="131.81" y1="25.84" x2="354.56" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="131.81" y1="106.87" x2="354.56" y2="106.87"/>
+  <g>
+    <path class="cls-4" d="M33.67,26.51c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.51,28.12h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-4" d="M44.57,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.67,68.29c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.58,69.9h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-4" d="M44.57,63.91c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,68.21c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.9,110.33c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.12s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M40.73,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.88.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.22,1.18-.22.8.06,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.7.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M46.4,110.62v-4.22c0-.18,0-.33-.02-.45s-.04-.21-.06-.28-.07-.12-.11-.14-.1-.04-.17-.04c-.08,0-.15.02-.22.07s-.14.12-.21.23-.16.24-.25.42-.2.39-.33.64v3.78h-.93v-4.11c0-.21,0-.39-.02-.52s-.04-.24-.06-.31-.07-.12-.11-.15-.1-.04-.17-.04c-.07,0-.14.02-.2.06s-.13.11-.21.21-.16.24-.25.42-.21.4-.33.67v3.78h-.94v-5.88h.78l.05,1.12c.1-.22.2-.41.3-.57s.19-.28.3-.38.21-.17.33-.21.24-.07.38-.07c.32,0,.56.1.72.31s.25.53.25.96c.09-.2.19-.38.28-.54s.19-.29.29-.4.22-.19.34-.25.27-.08.43-.08c.74,0,1.11.57,1.11,1.71v4.28h-.94Z"/>
+    <path class="cls-4" d="M53.83,107.57c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.84s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.77.13,1.21ZM52.79,107.62c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.15-.54-.15c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.36-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-4" d="M57.4,105.58h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM57.76,102.27c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-4" d="M62,104.74h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.32.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.62v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.05s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M73.56,107.37c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.38s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.05.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.34-.89-.6-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.18s.29-.69.52-.97.51-.5.84-.66.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM72.5,107.22c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-4" d="M80.03,110.62h-4.41v-7.66h1.06v6.77h3.35v.89Z"/>
+    <path class="cls-4" d="M85.57,110.62l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.21-.59-.36-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.84s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.09.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM85.46,107.94h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.32s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M93.13,110.54c-.23.06-.47.1-.71.12s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.02.62-.04s.46-.07.7-.14v.88Z"/>
+    <path class="cls-4" d="M99.95,107.37c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.38s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.05.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.34-.89-.6-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.18s.29-.69.52-.97.51-.5.84-.66.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM98.89,107.22c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-4" d="M106.24,109.01c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.29s-.1-.16-.2-.24-.25-.15-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.05-.75-.05c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M112.92,110.54c-.23.06-.47.1-.71.12s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.02.62-.04s.46-.07.7-.14v.88Z"/>
+    <path class="cls-4" d="M117.14,104.63c.12,0,.24.02.35.07s.21.12.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.29-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.29-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM117.14,108.93c.12,0,.24.02.35.07s.21.12.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.29-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.29-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="131.81" y1="8.33" x2="131.81" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="180.19" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M182.49,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="233.18" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M235.93,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="326.16" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M325.88,21.49c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="180.19" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M177.53,110.42h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+      <path class="cls-4" d="M181.43,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M186.58,109.72c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM186.58,108.8v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="233.18" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M230.96,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+      <path class="cls-4" d="M234.42,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M239.58,109.72c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM239.58,108.8v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+    </g>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="131.81" y1="66.35" x2="354.56" y2="66.35"/>
+  <line class="cls-1" x1="131.81" y1="48.85" x2="131.81" y2="83.86"/>
+  <g>
+    <circle class="cls-2" cx="165.17" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M166.48,69.2c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.66s-.16-.54-.16-.84c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.46-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.12s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM166.48,68.29v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.07.94-.22s.54-.34.79-.55Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="264.29" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M267.26,66.52c0,1.07-.26,1.93-.78,2.58s-1.17.98-1.95.98c-.36,0-.66-.04-.91-.13s-.5-.21-.75-.36l-.07.3h-1.03v-9.12h1.1v3.26c.28-.25.58-.46.9-.62s.69-.25,1.1-.25c.74,0,1.32.3,1.75.89s.64,1.41.64,2.46ZM266.12,66.61c0-.78-.12-1.37-.36-1.78s-.62-.61-1.15-.61c-.3,0-.6.07-.91.21s-.58.32-.83.53v3.75c.28.14.52.23.74.29s.45.08.71.08c.56,0,1-.2,1.32-.6s.48-1.03.48-1.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="264.29" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M261.9,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+      <path class="cls-4" d="M265.36,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M272.35,107.03c0,1.07-.26,1.93-.78,2.58s-1.17.98-1.95.98c-.36,0-.66-.04-.91-.13s-.5-.21-.75-.35l-.07.3h-1.03v-9.12h1.1v3.26c.28-.25.58-.46.9-.62s.69-.25,1.1-.25c.74,0,1.32.3,1.75.89s.64,1.41.64,2.46ZM271.21,107.12c0-.78-.12-1.37-.36-1.78s-.62-.61-1.15-.61c-.3,0-.6.07-.91.21s-.58.32-.83.53v3.75c.28.14.52.23.74.29s.45.08.71.08c.56,0,1-.2,1.32-.6s.48-1.03.48-1.89Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-2" cx="292.93" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M293.56,70.05c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.63-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.19s-.31.12-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="292.93" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M291.09,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+      <path class="cls-4" d="M294.55,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M298.65,110.56c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="326.16" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M321.29,102.52c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+      <path class="cls-4" d="M327.78,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M331.88,110.56c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+    </g>
+  </g>
+</svg>

+ 184 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles-SourceAndSub.svg

@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 457.73 173.11">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-1" x1="284.02" y1="107.09" x2="428.65" y2="107.09"/>
+  <line class="cls-1" x1="428.65" y1="89.58" x2="428.65" y2="124.59"/>
+  <line class="cls-1" x1="284.02" y1="91.45" x2="284.02" y2="126.46"/>
+  <g>
+    <circle class="cls-2" cx="349" cy="107.09" r="13.56"/>
+    <path class="cls-4" d="M352.69,106.28c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,106.26c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="107.09" r="13.56"/>
+    <path class="cls-4" d="M404.67,110.63v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="107.09" r="13.56"/>
+    <path class="cls-4" d="M296.32,110.79c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line class="cls-1" x1="162.28" y1="129.33" x2="162.28" y2="164.33"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="162.6" y1="25.84" x2="284.02" y2="25.84"/>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="162.6" y1="146.83" x2="428.65" y2="146.83"/>
+  <g>
+    <path class="cls-4" d="M33.58,27.9c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,25.13c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,25.18c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,20.68h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,25.3c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,25.24c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.76,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.17,61.11h-3.14v2.91h3.5v.88h-4.55v-8.08h4.37v.88h-3.32v2.55h3.14v.86Z"/>
+    <path class="cls-4" d="M35.17,59.1l1.14,3.26c.19.53.35,1.01.47,1.49h.04c.13-.48.3-.96.49-1.49l1.13-3.26h1.1l-2.28,5.8h-1.01l-2.21-5.8h1.13Z"/>
+    <path class="cls-4" d="M41.01,62.19c.02,1.43.94,2.01,1.99,2.01.76,0,1.21-.13,1.61-.3l.18.76c-.37.17-1.01.36-1.93.36-1.79,0-2.85-1.18-2.85-2.93s1.03-3.13,2.72-3.13c1.9,0,2.4,1.67,2.4,2.73,0,.22-.02.38-.04.49h-4.08ZM44.1,61.43c.01-.67-.28-1.71-1.46-1.71-1.07,0-1.54.98-1.62,1.71h3.08Z"/>
+    <path class="cls-4" d="M46.43,60.67c0-.6-.01-1.09-.05-1.57h.94l.06.96h.02c.29-.55.96-1.09,1.92-1.09.8,0,2.05.48,2.05,2.47v3.47h-1.06v-3.35c0-.94-.35-1.71-1.34-1.71-.7,0-1.24.49-1.42,1.08-.05.13-.07.31-.07.49v3.49h-1.06v-4.23Z"/>
+    <path class="cls-4" d="M54.31,57.43v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M56.87,63.82c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.34-1.19-.34-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M67.52,64.9l-.08-.73h-.04c-.32.46-.95.86-1.77.86-1.18,0-1.77-.83-1.77-1.67,0-1.4,1.25-2.17,3.49-2.16v-.12c0-.48-.13-1.34-1.32-1.34-.54,0-1.1.17-1.51.43l-.24-.7c.48-.31,1.18-.52,1.91-.52,1.77,0,2.21,1.21,2.21,2.37v2.17c0,.5.02,1,.1,1.39h-.96ZM67.37,61.94c-1.15-.02-2.46.18-2.46,1.31,0,.68.46,1.01,1,1.01.76,0,1.24-.48,1.4-.97.04-.11.06-.23.06-.34v-1.01Z"/>
+    <path class="cls-4" d="M70.41,59.1l1.14,3.26c.19.53.35,1.01.47,1.49h.04c.13-.48.3-.96.49-1.49l1.13-3.26h1.1l-2.28,5.8h-1.01l-2.21-5.8h1.13Z"/>
+    <path class="cls-4" d="M78.94,64.9l-.08-.73h-.04c-.32.46-.95.86-1.77.86-1.18,0-1.77-.83-1.77-1.67,0-1.4,1.25-2.17,3.49-2.16v-.12c0-.48-.13-1.34-1.32-1.34-.54,0-1.1.17-1.51.43l-.24-.7c.48-.31,1.18-.52,1.91-.52,1.77,0,2.21,1.21,2.21,2.37v2.17c0,.5.02,1,.1,1.39h-.96ZM78.78,61.94c-1.15-.02-2.46.18-2.46,1.31,0,.68.46,1.01,1,1.01.76,0,1.24-.48,1.4-.97.04-.11.06-.23.06-.34v-1.01Z"/>
+    <path class="cls-4" d="M82.68,57.46c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM81.51,64.9v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M84.31,56.39h1.06v8.52h-1.06v-8.52Z"/>
+    <path class="cls-4" d="M90.36,64.9l-.08-.73h-.04c-.32.46-.95.86-1.77.86-1.18,0-1.77-.83-1.77-1.67,0-1.4,1.25-2.17,3.49-2.16v-.12c0-.48-.13-1.34-1.32-1.34-.54,0-1.1.17-1.51.43l-.24-.7c.48-.31,1.18-.52,1.91-.52,1.77,0,2.21,1.21,2.21,2.37v2.17c0,.5.02,1,.1,1.39h-.96ZM90.2,61.94c-1.15-.02-2.46.18-2.46,1.31,0,.68.46,1.01,1,1.01.76,0,1.24-.48,1.4-.97.04-.11.06-.23.06-.34v-1.01Z"/>
+    <path class="cls-4" d="M92.88,64.9c.02-.4.05-.98.05-1.5v-7.02h1.04v3.65h.02c.37-.65,1.04-1.07,1.98-1.07,1.44,0,2.46,1.2,2.45,2.96,0,2.07-1.31,3.11-2.6,3.11-.84,0-1.51-.32-1.94-1.09h-.04l-.05.96h-.91ZM93.97,62.57c0,.13.02.26.05.38.2.73.82,1.24,1.58,1.24,1.1,0,1.76-.9,1.76-2.23,0-1.16-.6-2.16-1.73-2.16-.72,0-1.39.49-1.61,1.3-.02.12-.06.26-.06.43v1.04Z"/>
+    <path class="cls-4" d="M99.76,56.39h1.06v8.52h-1.06v-8.52Z"/>
+    <path class="cls-4" d="M103.18,62.19c.02,1.43.94,2.01,1.99,2.01.76,0,1.21-.13,1.61-.3l.18.76c-.37.17-1.01.36-1.93.36-1.79,0-2.85-1.18-2.85-2.93s1.03-3.13,2.72-3.13c1.9,0,2.4,1.67,2.4,2.73,0,.22-.02.38-.04.49h-4.08ZM106.27,61.43c.01-.67-.28-1.71-1.46-1.71-1.07,0-1.54.98-1.62,1.71h3.08Z"/>
+    <path class="cls-4" d="M29.05,79.3v-5h-.82v-.8h.82v-.28c0-.82.18-1.56.67-2.03.4-.38.92-.54,1.42-.54.37,0,.7.08.9.17l-.14.82c-.16-.07-.37-.13-.67-.13-.9,0-1.13.79-1.13,1.68v.31h1.4v.8h-1.4v5h-1.04Z"/>
+    <path class="cls-4" d="M32.45,75.31c0-.68-.01-1.27-.05-1.81h.92l.04,1.14h.05c.26-.78.9-1.27,1.61-1.27.12,0,.2.01.3.04v1c-.11-.02-.22-.04-.36-.04-.74,0-1.27.56-1.42,1.36-.02.14-.05.31-.05.49v3.09h-1.04v-3.99Z"/>
+    <path class="cls-4" d="M41.51,76.35c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM36.9,76.41c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M42.84,75.07c0-.6-.01-1.09-.05-1.57h.92l.05.94h.04c.32-.55.86-1.07,1.82-1.07.79,0,1.39.48,1.64,1.16h.02c.18-.32.41-.58.65-.76.35-.26.73-.41,1.28-.41.77,0,1.91.5,1.91,2.52v3.42h-1.03v-3.29c0-1.12-.41-1.79-1.26-1.79-.6,0-1.07.44-1.25.96-.05.14-.08.34-.08.53v3.59h-1.03v-3.48c0-.92-.41-1.6-1.21-1.6-.66,0-1.14.53-1.31,1.06-.06.16-.08.34-.08.52v3.5h-1.03v-4.23Z"/>
+    <path class="cls-4" d="M60.19,79.3h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M67.18,76.31c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM66.13,76.36c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M73.39,79.22c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M77.61,73.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM77.61,77.61c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M35.08,107.67c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M41.9,104.97c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM40.86,105.02c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M43.38,102.07h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M54.55,107.74c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M60.35,107.96l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM60.24,105.28h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M67.91,107.87c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M72.11,106.88c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.33-1.19-.33-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M81.86,106.37c0,.6.01,1.13.05,1.58h-.94l-.06-.95h-.02c-.28.47-.89,1.08-1.92,1.08-.91,0-2-.5-2-2.54v-3.39h1.06v3.21c0,1.1.34,1.85,1.3,1.85.71,0,1.2-.49,1.39-.96.06-.16.1-.35.1-.54v-3.56h1.06v4.22Z"/>
+    <path class="cls-4" d="M83.57,107.96c.02-.4.05-.98.05-1.5v-7.02h1.04v3.65h.02c.37-.65,1.04-1.07,1.98-1.07,1.44,0,2.46,1.2,2.45,2.96,0,2.07-1.31,3.11-2.6,3.11-.84,0-1.51-.32-1.94-1.09h-.04l-.05.96h-.91ZM84.66,105.63c0,.13.02.26.05.38.2.73.82,1.24,1.58,1.24,1.1,0,1.76-.9,1.76-2.23,0-1.16-.6-2.16-1.73-2.16-.72,0-1.39.49-1.61,1.29-.02.12-.06.26-.06.43v1.04Z"/>
+    <path class="cls-4" d="M90.3,106.88c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.33-1.19-.33-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M99.33,107.74c-.28.14-.89.34-1.67.34-1.75,0-2.89-1.19-2.89-2.96s1.22-3.08,3.12-3.08c.62,0,1.18.16,1.46.3l-.24.82c-.25-.14-.65-.28-1.22-.28-1.33,0-2.05.98-2.05,2.19,0,1.34.86,2.17,2.02,2.17.6,0,1-.16,1.3-.29l.18.79Z"/>
+    <path class="cls-4" d="M100.57,103.96c0-.68-.01-1.27-.05-1.81h.92l.04,1.14h.05c.26-.78.9-1.27,1.61-1.27.12,0,.2.01.3.04v1c-.11-.02-.22-.04-.36-.04-.74,0-1.27.56-1.42,1.36-.02.14-.05.31-.05.49v3.09h-1.04v-3.99Z"/>
+    <path class="cls-4" d="M105.72,100.52c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM104.54,107.96v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M107.35,104.05c0-.74-.02-1.34-.05-1.9h.95l.05,1h.02c.43-.71,1.12-1.13,2.06-1.13,1.4,0,2.46,1.19,2.46,2.95,0,2.09-1.27,3.12-2.64,3.12-.77,0-1.44-.34-1.79-.91h-.02v3.15h-1.04v-6.28ZM108.4,105.59c0,.16.02.3.05.43.19.73.83,1.24,1.58,1.24,1.12,0,1.76-.91,1.76-2.24,0-1.16-.61-2.16-1.73-2.16-.72,0-1.39.52-1.6,1.31-.04.13-.07.29-.07.43v1Z"/>
+    <path class="cls-4" d="M115.45,100.49v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M119.33,100.52c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM118.15,107.96v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M126.21,105.01c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM121.61,105.07c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M127.55,103.72c0-.6-.01-1.09-.05-1.57h.94l.06.96h.02c.29-.55.96-1.09,1.92-1.09.8,0,2.05.48,2.05,2.47v3.47h-1.06v-3.35c0-.94-.35-1.71-1.34-1.71-.7,0-1.24.49-1.42,1.08-.05.13-.07.31-.07.49v3.49h-1.06v-4.23Z"/>
+    <path class="cls-4" d="M31.39,114.89v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M39.28,119.41c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM34.67,119.47c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M47.94,122.36h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M54.94,119.37c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM53.89,119.42c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M61.15,122.28c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M65.37,116.37c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM65.37,120.66c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,150.37c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,147.59c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,147.64c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,143.14h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,147.76c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,147.7c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.71,148.74c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-4" d="M66.89,150.29c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M73.72,147.59c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,147.64c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M75.19,144.7h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M86.36,150.37c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M92.17,150.58l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM92.06,147.9h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M99.73,150.5c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M105.1,153.04c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-4" d="M112.91,150.58h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M119.9,147.59c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM118.86,147.64c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M126.12,150.5c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M129.17,141.86c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-4" d="M136.93,144.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM136.93,148.89c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="162.6" y1="8.33" x2="162.6" y2="43.34"/>
+  <line class="cls-1" x1="284.02" y1="8.33" x2="284.02" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="162.28" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M165.07,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM163.57,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="215.99" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M218.29,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="260.81" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M263.56,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="215.99" cy="146.83" r="13.56"/>
+    <path class="cls-4" d="M218.29,150.38h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="260.81" cy="146.83" r="13.56"/>
+    <path class="cls-4" d="M263.56,150.38h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="162.28" cy="146.83" r="13.56"/>
+    <path class="cls-4" d="M165.07,146.01c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM163.57,148.67c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <line id="source_line-4" data-name="source line" class="cls-1" x1="162.6" y1="66.35" x2="428.65" y2="66.35"/>
+  <line class="cls-1" x1="428.65" y1="48.85" x2="428.65" y2="83.86"/>
+  <line class="cls-1" x1="162.6" y1="48.85" x2="162.6" y2="83.86"/>
+  <g>
+    <circle class="cls-2" cx="349" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M352.69,65.55c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,65.53c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M404.67,69.9v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="195.61" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M191.96,69.9l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM196.93,66.47l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="242.25" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M245.52,67.22c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM243.9,63.31c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM244.31,67.27c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M296.32,70.06c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="349" cy="146.83" r="13.56"/>
+    <path class="cls-4" d="M352.69,146.02c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,146.01c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="146.83" r="13.56"/>
+    <path class="cls-4" d="M404.67,150.38v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="146.83" r="13.56"/>
+    <path class="cls-4" d="M296.32,150.54c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line class="cls-1" x1="428.65" y1="129.33" x2="428.65" y2="164.33"/>
+</svg>

+ 116 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles-SubOnly.svg

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 457.73 136.45">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="162.28" y1="89.36" x2="162.28" y2="124.37"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="162.6" y1="25.84" x2="284.02" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="162.6" y1="106.87" x2="428.65" y2="106.87"/>
+  <g>
+    <path class="cls-4" d="M33.58,27.9c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,25.13c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,25.18c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,20.68h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,25.3c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,25.24c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.76,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.74,69.9h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M40.73,66.91c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,66.96c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M46.94,69.82c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M51.16,63.91c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM51.16,68.21c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,110.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,103.18h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,107.8c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,107.74c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.71,108.77c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-4" d="M66.89,110.33c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M73.72,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M75.19,104.74h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M86.36,110.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M92.17,110.62l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM92.06,107.94h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M99.73,110.54c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M105.1,113.08c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-4" d="M112.91,110.62h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M119.9,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM118.86,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M126.12,110.54c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M129.17,101.89c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-4" d="M136.93,104.63c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM136.93,108.93c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="162.6" y1="8.33" x2="162.6" y2="43.34"/>
+  <line class="cls-1" x1="284.02" y1="8.33" x2="284.02" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="162.28" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M165.07,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM163.57,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="215.99" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M218.29,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="260.81" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M263.56,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="215.99" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M218.29,110.41h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="260.81" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M263.56,110.41h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="162.28" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M165.07,106.05c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM163.57,108.71c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="284.02" y1="66.35" x2="428.65" y2="66.35"/>
+  <line class="cls-1" x1="428.65" y1="48.85" x2="428.65" y2="83.86"/>
+  <line class="cls-1" x1="284.02" y1="50.72" x2="284.02" y2="85.73"/>
+  <g>
+    <circle class="cls-2" cx="349" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M352.69,65.55c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,65.53c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M404.67,69.9v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M296.32,70.06c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="349" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M352.69,106.06c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,106.04c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M404.67,110.41v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M296.32,110.57c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line class="cls-1" x1="428.65" y1="89.36" x2="428.65" y2="124.37"/>
+</svg>

+ 124 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Hot-Marbles.svg

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 457.73 136.45">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="162.28" y1="89.36" x2="162.28" y2="124.37"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="162.6" y1="25.84" x2="284.02" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="162.6" y1="106.87" x2="428.65" y2="106.87"/>
+  <g>
+    <path class="cls-4" d="M33.58,27.9c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,25.13c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,25.18c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,20.68h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,25.3c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,25.24c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.76,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.74,69.9h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M40.73,66.91c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,66.96c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M46.94,69.82c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M51.16,63.91c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM51.16,68.21c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,110.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,103.18h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,107.8c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,107.74c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.71,108.77c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-4" d="M66.89,110.33c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M73.72,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M75.19,104.74h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M86.36,110.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M92.17,110.62l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM92.06,107.94h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M99.73,110.54c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M105.1,113.08c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-4" d="M112.91,110.62h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-4" d="M119.9,107.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM118.86,107.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M126.12,110.54c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M129.17,101.89c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-4" d="M136.93,104.63c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM136.93,108.93c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="162.6" y1="8.33" x2="162.6" y2="43.34"/>
+  <line class="cls-1" x1="284.02" y1="8.33" x2="284.02" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="162.28" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M165.07,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM163.57,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="215.99" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M218.29,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="260.81" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M263.56,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="215.99" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M218.29,110.41h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="260.81" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M263.56,110.41h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="162.28" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M165.07,106.05c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM163.57,108.71c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="162.6" y1="66.35" x2="428.65" y2="66.35"/>
+  <line class="cls-1" x1="428.65" y1="48.85" x2="428.65" y2="83.86"/>
+  <line class="cls-1" x1="162.6" y1="48.85" x2="162.6" y2="83.86"/>
+  <g>
+    <circle class="cls-2" cx="349" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M352.69,65.55c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,65.53c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M404.67,69.9v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="195.61" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M191.96,69.9l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM196.93,66.47l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="242.25" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M245.52,67.22c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM243.9,63.31c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM244.31,67.27c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M296.32,70.06c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="349" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M352.69,106.06c0,.8-.16,1.52-.48,2.16s-.75,1.14-1.3,1.5c-.44.28-.89.46-1.34.56s-1.04.14-1.74.14h-2.01v-8.72h1.99c.82,0,1.46.06,1.93.18s.86.29,1.19.51c.56.37,1,.86,1.31,1.48s.46,1.35.46,2.2ZM351.49,106.04c0-.67-.11-1.25-.33-1.72s-.55-.84-.99-1.11c-.31-.19-.64-.32-.99-.4s-.79-.12-1.31-.12h-.88v6.73h.88c.52,0,.97-.04,1.35-.12s.74-.23,1.06-.46c.4-.27.71-.64.91-1.09s.3-1.02.3-1.7Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="407.15" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M404.67,110.41v-8.72h5.46v1.03h-4.29v2.39h4v1.03h-4v3.24h4.29v1.03h-5.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="295.62" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M296.32,110.57c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line class="cls-1" x1="428.65" y1="89.36" x2="428.65" y2="124.37"/>
+</svg>

+ 158 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles-Cold-Twice.svg

@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 457.73 133.38">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="162.44" y1="88.36" x2="162.44" y2="123.37"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="162.6" y1="25.84" x2="284.02" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="162.76" y1="105.87" x2="405.53" y2="105.87"/>
+  <g>
+    <path class="cls-4" d="M35.08,20.34c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M41.9,17.64c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM40.86,17.69c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M43.38,14.74h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M54.55,20.41c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M60.35,20.63l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM60.24,17.95h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M67.91,20.55c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M72.11,19.55c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.34-1.19-.34-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M81.86,19.04c0,.6.01,1.13.05,1.58h-.94l-.06-.95h-.02c-.28.47-.89,1.08-1.92,1.08-.91,0-2-.5-2-2.54v-3.39h1.06v3.21c0,1.1.34,1.85,1.3,1.85.71,0,1.2-.49,1.39-.96.06-.16.1-.35.1-.54v-3.56h1.06v4.22Z"/>
+    <path class="cls-4" d="M83.57,20.63c.02-.4.05-.98.05-1.5v-7.02h1.04v3.65h.02c.37-.65,1.04-1.07,1.98-1.07,1.44,0,2.46,1.2,2.45,2.96,0,2.07-1.31,3.11-2.6,3.11-.84,0-1.51-.32-1.94-1.09h-.04l-.05.96h-.91ZM84.66,18.3c0,.13.02.26.05.38.2.73.82,1.24,1.58,1.24,1.1,0,1.76-.9,1.76-2.23,0-1.16-.6-2.16-1.73-2.16-.72,0-1.39.49-1.61,1.3-.02.12-.06.26-.06.43v1.04Z"/>
+    <path class="cls-4" d="M90.3,19.55c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.34-1.19-.34-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M99.33,20.41c-.28.14-.89.34-1.67.34-1.75,0-2.89-1.19-2.89-2.96s1.22-3.08,3.12-3.08c.62,0,1.18.16,1.46.3l-.24.82c-.25-.14-.65-.28-1.22-.28-1.33,0-2.05.98-2.05,2.19,0,1.34.86,2.17,2.02,2.17.6,0,1-.16,1.3-.29l.18.79Z"/>
+    <path class="cls-4" d="M100.57,16.63c0-.68-.01-1.27-.05-1.81h.92l.04,1.14h.05c.26-.78.9-1.27,1.61-1.27.12,0,.2.01.3.04v1c-.11-.02-.22-.04-.36-.04-.74,0-1.27.56-1.42,1.36-.02.14-.05.31-.05.49v3.09h-1.04v-3.99Z"/>
+    <path class="cls-4" d="M105.72,13.19c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM104.54,20.63v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M107.35,16.72c0-.74-.02-1.34-.05-1.9h.95l.05,1h.02c.43-.71,1.12-1.13,2.06-1.13,1.4,0,2.46,1.19,2.46,2.95,0,2.09-1.27,3.12-2.64,3.12-.77,0-1.44-.34-1.79-.91h-.02v3.15h-1.04v-6.28ZM108.4,18.26c0,.16.02.3.05.43.19.73.83,1.24,1.58,1.24,1.12,0,1.76-.91,1.76-2.24,0-1.16-.61-2.16-1.73-2.16-.72,0-1.39.52-1.6,1.31-.04.13-.07.29-.07.43v1Z"/>
+    <path class="cls-4" d="M115.45,13.16v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M119.33,13.19c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM118.15,20.63v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M126.21,17.68c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM121.61,17.74c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M127.55,16.39c0-.6-.01-1.09-.05-1.57h.94l.06.96h.02c.29-.55.96-1.09,1.92-1.09.8,0,2.05.48,2.05,2.47v3.47h-1.06v-3.35c0-.94-.35-1.71-1.34-1.71-.7,0-1.24.49-1.42,1.08-.05.13-.07.31-.07.49v3.49h-1.06v-4.23Z"/>
+    <path class="cls-4" d="M31.39,27.56v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M39.28,32.08c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM34.67,32.14c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M47.79,34.81c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M54.94,32.04c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM53.89,32.09c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M58.42,27.59h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M62.71,32.21c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM63.75,32.14c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M71.97,29.04c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM71.97,33.33c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M35.08,64.75c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M41.9,62.04c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM40.86,62.09c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M43.38,59.15h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M54.55,64.82c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M60.35,65.03l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM60.24,62.35h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M67.91,64.95c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M72.11,63.95c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.34-1.19-.34-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M81.86,63.45c0,.6.01,1.13.05,1.58h-.94l-.06-.95h-.02c-.28.47-.89,1.08-1.92,1.08-.91,0-2-.5-2-2.54v-3.39h1.06v3.21c0,1.1.34,1.85,1.3,1.85.71,0,1.2-.49,1.39-.96.06-.16.1-.35.1-.54v-3.56h1.06v4.22Z"/>
+    <path class="cls-4" d="M83.57,65.03c.02-.4.05-.98.05-1.5v-7.02h1.04v3.65h.02c.37-.65,1.04-1.07,1.98-1.07,1.44,0,2.46,1.2,2.45,2.96,0,2.07-1.31,3.11-2.6,3.11-.84,0-1.51-.32-1.94-1.09h-.04l-.05.96h-.91ZM84.66,62.71c0,.13.02.26.05.38.2.73.82,1.24,1.58,1.24,1.1,0,1.76-.9,1.76-2.23,0-1.16-.6-2.16-1.73-2.16-.72,0-1.39.49-1.61,1.3-.02.12-.06.26-.06.43v1.04Z"/>
+    <path class="cls-4" d="M90.3,63.95c.31.2.86.42,1.39.42.77,0,1.13-.38,1.13-.86,0-.5-.3-.78-1.08-1.07-1.04-.37-1.54-.95-1.54-1.64,0-.94.76-1.7,2-1.7.59,0,1.1.17,1.43.36l-.26.77c-.23-.14-.65-.34-1.19-.34-.62,0-.97.36-.97.79,0,.48.35.7,1.1.98,1.01.38,1.52.89,1.52,1.75,0,1.02-.79,1.74-2.17,1.74-.64,0-1.22-.16-1.63-.4l.26-.8Z"/>
+    <path class="cls-4" d="M99.33,64.82c-.28.14-.89.34-1.67.34-1.75,0-2.89-1.19-2.89-2.96s1.22-3.08,3.12-3.08c.62,0,1.18.16,1.46.3l-.24.82c-.25-.14-.65-.28-1.22-.28-1.33,0-2.05.98-2.05,2.19,0,1.34.86,2.17,2.02,2.17.6,0,1-.16,1.3-.29l.18.79Z"/>
+    <path class="cls-4" d="M100.57,61.04c0-.68-.01-1.27-.05-1.81h.92l.04,1.14h.05c.26-.78.9-1.27,1.61-1.27.12,0,.2.01.3.04v1c-.11-.02-.22-.04-.36-.04-.74,0-1.27.56-1.42,1.36-.02.14-.05.31-.05.49v3.09h-1.04v-3.99Z"/>
+    <path class="cls-4" d="M105.72,57.6c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM104.54,65.03v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M107.35,61.12c0-.74-.02-1.34-.05-1.9h.95l.05,1h.02c.43-.71,1.12-1.13,2.06-1.13,1.4,0,2.46,1.19,2.46,2.95,0,2.09-1.27,3.12-2.64,3.12-.77,0-1.44-.34-1.79-.91h-.02v3.15h-1.04v-6.28ZM108.4,62.67c0,.16.02.3.05.43.19.73.83,1.24,1.58,1.24,1.12,0,1.76-.91,1.76-2.24,0-1.16-.61-2.16-1.73-2.16-.72,0-1.39.52-1.6,1.31-.04.13-.07.29-.07.43v1Z"/>
+    <path class="cls-4" d="M115.45,57.56v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M119.33,57.6c.01.36-.25.65-.67.65-.37,0-.64-.29-.64-.65s.28-.66.66-.66.65.29.65.66ZM118.15,65.03v-5.8h1.06v5.8h-1.06Z"/>
+    <path class="cls-4" d="M126.21,62.08c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM121.61,62.14c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M127.55,60.8c0-.6-.01-1.09-.05-1.57h.94l.06.96h.02c.29-.55.96-1.09,1.92-1.09.8,0,2.05.48,2.05,2.47v3.47h-1.06v-3.35c0-.94-.35-1.71-1.34-1.71-.7,0-1.24.49-1.42,1.08-.05.13-.07.31-.07.49v3.49h-1.06v-4.23Z"/>
+    <path class="cls-4" d="M31.39,71.96v1.67h1.51v.8h-1.51v3.13c0,.72.2,1.13.79,1.13.28,0,.48-.04.61-.07l.05.79c-.2.08-.53.14-.94.14-.49,0-.89-.16-1.14-.44-.3-.31-.41-.83-.41-1.51v-3.17h-.9v-.8h.9v-1.39l1.03-.28Z"/>
+    <path class="cls-4" d="M39.28,76.48c0,2.15-1.49,3.08-2.89,3.08-1.57,0-2.78-1.15-2.78-2.99,0-1.94,1.27-3.08,2.88-3.08s2.79,1.21,2.79,2.99ZM34.67,76.54c0,1.27.73,2.23,1.76,2.23s1.76-.95,1.76-2.25c0-.98-.49-2.23-1.74-2.23s-1.79,1.15-1.79,2.25Z"/>
+    <path class="cls-4" d="M47.79,79.22c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M54.94,76.44c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM53.89,76.49c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M58.42,71.99h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M62.71,76.61c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM63.75,76.55c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M71.97,73.44c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM71.97,77.74c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,109.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M40.73,106.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,106.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M44.21,102.18h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M48.5,106.8c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM49.55,106.73c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M57.71,107.77c.13,0,.26.03.38.08s.22.12.31.21.16.19.21.31.08.25.08.38-.03.26-.08.38-.12.22-.21.31-.19.16-.31.21-.25.08-.38.08-.26-.03-.38-.08-.22-.12-.31-.21-.16-.19-.21-.31-.08-.24-.08-.38.03-.26.08-.38.12-.22.21-.31.19-.16.31-.21.24-.08.38-.08Z"/>
+    <path class="cls-4" d="M66.89,109.33c-.61.25-1.26.38-1.93.38-1.08,0-1.91-.32-2.49-.97s-.87-1.6-.87-2.87c0-.61.08-1.17.24-1.66s.39-.92.69-1.26.66-.61,1.08-.8.89-.28,1.42-.28c.36,0,.69.03.99.09s.6.15.88.28v1.03c-.28-.15-.56-.27-.86-.35s-.62-.12-.97-.12-.68.07-.98.2-.54.33-.74.59-.36.57-.47.94-.16.79-.16,1.26c0,.99.2,1.74.6,2.24s.99.76,1.77.76c.33,0,.64-.04.94-.11s.59-.18.87-.32v.98Z"/>
+    <path class="cls-4" d="M73.72,106.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,106.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M75.19,103.73h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-4" d="M86.36,109.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M92.17,109.62l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM92.06,106.94h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-4" d="M99.73,109.54c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-4" d="M105.1,112.08c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-4" d="M112.75,109.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M119.9,106.63c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM118.86,106.68c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-4" d="M123.38,102.18h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-4" d="M127.67,106.8c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM128.72,106.73c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-4" d="M135.77,100.89c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-4" d="M143.53,103.63c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM143.53,107.92c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="162.6" y1="8.33" x2="162.6" y2="43.34"/>
+  <line class="cls-1" x1="284.02" y1="8.33" x2="284.02" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="188.91" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M191.7,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM190.2,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="220.06" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M222.36,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="264.88" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M267.62,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="284.11" y1="64.9" x2="405.53" y2="64.9"/>
+  <line class="cls-1" x1="284.11" y1="47.4" x2="284.11" y2="82.4"/>
+  <line class="cls-1" x1="405.53" y1="47.4" x2="405.53" y2="82.4"/>
+  <g>
+    <circle class="cls-2" cx="310.42" cy="64.9" r="13.56"/>
+    <path class="cls-4" d="M313.21,64.08c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM311.71,66.74c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="341.56" cy="64.9" r="13.56"/>
+    <path class="cls-4" d="M343.87,68.45h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="386.38" cy="64.9" r="13.56"/>
+    <path class="cls-4" d="M389.13,68.45h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="310.42" cy="105.87" r="13.56"/>
+    <path class="cls-4" d="M313.21,105.05c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM311.71,107.71c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="341.56" cy="105.87" r="13.56"/>
+    <path class="cls-4" d="M343.87,109.41h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="386.38" cy="105.87" r="13.56"/>
+    <path class="cls-4" d="M389.13,109.41h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="220.06" cy="105.87" r="13.56"/>
+    <path class="cls-4" d="M222.36,109.41h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="264.88" cy="105.87" r="13.56"/>
+    <path class="cls-4" d="M267.62,109.41h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="188.91" cy="105.87" r="13.56"/>
+    <path class="cls-4" d="M191.7,105.05c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM190.2,107.71c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <line class="cls-1" x1="405.53" y1="88.36" x2="405.53" y2="123.37"/>
+</svg>

+ 86 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles-Three.svg

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 382.61 177.91">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line id="source_line" data-name="source line" class="cls-2" x1="70.26" y1="149.49" x2="288.41" y2="149.49"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="70.26" y1="24.01" x2="138.71" y2="24.01"/>
+  <line class="cls-2" x1="275.22" y1="87.53" x2="275.22" y2="122.54"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="275.54" y1="105.03" x2="288.41" y2="105.03"/>
+  <g>
+    <path class="cls-5" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.51,26.29h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M44.57,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.58,68.07h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-5" d="M44.57,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,66.38c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.43,106.46c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M44.57,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="70.26" y1="6.5" x2="70.26" y2="41.51"/>
+  <line class="cls-2" x1="138.71" y1="6.5" x2="138.71" y2="41.51"/>
+  <g>
+    <circle class="cls-4" cx="138.71" cy="24.01" r="13.56"/>
+    <path class="cls-5" d="M141.01,27.56h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="138.71" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M141.01,153.04h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line class="cls-2" x1="70.26" y1="131.98" x2="70.26" y2="166.99"/>
+  <line class="cls-2" x1="288.62" y1="131.98" x2="288.62" y2="166.99"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="139.08" y1="64.52" x2="165.46" y2="64.52"/>
+  <line class="cls-2" x1="165.46" y1="47.02" x2="165.46" y2="82.03"/>
+  <line class="cls-2" x1="139.08" y1="47.02" x2="139.08" y2="82.03"/>
+  <g>
+    <circle class="cls-3" cx="165.46" cy="64.52" r="13.56"/>
+    <path class="cls-5" d="M168.21,68.07h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="165.46" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M168.21,153.04h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <line class="cls-2" x1="288.41" y1="87.53" x2="288.41" y2="122.54"/>
+  <g>
+    <path class="cls-5" d="M29.25,143.42h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.97,143.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,147.61c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="288.41" cy="105.03" r="13.56"/>
+    <path class="cls-5" d="M288.13,100.69c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="288.62" cy="149.49" r="13.56"/>
+    <path class="cls-5" d="M288.34,145.14c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+</svg>

+ 114 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Concat-Marbles.svg

@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 309.61 127.97">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="70.94" y1="86.72" x2="70.94" y2="121.73"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="71.26" y1="23.2" x2="150.91" y2="23.2"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="71.26" y1="104.23" x2="286.51" y2="104.23"/>
+  <g>
+    <path class="cls-4" d="M33.67,23.87c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.51,25.48h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-4" d="M44.57,19.49c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,23.78c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.67,65.65c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.58,67.26h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-4" d="M44.57,61.27c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,65.57c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,107.76c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M37.97,101.99c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,106.28c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="71.26" y1="5.69" x2="71.26" y2="40.7"/>
+  <line class="cls-1" x1="150.91" y1="5.69" x2="150.91" y2="40.7"/>
+  <g>
+    <circle class="cls-3" cx="70.94" cy="23.2" r="13.56"/>
+    <path class="cls-4" d="M73.73,22.38c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM72.23,25.04c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="101.97" cy="23.2" r="13.56"/>
+    <path class="cls-4" d="M104.27,26.75h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="133.22" cy="23.2" r="13.56"/>
+    <path class="cls-4" d="M135.97,26.75h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="70.94" cy="104.13" r="13.56"/>
+    <path class="cls-4" d="M73.73,103.31c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM72.23,105.97c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="101.97" cy="104.13" r="13.56"/>
+    <path class="cls-4" d="M104.27,107.67h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="133.22" cy="104.13" r="13.56"/>
+    <path class="cls-4" d="M135.97,107.67h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="164.47" y1="63.71" x2="288.44" y2="63.71"/>
+  <line class="cls-1" x1="288.68" y1="46.21" x2="288.68" y2="81.22"/>
+  <line class="cls-1" x1="164.47" y1="46.21" x2="164.47" y2="81.22"/>
+  <g>
+    <circle class="cls-2" cx="257.66" cy="63.71" r="13.56"/>
+    <path class="cls-4" d="M257.66,67.46c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM259.3,64.94c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM259.13,60.57c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="288.68" cy="63.71" r="13.56"/>
+    <path class="cls-4" d="M285.8,61.37c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.91s-.24-.81-.24-1.32ZM290.28,62.12c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.86c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.2.76-.35c0-.06,0-.14.01-.23s0-.2,0-.32Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="164.47" cy="63.71" r="13.56"/>
+    <path class="cls-4" d="M167.12,64.48c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="195.5" cy="63.71" r="13.56"/>
+    <path class="cls-4" d="M198.38,64.43c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM197.2,64.48c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="226.53" cy="63.71" r="13.56"/>
+    <path class="cls-4" d="M229.37,59.84l-3.77,7.42h-1.25l4-7.7h-4.51v-1.03h5.54v1.31Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="257.66" cy="104.23" r="13.56"/>
+    <path class="cls-4" d="M257.66,107.97c-.43,0-.83-.06-1.18-.19s-.66-.31-.91-.56c-.25-.23-.43-.51-.56-.83s-.19-.66-.19-1.02c0-.47.13-.91.38-1.3s.62-.71,1.1-.95v-.04c-.43-.25-.75-.52-.96-.82s-.31-.67-.31-1.11c0-.66.25-1.2.74-1.64s1.12-.66,1.89-.66,1.43.21,1.91.62.72.95.72,1.6c0,.39-.11.78-.34,1.16s-.56.68-.99.9v.04c.51.24.89.53,1.15.87s.39.78.39,1.31c0,.75-.27,1.37-.81,1.88s-1.22.76-2.03.76ZM259.3,105.45c0-.36-.07-.64-.21-.86s-.41-.43-.81-.64c-.13-.07-.31-.15-.53-.24s-.47-.19-.75-.3c-.32.21-.57.48-.74.79s-.26.67-.26,1.08c0,.53.16.96.48,1.31s.72.52,1.2.52.89-.15,1.18-.44.45-.7.45-1.2ZM259.13,101.08c0-.39-.13-.72-.39-.98s-.62-.39-1.09-.39c-.43,0-.77.12-1.05.35s-.41.55-.41.95c0,.29.07.53.21.73s.35.38.62.54c.12.07.31.16.55.28s.47.21.68.28c.34-.26.57-.53.69-.81s.18-.59.18-.95Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="164.47" cy="104.23" r="13.56"/>
+    <path class="cls-4" d="M167.12,105c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="195.5" cy="104.23" r="13.56"/>
+    <path class="cls-4" d="M198.38,104.94c0,.45-.07.86-.22,1.24s-.35.7-.6.95c-.26.27-.55.47-.88.61s-.68.21-1.07.21-.75-.07-1.08-.2-.61-.33-.85-.59c-.3-.32-.54-.74-.71-1.27s-.25-1.18-.25-1.95.08-1.44.23-2.05.4-1.14.72-1.6c.32-.44.72-.79,1.22-1.03s1.08-.37,1.73-.37c.2,0,.38,0,.54.03s.32.05.45.09v1.12h-.05c-.11-.06-.26-.11-.46-.16s-.41-.07-.64-.07c-.73,0-1.31.25-1.76.74s-.71,1.22-.79,2.18c.28-.2.56-.35.86-.45s.61-.16.96-.16.64.03.89.1.52.21.8.41c.32.24.56.55.71.92s.23.81.23,1.31ZM197.2,104.99c0-.36-.05-.66-.14-.9s-.25-.45-.46-.62c-.15-.12-.33-.21-.52-.25s-.39-.06-.59-.06c-.27,0-.54.04-.8.12s-.51.2-.76.36c0,.09-.01.17-.02.25s0,.18,0,.3c0,.61.06,1.09.18,1.46s.27.65.44.84c.17.18.34.31.52.39s.37.11.58.11c.47,0,.85-.17,1.14-.5s.44-.84.44-1.51Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="226.53" cy="104.23" r="13.56"/>
+    <path class="cls-4" d="M229.37,100.36l-3.77,7.42h-1.25l4-7.7h-4.51v-1.03h5.54v1.31Z"/>
+  </g>
+  <line class="cls-1" x1="288.63" y1="86.72" x2="288.63" y2="121.73"/>
+  <g>
+    <circle class="cls-2" cx="288.68" cy="104.23" r="13.56"/>
+    <path class="cls-4" d="M285.8,101.89c0-.45.07-.86.22-1.23s.35-.69.6-.96c.24-.26.54-.46.89-.6s.7-.22,1.06-.22c.4,0,.77.07,1.09.2s.61.33.85.58c.3.32.53.74.7,1.26s.25,1.18.25,1.97c0,.72-.08,1.41-.24,2.05s-.4,1.18-.72,1.61c-.34.45-.74.8-1.21,1.04s-1.05.36-1.74.36c-.16,0-.32,0-.5-.03s-.34-.05-.49-.1v-1.12h.06c.1.05.25.11.46.16s.42.08.63.08c.77,0,1.37-.25,1.8-.76s.69-1.22.74-2.16c-.31.21-.61.37-.89.46s-.59.15-.92.15-.62-.04-.88-.11-.53-.21-.8-.41c-.31-.24-.55-.54-.71-.91s-.24-.81-.24-1.32ZM290.28,102.64c0-.59-.05-1.08-.16-1.45s-.26-.66-.45-.86c-.17-.19-.35-.32-.52-.39s-.37-.11-.58-.11c-.48,0-.86.17-1.15.52s-.43.84-.43,1.49c0,.37.05.67.14.91s.25.44.46.62c.15.12.32.2.5.24s.39.06.6.06c.25,0,.52-.04.81-.13s.54-.2.76-.35c0-.06,0-.14.01-.23s0-.2,0-.32Z"/>
+  </g>
+</svg>

+ 422 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-GroupJoin-Marbles.svg

@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 461.98 528.68">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-2" x1="168.47" y1="233.01" x2="168.47" y2="268.02"/>
+  <line id="source_line" data-name="source line" class="cls-2" x1="168.79" y1="25.84" x2="449.31" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="168.79" y1="250.52" x2="449.31" y2="250.52"/>
+  <g>
+    <path class="cls-5" d="M31.01,20.68h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M40.58,24.87c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,24.72c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M47.42,20.79c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M53.54,28.04c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M57.76,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M29.25,131.4h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.61,132.24h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,128.93c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,132.23c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,138.13c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,133.32c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,137.28h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,137.2c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64.36,131.29c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,135.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M34.23,240.2h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,234.64c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-5" d="M37.61,235.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,231.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,235.14c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,241.05c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,236.23c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,240.2h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,240.11c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M73.72,237.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,237.25c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M80.22,237.15c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,237.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M86.45,238.59c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M93.36,236.94c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM92.3,236.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M95.23,234.31h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M101.03,234.31h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M111.96,240.2l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,237.52h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M119.81,237.15c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM118.76,237.2c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M123.38,232.75h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M132.94,236.94c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,236.8c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M34.04,251.55c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,251.6c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M39.39,254.6l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,251.92h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M46.86,252.99c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M53.46,252.99c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M60.37,251.34c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,251.2c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M61.7,251.78c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,251.71c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M79.93,254.51c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.91,251.61c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM85.87,251.65c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,252.99c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.55,251.34c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM105.49,251.2c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M110.18,247.15h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M119.75,251.34c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,251.2c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M125.95,254.38c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M132.71,254.51c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M139.69,251.61c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM138.65,251.65c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M141.41,248.71h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M34.23,261.67c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M40.73,266.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,266.05c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M42.44,263.11h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M60.54,265.17c0,.59-.06,1.12-.18,1.6s-.29.9-.53,1.24-.53.61-.89.8-.77.28-1.25.28c-.41,0-.78-.08-1.12-.23s-.62-.39-.86-.71-.42-.73-.55-1.22-.19-1.08-.19-1.76c0-.59.06-1.12.18-1.61s.3-.9.53-1.25.53-.61.89-.8.77-.28,1.24-.28c.41,0,.78.08,1.12.23s.62.39.86.71.42.73.55,1.23.19,1.08.19,1.76ZM56.01,265.13c0,.12,0,.24,0,.36s0,.24.02.35l3.24-2.4c-.06-.2-.13-.38-.22-.54s-.2-.31-.32-.42-.27-.21-.43-.28-.34-.1-.54-.1c-.27,0-.51.06-.72.19s-.4.32-.55.58-.27.57-.35.95-.12.81-.12,1.31ZM59.51,265.2c0-.13,0-.26-.01-.4s-.02-.26-.03-.38l-3.24,2.41c.06.2.13.39.22.56s.2.32.33.44.27.22.43.29.35.1.55.1c.27,0,.51-.06.72-.19s.4-.32.55-.57.27-.57.35-.95.12-.81.12-1.31Z"/>
+    <path class="cls-5" d="M64.36,263.01c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,267.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="215.43" y1="280.34" x2="215.43" y2="315.35"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="215.74" y1="297.85" x2="449.31" y2="297.85"/>
+  <g>
+    <path class="cls-5" d="M34.23,287.52h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,281.97c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-5" d="M37.61,282.49h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,279.18c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,282.47c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,288.37c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,283.56c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,287.52h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,287.44c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M73.72,284.54c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,284.58c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M80.22,284.48c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,284.52c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M86.45,285.92c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M93.36,284.27c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM92.3,284.13c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M95.23,281.64h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M101.03,281.64h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M111.96,287.52l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,284.85h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M119.81,284.48c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM118.76,284.52c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M123.38,280.08h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M132.94,284.27c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,284.13c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M34.04,298.88c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,298.92c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M39.39,301.92l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,299.25h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M46.86,300.32c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M53.46,300.32c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M60.37,298.67c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,298.53c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M61.7,299.11c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,299.04c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M79.93,301.84c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.91,298.94c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM85.87,298.98c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,300.32c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.55,298.67c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM105.49,298.53c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M110.18,294.48h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M119.75,298.67c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,298.53c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M125.95,301.71c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M132.71,301.84c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M139.69,298.94c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM138.65,298.98c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M141.41,296.04h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M34.23,308.99c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M40.73,313.34c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,313.38c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M42.44,310.44h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M60.3,316.32h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M64.36,310.34c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,314.63c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="264.75" y1="329.32" x2="264.75" y2="364.33"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="265.06" y1="346.82" x2="449.31" y2="346.82"/>
+  <g>
+    <path class="cls-5" d="M34.23,336.5h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,330.95c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-5" d="M37.61,331.46h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,328.15c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,331.45c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,337.35c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,332.54c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,336.5h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,336.42c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M73.72,333.51c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,333.56c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M80.22,333.46c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,333.5c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M86.45,334.9c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M93.36,333.25c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM92.3,333.1c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M95.23,330.62h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M101.03,330.62h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M111.96,336.5l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,333.82h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M119.81,333.46c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM118.76,333.5c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M123.38,329.06h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M132.94,333.25c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,333.1c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M34.04,347.86c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,347.9c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M39.39,350.9l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,348.23h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M46.86,349.3c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M53.46,349.3c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M60.37,347.65c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,347.5c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M61.7,348.08c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,348.02c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M79.93,350.82c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.91,347.91c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM85.87,347.96c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,349.3c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.55,347.65c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM105.49,347.5c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M110.18,343.46h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M119.75,347.65c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,347.5c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M125.95,350.69c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M132.71,350.82c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M139.69,347.91c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM138.65,347.96c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M141.41,345.02h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M34.23,357.97c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M40.73,362.31c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,362.36c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M42.44,359.42h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M60.37,365.3h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-5" d="M64.36,359.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,363.61c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="314.68" y1="375.81" x2="314.68" y2="410.82"/>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="314.99" y1="393.32" x2="449.31" y2="393.32"/>
+  <g>
+    <path class="cls-5" d="M34.23,383h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,377.44c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-5" d="M37.61,377.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,374.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,377.94c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,383.85c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,379.03c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,383h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,382.91c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M73.72,380.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,380.05c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M80.22,379.95c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,380c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M86.45,381.39c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M93.36,379.74c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM92.3,379.6c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M95.23,377.11h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M101.03,377.11h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M111.96,383l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,380.32h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M119.81,379.95c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM118.76,380c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M123.38,375.55h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M132.94,379.74c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,379.6c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M34.04,394.35c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,394.39c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M39.39,397.39l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,394.72h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M46.86,395.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M53.46,395.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M60.37,394.14c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,394c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M61.7,394.58c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,394.51c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M79.93,397.31c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.91,394.41c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM85.87,394.45c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,395.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.55,394.14c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM105.49,394c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M110.18,389.95h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M119.75,394.14c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,394c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M125.95,397.18c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M132.71,397.31c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M139.69,394.41c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM138.65,394.45c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M141.41,391.51h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M34.23,404.47c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M40.73,408.81c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,408.85c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M42.44,405.91h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M60.22,409.47c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M64.36,405.81c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,410.1c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="360.27" y1="427.25" x2="360.27" y2="462.26"/>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="360.59" y1="444.75" x2="449.31" y2="444.75"/>
+  <g>
+    <path class="cls-5" d="M34.23,434.43h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,428.88c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-5" d="M37.61,429.39h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,426.08c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,429.38c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,435.28c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,430.47c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,434.43h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,434.35c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M73.72,431.44c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,431.49c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M80.22,431.38c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,431.43c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M86.45,432.83c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M93.36,431.18c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM92.3,431.03c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M95.23,428.55h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M101.03,428.55h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M111.96,434.43l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,431.75h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M119.81,431.38c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM118.76,431.43c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M123.38,426.99h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M132.94,431.18c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,431.03c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M34.04,445.78c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,445.83c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M39.39,448.83l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,446.15h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M46.86,447.23c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M53.46,447.23c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M60.37,445.58c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,445.43c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M61.7,446.01c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,445.95c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M79.93,448.75c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.91,445.84c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM85.87,445.89c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,447.23c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.55,445.58c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM105.49,445.43c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M110.18,441.39h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M119.75,445.58c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,445.43c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M125.95,448.61c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M132.71,448.75c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M139.69,445.84c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM138.65,445.89c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M141.41,442.95h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M34.23,455.9c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M40.73,460.24c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,460.29c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M42.44,457.35h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M60.75,461.54h-1.31v1.69h-1.04v-1.69h-3.69v-.9l3.26-5.07h1.46v5.07h1.31v.9ZM58.4,456.56l-2.67,4.08h2.67v-4.08Z"/>
+    <path class="cls-5" d="M64.36,457.24c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,461.54c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="407.83" y1="473.74" x2="407.83" y2="508.75"/>
+  <line id="source_line-7" data-name="source line" class="cls-2" x1="408.15" y1="491.24" x2="449.31" y2="491.24"/>
+  <g>
+    <path class="cls-5" d="M34.23,480.92h-1.18l-1.14-2.45c-.09-.19-.17-.34-.26-.47s-.19-.22-.29-.29-.22-.12-.34-.16-.26-.05-.41-.05h-.49v3.41h-1.04v-7.66h2.05c.45,0,.83.05,1.15.15s.58.23.79.41.36.39.45.64.14.52.14.82c0,.24-.04.46-.11.68s-.17.41-.31.58-.31.32-.52.45-.44.22-.71.28c.21.07.4.2.55.39s.3.43.46.74l1.21,2.52ZM32.56,475.37c0-.41-.13-.72-.38-.92s-.62-.3-1.08-.3h-.98v2.53h.84c.25,0,.47-.03.67-.08s.37-.14.5-.25.25-.25.32-.41.11-.35.11-.56Z"/>
+    <path class="cls-5" d="M37.61,475.89h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,472.57c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,475.87c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,481.77c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,476.96c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,480.92h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,480.84c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M73.72,477.94c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,477.98c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M80.22,477.88c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM79.18,477.92c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M86.45,479.32c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M93.36,477.67c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM92.3,477.53c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M95.23,475.04h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M101.03,475.04h1.16l1.44,3.89.31.95.32-.97,1.43-3.87h1.12l-2.31,5.88h-1.17l-2.3-5.88Z"/>
+    <path class="cls-5" d="M111.96,480.92l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM111.85,478.25h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M119.81,477.88c0,.49-.07.92-.2,1.31s-.33.71-.57.98-.55.47-.91.62-.76.21-1.2.21c-.35,0-.7-.03-1.07-.1s-.72-.17-1.08-.32v-7.93h1.02v2.28l-.05,1.09c.29-.39.61-.67.94-.83s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM118.76,477.92c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.2.08.4.14.61.18s.4.07.59.07c.23,0,.46-.04.67-.11s.4-.2.56-.37.29-.4.39-.69.14-.64.14-1.07Z"/>
+    <path class="cls-5" d="M123.38,473.48h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M132.94,477.67c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM131.88,477.53c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M34.04,492.28c0,.52-.07.98-.22,1.37s-.35.71-.61.97-.56.45-.91.58-.73.19-1.14.19c-.19,0-.37,0-.56-.03s-.37-.05-.57-.1v2.46h-1.02v-8.29h.91l.06.98c.29-.4.61-.68.94-.85s.69-.24,1.08-.24c.34,0,.63.07.88.21s.47.34.64.59.3.56.39.93.13.76.13,1.21ZM32.99,492.32c0-.31-.02-.59-.07-.85s-.12-.48-.21-.66-.22-.33-.38-.43-.33-.16-.54-.16c-.13,0-.26.02-.39.06s-.27.11-.41.21-.29.22-.45.38-.33.35-.51.59v2.85c.19.08.38.14.59.18s.41.07.61.07c.55,0,.98-.19,1.29-.56s.47-.93.47-1.68Z"/>
+    <path class="cls-5" d="M39.39,495.32l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM39.27,492.65h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M46.86,493.72c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M53.46,493.72c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M60.37,492.07c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,491.93c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M61.7,492.51c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,492.44c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M79.93,495.24c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M86.91,492.34c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM85.87,492.38c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M99.64,493.72c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M106.55,492.07c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM105.49,491.93c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M110.18,487.88h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M119.75,492.07c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM118.69,491.93c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M125.95,495.11c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-5" d="M132.71,495.24c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M139.69,492.34c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM138.65,492.38c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M141.41,489.44h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M34.23,502.39c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M40.73,506.74c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,506.78c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M42.44,503.84h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M60.17,507.27c0,.38-.08.72-.25,1.04s-.39.58-.68.81-.63.4-1.02.52-.81.19-1.27.19c-.11,0-.24,0-.37,0s-.26-.01-.39-.02-.25-.02-.38-.03-.23-.03-.33-.04v-.93c.21.05.45.09.72.11s.55.04.82.04c.31,0,.59-.04.84-.11s.46-.18.64-.32.31-.31.4-.5.14-.42.14-.67c0-.48-.17-.82-.51-1.04s-.83-.33-1.47-.33h-1.45v-3.91h4.12v.89h-3.16v2.15h.67c.37,0,.72.03,1.07.1s.66.18.93.35.49.39.66.67.25.63.25,1.05Z"/>
+    <path class="cls-5" d="M64.36,503.74c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,508.03c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="168.79" y1="8.33" x2="168.79" y2="43.34"/>
+  <g>
+    <circle class="cls-4" cx="217.17" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M219.47,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.09,1.32-.26s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="168.79" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M171.58,25.02c0,1.57-.23,2.71-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.46,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM170.08,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="267.43" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M270.17,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.76s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.36s.84-.17,1.23-.17c.81,0,1.45.21,1.91.65s.69,1.02.69,1.76c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="314.91" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M314.63,21.49c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.21.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.59.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.12s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="360.43" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M363.41,26.39h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM361.25,25.45v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="407.99" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M410.64,26.61c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.22s.35.16.56.24c.23.08.44.14.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.1-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <line id="source_line-8" data-name="source line" class="cls-2" x1="168.79" y1="52.72" x2="449.31" y2="52.72"/>
+  <g>
+    <path class="cls-5" d="M31.01,60.88h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M40.58,65.07c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.38s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.05.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.34-.89-.6-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.18s.29-.69.52-.97.51-.5.84-.66.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,64.92c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M47.42,60.99c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M53.54,68.24c-.23.06-.47.1-.71.12s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.02.62-.04s.46-.07.7-.14v.88Z"/>
+    <path class="cls-5" d="M28.71,79.9c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM29.75,79.84c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M40.33,82.72h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M42.44,76.84h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M52.58,82.72l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM52.47,80.04h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M60.14,82.64c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64,77.68h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,74.37c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.72,79.73c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,79.78c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M75.19,76.84h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M86.45,81.12c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M90.75,76.73c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM90.75,81.03c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="168.79" y1="48.54" x2="168.79" y2="58.11"/>
+  <line id="source_line-9" data-name="source line" class="cls-2" x1="215.58" y1="62.83" x2="449.31" y2="62.83"/>
+  <line class="cls-2" x1="215.58" y1="58.64" x2="215.58" y2="68.22"/>
+  <g>
+    <path class="cls-5" d="M29.25,174.72h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.61,175.56h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,172.25c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,175.55c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,181.45c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,176.64c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,180.6h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,180.52c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M28.71,192.18c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM29.75,192.12c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M40.33,195h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M42.44,189.12h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M52.58,195l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM52.47,192.32h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M60.14,194.92c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64,189.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,186.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.72,192.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,192.06c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M75.19,189.12h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M86.45,193.39c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M90.75,189.01c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM90.75,193.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="242.57" y1="160.82" x2="242.57" y2="170.39"/>
+  <line class="cls-2" x1="337.25" y1="170.92" x2="337.25" y2="180.49"/>
+  <line class="cls-2" x1="426.02" y1="181.08" x2="426.02" y2="190.65"/>
+  <line id="source_line-10" data-name="source line" class="cls-2" x1="264.9" y1="72.4" x2="449.31" y2="72.4"/>
+  <line class="cls-2" x1="264.9" y1="68.22" x2="264.9" y2="77.79"/>
+  <line id="source_line-11" data-name="source line" class="cls-2" x1="314.83" y1="82.12" x2="449.31" y2="82.12"/>
+  <line class="cls-2" x1="314.83" y1="77.94" x2="314.83" y2="87.51"/>
+  <line id="source_line-12" data-name="source line" class="cls-2" x1="360.43" y1="91.69" x2="449.31" y2="91.69"/>
+  <line class="cls-2" x1="360.43" y1="87.51" x2="360.43" y2="97.08"/>
+  <line id="source_line-13" data-name="source line" class="cls-2" x1="407.99" y1="101.26" x2="449.31" y2="101.26"/>
+  <line class="cls-2" x1="407.99" y1="97.08" x2="407.99" y2="106.65"/>
+  <g>
+    <circle class="cls-1" cx="242.57" cy="250.52" r="13.56"/>
+    <path class="cls-5" d="M238.91,254.06l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM243.89,250.64l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="242.57" cy="297.85" r="13.56"/>
+    <path class="cls-5" d="M238.91,301.39l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM243.89,297.96l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="336.25" cy="250.52" r="13.56"/>
+    <path class="cls-5" d="M339.52,251.39c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM337.9,247.47c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM338.31,251.43c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="336.25" cy="297.85" r="13.56"/>
+    <path class="cls-5" d="M339.52,298.72c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM337.9,294.8c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM338.31,298.76c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="336.25" cy="346.82" r="13.56"/>
+    <path class="cls-5" d="M339.52,347.69c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM337.9,343.78c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM338.31,347.74c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="335.14" cy="391.83" r="13.56"/>
+    <path class="cls-5" d="M338.41,392.7c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM336.79,388.78c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM337.21,392.74c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="426.02" cy="250.52" r="13.56"/>
+    <path class="cls-5" d="M426.71,254.22c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="426.02" cy="297.85" r="13.56"/>
+    <path class="cls-5" d="M426.71,301.55c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.19.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.23.37-.32h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="426.02" cy="347.71" r="13.56"/>
+    <path class="cls-5" d="M426.71,351.42c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="426.02" cy="393.32" r="13.56"/>
+    <path class="cls-5" d="M426.71,397.02c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.19.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.23.37-.32h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="426.02" cy="444.91" r="13.56"/>
+    <path class="cls-5" d="M426.71,448.61c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.79.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.24.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="426.02" cy="491.24" r="13.56"/>
+    <path class="cls-5" d="M426.71,494.95c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+  <line id="source_line-14" data-name="source line" class="cls-2" x1="168.79" y1="133.73" x2="449.31" y2="133.73"/>
+  <line class="cls-2" x1="168.79" y1="116.23" x2="168.79" y2="151.24"/>
+  <g>
+    <circle class="cls-3" cx="242.57" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M238.91,137.28l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM243.89,133.85l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="336.25" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M339.52,134.6c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM337.9,130.69c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM338.31,134.65c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="426.02" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M426.71,137.44c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+</svg>

+ 239 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Join-Marbles1.svg

@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 421.91 358.88">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-2" x1="131.49" y1="218.94" x2="131.49" y2="253.95"/>
+  <line id="source_line" data-name="source line" class="cls-2" x1="131.81" y1="25.84" x2="412.33" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="131.81" y1="236.44" x2="412.33" y2="236.44"/>
+  <g>
+    <path class="cls-5" d="M31.01,20.68h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M40.58,24.87c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,24.72c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M47.42,20.79c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M53.54,28.04c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M57.76,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M29.25,131.4h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.61,132.24h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,128.93c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,132.23c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,138.13c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,133.32c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,137.28h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,137.2c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64.36,131.29c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,135.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.21,232.54v5.32c0,.33-.05.64-.15.93s-.25.55-.45.77-.45.39-.75.52-.65.19-1.06.19c-.15,0-.31-.01-.47-.03s-.31-.05-.46-.09-.28-.08-.41-.13-.24-.11-.33-.17v-1.05c.24.18.51.31.81.42s.59.15.88.15c.43,0,.75-.13.98-.39s.35-.63.35-1.12v-4.42h-2.91v-.9h3.97Z"/>
+    <path class="cls-5" d="M40.73,237.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,237.25c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M44.21,235.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM44.57,231.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M48.8,234.31h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M57.76,234.21c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,238.5c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="131.81" y1="8.33" x2="131.81" y2="43.34"/>
+  <g>
+    <circle class="cls-4" cx="180.19" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M182.49,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="131.81" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M134.6,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM133.1,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="230.44" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M233.19,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="277.93" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M277.65,21.49c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="323.45" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M326.43,26.39h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM324.26,25.45v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="371.01" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M373.66,26.61c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="131.81" y1="52.72" x2="412.33" y2="52.72"/>
+  <g>
+    <path class="cls-5" d="M31.01,60.88h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M40.58,65.07c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,64.92c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M47.42,60.99c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M53.54,68.24c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M28.71,79.9c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM29.75,79.84c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M40.33,82.72h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M42.44,76.84h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M52.58,82.72l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM52.47,80.04h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M60.14,82.64c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64,77.68h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,74.37c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.72,79.73c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,79.78c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M75.19,76.84h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M86.45,81.12c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M90.75,76.73c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM90.75,81.03c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="131.81" y1="48.54" x2="131.81" y2="58.11"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="178.6" y1="62.83" x2="412.33" y2="62.83"/>
+  <line class="cls-2" x1="178.6" y1="58.64" x2="178.6" y2="68.22"/>
+  <g>
+    <path class="cls-5" d="M29.25,174.72h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.61,175.56h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,172.25c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,175.55c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,181.45c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,176.64c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,180.6h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,180.52c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M28.71,192.18c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM29.75,192.12c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M40.33,195h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M42.44,189.12h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M52.58,195l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM52.47,192.32h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M60.14,194.92c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64,189.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,186.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.72,192.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,192.06c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M75.19,189.12h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M86.45,193.39c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M90.75,189.01c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM90.75,193.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="205.59" y1="160.82" x2="205.59" y2="170.39"/>
+  <line class="cls-2" x1="300.27" y1="170.92" x2="300.27" y2="180.49"/>
+  <line class="cls-2" x1="389.04" y1="181.08" x2="389.04" y2="190.65"/>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="227.92" y1="72.4" x2="412.33" y2="72.4"/>
+  <line class="cls-2" x1="227.92" y1="68.22" x2="227.92" y2="77.79"/>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="277.85" y1="82.12" x2="412.33" y2="82.12"/>
+  <line class="cls-2" x1="277.85" y1="77.94" x2="277.85" y2="87.51"/>
+  <line id="source_line-7" data-name="source line" class="cls-2" x1="323.45" y1="91.69" x2="412.33" y2="91.69"/>
+  <line class="cls-2" x1="323.45" y1="87.51" x2="323.45" y2="97.08"/>
+  <line id="source_line-8" data-name="source line" class="cls-2" x1="371.01" y1="101.26" x2="412.33" y2="101.26"/>
+  <line class="cls-2" x1="371.01" y1="97.08" x2="371.01" y2="106.65"/>
+  <g>
+    <circle class="cls-1" cx="205.59" cy="236.44" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M202.96,235.63c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM201.46,238.29c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+      <path class="cls-5" d="M206.38,238.32l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M207.02,239.99l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM212,236.56l-1.35-4.11-1.34,4.11h2.69Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="206.59" cy="255.73" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M203.48,259.28h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.09,1.32-.26s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+      <path class="cls-5" d="M207.38,257.61l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M208.02,259.28l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM213,255.85l-1.35-4.11-1.34,4.11h2.69Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="299.27" cy="236.44" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M296.71,235.63c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM295.21,238.29c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+      <path class="cls-5" d="M300.12,238.32l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M307.63,237.31c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM306.01,233.4c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM306.42,237.36c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="300.27" cy="255.73" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M297.22,259.28h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.09,1.32-.26s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+      <path class="cls-5" d="M301.12,257.61l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M308.63,256.6c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM307.01,252.68c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM307.42,256.65c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="301.27" cy="275.01" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M298.67,278.56h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+      <path class="cls-5" d="M302.12,276.89l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M309.63,275.88c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM308.01,271.97c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM308.42,275.93c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="302.27" cy="294.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M296.64,289.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+      <path class="cls-5" d="M303.12,296.18l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M310.63,295.17c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM309.01,291.25c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM309.42,295.21c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="387.54" cy="236.44" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M384.91,235.63c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM383.41,238.29c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+      <path class="cls-5" d="M388.33,238.32l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M393.32,240.15c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="388.54" cy="255.73" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M385.42,259.28h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.09,1.32-.26s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+      <path class="cls-5" d="M389.33,257.61l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M394.32,259.43c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.19.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.23.37-.32h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="389.54" cy="275.01" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M386.87,278.56h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+      <path class="cls-5" d="M390.33,276.89l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M395.32,278.72c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="390.54" cy="294.3" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M384.84,289.95c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+      <path class="cls-5" d="M391.33,296.18l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M396.32,298c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="391.54" cy="313.58" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M389.16,314.13h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM386.99,313.19v-3.41l-2.94,3.41h2.94Z"/>
+      <path class="cls-5" d="M392.27,315.46l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M397.26,317.29c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="392.54" cy="332.87" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M389.77,333.64c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+      <path class="cls-5" d="M393.33,334.74l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M398.32,336.57c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <line id="source_line-9" data-name="source line" class="cls-2" x1="131.81" y1="133.73" x2="412.33" y2="133.73"/>
+  <line class="cls-2" x1="131.81" y1="116.23" x2="131.81" y2="151.24"/>
+  <g>
+    <circle class="cls-3" cx="205.59" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M201.93,137.28l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM206.91,133.85l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="299.27" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M302.54,134.6c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM300.92,130.69c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM301.33,134.65c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="389.04" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M389.73,137.44c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+</svg>

+ 172 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Join-Marbles2.svg

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 421.91 261.45">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-2" x1="131.49" y1="218.94" x2="131.49" y2="253.95"/>
+  <line id="source_line" data-name="source line" class="cls-2" x1="131.81" y1="25.84" x2="412.33" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="131.81" y1="236.44" x2="412.33" y2="236.44"/>
+  <g>
+    <path class="cls-5" d="M31.01,20.68h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M40.57,24.87c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,24.72c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M47.42,20.79c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M53.54,28.04c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M57.76,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M29.25,131.4h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.61,132.24h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,128.93c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,132.23c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,138.13c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,133.32c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,137.28h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,137.2c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64.36,131.29c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM64.36,135.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.21,232.54v5.32c0,.33-.05.64-.15.93s-.25.55-.45.77-.45.39-.75.52-.65.19-1.06.19c-.15,0-.31-.01-.47-.03s-.31-.05-.46-.09-.28-.08-.41-.13-.24-.11-.33-.17v-1.05c.24.18.51.31.81.42s.59.15.88.15c.43,0,.75-.13.98-.39s.35-.63.35-1.12v-4.42h-2.91v-.9h3.97Z"/>
+    <path class="cls-5" d="M40.73,237.21c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM39.68,237.26c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M44.21,235.16h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM44.57,231.85c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M48.8,234.31h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M57.76,234.21c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM57.76,238.5c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="131.81" y1="8.33" x2="131.81" y2="43.34"/>
+  <g>
+    <circle class="cls-4" cx="180.19" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M182.49,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="131.81" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M134.6,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM133.1,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="230.44" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M233.19,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="277.93" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M277.65,21.49c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="323.45" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M326.43,26.39h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM324.26,25.45v-3.41l-2.94,3.41h2.94Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="371.01" cy="25.84" r="13.56"/>
+    <path class="cls-5" d="M373.66,26.61c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="131.81" y1="52.72" x2="178.23" y2="52.72"/>
+  <g>
+    <path class="cls-5" d="M31.01,60.88h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-5" d="M40.57,65.07c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,64.92c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-5" d="M47.42,60.99c-.54-.11-1-.17-1.38-.17-.92,0-1.38.48-1.38,1.44v1.03h2.58v.85h-2.58v4.18h-1.04v-4.18h-1.89v-.85h1.89v-.97c0-1.57.82-2.35,2.45-2.35.41,0,.86.05,1.35.14v.88Z"/>
+    <path class="cls-5" d="M53.54,68.24c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M28.71,79.9c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM29.75,79.84c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M40.33,82.72h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M42.44,76.84h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M52.58,82.72l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM52.47,80.05h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M60.14,82.64c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64,77.68h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,74.37c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.72,79.73c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.23-1.18.23-.8-.07-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.57.53.94.18.8.18,1.29ZM72.67,79.78c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.69-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.83Z"/>
+    <path class="cls-5" d="M75.19,76.84h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M86.45,81.12c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M90.75,76.73c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM90.75,81.03c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="131.81" y1="48.54" x2="131.81" y2="58.11"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="178.6" y1="62.83" x2="227.92" y2="62.83"/>
+  <line class="cls-2" x1="178.6" y1="58.64" x2="178.6" y2="68.22"/>
+  <line class="cls-2" x1="178.23" y1="48.54" x2="178.23" y2="58.11"/>
+  <g>
+    <path class="cls-5" d="M29.25,174.72h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.61,175.56h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM37.97,172.25c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M46.44,175.55c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM42.9,181.45c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM43.21,176.64c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-5" d="M53.53,180.6h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-5" d="M60.14,180.52c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M28.71,192.18c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM29.75,192.12c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-5" d="M40.33,195h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.32-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.05s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-5" d="M42.44,189.12h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.03-.41.07s-.28.13-.43.23-.3.24-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M52.58,195l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.38s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.62-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.09.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM52.47,192.32h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-5" d="M60.14,194.92c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-5" d="M64,189.96h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM64.36,186.65c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.26.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.26.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-5" d="M73.72,192.01c0,.46-.06.88-.19,1.26s-.31.71-.56.98-.54.48-.88.63-.74.22-1.18.22-.8-.06-1.13-.2-.62-.32-.85-.58-.41-.57-.53-.94-.18-.81-.18-1.29c0-.46.06-.87.19-1.25s.31-.7.56-.97.54-.48.88-.63.74-.23,1.18-.23.8.07,1.13.2.62.32.85.57.41.56.53.94.18.8.18,1.29ZM72.67,192.06c0-.36-.04-.68-.12-.95s-.19-.5-.34-.68-.33-.32-.54-.41-.45-.14-.71-.14c-.3,0-.57.06-.78.18s-.39.28-.53.48-.24.43-.3.7-.1.54-.1.83c0,.36.04.68.12.96s.19.5.34.68.33.32.54.41.45.14.71.14c.3,0,.57-.06.78-.18s.39-.28.53-.48.24-.43.3-.69.1-.54.1-.84Z"/>
+    <path class="cls-5" d="M75.19,189.12h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.89.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.21-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-5" d="M86.45,193.39c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.23-.42.32-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.36-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.13-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.29.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.23.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M90.75,189.01c.12,0,.24.03.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM90.75,193.31c.12,0,.24.03.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-2" x1="205.59" y1="160.82" x2="205.59" y2="170.39"/>
+  <line class="cls-2" x1="300.27" y1="170.92" x2="300.27" y2="180.49"/>
+  <line class="cls-2" x1="389.04" y1="181.08" x2="389.04" y2="190.65"/>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="227.92" y1="72.4" x2="277.85" y2="72.4"/>
+  <line class="cls-2" x1="227.92" y1="68.22" x2="227.92" y2="77.79"/>
+  <line class="cls-2" x1="227.92" y1="58.04" x2="227.92" y2="67.61"/>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="277.85" y1="82.12" x2="323.45" y2="82.12"/>
+  <line class="cls-2" x1="277.85" y1="77.94" x2="277.85" y2="87.51"/>
+  <line class="cls-2" x1="277.85" y1="67.62" x2="277.85" y2="77.19"/>
+  <line id="source_line-7" data-name="source line" class="cls-2" x1="323.45" y1="91.69" x2="371.01" y2="91.69"/>
+  <line class="cls-2" x1="323.45" y1="87.51" x2="323.45" y2="97.08"/>
+  <line class="cls-2" x1="323.45" y1="77.34" x2="323.45" y2="86.91"/>
+  <line id="source_line-8" data-name="source line" class="cls-2" x1="371.01" y1="101.26" x2="412.33" y2="101.26"/>
+  <line class="cls-2" x1="371.01" y1="97.08" x2="371.01" y2="106.65"/>
+  <line class="cls-2" x1="371.01" y1="86.91" x2="371.01" y2="96.48"/>
+  <g>
+    <circle class="cls-1" cx="205.59" cy="236.44" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M202.48,239.99h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+      <path class="cls-5" d="M206.38,238.32l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M207.02,239.99l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM212,236.56l-1.35-4.11-1.34,4.11h2.69Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="299.27" cy="236.44" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M293.64,232.1c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+      <path class="cls-5" d="M300.12,238.32l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M307.63,237.31c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM306.01,233.4c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM306.42,237.36c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="387.54" cy="236.44" r="13.56"/>
+    <g>
+      <path class="cls-5" d="M384.77,237.22c0,.42-.07.81-.2,1.17s-.32.67-.57.93c-.25.27-.55.47-.92.63s-.77.23-1.23.23c-.42,0-.83-.05-1.23-.14s-.75-.21-1.05-.36v-1.24h.08c.09.07.22.14.39.23s.35.16.56.24c.23.08.44.15.63.19s.41.07.64.07.46-.04.69-.13.41-.22.57-.41c.14-.17.25-.37.33-.6s.11-.5.11-.81-.04-.56-.13-.76-.21-.36-.37-.49c-.17-.15-.37-.25-.62-.31s-.52-.09-.82-.09c-.32,0-.63.02-.96.07s-.58.09-.77.14v-4.49h4.79v1.03h-3.66v2.32c.14-.02.28-.03.42-.04s.26-.01.38-.01c.45,0,.82.04,1.13.11s.61.22.89.43c.29.22.51.49.67.82s.23.76.23,1.28Z"/>
+      <path class="cls-5" d="M388.32,238.32l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-5" d="M393.32,240.15c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+    </g>
+  </g>
+  <line id="source_line-9" data-name="source line" class="cls-2" x1="131.81" y1="133.73" x2="412.33" y2="133.73"/>
+  <line class="cls-2" x1="131.81" y1="116.23" x2="131.81" y2="151.24"/>
+  <g>
+    <circle class="cls-3" cx="205.59" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M201.93,137.28l2.94-8.72h1.43l2.94,8.72h-1.22l-.79-2.44h-3.33l-.79,2.44h-1.17ZM206.91,133.85l-1.35-4.11-1.34,4.11h2.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="299.27" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M302.54,134.6c0,.43-.08.82-.25,1.15s-.38.61-.66.82c-.33.26-.68.44-1.05.55s-.86.16-1.45.16h-2.5v-8.72h2.31c.62,0,1.09.02,1.4.06s.61.14.89.29c.31.17.54.39.69.66s.22.59.22.96c0,.41-.11.78-.33,1.1s-.52.58-.9.76v.05c.52.14.92.4,1.21.77s.43.84.43,1.4ZM300.92,130.69c0-.21-.04-.39-.11-.55s-.18-.28-.34-.37c-.19-.11-.4-.17-.63-.19s-.55-.04-.96-.04h-1.11v2.55h1.32c.36,0,.63-.02.8-.06s.35-.11.53-.23c.18-.11.3-.26.38-.45s.11-.41.11-.68ZM301.33,134.65c0-.33-.05-.6-.14-.81s-.28-.39-.57-.54c-.18-.1-.38-.16-.6-.19s-.52-.04-.92-.04h-1.32v3.22h.94c.51,0,.91-.02,1.2-.07s.55-.15.77-.3c.22-.15.38-.33.48-.52s.15-.44.15-.75Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="389.04" cy="133.73" r="13.56"/>
+    <path class="cls-5" d="M389.73,137.44c-.57,0-1.09-.1-1.57-.29s-.89-.48-1.24-.86-.62-.85-.81-1.42-.29-1.22-.29-1.95.09-1.37.28-1.91.46-1.02.81-1.42c.35-.39.76-.69,1.24-.89s1.01-.31,1.6-.31c.29,0,.57.02.82.06s.49.1.71.16c.19.06.38.13.58.22s.39.18.58.29v1.4h-.09c-.1-.09-.23-.21-.39-.34s-.36-.26-.59-.39c-.22-.12-.46-.22-.73-.3s-.56-.12-.91-.12c-.37,0-.72.08-1.05.23s-.62.38-.87.67c-.25.3-.44.67-.57,1.12s-.21.96-.21,1.52c0,.6.07,1.11.22,1.54s.34.8.59,1.09c.24.29.53.51.86.65s.68.22,1.04.22c.34,0,.65-.04.93-.12s.54-.19.76-.31c.21-.12.4-.25.56-.37s.28-.24.37-.33h.09v1.38c-.19.09-.37.18-.54.26s-.38.16-.62.24c-.25.08-.49.14-.71.19s-.5.06-.85.06Z"/>
+  </g>
+</svg>

+ 86 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Merge-Marbles-Multi.svg

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 433.8 177.91">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-5 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <g>
+    <path class="cls-5" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.51,26.29h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-5" d="M44.57,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.57,68.07h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-5" d="M44.57,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,66.37c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M33.67,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-5" d="M40.43,106.46c0,.34-.07.65-.21.95s-.34.55-.62.77-.62.39-1.03.52-.9.19-1.45.19c-.3,0-.58,0-.82-.03s-.47-.04-.68-.08v-.91c.24.04.5.08.77.1s.54.04.83.04c.38,0,.71-.03.98-.1s.49-.17.67-.3.3-.29.38-.47.12-.39.12-.62c0-.21-.05-.39-.14-.55s-.23-.29-.4-.39-.37-.18-.61-.24-.5-.08-.78-.08h-.87v-.84h.88c.23,0,.44-.03.63-.09s.35-.15.49-.26.24-.25.31-.42.11-.35.11-.57c0-.41-.12-.71-.38-.9s-.62-.28-1.1-.28c-.26,0-.52.03-.8.08s-.57.13-.88.23v-.89c.13-.05.27-.09.42-.13s.3-.07.45-.09.3-.04.45-.06.29-.02.43-.02c.41,0,.76.04,1.07.13s.57.21.77.38.36.36.47.6.16.5.16.79c0,.44-.11.8-.34,1.1s-.53.53-.92.71c.2.03.4.09.59.19s.37.21.52.36.28.32.38.52.14.42.14.66Z"/>
+    <path class="cls-5" d="M44.57,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-5" d="M29.25,143.42h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-5" d="M37.97,143.31c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,147.61c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line id="source_line" data-name="source line" class="cls-2" x1="64.71" y1="150.27" x2="214.46" y2="150.27"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="65.03" y1="24.79" x2="133.48" y2="24.79"/>
+  <line class="cls-2" x1="202.19" y1="88.31" x2="202.19" y2="123.32"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="202.51" y1="105.82" x2="215.38" y2="105.82"/>
+  <line class="cls-2" x1="65.03" y1="7.28" x2="65.03" y2="42.29"/>
+  <line class="cls-2" x1="133.48" y1="7.28" x2="133.48" y2="42.29"/>
+  <g>
+    <circle class="cls-4" cx="133.48" cy="24.79" r="13.56"/>
+    <path class="cls-5" d="M135.78,28.34h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-4" cx="133.48" cy="150.27" r="13.56"/>
+    <path class="cls-5" d="M135.78,153.82h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line class="cls-2" x1="64.71" y1="132.77" x2="64.71" y2="167.78"/>
+  <line class="cls-2" x1="214.89" y1="132.77" x2="214.89" y2="167.78"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="64.71" y1="65.3" x2="91.09" y2="65.3"/>
+  <line class="cls-2" x1="91.09" y1="47.8" x2="91.09" y2="82.81"/>
+  <line class="cls-2" x1="64.71" y1="47.8" x2="64.71" y2="82.81"/>
+  <g>
+    <circle class="cls-3" cx="91.09" cy="65.3" r="13.56"/>
+    <path class="cls-5" d="M93.84,68.85h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="91.09" cy="150.27" r="13.56"/>
+    <path class="cls-5" d="M93.84,153.82h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <line class="cls-2" x1="215.38" y1="88.31" x2="215.38" y2="123.32"/>
+  <g>
+    <circle class="cls-1" cx="215.38" cy="105.82" r="13.56"/>
+    <path class="cls-5" d="M215.1,101.47c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+  <g>
+    <circle class="cls-1" cx="214.89" cy="150.27" r="13.56"/>
+    <path class="cls-5" d="M214.61,145.93c-.21,0-.42.03-.63.08s-.42.12-.62.2c-.19.08-.35.16-.49.25s-.26.17-.37.24h-.07v-1.24c.25-.14.6-.26,1.03-.37s.85-.17,1.25-.17.74.04,1.03.12.56.2.8.37c.26.19.45.41.58.68s.2.58.2.93c0,.48-.16.9-.47,1.27s-.7.59-1.14.69v.08c.18.04.38.1.59.18s.4.21.58.38.33.38.44.65.17.58.17.96-.07.76-.2,1.09-.33.62-.57.88c-.25.27-.56.47-.92.6s-.77.21-1.22.21-.87-.05-1.3-.16-.79-.23-1.08-.38v-1.24h.08c.25.18.58.35.99.52s.83.25,1.24.25c.24,0,.48-.04.72-.11s.44-.2.6-.37c.16-.17.28-.36.36-.57s.12-.47.12-.79-.05-.58-.14-.78-.22-.36-.38-.48-.36-.2-.58-.24-.47-.07-.73-.07h-.5v-.97h.39c.53,0,.96-.12,1.29-.38s.5-.61.5-1.09c0-.22-.04-.41-.13-.57s-.2-.28-.33-.38c-.15-.1-.31-.17-.49-.21s-.37-.06-.57-.06Z"/>
+  </g>
+</svg>

+ 98 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Merge-Marbles.svg

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 281.21 136.45">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="70.94" y1="89.36" x2="70.94" y2="124.37"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="71.26" y1="25.84" x2="233.03" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="71.26" y1="106.87" x2="266.88" y2="106.87"/>
+  <g>
+    <path class="cls-4" d="M33.67,26.51c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.51,28.12h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-4" d="M44.57,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.67,68.3c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.58,69.9h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.5-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-4" d="M44.57,63.91c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,68.21c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,110.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M37.97,104.63c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,108.93c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="71.26" y1="8.33" x2="71.26" y2="43.34"/>
+  <line class="cls-1" x1="233.03" y1="8.33" x2="233.03" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="88.75" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M91.06,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="151.21" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M153.52,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="214.69" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M216.99,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="88.75" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M91.06,110.42h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="151.21" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M153.52,110.42h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="214.69" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M216.99,110.42h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="71.26" y1="66.35" x2="266.88" y2="66.35"/>
+  <line class="cls-1" x1="266.88" y1="48.85" x2="266.88" y2="83.86"/>
+  <line class="cls-1" x1="71.26" y1="48.85" x2="71.26" y2="83.86"/>
+  <g>
+    <circle class="cls-2" cx="122.69" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M125.44,69.9h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="182.61" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M185.35,69.9h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="243.39" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M246.14,69.9h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="122.69" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M125.44,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="182.61" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M185.35,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="243.39" cy="106.87" r="13.56"/>
+    <path class="cls-4" d="M246.14,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <line class="cls-1" x1="266.88" y1="89.36" x2="266.88" y2="124.37"/>
+</svg>

+ 238 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Switch-Marbles-Bad-Merge.svg

@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 380.07 256.33">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-6 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8be2ff;
+      }
+
+      .cls-5 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <g>
+    <path class="cls-6" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M40.57,23.03c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,22.89c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M45.98,26.29l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM45.87,23.61h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-6" d="M49.04,20.4h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M59.97,26.07c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-6" d="M66.73,26.29h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-6" d="M74.23,18.63l-2.6,7.66h-1.41l-2.54-7.66h1.18l1.65,5.16.47,1.51.48-1.51,1.66-5.16h1.11Z"/>
+    <path class="cls-6" d="M78.97,26.29l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM78.86,23.61h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-6" d="M83.79,18.85h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M93.12,26.29h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M99.95,23.03c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM98.89,22.89c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M106.24,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M110.54,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM110.54,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,62.19h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,64.82c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,64.67c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,68.07h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,60.63h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,67.99c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,70.53c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,61.29h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M96.19,59.34c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M103.94,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM103.94,66.38c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,102.9h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,105.53c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,105.39c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,108.79h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,101.35h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,108.7c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,111.25c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,102.01h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M94.98,102.9h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-6" d="M102.78,100.06c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M110.54,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM110.54,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,136.99h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,139.62c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,139.47c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,141.26c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,142.87h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,135.43h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,142.79c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,141.26c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,145.33c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,136.09h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M94.98,136.99h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-6" d="M106.32,142.79c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M109.38,134.14c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M117.14,136.88c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM117.14,141.18c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,178.51h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,181.14c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,180.99c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,182.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,184.39h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,176.95h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,184.31c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,182.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,186.85c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,177.61h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M94.98,178.51h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-6" d="M106.32,184.31c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M108.42,178.51h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M115.98,175.67c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M123.74,178.4c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM123.74,182.7c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M34.38,226.99h-1.02l-.15-4.78-.06-1.83-.36,1.07-1.13,3.05h-.72l-1.08-2.93-.36-1.18-.02,1.92-.13,4.69h-.98l.38-7.66h1.24l1.03,2.88.33.97.32-.97,1.08-2.88h1.27l.37,7.66Z"/>
+    <path class="cls-6" d="M40.57,223.73c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,223.59c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M42.44,221.1h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M53.04,221.94c.11.14.19.3.25.48s.09.38.09.59c0,.3-.06.58-.17.83s-.27.47-.47.65-.45.32-.73.42-.59.15-.93.15c-.25,0-.48-.03-.69-.08s-.38-.12-.51-.2c-.07.11-.14.21-.19.31s-.08.21-.08.33c0,.15.07.27.21.37s.33.15.57.16l1.55.06c.29,0,.56.04.81.11s.46.16.64.29.32.28.42.46.15.4.15.64c0,.26-.06.51-.17.74s-.29.44-.52.62-.54.32-.9.42-.79.16-1.29.16-.88-.04-1.22-.11-.61-.18-.82-.32-.37-.29-.47-.48-.15-.39-.15-.61c0-.29.07-.54.2-.75s.34-.42.62-.62c-.1-.05-.19-.11-.26-.18s-.13-.15-.18-.23-.08-.17-.11-.27-.04-.19-.04-.28c0-.25.06-.49.18-.7s.26-.41.42-.6c-.07-.09-.14-.18-.2-.26s-.11-.18-.15-.28-.07-.21-.09-.32-.03-.25-.03-.4c0-.3.06-.58.17-.83s.27-.47.47-.65.44-.32.73-.42.6-.15.94-.15c.14,0,.28,0,.42.03s.25.04.35.08h2.13v.83h-.94ZM49.5,227.84c0,.28.14.48.43.61s.69.19,1.21.19c.32,0,.6-.03.82-.09s.4-.14.53-.23.23-.21.29-.33.09-.25.09-.38c0-.24-.1-.41-.29-.53s-.49-.18-.9-.2l-1.54-.05c-.13.09-.24.17-.32.25s-.15.17-.2.25-.08.17-.1.25-.03.17-.03.25ZM49.81,223.02c0,.19.03.36.09.52s.15.29.26.4.25.19.4.25.33.09.51.09c.2,0,.38-.03.54-.1s.29-.16.4-.28.19-.25.25-.4.08-.31.08-.47c0-.19-.03-.36-.09-.52s-.15-.29-.26-.4-.25-.19-.4-.25-.33-.09-.51-.09c-.2,0-.38.04-.54.11s-.29.16-.4.28-.19.25-.25.4-.08.31-.08.47Z"/>
+    <path class="cls-6" d="M60.37,223.73c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM59.31,223.59c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M61.7,224.17c0-.5.07-.94.21-1.33s.33-.72.58-.98.55-.47.91-.61.75-.21,1.18-.21c.19,0,.37.01.55.04s.36.06.54.11v-2.47h1.03v8.28h-.91l-.04-1.11c-.29.41-.59.72-.93.92s-.69.3-1.08.3c-.34,0-.63-.07-.89-.21s-.47-.34-.64-.59-.3-.56-.38-.92-.13-.76-.13-1.2ZM62.74,224.1c0,.71.1,1.24.31,1.59s.5.52.89.52c.26,0,.53-.12.82-.35s.59-.57.91-1.03v-2.73c-.17-.08-.35-.14-.56-.18s-.4-.06-.6-.06c-.55,0-.99.18-1.3.54s-.47.92-.47,1.69Z"/>
+    <path class="cls-6" d="M75.43,221.1h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M86.76,223.73c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM85.7,223.59c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M93.05,225.38c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M99.71,226.99h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M103.59,219.54h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M112.92,226.9c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M119.44,225.38c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M123.74,221c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM123.74,225.29c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line id="source_line" data-name="source line" class="cls-2" x1="149.26" y1="227.96" x2="363.34" y2="227.96"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="149.58" y1="24.79" x2="363.34" y2="24.79"/>
+  <line class="cls-2" x1="237.42" y1="126.37" x2="237.42" y2="161.38"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="237.74" y1="143.88" x2="322" y2="143.88"/>
+  <line class="cls-2" x1="149.58" y1="7.28" x2="149.58" y2="42.29"/>
+  <g>
+    <circle class="cls-3" cx="218.02" cy="24.79" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M216.4,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M222.83,28.34h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="250.61" cy="24.79" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M246.98,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M253.41,28.34h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M256.94,28.47c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="287.06" cy="24.79" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M281.26,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M287.69,28.34h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M291.22,28.47c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M296.72,22.98h-.06c-.08-.02-.17-.04-.26-.04s-.2,0-.33,0c-.3,0-.59.06-.88.19s-.57.32-.83.57v4.65h-1.1v-6.54h1.1v.97c.4-.36.75-.61,1.05-.75s.59-.22.87-.22c.11,0,.2,0,.25,0s.12.01.19.03v1.15Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-5" cx="177.02" cy="24.79" r="13.56"/>
+    <path class="cls-6" d="M178.71,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+  </g>
+  <line class="cls-2" x1="149.26" y1="210.45" x2="149.26" y2="245.46"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="175.64" y1="65.3" x2="228.25" y2="65.3"/>
+  <line class="cls-2" x1="228.25" y1="47.8" x2="228.25" y2="82.81"/>
+  <line class="cls-2" x1="175.64" y1="47.8" x2="175.64" y2="82.81"/>
+  <g>
+    <circle class="cls-5" cx="228.25" cy="65.3" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M221.77,69.01c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M228.8,69c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM230.09,64.85c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+      <path class="cls-6" d="M233.4,68.85h-1.1v-9.12h1.1v9.12Z"/>
+      <path class="cls-6" d="M238.47,60.79h-.06c-.1-.04-.24-.07-.42-.1s-.35-.05-.49-.05c-.46,0-.8.1-.99.31s-.3.59-.3,1.13v.22h1.82v.91h-1.79v5.63h-1.1v-5.63h-.74v-.91h.74v-.22c0-.79.19-1.39.57-1.8s.92-.62,1.63-.62c.2,0,.4.01.6.03s.37.05.53.07v1.01Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-5" cx="228.25" cy="227.96" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M221.77,231.66c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M228.8,231.66c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM230.09,227.5c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+      <path class="cls-6" d="M233.4,231.5h-1.1v-9.12h1.1v9.12Z"/>
+      <path class="cls-6" d="M238.47,223.44h-.06c-.1-.04-.24-.07-.42-.1s-.35-.05-.49-.05c-.46,0-.8.1-.99.31s-.3.59-.3,1.13v.22h1.82v.91h-1.79v5.63h-1.1v-5.63h-.74v-.91h.74v-.22c0-.79.19-1.39.57-1.8s.92-.62,1.63-.62c.2,0,.4.01.6.03s.37.05.53.07v1.01Z"/>
+    </g>
+  </g>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="282.05" y1="184.39" x2="308.43" y2="184.39"/>
+  <line class="cls-2" x1="308.43" y1="166.89" x2="308.43" y2="201.9"/>
+  <line class="cls-2" x1="282.05" y1="166.89" x2="282.05" y2="201.9"/>
+  <g>
+    <circle class="cls-4" cx="308.43" cy="184.39" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M299.08,188.1c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M305.23,188.07c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M310.92,187.24c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM310.92,186.33v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+      <path class="cls-6" d="M317.03,182.58h-.06c-.08-.02-.17-.04-.26-.04s-.2,0-.33,0c-.3,0-.59.06-.88.19s-.57.32-.83.57v4.65h-1.1v-6.54h1.1v.97c.4-.36.75-.61,1.05-.75s.59-.22.87-.22c.11,0,.2,0,.25,0s.12.01.19.03v1.15Z"/>
+      <path class="cls-6" d="M319.86,188.07c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="308.43" cy="226.99" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M299.08,230.69c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M305.23,230.66c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M310.92,229.84c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM310.92,228.92v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+      <path class="cls-6" d="M317.03,225.17h-.06c-.08-.02-.17-.04-.26-.04s-.2,0-.33,0c-.3,0-.59.06-.88.19s-.57.32-.83.57v4.65h-1.1v-6.54h1.1v.97c.4-.36.75-.61,1.05-.75s.59-.22.87-.22c.11,0,.2,0,.25,0s.12.01.19.03v1.15Z"/>
+      <path class="cls-6" d="M319.86,230.66c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    </g>
+  </g>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="218.02" y1="105.82" x2="263.72" y2="105.82"/>
+  <line class="cls-2" x1="264.18" y1="88.31" x2="264.18" y2="123.32"/>
+  <line class="cls-2" x1="218.02" y1="88.31" x2="218.02" y2="123.32"/>
+  <g>
+    <circle class="cls-3" cx="264.18" cy="105.82" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M257.29,109.36h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M263.72,109.36h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M267.24,109.49c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M274.66,106.1c0,1.1-.27,1.95-.8,2.55s-1.24.9-2.12.9-1.63-.31-2.15-.93-.78-1.46-.78-2.52.27-1.94.81-2.55,1.25-.91,2.12-.91,1.59.3,2.12.91.8,1.45.8,2.55ZM273.52,106.1c0-.85-.15-1.48-.46-1.89s-.75-.62-1.32-.62-1.02.21-1.33.62-.47,1.04-.47,1.89.16,1.44.47,1.87.75.64,1.33.64,1-.21,1.32-.62.47-1.04.47-1.88Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="264.18" cy="226.99" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M257.29,230.53h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M263.72,230.53h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M267.24,230.66c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M274.66,227.26c0,1.1-.27,1.95-.8,2.55s-1.24.9-2.12.9-1.63-.31-2.15-.93-.78-1.46-.78-2.52.27-1.94.81-2.55,1.25-.91,2.12-.91,1.59.3,2.12.91.8,1.45.8,2.55ZM273.52,227.26c0-.85-.15-1.48-.46-1.89s-.75-.62-1.32-.62-1.02.21-1.33.62-.47,1.04-.47,1.89.16,1.44.47,1.87.75.64,1.33.64,1-.21,1.32-.62.47-1.04.47-1.88Z"/>
+    </g>
+  </g>
+  <line class="cls-2" x1="322" y1="126.37" x2="322" y2="161.38"/>
+  <g>
+    <circle class="cls-1" cx="322" cy="143.88" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M321.7,144.43h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM319.53,143.49v-3.41l-2.94,3.41h2.94Z"/>
+      <path class="cls-6" d="M328.02,147.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="322" cy="226.99" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M321.7,227.53h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM319.53,226.6v-3.41l-2.94,3.41h2.94Z"/>
+      <path class="cls-6" d="M328.02,230.53h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+    </g>
+  </g>
+</svg>

+ 213 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Switch-Marbles.svg

@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 380.07 256.33">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #f0ff8b;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4, .cls-5 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: none;
+      }
+
+      .cls-3 {
+        fill: #ff8b8b;
+      }
+
+      .cls-6 {
+        stroke-width: 0px;
+      }
+
+      .cls-4 {
+        fill: #8be2ff;
+      }
+
+      .cls-5 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <g>
+    <path class="cls-6" d="M33.67,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M40.57,23.03c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,22.89c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M45.98,26.29l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM45.87,23.61h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-6" d="M49.04,20.4h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M59.97,26.07c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-6" d="M66.73,26.29h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-6" d="M74.23,18.63l-2.6,7.66h-1.41l-2.54-7.66h1.18l1.65,5.16.47,1.51.48-1.51,1.66-5.16h1.11Z"/>
+    <path class="cls-6" d="M78.97,26.29l-.02-.79c-.32.32-.65.54-.98.69s-.68.21-1.04.21c-.34,0-.62-.04-.86-.13s-.43-.2-.59-.35-.27-.33-.34-.53-.11-.42-.11-.66c0-.59.22-1.05.66-1.39s1.09-.5,1.95-.5h1.22v-.52c0-.35-.11-.63-.33-.83s-.56-.31-1.02-.31c-.33,0-.66.04-.98.11s-.66.18-1,.32v-.92c.13-.05.27-.09.43-.14s.33-.08.5-.12.36-.06.55-.08.38-.03.58-.03c.36,0,.68.04.96.12s.53.2.72.36.35.36.45.6.16.53.16.86v4.05h-.91ZM78.86,23.61h-1.29c-.25,0-.47.03-.66.08s-.33.12-.45.22-.2.21-.26.34-.08.28-.08.44c0,.11.02.22.05.33s.09.2.17.28.18.14.3.19.28.07.46.07c.23,0,.5-.07.81-.21s.62-.37.96-.68v-1.04Z"/>
+    <path class="cls-6" d="M83.79,18.85h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M93.12,26.29h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M99.95,23.03c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM98.89,22.89c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M106.24,24.68c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M110.54,20.3c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM110.54,24.59c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,62.19h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,64.82c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,64.67c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,68.07h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,60.63h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,67.99c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,66.46c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,70.53c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,61.29h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M96.19,59.34c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M103.94,62.08c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM103.94,66.38c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,102.9h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,105.53c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,105.39c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,108.79h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,101.35h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,108.7c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,107.18c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,111.25c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,102.01h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M94.99,102.9h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-6" d="M102.78,100.06c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M110.54,102.8c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM110.54,107.09c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,136.99h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,139.62c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,139.47c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,141.26c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,142.87h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,135.43h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,142.79c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,141.26c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,145.33c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,136.09h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M94.99,136.99h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-6" d="M106.32,142.79c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M109.38,134.14c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M117.14,136.88c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM117.14,141.18c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M29.25,178.51h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M40.57,181.14c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM39.51,180.99c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M46.86,182.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M53.53,184.39h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M57.4,176.95h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M66.74,184.31c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M73.25,182.79c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M85.31,186.85c-1.8-1.67-2.7-3.51-2.7-5.53,0-.47.05-.94.14-1.42s.25-.94.46-1.42.49-.95.84-1.42.77-.94,1.27-1.41l.59.6c-1.52,1.5-2.27,3.15-2.27,4.97,0,.91.19,1.78.57,2.61s.95,1.62,1.7,2.37l-.62.63Z"/>
+    <path class="cls-6" d="M90.22,177.61h-1.76v-.88h4.58v.88h-1.76v5.89h1.76v.89h-4.58v-.89h1.76v-5.89Z"/>
+    <path class="cls-6" d="M94.99,178.51h.91l.04.95c.17-.2.34-.37.5-.51s.32-.24.47-.33.31-.14.47-.17.33-.05.5-.05c.61,0,1.06.18,1.37.54s.47.9.47,1.61v3.84h-1.02v-3.76c0-.46-.09-.8-.26-1.02s-.43-.33-.77-.33c-.12,0-.25.02-.37.06s-.24.1-.37.19-.27.22-.42.37-.32.35-.51.59v3.9h-1.02v-5.88Z"/>
+    <path class="cls-6" d="M106.32,184.31c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M108.42,178.51h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M115.98,175.67c1.8,1.67,2.7,3.52,2.7,5.57,0,.42-.04.86-.13,1.31s-.23.92-.44,1.39-.49.96-.83,1.44-.79.98-1.32,1.47l-.59-.6c.76-.75,1.33-1.54,1.71-2.36s.56-1.68.56-2.58c0-1.86-.76-3.53-2.27-5.02l.62-.63Z"/>
+    <path class="cls-6" d="M123.74,178.4c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM123.74,182.7c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-6" d="M33.91,224.91c0,.36-.07.68-.22.96s-.36.5-.62.68-.58.32-.96.41-.78.13-1.23.13c-.2,0-.41,0-.61-.02s-.39-.04-.58-.06-.36-.05-.52-.08-.31-.06-.45-.1v-1.01c.29.11.62.2.99.26s.78.09,1.25.09c.34,0,.62-.03.86-.08s.43-.13.58-.23.26-.23.33-.38.1-.32.1-.51c0-.21-.06-.38-.17-.53s-.27-.28-.45-.39-.4-.22-.64-.32-.49-.19-.74-.3-.5-.21-.74-.33-.45-.26-.64-.42-.34-.35-.45-.57-.17-.48-.17-.78c0-.26.05-.52.16-.77s.28-.48.51-.68.53-.36.89-.48.79-.18,1.29-.18c.13,0,.27,0,.42.02s.3.03.46.05.31.05.46.07.29.06.42.09v.94c-.3-.09-.6-.15-.9-.2s-.59-.07-.87-.07c-.6,0-1.04.1-1.32.3s-.42.47-.42.8c0,.21.06.38.17.53s.27.28.45.4.4.22.64.32.49.19.74.3.5.21.74.33.45.26.64.43.34.36.45.58.17.49.17.79Z"/>
+    <path class="cls-6" d="M41.06,221.1l-.86,5.88h-1.24l-.85-2.46-.17-.6-.19.63-.81,2.43h-1.2l-.85-5.88h1l.49,4,.11.89.25-.78.86-2.64h.73l.92,2.61.26.78.09-.83.46-4.03h1.01Z"/>
+    <path class="cls-6" d="M44.21,221.95h-1.74v-.84h2.77v5.03h1.75v.85h-4.72v-.85h1.93v-4.19ZM44.57,218.64c.11,0,.22.02.32.06s.18.1.25.17.13.16.17.25.06.2.06.31-.02.21-.06.31-.1.18-.17.26-.16.13-.25.17-.2.06-.32.06-.22-.02-.32-.06-.18-.1-.25-.17-.13-.16-.17-.26-.06-.2-.06-.31.02-.22.06-.31.1-.18.17-.25.16-.13.25-.17.2-.06.32-.06Z"/>
+    <path class="cls-6" d="M53.54,226.9c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M59.97,226.77c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-6" d="M66.73,226.99h-1.02v-3.76c0-.45-.08-.79-.25-1.02s-.41-.34-.73-.34c-.14,0-.26.02-.38.06s-.24.1-.37.19-.27.22-.42.37-.33.35-.53.59v3.9h-1.02v-8.28h1.02v2.4l-.04.93c.16-.19.32-.35.47-.48s.31-.24.46-.32.31-.14.47-.18.33-.05.5-.05c.59,0,1.04.18,1.36.54s.48.9.48,1.61v3.84Z"/>
+    <path class="cls-6" d="M75.43,221.1h.93l.03,1.08c.35-.42.69-.72,1.03-.91s.68-.28,1.02-.28c.61,0,1.07.2,1.39.59s.46.98.44,1.76h-1.03c.01-.52-.06-.89-.23-1.12s-.4-.35-.71-.35c-.14,0-.27.02-.41.07s-.28.13-.43.23-.3.25-.47.41-.34.37-.53.61v3.78h-1.03v-5.88Z"/>
+    <path class="cls-6" d="M86.76,223.73c0,.14,0,.27,0,.36s0,.19-.02.28h-4.13c0,.6.17,1.06.5,1.39s.82.48,1.45.48c.17,0,.34,0,.52-.02s.34-.03.5-.06.31-.05.46-.08.28-.06.41-.1v.84c-.28.08-.59.14-.94.19s-.71.07-1.09.07c-.5,0-.94-.07-1.3-.21s-.66-.33-.89-.59-.4-.58-.52-.96-.17-.8-.17-1.28c0-.41.06-.81.18-1.17s.29-.69.52-.97.51-.5.84-.67.71-.25,1.13-.25.77.06,1.09.19.58.31.8.55.38.52.49.86.17.72.17,1.13ZM85.7,223.59c.01-.26-.01-.5-.08-.72s-.16-.4-.29-.56-.29-.28-.49-.37-.42-.13-.68-.13c-.22,0-.43.04-.61.13s-.34.21-.47.36-.24.34-.32.56-.13.46-.15.72h3.09Z"/>
+    <path class="cls-6" d="M93.05,225.38c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M99.71,226.99h-.91l-.04-.95c-.18.2-.34.37-.5.51s-.32.24-.47.33-.31.14-.47.17-.33.05-.5.05c-.61,0-1.06-.18-1.37-.53s-.46-.89-.46-1.61v-3.84h1.02v3.76c0,.9.34,1.35,1.02,1.35.12,0,.25-.02.37-.06s.24-.1.38-.19.27-.22.42-.37.32-.35.51-.59v-3.9h1.02v5.88Z"/>
+    <path class="cls-6" d="M103.59,219.54h-1.74v-.84h2.77v7.43h1.75v.85h-4.72v-.85h1.93v-6.59Z"/>
+    <path class="cls-6" d="M112.92,226.9c-.23.06-.47.1-.71.13s-.5.04-.75.04c-.74,0-1.29-.17-1.65-.5s-.54-.85-.54-1.54v-3.07h-1.65v-.86h1.65v-1.62l1.02-.26v1.88h2.64v.86h-2.64v2.99c0,.42.11.74.34.95s.56.31.99.31c.19,0,.39-.01.62-.04s.46-.08.7-.14v.88Z"/>
+    <path class="cls-6" d="M119.44,225.38c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-6" d="M123.74,221c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM123.74,225.29c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line id="source_line" data-name="source line" class="cls-2" x1="149.26" y1="227.96" x2="363.34" y2="227.96"/>
+  <line id="source_line-2" data-name="source line" class="cls-2" x1="149.58" y1="24.79" x2="363.34" y2="24.79"/>
+  <line class="cls-2" x1="237.42" y1="126.37" x2="237.42" y2="161.38"/>
+  <line id="source_line-3" data-name="source line" class="cls-2" x1="237.74" y1="143.88" x2="322" y2="143.88"/>
+  <line class="cls-2" x1="149.58" y1="7.28" x2="149.58" y2="42.29"/>
+  <g>
+    <circle class="cls-3" cx="218.02" cy="24.79" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M216.4,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M222.83,28.34h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-1" cx="250.61" cy="24.79" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M246.98,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M253.41,28.34h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M256.94,28.47c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="287.06" cy="24.79" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M281.26,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M287.69,28.34h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M291.22,28.47c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08.17-.05.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14-.21.03-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M296.72,22.98h-.06c-.08-.02-.17-.04-.26-.04s-.2,0-.33,0c-.3,0-.59.06-.88.19s-.57.32-.83.57v4.65h-1.1v-6.54h1.1v.97c.4-.36.75-.61,1.05-.75s.59-.22.87-.22c.11,0,.2,0,.25,0s.12.01.19.03v1.15Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-5" cx="177.02" cy="24.79" r="13.56"/>
+    <path class="cls-6" d="M178.71,28.34h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+  </g>
+  <line class="cls-2" x1="149.26" y1="210.45" x2="149.26" y2="245.46"/>
+  <line id="source_line-4" data-name="source line" class="cls-2" x1="175.64" y1="65.3" x2="228.25" y2="65.3"/>
+  <line class="cls-2" x1="228.25" y1="47.8" x2="228.25" y2="82.81"/>
+  <line class="cls-2" x1="175.64" y1="47.8" x2="175.64" y2="82.81"/>
+  <g>
+    <circle class="cls-5" cx="228.25" cy="65.3" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M221.77,69.01c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M228.8,69c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM230.09,64.85c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+      <path class="cls-6" d="M233.4,68.85h-1.1v-9.12h1.1v9.12Z"/>
+      <path class="cls-6" d="M238.47,60.79h-.06c-.1-.04-.24-.07-.42-.1s-.35-.05-.49-.05c-.46,0-.8.1-.99.31s-.3.59-.3,1.13v.22h1.82v.91h-1.79v5.63h-1.1v-5.63h-.74v-.91h.74v-.22c0-.79.19-1.39.57-1.8s.92-.62,1.63-.62c.2,0,.4.01.6.03s.37.05.53.07v1.01Z"/>
+    </g>
+  </g>
+  <line id="source_line-5" data-name="source line" class="cls-2" x1="282.05" y1="184.39" x2="308.43" y2="184.39"/>
+  <line class="cls-2" x1="308.43" y1="166.89" x2="308.43" y2="201.9"/>
+  <line class="cls-2" x1="282.05" y1="166.89" x2="282.05" y2="201.9"/>
+  <g>
+    <circle class="cls-4" cx="308.43" cy="184.39" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M299.08,188.1c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M305.23,188.07c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M310.92,187.24c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM310.92,186.33v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+      <path class="cls-6" d="M317.03,182.58h-.06c-.08-.02-.17-.04-.26-.04s-.2,0-.33,0c-.3,0-.59.06-.88.19s-.57.32-.83.57v4.65h-1.1v-6.54h1.1v.97c.4-.36.75-.61,1.05-.75s.59-.22.87-.22c.11,0,.2,0,.25,0s.12.01.19.03v1.15Z"/>
+      <path class="cls-6" d="M319.86,188.07c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-4" cx="308.43" cy="226.99" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M299.08,230.69c-.63,0-1.17-.07-1.61-.2s-.86-.29-1.25-.48v-1.45h.08c.38.36.82.64,1.3.83s.95.3,1.4.3c.64,0,1.12-.13,1.45-.4s.49-.62.49-1.06c0-.35-.09-.63-.26-.85s-.45-.38-.82-.49c-.27-.08-.52-.14-.74-.19s-.5-.12-.84-.21c-.3-.08-.57-.18-.81-.3s-.45-.28-.63-.47c-.18-.19-.32-.42-.42-.68s-.15-.56-.15-.9c0-.71.28-1.3.83-1.78s1.25-.72,2.11-.72c.49,0,.95.05,1.39.15s.84.24,1.21.42v1.39h-.09c-.28-.25-.63-.48-1.07-.67s-.89-.28-1.37-.28c-.54,0-.97.13-1.31.38s-.5.58-.5.99c0,.37.1.67.29.88s.48.38.85.48c.25.07.55.14.9.23s.65.16.88.23c.6.18,1.04.46,1.32.83s.42.83.42,1.37c0,.34-.07.68-.21,1.01s-.33.61-.58.84c-.28.25-.6.45-.95.59s-.8.21-1.33.21Z"/>
+      <path class="cls-6" d="M305.23,230.66c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M310.92,229.84c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM310.92,228.92v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+      <path class="cls-6" d="M317.03,225.17h-.06c-.08-.02-.17-.04-.26-.04s-.2,0-.33,0c-.3,0-.59.06-.88.19s-.57.32-.83.57v4.65h-1.1v-6.54h1.1v.97c.4-.36.75-.61,1.05-.75s.59-.22.87-.22c.11,0,.2,0,.25,0s.12.01.19.03v1.15Z"/>
+      <path class="cls-6" d="M319.86,230.66c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+    </g>
+  </g>
+  <line id="source_line-6" data-name="source line" class="cls-2" x1="218.02" y1="105.82" x2="263.72" y2="105.82"/>
+  <line class="cls-2" x1="264.18" y1="88.31" x2="264.18" y2="123.32"/>
+  <line class="cls-2" x1="218.02" y1="88.31" x2="218.02" y2="123.32"/>
+  <g>
+    <circle class="cls-3" cx="264.18" cy="105.82" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M257.29,109.36h-3.39v-.89h1.11v-6.94h-1.11v-.89h3.39v.89h-1.11v6.94h1.11v.89Z"/>
+      <path class="cls-6" d="M263.72,109.36h-1.1v-3.73c0-.3-.01-.58-.04-.84s-.08-.47-.17-.62c-.09-.16-.21-.29-.38-.37s-.38-.12-.66-.12-.56.07-.85.22-.58.34-.85.57v4.89h-1.1v-6.54h1.1v.73c.33-.29.65-.52.97-.67s.66-.23,1.01-.23c.64,0,1.15.21,1.51.64s.54,1.04.54,1.84v4.25Z"/>
+      <path class="cls-6" d="M267.24,109.49c-.6,0-1.07-.17-1.41-.51s-.5-.88-.5-1.62v-3.63h-.74v-.91h.74v-1.88h1.1v1.88h2.03v.91h-2.03v3.11c0,.33,0,.59.02.77s.06.35.13.5c.07.14.17.24.32.31s.35.1.6.1c.18,0,.35-.03.52-.08s.29-.1.36-.13h.06v.99c-.21.06-.42.1-.63.14s-.41.05-.59.05Z"/>
+      <path class="cls-6" d="M274.66,106.1c0,1.1-.27,1.95-.8,2.55s-1.24.9-2.12.9-1.63-.31-2.15-.93-.78-1.46-.78-2.52.27-1.94.81-2.55,1.25-.91,2.12-.91,1.59.3,2.12.91.8,1.45.8,2.55ZM273.52,106.1c0-.85-.15-1.48-.46-1.89s-.75-.62-1.32-.62-1.02.21-1.33.62-.47,1.04-.47,1.89.16,1.44.47,1.87.75.64,1.33.64,1-.21,1.32-.62.47-1.04.47-1.88Z"/>
+    </g>
+  </g>
+  <line class="cls-2" x1="322" y1="126.37" x2="322" y2="161.38"/>
+  <g>
+    <circle class="cls-1" cx="322" cy="143.88" r="13.56"/>
+    <g>
+      <path class="cls-6" d="M321.7,144.43h-1.04v3h-1.12v-3h-3.86v-1.23l3.9-4.49h1.08v4.79h1.04v.94ZM319.53,143.49v-3.41l-2.94,3.41h2.94Z"/>
+      <path class="cls-6" d="M328.02,147.43h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+    </g>
+  </g>
+</svg>

+ 110 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles-Zip-Marbles.svg

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 314.12 136.45">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3 {
+        stroke: #000;
+        stroke-miterlimit: 10;
+      }
+
+      .cls-2 {
+        fill: #ff8b8b;
+      }
+
+      .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-3 {
+        fill: #8bffbc;
+      }
+    </style>
+  </defs>
+  <line class="cls-1" x1="70.94" y1="89.36" x2="70.94" y2="124.37"/>
+  <line id="source_line" data-name="source line" class="cls-1" x1="71.26" y1="25.84" x2="245.04" y2="25.84"/>
+  <line id="source_line-2" data-name="source line" class="cls-1" x1="71.26" y1="106.87" x2="245.94" y2="106.87"/>
+  <g>
+    <path class="cls-4" d="M33.67,26.51c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.28s-.1-.16-.2-.24-.25-.16-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.06-.75-.06c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.51,28.12h-4.81v-.95h1.97v-5.59l-1.83,1-.38-.87,2.44-1.28h.9v6.74h1.71v.95Z"/>
+    <path class="cls-4" d="M44.57,22.13c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,26.43c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.67,68.3c0,.21-.04.39-.11.56s-.17.31-.29.44-.26.24-.42.33-.33.16-.51.22-.37.1-.56.13-.38.04-.56.04c-.4,0-.76-.02-1.1-.05s-.66-.09-.98-.17v-.94c.34.1.69.17,1.03.22s.68.08,1.01.08c.49,0,.85-.07,1.08-.2s.35-.32.35-.57c0-.11-.02-.2-.06-.29s-.1-.16-.2-.24-.25-.15-.45-.24-.49-.18-.84-.28c-.27-.08-.51-.17-.74-.27s-.42-.22-.58-.35-.29-.3-.39-.48-.14-.4-.14-.65c0-.16.04-.34.11-.54s.21-.38.39-.54.43-.31.74-.42.7-.17,1.17-.17c.23,0,.49.01.77.04s.57.07.88.13v.91c-.32-.08-.62-.14-.91-.17s-.54-.05-.75-.05c-.25,0-.47.02-.64.06s-.31.09-.42.16-.18.15-.23.24-.07.19-.07.3.02.2.06.29.12.17.23.25.27.16.47.24.46.17.78.26c.35.1.64.21.88.32s.43.24.58.37.25.29.32.46.1.37.1.59Z"/>
+    <path class="cls-4" d="M40.58,69.9h-5.04v-.91l1.98-1.97c.32-.32.59-.6.79-.83s.36-.45.47-.64.19-.38.23-.55.06-.36.06-.56c0-.19-.03-.37-.08-.54s-.13-.32-.23-.45-.24-.23-.41-.3-.37-.11-.6-.11c-.32,0-.62.07-.88.22s-.51.33-.73.56l-.56-.67c.29-.3.62-.55,1-.73s.82-.28,1.32-.28c.34,0,.65.05.93.15s.52.25.72.44.36.43.47.7.17.59.17.94c0,.29-.04.56-.12.81s-.2.5-.35.75-.36.51-.6.77-.52.56-.85.87l-1.39,1.35h3.72v.97Z"/>
+    <path class="cls-4" d="M44.57,63.91c.12,0,.24.02.35.07s.21.12.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.29-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.29-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM44.57,68.21c.12,0,.24.02.35.07s.21.12.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.29-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.29-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <g>
+    <path class="cls-4" d="M33.58,110.4c-.27.1-.54.18-.82.23s-.57.07-.86.07c-.93,0-1.65-.25-2.15-.76s-.75-1.24-.75-2.21c0-.46.07-.89.22-1.27s.35-.7.61-.97.57-.48.94-.62.76-.22,1.2-.22c.3,0,.59.02.86.06s.52.11.76.21v.97c-.25-.13-.51-.23-.78-.29s-.54-.09-.82-.09c-.26,0-.51.05-.74.15s-.44.24-.61.43-.31.42-.42.69-.15.57-.15.91c0,.71.17,1.24.52,1.6s.83.53,1.44.53c.28,0,.55-.03.81-.09s.51-.16.75-.28v.95Z"/>
+    <path class="cls-4" d="M37.97,104.63c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07ZM37.97,108.93c.12,0,.24.02.35.07s.21.11.29.2.15.18.2.29.07.22.07.35-.02.24-.07.35-.11.2-.2.28-.18.15-.29.19-.22.07-.35.07-.24-.02-.35-.07-.2-.11-.28-.19-.15-.18-.19-.28-.07-.22-.07-.35.02-.24.07-.35.11-.21.19-.29.18-.15.28-.2.22-.07.35-.07Z"/>
+  </g>
+  <line class="cls-1" x1="71.26" y1="8.33" x2="71.26" y2="43.34"/>
+  <line class="cls-1" x1="245.94" y1="8.33" x2="245.94" y2="43.34"/>
+  <g>
+    <circle class="cls-3" cx="119.64" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M122.43,25.02c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM120.93,27.68c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="182.1" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M184.4,29.39h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="245.57" cy="25.84" r="13.56"/>
+    <path class="cls-4" d="M248.32,29.39h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+  </g>
+  <g>
+    <circle class="cls-3" cx="119.64" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M117.46,106.05c0,1.57-.23,2.72-.68,3.45s-1.16,1.1-2.11,1.1-1.67-.37-2.12-1.12-.67-1.88-.67-3.42.23-2.73.68-3.45,1.16-1.09,2.11-1.09,1.67.38,2.12,1.13.67,1.89.67,3.4ZM115.96,108.71c.11-.29.19-.65.24-1.1s.07-.96.07-1.56-.02-1.12-.07-1.56-.13-.81-.25-1.1c-.12-.3-.28-.52-.48-.68s-.47-.23-.8-.23-.59.08-.8.23-.37.38-.5.69c-.12.3-.2.67-.24,1.12s-.06.96-.06,1.54c0,.61.02,1.12.06,1.53s.12.78.24,1.1c.11.3.27.53.48.69s.48.24.82.24.59-.08.8-.23.37-.38.49-.69Z"/>
+      <path class="cls-4" d="M120.88,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M126.03,109.72c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM126.03,108.8v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+    </g>
+  </g>
+  <g>
+    <circle class="cls-3" cx="182.1" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M179.27,110.42h-4.25v-.89h1.58v-5.85h-1.58v-.8c.6,0,1.04-.08,1.32-.25s.44-.49.48-.96h.91v7.86h1.55v.89Z"/>
+      <path class="cls-4" d="M183.17,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M190.16,107.03c0,1.07-.26,1.93-.78,2.58s-1.17.98-1.95.98c-.36,0-.66-.04-.91-.13s-.5-.21-.75-.35l-.07.3h-1.03v-9.12h1.1v3.26c.28-.25.58-.46.9-.62s.69-.25,1.1-.25c.74,0,1.32.3,1.75.89s.64,1.41.64,2.46ZM189.02,107.12c0-.78-.12-1.37-.36-1.78s-.62-.61-1.15-.61c-.3,0-.6.07-.91.21s-.58.32-.83.53v3.75c.28.14.52.23.74.29s.45.08.71.08c.56,0,1-.2,1.32-.6s.48-1.03.48-1.89Z"/>
+    </g>
+  </g>
+  <line id="source_line-3" data-name="source line" class="cls-1" x1="71.26" y1="66.35" x2="280.44" y2="66.35"/>
+  <line class="cls-1" x1="280.44" y1="48.85" x2="280.44" y2="83.86"/>
+  <line class="cls-1" x1="71.26" y1="48.85" x2="71.26" y2="83.86"/>
+  <g>
+    <circle class="cls-2" cx="104.62" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M105.93,69.2c-.09.07-.21.16-.36.28s-.3.21-.44.28c-.2.1-.38.18-.57.23s-.44.08-.76.08c-.27,0-.53-.05-.77-.15s-.46-.24-.64-.43c-.18-.18-.32-.4-.42-.67s-.16-.54-.16-.83c0-.45.1-.84.29-1.16s.49-.57.91-.76c.37-.17.8-.28,1.3-.35s1.04-.11,1.62-.14v-.21c0-.26-.04-.47-.12-.62s-.19-.28-.33-.37c-.14-.09-.31-.15-.52-.18s-.41-.04-.63-.04c-.25,0-.55.04-.9.11s-.69.19-1.03.33h-.06v-1.12c.2-.06.49-.12.87-.19s.75-.11,1.12-.11c.45,0,.83.04,1.14.11s.59.2.83.38c.24.18.42.41.53.7s.18.63.18,1.04v4.48h-1.1v-.7ZM105.93,68.29v-1.82c-.26.02-.59.06-.99.1s-.72.1-.97.17c-.29.09-.54.23-.73.41s-.29.44-.29.78c0,.38.11.66.32.85s.52.29.93.29c.35,0,.66-.08.94-.23s.54-.33.79-.55Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="141.61" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M144.58,66.52c0,1.07-.26,1.93-.78,2.58s-1.17.98-1.95.98c-.36,0-.66-.04-.91-.13s-.5-.21-.75-.35l-.07.3h-1.03v-9.12h1.1v3.26c.28-.25.58-.46.9-.62s.69-.25,1.1-.25c.74,0,1.32.3,1.75.89s.64,1.41.64,2.46ZM143.44,66.61c0-.78-.12-1.37-.36-1.78s-.62-.61-1.15-.61c-.3,0-.6.07-.91.21s-.58.32-.83.53v3.75c.28.14.52.23.74.29s.45.08.71.08c.56,0,1-.2,1.32-.6s.48-1.03.48-1.89Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="177.01" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M177.64,70.05c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="211.73" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M214.25,69.9h-1.1v-.67c-.17.14-.32.26-.45.36s-.27.18-.44.26c-.16.07-.32.13-.49.17s-.36.06-.59.06c-.36,0-.68-.07-.99-.22s-.56-.37-.77-.65c-.21-.29-.38-.65-.5-1.07s-.18-.91-.18-1.46.07-1.07.22-1.49.35-.79.62-1.1c.24-.29.53-.51.86-.67s.69-.24,1.06-.24c.33,0,.61.04.86.11s.5.18.77.34v-2.84h1.1v9.12ZM213.15,68.31v-3.77c-.27-.13-.52-.22-.74-.28s-.45-.08-.71-.08c-.57,0-1.01.21-1.33.64s-.48,1.04-.48,1.84.12,1.36.37,1.77.64.61,1.18.61c.29,0,.58-.07.87-.2s.57-.31.83-.53Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="246.13" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M246.61,70.05c-1.04,0-1.85-.29-2.43-.88s-.86-1.42-.86-2.5.28-1.92.84-2.55,1.29-.95,2.19-.95c.41,0,.77.06,1.08.18s.59.3.82.55.41.56.54.92.19.8.19,1.33v.6h-4.54c0,.76.19,1.34.57,1.75s.91.6,1.59.6c.24,0,.48-.03.71-.08s.44-.12.63-.21c.2-.09.37-.18.5-.26s.25-.16.34-.24h.06v1.2c-.13.05-.29.11-.48.19s-.36.14-.52.18c-.21.06-.41.1-.58.13s-.39.05-.66.05ZM247.9,65.9c0-.3-.04-.55-.11-.77s-.15-.4-.27-.54c-.13-.16-.29-.29-.5-.38s-.45-.13-.75-.13-.54.04-.75.13-.39.22-.56.38c-.16.17-.29.36-.38.57s-.14.45-.16.73h3.46Z"/>
+  </g>
+  <g>
+    <circle class="cls-2" cx="280.44" cy="66.35" r="13.56"/>
+    <path class="cls-4" d="M282.78,61.84h-.06c-.1-.04-.24-.07-.42-.1s-.35-.05-.49-.05c-.46,0-.8.1-.99.31s-.3.59-.3,1.13v.22h1.82v.91h-1.79v5.63h-1.1v-5.63h-.74v-.91h.74v-.22c0-.79.19-1.39.57-1.8s.92-.62,1.63-.62c.2,0,.4.01.6.03s.37.05.53.07v1.01Z"/>
+  </g>
+  <line class="cls-1" x1="245.94" y1="89.36" x2="245.94" y2="124.37"/>
+  <g>
+    <circle class="cls-3" cx="245.94" cy="106.87" r="13.56"/>
+    <g>
+      <path class="cls-4" d="M244.11,110.42h-5.38v-1.22c.39-.37.75-.72,1.1-1.05s.68-.69,1.01-1.05c.66-.73,1.12-1.32,1.36-1.75s.36-.89.36-1.36c0-.24-.04-.46-.11-.64s-.18-.34-.31-.46c-.14-.12-.29-.21-.47-.26s-.38-.09-.59-.09-.42.03-.63.08-.42.12-.61.2c-.16.07-.32.15-.47.24s-.28.17-.37.24h-.06v-1.24c.24-.12.58-.24,1.01-.35s.84-.17,1.23-.17c.81,0,1.45.22,1.91.65s.69,1.02.69,1.75c0,.34-.04.65-.12.94s-.19.56-.33.8c-.14.25-.32.51-.52.76s-.42.5-.64.74c-.37.4-.78.81-1.23,1.24s-.81.77-1.08,1.02h4.29v1Z"/>
+      <path class="cls-4" d="M247.56,108.75l-1.64,3.84h-.86l1.03-3.84h1.46Z"/>
+      <path class="cls-4" d="M251.67,110.56c-.45,0-.86-.07-1.24-.21s-.7-.35-.97-.63-.48-.64-.63-1.06-.22-.93-.22-1.51.08-1.07.23-1.49.36-.77.62-1.05.58-.5.96-.66.8-.23,1.24-.23c.36,0,.71.05,1.04.15s.63.22.89.35v1.24h-.06c-.08-.07-.18-.14-.3-.23s-.27-.17-.45-.26c-.15-.08-.33-.15-.54-.21s-.41-.09-.6-.09c-.57,0-1.03.22-1.37.65s-.52,1.04-.52,1.83.17,1.38.5,1.81.8.65,1.39.65c.36,0,.7-.07,1.03-.22s.61-.34.86-.57h.06v1.24c-.11.05-.25.11-.41.18s-.31.13-.45.16c-.19.05-.36.1-.5.13s-.34.04-.57.04Z"/>
+    </g>
+  </g>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Ch09-CombiningSequences-Marbles.ai


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 34 - 0
Rx.NET/Documentation/IntroToRx/GraphicsIntro/Marbles-Swatch.ai


BIN
Rx.NET/Resources/Artwork/title_page.png


BIN
Rx.NET/Resources/Artwork/title_page_sm.png


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä