Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
+
+
+
+
+
\ No newline at end of file
diff --git a/LICENSE.md b/LICENSE.md
deleted file mode 100644
index ce3ea16..0000000
--- a/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Ángel Cervera Claudio
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
deleted file mode 100644
index dad376c..0000000
--- a/README.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# osm4scala
-
-[](https://maven-badges.herokuapp.com/maven-central/com.acervera.osm4scala/osm4scala-core_2.12)
-[](https://app.travis-ci.com/github/simplexspatial/osm4scala)
-[](https://coveralls.io/github/simplexspatial/osm4scala?branch=master)
-[](https://sonarcloud.io/dashboard?id=simplexspatial_osm4scala)
-[](https://gitter.im/osm4scala/talk)
-[](https://raw.githubusercontent.com/angelcervera/osm4scala/master/LICENSE.md)
-[](https://app.fossa.com/projects/git%2Bgithub.com%2Fangelcervera%2Fosm4scala?ref=badge_shield)
-[](https://github.com/simplexspatial/osm4scala/blob/master/code_of_conduct.md)
-
-
-
-
-
-High performance Scala library and Spark Polyglot (Scala, Python, SQL, etc.) connector for OpenStreetMap Pbf files.
-
-## Documentation and site
-> ⚠ Full usage documentation at https://simplexspatial.github.io/osm4scala/
-
-
-## Stargazers over time
-
-[](https://starchart.cc/simplexspatial/osm4scala)
-
-
-## Dev information:
-It's possible to develop using a Windows machine, but all documentation suppose that you are using Linux or Mac.
-
-### Prepare environment
-The only special requirement is to execute `sbt compile` to generate the protobuf source code.
-```shell script
-sbt compile
-```
-
-## PATCH_211 flag
-Because depending on the Scala version, there are projects that are disabled (No spark3 for Scala 2.11) and different
-libraries dependencies. Because this, there is a flag called PATCH_211 (default value is false) to enable or disable
-Scala 2.11 compatibility.
-
-### Cross versions
-The project is using cross version to manage 2.11, 2.12 and 2.13 using the same code base, so remember to use '+' to
-trigger all versions versions.
-
-So remember, as example, for testing:
-```shell script
-PATCH_211=false sbt +test
-PATCH_211=true sbt +test
-```
-
-### Release process
-The publication into Maven Central has been removed from the release process, so now there are few steps:
-1. Release.
- ```shell script
- git checkout master
- sbt release
- ```
-2. Publish into Maven Central. Information about configuration in plugins involved:
- - [sbt-pgp](https://github.com/sbt/sbt-pgp#sbt-pgp) using `gpg` command-line utility under the cover.
- - [Sonatype GPG documentation](https://central.sonatype.org/publish/requirements/gpg/)
- - [xerial/sbt-sonatype](https://github.com/xerial/sbt-sonatype#sbt-sonatype-plugin)
- - [scala-lang documentation](https://docs.scala-lang.org/overviews/contributors/index.html#publish-a-release)
-
- Basically:
- - Set the keys as [sbt-pgp#working-with-pgp-signatures](https://github.com/sbt/sbt-pgp#working-with-pgp-signatures) explains.
- - Be sure that public key has been uploaded into, at least last time, `pgp.mit.edu`: `gpg --keyserver hkp://pgp.mit.edu --send-keys `
- - Set the right credentials file at [`$HOME/.sbt/1.0/sonatype.sbt`](https://github.com/xerial/sbt-sonatype#homesbtsbt-version-013-or-10sonatypesbt).
- - Execute:
- ```shell script
- git checkout v1.*.*
- sbt clean
- PATCH_211=false sbt +publishSigned
- PATCH_211=true sbt +publishSigned
- # In this point, tree target/sonatype-staging/ will show all artifacts to publish.
- sbt sonatypeBundleRelease
- ```
-3. Publish documentation and site.
- ```bash
- git checkout v1.*.*
- cd website
- nvm use
- export GIT_USER=; export USE_SSH=true; npm run deploy
- ```
-
-## References.
-
-### PBF information:
- - PBF2 Documentation: http://wiki.openstreetmap.org/wiki/PBF_Format
- - PBF2 Java library: https://github.com/openstreetmap/osmosis/tree/master/osmosis-osm-binary
- - Download whole planet pbf files: http://free.nchc.org.tw/osm.planet/
- - Download country pbf files: http://download.geofabrik.de/index.html
- - Scala protocol buffer library: https://scalapb.github.io/ and https://github.com/thesamet/sbt-protoc
- - OSM primitives: https://wiki.openstreetmap.org/wiki/Elements
- - Node: https://wiki.openstreetmap.org/wiki/Node
- - Way: https://wiki.openstreetmap.org/wiki/Way
- - Relations: https://wiki.openstreetmap.org/wiki/Relation
- - Tags: https://wiki.openstreetmap.org/wiki/Tags
-
-### third party OSS libraries:
- - ScalaPB: https://scalapb.github.io/ and https://github.com/thesamet/sbt-protoc
diff --git a/website/static/android-chrome-192x192.png b/android-chrome-192x192.png
similarity index 100%
rename from website/static/android-chrome-192x192.png
rename to android-chrome-192x192.png
diff --git a/website/static/android-chrome-512x512.png b/android-chrome-512x512.png
similarity index 100%
rename from website/static/android-chrome-512x512.png
rename to android-chrome-512x512.png
diff --git a/website/static/apple-touch-icon.png b/apple-touch-icon.png
similarity index 100%
rename from website/static/apple-touch-icon.png
rename to apple-touch-icon.png
diff --git a/assets/css/styles.03c1686d.css b/assets/css/styles.03c1686d.css
new file mode 100644
index 0000000..a4fe08c
--- /dev/null
+++ b/assets/css/styles.03c1686d.css
@@ -0,0 +1 @@
+.row .col,img{max-width:100%}.markdown li,body{word-wrap:break-word}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.button,.close{-webkit-appearance:none;cursor:pointer}.button,.react-toggle{-webkit-user-select:none;-ms-user-select:none}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.button,.close,.menu__link,.navbar__link{cursor:pointer}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.footer__items,.menu__list,.pills__item{list-style-type:none}.tabs__item,hr,img{box-sizing:content-box}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.react-toggle,html{-webkit-tap-highlight-color:transparent}:root{--ra-admonition-background-color:var(--ifm-alert-background-color);--ra-admonition-border-width:var(--ifm-alert-border-width);--ra-admonition-border-color:var(--ifm-alert-border-color);--ra-admonition-border-radius:var(--ifm-alert-border-radius);--ra-admonition-color:var(--ifm-alert-color);--ra-admonition-padding-vertical:var(--ifm-alert-padding-vertical);--ra-admonition-padding-horizontal:var(--ifm-alert-padding-horizontal);--ra-color-note:var(--ifm-color-secondary);--ra-color-important:var(--ifm-color-info);--ra-color-tip:var(--ifm-color-success);--ra-color-caution:var(--ifm-color-warning);--ra-color-warning:var(--ifm-color-danger);--ra-color-text-dark:var(--ifm-color-gray-900)}.admonition{margin-bottom:1em;--ra-admonition-icon-color:var(--ra-admonition-color)}.admonition:not(.alert){background-color:var(--ra-admonition-background-color);border:var(--ra-admonition-border-width) solid var(--ra-admonition-border-color);border-radius:var(--ra-admonition-border-radius);box-sizing:border-box;color:var(--ra-admonition-color);padding:var(--ra-admonition-padding-vertical) var(--ra-admonition-padding-horizontal);--ra-admonition-background-color:var(--ifm-color-primary)}.container,.row .col{padding:0 var(--ifm-spacing-horizontal);width:100%}.admonition h5{margin-top:0;margin-bottom:8px;text-transform:uppercase}.admonition-icon{display:inline-block;vertical-align:middle;margin-right:.2em}.admonition-icon svg{display:inline-block;width:22px;height:22px;stroke-width:0;fill:var(--ra-admonition-icon-color);stroke:var(--ra-admonition-icon-color)}.admonition-content>:last-child,blockquote>:last-child{margin-bottom:0}.admonition-note{--ra-admonition-color:var(--ra-color-text-dark)}:root{--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-color-primary:#3578e5;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-secondary:#ebedf0;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-success:#00a400;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-info:#54c7ec;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-warning:#ffba00;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-danger:#fa383e;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#606770;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,0.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,0.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,0.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,0.2),0 2px 4px 0 rgba(0,0,0,0.1);--ifm-z-index-dropdown:2;--ifm-z-index-fixed:3;--ifm-z-index-overlay:4;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:var(--ifm-color-emphasis-200);--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-color:var(--ifm-color-emphasis-900);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.4rem;--ifm-code-padding-vertical:0.2rem;--ifm-pre-background:var(--ifm-color-emphasis-100);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:inherit;--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:var(--ifm-color-emphasis-100);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-color:#6a737d;--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-padding-horizontal:1rem;--ifm-blockquote-padding-vertical:1rem;--ifm-hr-border-color:var(--ifm-color-emphasis-500);--ifm-hr-border-width:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:var(--ifm-global-border-width);--ifm-alert-color:var(--ifm-font-color-base-inverse);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size-sm:2rem;--ifm-avatar-photo-size-md:3rem;--ifm-avatar-photo-size-lg:4rem;--ifm-avatar-photo-size-xl:6rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.0625rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:1rem;--ifm-breadcrumb-padding-vertical:0.5rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-margin:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:1rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:1rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:80vw;--ifm-pagination-border-radius:calc(var(--ifm-global-radius)*var(--ifm-pagination-size-multiplier));--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.0625rem;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-size-multiplier:1;--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.0625rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--ifm-tabs-spacing:0.0625rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:#888;--ifm-scrollbar-thumb-hover-background-color:#555;--ifm-color-primary:#dc9b40;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#46cbae;--ifm-color-primary-lighter:#66d4bd;--ifm-color-primary-lightest:#92e0d0;--ifm-code-font-size:95%;--docusaurus-announcement-bar-height:auto;--collapse-button-bg-color-dark:#2e333a;--doc-sidebar-width:300px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}.navbar--dark,.navbar--primary{--ifm-navbar-search-input-background-color:hsla(0,0%,100%,0.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,0.5)}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0;transition:var(--ifm-transition-fast) ease color}.container{margin:0 auto;max-width:var(--ifm-container-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.container--fluid{max-width:inherit}.row{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.markdown>:first-child{margin-top:0!important}.row .col{--ifm-col-width:100%;flex:1 0;margin-left:0}.row .col.col--1,.row .col.col--2,.row .col.col--3,.row .col[class*=col--]{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--1{--ifm-col-width:8.33333%}.row .col.col--offset-1{margin-left:8.33333%}.row .col.col--2{--ifm-col-width:16.66667%}.row .col.col--offset-2{margin-left:16.66667%}.row .col.col--3{--ifm-col-width:25%}.row .col.col--offset-3{margin-left:25%}.row .col.col--4{--ifm-col-width:33.33333%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-4{margin-left:33.33333%}.row .col.col--5{--ifm-col-width:41.66667%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--6,.row .col.col--7{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-5{margin-left:41.66667%}.row .col.col--6{--ifm-col-width:50%}.row .col.col--offset-6{margin-left:50%}.row .col.col--7{--ifm-col-width:58.33333%}.row .col.col--offset-7{margin-left:58.33333%}.row .col.col--8{--ifm-col-width:66.66667%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-8{margin-left:66.66667%}.row .col.col--9{--ifm-col-width:75%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--10,.row .col.col--11{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-9{margin-left:75%}.row .col.col--10{--ifm-col-width:83.33333%}.row .col.col--offset-10{margin-left:83.33333%}.row .col.col--11{--ifm-col-width:91.66667%}.row .col.col--offset-11{margin-left:91.66667%}.row .col.col--12{--ifm-col-width:100%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-12{margin-left:100%}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border-radius:var(--ifm-code-border-radius);color:var(--ifm-code-color);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre,pre code{word-wrap:normal}pre code{background-color:transparent;display:inline;font-size:100%;line-height:inherit;padding:0;white-space:pre;word-break:normal}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}.badge,strong{font-weight:var(--ifm-font-weight-bold)}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{border-style:none}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before,hr:after,hr:before{content:"";display:table}.markdown:after,hr:after{clear:both}.markdown>h1{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-h1-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.codeBlockContainer_K1bP,.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}.avatar__name,ol ol,ol ul,ul ol,ul ul{margin:0}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical);width:100%}.avatar__photo,.card,hr{overflow:hidden}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration);transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.alert,.alert a{color:var(--ifm-alert-color)}.breadcrumbs__link:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:6px solid var(--ifm-color-emphasis-300);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}hr{border:var(--ifm-hr-border-width) solid var(--ifm-hr-border-color);margin:var(--ifm-hr-margin-vertical) 0}.alert{background-color:var(--ifm-alert-background-color);border-radius:var(--ifm-alert-border-radius);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary);--ifm-alert-border-color:var(--ifm-color-primary)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary);--ifm-alert-border-color:var(--ifm-color-secondary);--ifm-alert-color:var(--ifm-color-gray-900)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success);--ifm-alert-border-color:var(--ifm-color-success)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info);--ifm-alert-border-color:var(--ifm-color-info)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning);--ifm-alert-border-color:var(--ifm-color-warning)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger);--ifm-alert-border-color:var(--ifm-color-danger)}.alert a{text-decoration:underline}.alert .close{margin-right:calc(var(--ifm-alert-padding-horizontal)*-1);margin-top:calc(var(--ifm-alert-padding-vertical)*-1)}.avatar,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.avatar__photo-link{display:block}.avatar__photo{border-radius:50%;height:var(--ifm-avatar-photo-size-md);width:var(--ifm-avatar-photo-size-md)}.avatar__photo--sm{height:var(--ifm-avatar-photo-size-sm);width:var(--ifm-avatar-photo-size-sm)}.avatar__photo--lg{height:var(--ifm-avatar-photo-size-lg);width:var(--ifm-avatar-photo-size-lg)}.avatar__photo--xl{height:var(--ifm-avatar-photo-size-xl);width:var(--ifm-avatar-photo-size-xl)}.avatar__photo+.avatar__intro{margin-left:var(--ifm-avatar-intro-margin)}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.menu__link--sublist:after{display:inline-block}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.avatar--vertical .avatar__intro{margin-left:0}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal);vertical-align:baseline}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:first-child){margin-left:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child){margin-right:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) 50%;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 .5rem;opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__item--active .breadcrumbs__link,.breadcrumbs__item:not(.breadcrumbs__item--active):hover .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-property:background,color;transition-duration:var(--ifm-transition-fast)}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{appearance:none;background-color:var(--ifm-button-background-color);border-radius:var(--ifm-button-border-radius);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);font-size:calc(0.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;user-select:none;vertical-align:middle;white-space:nowrap;transition-property:color,background,border-color;transition-duration:var(--ifm-button-transition-duration)}.button,.button:hover{color:var(--ifm-button-color);text-decoration:none}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}.button--primary{--ifm-button-border-color:var(--ifm-color-primary)}.button--primary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-primary)}.button--primary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-border-color:var(--ifm-color-primary-darker);--ifm-button-background-color:var(--ifm-color-primary-darker);background-color:var(--ifm-color-primary-darker);border-color:var(--ifm-color-primary-darker)}.button--secondary{--ifm-button-border-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-border-color:var(--ifm-color-secondary-darker);--ifm-button-background-color:var(--ifm-color-secondary-darker);background-color:var(--ifm-color-secondary-darker);border-color:var(--ifm-color-secondary-darker)}.button--success{--ifm-button-border-color:var(--ifm-color-success)}.button--success:not(.button--outline){--ifm-button-background-color:var(--ifm-color-success)}.button--success:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-border-color:var(--ifm-color-success-darker);--ifm-button-background-color:var(--ifm-color-success-darker);background-color:var(--ifm-color-success-darker);border-color:var(--ifm-color-success-darker)}.button--info{--ifm-button-border-color:var(--ifm-color-info)}.button--info:not(.button--outline){--ifm-button-background-color:var(--ifm-color-info)}.button--info:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-border-color:var(--ifm-color-info-darker);--ifm-button-background-color:var(--ifm-color-info-darker);background-color:var(--ifm-color-info-darker);border-color:var(--ifm-color-info-darker)}.button--warning{--ifm-button-border-color:var(--ifm-color-warning)}.button--warning:not(.button--outline){--ifm-button-background-color:var(--ifm-color-warning)}.button--warning:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-border-color:var(--ifm-color-warning-darker);--ifm-button-background-color:var(--ifm-color-warning-darker);background-color:var(--ifm-color-warning-darker);border-color:var(--ifm-color-warning-darker)}.button--danger{--ifm-button-border-color:var(--ifm-color-danger)}.button--danger:not(.button--outline){--ifm-button-background-color:var(--ifm-color-danger)}.button--danger:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-border-color:var(--ifm-color-danger-darker);--ifm-button-background-color:var(--ifm-color-danger-darker);background-color:var(--ifm-color-danger-darker);border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:var(--ifm-button-group-margin)}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group>.button--active{z-index:1}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column}.card--full-height,body,html{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style-type:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color)}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{appearance:none;background:none;border:none;color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__menu,.menu__link,.menu__link:hover{transition-duration:var(--ifm-transition-fast)}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;transform:scale(1);visibility:visible}.dropdown--right .dropdown__menu{right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);list-style:none;min-width:10rem;opacity:0;padding:.5rem;position:absolute;top:100%;transform:scale(.8);visibility:hidden;z-index:var(--ifm-z-index-dropdown);transition-property:opacity,transform,visibility;transition-timing-function:cubic-bezier(.24,.22,.015,1.56)}.dropdown__link{border-radius:.375rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;padding:.375rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;vertical-align:middle}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:10rem}.footer__item,.pills__item+.pills__item{margin-top:0}.footer__title{color:var(--ifm-footer-title-color)}.footer__items{margin-bottom:0;padding-left:0}[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{margin:0;padding-left:0}.menu__list .menu__list{margin-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item{margin:.25rem 0}.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__link{border-radius:.25rem;display:flex;justify-content:space-between;line-height:20px;padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__link,.menu__link:hover{color:var(--ifm-menu-color);transition-property:color,background;transition-timing-function:var(--ifm-transition-timing-default)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;visibility:hidden;transition-timing-function:ease-in-out;top:0;left:0}.menu__link:hover{text-decoration:none;background:var(--ifm-menu-color-background-hover)}.menu__link--sublist:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;content:" ";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);width:1.25rem;transition:transform var(--ifm-transition-fast) linear}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.menu__link--active:not(.menu__link--sublist){background:var(--ifm-menu-color-background-active)}.menu--responsive .menu__button{bottom:2rem;display:none;position:fixed;right:1rem;z-index:var(--ifm-z-index-fixed)}.menu--show{background:var(--ifm-background-surface-color);bottom:0;left:0;overscroll-behavior:contain;padding:1rem;position:fixed;right:0;-ms-scroll-chaining:none;top:0;z-index:var(--ifm-z-index-overlay)}.menu--show .menu__list{display:inherit;opacity:1;transition:opacity var(--ifm-transition-fast) linear}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal);width:100%}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;color:var(--ifm-navbar-link-color);display:flex;font-weight:700;height:2rem;margin-right:1rem}.navbar__brand:hover{color:inherit;text-decoration:none}.navbar__title{flex-shrink:0;max-width:100%}.navbar__toggle{background:none;border:none;color:inherit;cursor:pointer;display:none;margin-right:.5rem;padding:0}.navbar__item,.navbar__link{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__logo{height:100%;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1 1 auto}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--right{justify-content:flex-end}.navbar__item{display:inline-block}.navbar__item.dropdown{padding:0}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link{color:var(--ifm-navbar-link-color);font-weight:var(--ifm-font-weight-semibold);text-decoration:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark{--ifm-navbar-background-color:#303846;--ifm-navbar-link-color:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search{padding-left:var(--ifm-navbar-padding-horizontal)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input:-ms-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);overflow:auto;position:fixed;transform:translate3d(-100%,0,0);width:var(--ifm-navbar-sidebar-width);transition-property:opacity,visibility,transform;transition-duration:.25s}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{transform:translateZ(0)}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);position:fixed;right:0;transition-property:opacity,visibility;transition-duration:.1s}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.pagination__item,.pagination__link{display:inline-block}.navbar-sidebar__items{padding:.5rem}.pagination{font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item:not(:first-child){margin-left:var(--ifm-pagination-page-spacing)}.pagination__item:not(:last-child){margin-right:var(--ifm-pagination-page-spacing)}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.main-docs-wrapper,.pagination-nav{display:flex}.pagination-nav__item{display:flex;flex:1 50%;max-width:50%}.pagination-nav__item--next{text-align:right}.pagination-nav__item+.pagination-nav__item{margin-left:var(--ifm-spacing-horizontal)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);flex-grow:1;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{background:var(--ifm-pills-color-background-active);color:var(--ifm-pills-color-active)}.pills__item:not(.pills__item--active):hover{background-color:var(--ifm-pills-color-background-active)}.pills__item:not(:first-child){margin-left:var(--ifm-pills-spacing)}.pills__item:not(:last-child){margin-right:var(--ifm-pills-spacing)}.pills--block{display:flex;justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;margin:0;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.text--no-decoration,.text--no-decoration:hover{text-decoration:none}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}html[data-theme=dark]{--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#18191a;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,0.05);--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%);--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%)}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.gitter-chat-embed{z-index:6}#nprogress .bar{background:#29d;position:fixed;z-index:5;top:0;left:0;width:100%;height:2px}#nprogress .peg{position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#docusaurus-base-url-issue-banner-container,.collapseSidebarButton_1CGd,.sidebarLogo_3h0W,.themedImage_1VuW{display:none}.skipToContent_1oUP{position:fixed;top:1rem;left:100%;z-index:calc(var(--ifm-z-index-fixed) + 1);padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);color:var(--ifm-color-emphasis-900);background-color:var(--ifm-background-surface-color);border-radius:var(--ifm-global-radius);font:inherit;border:none}.skipToContent_1oUP:focus{left:1rem}.announcementBar_3WsW{position:relative;width:100%;height:var(--docusaurus-announcement-bar-height);background-color:var(--ifm-color-primary);color:var(--ifm-color-black)}.announcementBarClose_38nx{position:absolute;right:0;top:0;width:55px;font-size:1.25rem;padding:0;border:none;cursor:pointer;background:none;color:inherit;height:100%}.announcementBarContent_3EUC{font-size:85%;width:100%;text-align:center;padding:5px 0}.announcementBarCloseable_3myR{margin-right:55px}.announcementBarContent_3EUC a{color:inherit;text-decoration:underline}.toggle_71bT{align-items:center;display:flex;height:10px;justify-content:center;width:10px}.toggle_71bT:before{position:absolute}.react-toggle{touch-action:pan-x;position:relative;cursor:pointer;user-select:none}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed}.react-toggle-track{width:50px;height:24px;border-radius:30px;background-color:#4d4d4d;transition:.2s}.react-toggle-track-check,.react-toggle-track-x{height:10px;top:0;bottom:0;margin:auto 0;position:absolute}.react-toggle-track-check{width:14px;left:8px;opacity:0;transition:opacity .25s}.react-toggle--checked .react-toggle-track-check,.react-toggle-track-x,[data-theme=dark] .react-toggle .react-toggle-track-check{opacity:1;transition:opacity .25s}.react-toggle-track-x{width:10px;right:10px}.react-toggle--checked .react-toggle-track-x,[data-theme=dark] .react-toggle .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #4d4d4d;border-radius:50%;background-color:#fafafa;transition:.25s}.react-toggle--checked .react-toggle-thumb,[data-theme=dark] .react-toggle .react-toggle-thumb{left:27px}.react-toggle--focus .react-toggle-thumb,.react-toggle:hover .react-toggle-thumb{box-shadow:0 0 2px 3px var(--ifm-color-primary)}.react-toggle:active:not(.react-toggle--disabled) .react-toggle-thumb{box-shadow:0 0 5px 5px var(--ifm-color-primary)}html[data-theme=dark] .themedImage--dark_hz6m,html[data-theme=light] .themedImage--light_3UqQ{display:initial}.navbarHideable_2qcr{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_3yey{transform:translate3d(0,calc(var(--ifm-navbar-height)*-1),0)}.footerLogoLink_MyFc{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.codeBlockContent_hGly:hover>.copyButton_Ue-o,.codeBlockTitle_eoMF:hover+.codeBlockContent_hGly .copyButton_Ue-o,.copyButton_Ue-o:focus,.footerLogoLink_MyFc:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus{min-height:100%;display:flex;flex-direction:column}.main-wrapper{flex:1 0 auto}.sidebarMenuIcon_fgN0{vertical-align:middle}.sidebarMenuCloseIcon_1lpH{display:inline-flex;justify-content:center;align-items:center;height:24px;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:.9;width:24px}.menu__list .menu__list{overflow-y:hidden;will-change:height;transition:height var(--ifm-transition-fast) linear}.menu__list-item--collapsed .menu__list{overflow:hidden;height:0!important}.menuLinkExternal_1OhN{align-items:center}.menuLinkExternal_1OhN:after{content:"";height:1.15rem;width:1.15rem;min-width:1.15rem;margin:0 auto 0 3%;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M21 13v10H0V4h12v2H2v15h17v-8h2zm3-12H13.012l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07L24 12V1z'/%3E%3C/svg%3E") no-repeat;filter:var(--ifm-menu-link-sublist-icon-filter)}.codeBlockContent_hGly{position:relative;direction:ltr}.codeBlockTitle_eoMF{border-top-left-radius:var(--ifm-global-radius);border-top-right-radius:var(--ifm-global-radius);border-bottom:1px solid var(--ifm-color-emphasis-300);font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_23N8{overflow:auto;border-radius:var(--ifm-global-radius)}.codeBlockWithTitle_2JqI{border-top-left-radius:0;border-top-right-radius:0}.copyButton_Ue-o{background:rgba(0,0,0,.3);border:none;border-radius:var(--ifm-global-radius);color:var(--ifm-color-white);cursor:pointer;opacity:0;-webkit-user-select:none;-ms-user-select:none;user-select:none;padding:.4rem .5rem;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2);transition:opacity .2s ease-in-out}.codeBlockLines_39YC{font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);white-space:pre;float:left;min-width:100%;padding:var(--ifm-pre-padding)}.anchor{display:block;position:relative;top:-.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast)}.enhancedAnchor_2LWZ{top:calc(var(--ifm-navbar-height)*-1)}.docMainContainer_3ufF,.docPage_31aa{display:flex;width:100%}.heroBanner_3P7f{padding:4rem 0;text-align:center;position:relative;overflow:hidden}.buttons_1r9m{justify-content:center}.buttons_1r9m,.features_3azU{display:flex;align-items:center}.features_3azU{padding:2rem 0;width:100%}.featureImage_ZtzX{height:200px;width:200px}.lastUpdatedDate_1WI_{font-weight:700}.tableOfContents_35-E{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.iconEdit_2_ui{margin-right:.3em;vertical-align:sub}.docTitle_3a4h{font-size:3rem;margin-bottom:calc(var(--ifm-leading-desktop)*var(--ifm-leading))}.docItemContainer_33ec{margin:0 auto;padding:0 .5rem}@media (min-width:997px){.sidebar_15mo{display:flex;flex-direction:column;max-height:100vh;height:100%;position:sticky;top:0;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width);transition:opacity 50ms}.sidebarWithHideableNavbar_267A{padding-top:0}.sidebarHidden_2kNb{opacity:0;height:0;overflow:hidden;visibility:hidden}.sidebarLogo_3h0W{display:flex!important;align-items:center;margin:0 var(--ifm-navbar-padding-horizontal);min-height:var(--ifm-navbar-height);max-height:var(--ifm-navbar-height);color:inherit!important;text-decoration:none!important}.sidebarLogo_3h0W img{margin-right:.5rem;height:2rem}.menu_Bmed{flex-grow:1;padding:.5rem}.menuLinkText_2aKo{cursor:auto}.menuLinkText_2aKo:hover{background:none}.menuWithAnnouncementBar_2WvA{margin-bottom:var(--docusaurus-announcement-bar-height)}.collapseSidebarButton_1CGd{display:block!important;background-color:var(--ifm-button-background-color);height:40px;position:sticky;bottom:0;border-radius:0;border:1px solid var(--ifm-toc-border-color)}.collapseSidebarButtonIcon_3E-R{transform:rotate(180deg);margin-top:4px}.expandSidebarButtonIcon_1naQ,html[dir=rtl] .collapseSidebarButtonIcon_3E-R{transform:rotate(0)}html[data-theme=dark] .collapseSidebarButton_1CGd,html[data-theme=dark] .collapsedDocSidebar_2JMH:focus,html[data-theme=dark] .collapsedDocSidebar_2JMH:hover{background-color:var(--collapse-button-bg-color-dark)}.collapsedDocSidebar_2JMH:focus,.collapsedDocSidebar_2JMH:hover,html[data-theme=dark] .collapseSidebarButton_1CGd:focus,html[data-theme=dark] .collapseSidebarButton_1CGd:hover{background-color:var(--ifm-color-emphasis-200)}.docMainContainer_3ufF{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_3NYZ{max-width:none}.docSidebarContainer_3Kbt{width:var(--doc-sidebar-width);margin-top:calc(var(--ifm-navbar-height)*-1);border-right:1px solid var(--ifm-toc-border-color);will-change:width;transition:width var(--ifm-transition-fast) ease;-webkit-clip-path:inset(0);clip-path:inset(0)}.docSidebarContainerHidden_3pA8{width:30px;cursor:pointer}.collapsedDocSidebar_2JMH{position:sticky;top:0;height:100%;max-height:100vh;display:flex;align-items:center;justify-content:center;transition:background-color var(--ifm-transition-fast) ease}html[dir=rtl] .expandSidebarButtonIcon_1naQ{transform:rotate(180deg)}.docItemWrapperEnhanced_2vyJ{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))}}@media (min-width:997px) and (max-width:1320px){.docItemWrapper_3FMP{max-width:calc(var(--ifm-container-width) - var(--doc-sidebar-width) - var(--ifm-spacing-horizontal)*2)}.docItemWrapperEnhanced_2vyJ{max-width:calc(var(--ifm-container-width) - var(--ifm-spacing-horizontal)*2)}}@media only screen and (min-width:997px){.docItemCol_3FnS{max-width:75%!important}}@media screen and (min-width:1024px){:root{--docusaurus-announcement-bar-height:30px}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:1200px){h1{--ifm-h1-font-size:calc(1.375rem + 1.5vw)}}@media screen and (max-width:997px){.displayOnlyInLargeViewport_GrZ2{display:none!important}}@media (max-width:996px){.row .col.col.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0;max-width:var(--ifm-col-width)}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator,.navbar__item{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.menu--responsive .menu__button,.navbar__toggle{display:inherit}.menu--responsive:not(.menu--show) .menu__list{display:none;opacity:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.pills--block .pills__item:not(:first-child){margin-top:var(--ifm-pills-spacing)}.pills--block .pills__item:not(:last-child){margin-bottom:var(--ifm-pills-spacing)}.tabs--block .tabs__item:not(:first-child){margin-top:var(--ifm-tabs-spacing)}.tabs--block .tabs__item:not(:last-child){margin-bottom:var(--ifm-tabs-spacing)}.searchWrapper_3rmH{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docSidebarContainer_3Kbt{margin-top:0}}@media only screen and (max-width:996px){.tableOfContents_35-E{display:none}.docItemContainer_33ec,.docItemContainer_gpai{padding:0 .3rem}}@media screen and (max-width:966px){.heroBanner_3P7f{padding:2rem}}@media screen and (max-width:576px){.announcementBarClose_38nx{width:35px}.announcementBarContent_3EUC{width:auto}.announcementBarCloseable_3myR{margin-right:35px}}@media print{.announcementBar_3WsW,.footer,.menu,.navbar,.pagination-nav,.table-of-contents{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_39YC{white-space:pre-wrap}}
\ No newline at end of file
diff --git a/website/static/img/notebook_screenshoot.png b/assets/images/notebook_screenshoot-9fb4d00eb90d069d41a895f8bf170b1f.png
similarity index 100%
rename from website/static/img/notebook_screenshoot.png
rename to assets/images/notebook_screenshoot-9fb4d00eb90d069d41a895f8bf170b1f.png
diff --git a/assets/js/13.e1b79c97.js b/assets/js/13.e1b79c97.js
new file mode 100644
index 0000000..46d7a66
--- /dev/null
+++ b/assets/js/13.e1b79c97.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[13,14],{128:function(e,t){function a(e){let t,a=[];for(let n of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(n))a.push(parseInt(n,10));else if(t=n.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,n,o,r]=t;if(n&&r){n=parseInt(n),r=parseInt(r);const e=n0&&e[a-1]===t?e:e.concat(t)},R=function(e,t){var a=e.plain,n=Object.create(null),o=e.styles.reduce((function(e,a){var n=a.languages,o=a.style;return n&&!n.includes(t)||a.types.forEach((function(t){var a=L({},e[t],o);e[t]=a})),e}),n);return o.root=a,o.plain=L({},a,{backgroundColor:null}),o};function M(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&-1===t.indexOf(n)&&(a[n]=e[n]);return a}var z=function(e){function t(){for(var t=this,a=[],n=arguments.length;n--;)a[n]=arguments[n];e.apply(this,a),w(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var a=e.theme?R(e.theme,e.language):void 0;return t.themeDict=a})),w(this,"getLineProps",(function(e){var a=e.key,n=e.className,o=e.style,r=L({},M(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(r.style=c.plain),void 0!==o&&(r.style=void 0!==r.style?L({},r.style,o):o),void 0!==a&&(r.key=a),n&&(r.className+=" "+n),r})),w(this,"getStyleForToken",(function(e){var a=e.types,n=e.empty,o=a.length,r=t.getThemeDict(t.props);if(void 0!==r){if(1===o&&"plain"===a[0])return n?{display:"inline-block"}:void 0;if(1===o&&!n)return r[a[0]];var c=n?{display:"inline-block"}:{},l=a.map((function(e){return r[e]}));return Object.assign.apply(Object,[c].concat(l))}})),w(this,"getTokenProps",(function(e){var a=e.key,n=e.className,o=e.style,r=e.token,c=L({},M(e,["key","className","style","token"]),{className:"token "+r.types.join(" "),children:r.content,style:t.getStyleForToken(r),key:void 0});return void 0!==o&&(c.style=void 0!==c.style?L({},c.style,o):o),void 0!==a&&(c.key=a),n&&(c.className+=" "+n),c})),w(this,"tokenize",(function(e,t,a,n){var o={code:t,grammar:a,language:n,tokens:[]};e.hooks.run("before-tokenize",o);var r=o.tokens=e.tokenize(o.code,o.grammar,o.language);return e.hooks.run("after-tokenize",o),r}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,a=e.language,n=e.code,o=e.children,r=this.getThemeDict(this.props),c=t.languages[a];return o({tokens:function(e){for(var t=[[]],a=[e],n=[0],o=[e.length],r=0,c=0,l=[],i=[l];c>-1;){for(;(r=n[c]++)0?u:["plain"],s=d):(u=D(u,d.type),d.alias&&(u=D(u,d.alias)),s=d.content),"string"==typeof s){var m=s.split(P),p=m.length;l.push({types:u,content:m[0]});for(var b=1;b
Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'
\n
We suggest trying baseUrl =
\n\n'}(e)).replace(/
-
-
-
-
-
diff --git a/assets/osm4scala_logo.svg.png b/assets/osm4scala_logo.svg.png
deleted file mode 100644
index 4de3989..0000000
Binary files a/assets/osm4scala_logo.svg.png and /dev/null differ
diff --git a/build.sbt b/build.sbt
deleted file mode 100644
index 3136000..0000000
--- a/build.sbt
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2021 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-import sbt.Keys._
-import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations._
-import sbtrelease.ReleasePlugin.autoImport._
-
-def isPatch211Enable(): Boolean = sys.env.getOrElse("PATCH_211", "false").toBoolean
-
-// Dependencies
-lazy val scalatestVersion = "3.2.0"
-lazy val scalacheckVersion = "1.14.3"
-lazy val commonIOVersion = "2.5"
-lazy val logbackVersion = "1.1.7"
-lazy val scoptVersion = "3.7.1"
-lazy val akkaVersion = "2.5.31"
-lazy val spark3Version = "3.1.1"
-lazy val spark2Version = "2.4.7"
-lazy val sparkDefaultVersion = spark3Version
-
-lazy val scala213 = "2.13.5"
-lazy val scala212 = "2.12.13"
-lazy val scala211 = "2.11.12"
-lazy val scalaVersions = if (isPatch211Enable()) Seq(scala211) else Seq(scala213, scala212)
-lazy val sparkScalaVersions = if (isPatch211Enable()) Seq(scala211) else Seq(scala212)
-
-lazy val commonSettings = Seq(
- crossScalaVersions := scalaVersions,
- organization := "com.acervera.osm4scala",
- organizationHomepage := Some(url("https://www.acervera.com")),
- licenses += ("MIT", url("https://opensource.org/licenses/MIT")),
- ThisBuild / homepage := Some(
- url(s"https://simplexspatial.github.io/osm4scala/")
- ),
- ThisBuild / scmInfo := Some(
- ScmInfo(
- url("https://github.com/simplexspatial/osm4scala"),
- "scm:git:git://github.com/simplexspatial/osm4scala.git",
- "scm:git:ssh://github.com:simplexspatial/osm4scala.git"
- )
- ),
- ThisBuild / developers := List(
- Developer(
- "angelcervera",
- "Angel Cervera Claudio",
- "angelcervera@silyan.com",
- url("https://www.acervera.com")
- )
- ),
- libraryDependencies ++= Seq(
- "org.scalatest" %% "scalatest" % scalatestVersion % Test,
- "org.scalacheck" %% "scalacheck" % scalacheckVersion % Test,
- "commons-io" % "commons-io" % commonIOVersion % Test
- ),
- assembly / test := {},
- scalacOptions ++= Seq(
- "-target:jvm-1.8",
- "-encoding",
- "utf8",
- "-deprecation",
- "-unchecked",
- "-Xlint"
- ),
- javacOptions ++= Seq(
- "-Xlint:all",
- "-source",
- "1.8",
- "-target",
- "1.8",
- "-parameters"
- ),
- usePgpKeyHex("A047A2C5A9AFE4850537A00DFC14CE4C2E7B7CBB"),
- publishTo := sonatypePublishToBundle.value
-)
-
-lazy val disablingPublishingSettings =
- Seq(publish / skip := true, publishArtifact := false)
-
-lazy val enablingPublishingSettings = Seq(
- publishArtifact := true, // Enable publish
- publishMavenStyle := true,
- Test / publishArtifact := false
-)
-
-lazy val disablingCoverage = Seq(coverageEnabled := false)
-
-lazy val coverageConfig =
- Seq(coverageMinimum := 80, coverageFailOnMinimum := true)
-
-lazy val exampleSettings = disablingPublishingSettings ++ disablingCoverage
-
-def generateSparkFatShadedModule(sparkVersion: String, sparkPrj: Project): Project =
- Project(
- id = s"osm4scala-spark${sparkVersion.head}-shaded",
- base = file(s"target/osm4scala-spark${sparkVersion.head}-shaded")
- )
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- crossScalaVersions := sparkScalaVersions,
- enablingPublishingSettings,
- disablingCoverage,
- name := s"osm4scala-spark${sparkVersion.head}-shaded",
- description := "Spark 2 connector for OpenStreetMap Pbf parser as shaded fat jar.",
- Compile / packageBin := (sparkPrj / Compile/ assembly).value
- )
-
-def generateSparkModule(sparkVersion: String): Project = {
-
- val baseFolder = if (sparkDefaultVersion == sparkVersion) {
- s"spark"
- } else {
- s"target/spark${sparkVersion.head}"
- }
-
- def pathFromModule(relativePath: String): String = if (sparkDefaultVersion == sparkVersion) {
- relativePath
- } else {
- s"../../spark/$relativePath"
- }
-
- Project(id = s"spark${sparkVersion.head}", base = file(baseFolder))
- .enablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- Compile / scalaSource := baseDirectory.value / pathFromModule("src/main/scala"),
- Compile / resourceDirectory := baseDirectory.value / pathFromModule("src/main/resources"),
- Test / scalaSource := baseDirectory.value / pathFromModule("src/test/scala"),
- Test / resourceDirectory := baseDirectory.value / pathFromModule("src/test/resources"),
- Test / parallelExecution := false,
- crossScalaVersions := sparkScalaVersions,
- enablingPublishingSettings,
- coverageConfig,
- name := s"osm4scala-spark${sparkVersion.head}",
- description := "Spark 2 connector for OpenStreetMap Pbf parser.",
- libraryDependencies ++= Seq(
- "org.apache.spark" %% "spark-sql" % sparkVersion % Provided
- ),
- assembly / assemblyOption := (assembly / assemblyOption).value.copy(
- includeScala = false,
- cacheUnzip = false,
- cacheOutput = false
- ),
- assembly / assemblyShadeRules := Seq(
- ShadeRule
- .rename("com.google.protobuf.**" -> "shadeproto.@1")
- .inAll
- )
- )
- .dependsOn(core)
-}
-
-lazy val spark2 = generateSparkModule(spark2Version)
-lazy val spark2FatShaded = generateSparkFatShadedModule(spark2Version, spark2)
-lazy val spark3 = generateSparkModule(spark3Version)
-lazy val spark3FatShaded = generateSparkFatShadedModule(spark3Version, spark3)
-
-
-def listOfProjects(): Seq[ProjectReference] = {
-
- val modules: Seq[ProjectReference] = Seq(
- core,
- spark2,
- spark2FatShaded,
- commonUtilities,
- examplesCounter,
- examplesCounterParallel,
- examplesCounterAkka,
- examplesTagsExtraction,
- examplesPrimitivesExtraction,
- examplesBlocksExtraction,
- examplesTakeN
- )
-
- val spark3Projects: Seq[ProjectReference] = Seq(
- spark3,
- spark3FatShaded,
- exampleSparkUtilities,
- exampleSparkDocumentation
- )
-
- val projects = modules ++ (if(isPatch211Enable()) Seq.empty else spark3Projects)
-
- println(s"PATCH_211 is ${isPatch211Enable()} so we are going to work with this list of projects: \n${projects.mkString("\t- ", "\n\t- ", "")}")
-
- projects
-}
-
-lazy val root = (project in file("."))
- .disablePlugins(AssemblyPlugin)
- .aggregate( listOfProjects(): _*)
- .settings(
- name := "osm4scala-root",
- sonatypeProfileName := "com.acervera.osm4scala",
- // crossScalaVersions must be set to Nil on the aggregating project
- crossScalaVersions := Nil,
- publish / skip := true,
- // don't use sbt-release's cross facility
- releaseCrossBuild := false,
- releaseProcess := Seq[ReleaseStep](
- checkSnapshotDependencies,
- inquireVersions,
- runClean,
- releaseStepCommandAndRemaining("+test"),
- setReleaseVersion,
- commitReleaseVersion,
- tagRelease,
- setNextVersion,
- commitNextVersion,
- pushChanges
- )
- )
-
-lazy val core = Project(id = "core", base = file("core"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- enablingPublishingSettings,
- coverageConfig,
- coverageExcludedPackages := "org.openstreetmap.osmosis.osmbinary.*",
- name := "osm4scala-core",
- description := "Scala OpenStreetMap Pbf 2 parser. Core",
- Compile / PB.targets := Seq(
- scalapb.gen(grpc = false) -> (Compile / sourceManaged).value
- )
- )
-
-// Examples
-
-lazy val commonUtilities = Project(id = "examples-common-utilities", base = file("examples/common-utilities"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- publish / skip := true,
- name := "osm4scala-examples-common-utilities",
- description := "Utilities shared by all examples",
- libraryDependencies ++= Seq("com.github.scopt" %% "scopt" % scoptVersion)
- )
- .disablePlugins(AssemblyPlugin)
-
-lazy val examplesCounter =
- Project(id = "examples-counter", base = file("examples/counter"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-counter",
- description := "Counter of primitives (Way, Node, Relation or All) using osm4scala"
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesCounterParallel = Project(id = "examples-counter-parallel", base = file("examples/counter-parallel"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-counter-parallel",
- description := "Counter of primitives (Way, Node, Relation or All) using osm4scala in parallel threads"
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesCounterAkka = Project(id = "examples-counter-akka", base = file("examples/counter-akka"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-counter-akka",
- description := "Counter of primitives (Way, Node, Relation or All) using osm4scala in parallel with AKKA",
- libraryDependencies ++= Seq(
- "com.typesafe.akka" %% "akka-actor" % akkaVersion
- )
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesTagsExtraction = Project(id = "examples-tag-extraction", base = file("examples/tagsextraction"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-tags-extraction",
- description := "Extract all unique tags from the selected primitive type (Way, Node, Relation or All) using osm4scala"
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesBlocksExtraction = Project(id = "examples-blocks-extraction", base = file("examples/blocksextraction"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-blocks-extraction",
- description := "Extract all blocks from the pbf into a folder using osm4scala."
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesBlocksWithIdExtraction = Project(id = "examples-blocks-with-id-extraction", base = file("examples/blockswithidextraction"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "examples-blocks-with-id-extraction",
- description := "Extract blocks that contains the id from the pbf into a folder using osm4scala."
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesTakeN = Project(id = "examples-takeN", base = file("examples/takeN"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-takeN",
- description := "Generate a pbf file by taking the first N blocks."
- )
- .dependsOn(core, commonUtilities)
-
-lazy val examplesPrimitivesExtraction =
- Project(id = "examples-primitives-extraction", base = file("examples/primitivesextraction"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- name := "osm4scala-examples-primitives-extraction",
- description := "Extract all primitives from the pbf into a folder using osm4scala."
- )
- .dependsOn(core, commonUtilities)
-
-
-
-lazy val exampleSparkUtilities = Project(id = "examples-spark-utilities", base = file("examples/spark-utilities"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- crossScalaVersions := Seq(scala212),
- name := "osm4scala-examples-spark-utilities",
- description := "Example of different utilities using osm4scala and Spark.",
- libraryDependencies ++= Seq(
- "org.apache.spark" %% "spark-sql" % spark3Version % Provided
- )
- )
- .dependsOn(spark3, commonUtilities)
-
-
-lazy val exampleSparkDocumentation = Project(id = "examples-spark-documentation", base = file("examples/spark-documentation"))
- .disablePlugins(AssemblyPlugin)
- .settings(
- commonSettings,
- exampleSettings,
- crossScalaVersions := Seq(scala212),
- name := "osm4scala-examples-spark-documentation",
- description := "Examples used in the documentation.",
- libraryDependencies ++= Seq(
- "org.apache.spark" %% "spark-sql" % spark3Version
- )
- )
- .dependsOn(spark3, commonUtilities)
diff --git a/code_of_conduct.md b/code_of_conduct.md
deleted file mode 100644
index 90272fe..0000000
--- a/code_of_conduct.md
+++ /dev/null
@@ -1,130 +0,0 @@
-
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, religion, or sexual identity
-and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the
- overall community
-
-Examples of unacceptable behavior include:
-
-* The use of sexualized language or imagery, and sexual attention or
- advances of any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email
- address, without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at
-[INSERT CONTACT METHOD].
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series
-of actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or
-permanent ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within
-the community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.0, available at
-https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
-
-Community Impact Guidelines were inspired by [Mozilla's code of conduct
-enforcement ladder](https://github.com/mozilla/diversity).
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see the FAQ at
-https://www.contributor-covenant.org/faq. Translations are available at
-https://www.contributor-covenant.org/translations.
-
diff --git a/core/src/main/protobuf/fileformat.proto b/core/src/main/protobuf/fileformat.proto
deleted file mode 100644
index dfc1c3b..0000000
--- a/core/src/main/protobuf/fileformat.proto
+++ /dev/null
@@ -1,54 +0,0 @@
-/** Copyright (c) 2010 Scott A. Crosby.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see .
-
-*/
-
-option optimize_for = LITE_RUNTIME;
-option java_package = "org.openstreetmap.osmosis.osmbinary";
-package OSMPBF;
-
-//protoc --java_out=../.. fileformat.proto
-
-
-//
-// STORAGE LAYER: Storing primitives.
-//
-
-message Blob {
- optional bytes raw = 1; // No compression
- optional int32 raw_size = 2; // When compressed, the uncompressed size
-
- // Possible compressed versions of the data.
- optional bytes zlib_data = 3;
-
- // PROPOSED feature for LZMA compressed data. SUPPORT IS NOT REQUIRED.
- optional bytes lzma_data = 4;
-
- // Formerly used for bzip2 compressed data. Depreciated in 2010.
- optional bytes OBSOLETE_bzip2_data = 5 [deprecated=true]; // Don't reuse this tag number.
-}
-
-/* A file contains an sequence of fileblock headers, each prefixed by
-their length in network byte order, followed by a data block
-containing the actual data. types staring with a "_" are reserved.
-*/
-
-message BlobHeader {
- required string type = 1;
- optional bytes indexdata = 2;
- required int32 datasize = 3;
-}
-
-
diff --git a/core/src/main/protobuf/osmformat.proto b/core/src/main/protobuf/osmformat.proto
deleted file mode 100644
index 659b8c8..0000000
--- a/core/src/main/protobuf/osmformat.proto
+++ /dev/null
@@ -1,260 +0,0 @@
-/** Copyright (c) 2010 Scott A. Crosby.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see .
-
-*/
-
-option optimize_for = LITE_RUNTIME;
-option java_package = "org.openstreetmap.osmosis.osmbinary";
-package OSMPBF;
-
-/* OSM Binary file format
-
-This is the master schema file of the OSM binary file format. This
-file is designed to support limited random-access and future
-extendability.
-
-A binary OSM file consists of a sequence of FileBlocks (please see
-fileformat.proto). The first fileblock contains a serialized instance
-of HeaderBlock, followed by a sequence of PrimitiveBlock blocks that
-contain the primitives.
-
-Each primitiveblock is designed to be independently parsable. It
-contains a string table storing all strings in that block (keys and
-values in tags, roles in relations, usernames, etc.) as well as
-metadata containing the precision of coordinates or timestamps in that
-block.
-
-A primitiveblock contains a sequence of primitive groups, each
-containing primitives of the same type (nodes, densenodes, ways,
-relations). Coordinates are stored in signed 64-bit integers. Lat&lon
-are measured in units nanodegrees. The default of
-granularity of 100 nanodegrees corresponds to about 1cm on the ground,
-and a full lat or lon fits into 32 bits.
-
-Converting an integer to a lattitude or longitude uses the formula:
-$OUT = IN * granularity / 10**9$. Many encoding schemes use delta
-coding when representing nodes and relations.
-
-*/
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-/* Contains the file header. */
-
-message HeaderBlock {
- optional HeaderBBox bbox = 1;
- /* Additional tags to aid in parsing this dataset */
- repeated string required_features = 4;
- repeated string optional_features = 5;
-
- optional string writingprogram = 16;
- optional string source = 17; // From the bbox field.
-
- /* Tags that allow continuing an Osmosis replication */
-
- // replication timestamp, expressed in seconds since the epoch,
- // otherwise the same value as in the "timestamp=..." field
- // in the state.txt file used by Osmosis
- optional int64 osmosis_replication_timestamp = 32;
-
- // replication sequence number (sequenceNumber in state.txt)
- optional int64 osmosis_replication_sequence_number = 33;
-
- // replication base URL (from Osmosis' configuration.txt file)
- optional string osmosis_replication_base_url = 34;
-}
-
-
-/** The bounding box field in the OSM header. BBOX, as used in the OSM
-header. Units are always in nanodegrees -- they do not obey
-granularity rules. */
-
-message HeaderBBox {
- required sint64 left = 1;
- required sint64 right = 2;
- required sint64 top = 3;
- required sint64 bottom = 4;
-}
-
-
-///////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////
-
-
-message PrimitiveBlock {
- required StringTable stringtable = 1;
- repeated PrimitiveGroup primitivegroup = 2;
-
- // Granularity, units of nanodegrees, used to store coordinates in this block
- optional int32 granularity = 17 [default=100];
- // Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
- optional int64 lat_offset = 19 [default=0];
- optional int64 lon_offset = 20 [default=0];
-
-// Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
- optional int32 date_granularity = 18 [default=1000];
-
-
- // Proposed extension:
- //optional BBox bbox = XX;
-}
-
-// Group of OSMPrimitives. All primitives in a group must be the same type.
-message PrimitiveGroup {
- repeated Node nodes = 1;
- optional DenseNodes dense = 2;
- repeated Way ways = 3;
- repeated Relation relations = 4;
- repeated ChangeSet changesets = 5;
-}
-
-
-/** String table, contains the common strings in each block.
-
- Note that we reserve index '0' as a delimiter, so the entry at that
- index in the table is ALWAYS blank and unused.
-
- */
-message StringTable {
- repeated bytes s = 1;
-}
-
-/* Optional metadata that may be included into each primitive. */
-message Info {
- optional int32 version = 1 [default = -1];
- optional int64 timestamp = 2;
- optional int64 changeset = 3;
- optional int32 uid = 4;
- optional uint32 user_sid = 5; // String IDs
-
- // The visible flag is used to store history information. It indicates that
- // the current object version has been created by a delete operation on the
- // OSM API.
- // When a writer sets this flag, it MUST add a required_features tag with
- // value "HistoricalInformation" to the HeaderBlock.
- // If this flag is not available for some object it MUST be assumed to be
- // true if the file has the required_features tag "HistoricalInformation"
- // set.
- optional bool visible = 6;
-}
-
-/** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. */
-message DenseInfo {
- repeated int32 version = 1 [packed = true];
- repeated sint64 timestamp = 2 [packed = true]; // DELTA coded
- repeated sint64 changeset = 3 [packed = true]; // DELTA coded
- repeated sint32 uid = 4 [packed = true]; // DELTA coded
- repeated sint32 user_sid = 5 [packed = true]; // String IDs for usernames. DELTA coded
-
- // The visible flag is used to store history information. It indicates that
- // the current object version has been created by a delete operation on the
- // OSM API.
- // When a writer sets this flag, it MUST add a required_features tag with
- // value "HistoricalInformation" to the HeaderBlock.
- // If this flag is not available for some object it MUST be assumed to be
- // true if the file has the required_features tag "HistoricalInformation"
- // set.
- repeated bool visible = 6 [packed = true];
-}
-
-
-// THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW.
-// TODO: REMOVE THIS?
-message ChangeSet {
- required int64 id = 1;
-//
-// // Parallel arrays.
-// repeated uint32 keys = 2 [packed = true]; // String IDs.
-// repeated uint32 vals = 3 [packed = true]; // String IDs.
-//
-// optional Info info = 4;
-
-// optional int64 created_at = 8;
-// optional int64 closetime_delta = 9;
-// optional bool open = 10;
-// optional HeaderBBox bbox = 11;
-}
-
-
-message Node {
- required sint64 id = 1;
- // Parallel arrays.
- repeated uint32 keys = 2 [packed = true]; // String IDs.
- repeated uint32 vals = 3 [packed = true]; // String IDs.
-
- optional Info info = 4; // May be omitted in omitmeta
-
- required sint64 lat = 8;
- required sint64 lon = 9;
-}
-
-/* Used to densly represent a sequence of nodes that do not have any tags.
-
-We represent these nodes columnwise as five columns: ID's, lats, and
-lons, all delta coded. When metadata is not omitted,
-
-We encode keys & vals for all nodes as a single array of integers
-containing key-stringid and val-stringid, using a stringid of 0 as a
-delimiter between nodes.
-
- ( ()* '0' )*
- */
-
-message DenseNodes {
- repeated sint64 id = 1 [packed = true]; // DELTA coded
-
- //repeated Info info = 4;
- optional DenseInfo denseinfo = 5;
-
- repeated sint64 lat = 8 [packed = true]; // DELTA coded
- repeated sint64 lon = 9 [packed = true]; // DELTA coded
-
- // Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
- repeated int32 keys_vals = 10 [packed = true];
-}
-
-
-message Way {
- required int64 id = 1;
- // Parallel arrays.
- repeated uint32 keys = 2 [packed = true];
- repeated uint32 vals = 3 [packed = true];
-
- optional Info info = 4;
-
- repeated sint64 refs = 8 [packed = true]; // DELTA coded
-}
-
-message Relation {
- enum MemberType {
- NODE = 0;
- WAY = 1;
- RELATION = 2;
- }
- required int64 id = 1;
-
- // Parallel arrays.
- repeated uint32 keys = 2 [packed = true];
- repeated uint32 vals = 3 [packed = true];
-
- optional Info info = 4;
-
- // Parallel arrays
- repeated int32 roles_sid = 8 [packed = true];
- repeated sint64 memids = 9 [packed = true]; // DELTA encoded
- repeated MemberType types = 10 [packed = true];
-}
-
diff --git a/core/src/main/scala/com/acervera/osm4scala/BlobTupleIterator.scala b/core/src/main/scala/com/acervera/osm4scala/BlobTupleIterator.scala
deleted file mode 100644
index 5832ede..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/BlobTupleIterator.scala
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala
-
-import org.openstreetmap.osmosis.osmbinary.fileformat.{Blob, BlobHeader}
-
-import java.io._
-
-object BlobTupleIterator {
-
- /**
- * Create a new BlobTupleIterator iterator to iterate over all Blobs,
- * until the end of the stream.
- *
- * @param pbfInputStream Opened InputStream that contains the pbf
- * @return
- */
- def fromPbf(pbfInputStream: InputStream): BlobTupleIterator = new BlobTupleIterator(new DefaultInputStreamSentinel(pbfInputStream))
-
- /**
- * Create a new BlobTupleIterator iterator to iterate over all Blobs,
- * until the end of the stream or until the Sentinel stop it.
- *
- * @param pbfInputStream InputStream object to process with sentinel logic.
- * @return
- */
- def fromPbf(pbfInputStream: InputStreamSentinel): BlobTupleIterator = new BlobTupleIterator(pbfInputStream)
-
-}
-
-/**
- * Iterator over a OSM file in pbf format.
- * Each item is a tuple of BlobHeader and Blob
- *
- * @param pbfInputStream Input stream that will be used to read the fileblock
- * @author angelcervera
- */
-class BlobTupleIterator(pbfInputStream: InputStreamSentinel) extends Iterator[(BlobHeader, Blob)] {
-
- // Read the input stream using DataInputStream to access easily to Int and raw fields.
- private val pbfStream = new DataInputStream(pbfInputStream)
-
- // Store the next block header size. None if there are not more to read.
- var nextHeaderSize: Option[Int] = None
-
- // Read the length of the next block
- readNextBlockLength()
-
- override def hasNext: Boolean = pbfInputStream.continueReading() && nextHeaderSize.isDefined
-
- override def next(): (BlobHeader, Blob) = {
-
- // Reading header.
- val bufferBlobHeader = new Array[Byte](nextHeaderSize.get)
- pbfStream.readFully(bufferBlobHeader)
-
- // Parsing pbf header.
- val blobHeader = BlobHeader parseFrom bufferBlobHeader
-
- // Read the next block
- val bufferBlob = new Array[Byte](blobHeader.datasize)
- pbfStream.readFully(bufferBlob)
- val blob = Blob parseFrom bufferBlob
-
- // Move to the next pair.
- readNextBlockLength()
-
- (blobHeader, blob)
-
- }
-
- /**
- * Read the next osm pbf block
- */
- private def readNextBlockLength(): Unit =
- try {
- nextHeaderSize = Some(pbfStream.readInt)
- } catch {
- case _: EOFException => nextHeaderSize = None
- }
-
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/DenseNodesIterator.scala b/core/src/main/scala/com/acervera/osm4scala/DenseNodesIterator.scala
deleted file mode 100644
index 4af2e2b..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/DenseNodesIterator.scala
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala
-
-import com.acervera.osm4scala.model.{Info, NodeEntity}
-import com.acervera.osm4scala.utilities.StringTableUtils._
-import org.openstreetmap.osmosis.osmbinary.osmformat.{DenseInfo, DenseNodes, StringTable}
-
-import java.time.Instant
-
-object DenseNodesIterator {
-
- def apply(osmosisStringTable: StringTable, osmosisDenseNode: DenseNodes): DenseNodesIterator =
- new DenseNodesIterator(osmosisStringTable, osmosisDenseNode)
-
-}
-
-/**
- * Iterator over a DenseDataNode block.
- * By default, lanOffset, longOffset and graularity is 0, 0 and 100 because I did not found pbf files with other values.
- *
- * @param osmosisStringTable
- * @param osmosisDenseNode
- * @param latOffset
- * @param lonOffset
- * @param granularity
- */
-class DenseNodesIterator(osmosisStringTable: StringTable,
- osmosisDenseNode: DenseNodes,
- latOffset: Long = 0,
- lonOffset: Long = 0,
- granularity: Int = 100)
- extends Iterator[NodeEntity] {
-
- if (osmosisDenseNode.denseinfo.isDefined && osmosisDenseNode.denseinfo.get.visible.exists(b => !b)) {
- throw new Exception("Only visible nodes are implemented.")
- }
-
- private val idIterator = osmosisDenseNode.id.iterator
- private val lonIterator = osmosisDenseNode.lon.iterator
- private val latIterator = osmosisDenseNode.lat.iterator
- private val tagsIterator = osmosisDenseNode.keysVals.iterator
- private val infoIterator = InfoIterator(osmosisDenseNode.denseinfo)
-
- // Delta references
- var lastId = 0L
- var lastLatitude = 0.0
- var lastLongitude = 0.0
-
- override def hasNext: Boolean = idIterator.hasNext
-
- override def next(): NodeEntity = {
-
- // Calculate new values base in deltas and update deltas
- lastId = idIterator.next() + lastId
- lastLatitude = decompressCoord(latOffset, latIterator.next(), lastLatitude)
- lastLongitude = decompressCoord(lonOffset, lonIterator.next(), lastLongitude)
-
- // Create node
- NodeEntity(
- lastId,
- lastLatitude,
- lastLongitude,
- osmosisStringTable.extractTags(tagsIterator.takeWhile(_ != 0L)),
- infoIterator.next()
- )
-
- }
-
- /**
- * Calculate coordinate applying offset, granularity and delta.
- *
- * @param offSet
- * @param delta
- * @param currentValue
- * @return
- */
- def decompressCoord(offSet: Long, delta: Long, currentValue: Double): Double = {
- (.000000001 * (offSet + (granularity * delta))) + currentValue
- }
-
- // Decode DenseInfo
-
- trait InfoIterator extends Iterator[Option[Info]]
-
- class InfoIteratorDeltas(denseInfo: DenseInfo) extends InfoIterator {
- val versionIterator = denseInfo.version.iterator
- val timestampIterator = denseInfo.timestamp.iterator
- val changesetIterator = denseInfo.changeset.iterator
- val uidIterator = denseInfo.uid.iterator
- val userNameIterator = denseInfo.userSid.iterator
- val visibleIterator = denseInfo.visible.iterator
-
- var lastTimestamp = 0L
- var lastChangeset = 0L
- var lastUserId = 0
- var lastUserName = 0
-
- override def hasNext: Boolean =
- versionIterator.hasNext ||
- timestampIterator.hasNext ||
- changesetIterator.hasNext ||
- uidIterator.hasNext ||
- userNameIterator.hasNext ||
- visibleIterator.hasNext
-
- override def next(): Option[Info] = {
-
- val newTimestamp = if (timestampIterator.hasNext) {
- lastTimestamp = lastTimestamp + timestampIterator.next()
- Some(Instant.ofEpochSecond(lastTimestamp))
- } else {
- None
- }
-
- val newChangeset = if (changesetIterator.hasNext) {
- lastChangeset = lastChangeset + changesetIterator.next()
- Some(lastChangeset)
- } else {
- None
- }
-
- val newUserId = if (uidIterator.hasNext) {
- lastUserId = lastUserId + uidIterator.next()
- Some(lastUserId)
- } else {
- None
- }
-
- val newUserName = if (userNameIterator.hasNext) {
- lastUserName = lastUserName + userNameIterator.next()
- Some(osmosisStringTable.getString(lastUserName))
- } else {
- None
- }
-
- val info = Info(
- version = if (versionIterator.hasNext) Some(versionIterator.next()) else None,
- timestamp = newTimestamp,
- changeset = newChangeset,
- userId = newUserId,
- userName = newUserName,
- visible = if (visibleIterator.hasNext) Some(visibleIterator.next()) else None
- )
-
- Some(info)
- }
- }
-
- object InfoIterator {
- def apply(denseInfo: Option[DenseInfo]): InfoIterator = denseInfo match {
- case None => InfoIteratorNone
- case Some(info) => new InfoIteratorDeltas(info)
- }
- }
-
- object InfoIteratorNone extends InfoIterator {
- override def next(): Option[Info] = None
- override def hasNext: Boolean = true
- }
-
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/EntityIterator.scala b/core/src/main/scala/com/acervera/osm4scala/EntityIterator.scala
deleted file mode 100644
index bfd702d..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/EntityIterator.scala
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala
-
-import java.io.InputStream
-
-import com.acervera.osm4scala.model.OSMEntity
-import org.openstreetmap.osmosis.osmbinary.fileformat.Blob
-
-/**
- * Iterable process all entities.
- */
-trait EntityIterator extends Iterator[OSMEntity]
-
-/**
- * Factory to create EntityIterator objects from different sources.
- */
-object EntityIterator {
-
- /**
- * Create an iterator to iterate over all entities in the InputStream.
- *
- * @param pbfInputStream InputStream object to process
- * @return Iterator
- */
- def fromPbf(pbfInputStream: InputStream): EntityIterator =
- new FromPbfFileEntitiesIterator(new DefaultInputStreamSentinel(pbfInputStream))
-
- /**
- * Create an iterator to iterate over all entities in the InputStream,
- * until the end of the stream or until the Sentinel stop it.
- *
- * @param pbfInputStream InputStream object to process with sentinel logic.
- * @return Iterator
- */
- def fromPbf(pbfInputStream: InputStreamSentinel): EntityIterator = new FromPbfFileEntitiesIterator(pbfInputStream)
-
- /**
- * Create an iterator to iterate over all entities in th Blob.
- *
- * @param blob Blob object to process
- * @return Iterator
- */
- def fromBlob(blob: Blob): EntityIterator = new FromBlobEntitiesIterator(blob)
-
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/FromBlobEntitiesIterator.scala b/core/src/main/scala/com/acervera/osm4scala/FromBlobEntitiesIterator.scala
deleted file mode 100644
index 0ed9985..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/FromBlobEntitiesIterator.scala
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala
-
-import com.acervera.osm4scala.model.{OSMEntity, RelationEntity, WayEntity}
-import com.acervera.osm4scala.utilities.Osm4ScalaUtils
-import com.acervera.osm4scala.utilities.PrimitiveGroupType._
-import org.openstreetmap.osmosis.osmbinary.fileformat.Blob
-import org.openstreetmap.osmosis.osmbinary.osmformat.PrimitiveBlock
-
-/**
- * Iterate over all OSMEntities in a FileBlock.
- * The Blob content must be a "OSMData" FileBlock
- */
-class FromBlobEntitiesIterator(blob: Blob) extends EntityIterator with Osm4ScalaUtils {
-
- // Read the input stream using DataInputStream to access easily to Int and raw fields. The source could be compressed.
- private val primitiveBlock = PrimitiveBlock parseFrom dataInputStreamBlob(blob)
-
- private var primitiveGroupIdx = 0
- private var osmEntityIdx = 0
- private var denseNodesIterator: Option[DenseNodesIterator] = None
-
- override def hasNext: Boolean = primitiveBlock.primitivegroup.size != primitiveGroupIdx
-
- override def next(): OSMEntity = {
-
- val currentPrimitiveGroup = primitiveBlock.primitivegroup(primitiveGroupIdx)
-
- /**
- * Move to the next primitive group.
- */
- def nextPrimitiveGroup(): Unit = {
- primitiveGroupIdx += 1
- osmEntityIdx = 0
- }
-
- /**
- * Extract one relation from the primitive group.
- */
- def extractRelationPrimitiveGroup: RelationEntity = {
- val currentRelation = currentPrimitiveGroup.relations(osmEntityIdx)
-
- osmEntityIdx += 1
- if (currentPrimitiveGroup.relations.size == osmEntityIdx) nextPrimitiveGroup()
-
- RelationEntity(primitiveBlock.stringtable, currentRelation)
- }
-
- /**
- * Extract one way from the primitive group.
- */
- def extractWayPrimitiveGroup() = {
- val currentWay = currentPrimitiveGroup.ways(osmEntityIdx)
-
- osmEntityIdx += 1
- if (currentPrimitiveGroup.ways.size == osmEntityIdx) nextPrimitiveGroup()
-
- WayEntity(primitiveBlock.stringtable, currentWay)
- }
-
- /**
- * Extract one node from the densde nodes primitive group.
- */
- def extractDenseNodePrimitiveGroup() = {
- // If it is the first time, create the iterator.
- if (denseNodesIterator.isEmpty) {
- denseNodesIterator = Some(DenseNodesIterator(primitiveBlock.stringtable, currentPrimitiveGroup.dense.get))
- }
-
- // At least, one element.
- val node = denseNodesIterator.get.next()
-
- if (!denseNodesIterator.get.hasNext) {
- denseNodesIterator = None
- nextPrimitiveGroup()
- }
-
- node
- }
-
- // Only one type per primitive group.
- detectType(currentPrimitiveGroup) match {
- case Relations => extractRelationPrimitiveGroup
- case Nodes => throw new NotImplementedError("Nodes does not implemented yet.")
- case Ways => extractWayPrimitiveGroup()
- case ChangeSets => throw new NotImplementedError("Changeset does not implemented yet")
- case DenseNodes => extractDenseNodePrimitiveGroup()
- case _ => throw new Exception("Unknown primitive group found.")
- }
-
- }
-
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/FromPbfFileEntitiesIterator.scala b/core/src/main/scala/com/acervera/osm4scala/FromPbfFileEntitiesIterator.scala
deleted file mode 100644
index faadd4a..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/FromPbfFileEntitiesIterator.scala
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala
-
-import com.acervera.osm4scala.model.OSMEntity
-
-/**
- * Iterator over all entities in a pbf file, or until the Sentinel stop it.
- * Every item is a OSMEntity object.
- *
- * @param pbfInputStream Input stream with Sentinel logic.
- * @author angelcervera
- */
-class FromPbfFileEntitiesIterator(pbfInputStream: InputStreamSentinel) extends EntityIterator {
-
- // Iterator over OSMData blocks
- private val blobIterator = BlobTupleIterator
- .fromPbf(pbfInputStream)
- .withFilter { case (blobHeader, _) => blobHeader.`type` == "OSMData" }
-
- // Iterator entities in active block
- private var osmEntitiesIterator: Option[EntityIterator] = readNextBlock()
-
- override def hasNext: Boolean =
- osmEntitiesIterator.isDefined && (osmEntitiesIterator.get.hasNext || blobIterator.hasNext)
-
- override def next(): OSMEntity = {
- val nextEntity = osmEntitiesIterator.get.next()
-
- if (!osmEntitiesIterator.get.hasNext) {
- osmEntitiesIterator = readNextBlock()
- }
-
- nextEntity
- }
-
- /**
- * Read the next osm pbf block
- */
- private def readNextBlock() =
- if (blobIterator.hasNext) {
- Some(EntityIterator.fromBlob(blobIterator.next()._2))
- } else {
- None
- }
-
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/InputStreamSentinel.scala b/core/src/main/scala/com/acervera/osm4scala/InputStreamSentinel.scala
deleted file mode 100644
index 41f8fc7..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/InputStreamSentinel.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2020 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala
-
-import java.io.{FilterInputStream, InputStream}
-
-trait InputStreamSentinel extends InputStream {
- def continueReading(): Boolean
-}
-
-class DefaultInputStreamSentinel(in: InputStream) extends FilterInputStream(in) with InputStreamSentinel {
- override def continueReading(): Boolean = true
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/model/model.scala b/core/src/main/scala/com/acervera/osm4scala/model/model.scala
deleted file mode 100644
index 0a8328f..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/model/model.scala
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2021 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala.model
-
-import com.acervera.osm4scala.utilities.StringTableUtils._
-import org.openstreetmap.osmosis.osmbinary.osmformat
-
-import java.time.Instant
-
-final object OSMTypes extends Enumeration {
- type osmType = Value
- val Way, Node, Relation = Value
-}
-
-sealed trait OSMEntity {
- val osmModel: OSMTypes.Value
- val id: Long
- val tags: Map[String, String]
- val info: Option[Info]
-}
-
-case class Info(
- version: Option[Int] = None,
- timestamp: Option[Instant] = None,
- changeset: Option[Long] = None,
- userId: Option[Int] = None,
- userName: Option[String] = None,
- visible: Option[Boolean] = None
-)
-
-object Info {
- def apply(osmosisStringTable: osmformat.StringTable, infoOpt: Option[osmformat.Info]): Option[Info] =
- infoOpt.map {
- case info =>
- Info(
- info.version,
- info.timestamp.map(Instant.ofEpochSecond),
- info.changeset,
- info.uid,
- info.userSid.map(idx => osmosisStringTable.getString(idx))
- )
- }
-
- def empty(): Info = Info()
-
-}
-
-/**
- * Entity that represent a OSM node as https://wiki.openstreetmap.org/wiki/Elements#Node and https://wiki.openstreetmap.org/wiki/Node describe
- */
-case class NodeEntity(
- id: Long,
- latitude: Double,
- longitude: Double,
- tags: Map[String, String],
- info: Option[Info] = None
-) extends OSMEntity {
- override val osmModel: OSMTypes.Value = OSMTypes.Node
-}
-
-/**
- * Entity that represent a OSM way as https://wiki.openstreetmap.org/wiki/Elements#Way and https://wiki.openstreetmap.org/wiki/Way describe
- */
-case class WayEntity(
- id: Long,
- nodes: Seq[Long],
- tags: Map[String, String],
- info: Option[Info] = None
-) extends OSMEntity {
- override val osmModel: OSMTypes.Value = OSMTypes.Way
-}
-
-object WayEntity {
- def apply(osmosisStringTable: osmformat.StringTable, osmosisWay: osmformat.Way): WayEntity =
- new WayEntity(
- osmosisWay.id,
- osmosisWay.refs
- .scanLeft(0L) { _ + _ }
- .drop(1), // Calculate nodes references in stored in delta compression. TODO: extract to utility class.
- osmosisStringTable.extractTags(osmosisWay.keys, osmosisWay.vals),
- Info(osmosisStringTable, osmosisWay.info)
- )
-}
-
-/**
- * Entity that represent a OSM relation as https://wiki.openstreetmap.org/wiki/Elements#Relation and https://wiki.openstreetmap.org/wiki/Relation describe
- */
-case class RelationEntity(
- id: Long,
- relations: Seq[RelationMemberEntity],
- tags: Map[String, String],
- info: Option[Info] = None
-) extends OSMEntity {
- override val osmModel: OSMTypes.Value = OSMTypes.Relation
-}
-
-object RelationEntity {
- def apply(osmosisStringTable: osmformat.StringTable, osmosisRelation: osmformat.Relation): RelationEntity = {
-
- // Calculate relations
- val relations = (
- osmosisRelation.memids
- .scanLeft(0L) { _ + _ }
- .drop(1), // Decode members references in stored in delta compression. TODO: extract to utility class.
- osmosisRelation.types,
- osmosisRelation.rolesSid
- ).zipped.map { (m, t, r) =>
- RelationMemberEntity(m, RelationMemberEntityTypes(t.value), osmosisStringTable.getString(r))
- }
-
- new RelationEntity(
- osmosisRelation.id,
- relations,
- osmosisStringTable.extractTags(osmosisRelation.keys, osmosisRelation.vals),
- Info(osmosisStringTable, osmosisRelation.info)
- )
- }
-}
-
-object RelationMemberEntityTypes extends Enumeration {
- type RelationMemberEntityTypes = Value
- val Node = Value(0)
- val Way = Value(1)
- val Relation = Value(2)
- val Unrecognized = Value(3)
-}
-
-case class RelationMemberEntity(
- id: Long,
- relationTypes: RelationMemberEntityTypes.Value,
- role: String
-)
diff --git a/core/src/main/scala/com/acervera/osm4scala/utilities/Osm4ScalaUtils.scala b/core/src/main/scala/com/acervera/osm4scala/utilities/Osm4ScalaUtils.scala
deleted file mode 100644
index 4cb2afd..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/utilities/Osm4ScalaUtils.scala
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala.utilities
-
-import java.io.{ByteArrayInputStream, DataInputStream}
-import java.util.zip.Inflater
-
-import org.openstreetmap.osmosis.osmbinary.fileformat.Blob
-import org.openstreetmap.osmosis.osmbinary.osmformat.PrimitiveGroup
-
-object PrimitiveGroupType extends Enumeration {
- type PrimitiveGroupType = Value
- val Relations, Nodes, Ways, ChangeSets, DenseNodes, Unknown = Value
-}
-
-/**
- * Utilities to manage primitive groups.
- */
-trait Osm4ScalaUtils {
-
- import PrimitiveGroupType._
-
- /**
- * Detect the type of group.
- *
- * @param group PrimitiveGroup object too be analysed.
- * @return Group detected ot Unknown if it is Unknown.
- */
- def detectType(group: PrimitiveGroup): PrimitiveGroupType = group match {
- case _ if group.relations.nonEmpty => Relations
- case _ if group.nodes.nonEmpty => Nodes
- case _ if group.ways.nonEmpty => Ways
- case _ if group.changesets.nonEmpty => ChangeSets
- case _ if group.dense.isDefined => DenseNodes
- case _ => Unknown
- }
-
- /**
- * Generate an easy readable DataInputStream from a Blob.
- *
- * Because is a DataInputStream, it is really easily to access to Int and raw fields.
- * The source could be compressed, so we decompress it before read.
- * Follow the specification, every Blob can not be more of 32Mb, so we will not have memory problems.
- *
- * @param blob Blob from we extracted and uncompress the content.
- * @return A DataInputStream ready to read.
- */
- def dataInputStreamBlob(blob: Blob): DataInputStream = blob match {
- case _ if blob.raw.isDefined => new DataInputStream(new ByteArrayInputStream(blob.raw.get.toByteArray))
- case _ if blob.zlibData.isDefined =>
- // Uncompress
- val inflater = new Inflater()
- val decompressedData = new Array[Byte](blob.rawSize.get)
- inflater.setInput(blob.zlibData.get.toByteArray)
- inflater.inflate(decompressedData)
- inflater.end()
-
- new DataInputStream(new ByteArrayInputStream(decompressedData))
- case _ => throw new Exception("Data not found even compressed.")
- }
-}
diff --git a/core/src/main/scala/com/acervera/osm4scala/utilities/StringTableUtils.scala b/core/src/main/scala/com/acervera/osm4scala/utilities/StringTableUtils.scala
deleted file mode 100644
index d9a54af..0000000
--- a/core/src/main/scala/com/acervera/osm4scala/utilities/StringTableUtils.scala
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2020 Ángel Cervera Claudio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-package com.acervera.osm4scala.utilities
-
-import org.openstreetmap.osmosis.osmbinary.osmformat.StringTable
-
-/**
- * Utilities to extract data from StringTable Objects.
- */
-private[osm4scala] object StringTableUtils {
-
- private val CHARSET = "UTF-8"
-
- implicit class StringTableEnricher(stringTable: StringTable) {
-
- /**
- * From a sequence of keys and values indexes, it creates a Map of tags.
- *
- * @param keys Sequence of indexes pointing to strings used as keys
- * @param values Sequence of indexes pointing to strings used as values
- * @return Map with tags.
- */
- def extractTags(keys: Seq[Int], values: Seq[Int]): Map[String, String] =
- (keys, values).zipped.map { (key, value) =>
- stringTable.s(key).toString(CHARSET) -> stringTable.s(value).toString(CHARSET)
- }.toMap
-
- /**
- * From a sequence of indexes following the sequence pattern `(key,value)*`, it creates a Map of tags.
- *
- * @param keyValueSequence key,value sequence.
- * @return Map with tags.
- */
- def extractTags(keyValueSequence: Iterator[Int]): Map[String, String] =
- keyValueSequence
- .grouped(2)
- .map(tag => stringTable.s(tag.head).toString(CHARSET) -> stringTable.s(tag.last).toString(CHARSET))
- .toMap
-
- /**
- * Extract String from the String table.
- *
- * @param idx String index.
- * @return Proper Scala String.
- */
- def getString(idx: Int): String = stringTable.s(idx).toString(CHARSET)
-
- }
-
-}
diff --git a/core/src/test/resources/com/acervera/osm4scala/Madrid.bbbike.osm.pbf b/core/src/test/resources/com/acervera/osm4scala/Madrid.bbbike.osm.pbf
deleted file mode 100644
index bc8387e..0000000
Binary files a/core/src/test/resources/com/acervera/osm4scala/Madrid.bbbike.osm.pbf and /dev/null differ
diff --git a/core/src/test/resources/com/acervera/osm4scala/fileblock/seven_blocks.pbf b/core/src/test/resources/com/acervera/osm4scala/fileblock/seven_blocks.pbf
deleted file mode 100644
index 2bc9492..0000000
Binary files a/core/src/test/resources/com/acervera/osm4scala/fileblock/seven_blocks.pbf and /dev/null differ
diff --git a/core/src/test/resources/com/acervera/osm4scala/fileblock/ten_blocks.pbf b/core/src/test/resources/com/acervera/osm4scala/fileblock/ten_blocks.pbf
deleted file mode 100644
index 70ffcbd..0000000
Binary files a/core/src/test/resources/com/acervera/osm4scala/fileblock/ten_blocks.pbf and /dev/null differ
diff --git a/core/src/test/resources/com/acervera/osm4scala/fileblock/three_blocks.pbf b/core/src/test/resources/com/acervera/osm4scala/fileblock/three_blocks.pbf
deleted file mode 100644
index aca7e82..0000000
Binary files a/core/src/test/resources/com/acervera/osm4scala/fileblock/three_blocks.pbf and /dev/null differ
diff --git a/core/src/test/resources/com/acervera/osm4scala/monaco-anonymized.osm.pbf b/core/src/test/resources/com/acervera/osm4scala/monaco-anonymized.osm.pbf
deleted file mode 100644
index 2bc9492..0000000
Binary files a/core/src/test/resources/com/acervera/osm4scala/monaco-anonymized.osm.pbf and /dev/null differ
diff --git a/core/src/test/resources/com/acervera/osm4scala/primitives/dense/dense b/core/src/test/resources/com/acervera/osm4scala/primitives/dense/dense
deleted file mode 100644
index e92f777..0000000
--- a/core/src/test/resources/com/acervera/osm4scala/primitives/dense/dense
+++ /dev/null
@@ -1,568 +0,0 @@
-
-H*ʨ؝ҋҚ-"ڡΤ ڈ $OC¥
ܜ
0|"V7?ҽjhP
-M6K³Ӿ
-NӪ Ⲩ:،ΥDأǧy=Xʊy̺iM?
-
-e6'0żƈy5*uL
$ȕ`/#Ռb
-
̽GA
Jp¯9
-
p HЭEv؉
\Д48ù ?⡻ڈ'#( 'JUމ.'+7Sg~# ߙK
- >Ҭ.)n4و
- /?Ɂ+<ꫭ¥ؾ(&¢
-
ℑ$ʠ3!亱6Ǿ?
賁#6
-)إ"
-9Ҍꈯ
-ޗI5'+
-
-
-< iگC
-
-6ڬ
- a
-ևҴܹܹԻ2w
-DŽ>e
_
-
-\ Ƌʖ
ʅA
-W橇0#>
-T>[o®
-Ȅʳj!
ԝ
- IҜ"V̺9 ܁ ҟ '$L֘6»͌w
-؈ "榯
ޥ Ͽ$5 ꥶ0(!,"+(T$6=2 c; Ƒ}A +țL֮ԑ7I*
->
-
-X
- @@@@ }ſ| ((( (sss (
-
l l l鱁k 3'_m 55̕;̕;lXX *뿌) __ WW> ˰WWɅڬWجW wהw @@@D΅ ww Ʌ 梄 W ,,W О-렟W 젟W F WW WWȋ]ǴVVV &]ܞ܃&Ҿ\Ҿ\Ҿ\
q U
ُù\Q ğP ׇpՆ9 YY __ 62 z zmmmm y )LL ǿl 5ĭ5ĭ5 7 l yC 5 _ D 2ƱUҼ# y5 3 i5 5̔s= ΠE. 1 έ MM88 ΎT S R ߽R 19Y b?? I Ip&֓1`x11 [I _م/J ŁtF -- - - , 7 L 0"R8N N N E /BB !! [ S ϠE ϠEϠE ϠE ϠEϠE $˗E ++̌+ˌ+ ͘r͘r :: .. rr.. rr rr r
ͽdͽd șÃN DDθT( ԆD MM * G oDH Ȉ&