diff --git a/.babelrc b/.babelrc index 67cc4b7354..a2e1b77b2f 100644 --- a/.babelrc +++ b/.babelrc @@ -36,4 +36,4 @@ "@babel/proposal-object-rest-spread", "@babel/plugin-proposal-optional-chaining" ] -} \ No newline at end of file +} diff --git a/.defaults.env b/.defaults.env index fc3f779160..afb9130423 100644 --- a/.defaults.env +++ b/.defaults.env @@ -8,7 +8,7 @@ SHORTLINK_DOMAIN="hub.link" RETICULUM_SERVER="dev.reticulum.io" # CORS proxy. -CORS_PROXY_SERVER="cors-proxy-dev.reticulum.io" +CORS_PROXY_SERVER="hubs-proxy.com" # The thumbnailing backend to connect to. # See here for the server code: https://github.com/MozillaReality/farspark or https://github.com/MozillaReality/nearspark diff --git a/.eslintrc.js b/.eslintrc.js index 79ffa7998f..98281e34c5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,8 @@ module.exports = { globals: { THREE: true, AFRAME: true, - NAF: true + NAF: true, + APP: true }, plugins: ["prettier", "react", "react-hooks", "@calm/react-intl"], diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 03bcd8be0f..4ea3ae772c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve Hubs title: '' -labels: bug, needs triage +labels: bug, needs triage, jira-hubs assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index a063098b90..2c446d636d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest an idea for Hubs! title: '' -labels: enhancement +labels: enhancement, jira-hubs assignees: '' --- diff --git a/.storybook/main.js b/.storybook/main.js index f608d3c216..abeb8157c4 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -60,6 +60,12 @@ module.exports = { ] }); + config.module.rules.push({ + test: /\.(glb|gltf)$/, + use: ["file-loader"], + include: path.resolve(__dirname, "../") + }); + return config; } }; diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 79900320d0..523412483a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,7 @@ We believe in the power of community (that's why we're building this, after all! ### ✅ Best Practices -A guide for our frontend development best practices is availible [here](./doc/best-practices.md) +A guide for general best practices can be found [here](./doc/best-practices.md) and for React UI specifically [here](./doc/ui-best-practices.md) ## Development Workflow diff --git a/Jenkinsfile b/Jenkinsfile index b6471bfbc0..cfb35d5fb8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,6 +34,7 @@ pipeline { def disableDeploy = env.DISABLE_DEPLOY def showQAPromoteCommand = env.SHOW_QA_PROMOTE_COMMAND def qaBuildsSlackChannel = env.QA_BUILDS_SLACK_CHANNEL + def uploadsHost = env.UPLOADS_HOST def habCommand = ( "/bin/bash scripts/hab-build-and-push.sh " @@ -49,6 +50,7 @@ pipeline { + "\\\"${buildNumber}\\\" " + "\\\"${gitCommit}\\\" " + "\\\"${disableDeploy}\\\" " + + "\\\"${uploadsHost}\\\" " ) runCommand(habCommand) diff --git a/PRIVACY.md b/PRIVACY.md index 5b8e282672..cb06b15e49 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,68 +1,70 @@ -# Privacy Notice for Hubs and Spoke - -Version 3.3, November 15, 2019 - -## At Mozilla (that’s us), we believe that privacy is fundamental to a healthy internet. - -In this Privacy Notice, we explain what data may be accessible to Mozilla or others when you use [Hubs](https://hubs.mozilla.com) or [Spoke](https://hubs.mozilla.com/spoke). We also adhere to the practices outlined in the Mozilla [privacy policy](https://www.mozilla.org/en-US/privacy/) for how we receive, handle, and share information we collect from Hubs. - -## Things you should know: - -
- - Your presence and communications are sent to Mozilla and other Room participants. - - -- **Avatar data**: We receive and send to others in the Room the name and likeness of your Avatar, its position in the Room, and your interactions with objects in the Room. - - **Custom Avatars**: You may create a custom avatar. If you create an account, Mozilla will store your custom avatar, associated with your account. - - **Stock Avatars**: If you choose one of the regular avatars, you may login to store information about your avatar with Mozilla. You can optionally store information about your Avatar in your browser’s local storage if you do not log in to your account. -- **Room data**: Rooms are publicly accessible to anyone with the URL. Mozilla receives data about the virtual objects and Avatars in a Room and shares that data with others in the Room. -- **Voice data**: If your microphone is on, Mozilla receives and sends audio to other users in the Room. Mozilla does not record or store the audio. *Be aware that once you agree to let Hubs use your microphone, it will stay on as long as you remain in a Hubs room, unless you turn it off.* -- **In-Room Photos and Video**: You can use the camera tool to take photos and video unless the room owner has disabled this feature. The camera tool displays a red icon during filming. Your avatar will also indicate to others with a red icon that you are filming and capturing audio from enabled microphones in the room. - - Data retention: If you take a photo or video, the file is stored locally on your device and uploaded to Mozilla’s servers so that it can be shared within the room. Pinned files are stored permanently in your room unless you remove it. Unpinned files are deleted from Mozilla’s servers after 72 hours. -- **Third-Party Communications Services**: Hubs allows you to connect some third-party services to a Hubs room. - - **Twitter**: Logging into your Twitter account from Hubs allows you to tweet and share 2D images. Any content you tweet will be shared with Twitter and published publicly on the Twitter platform. You can see Twitter’s [Privacy Policy](https://twitter.com/en/privacy) for more information. - - **Discord**: Hubs allows you to connect Discord to a Hubs room. When someone has connected Discord to a Hubs room, we store access tokens and the server and channel IDs that have been connected. We will synchronize chat messages, room changes, 2D and 3D objects you create, and whether a user joins or leaves with the connected Discord channel, but do not log any of these synchronized messages. For diagnostics, we log aggregated counts such as the number of messages and users who have joined relevant channels. You can see [Discord’s Privacy Policy](https://discordapp.com/privacy) for more information. - -- You can learn more by looking at the [code itself](https://github.com/mozilla/hubs) for Hubs. [Janus SFU](https://github.com/mozilla/janus-plugin-sfu), [Reticulum](https://github.com/mozilla/reticulum), [Hubs](https://github.com/mozilla/hubs), [Hubs-Ops](https://github.com/mozilla/hubs-ops), [Discord Bot](https://github.com/MozillaReality/hubs-discord-bot) - -
- -
- - Mozilla receives data you create and share with Spoke and Hubs. - - -- **Images, Video, and Objects**: Mozilla receives video and image file links to process and display them in the Hubs Room. Mozilla stores this data as long as you remain in the Room. If you pin a video, image, or object in the Room, Mozilla will store that information until the object or room is deleted. -- **Scenes and Avatars You Share**: Mozilla receives 3D Room model links, 3D Avatar information, and the name of the Room or Avatar in order to process and display the Room or Avatar. Mozilla stores the name and the URL for the link you share so you and others with the link to the Room can use it again. -- **Search**: You can search for images, GIFs, and 3D Models to share in Hubs. We use third-party search providers. When you search, we will send your searches to these third parties, which have their own privacy policies. - - Microsoft Bing Video & Image Search: https://privacy.microsoft.com/en-us/privacystatement - - Tenor: https://tenor.com/legal-privacy - - Sketchfab: https://sketchfab.com/privacy - - YouTube: https://policies.google.com/privacy - - Twitch: https://www.twitch.tv/p/legal/privacy-policy/ - -
- - Mozilla receives data when you create and publish Scenes with Spoke or create a custom Avatar. - - -- **Scenes and Avatars You Create**: When you create a scene with Spoke or a custom avatar, Mozilla receives a copy of that scene or avatar. Mozilla stores that data in order to be able to process and display the scene or avatar through Hubs. -- **Publishing Your Scene or Avatar**: When you publish a scene or avatar to Hubs, Mozilla will ask for your email address to send you a link to verify your email. Mozilla will receive and store your email address to allow you to log in and view your 3D Room models and Avatars. Mozilla stores a hashed version of email addresses you use to publish a scene, so the stored versions are not available in readable form. -- **Remixing, Promotion, and Favorites**: When you publish a scene or avatar to Hubs, you have the option to “Allow Remixing with Creative Commons [CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/)” or allow Mozilla to promote your scene or avatar. If you choose one or both of these options, Mozilla will share your scene or avatar publicly and you will have the option of including attribution information, which will also be publicly available. If you mark a Room or Avatar as a Favorite, Mozilla will store that information associated with your account. - -- You can learn more by looking at the [code itself](https://github.com/mozilla/spoke) for Spoke. -
- -
- - Mozilla receives technical and interaction data to improve performance and stability for Hubs. - - -- **Account data**: You do not need to create an account to use Hubs. If you decide to create an account with your email address, we receive your email address to send you a login link, but stores only a hashed version of your email address. If you decide to use Discord to create your account, we receive the email address associated with your Discord account and your Discord avatar. -- **Technical data**: We receive and store data about Room URLs and names; the type of device you use to interact with Hubs, as well as its operating system, language, the name and version of browser; and other data to load and operate the Room. -- **Interaction data**: We receive data about your interactions with the Hubs service itself such as the number of Rooms created, messages sent through or to third-party services like Slack and Discord, the maximum number of users in a particular room at one same time, the start and end time of a user’s interaction with Hubs, the amount of time a user interacts with Hubs through Virtual Reality, the first time in a particular month or day that a user begins to use Hubs. Mozilla uses third party services to store and analyze these operational messages. We also also use Google Analytics, which places a cookie on your device, to obtain metrics on how users engage with our websites. This helps us to improve site content. -- **Website data**: We use Google Analytics to better understand how you interact with Hubs apps and websites. For example, we may use cookies to track de-identified information such as the number of Hubs rooms you create or enter, interactions with buttons and menus, and session length. To consistently improve the Hubs experience, we collect information about browser type and version, viewport size, and screen resolution. This allows us to understand how people interact with Hubs so we can improve it. We also collect your location, and the language setting in your browser to make sure it looks right for you. If you’d prefer to opt out of Google Analytics data collection, you can install the [Google Analytics Opt-out Browser Add-on](https://tools.google.com/dlpage/gaoptout), which stops data transmission to Google Analytics. -- **Error Data**: In order to diagnose problems, Hubs sends Mozilla logs of error messages (which include the Room URL, response time for requests, the page you were on when you encountered the error, your operating system, browser information, and may include your IP address). -- You can learn more by looking at the [code itself](https://github.com/mozilla/hubs) for Hubs. [Janus SFU](https://github.com/mozilla/janus-plugin-sfu), [Reticulum](https://github.com/mozilla/reticulum), [Hubs](https://github.com/mozilla/hubs), [Hubs-Ops](https://github.com/mozilla/hubs-ops), [Discord Bot](https://github.com/MozillaReality/hubs-discord-bot) -
+ +# Hubs and Spoke Privacy Notice + +Aug 24, 2021 + +In this Privacy Notice, we explain what data [Hubs](https://hubs.mozilla.com) and [Spoke](https://hubs.mozilla.com/spoke) collect and share, and why. We also adhere to the practices outlined in the Mozilla [Privacy Policy](https://www.mozilla.org/en-US/privacy/) for how we receive, handle, and share information. + +## Information We Collect and Share When You’re In a Room + +### Information You Share With Us and Other Participants + +We need certain information to operate Hubs and Spoke. For example, we need information about your account in order to save your avatar. Here’s the information we may receive from you: + +**Account information**: You don’t need an account to use Hubs. However, certain features (like storing your avatar), require an account. You can create an account through Mozilla or through Discord. If you create an account with your email address, we store a hashed version of your email address. If you create an account through Discord, we receive the email address associated with your Discord account and your Discord avatar. + +**Room Name and URL**: Rooms and room names are publicly accessible to anyone with the URL. Mozilla stores the name and the URL for the link you share so you and others with the link to the Room can use it again. + +**Avatar data**: Your selected avatar and name will be shared with other participants in your room. If you’re logged in to your account, we will store your avatar. If you’re not logged into your account, we will not store your avatar. + +**Voice data**: If your microphone is on, Hubs sends the audio to other users in the room. Mozilla does not store the audio; we only receive it temporarily to transmit it to others in the room. + +**Chat**: If you send messages in Hubs, Hubs shares it with the other users in the room. Mozilla does not store chats; we only receive it temporarily to transmit it to others in the room. + +**Photos and Videos You Take, and Photos, Videos, and Objects You Upload**: If you take photos and video in a Hubs room or upload photos, videos, or objects to a room, Mozilla stores them so you can share them within the room. They are deleted within 72 hours unless you pin them. If you pin them they will be stored until you remove them from the room and they will be viewable by anyone who can access the room. + +You can learn more by looking at the code itself: [Hubs](https://github.com/mozilla/hubs) (the front-end) [Dialog](https://github.com/mozilla/dialog/) (the webRTC server), [Reticulum](https://github.com/mozilla/reticulum) (the backend web server), [Hubs-Ops](https://github.com/mozilla/hubs-ops) (the infrastructure code), [Discord Bot](https://github.com/MozillaReality/hubs-discord-bot) (enables users to connect their Discord community to Hubs). + +### Other Information We Receive + +We use technical, interaction, error, and website analytics data to help us improve the Hubs and Spoke experiences: + +**Technical data**: We receive data about the type of device you use to interact with Hubs, as well as its operating system, language, the name and version of browser, and other data needed to load and operate a room. + +**Interaction data**: We receive data about your interactions with Hubs, such as the number of rooms created, messages sent through or to third-party services like Discord (including aggregated counts such as the number of messages and users who have joined relevant channels), the number of users in a particular room, the start and end time of a your interaction with Hubs, the amount of time you interact with Hubs through virtual reality, the first time in a particular month or day that you begins to use Hubs. + + + + +**Error Data**: When Hubs or Spoke crashes or fails, Mozilla receives error messages which may include the room URL, response time for requests, the page you were on when you encountered the error, your operating system, browser information, and your IP address. + +**Website Analytics Data**: We use Google Analytics (GA) to better understand how you interact with Hubs and Spoke For example, we collect de-identified information about the number of Hubs rooms you create or enter, your interactions with buttons and menus, your session length, your location (country, state/province, and city), language settings, your browser type and version, viewport size, and screen resolution. You can opt-out of GA data collection by installing the [Google Analytics Opt-out Browser Add-on](https://tools.google.com/dlpage/gaoptout). + +## Information We Collect When Your Create and Publish Scenes or Custom Avatars + +**Scenes and avatars you create**: You need an account to create scenes in Spoke and custom avatars in Hubs. When you create a scene or custom avatar, Mozilla stores that scene or avatar so we can display it. + +**Attribution information**: When you publish a scene or avatar to Hubs, you have the option to “Allow Remixing with Creative Commons [CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/)” or allow Mozilla to promote your scene or avatar. If you choose one or both of these options, Mozilla will share your scene or avatar and your attribution information publicly. + +**Account information**: To publish a scene or avatar to Hubs, you need to have a Hubs account. Mozilla will receive and store a hashed version of your email address to allow you to log in and view your 3D Room models and Avatars. + +You can learn more by looking at the [code itself](https://github.com/mozilla/spoke) for Spoke. + +## Who Hubs May Disclose Information To + +**Amazon Web Services (AWS)**: Hubs and Spoke use Amazon’s cloud storage service to store the information collected through Hubs and Spoke. You can read [AWS’s Privacy Notice](https://aws.amazon.com/privacy/) for more information. + +**Search providers**: You can search for images, GIFs, and 3D Models to share in Hubs. When you search, we will send your searches to supported third parties to fulfill the search. Mozilla does not store your search queries or the search results. We support the following providers: + +- [Tenor](https://tenor.com/legal-privacy) + +- [Sketchfab](https://sketchfab.com/privacy) + +- [YouTube](https://policies.google.com/privacy) + +- [Twitch](https://www.twitch.tv/p/legal/privacy-policy/) + + +**Twitter**: If you connect Twitter to Hubs, you can tweet and share 2D images from Hubs rooms. Any content you tweet will be shared with Twitter and published on the Twitter platform. You can see Twitter’s [Privacy Policy](https://twitter.com/en/privacy) for more information. + +**Discord**: If you connect Discord to Hubs, we store access tokens and the server and channel IDs that have been connected. We will synchronize chat messages, room changes, 2D and 3D objects you create, and whether you join or leave with the connected Discord channel. Hubs does not log any synchronized messages. You can see [Discord’s Privacy Policy](https://discordapp.com/privacy) for more information. diff --git a/admin/src/react-components/featured-scene-listings.js b/admin/src/react-components/featured-scene-listings.js index 315a3b1882..7eaa2101db 100644 --- a/admin/src/react-components/featured-scene-listings.js +++ b/admin/src/react-components/featured-scene-listings.js @@ -12,11 +12,19 @@ import { NumberInput, Datagrid, TextField, - ReferenceField + ReferenceField, + Filter } from "react-admin"; +const SceneFilter = props => ( + + + + +); + export const FeaturedSceneListingList = props => ( - + } sort={{ field: "order", order: "ASC" }}> diff --git a/admin/src/react-components/fields.js b/admin/src/react-components/fields.js index 4257f0b379..a5d033f52f 100644 --- a/admin/src/react-components/fields.js +++ b/admin/src/react-components/fields.js @@ -2,7 +2,7 @@ import React from "react"; import PropTypes from "prop-types"; import { withStyles } from "@material-ui/core/styles"; import LaunchIcon from "@material-ui/icons/Launch"; -import { getReticulumFetchUrl } from "hubs/src/utils/phoenix-utils"; +import { getReticulumFetchUrl, getUploadsUrl } from "hubs/src/utils/phoenix-utils"; import { ReferenceField } from "react-admin"; const styles = { @@ -39,7 +39,7 @@ ConditionalReferenceField.propTypes = { }; const OwnedFileImageInternal = withStyles(styles)(({ record = {}, aspect = "wide", classes }) => { - const src = getReticulumFetchUrl(`/files/${record.owned_file_uuid}`); + const src = getUploadsUrl(`/files/${record.owned_file_uuid}`); return ; }); @@ -67,7 +67,7 @@ function OwnedFileDownloadFieldInternal({ fileName, record, source }) { return ( diff --git a/admin/src/react-components/pending-scenes.js b/admin/src/react-components/pending-scenes.js index fa770af998..7a2a38043c 100644 --- a/admin/src/react-components/pending-scenes.js +++ b/admin/src/react-components/pending-scenes.js @@ -3,10 +3,17 @@ import { SceneLink, OwnedFileImage, OwnedFileSizeField, ConditionalReferenceFiel import { ApproveSceneButton } from "./approve-buttons"; import { DenySceneButton } from "./deny-buttons"; -import { List, Datagrid, TextField, DateField } from "react-admin"; +import { List, TextInput, Datagrid, TextField, DateField, Filter } from "react-admin"; + +const SceneFilter = props => ( + + + + +); export const PendingSceneList = props => ( - + }> diff --git a/admin/src/react-components/system-editor.js b/admin/src/react-components/system-editor.js index 61be71bc7f..032ff7732a 100644 --- a/admin/src/react-components/system-editor.js +++ b/admin/src/react-components/system-editor.js @@ -20,6 +20,7 @@ import Info from "@material-ui/icons/Info"; import { fetchReticulumAuthenticated } from "hubs/src/utils/phoenix-utils"; import withCommonStyles from "../utils/with-common-styles"; import { getAdminInfo, getEditableConfig } from "../utils/ita"; +import configs from "../utils/configs"; // Send quota to use as heuristic for checking if in SES sandbox // https://forums.aws.amazon.com/thread.jspa?threadID=61090 @@ -334,6 +335,31 @@ class SystemEditorComponent extends Component { + + + <CardContent className={this.props.classes.info}> + <Typography variant="title" gutterBottom> + Your hub version: + </Typography> + {configs.IS_LOCAL_OR_CUSTOM_CLIENT ? ( + <> + <Typography variant="body1" gutterBottom> + App client: Custom client + </Typography> + <Typography variant="body1" gutterBottom> + {`(Undeploy custom client to run build ${process.env.BUILD_VERSION || "?"})`} + </Typography> + <Typography variant="body1" gutterBottom> + {`(Remember to regularly pull in upstream changes from the "hubs-cloud" branch: https://github.com/mozilla/hubs)`} + </Typography> + </> + ) : ( + <Typography variant="body1" gutterBottom> + {`App client: ${process.env.BUILD_VERSION || "?"}`} + </Typography> + )} + </CardContent> + </Card> </> ); } diff --git a/admin/src/utils/configs.js b/admin/src/utils/configs.js index 9fb9e916d4..9f6a142a50 100644 --- a/admin/src/utils/configs.js +++ b/admin/src/utils/configs.js @@ -6,4 +6,8 @@ const configs = {}; configs[x] = el ? el.getAttribute("content") : process.env[x]; }); +// Custom clients do not use <meta> tags for passing data, so if reticulum_server meta tag exists, it is not a custom client +const hasReticulumServerMetaTag = !!document.querySelector("meta[name='env:reticulum_server']"); +configs.IS_LOCAL_OR_CUSTOM_CLIENT = !hasReticulumServerMetaTag; + export default configs; diff --git a/admin/webpack.config.js b/admin/webpack.config.js index 9c2f08876f..ccf6e4d0bd 100644 --- a/admin/webpack.config.js +++ b/admin/webpack.config.js @@ -224,7 +224,8 @@ module.exports = (env, argv) => { ITA_SERVER: process.env.ITA_SERVER, RETICULUM_SERVER: process.env.RETICULUM_SERVER, CORS_PROXY_SERVER: process.env.CORS_PROXY_SERVER, - POSTGREST_SERVER: process.env.POSTGREST_SERVER + POSTGREST_SERVER: process.env.POSTGREST_SERVER, + UPLOADS_HOST: process.env.UPLOADS_HOST }) }) ] diff --git a/doc/best-practices.md b/doc/best-practices.md index e5c4e3bcbe..b6de1b1dec 100644 --- a/doc/best-practices.md +++ b/doc/best-practices.md @@ -1,109 +1,182 @@ -# Hubs Frontend Development Best Practices +This is a set of random little best practices we have come to endorse over the years. They are examples of things that have often come up in PR reviews or patterns we have started to solidify on. There are plenty of counter examples of these in the codebase, they are probably mostly unintentional. Also, most of these are more suggestions than hard rules. -The Hubs UI is built with React, CSS Modules, and a number of other libraries. This guide is intended to get you up to speed with how we on the Hubs team write frontend code. +These pertain mostly to the "in room experince" or "game" code. For best practices in the React UI code, see [UI Best Practices](ui-best-practices.md) -## Javascript Style +### If a method doesn't use `this` it shouldn't be a method -We use [Prettier](https://prettier.io/) for code formatting and a series of [ESLint](https://eslint.org/) rules for linting. +Prefer a standalone function instead. -Currently the only modification we have made to the default prettier config is a 120 character line width. We as a team decided that 80 characters was not enough despite the Prettier team's [strong suggestion](https://prettier.io/docs/en/options.html#print-width). +Don't: +```js +class Foo { + plusOne(x) { + return x + 1; + } + bar() { + console.log(this.plusOne(3)); + } +} +``` -You can look at our [.eslintrc.js](../.eslintrc.js) file for our linting rules. Documentation for the various rules are linked in that file. -## React +Do: +```js +function plusOne(x) { + return x + 1; +} +class Foo { + bar() { + console.log(plusOne(3)); + } +} +``` -Hubs underwent a major redesign in 2020 and was transitioned from React class based components to React hooks in the process. There may still be some legacy code that uses class based components, but we intend to use hooks for all evergreen code. -### React Resources -- [Official React Docs](https://reactjs.org/docs/getting-started.html) +### Don't allocate objects every frame. -### Hooks +If you see `new` in a tick function, you should be suspicious. This is especially common for ThreeJS objects like Vectors, Quaternions, and Matrices, try to re-use them instead to avoid GC. If you find yourself allocating a whole bunch of something, consider using a pool. -If you are new to React hooks we recommend the following guides to get started: -- [Official React Docs on Hooks](https://reactjs.org/docs/hooks-intro.html) -- [Thinking in React Hooks](https://wattenberger.com/blog/react-hooks) +Don't: +```js +AFRAME.registerComponent("bad-example", { + tick(dt) { + const tempVec = new THREE.Vector3(); + this.el.object3D.getWorldPosition(tempVec); + // do something with tempVec + } +} +``` +Do: +```js +AFRAME.registerComponent("example", { + tick: (function { + const tempVec = new THREE.Vector3(); + return function(dt) { + this.el.object3D.getWorldPosition(tempVec); + // do something with tempVec + }; + })() +} +``` -### File / Folder Structure +or -- Keep files relatively small -- One component per file is generally good practice, but multiple related components can be placed in the same file -- Files should be named according to what they export - - PascalCase for components/classes - - camelCase for functions/hooks - - kebab-case for multiple exports -- We tend to favor named exports instead of default exports - - [This blog post](https://medium.com/@timoxley/named-exports-as-the-default-export-api-670b1b554f65) explains some reasons why - - tldr; - - Enforces the use of the exported name which makes for easier refactoring - - Aliasing makes it easy to rename an import - - Wildcard imports makes it easy to import all the exports - - Tree shaking doesn't work with default exports -- Folders should group components, hooks, stylesheets, stories, and assets by feature - - Makes it easier to find a file when working on a feature +```js +const tempVec = new THREE.Vector3(1, 2, 3); -### Component Best Practices +AFRAME.registerComponent("example", { + tick() { + this.el.object3D.getWorldPosition(tempVec); + // do something with tempVec + } +} +``` -- Use functional components and hooks for all evergreen code -- Refactor existing class components to use hooks when possible -- Split presentational code from business logic so that they can be tested separately. - - Presentational components should focus on styling and structure and should not contain business logic. - - Presentational components must be testable in Storybook, so they cannot have external dependencies on AFrame / data fetching, server config, etc. - - You can use hooks in presentational components for things like maintaining local state and handling interactions. - - Presentational components can depend on other presentational components and hooks that manage local state - - Business logic should be written in hooks - - Wiring business logic to presentational components should be done in container components - - Container components can depend on presentational components, hooks with business logic, and other container components. - - Container components shouldn't contain html elements or their own stylesheets -## CSS / CSS Modules +### Only store things on `this` that are actually persistent state. -Hubs uses [CSS Modules](https://github.com/css-modules/css-modules) and [SASS](https://sass-lang.com/) for styles. +If you don't care about the state between frames and are only re-using it for GC reasons (see above point) use temp reusable variables, use a closure or variable defined at the root of the file instead. -You should avoid global class names whenever possible and instead rely on imported classes from css modules in your code. +Don't: +```js +const INCREMENT_THRESHOLD = 1000; +class Foo { + constructor() { + this.lastIncrement = Date.now(); + this.tempVec = new THREE.Vector3() + } + tick() { + if (Date.now() - this.lastIncrement > INCREMENT_THRESHOLD) { + this.tempVec.set(1,2,3); + this.tempVec.add(4,5,6); + console.log(this.tempVec); + this.lastIncrement = Date.now(); + } + } +} +``` -SASS mixins, functions, etc. should generally be avoided whenever possible. They add complexity to stylesheets that makes them harder to read and understand. +Do: +```js +const INCREMENT_THRESHOLD = 1000; +class Foo { + constructor() { + this.lastIncrement = Date.now(); + } + tick: (function() { + const tempVec = new THREE.Vector3() + return function() { + if (Date.now() - this.lastIncrement > INCREMENT_THRESHOLD) { + tempVec.set(1,2,3); + tempVec.add(4,5,6); + console.log(tempVec); + this.lastIncrement = Date.now(); + } + } + })() +} +``` -You should avoid nested SASS rules when possible. One major reason for using them is for [selector specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity). Another would be for programatically changing a single parent class that affects multiple child classes. Overuse of nested selectors bloats our stylesheets and should be avoided. +### if you have a setter/getter that just directly sets/gets a value, consider not having it instead -We use "t-shirt size" class suffixes for utility classes. Follow this pattern whenever you need to specify programatic sizes. +Don't +```js +class Foo { + constructor() { + this._val = 1; + } + + get val() { + return this._val; + } -Ex. -```css -.button-2xs {} -.button-xs {} -.button-sm {} -.button-md {} -.button-lg {} -.button-xl {} -.button-2xl {} + set val(newVal) { + this._val = newVal; + } +} ``` -All CSS colors and fonts should be defined in [theme.scss](../src/react-components/styles/theme.scss). These variables are configurable in Hubs Cloud instances. In some rare cases, you may want to explicitly enforce a color that cannot be configured (Ex. black/white text for an overlay). +Do +```js +class Foo { + constructor() { + this.val = 1; + } +} +``` -Theme variables are imported using the `@use` keyword. This must be the first line in your `.scss` file. All variables will be namespaced with the filename. For `theme.scss` this would be `theme.$my-variable`. +### Avoid unnecessary AFrame components. -Ex. +AFrame component instantiation can be tricky to deal with. When possible try and limit entities and components to the outer edge of the behavior you are working on. The only things that HAVE to be in components right now things with networked state. Things serialized in a glTF are generally components as well, but that is less of a strict requirement. For everything else, consider if that behavior or state might better live elsewhere. Store state in associative collections. Mutate state in regular functions. -```scss -@use '../styles/theme'; -/* rest of the styles */ -``` +### Avoid repeatedly running querySelectors every frame. -CSS styles should be written with mobile-first media queries. This means the styles in the bare class should represent those on the smallest screen and media queries should be used for styles that are different on larger screens. +Prefer storing a reference when possible. -Ex. -```scss -:local(.sidebar) { - position: relative; - display: flex; - flex-direction: column; - height: 100%; - background-color: theme.$white; - pointer-events: auto; +don't +```js +AFRAME.registerComponent("bad-example", { + tick() { + const timeLabel = this.el.querySelector(".video-time-label"); + timeLabel.setAttribute("text", "value", performance.now()); + } +} +``` - @media(min-width: theme.$breakpoint-lg) and (min-height: theme.$breakpoint-vr) { - border-left: 1px solid theme.$lightgrey; +do +```js +AFRAME.registerComponent("bad-example", { + init() { + this.timeLabel = this.el.querySelector(".video-time-label"); + } + tick() { + this.timeLabel.setAttribute("text", "value", performance.now()); } } ``` + + +### Don’t fail silently. + +Always at least log a warning or error to the console when something unexpected happens diff --git a/doc/ui-best-practices.md b/doc/ui-best-practices.md new file mode 100644 index 0000000000..e5c4e3bcbe --- /dev/null +++ b/doc/ui-best-practices.md @@ -0,0 +1,109 @@ +# Hubs Frontend Development Best Practices + +The Hubs UI is built with React, CSS Modules, and a number of other libraries. This guide is intended to get you up to speed with how we on the Hubs team write frontend code. + +## Javascript Style + +We use [Prettier](https://prettier.io/) for code formatting and a series of [ESLint](https://eslint.org/) rules for linting. + +Currently the only modification we have made to the default prettier config is a 120 character line width. We as a team decided that 80 characters was not enough despite the Prettier team's [strong suggestion](https://prettier.io/docs/en/options.html#print-width). + +You can look at our [.eslintrc.js](../.eslintrc.js) file for our linting rules. Documentation for the various rules are linked in that file. + +## React + +Hubs underwent a major redesign in 2020 and was transitioned from React class based components to React hooks in the process. There may still be some legacy code that uses class based components, but we intend to use hooks for all evergreen code. + +### React Resources +- [Official React Docs](https://reactjs.org/docs/getting-started.html) + +### Hooks + +If you are new to React hooks we recommend the following guides to get started: +- [Official React Docs on Hooks](https://reactjs.org/docs/hooks-intro.html) +- [Thinking in React Hooks](https://wattenberger.com/blog/react-hooks) + + +### File / Folder Structure + +- Keep files relatively small +- One component per file is generally good practice, but multiple related components can be placed in the same file +- Files should be named according to what they export + - PascalCase for components/classes + - camelCase for functions/hooks + - kebab-case for multiple exports +- We tend to favor named exports instead of default exports + - [This blog post](https://medium.com/@timoxley/named-exports-as-the-default-export-api-670b1b554f65) explains some reasons why + - tldr; + - Enforces the use of the exported name which makes for easier refactoring + - Aliasing makes it easy to rename an import + - Wildcard imports makes it easy to import all the exports + - Tree shaking doesn't work with default exports +- Folders should group components, hooks, stylesheets, stories, and assets by feature + - Makes it easier to find a file when working on a feature + +### Component Best Practices + +- Use functional components and hooks for all evergreen code +- Refactor existing class components to use hooks when possible +- Split presentational code from business logic so that they can be tested separately. + - Presentational components should focus on styling and structure and should not contain business logic. + - Presentational components must be testable in Storybook, so they cannot have external dependencies on AFrame / data fetching, server config, etc. + - You can use hooks in presentational components for things like maintaining local state and handling interactions. + - Presentational components can depend on other presentational components and hooks that manage local state + - Business logic should be written in hooks + - Wiring business logic to presentational components should be done in container components + - Container components can depend on presentational components, hooks with business logic, and other container components. + - Container components shouldn't contain html elements or their own stylesheets + +## CSS / CSS Modules + +Hubs uses [CSS Modules](https://github.com/css-modules/css-modules) and [SASS](https://sass-lang.com/) for styles. + +You should avoid global class names whenever possible and instead rely on imported classes from css modules in your code. + +SASS mixins, functions, etc. should generally be avoided whenever possible. They add complexity to stylesheets that makes them harder to read and understand. + +You should avoid nested SASS rules when possible. One major reason for using them is for [selector specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity). Another would be for programatically changing a single parent class that affects multiple child classes. Overuse of nested selectors bloats our stylesheets and should be avoided. + +We use "t-shirt size" class suffixes for utility classes. Follow this pattern whenever you need to specify programatic sizes. + +Ex. +```css +.button-2xs {} +.button-xs {} +.button-sm {} +.button-md {} +.button-lg {} +.button-xl {} +.button-2xl {} +``` + +All CSS colors and fonts should be defined in [theme.scss](../src/react-components/styles/theme.scss). These variables are configurable in Hubs Cloud instances. In some rare cases, you may want to explicitly enforce a color that cannot be configured (Ex. black/white text for an overlay). + +Theme variables are imported using the `@use` keyword. This must be the first line in your `.scss` file. All variables will be namespaced with the filename. For `theme.scss` this would be `theme.$my-variable`. + +Ex. + +```scss +@use '../styles/theme'; +/* rest of the styles */ +``` + +CSS styles should be written with mobile-first media queries. This means the styles in the bare class should represent those on the smallest screen and media queries should be used for styles that are different on larger screens. + +Ex. +```scss +:local(.sidebar) { + position: relative; + display: flex; + flex-direction: column; + height: 100%; + background-color: theme.$white; + pointer-events: auto; + + @media(min-width: theme.$breakpoint-lg) and (min-height: theme.$breakpoint-vr) { + border-left: 1px solid theme.$lightgrey; + } +} +``` diff --git a/package-lock.json b/package-lock.json index 19f370ee2e..f22a6b035a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5602,15 +5602,6 @@ "typescript": "^4.0" }, "dependencies": { - "@formatjs/ecma402-abstract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.5.0.tgz", - "integrity": "sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, "@nodelib/fs.stat": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", @@ -5710,16 +5701,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "intl-messageformat-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.2.tgz", - "integrity": "sha512-4GQDEPhl/ZMNDKwMsLqyw1LG2IAWjmLJXdmnRcHKeLQzpgtNYZI6lVw1279pqIkRk2MfKb9aDsVFzm565azK5A==", - "dev": true, - "requires": { - "@formatjs/ecma402-abstract": "1.5.0", - "tslib": "^2.0.1" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5965,25 +5946,6 @@ "typescript": "^4.0" }, "dependencies": { - "@formatjs/ecma402-abstract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.5.0.tgz", - "integrity": "sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "intl-messageformat-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.2.tgz", - "integrity": "sha512-4GQDEPhl/ZMNDKwMsLqyw1LG2IAWjmLJXdmnRcHKeLQzpgtNYZI6lVw1279pqIkRk2MfKb9aDsVFzm565azK5A==", - "dev": true, - "requires": { - "@formatjs/ecma402-abstract": "1.5.0", - "tslib": "^2.0.1" - } - }, "tslib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", @@ -6189,10 +6151,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "github:ngokevin/debug#ef5f8e66d49ce8bc64c6f282c15f8b7164409e3a", - "from": "github:ngokevin/debug#noTimestamp" - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6203,9 +6161,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -6417,12 +6375,12 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.10.4" } }, "@babel/core": { @@ -6450,113 +6408,114 @@ } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.12.10" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.12.7" } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.12.10" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.12.11" } }, "@babel/helper-validator-identifier": { @@ -6566,31 +6525,31 @@ "dev": true }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "dev": true, "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/plugin-syntax-jsx": { @@ -6612,36 +6571,37 @@ } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", - "globals": "^11.1.0" + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -6686,9 +6646,9 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -6771,9 +6731,9 @@ } }, "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz", + "integrity": "sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==", "dev": true }, "unist-util-remove-position": { @@ -7011,6 +6971,16 @@ "react-lifecycles-compat": "^3.0.4" } }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" + }, + "@socket.io/component-emitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", + "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" + }, "@storybook/addon-actions": { "version": "6.1.15", "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.1.15.tgz", @@ -14996,11 +14966,6 @@ "integrity": "sha512-TbH79tcyi9FHwbyboOKeRachRq63mSuWYXOflsNO9ZyE5ClQ/JaozNKl+aWUq87qPNsXasXxi2AbgfwIJ+8GQw==", "dev": true }, - "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" - }, "@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", @@ -15840,8 +15805,8 @@ "dev": true }, "aframe": { - "version": "github:immers-space/aframe#70412c4b4c9ee3bc60ef1cfb20efdd012572a045", - "from": "github:immers-space/aframe#hubs-cloud-safari-15-patches", + "version": "github:mozillareality/aframe#1f77f3d9328f00faff76e94dcc190d4278ddb3c6", + "from": "github:mozillareality/aframe#hubs/master", "requires": { "custom-event-polyfill": "^1.0.6", "debug": "github:ngokevin/debug#noTimestamp", @@ -15866,9 +15831,8 @@ "integrity": "sha512-OQlwyK/U5ISEoEaZCOxCzkfqq6F1coUKXQuwkWMAmRmvKyAfrEyX63G8c87aPvZO35z+PItObcpYNtBmjk4SBQ==" }, "aframe-slice9-component": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/aframe-slice9-component/-/aframe-slice9-component-1.0.0.tgz", - "integrity": "sha1-+w+EQdrdHosRzCRRK6eqaS1iK+E=" + "version": "github:takahirox/aframe-slice9-component#2ec0810cbf23f487a10c767d24dee6d5b7ede77f", + "from": "github:takahirox/aframe-slice9-component#AlphaTest" }, "aggregate-error": { "version": "3.1.0", @@ -15989,6 +15953,7 @@ "version": "3.2.1", "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -17632,16 +17597,6 @@ "path-exists": "^3.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -18686,15 +18641,6 @@ "to-fast-properties": "^2.0.0" } }, - "@formatjs/ecma402-abstract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.5.0.tgz", - "integrity": "sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", @@ -18743,16 +18689,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "intl-messageformat-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.2.tgz", - "integrity": "sha512-4GQDEPhl/ZMNDKwMsLqyw1LG2IAWjmLJXdmnRcHKeLQzpgtNYZI6lVw1279pqIkRk2MfKb9aDsVFzm565azK5A==", - "dev": true, - "requires": { - "@formatjs/ecma402-abstract": "1.5.0", - "tslib": "^2.0.1" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -19160,10 +19096,11 @@ "widest-line": "^2.0.0" }, "dependencies": { - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true } } }, @@ -19385,9 +19322,14 @@ "dev": true }, "buffered-interpolation": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/buffered-interpolation/-/buffered-interpolation-0.2.5.tgz", - "integrity": "sha512-LauOWiVXZppapDpc8y2yzcf3/pKU1Exal/+H0EZeNVxttnWHqtyhEaJ2J4U5yia71FWqZvywnhx8xneh073xbA==" + "version": "github:Infinitelee/buffered-interpolation#5bb18421ebf2bf11664645cdc7a15bd77ee2156b", + "from": "github:Infinitelee/buffered-interpolation" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true }, "builtin-status-codes": { "version": "3.0.0", @@ -19451,6 +19393,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -21825,6 +21768,7 @@ "version": "1.4.1", "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, "requires": { "once": "^1.4.0" } @@ -21840,6 +21784,50 @@ "objectorarray": "^1.0.4" } }, + "engine.io-client": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", + "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", + "requires": { + "@socket.io/component-emitter": "~3.0.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" + } + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", @@ -21849,21 +21837,6 @@ "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", "tapable": "^1.0.0" - }, - "dependencies": { - "@formatjs/ecma402-abstract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.5.0.tgz", - "integrity": "sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==", - "requires": { - "tslib": "^2.0.1" - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } } }, "entities": { @@ -21948,25 +21921,14 @@ } }, "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "^1.1.4", + "is-callable": "^1.1.1", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "dependencies": { - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -22070,7 +22032,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.12.0", @@ -22239,12 +22202,20 @@ } }, "eslint-config-prettier": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", - "integrity": "sha512-Mhl90VLucfBuhmcWBgbUNtgBiK955iCDK1+aHAz7QfDQF6wuzWZ6JjihZ3ejJoGlJWIuko7xLqNm8BA5uenKhA==", + "version": "2.9.0", + "resolved": "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz", + "integrity": "sha1-Xs1lF01IbCLf84n+A2/r9QLUaKM=", "dev": true, "requires": { "get-stdin": "^5.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + } } }, "eslint-plugin-prettier": { @@ -22979,13 +22950,13 @@ } }, "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, "follow-redirects": { @@ -23198,7 +23169,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true }, "function.prototype.name": { "version": "1.1.3", @@ -23389,6 +23361,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -23407,12 +23380,6 @@ "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", "dev": true }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz", @@ -23469,6 +23436,11 @@ } } }, + "gl-matrix": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", + "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==" + }, "gl-preserve-state": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz", @@ -23783,6 +23755,7 @@ "version": "1.0.3", "resolved": "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz", "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -23796,12 +23769,6 @@ "ansi-regex": "^2.0.0" } }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", @@ -23810,7 +23777,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-glob": { "version": "1.0.0", @@ -23841,7 +23809,8 @@ "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true }, "has-unicode": { "version": "2.0.1", @@ -24995,33 +24964,103 @@ } }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "es-abstract": "^1.17.0-next.1", "has": "^1.0.3", - "side-channel": "^1.0.4" + "side-channel": "^1.0.2" }, "dependencies": { - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { "has-symbols": "^1.0.1" } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } } } }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, "intl-messageformat": { @@ -25034,6 +25073,15 @@ "tslib": "^2.0.1" }, "dependencies": { + "intl-messageformat-parser": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.3.tgz", + "integrity": "sha512-rQTtrVTFy/Z6Lg0ieHkkhdFfi/47BKv1P9+wMWlKWaAxpdDP0FIsp2LRyLPpIVKTwUfL3xf26QT25d69cSkZgQ==", + "requires": { + "@formatjs/ecma402-abstract": "1.5.1", + "tslib": "^2.0.1" + } + }, "tslib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", @@ -25042,18 +25090,29 @@ } }, "intl-messageformat-parser": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.3.tgz", - "integrity": "sha512-rQTtrVTFy/Z6Lg0ieHkkhdFfi/47BKv1P9+wMWlKWaAxpdDP0FIsp2LRyLPpIVKTwUfL3xf26QT25d69cSkZgQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.2.tgz", + "integrity": "sha512-4GQDEPhl/ZMNDKwMsLqyw1LG2IAWjmLJXdmnRcHKeLQzpgtNYZI6lVw1279pqIkRk2MfKb9aDsVFzm565azK5A==", + "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.5.1", + "@formatjs/ecma402-abstract": "1.5.0", "tslib": "^2.0.1" }, "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.5.0.tgz", + "integrity": "sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, "tslib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true } } }, @@ -25065,6 +25124,12 @@ "loose-envify": "^1.0.0" } }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, "ip": { "version": "1.1.5", "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz", @@ -25149,12 +25214,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -25164,20 +25223,20 @@ "binary-extensions": "^1.0.0" } }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz", @@ -25222,7 +25281,8 @@ "is-date-object": { "version": "1.0.1", "resolved": "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true }, "is-decimal": { "version": "1.0.2", @@ -25363,7 +25423,8 @@ "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true }, "is-npm": { "version": "1.0.0", @@ -25380,12 +25441,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -25414,98 +25469,11 @@ }, "is-path-in-cwd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "resolved": "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", "dev": true, "requires": { "is-path-inside": "^1.0.0" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - } } }, "is-path-inside": { @@ -25525,8 +25493,8 @@ }, "is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "resolved": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -25603,6 +25571,12 @@ "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", "dev": true }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -25658,7 +25632,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", @@ -26308,7 +26283,8 @@ "js-tokens": { "version": "3.0.2", "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.13.1", @@ -26613,6 +26589,15 @@ } } }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -26633,11 +26618,6 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -26652,7 +26632,7 @@ } }, "lib-hubs": { - "version": "github:mozillareality/lib-hubs#433df560dd14d476ce0a7ec84d86e40f18ba072c", + "version": "github:mozillareality/lib-hubs#592695f0fd098adbf7cc88d14391bd97a482f78a", "from": "github:mozillareality/lib-hubs#master" }, "lie": { @@ -26678,9 +26658,9 @@ } }, "linkifyjs": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.0-beta.3.tgz", - "integrity": "sha512-aXq4WJs91NsETo5f9dQrt8Vx+OxAvzJAtR8lLgpum8PDjtCgstycwYbIkAjDGRV/YF1LlKKdbWyOpgMYgwgOvQ==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", + "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==" }, "load-json-file": { "version": "4.0.0", @@ -26845,33 +26825,40 @@ } }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.6.1", + "resolved": "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", "dev": true }, "loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "resolved": "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + } } }, "loud-rejection": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", - "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.2" + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -27320,18 +27307,6 @@ "read-pkg-up": "^3.0.0", "redent": "^2.0.0", "trim-newlines": "^2.0.0" - }, - "dependencies": { - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - } } }, "merge-class-names": { @@ -27543,8 +27518,8 @@ }, "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "resolved": "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", "dev": true }, "minimalistic-crypto-utils": { @@ -27746,51 +27721,6 @@ "array-union": "^1.0.2", "arrify": "^1.0.1", "minimatch": "^3.0.4" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } } }, "mustache": { @@ -27813,9 +27743,9 @@ "optional": true }, "nanoid": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", - "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" }, "nanomatch": { "version": "1.2.13", @@ -27918,6 +27848,13 @@ "requires": { "buffered-interpolation": "^0.2.5", "easyrtc": "1.1.0" + }, + "dependencies": { + "buffered-interpolation": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/buffered-interpolation/-/buffered-interpolation-0.2.5.tgz", + "integrity": "sha512-LauOWiVXZppapDpc8y2yzcf3/pKU1Exal/+H0EZeNVxttnWHqtyhEaJ2J4U5yia71FWqZvywnhx8xneh073xbA==" + } } }, "new-array": { @@ -28065,33 +28002,17 @@ } }, "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "version": "2.4.0", + "resolved": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", + "is-builtin-module": "^1.0.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" }, "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -28238,12 +28159,14 @@ "object-inspect": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=" + "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", + "dev": true }, "object-visit": { "version": "1.0.1", @@ -28288,27 +28211,25 @@ } }, "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.0.2", "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", + "is-regex": "^1.1.1", "object-inspect": "^1.9.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" }, "dependencies": { "object-keys": { @@ -28319,36 +28240,38 @@ } } }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", "has-symbols": "^1.0.1" } }, @@ -28371,26 +28294,6 @@ "dev": true } } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } } } }, @@ -28503,130 +28406,13 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } - } - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - } + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.pick": { @@ -29029,21 +28815,6 @@ "pump": "^3.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -29383,6 +29154,11 @@ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, "parserlib": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz", @@ -29390,6 +29166,11 @@ "dev": true, "optional": true }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz", @@ -29410,155 +29191,26 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, "requires": { "tslib": "^1.10.0" } }, "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", "dev": true, "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - }, - "dependencies": { - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" - } - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "signal-exit": "^3.0.2" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "strip-ansi": "^6.0.0" + "lower-case": "^2.0.1", + "tslib": "^1.10.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true } } }, @@ -29665,10 +29317,16 @@ "websocket": "^1.0.24" } }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true }, "pify": { "version": "3.0.0", @@ -30513,9 +30171,9 @@ } }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", + "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -30582,15 +30240,6 @@ "supports-color": "^6.1.0" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -31801,9 +31450,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", "dev": true }, "normalize-path": { @@ -31891,9 +31540,9 @@ } }, "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -31921,9 +31570,9 @@ "dev": true }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -34092,36 +33741,30 @@ } }, "sanitize-html": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.3.3.tgz", - "integrity": "sha512-DCFXPt7Di0c6JUnlT90eIgrjs6TsJl/8HYU3KLdmrVclFN4O0heTcVbJiMa23OKVr6aR051XYtsgd8EWwEBwUA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.0.tgz", + "integrity": "sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", "htmlparser2": "^6.0.0", "is-plain-object": "^5.0.0", - "klona": "^2.0.3", "parse-srcset": "^1.0.2", - "postcss": "^8.0.2" + "postcss": "^8.3.11" }, "dependencies": { - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "dom-serializer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", - "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", + "domhandler": "^4.2.0", "entities": "^2.0.0" } }, @@ -34131,21 +33774,21 @@ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domhandler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz", - "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "requires": { "domelementtype": "^2.2.0" } }, "domutils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz", - "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", - "domhandler": "^4.1.0" + "domhandler": "^4.2.0" } }, "entities": { @@ -34174,25 +33817,15 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, - "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" - }, "postcss": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", - "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", + "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.22", - "source-map": "^0.6.1" + "nanoid": "^3.2.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -34350,8 +33983,7 @@ "sdp-transform": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", - "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==", - "dev": true + "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==" }, "select": { "version": "1.1.2", @@ -34600,7 +34232,8 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "simple-concat": { "version": "1.0.1", @@ -34701,102 +34334,46 @@ } }, "socket.io-client": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.0.0.tgz", - "integrity": "sha512-27yQxmXJAEYF19Ygyl8FPJ0if0wegpSmkIIbrWJeI7n7ST1JyH8bbD5v3fjjGY5cfCanACJ3dARUAyiVFNrlTQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", + "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", "requires": { - "@types/component-emitter": "^1.2.10", + "@socket.io/component-emitter": "~3.0.0", "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~5.0.0", + "debug": "~4.3.2", + "engine.io-client": "~6.1.1", "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" + "socket.io-parser": "~4.1.1" }, "dependencies": { - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } }, - "engine.io-client": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.0.0.tgz", - "integrity": "sha512-e6GK0Fqvq45Nu/j7YdIVqXtDPvlsggAcfml3QiEiGdJ1qeh7IQU6knxSN3+yy9BmbnXtIfjo1hK4MFyHKdc9mQ==", - "requires": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "yeast": "0.1.2" - } - }, - "engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", - "requires": { - "base64-arraybuffer": "0.1.4" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" } } }, "socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz", + "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==", "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.0.0", "debug": "~4.3.1" }, "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -34879,6 +34456,11 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz", @@ -35637,6 +35219,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -35646,6 +35229,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -35656,6 +35240,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -35665,6 +35250,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -35965,16 +35551,6 @@ } } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -36980,16 +36556,15 @@ "dev": true }, "three": { - "version": "github:mozillareality/three.js#494c88f493ca73c4521171bc849b2918f3a5c528", - "from": "github:mozillareality/three.js#hubs/master" + "version": "github:mozillareality/three.js#2ea3755b4873db768c7b9b0b30e488e97e3bb613", + "from": "github:mozillareality/three.js#hubs-patches-133" }, "three-ammo": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/three-ammo/-/three-ammo-1.0.12.tgz", - "integrity": "sha512-lGA0RmdqvFHb84Glc/VHnMlWSU+Bywu7tu6Sb3woQVt+2Qm8UGSws4VIfzW7aYmMk3Vf1SHBSQfbwW0LWK+HCA==" + "version": "github:infinitelee/three-ammo#db3ad1104b258d963ca66165f9fbed4013faa32a", + "from": "github:infinitelee/three-ammo" }, "three-bmfont-text": { - "version": "github:mozillareality/three-bmfont-text#3cbce0b90403d7ca6e690e9174c650f4606b53d8", + "version": "github:mozillareality/three-bmfont-text#f6aa2ad7aca998d8fe448cde119ff7af498f4f99", "from": "github:mozillareality/three-bmfont-text#hubs/master", "requires": { "array-shuffle": "^1.0.1", @@ -37009,16 +36584,17 @@ } }, "three-mesh-bvh": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.1.2.tgz", - "integrity": "sha512-ZwwpWalwKGUEp+APg2plFI5v2ws0h7ii++a/sKBom9tvAum6wNxF4oFDQrMr87MukzJT8XKnGJli4PeLZDKTcw==" + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.3.7.tgz", + "integrity": "sha512-veRJRj0mY2rBj9yRZVg/E98wd6e7AzqzTq/+6ispY6m50gYuGitUNih2dRQzbkMcwRECLURvuudb9BFW3/swAw==" }, "three-pathfinding": { - "version": "github:MozillaReality/three-pathfinding#9934636508ff8f445ac1b1bba5dd55c5a69266ff", - "from": "github:MozillaReality/three-pathfinding#hubs/master2" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/three-pathfinding/-/three-pathfinding-0.14.1.tgz", + "integrity": "sha512-lBXt+GLlgCz/ppakGDj6L/JJH2JmZ8ZFiFHqey4v47V8SrzhKRuXfrsHo6IPF1Z/MDki/ahIf7uquW+jy/3hAg==" }, "three-to-ammo": { - "version": "github:infinitelee/three-to-ammo#92fd0e8300e693d4d48a603a8c446e520f9568ab", + "version": "github:infinitelee/three-to-ammo#9e68a3bbe500988f2dc0096f78c12dabbdaf5548", "from": "github:infinitelee/three-to-ammo" }, "throttle-debounce": { @@ -37419,26 +36995,6 @@ "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", "dev": true }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - } - } - }, "underscore": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz", @@ -39060,6 +38616,15 @@ "resolved": "https://registry.npmjs.org/webvr-polyfill-dpdb/-/webvr-polyfill-dpdb-1.0.18.tgz", "integrity": "sha512-O0S1ZGEWyPvyZEkS2VbyV7mtir/NM9MNK3EuhbHPoJ8EHTky2pTXehjIl+IiDPr+Lldgx129QGt3NGly7rwRPw==" }, + "webxr-polyfill": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/webxr-polyfill/-/webxr-polyfill-2.0.3.tgz", + "integrity": "sha512-lgTKYVeD4HeTwWdJN+SeS6iflGx3epz/3dww9X4GyuuXmYGAV5p8l34jUM/HRGHn1jKS3oZNZRC/J9MlSk/Zhg==", + "requires": { + "cardboard-vr-display": "^1.0.19", + "gl-matrix": "^2.8.1" + } + }, "well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", @@ -39117,30 +38682,6 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "dependencies": { - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, "which-module": { "version": "2.0.0", "resolved": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz", @@ -39324,6 +38865,11 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + }, "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", @@ -39375,9 +38921,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -39434,23 +38980,23 @@ "dev": true }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "wrap-ansi": { @@ -39465,15 +39011,15 @@ } }, "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } diff --git a/package.json b/package.json index 828ccda793..3cbe263ca4 100644 --- a/package.json +++ b/package.json @@ -79,13 +79,13 @@ "@mozillareality/easing-functions": "^0.1.1", "@mozillareality/three-batch-manager": "github:mozillareality/three-batch-manager#master", "@popperjs/core": "^2.4.4", - "aframe": "github:immers-space/aframe#hubs-cloud-safari-15-patches", + "aframe": "github:mozillareality/aframe#hubs/master", "aframe-rounded": "^1.0.3", - "aframe-slice9-component": "^1.0.0", + "aframe-slice9-component": "github:takahirox/aframe-slice9-component#AlphaTest", "ammo-debug-drawer": "github:infinitelee/ammo-debug-drawer", "ammo.js": "github:mozillareality/ammo.js#hubs/master", "animejs": "github:mozillareality/anime#hubs/master", - "buffered-interpolation": "^0.2.5", + "buffered-interpolation": "github:Infinitelee/buffered-interpolation", "classnames": "^2.2.5", "color": "^3.1.2", "copy-to-clipboard": "^3.0.8", @@ -141,16 +141,17 @@ "sdp-transform": "^2.14.1", "semver": "^7.3.2", "socket.io-client": "^4.0.0", - "three": "github:mozillareality/three.js#hubs/master", - "three-ammo": "^1.0.12", + "three": "github:mozillareality/three.js#hubs-patches-133", + "three-ammo": "github:infinitelee/three-ammo", "three-bmfont-text": "github:mozillareality/three-bmfont-text#hubs/master", - "three-mesh-bvh": "^0.1.2", - "three-pathfinding": "github:MozillaReality/three-pathfinding#hubs/master2", + "three-mesh-bvh": "^0.3.7", + "three-pathfinding": "^0.14.1", "three-to-ammo": "github:infinitelee/three-to-ammo", "use-clipboard-copy": "^0.1.2", "uuid": "^3.2.1", "web-monetization-polyfill": "^2.0.0", "webrtc-adapter": "^7.7.0", + "webxr-polyfill": "^2.0.3", "zip-loader": "^1.1.0" }, "devDependencies": { diff --git a/scripts/hab-build-and-push.sh b/scripts/hab-build-and-push.sh index af16746f93..3b7f014753 100755 --- a/scripts/hab-build-and-push.sh +++ b/scripts/hab-build-and-push.sh @@ -12,6 +12,7 @@ export GA_TRACKING_ID=$9 export BUILD_NUMBER=${10} export GIT_COMMIT=${11} export DISABLE_DEPLOY=${12} +export UPLOADS_HOST=${13} export BUILD_VERSION="${BUILD_NUMBER} (${GIT_COMMIT})" # Build the package, upload it, and start the service so we deploy to staging target. @@ -53,6 +54,7 @@ cors_proxy_server = $CORS_PROXY_SERVER non_cors_proxy_domains = $NON_CORS_PROXY_DOMAINS sentry_dsn = $SENTRY_DSN ga_tracking_id = $GA_TRACKING_ID +uploads_host = $UPLOADS_HOST [deploy] type = "$DEPLOY_TYPE" diff --git a/src/App.js b/src/App.js index 056bbbfce8..062f4dad30 100644 --- a/src/App.js +++ b/src/App.js @@ -8,5 +8,19 @@ export class App { this.mediaSearchStore = new MediaSearchStore(); this.hubChannel = null; this.mediaDevicesManager = null; + + // TODO: Remove comments + // TODO: Rename or reconfigure these as needed + this.audios = new Map(); // el -> (THREE.Audio || THREE.PositionalAudio) + this.sourceType = new Map(); // el -> SourceType + this.audioOverrides = new Map(); // el -> AudioSettings + this.zoneOverrides = new Map(); // el -> AudioSettings + this.audioDebugPanelOverrides = new Map(); // SourceType -> AudioSettings + this.sceneAudioDefaults = new Map(); // SourceType -> AudioSettings + this.gainMultipliers = new Map(); // el -> Number + this.supplementaryAttenuation = new Map(); // el -> Number + this.clippingState = new Set(); + this.linkedMutedState = new Set(); + this.isAudioPaused = new Set(); } } diff --git a/src/assets/blender-lut.cube b/src/assets/blender-lut.cube new file mode 100644 index 0000000000..eb6edfd6a9 --- /dev/null +++ b/src/assets/blender-lut.cube @@ -0,0 +1,32769 @@ +LUT_3D_SIZE 32 +0.000001 0.000001 0.000001 +0.037293 0.000001 0.000001 +0.079714 0.000001 0.000001 +0.120832 0.000001 0.000001 +0.159284 0.000001 0.000001 +0.194868 0.000001 0.000001 +0.227530 0.000001 0.000001 +0.257434 0.000001 0.000001 +0.285092 0.000001 0.000001 +0.310738 0.000001 0.000001 +0.334585 0.000001 0.000001 +0.356818 0.000001 0.000001 +0.377602 0.000001 0.000001 +0.397079 0.000001 0.000001 +0.415373 0.000001 0.000001 +0.432594 0.000001 0.000001 +0.448839 0.000001 0.000001 +0.464192 0.000001 0.000001 +0.478729 0.000001 0.000001 +0.492515 0.000001 0.000001 +0.505612 0.000001 0.000001 +0.518072 0.000001 0.000001 +0.529943 0.000001 0.000001 +0.541266 0.000001 0.000001 +0.552083 0.000001 0.000001 +0.562427 0.000001 0.000001 +0.572331 0.000001 0.000001 +0.581823 0.000001 0.000001 +0.590929 0.000001 0.000001 +0.599674 0.000001 0.000001 +0.608079 0.000001 0.000001 +0.616166 0.000001 0.000001 +0.000001 0.037293 0.000001 +0.037293 0.037293 0.000001 +0.079714 0.037293 0.000001 +0.120832 0.037293 0.000001 +0.159284 0.037293 0.000001 +0.194868 0.037293 0.000001 +0.227530 0.037293 0.000001 +0.257434 0.037293 0.000001 +0.285092 0.037293 0.000001 +0.310738 0.037293 0.000001 +0.334585 0.037293 0.000001 +0.356818 0.037293 0.000001 +0.377602 0.037293 0.000001 +0.397079 0.037293 0.000001 +0.415373 0.037293 0.000001 +0.432594 0.037293 0.000001 +0.448839 0.037293 0.000001 +0.464192 0.037293 0.000001 +0.478729 0.037293 0.000001 +0.492515 0.037293 0.000001 +0.505612 0.037293 0.000001 +0.518072 0.037293 0.000001 +0.529943 0.037293 0.000001 +0.541266 0.037293 0.000001 +0.552083 0.037293 0.000001 +0.562427 0.037293 0.000001 +0.572331 0.037293 0.000001 +0.581823 0.037293 0.000001 +0.590929 0.037293 0.000001 +0.599674 0.037293 0.000001 +0.608079 0.037293 0.000001 +0.616166 0.037293 0.000001 +0.000001 0.079714 0.000001 +0.037293 0.079714 0.000001 +0.079714 0.079714 0.000001 +0.120832 0.079714 0.000001 +0.159284 0.079714 0.000001 +0.194868 0.079714 0.000001 +0.227530 0.079714 0.000001 +0.257434 0.079714 0.000001 +0.285092 0.079714 0.000001 +0.310738 0.079714 0.000001 +0.334585 0.079714 0.000001 +0.356818 0.079714 0.000001 +0.377602 0.079714 0.000001 +0.397079 0.079714 0.000001 +0.415373 0.079714 0.000001 +0.432594 0.079714 0.000001 +0.448839 0.079714 0.000001 +0.464192 0.079714 0.000001 +0.478729 0.079714 0.000001 +0.492515 0.079714 0.000001 +0.505612 0.079714 0.000001 +0.518072 0.079714 0.000001 +0.529943 0.079714 0.000001 +0.541266 0.079714 0.000001 +0.552083 0.079714 0.000001 +0.562427 0.079714 0.000001 +0.572331 0.079714 0.000001 +0.581823 0.079714 0.000001 +0.590929 0.079714 0.000001 +0.599674 0.079714 0.000001 +0.608079 0.079714 0.000001 +0.616166 0.079714 0.000001 +0.000001 0.120832 0.000001 +0.037293 0.120832 0.000001 +0.079714 0.120832 0.000001 +0.120832 0.120832 0.000001 +0.159284 0.120832 0.000001 +0.194868 0.120832 0.000001 +0.227530 0.120832 0.000001 +0.257434 0.120832 0.000001 +0.285092 0.120832 0.000001 +0.310738 0.120832 0.000001 +0.334585 0.120832 0.000001 +0.356818 0.120832 0.000001 +0.377602 0.120832 0.000001 +0.397079 0.120832 0.000001 +0.415373 0.120832 0.000001 +0.432594 0.120832 0.000001 +0.448839 0.120832 0.000001 +0.464192 0.120832 0.000001 +0.478729 0.120832 0.000001 +0.492515 0.120832 0.000001 +0.505612 0.120832 0.000001 +0.518072 0.120832 0.000001 +0.529943 0.120832 0.000001 +0.541266 0.120832 0.000001 +0.552083 0.120832 0.000001 +0.562427 0.120832 0.000001 +0.572331 0.120832 0.000001 +0.581823 0.120832 0.000001 +0.590929 0.120832 0.000001 +0.599674 0.120832 0.000001 +0.608079 0.120832 0.000001 +0.616166 0.120832 0.000001 +0.000001 0.159284 0.000001 +0.037293 0.159284 0.000001 +0.079714 0.159284 0.000001 +0.120832 0.159284 0.000001 +0.159284 0.159284 0.000001 +0.194868 0.159284 0.000001 +0.227530 0.159284 0.000001 +0.257434 0.159284 0.000001 +0.285092 0.159284 0.000001 +0.310738 0.159284 0.000001 +0.334585 0.159284 0.000001 +0.356818 0.159284 0.000001 +0.377602 0.159284 0.000001 +0.397079 0.159284 0.000001 +0.415373 0.159284 0.000001 +0.432594 0.159284 0.000001 +0.448839 0.159284 0.000001 +0.464192 0.159284 0.000001 +0.478729 0.159284 0.000001 +0.492515 0.159284 0.000001 +0.505612 0.159284 0.000001 +0.518072 0.159284 0.000001 +0.529943 0.159284 0.000001 +0.541266 0.159284 0.000001 +0.552083 0.159284 0.000001 +0.562427 0.159284 0.000001 +0.572331 0.159284 0.000001 +0.581823 0.159284 0.000001 +0.590929 0.159284 0.000001 +0.599674 0.159284 0.000001 +0.608079 0.159284 0.000001 +0.616166 0.159284 0.000001 +0.000001 0.194868 0.000001 +0.037293 0.194868 0.000001 +0.079714 0.194868 0.000001 +0.120832 0.194868 0.000001 +0.159284 0.194868 0.000001 +0.194868 0.194868 0.000001 +0.227530 0.194868 0.000001 +0.257434 0.194868 0.000001 +0.285092 0.194868 0.000001 +0.310738 0.194868 0.000001 +0.334585 0.194868 0.000001 +0.356818 0.194868 0.000001 +0.377602 0.194868 0.000001 +0.397079 0.194868 0.000001 +0.415373 0.194868 0.000001 +0.432594 0.194868 0.000001 +0.448839 0.194868 0.000001 +0.464192 0.194868 0.000001 +0.478729 0.194868 0.000001 +0.492515 0.194868 0.000001 +0.505612 0.194868 0.000001 +0.518072 0.194868 0.000001 +0.529943 0.194868 0.000001 +0.541266 0.194868 0.000001 +0.552083 0.194868 0.000001 +0.562427 0.194868 0.000001 +0.572331 0.194868 0.000001 +0.581823 0.194868 0.000001 +0.590929 0.194868 0.000001 +0.599674 0.194868 0.000001 +0.608079 0.194868 0.000001 +0.616166 0.194868 0.000001 +0.000001 0.227530 0.000001 +0.037293 0.227530 0.000001 +0.079714 0.227530 0.000001 +0.120832 0.227530 0.000001 +0.159284 0.227530 0.000001 +0.194868 0.227530 0.000001 +0.227530 0.227530 0.000001 +0.257434 0.227530 0.000001 +0.285092 0.227530 0.000001 +0.310738 0.227530 0.000001 +0.334585 0.227530 0.000001 +0.356818 0.227530 0.000001 +0.377602 0.227530 0.000001 +0.397079 0.227530 0.000001 +0.415373 0.227530 0.000001 +0.432594 0.227530 0.000001 +0.448839 0.227530 0.000001 +0.464192 0.227530 0.000001 +0.478729 0.227530 0.000001 +0.492515 0.227530 0.000001 +0.505612 0.227530 0.000001 +0.518072 0.227530 0.000001 +0.529943 0.227530 0.000001 +0.541266 0.227530 0.000001 +0.552083 0.227530 0.000001 +0.562427 0.227530 0.000001 +0.572331 0.227530 0.000001 +0.581823 0.227530 0.000001 +0.590929 0.227530 0.000001 +0.599674 0.227530 0.000001 +0.608079 0.227530 0.000001 +0.616166 0.227530 0.000001 +0.000001 0.257434 0.000001 +0.037293 0.257434 0.000001 +0.079714 0.257434 0.000001 +0.120832 0.257434 0.000001 +0.159284 0.257434 0.000001 +0.194868 0.257434 0.000001 +0.227530 0.257434 0.000001 +0.257434 0.257434 0.000001 +0.285092 0.257434 0.000001 +0.310738 0.257434 0.000001 +0.334585 0.257434 0.000001 +0.356818 0.257434 0.000001 +0.377602 0.257434 0.000001 +0.397079 0.257434 0.000001 +0.415373 0.257434 0.000001 +0.432594 0.257434 0.000001 +0.448839 0.257434 0.000001 +0.464192 0.257434 0.000001 +0.478729 0.257434 0.000001 +0.492515 0.257434 0.000001 +0.505612 0.257434 0.000001 +0.518072 0.257434 0.000001 +0.529943 0.257434 0.000001 +0.541266 0.257434 0.000001 +0.552083 0.257434 0.000001 +0.562427 0.257434 0.000001 +0.572331 0.257434 0.000001 +0.581823 0.257434 0.000001 +0.590929 0.257434 0.000001 +0.599674 0.257434 0.000001 +0.608079 0.257434 0.000001 +0.616166 0.257434 0.000001 +0.000001 0.285092 0.000001 +0.037293 0.285092 0.000001 +0.079714 0.285092 0.000001 +0.120832 0.285092 0.000001 +0.159284 0.285092 0.000001 +0.194868 0.285092 0.000001 +0.227530 0.285092 0.000001 +0.257434 0.285092 0.000001 +0.285092 0.285092 0.000001 +0.310738 0.285092 0.000001 +0.334585 0.285092 0.000001 +0.356818 0.285092 0.000001 +0.377602 0.285092 0.000001 +0.397079 0.285092 0.000001 +0.415373 0.285092 0.000001 +0.432594 0.285092 0.000001 +0.448839 0.285092 0.000001 +0.464192 0.285092 0.000001 +0.478729 0.285092 0.000001 +0.492515 0.285092 0.000001 +0.505612 0.285092 0.000001 +0.518072 0.285092 0.000001 +0.529943 0.285092 0.000001 +0.541266 0.285092 0.000001 +0.552083 0.285092 0.000001 +0.562427 0.285092 0.000001 +0.572331 0.285092 0.000001 +0.581823 0.285092 0.000001 +0.590929 0.285092 0.000001 +0.599674 0.285092 0.000001 +0.608079 0.285092 0.000001 +0.616166 0.285092 0.000001 +0.000001 0.310738 0.000001 +0.037293 0.310738 0.000001 +0.079714 0.310738 0.000001 +0.120832 0.310738 0.000001 +0.159284 0.310738 0.000001 +0.194868 0.310738 0.000001 +0.227530 0.310738 0.000001 +0.257434 0.310738 0.000001 +0.285092 0.310738 0.000001 +0.310738 0.310738 0.000001 +0.334585 0.310738 0.000001 +0.356818 0.310738 0.000001 +0.377602 0.310738 0.000001 +0.397079 0.310738 0.000001 +0.415373 0.310738 0.000001 +0.432594 0.310738 0.000001 +0.448839 0.310738 0.000001 +0.464192 0.310738 0.000001 +0.478729 0.310738 0.000001 +0.492515 0.310738 0.000001 +0.505612 0.310738 0.000001 +0.518072 0.310738 0.000001 +0.529943 0.310738 0.000001 +0.541266 0.310738 0.000001 +0.552083 0.310738 0.000001 +0.562427 0.310738 0.000001 +0.572331 0.310738 0.000001 +0.581823 0.310738 0.000001 +0.590929 0.310738 0.000001 +0.599674 0.310738 0.000001 +0.608079 0.310738 0.000001 +0.616166 0.310738 0.000001 +0.000001 0.334585 0.000001 +0.037293 0.334585 0.000001 +0.079714 0.334585 0.000001 +0.120832 0.334585 0.000001 +0.159284 0.334585 0.000001 +0.194868 0.334585 0.000001 +0.227530 0.334585 0.000001 +0.257434 0.334585 0.000001 +0.285092 0.334585 0.000001 +0.310738 0.334585 0.000001 +0.334585 0.334585 0.000001 +0.356818 0.334585 0.000001 +0.377602 0.334585 0.000001 +0.397079 0.334585 0.000001 +0.415373 0.334585 0.000001 +0.432594 0.334585 0.000001 +0.448839 0.334585 0.000001 +0.464192 0.334585 0.000001 +0.478729 0.334585 0.000001 +0.492515 0.334585 0.000001 +0.505612 0.334585 0.000001 +0.518072 0.334585 0.000001 +0.529943 0.334585 0.000001 +0.541266 0.334585 0.000001 +0.552083 0.334585 0.000001 +0.562427 0.334585 0.000001 +0.572331 0.334585 0.000001 +0.581823 0.334585 0.000001 +0.590929 0.334585 0.000001 +0.599674 0.334585 0.000001 +0.608079 0.334585 0.000001 +0.616166 0.334585 0.000001 +0.000001 0.356818 0.000001 +0.037293 0.356818 0.000001 +0.079714 0.356818 0.000001 +0.120832 0.356818 0.000001 +0.159284 0.356818 0.000001 +0.194868 0.356818 0.000001 +0.227530 0.356818 0.000001 +0.257434 0.356818 0.000001 +0.285092 0.356818 0.000001 +0.310738 0.356818 0.000001 +0.334585 0.356818 0.000001 +0.356818 0.356818 0.000001 +0.377602 0.356818 0.000001 +0.397079 0.356818 0.000001 +0.415373 0.356818 0.000001 +0.432594 0.356818 0.000001 +0.448839 0.356818 0.000001 +0.464192 0.356818 0.000001 +0.478729 0.356818 0.000001 +0.492515 0.356818 0.000001 +0.505612 0.356818 0.000001 +0.518072 0.356818 0.000001 +0.529943 0.356818 0.000001 +0.541266 0.356818 0.000001 +0.552083 0.356818 0.000001 +0.562427 0.356818 0.000001 +0.572331 0.356818 0.000001 +0.581823 0.356818 0.000001 +0.590929 0.356818 0.000001 +0.599674 0.356818 0.000001 +0.608079 0.356818 0.000001 +0.616166 0.356818 0.000001 +0.000001 0.377602 0.000001 +0.037293 0.377602 0.000001 +0.079714 0.377602 0.000001 +0.120832 0.377602 0.000001 +0.159284 0.377602 0.000001 +0.194868 0.377602 0.000001 +0.227530 0.377602 0.000001 +0.257434 0.377602 0.000001 +0.285092 0.377602 0.000001 +0.310738 0.377602 0.000001 +0.334585 0.377602 0.000001 +0.356818 0.377602 0.000001 +0.377602 0.377602 0.000001 +0.397079 0.377602 0.000001 +0.415373 0.377602 0.000001 +0.432594 0.377602 0.000001 +0.448839 0.377602 0.000001 +0.464192 0.377602 0.000001 +0.478729 0.377602 0.000001 +0.492515 0.377602 0.000001 +0.505612 0.377602 0.000001 +0.518072 0.377602 0.000001 +0.529943 0.377602 0.000001 +0.541266 0.377602 0.000001 +0.552083 0.377602 0.000001 +0.562427 0.377602 0.000001 +0.572331 0.377602 0.000001 +0.581823 0.377602 0.000001 +0.590929 0.377602 0.000001 +0.599674 0.377602 0.000001 +0.608079 0.377602 0.000001 +0.616166 0.377602 0.000001 +0.000001 0.397079 0.000001 +0.037293 0.397079 0.000001 +0.079714 0.397079 0.000001 +0.120832 0.397079 0.000001 +0.159284 0.397079 0.000001 +0.194868 0.397079 0.000001 +0.227530 0.397079 0.000001 +0.257434 0.397079 0.000001 +0.285092 0.397079 0.000001 +0.310738 0.397079 0.000001 +0.334585 0.397079 0.000001 +0.356818 0.397079 0.000001 +0.377602 0.397079 0.000001 +0.397079 0.397079 0.000001 +0.415373 0.397079 0.000001 +0.432594 0.397079 0.000001 +0.448839 0.397079 0.000001 +0.464192 0.397079 0.000001 +0.478729 0.397079 0.000001 +0.492515 0.397079 0.000001 +0.505612 0.397079 0.000001 +0.518072 0.397079 0.000001 +0.529943 0.397079 0.000001 +0.541266 0.397079 0.000001 +0.552083 0.397079 0.000001 +0.562427 0.397079 0.000001 +0.572331 0.397079 0.000001 +0.581823 0.397079 0.000001 +0.590929 0.397079 0.000001 +0.599674 0.397079 0.000001 +0.608079 0.397079 0.000001 +0.616166 0.397079 0.000001 +0.000001 0.415373 0.000001 +0.037293 0.415373 0.000001 +0.079714 0.415373 0.000001 +0.120832 0.415373 0.000001 +0.159284 0.415373 0.000001 +0.194868 0.415373 0.000001 +0.227530 0.415373 0.000001 +0.257434 0.415373 0.000001 +0.285092 0.415373 0.000001 +0.310738 0.415373 0.000001 +0.334585 0.415373 0.000001 +0.356818 0.415373 0.000001 +0.377602 0.415373 0.000001 +0.397079 0.415373 0.000001 +0.415373 0.415373 0.000001 +0.432594 0.415373 0.000001 +0.448839 0.415373 0.000001 +0.464192 0.415373 0.000001 +0.478729 0.415373 0.000001 +0.492515 0.415373 0.000001 +0.505612 0.415373 0.000001 +0.518072 0.415373 0.000001 +0.529943 0.415373 0.000001 +0.541266 0.415373 0.000001 +0.552083 0.415373 0.000001 +0.562427 0.415373 0.000001 +0.572331 0.415373 0.000001 +0.581823 0.415373 0.000001 +0.590929 0.415373 0.000001 +0.599674 0.415373 0.000001 +0.608079 0.415373 0.000001 +0.616166 0.415373 0.000001 +0.000001 0.432594 0.000001 +0.037293 0.432594 0.000001 +0.079714 0.432594 0.000001 +0.120832 0.432594 0.000001 +0.159284 0.432594 0.000001 +0.194868 0.432594 0.000001 +0.227530 0.432594 0.000001 +0.257434 0.432594 0.000001 +0.285092 0.432594 0.000001 +0.310738 0.432594 0.000001 +0.334585 0.432594 0.000001 +0.356818 0.432594 0.000001 +0.377602 0.432594 0.000001 +0.397079 0.432594 0.000001 +0.415373 0.432594 0.000001 +0.432594 0.432594 0.000001 +0.448839 0.432594 0.000001 +0.464192 0.432594 0.000001 +0.478729 0.432594 0.000001 +0.492515 0.432594 0.000001 +0.505612 0.432594 0.000001 +0.518072 0.432594 0.000001 +0.529943 0.432594 0.000001 +0.541266 0.432594 0.000001 +0.552083 0.432594 0.000001 +0.562427 0.432594 0.000001 +0.572331 0.432594 0.000001 +0.581823 0.432594 0.000001 +0.590929 0.432594 0.000001 +0.599674 0.432594 0.000001 +0.608079 0.432594 0.000001 +0.616166 0.432594 0.000001 +0.000001 0.448839 0.000001 +0.037293 0.448839 0.000001 +0.079714 0.448839 0.000001 +0.120832 0.448839 0.000001 +0.159284 0.448839 0.000001 +0.194868 0.448839 0.000001 +0.227530 0.448839 0.000001 +0.257434 0.448839 0.000001 +0.285092 0.448839 0.000001 +0.310738 0.448839 0.000001 +0.334585 0.448839 0.000001 +0.356818 0.448839 0.000001 +0.377602 0.448839 0.000001 +0.397079 0.448839 0.000001 +0.415373 0.448839 0.000001 +0.432594 0.448839 0.000001 +0.448839 0.448839 0.000001 +0.464192 0.448839 0.000001 +0.478729 0.448839 0.000001 +0.492515 0.448839 0.000001 +0.505612 0.448839 0.000001 +0.518072 0.448839 0.000001 +0.529943 0.448839 0.000001 +0.541266 0.448839 0.000001 +0.552083 0.448839 0.000001 +0.562427 0.448839 0.000001 +0.572331 0.448839 0.000001 +0.581823 0.448839 0.000001 +0.590929 0.448839 0.000001 +0.599674 0.448839 0.000001 +0.608079 0.448839 0.000001 +0.616166 0.448839 0.000001 +0.000001 0.464192 0.000001 +0.037293 0.464192 0.000001 +0.079714 0.464192 0.000001 +0.120832 0.464192 0.000001 +0.159284 0.464192 0.000001 +0.194868 0.464192 0.000001 +0.227530 0.464192 0.000001 +0.257434 0.464192 0.000001 +0.285092 0.464192 0.000001 +0.310738 0.464192 0.000001 +0.334585 0.464192 0.000001 +0.356818 0.464192 0.000001 +0.377602 0.464192 0.000001 +0.397079 0.464192 0.000001 +0.415373 0.464192 0.000001 +0.432594 0.464192 0.000001 +0.448839 0.464192 0.000001 +0.464192 0.464192 0.000001 +0.478729 0.464192 0.000001 +0.492515 0.464192 0.000001 +0.505612 0.464192 0.000001 +0.518072 0.464192 0.000001 +0.529943 0.464192 0.000001 +0.541266 0.464192 0.000001 +0.552083 0.464192 0.000001 +0.562427 0.464192 0.000001 +0.572331 0.464192 0.000001 +0.581823 0.464192 0.000001 +0.590929 0.464192 0.000001 +0.599674 0.464192 0.000001 +0.608079 0.464192 0.000001 +0.616166 0.464192 0.000001 +0.000001 0.478729 0.000001 +0.037293 0.478729 0.000001 +0.079714 0.478729 0.000001 +0.120832 0.478729 0.000001 +0.159284 0.478729 0.000001 +0.194868 0.478729 0.000001 +0.227530 0.478729 0.000001 +0.257434 0.478729 0.000001 +0.285092 0.478729 0.000001 +0.310738 0.478729 0.000001 +0.334585 0.478729 0.000001 +0.356818 0.478729 0.000001 +0.377602 0.478729 0.000001 +0.397079 0.478729 0.000001 +0.415373 0.478729 0.000001 +0.432594 0.478729 0.000001 +0.448839 0.478729 0.000001 +0.464192 0.478729 0.000001 +0.478729 0.478729 0.000001 +0.492515 0.478729 0.000001 +0.505612 0.478729 0.000001 +0.518072 0.478729 0.000001 +0.529943 0.478729 0.000001 +0.541266 0.478729 0.000001 +0.552083 0.478729 0.000001 +0.562427 0.478729 0.000001 +0.572331 0.478729 0.000001 +0.581823 0.478729 0.000001 +0.590929 0.478729 0.000001 +0.599674 0.478729 0.000001 +0.608079 0.478729 0.000001 +0.616166 0.478729 0.000001 +0.000001 0.492515 0.000001 +0.037293 0.492515 0.000001 +0.079714 0.492515 0.000001 +0.120832 0.492515 0.000001 +0.159284 0.492515 0.000001 +0.194868 0.492515 0.000001 +0.227530 0.492515 0.000001 +0.257434 0.492515 0.000001 +0.285092 0.492515 0.000001 +0.310738 0.492515 0.000001 +0.334585 0.492515 0.000001 +0.356818 0.492515 0.000001 +0.377602 0.492515 0.000001 +0.397079 0.492515 0.000001 +0.415373 0.492515 0.000001 +0.432594 0.492515 0.000001 +0.448839 0.492515 0.000001 +0.464192 0.492515 0.000001 +0.478729 0.492515 0.000001 +0.492515 0.492515 0.000001 +0.505612 0.492515 0.000001 +0.518072 0.492515 0.000001 +0.529943 0.492515 0.000001 +0.541266 0.492515 0.000001 +0.552083 0.492515 0.000001 +0.562427 0.492515 0.000001 +0.572331 0.492515 0.000001 +0.581823 0.492515 0.000001 +0.590929 0.492515 0.000001 +0.599674 0.492515 0.000001 +0.608079 0.492515 0.000001 +0.616166 0.492515 0.000001 +0.000001 0.505612 0.000001 +0.037293 0.505612 0.000001 +0.079714 0.505612 0.000001 +0.120832 0.505612 0.000001 +0.159284 0.505612 0.000001 +0.194868 0.505612 0.000001 +0.227530 0.505612 0.000001 +0.257434 0.505612 0.000001 +0.285092 0.505612 0.000001 +0.310738 0.505612 0.000001 +0.334585 0.505612 0.000001 +0.356818 0.505612 0.000001 +0.377602 0.505612 0.000001 +0.397079 0.505612 0.000001 +0.415373 0.505612 0.000001 +0.432594 0.505612 0.000001 +0.448839 0.505612 0.000001 +0.464192 0.505612 0.000001 +0.478729 0.505612 0.000001 +0.492515 0.505612 0.000001 +0.505612 0.505612 0.000001 +0.518072 0.505612 0.000001 +0.529943 0.505612 0.000001 +0.541266 0.505612 0.000001 +0.552083 0.505612 0.000001 +0.562427 0.505612 0.000001 +0.572331 0.505612 0.000001 +0.581823 0.505612 0.000001 +0.590929 0.505612 0.000001 +0.599674 0.505612 0.000001 +0.608079 0.505612 0.000001 +0.616166 0.505612 0.000001 +0.000001 0.518072 0.000001 +0.037293 0.518072 0.000001 +0.079714 0.518072 0.000001 +0.120832 0.518072 0.000001 +0.159284 0.518072 0.000001 +0.194868 0.518072 0.000001 +0.227530 0.518072 0.000001 +0.257434 0.518072 0.000001 +0.285092 0.518072 0.000001 +0.310738 0.518072 0.000001 +0.334585 0.518072 0.000001 +0.356818 0.518072 0.000001 +0.377602 0.518072 0.000001 +0.397079 0.518072 0.000001 +0.415373 0.518072 0.000001 +0.432594 0.518072 0.000001 +0.448839 0.518072 0.000001 +0.464192 0.518072 0.000001 +0.478729 0.518072 0.000001 +0.492515 0.518072 0.000001 +0.505612 0.518072 0.000001 +0.518072 0.518072 0.000001 +0.529943 0.518072 0.000001 +0.541266 0.518072 0.000001 +0.552083 0.518072 0.000001 +0.562427 0.518072 0.000001 +0.572331 0.518072 0.000001 +0.581823 0.518072 0.000001 +0.590929 0.518072 0.000001 +0.599674 0.518072 0.000001 +0.608079 0.518072 0.000001 +0.616166 0.518072 0.000001 +0.000001 0.529943 0.000001 +0.037293 0.529943 0.000001 +0.079714 0.529943 0.000001 +0.120832 0.529943 0.000001 +0.159284 0.529943 0.000001 +0.194868 0.529943 0.000001 +0.227530 0.529943 0.000001 +0.257434 0.529943 0.000001 +0.285092 0.529943 0.000001 +0.310738 0.529943 0.000001 +0.334585 0.529943 0.000001 +0.356818 0.529943 0.000001 +0.377602 0.529943 0.000001 +0.397079 0.529943 0.000001 +0.415373 0.529943 0.000001 +0.432594 0.529943 0.000001 +0.448839 0.529943 0.000001 +0.464192 0.529943 0.000001 +0.478729 0.529943 0.000001 +0.492515 0.529943 0.000001 +0.505612 0.529943 0.000001 +0.518072 0.529943 0.000001 +0.529943 0.529943 0.000001 +0.541266 0.529943 0.000001 +0.552083 0.529943 0.000001 +0.562427 0.529943 0.000001 +0.572331 0.529943 0.000001 +0.581823 0.529943 0.000001 +0.590929 0.529943 0.000001 +0.599674 0.529943 0.000001 +0.608079 0.529943 0.000001 +0.616166 0.529943 0.000001 +0.000001 0.541266 0.000001 +0.037293 0.541266 0.000001 +0.079714 0.541266 0.000001 +0.120832 0.541266 0.000001 +0.159284 0.541266 0.000001 +0.194868 0.541266 0.000001 +0.227530 0.541266 0.000001 +0.257434 0.541266 0.000001 +0.285092 0.541266 0.000001 +0.310738 0.541266 0.000001 +0.334585 0.541266 0.000001 +0.356818 0.541266 0.000001 +0.377602 0.541266 0.000001 +0.397079 0.541266 0.000001 +0.415373 0.541266 0.000001 +0.432594 0.541266 0.000001 +0.448839 0.541266 0.000001 +0.464192 0.541266 0.000001 +0.478729 0.541266 0.000001 +0.492515 0.541266 0.000001 +0.505612 0.541266 0.000001 +0.518072 0.541266 0.000001 +0.529943 0.541266 0.000001 +0.541266 0.541266 0.000001 +0.552083 0.541266 0.000001 +0.562427 0.541266 0.000001 +0.572331 0.541266 0.000001 +0.581823 0.541266 0.000001 +0.590929 0.541266 0.000001 +0.599674 0.541266 0.000001 +0.608079 0.541266 0.000001 +0.616166 0.541266 0.000001 +0.000001 0.552083 0.000001 +0.037293 0.552083 0.000001 +0.079714 0.552083 0.000001 +0.120832 0.552083 0.000001 +0.159284 0.552083 0.000001 +0.194868 0.552083 0.000001 +0.227530 0.552083 0.000001 +0.257434 0.552083 0.000001 +0.285092 0.552083 0.000001 +0.310738 0.552083 0.000001 +0.334585 0.552083 0.000001 +0.356818 0.552083 0.000001 +0.377602 0.552083 0.000001 +0.397079 0.552083 0.000001 +0.415373 0.552083 0.000001 +0.432594 0.552083 0.000001 +0.448839 0.552083 0.000001 +0.464192 0.552083 0.000001 +0.478729 0.552083 0.000001 +0.492515 0.552083 0.000001 +0.505612 0.552083 0.000001 +0.518072 0.552083 0.000001 +0.529943 0.552083 0.000001 +0.541266 0.552083 0.000001 +0.552083 0.552083 0.000001 +0.562427 0.552083 0.000001 +0.572331 0.552083 0.000001 +0.581823 0.552083 0.000001 +0.590929 0.552083 0.000001 +0.599674 0.552083 0.000001 +0.608079 0.552083 0.000001 +0.616166 0.552083 0.000001 +0.000001 0.562427 0.000001 +0.037293 0.562427 0.000001 +0.079714 0.562427 0.000001 +0.120832 0.562427 0.000001 +0.159284 0.562427 0.000001 +0.194868 0.562427 0.000001 +0.227530 0.562427 0.000001 +0.257434 0.562427 0.000001 +0.285092 0.562427 0.000001 +0.310738 0.562427 0.000001 +0.334585 0.562427 0.000001 +0.356818 0.562427 0.000001 +0.377602 0.562427 0.000001 +0.397079 0.562427 0.000001 +0.415373 0.562427 0.000001 +0.432594 0.562427 0.000001 +0.448839 0.562427 0.000001 +0.464192 0.562427 0.000001 +0.478729 0.562427 0.000001 +0.492515 0.562427 0.000001 +0.505612 0.562427 0.000001 +0.518072 0.562427 0.000001 +0.529943 0.562427 0.000001 +0.541266 0.562427 0.000001 +0.552083 0.562427 0.000001 +0.562427 0.562427 0.000001 +0.572331 0.562427 0.000001 +0.581823 0.562427 0.000001 +0.590929 0.562427 0.000001 +0.599674 0.562427 0.000001 +0.608079 0.562427 0.000001 +0.616166 0.562427 0.000001 +0.000001 0.572331 0.000001 +0.037293 0.572331 0.000001 +0.079714 0.572331 0.000001 +0.120832 0.572331 0.000001 +0.159284 0.572331 0.000001 +0.194868 0.572331 0.000001 +0.227530 0.572331 0.000001 +0.257434 0.572331 0.000001 +0.285092 0.572331 0.000001 +0.310738 0.572331 0.000001 +0.334585 0.572331 0.000001 +0.356818 0.572331 0.000001 +0.377602 0.572331 0.000001 +0.397079 0.572331 0.000001 +0.415373 0.572331 0.000001 +0.432594 0.572331 0.000001 +0.448839 0.572331 0.000001 +0.464192 0.572331 0.000001 +0.478729 0.572331 0.000001 +0.492515 0.572331 0.000001 +0.505612 0.572331 0.000001 +0.518072 0.572331 0.000001 +0.529943 0.572331 0.000001 +0.541266 0.572331 0.000001 +0.552083 0.572331 0.000001 +0.562427 0.572331 0.000001 +0.572331 0.572331 0.000001 +0.581823 0.572331 0.000001 +0.590929 0.572331 0.000001 +0.599674 0.572331 0.000001 +0.608079 0.572331 0.000001 +0.616166 0.572331 0.000001 +0.000001 0.581823 0.000001 +0.037293 0.581823 0.000001 +0.079714 0.581823 0.000001 +0.120832 0.581823 0.000001 +0.159284 0.581823 0.000001 +0.194868 0.581823 0.000001 +0.227530 0.581823 0.000001 +0.257434 0.581823 0.000001 +0.285092 0.581823 0.000001 +0.310738 0.581823 0.000001 +0.334585 0.581823 0.000001 +0.356818 0.581823 0.000001 +0.377602 0.581823 0.000001 +0.397079 0.581823 0.000001 +0.415373 0.581823 0.000001 +0.432594 0.581823 0.000001 +0.448839 0.581823 0.000001 +0.464192 0.581823 0.000001 +0.478729 0.581823 0.000001 +0.492515 0.581823 0.000001 +0.505612 0.581823 0.000001 +0.518072 0.581823 0.000001 +0.529943 0.581823 0.000001 +0.541266 0.581823 0.000001 +0.552083 0.581823 0.000001 +0.562427 0.581823 0.000001 +0.572331 0.581823 0.000001 +0.581823 0.581823 0.000001 +0.590929 0.581823 0.000001 +0.599674 0.581823 0.000001 +0.608079 0.581823 0.000001 +0.616166 0.581823 0.000001 +0.000001 0.590929 0.000001 +0.037293 0.590929 0.000001 +0.079714 0.590929 0.000001 +0.120832 0.590929 0.000001 +0.159284 0.590929 0.000001 +0.194868 0.590929 0.000001 +0.227530 0.590929 0.000001 +0.257434 0.590929 0.000001 +0.285092 0.590929 0.000001 +0.310738 0.590929 0.000001 +0.334585 0.590929 0.000001 +0.356818 0.590929 0.000001 +0.377602 0.590929 0.000001 +0.397079 0.590929 0.000001 +0.415373 0.590929 0.000001 +0.432594 0.590929 0.000001 +0.448839 0.590929 0.000001 +0.464192 0.590929 0.000001 +0.478729 0.590929 0.000001 +0.492515 0.590929 0.000001 +0.505612 0.590929 0.000001 +0.518072 0.590929 0.000001 +0.529943 0.590929 0.000001 +0.541266 0.590929 0.000001 +0.552083 0.590929 0.000001 +0.562427 0.590929 0.000001 +0.572331 0.590929 0.000001 +0.581823 0.590929 0.000001 +0.590929 0.590929 0.000001 +0.599674 0.590929 0.000001 +0.608079 0.590929 0.000001 +0.616166 0.590929 0.000001 +0.000001 0.599674 0.000001 +0.037293 0.599674 0.000001 +0.079714 0.599674 0.000001 +0.120832 0.599674 0.000001 +0.159284 0.599674 0.000001 +0.194868 0.599674 0.000001 +0.227530 0.599674 0.000001 +0.257434 0.599674 0.000001 +0.285092 0.599674 0.000001 +0.310738 0.599674 0.000001 +0.334585 0.599674 0.000001 +0.356818 0.599674 0.000001 +0.377602 0.599674 0.000001 +0.397079 0.599674 0.000001 +0.415373 0.599674 0.000001 +0.432594 0.599674 0.000001 +0.448839 0.599674 0.000001 +0.464192 0.599674 0.000001 +0.478729 0.599674 0.000001 +0.492515 0.599674 0.000001 +0.505612 0.599674 0.000001 +0.518072 0.599674 0.000001 +0.529943 0.599674 0.000001 +0.541266 0.599674 0.000001 +0.552083 0.599674 0.000001 +0.562427 0.599674 0.000001 +0.572331 0.599674 0.000001 +0.581823 0.599674 0.000001 +0.590929 0.599674 0.000001 +0.599674 0.599674 0.000001 +0.608079 0.599674 0.000001 +0.616166 0.599674 0.000001 +0.000001 0.608079 0.000001 +0.037293 0.608079 0.000001 +0.079714 0.608079 0.000001 +0.120832 0.608079 0.000001 +0.159284 0.608079 0.000001 +0.194868 0.608079 0.000001 +0.227530 0.608079 0.000001 +0.257434 0.608079 0.000001 +0.285092 0.608079 0.000001 +0.310738 0.608079 0.000001 +0.334585 0.608079 0.000001 +0.356818 0.608079 0.000001 +0.377602 0.608079 0.000001 +0.397079 0.608079 0.000001 +0.415373 0.608079 0.000001 +0.432594 0.608079 0.000001 +0.448839 0.608079 0.000001 +0.464192 0.608079 0.000001 +0.478729 0.608079 0.000001 +0.492515 0.608079 0.000001 +0.505612 0.608079 0.000001 +0.518072 0.608079 0.000001 +0.529943 0.608079 0.000001 +0.541266 0.608079 0.000001 +0.552083 0.608079 0.000001 +0.562427 0.608079 0.000001 +0.572331 0.608079 0.000001 +0.581823 0.608079 0.000001 +0.590929 0.608079 0.000001 +0.599674 0.608079 0.000001 +0.608079 0.608079 0.000001 +0.616166 0.608079 0.000001 +0.000001 0.616166 0.000001 +0.037293 0.616166 0.000001 +0.079714 0.616166 0.000001 +0.120832 0.616166 0.000001 +0.159284 0.616166 0.000001 +0.194868 0.616166 0.000001 +0.227530 0.616166 0.000001 +0.257434 0.616166 0.000001 +0.285092 0.616166 0.000001 +0.310738 0.616166 0.000001 +0.334585 0.616166 0.000001 +0.356818 0.616166 0.000001 +0.377602 0.616166 0.000001 +0.397079 0.616166 0.000001 +0.415373 0.616166 0.000001 +0.432594 0.616166 0.000001 +0.448839 0.616166 0.000001 +0.464192 0.616166 0.000001 +0.478729 0.616166 0.000001 +0.492515 0.616166 0.000001 +0.505612 0.616166 0.000001 +0.518072 0.616166 0.000001 +0.529943 0.616166 0.000001 +0.541266 0.616166 0.000001 +0.552083 0.616166 0.000001 +0.562427 0.616166 0.000001 +0.572331 0.616166 0.000001 +0.581823 0.616166 0.000001 +0.590929 0.616166 0.000001 +0.599674 0.616166 0.000001 +0.608079 0.616166 0.000001 +0.616166 0.616166 0.000001 +0.000001 0.000001 0.037293 +0.037293 0.000001 0.037293 +0.079714 0.000001 0.037293 +0.120832 0.000001 0.037293 +0.159284 0.000001 0.037293 +0.194868 0.000001 0.037293 +0.227530 0.000001 0.037293 +0.257434 0.000001 0.037293 +0.285092 0.000001 0.037293 +0.310738 0.000001 0.037293 +0.334585 0.000001 0.037293 +0.356818 0.000001 0.037293 +0.377602 0.000001 0.037293 +0.397079 0.000001 0.037293 +0.415373 0.000001 0.037293 +0.432594 0.000001 0.037293 +0.448839 0.000001 0.037293 +0.464192 0.000001 0.037293 +0.478729 0.000001 0.037293 +0.492515 0.000001 0.037293 +0.505612 0.000001 0.037293 +0.518072 0.000001 0.037293 +0.529943 0.000001 0.037293 +0.541266 0.000001 0.037293 +0.552083 0.000001 0.037293 +0.562427 0.000001 0.037293 +0.572331 0.000001 0.037293 +0.581823 0.000001 0.037293 +0.590929 0.000001 0.037293 +0.599674 0.000001 0.037293 +0.608079 0.000001 0.037293 +0.616166 0.000001 0.037293 +0.000001 0.037293 0.037293 +0.037293 0.037293 0.037293 +0.079714 0.037293 0.037293 +0.120832 0.037293 0.037293 +0.159284 0.037293 0.037293 +0.194868 0.037293 0.037293 +0.227530 0.037293 0.037293 +0.257434 0.037293 0.037293 +0.285092 0.037293 0.037293 +0.310738 0.037293 0.037293 +0.334585 0.037293 0.037293 +0.356818 0.037293 0.037293 +0.377602 0.037293 0.037293 +0.397079 0.037293 0.037293 +0.415373 0.037293 0.037293 +0.432594 0.037293 0.037293 +0.448839 0.037293 0.037293 +0.464192 0.037293 0.037293 +0.478729 0.037293 0.037293 +0.492515 0.037293 0.037293 +0.505612 0.037293 0.037293 +0.518072 0.037293 0.037293 +0.529943 0.037293 0.037293 +0.541266 0.037293 0.037293 +0.552083 0.037293 0.037293 +0.562427 0.037293 0.037293 +0.572331 0.037293 0.037293 +0.581823 0.037293 0.037293 +0.590929 0.037293 0.037293 +0.599674 0.037293 0.037293 +0.608079 0.037293 0.037293 +0.616166 0.037293 0.037293 +0.000001 0.079714 0.037293 +0.037293 0.079714 0.037293 +0.079714 0.079714 0.037293 +0.120832 0.079714 0.037293 +0.159284 0.079714 0.037293 +0.194868 0.079714 0.037293 +0.227530 0.079714 0.037293 +0.257434 0.079714 0.037293 +0.285092 0.079714 0.037293 +0.310738 0.079714 0.037293 +0.334585 0.079714 0.037293 +0.356818 0.079714 0.037293 +0.377602 0.079714 0.037293 +0.397079 0.079714 0.037293 +0.415373 0.079714 0.037293 +0.432594 0.079714 0.037293 +0.448839 0.079714 0.037293 +0.464192 0.079714 0.037293 +0.478729 0.079714 0.037293 +0.492515 0.079714 0.037293 +0.505612 0.079714 0.037293 +0.518072 0.079714 0.037293 +0.529943 0.079714 0.037293 +0.541266 0.079714 0.037293 +0.552083 0.079714 0.037293 +0.562427 0.079714 0.037293 +0.572331 0.079714 0.037293 +0.581823 0.079714 0.037293 +0.590929 0.079714 0.037293 +0.599674 0.079714 0.037293 +0.608079 0.079714 0.037293 +0.616166 0.079714 0.037293 +0.000001 0.120832 0.037293 +0.037293 0.120832 0.037293 +0.079714 0.120832 0.037293 +0.120832 0.120832 0.037293 +0.159284 0.120832 0.037293 +0.194868 0.120832 0.037293 +0.227530 0.120832 0.037293 +0.257434 0.120832 0.037293 +0.285092 0.120832 0.037293 +0.310738 0.120832 0.037293 +0.334585 0.120832 0.037293 +0.356818 0.120832 0.037293 +0.377602 0.120832 0.037293 +0.397079 0.120832 0.037293 +0.415373 0.120832 0.037293 +0.432594 0.120832 0.037293 +0.448839 0.120832 0.037293 +0.464192 0.120832 0.037293 +0.478729 0.120832 0.037293 +0.492515 0.120832 0.037293 +0.505612 0.120832 0.037293 +0.518072 0.120832 0.037293 +0.529943 0.120832 0.037293 +0.541266 0.120832 0.037293 +0.552083 0.120832 0.037293 +0.562427 0.120832 0.037293 +0.572331 0.120832 0.037293 +0.581823 0.120832 0.037293 +0.590929 0.120832 0.037293 +0.599674 0.120832 0.037293 +0.608079 0.120832 0.037293 +0.616166 0.120832 0.037293 +0.000001 0.159284 0.037293 +0.037293 0.159284 0.037293 +0.079714 0.159284 0.037293 +0.120832 0.159284 0.037293 +0.159284 0.159284 0.037293 +0.194868 0.159284 0.037293 +0.227530 0.159284 0.037293 +0.257434 0.159284 0.037293 +0.285092 0.159284 0.037293 +0.310738 0.159284 0.037293 +0.334585 0.159284 0.037293 +0.356818 0.159284 0.037293 +0.377602 0.159284 0.037293 +0.397079 0.159284 0.037293 +0.415373 0.159284 0.037293 +0.432594 0.159284 0.037293 +0.448839 0.159284 0.037293 +0.464192 0.159284 0.037293 +0.478729 0.159284 0.037293 +0.492515 0.159284 0.037293 +0.505612 0.159284 0.037293 +0.518072 0.159284 0.037293 +0.529943 0.159284 0.037293 +0.541266 0.159284 0.037293 +0.552083 0.159284 0.037293 +0.562427 0.159284 0.037293 +0.572331 0.159284 0.037293 +0.581823 0.159284 0.037293 +0.590929 0.159284 0.037293 +0.599674 0.159284 0.037293 +0.608079 0.159284 0.037293 +0.616166 0.159284 0.037293 +0.000001 0.194868 0.037293 +0.037293 0.194868 0.037293 +0.079714 0.194868 0.037293 +0.120832 0.194868 0.037293 +0.159284 0.194868 0.037293 +0.194868 0.194868 0.037293 +0.227530 0.194868 0.037293 +0.257434 0.194868 0.037293 +0.285092 0.194868 0.037293 +0.310738 0.194868 0.037293 +0.334585 0.194868 0.037293 +0.356818 0.194868 0.037293 +0.377602 0.194868 0.037293 +0.397079 0.194868 0.037293 +0.415373 0.194868 0.037293 +0.432594 0.194868 0.037293 +0.448839 0.194868 0.037293 +0.464192 0.194868 0.037293 +0.478729 0.194868 0.037293 +0.492515 0.194868 0.037293 +0.505612 0.194868 0.037293 +0.518072 0.194868 0.037293 +0.529943 0.194868 0.037293 +0.541266 0.194868 0.037293 +0.552083 0.194868 0.037293 +0.562427 0.194868 0.037293 +0.572331 0.194868 0.037293 +0.581823 0.194868 0.037293 +0.590929 0.194868 0.037293 +0.599674 0.194868 0.037293 +0.608079 0.194868 0.037293 +0.616166 0.194868 0.037293 +0.000001 0.227530 0.037293 +0.037293 0.227530 0.037293 +0.079714 0.227530 0.037293 +0.120832 0.227530 0.037293 +0.159284 0.227530 0.037293 +0.194868 0.227530 0.037293 +0.227530 0.227530 0.037293 +0.257434 0.227530 0.037293 +0.285092 0.227530 0.037293 +0.310738 0.227530 0.037293 +0.334585 0.227530 0.037293 +0.356818 0.227530 0.037293 +0.377602 0.227530 0.037293 +0.397079 0.227530 0.037293 +0.415373 0.227530 0.037293 +0.432594 0.227530 0.037293 +0.448839 0.227530 0.037293 +0.464192 0.227530 0.037293 +0.478729 0.227530 0.037293 +0.492515 0.227530 0.037293 +0.505612 0.227530 0.037293 +0.518072 0.227530 0.037293 +0.529943 0.227530 0.037293 +0.541266 0.227530 0.037293 +0.552083 0.227530 0.037293 +0.562427 0.227530 0.037293 +0.572331 0.227530 0.037293 +0.581823 0.227530 0.037293 +0.590929 0.227530 0.037293 +0.599674 0.227530 0.037293 +0.608079 0.227530 0.037293 +0.616166 0.227530 0.037293 +0.000001 0.257434 0.037293 +0.037293 0.257434 0.037293 +0.079714 0.257434 0.037293 +0.120832 0.257434 0.037293 +0.159284 0.257434 0.037293 +0.194868 0.257434 0.037293 +0.227530 0.257434 0.037293 +0.257434 0.257434 0.037293 +0.285092 0.257434 0.037293 +0.310738 0.257434 0.037293 +0.334585 0.257434 0.037293 +0.356818 0.257434 0.037293 +0.377602 0.257434 0.037293 +0.397079 0.257434 0.037293 +0.415373 0.257434 0.037293 +0.432594 0.257434 0.037293 +0.448839 0.257434 0.037293 +0.464192 0.257434 0.037293 +0.478729 0.257434 0.037293 +0.492515 0.257434 0.037293 +0.505612 0.257434 0.037293 +0.518072 0.257434 0.037293 +0.529943 0.257434 0.037293 +0.541266 0.257434 0.037293 +0.552083 0.257434 0.037293 +0.562427 0.257434 0.037293 +0.572331 0.257434 0.037293 +0.581823 0.257434 0.037293 +0.590929 0.257434 0.037293 +0.599674 0.257434 0.037293 +0.608079 0.257434 0.037293 +0.616166 0.257434 0.037293 +0.000001 0.285092 0.037293 +0.037293 0.285092 0.037293 +0.079714 0.285092 0.037293 +0.120832 0.285092 0.037293 +0.159284 0.285092 0.037293 +0.194868 0.285092 0.037293 +0.227530 0.285092 0.037293 +0.257434 0.285092 0.037293 +0.285092 0.285092 0.037293 +0.310738 0.285092 0.037293 +0.334585 0.285092 0.037293 +0.356818 0.285092 0.037293 +0.377602 0.285092 0.037293 +0.397079 0.285092 0.037293 +0.415373 0.285092 0.037293 +0.432594 0.285092 0.037293 +0.448839 0.285092 0.037293 +0.464192 0.285092 0.037293 +0.478729 0.285092 0.037293 +0.492515 0.285092 0.037293 +0.505612 0.285092 0.037293 +0.518072 0.285092 0.037293 +0.529943 0.285092 0.037293 +0.541266 0.285092 0.037293 +0.552083 0.285092 0.037293 +0.562427 0.285092 0.037293 +0.572331 0.285092 0.037293 +0.581823 0.285092 0.037293 +0.590929 0.285092 0.037293 +0.599674 0.285092 0.037293 +0.608079 0.285092 0.037293 +0.616166 0.285092 0.037293 +0.000001 0.310738 0.037293 +0.037293 0.310738 0.037293 +0.079714 0.310738 0.037293 +0.120832 0.310738 0.037293 +0.159284 0.310738 0.037293 +0.194868 0.310738 0.037293 +0.227530 0.310738 0.037293 +0.257434 0.310738 0.037293 +0.285092 0.310738 0.037293 +0.310738 0.310738 0.037293 +0.334585 0.310738 0.037293 +0.356818 0.310738 0.037293 +0.377602 0.310738 0.037293 +0.397079 0.310738 0.037293 +0.415373 0.310738 0.037293 +0.432594 0.310738 0.037293 +0.448839 0.310738 0.037293 +0.464192 0.310738 0.037293 +0.478729 0.310738 0.037293 +0.492515 0.310738 0.037293 +0.505612 0.310738 0.037293 +0.518072 0.310738 0.037293 +0.529943 0.310738 0.037293 +0.541266 0.310738 0.037293 +0.552083 0.310738 0.037293 +0.562427 0.310738 0.037293 +0.572331 0.310738 0.037293 +0.581823 0.310738 0.037293 +0.590929 0.310738 0.037293 +0.599674 0.310738 0.037293 +0.608079 0.310738 0.037293 +0.616166 0.310738 0.037293 +0.000001 0.334585 0.037293 +0.037293 0.334585 0.037293 +0.079714 0.334585 0.037293 +0.120832 0.334585 0.037293 +0.159284 0.334585 0.037293 +0.194868 0.334585 0.037293 +0.227530 0.334585 0.037293 +0.257434 0.334585 0.037293 +0.285092 0.334585 0.037293 +0.310738 0.334585 0.037293 +0.334585 0.334585 0.037293 +0.356818 0.334585 0.037293 +0.377602 0.334585 0.037293 +0.397079 0.334585 0.037293 +0.415373 0.334585 0.037293 +0.432594 0.334585 0.037293 +0.448839 0.334585 0.037293 +0.464192 0.334585 0.037293 +0.478729 0.334585 0.037293 +0.492515 0.334585 0.037293 +0.505612 0.334585 0.037293 +0.518072 0.334585 0.037293 +0.529943 0.334585 0.037293 +0.541266 0.334585 0.037293 +0.552083 0.334585 0.037293 +0.562427 0.334585 0.037293 +0.572331 0.334585 0.037293 +0.581823 0.334585 0.037293 +0.590929 0.334585 0.037293 +0.599674 0.334585 0.037293 +0.608079 0.334585 0.037293 +0.616166 0.334585 0.037293 +0.000001 0.356818 0.037293 +0.037293 0.356818 0.037293 +0.079714 0.356818 0.037293 +0.120832 0.356818 0.037293 +0.159284 0.356818 0.037293 +0.194868 0.356818 0.037293 +0.227530 0.356818 0.037293 +0.257434 0.356818 0.037293 +0.285092 0.356818 0.037293 +0.310738 0.356818 0.037293 +0.334585 0.356818 0.037293 +0.356818 0.356818 0.037293 +0.377602 0.356818 0.037293 +0.397079 0.356818 0.037293 +0.415373 0.356818 0.037293 +0.432594 0.356818 0.037293 +0.448839 0.356818 0.037293 +0.464192 0.356818 0.037293 +0.478729 0.356818 0.037293 +0.492515 0.356818 0.037293 +0.505612 0.356818 0.037293 +0.518072 0.356818 0.037293 +0.529943 0.356818 0.037293 +0.541266 0.356818 0.037293 +0.552083 0.356818 0.037293 +0.562427 0.356818 0.037293 +0.572331 0.356818 0.037293 +0.581823 0.356818 0.037293 +0.590929 0.356818 0.037293 +0.599674 0.356818 0.037293 +0.608079 0.356818 0.037293 +0.616166 0.356818 0.037293 +0.000001 0.377602 0.037293 +0.037293 0.377602 0.037293 +0.079714 0.377602 0.037293 +0.120832 0.377602 0.037293 +0.159284 0.377602 0.037293 +0.194868 0.377602 0.037293 +0.227530 0.377602 0.037293 +0.257434 0.377602 0.037293 +0.285092 0.377602 0.037293 +0.310738 0.377602 0.037293 +0.334585 0.377602 0.037293 +0.356818 0.377602 0.037293 +0.377602 0.377602 0.037293 +0.397079 0.377602 0.037293 +0.415373 0.377602 0.037293 +0.432594 0.377602 0.037293 +0.448839 0.377602 0.037293 +0.464192 0.377602 0.037293 +0.478729 0.377602 0.037293 +0.492515 0.377602 0.037293 +0.505612 0.377602 0.037293 +0.518072 0.377602 0.037293 +0.529943 0.377602 0.037293 +0.541266 0.377602 0.037293 +0.552083 0.377602 0.037293 +0.562427 0.377602 0.037293 +0.572331 0.377602 0.037293 +0.581823 0.377602 0.037293 +0.590929 0.377602 0.037293 +0.599674 0.377602 0.037293 +0.608079 0.377602 0.037293 +0.616166 0.377602 0.037293 +0.000001 0.397079 0.037293 +0.037293 0.397079 0.037293 +0.079714 0.397079 0.037293 +0.120832 0.397079 0.037293 +0.159284 0.397079 0.037293 +0.194868 0.397079 0.037293 +0.227530 0.397079 0.037293 +0.257434 0.397079 0.037293 +0.285092 0.397079 0.037293 +0.310738 0.397079 0.037293 +0.334585 0.397079 0.037293 +0.356818 0.397079 0.037293 +0.377602 0.397079 0.037293 +0.397079 0.397079 0.037293 +0.415373 0.397079 0.037293 +0.432594 0.397079 0.037293 +0.448839 0.397079 0.037293 +0.464192 0.397079 0.037293 +0.478729 0.397079 0.037293 +0.492515 0.397079 0.037293 +0.505612 0.397079 0.037293 +0.518072 0.397079 0.037293 +0.529943 0.397079 0.037293 +0.541266 0.397079 0.037293 +0.552083 0.397079 0.037293 +0.562427 0.397079 0.037293 +0.572331 0.397079 0.037293 +0.581823 0.397079 0.037293 +0.590929 0.397079 0.037293 +0.599674 0.397079 0.037293 +0.608079 0.397079 0.037293 +0.616166 0.397079 0.037293 +0.000001 0.415373 0.037293 +0.037293 0.415373 0.037293 +0.079714 0.415373 0.037293 +0.120832 0.415373 0.037293 +0.159284 0.415373 0.037293 +0.194868 0.415373 0.037293 +0.227530 0.415373 0.037293 +0.257434 0.415373 0.037293 +0.285092 0.415373 0.037293 +0.310738 0.415373 0.037293 +0.334585 0.415373 0.037293 +0.356818 0.415373 0.037293 +0.377602 0.415373 0.037293 +0.397079 0.415373 0.037293 +0.415373 0.415373 0.037293 +0.432594 0.415373 0.037293 +0.448839 0.415373 0.037293 +0.464192 0.415373 0.037293 +0.478729 0.415373 0.037293 +0.492515 0.415373 0.037293 +0.505612 0.415373 0.037293 +0.518072 0.415373 0.037293 +0.529943 0.415373 0.037293 +0.541266 0.415373 0.037293 +0.552083 0.415373 0.037293 +0.562427 0.415373 0.037293 +0.572331 0.415373 0.037293 +0.581823 0.415373 0.037293 +0.590929 0.415373 0.037293 +0.599674 0.415373 0.037293 +0.608079 0.415373 0.037293 +0.616166 0.415373 0.037293 +0.000001 0.432594 0.037293 +0.037293 0.432594 0.037293 +0.079714 0.432594 0.037293 +0.120832 0.432594 0.037293 +0.159284 0.432594 0.037293 +0.194868 0.432594 0.037293 +0.227530 0.432594 0.037293 +0.257434 0.432594 0.037293 +0.285092 0.432594 0.037293 +0.310738 0.432594 0.037293 +0.334585 0.432594 0.037293 +0.356818 0.432594 0.037293 +0.377602 0.432594 0.037293 +0.397079 0.432594 0.037293 +0.415373 0.432594 0.037293 +0.432594 0.432594 0.037293 +0.448839 0.432594 0.037293 +0.464192 0.432594 0.037293 +0.478729 0.432594 0.037293 +0.492515 0.432594 0.037293 +0.505612 0.432594 0.037293 +0.518072 0.432594 0.037293 +0.529943 0.432594 0.037293 +0.541266 0.432594 0.037293 +0.552083 0.432594 0.037293 +0.562427 0.432594 0.037293 +0.572331 0.432594 0.037293 +0.581823 0.432594 0.037293 +0.590929 0.432594 0.037293 +0.599674 0.432594 0.037293 +0.608079 0.432594 0.037293 +0.616166 0.432594 0.037293 +0.000001 0.448839 0.037293 +0.037293 0.448839 0.037293 +0.079714 0.448839 0.037293 +0.120832 0.448839 0.037293 +0.159284 0.448839 0.037293 +0.194868 0.448839 0.037293 +0.227530 0.448839 0.037293 +0.257434 0.448839 0.037293 +0.285092 0.448839 0.037293 +0.310738 0.448839 0.037293 +0.334585 0.448839 0.037293 +0.356818 0.448839 0.037293 +0.377602 0.448839 0.037293 +0.397079 0.448839 0.037293 +0.415373 0.448839 0.037293 +0.432594 0.448839 0.037293 +0.448839 0.448839 0.037293 +0.464192 0.448839 0.037293 +0.478729 0.448839 0.037293 +0.492515 0.448839 0.037293 +0.505612 0.448839 0.037293 +0.518072 0.448839 0.037293 +0.529943 0.448839 0.037293 +0.541266 0.448839 0.037293 +0.552083 0.448839 0.037293 +0.562427 0.448839 0.037293 +0.572331 0.448839 0.037293 +0.581823 0.448839 0.037293 +0.590929 0.448839 0.037293 +0.599674 0.448839 0.037293 +0.608079 0.448839 0.037293 +0.616166 0.448839 0.037293 +0.000001 0.464192 0.037293 +0.037293 0.464192 0.037293 +0.079714 0.464192 0.037293 +0.120832 0.464192 0.037293 +0.159284 0.464192 0.037293 +0.194868 0.464192 0.037293 +0.227530 0.464192 0.037293 +0.257434 0.464192 0.037293 +0.285092 0.464192 0.037293 +0.310738 0.464192 0.037293 +0.334585 0.464192 0.037293 +0.356818 0.464192 0.037293 +0.377602 0.464192 0.037293 +0.397079 0.464192 0.037293 +0.415373 0.464192 0.037293 +0.432594 0.464192 0.037293 +0.448839 0.464192 0.037293 +0.464192 0.464192 0.037293 +0.478729 0.464192 0.037293 +0.492515 0.464192 0.037293 +0.505612 0.464192 0.037293 +0.518072 0.464192 0.037293 +0.529943 0.464192 0.037293 +0.541266 0.464192 0.037293 +0.552083 0.464192 0.037293 +0.562427 0.464192 0.037293 +0.572331 0.464192 0.037293 +0.581823 0.464192 0.037293 +0.590929 0.464192 0.037293 +0.599674 0.464192 0.037293 +0.608079 0.464192 0.037293 +0.616166 0.464192 0.037293 +0.000001 0.478729 0.037293 +0.037293 0.478729 0.037293 +0.079714 0.478729 0.037293 +0.120832 0.478729 0.037293 +0.159284 0.478729 0.037293 +0.194868 0.478729 0.037293 +0.227530 0.478729 0.037293 +0.257434 0.478729 0.037293 +0.285092 0.478729 0.037293 +0.310738 0.478729 0.037293 +0.334585 0.478729 0.037293 +0.356818 0.478729 0.037293 +0.377602 0.478729 0.037293 +0.397079 0.478729 0.037293 +0.415373 0.478729 0.037293 +0.432594 0.478729 0.037293 +0.448839 0.478729 0.037293 +0.464192 0.478729 0.037293 +0.478729 0.478729 0.037293 +0.492515 0.478729 0.037293 +0.505612 0.478729 0.037293 +0.518072 0.478729 0.037293 +0.529943 0.478729 0.037293 +0.541266 0.478729 0.037293 +0.552083 0.478729 0.037293 +0.562427 0.478729 0.037293 +0.572331 0.478729 0.037293 +0.581823 0.478729 0.037293 +0.590929 0.478729 0.037293 +0.599674 0.478729 0.037293 +0.608079 0.478729 0.037293 +0.616166 0.478729 0.037293 +0.000001 0.492515 0.037293 +0.037293 0.492515 0.037293 +0.079714 0.492515 0.037293 +0.120832 0.492515 0.037293 +0.159284 0.492515 0.037293 +0.194868 0.492515 0.037293 +0.227530 0.492515 0.037293 +0.257434 0.492515 0.037293 +0.285092 0.492515 0.037293 +0.310738 0.492515 0.037293 +0.334585 0.492515 0.037293 +0.356818 0.492515 0.037293 +0.377602 0.492515 0.037293 +0.397079 0.492515 0.037293 +0.415373 0.492515 0.037293 +0.432594 0.492515 0.037293 +0.448839 0.492515 0.037293 +0.464192 0.492515 0.037293 +0.478729 0.492515 0.037293 +0.492515 0.492515 0.037293 +0.505612 0.492515 0.037293 +0.518072 0.492515 0.037293 +0.529943 0.492515 0.037293 +0.541266 0.492515 0.037293 +0.552083 0.492515 0.037293 +0.562427 0.492515 0.037293 +0.572331 0.492515 0.037293 +0.581823 0.492515 0.037293 +0.590929 0.492515 0.037293 +0.599674 0.492515 0.037293 +0.608079 0.492515 0.037293 +0.616166 0.492515 0.037293 +0.000001 0.505612 0.037293 +0.037293 0.505612 0.037293 +0.079714 0.505612 0.037293 +0.120832 0.505612 0.037293 +0.159284 0.505612 0.037293 +0.194868 0.505612 0.037293 +0.227530 0.505612 0.037293 +0.257434 0.505612 0.037293 +0.285092 0.505612 0.037293 +0.310738 0.505612 0.037293 +0.334585 0.505612 0.037293 +0.356818 0.505612 0.037293 +0.377602 0.505612 0.037293 +0.397079 0.505612 0.037293 +0.415373 0.505612 0.037293 +0.432594 0.505612 0.037293 +0.448839 0.505612 0.037293 +0.464192 0.505612 0.037293 +0.478729 0.505612 0.037293 +0.492515 0.505612 0.037293 +0.505612 0.505612 0.037293 +0.518072 0.505612 0.037293 +0.529943 0.505612 0.037293 +0.541266 0.505612 0.037293 +0.552083 0.505612 0.037293 +0.562427 0.505612 0.037293 +0.572331 0.505612 0.037293 +0.581823 0.505612 0.037293 +0.590929 0.505612 0.037293 +0.599674 0.505612 0.037293 +0.608079 0.505612 0.037293 +0.616166 0.505612 0.037293 +0.000001 0.518072 0.037293 +0.037293 0.518072 0.037293 +0.079714 0.518072 0.037293 +0.120832 0.518072 0.037293 +0.159284 0.518072 0.037293 +0.194868 0.518072 0.037293 +0.227530 0.518072 0.037293 +0.257434 0.518072 0.037293 +0.285092 0.518072 0.037293 +0.310738 0.518072 0.037293 +0.334585 0.518072 0.037293 +0.356818 0.518072 0.037293 +0.377602 0.518072 0.037293 +0.397079 0.518072 0.037293 +0.415373 0.518072 0.037293 +0.432594 0.518072 0.037293 +0.448839 0.518072 0.037293 +0.464192 0.518072 0.037293 +0.478729 0.518072 0.037293 +0.492515 0.518072 0.037293 +0.505612 0.518072 0.037293 +0.518072 0.518072 0.037293 +0.529943 0.518072 0.037293 +0.541266 0.518072 0.037293 +0.552083 0.518072 0.037293 +0.562427 0.518072 0.037293 +0.572331 0.518072 0.037293 +0.581823 0.518072 0.037293 +0.590929 0.518072 0.037293 +0.599674 0.518072 0.037293 +0.608079 0.518072 0.037293 +0.616166 0.518072 0.037293 +0.000001 0.529943 0.037293 +0.037293 0.529943 0.037293 +0.079714 0.529943 0.037293 +0.120832 0.529943 0.037293 +0.159284 0.529943 0.037293 +0.194868 0.529943 0.037293 +0.227530 0.529943 0.037293 +0.257434 0.529943 0.037293 +0.285092 0.529943 0.037293 +0.310738 0.529943 0.037293 +0.334585 0.529943 0.037293 +0.356818 0.529943 0.037293 +0.377602 0.529943 0.037293 +0.397079 0.529943 0.037293 +0.415373 0.529943 0.037293 +0.432594 0.529943 0.037293 +0.448839 0.529943 0.037293 +0.464192 0.529943 0.037293 +0.478729 0.529943 0.037293 +0.492515 0.529943 0.037293 +0.505612 0.529943 0.037293 +0.518072 0.529943 0.037293 +0.529943 0.529943 0.037293 +0.541266 0.529943 0.037293 +0.552083 0.529943 0.037293 +0.562427 0.529943 0.037293 +0.572331 0.529943 0.037293 +0.581823 0.529943 0.037293 +0.590929 0.529943 0.037293 +0.599674 0.529943 0.037293 +0.608079 0.529943 0.037293 +0.616166 0.529943 0.037293 +0.000001 0.541266 0.037293 +0.037293 0.541266 0.037293 +0.079714 0.541266 0.037293 +0.120832 0.541266 0.037293 +0.159284 0.541266 0.037293 +0.194868 0.541266 0.037293 +0.227530 0.541266 0.037293 +0.257434 0.541266 0.037293 +0.285092 0.541266 0.037293 +0.310738 0.541266 0.037293 +0.334585 0.541266 0.037293 +0.356818 0.541266 0.037293 +0.377602 0.541266 0.037293 +0.397079 0.541266 0.037293 +0.415373 0.541266 0.037293 +0.432594 0.541266 0.037293 +0.448839 0.541266 0.037293 +0.464192 0.541266 0.037293 +0.478729 0.541266 0.037293 +0.492515 0.541266 0.037293 +0.505612 0.541266 0.037293 +0.518072 0.541266 0.037293 +0.529943 0.541266 0.037293 +0.541266 0.541266 0.037293 +0.552083 0.541266 0.037293 +0.562427 0.541266 0.037293 +0.572331 0.541266 0.037293 +0.581823 0.541266 0.037293 +0.590929 0.541266 0.037293 +0.599674 0.541266 0.037293 +0.608079 0.541266 0.037293 +0.616166 0.541266 0.037293 +0.000001 0.552083 0.037293 +0.037293 0.552083 0.037293 +0.079714 0.552083 0.037293 +0.120832 0.552083 0.037293 +0.159284 0.552083 0.037293 +0.194868 0.552083 0.037293 +0.227530 0.552083 0.037293 +0.257434 0.552083 0.037293 +0.285092 0.552083 0.037293 +0.310738 0.552083 0.037293 +0.334585 0.552083 0.037293 +0.356818 0.552083 0.037293 +0.377602 0.552083 0.037293 +0.397079 0.552083 0.037293 +0.415373 0.552083 0.037293 +0.432594 0.552083 0.037293 +0.448839 0.552083 0.037293 +0.464192 0.552083 0.037293 +0.478729 0.552083 0.037293 +0.492515 0.552083 0.037293 +0.505612 0.552083 0.037293 +0.518072 0.552083 0.037293 +0.529943 0.552083 0.037293 +0.541266 0.552083 0.037293 +0.552083 0.552083 0.037293 +0.562427 0.552083 0.037293 +0.572331 0.552083 0.037293 +0.581823 0.552083 0.037293 +0.590929 0.552083 0.037293 +0.599674 0.552083 0.037293 +0.608079 0.552083 0.037293 +0.616166 0.552083 0.037293 +0.000001 0.562427 0.037293 +0.037293 0.562427 0.037293 +0.079714 0.562427 0.037293 +0.120832 0.562427 0.037293 +0.159284 0.562427 0.037293 +0.194868 0.562427 0.037293 +0.227530 0.562427 0.037293 +0.257434 0.562427 0.037293 +0.285092 0.562427 0.037293 +0.310738 0.562427 0.037293 +0.334585 0.562427 0.037293 +0.356818 0.562427 0.037293 +0.377602 0.562427 0.037293 +0.397079 0.562427 0.037293 +0.415373 0.562427 0.037293 +0.432594 0.562427 0.037293 +0.448839 0.562427 0.037293 +0.464192 0.562427 0.037293 +0.478729 0.562427 0.037293 +0.492515 0.562427 0.037293 +0.505612 0.562427 0.037293 +0.518072 0.562427 0.037293 +0.529943 0.562427 0.037293 +0.541266 0.562427 0.037293 +0.552083 0.562427 0.037293 +0.562427 0.562427 0.037293 +0.572331 0.562427 0.037293 +0.581823 0.562427 0.037293 +0.590929 0.562427 0.037293 +0.599674 0.562427 0.037293 +0.608079 0.562427 0.037293 +0.616166 0.562427 0.037293 +0.000001 0.572331 0.037293 +0.037293 0.572331 0.037293 +0.079714 0.572331 0.037293 +0.120832 0.572331 0.037293 +0.159284 0.572331 0.037293 +0.194868 0.572331 0.037293 +0.227530 0.572331 0.037293 +0.257434 0.572331 0.037293 +0.285092 0.572331 0.037293 +0.310738 0.572331 0.037293 +0.334585 0.572331 0.037293 +0.356818 0.572331 0.037293 +0.377602 0.572331 0.037293 +0.397079 0.572331 0.037293 +0.415373 0.572331 0.037293 +0.432594 0.572331 0.037293 +0.448839 0.572331 0.037293 +0.464192 0.572331 0.037293 +0.478729 0.572331 0.037293 +0.492515 0.572331 0.037293 +0.505612 0.572331 0.037293 +0.518072 0.572331 0.037293 +0.529943 0.572331 0.037293 +0.541266 0.572331 0.037293 +0.552083 0.572331 0.037293 +0.562427 0.572331 0.037293 +0.572331 0.572331 0.037293 +0.581823 0.572331 0.037293 +0.590929 0.572331 0.037293 +0.599674 0.572331 0.037293 +0.608079 0.572331 0.037293 +0.616166 0.572331 0.037293 +0.000001 0.581823 0.037293 +0.037293 0.581823 0.037293 +0.079714 0.581823 0.037293 +0.120832 0.581823 0.037293 +0.159284 0.581823 0.037293 +0.194868 0.581823 0.037293 +0.227530 0.581823 0.037293 +0.257434 0.581823 0.037293 +0.285092 0.581823 0.037293 +0.310738 0.581823 0.037293 +0.334585 0.581823 0.037293 +0.356818 0.581823 0.037293 +0.377602 0.581823 0.037293 +0.397079 0.581823 0.037293 +0.415373 0.581823 0.037293 +0.432594 0.581823 0.037293 +0.448839 0.581823 0.037293 +0.464192 0.581823 0.037293 +0.478729 0.581823 0.037293 +0.492515 0.581823 0.037293 +0.505612 0.581823 0.037293 +0.518072 0.581823 0.037293 +0.529943 0.581823 0.037293 +0.541266 0.581823 0.037293 +0.552083 0.581823 0.037293 +0.562427 0.581823 0.037293 +0.572331 0.581823 0.037293 +0.581823 0.581823 0.037293 +0.590929 0.581823 0.037293 +0.599674 0.581823 0.037293 +0.608079 0.581823 0.037293 +0.616166 0.581823 0.037293 +0.000001 0.590929 0.037293 +0.037293 0.590929 0.037293 +0.079714 0.590929 0.037293 +0.120832 0.590929 0.037293 +0.159284 0.590929 0.037293 +0.194868 0.590929 0.037293 +0.227530 0.590929 0.037293 +0.257434 0.590929 0.037293 +0.285092 0.590929 0.037293 +0.310738 0.590929 0.037293 +0.334585 0.590929 0.037293 +0.356818 0.590929 0.037293 +0.377602 0.590929 0.037293 +0.397079 0.590929 0.037293 +0.415373 0.590929 0.037293 +0.432594 0.590929 0.037293 +0.448839 0.590929 0.037293 +0.464192 0.590929 0.037293 +0.478729 0.590929 0.037293 +0.492515 0.590929 0.037293 +0.505612 0.590929 0.037293 +0.518072 0.590929 0.037293 +0.529943 0.590929 0.037293 +0.541266 0.590929 0.037293 +0.552083 0.590929 0.037293 +0.562427 0.590929 0.037293 +0.572331 0.590929 0.037293 +0.581823 0.590929 0.037293 +0.590929 0.590929 0.037293 +0.599674 0.590929 0.037293 +0.608079 0.590929 0.037293 +0.616166 0.590929 0.037293 +0.000001 0.599674 0.037293 +0.037293 0.599674 0.037293 +0.079714 0.599674 0.037293 +0.120832 0.599674 0.037293 +0.159284 0.599674 0.037293 +0.194868 0.599674 0.037293 +0.227530 0.599674 0.037293 +0.257434 0.599674 0.037293 +0.285092 0.599674 0.037293 +0.310738 0.599674 0.037293 +0.334585 0.599674 0.037293 +0.356818 0.599674 0.037293 +0.377602 0.599674 0.037293 +0.397079 0.599674 0.037293 +0.415373 0.599674 0.037293 +0.432594 0.599674 0.037293 +0.448839 0.599674 0.037293 +0.464192 0.599674 0.037293 +0.478729 0.599674 0.037293 +0.492515 0.599674 0.037293 +0.505612 0.599674 0.037293 +0.518072 0.599674 0.037293 +0.529943 0.599674 0.037293 +0.541266 0.599674 0.037293 +0.552083 0.599674 0.037293 +0.562427 0.599674 0.037293 +0.572331 0.599674 0.037293 +0.581823 0.599674 0.037293 +0.590929 0.599674 0.037293 +0.599674 0.599674 0.037293 +0.608079 0.599674 0.037293 +0.616166 0.599674 0.037293 +0.000001 0.608079 0.037293 +0.037293 0.608079 0.037293 +0.079714 0.608079 0.037293 +0.120832 0.608079 0.037293 +0.159284 0.608079 0.037293 +0.194868 0.608079 0.037293 +0.227530 0.608079 0.037293 +0.257434 0.608079 0.037293 +0.285092 0.608079 0.037293 +0.310738 0.608079 0.037293 +0.334585 0.608079 0.037293 +0.356818 0.608079 0.037293 +0.377602 0.608079 0.037293 +0.397079 0.608079 0.037293 +0.415373 0.608079 0.037293 +0.432594 0.608079 0.037293 +0.448839 0.608079 0.037293 +0.464192 0.608079 0.037293 +0.478729 0.608079 0.037293 +0.492515 0.608079 0.037293 +0.505612 0.608079 0.037293 +0.518072 0.608079 0.037293 +0.529943 0.608079 0.037293 +0.541266 0.608079 0.037293 +0.552083 0.608079 0.037293 +0.562427 0.608079 0.037293 +0.572331 0.608079 0.037293 +0.581823 0.608079 0.037293 +0.590929 0.608079 0.037293 +0.599674 0.608079 0.037293 +0.608079 0.608079 0.037293 +0.616166 0.608079 0.037293 +0.000001 0.616166 0.037293 +0.037293 0.616166 0.037293 +0.079714 0.616166 0.037293 +0.120832 0.616166 0.037293 +0.159284 0.616166 0.037293 +0.194868 0.616166 0.037293 +0.227530 0.616166 0.037293 +0.257434 0.616166 0.037293 +0.285092 0.616166 0.037293 +0.310738 0.616166 0.037293 +0.334585 0.616166 0.037293 +0.356818 0.616166 0.037293 +0.377602 0.616166 0.037293 +0.397079 0.616166 0.037293 +0.415373 0.616166 0.037293 +0.432594 0.616166 0.037293 +0.448839 0.616166 0.037293 +0.464192 0.616166 0.037293 +0.478729 0.616166 0.037293 +0.492515 0.616166 0.037293 +0.505612 0.616166 0.037293 +0.518072 0.616166 0.037293 +0.529943 0.616166 0.037293 +0.541266 0.616166 0.037293 +0.552083 0.616166 0.037293 +0.562427 0.616166 0.037293 +0.572331 0.616166 0.037293 +0.581823 0.616166 0.037293 +0.590929 0.616166 0.037293 +0.599674 0.616166 0.037293 +0.608079 0.616166 0.037293 +0.616166 0.616166 0.037293 +0.000001 0.000001 0.079714 +0.037293 0.000001 0.079714 +0.079714 0.000001 0.079714 +0.120832 0.000001 0.079714 +0.159284 0.000001 0.079714 +0.194868 0.000001 0.079714 +0.227530 0.000001 0.079714 +0.257434 0.000001 0.079714 +0.285092 0.000001 0.079714 +0.310738 0.000001 0.079714 +0.334585 0.000001 0.079714 +0.356818 0.000001 0.079714 +0.377602 0.000001 0.079714 +0.397079 0.000001 0.079714 +0.415373 0.000001 0.079714 +0.432594 0.000001 0.079714 +0.448839 0.000001 0.079714 +0.464192 0.000001 0.079714 +0.478729 0.000001 0.079714 +0.492515 0.000001 0.079714 +0.505612 0.000001 0.079714 +0.518072 0.000001 0.079714 +0.529943 0.000001 0.079714 +0.541266 0.000001 0.079714 +0.552083 0.000001 0.079714 +0.562427 0.000001 0.079714 +0.572331 0.000001 0.079714 +0.581823 0.000001 0.079714 +0.590929 0.000001 0.079714 +0.599674 0.000001 0.079714 +0.608079 0.000001 0.079714 +0.616166 0.000001 0.079714 +0.000001 0.037293 0.079714 +0.037293 0.037293 0.079714 +0.079714 0.037293 0.079714 +0.120832 0.037293 0.079714 +0.159284 0.037293 0.079714 +0.194868 0.037293 0.079714 +0.227530 0.037293 0.079714 +0.257434 0.037293 0.079714 +0.285092 0.037293 0.079714 +0.310738 0.037293 0.079714 +0.334585 0.037293 0.079714 +0.356818 0.037293 0.079714 +0.377602 0.037293 0.079714 +0.397079 0.037293 0.079714 +0.415373 0.037293 0.079714 +0.432594 0.037293 0.079714 +0.448839 0.037293 0.079714 +0.464192 0.037293 0.079714 +0.478729 0.037293 0.079714 +0.492515 0.037293 0.079714 +0.505612 0.037293 0.079714 +0.518072 0.037293 0.079714 +0.529943 0.037293 0.079714 +0.541266 0.037293 0.079714 +0.552083 0.037293 0.079714 +0.562427 0.037293 0.079714 +0.572331 0.037293 0.079714 +0.581823 0.037293 0.079714 +0.590929 0.037293 0.079714 +0.599674 0.037293 0.079714 +0.608079 0.037293 0.079714 +0.616166 0.037293 0.079714 +0.000001 0.079714 0.079714 +0.037293 0.079714 0.079714 +0.079714 0.079714 0.079714 +0.120832 0.079714 0.079714 +0.159284 0.079714 0.079714 +0.194868 0.079714 0.079714 +0.227530 0.079714 0.079714 +0.257434 0.079714 0.079714 +0.285092 0.079714 0.079714 +0.310738 0.079714 0.079714 +0.334585 0.079714 0.079714 +0.356818 0.079714 0.079714 +0.377602 0.079714 0.079714 +0.397079 0.079714 0.079714 +0.415373 0.079714 0.079714 +0.432594 0.079714 0.079714 +0.448839 0.079714 0.079714 +0.464192 0.079714 0.079714 +0.478729 0.079714 0.079714 +0.492515 0.079714 0.079714 +0.505612 0.079714 0.079714 +0.518072 0.079714 0.079714 +0.529943 0.079714 0.079714 +0.541266 0.079714 0.079714 +0.552083 0.079714 0.079714 +0.562427 0.079714 0.079714 +0.572331 0.079714 0.079714 +0.581823 0.079714 0.079714 +0.590929 0.079714 0.079714 +0.599674 0.079714 0.079714 +0.608079 0.079714 0.079714 +0.616166 0.079714 0.079714 +0.000001 0.120832 0.079714 +0.037293 0.120832 0.079714 +0.079714 0.120832 0.079714 +0.120832 0.120832 0.079714 +0.159284 0.120832 0.079714 +0.194868 0.120832 0.079714 +0.227530 0.120832 0.079714 +0.257434 0.120832 0.079714 +0.285092 0.120832 0.079714 +0.310738 0.120832 0.079714 +0.334585 0.120832 0.079714 +0.356818 0.120832 0.079714 +0.377602 0.120832 0.079714 +0.397079 0.120832 0.079714 +0.415373 0.120832 0.079714 +0.432594 0.120832 0.079714 +0.448839 0.120832 0.079714 +0.464192 0.120832 0.079714 +0.478729 0.120832 0.079714 +0.492515 0.120832 0.079714 +0.505612 0.120832 0.079714 +0.518072 0.120832 0.079714 +0.529943 0.120832 0.079714 +0.541266 0.120832 0.079714 +0.552083 0.120832 0.079714 +0.562427 0.120832 0.079714 +0.572331 0.120832 0.079714 +0.581823 0.120832 0.079714 +0.590929 0.120832 0.079714 +0.599674 0.120832 0.079714 +0.608079 0.120832 0.079714 +0.616166 0.120832 0.079714 +0.000001 0.159284 0.079714 +0.037293 0.159284 0.079714 +0.079714 0.159284 0.079714 +0.120832 0.159284 0.079714 +0.159284 0.159284 0.079714 +0.194868 0.159284 0.079714 +0.227530 0.159284 0.079714 +0.257434 0.159284 0.079714 +0.285092 0.159284 0.079714 +0.310738 0.159284 0.079714 +0.334585 0.159284 0.079714 +0.356818 0.159284 0.079714 +0.377602 0.159284 0.079714 +0.397079 0.159284 0.079714 +0.415373 0.159284 0.079714 +0.432594 0.159284 0.079714 +0.448839 0.159284 0.079714 +0.464192 0.159284 0.079714 +0.478729 0.159284 0.079714 +0.492515 0.159284 0.079714 +0.505612 0.159284 0.079714 +0.518072 0.159284 0.079714 +0.529943 0.159284 0.079714 +0.541266 0.159284 0.079714 +0.552083 0.159284 0.079714 +0.562427 0.159284 0.079714 +0.572331 0.159284 0.079714 +0.581823 0.159284 0.079714 +0.590929 0.159284 0.079714 +0.599674 0.159284 0.079714 +0.608079 0.159284 0.079714 +0.616166 0.159284 0.079714 +0.000001 0.194868 0.079714 +0.037293 0.194868 0.079714 +0.079714 0.194868 0.079714 +0.120832 0.194868 0.079714 +0.159284 0.194868 0.079714 +0.194868 0.194868 0.079714 +0.227530 0.194868 0.079714 +0.257434 0.194868 0.079714 +0.285092 0.194868 0.079714 +0.310738 0.194868 0.079714 +0.334585 0.194868 0.079714 +0.356818 0.194868 0.079714 +0.377602 0.194868 0.079714 +0.397079 0.194868 0.079714 +0.415373 0.194868 0.079714 +0.432594 0.194868 0.079714 +0.448839 0.194868 0.079714 +0.464192 0.194868 0.079714 +0.478729 0.194868 0.079714 +0.492515 0.194868 0.079714 +0.505612 0.194868 0.079714 +0.518072 0.194868 0.079714 +0.529943 0.194868 0.079714 +0.541266 0.194868 0.079714 +0.552083 0.194868 0.079714 +0.562427 0.194868 0.079714 +0.572331 0.194868 0.079714 +0.581823 0.194868 0.079714 +0.590929 0.194868 0.079714 +0.599674 0.194868 0.079714 +0.608079 0.194868 0.079714 +0.616166 0.194868 0.079714 +0.000001 0.227530 0.079714 +0.037293 0.227530 0.079714 +0.079714 0.227530 0.079714 +0.120832 0.227530 0.079714 +0.159284 0.227530 0.079714 +0.194868 0.227530 0.079714 +0.227530 0.227530 0.079714 +0.257434 0.227530 0.079714 +0.285092 0.227530 0.079714 +0.310738 0.227530 0.079714 +0.334585 0.227530 0.079714 +0.356818 0.227530 0.079714 +0.377602 0.227530 0.079714 +0.397079 0.227530 0.079714 +0.415373 0.227530 0.079714 +0.432594 0.227530 0.079714 +0.448839 0.227530 0.079714 +0.464192 0.227530 0.079714 +0.478729 0.227530 0.079714 +0.492515 0.227530 0.079714 +0.505612 0.227530 0.079714 +0.518072 0.227530 0.079714 +0.529943 0.227530 0.079714 +0.541266 0.227530 0.079714 +0.552083 0.227530 0.079714 +0.562427 0.227530 0.079714 +0.572331 0.227530 0.079714 +0.581823 0.227530 0.079714 +0.590929 0.227530 0.079714 +0.599674 0.227530 0.079714 +0.608079 0.227530 0.079714 +0.616166 0.227530 0.079714 +0.000001 0.257434 0.079714 +0.037293 0.257434 0.079714 +0.079714 0.257434 0.079714 +0.120832 0.257434 0.079714 +0.159284 0.257434 0.079714 +0.194868 0.257434 0.079714 +0.227530 0.257434 0.079714 +0.257434 0.257434 0.079714 +0.285092 0.257434 0.079714 +0.310738 0.257434 0.079714 +0.334585 0.257434 0.079714 +0.356818 0.257434 0.079714 +0.377602 0.257434 0.079714 +0.397079 0.257434 0.079714 +0.415373 0.257434 0.079714 +0.432594 0.257434 0.079714 +0.448839 0.257434 0.079714 +0.464192 0.257434 0.079714 +0.478729 0.257434 0.079714 +0.492515 0.257434 0.079714 +0.505612 0.257434 0.079714 +0.518072 0.257434 0.079714 +0.529943 0.257434 0.079714 +0.541266 0.257434 0.079714 +0.552083 0.257434 0.079714 +0.562427 0.257434 0.079714 +0.572331 0.257434 0.079714 +0.581823 0.257434 0.079714 +0.590929 0.257434 0.079714 +0.599674 0.257434 0.079714 +0.608079 0.257434 0.079714 +0.616166 0.257434 0.079714 +0.000001 0.285092 0.079714 +0.037293 0.285092 0.079714 +0.079714 0.285092 0.079714 +0.120832 0.285092 0.079714 +0.159284 0.285092 0.079714 +0.194868 0.285092 0.079714 +0.227530 0.285092 0.079714 +0.257434 0.285092 0.079714 +0.285092 0.285092 0.079714 +0.310738 0.285092 0.079714 +0.334585 0.285092 0.079714 +0.356818 0.285092 0.079714 +0.377602 0.285092 0.079714 +0.397079 0.285092 0.079714 +0.415373 0.285092 0.079714 +0.432594 0.285092 0.079714 +0.448839 0.285092 0.079714 +0.464192 0.285092 0.079714 +0.478729 0.285092 0.079714 +0.492515 0.285092 0.079714 +0.505612 0.285092 0.079714 +0.518072 0.285092 0.079714 +0.529943 0.285092 0.079714 +0.541266 0.285092 0.079714 +0.552083 0.285092 0.079714 +0.562427 0.285092 0.079714 +0.572331 0.285092 0.079714 +0.581823 0.285092 0.079714 +0.590929 0.285092 0.079714 +0.599674 0.285092 0.079714 +0.608079 0.285092 0.079714 +0.616166 0.285092 0.079714 +0.000001 0.310738 0.079714 +0.037293 0.310738 0.079714 +0.079714 0.310738 0.079714 +0.120832 0.310738 0.079714 +0.159284 0.310738 0.079714 +0.194868 0.310738 0.079714 +0.227530 0.310738 0.079714 +0.257434 0.310738 0.079714 +0.285092 0.310738 0.079714 +0.310738 0.310738 0.079714 +0.334585 0.310738 0.079714 +0.356818 0.310738 0.079714 +0.377602 0.310738 0.079714 +0.397079 0.310738 0.079714 +0.415373 0.310738 0.079714 +0.432594 0.310738 0.079714 +0.448839 0.310738 0.079714 +0.464192 0.310738 0.079714 +0.478729 0.310738 0.079714 +0.492515 0.310738 0.079714 +0.505612 0.310738 0.079714 +0.518072 0.310738 0.079714 +0.529943 0.310738 0.079714 +0.541266 0.310738 0.079714 +0.552083 0.310738 0.079714 +0.562427 0.310738 0.079714 +0.572331 0.310738 0.079714 +0.581823 0.310738 0.079714 +0.590929 0.310738 0.079714 +0.599674 0.310738 0.079714 +0.608079 0.310738 0.079714 +0.616166 0.310738 0.079714 +0.000001 0.334585 0.079714 +0.037293 0.334585 0.079714 +0.079714 0.334585 0.079714 +0.120832 0.334585 0.079714 +0.159284 0.334585 0.079714 +0.194868 0.334585 0.079714 +0.227530 0.334585 0.079714 +0.257434 0.334585 0.079714 +0.285092 0.334585 0.079714 +0.310738 0.334585 0.079714 +0.334585 0.334585 0.079714 +0.356818 0.334585 0.079714 +0.377602 0.334585 0.079714 +0.397079 0.334585 0.079714 +0.415373 0.334585 0.079714 +0.432594 0.334585 0.079714 +0.448839 0.334585 0.079714 +0.464192 0.334585 0.079714 +0.478729 0.334585 0.079714 +0.492515 0.334585 0.079714 +0.505612 0.334585 0.079714 +0.518072 0.334585 0.079714 +0.529943 0.334585 0.079714 +0.541266 0.334585 0.079714 +0.552083 0.334585 0.079714 +0.562427 0.334585 0.079714 +0.572331 0.334585 0.079714 +0.581823 0.334585 0.079714 +0.590929 0.334585 0.079714 +0.599674 0.334585 0.079714 +0.608079 0.334585 0.079714 +0.616166 0.334585 0.079714 +0.000001 0.356818 0.079714 +0.037293 0.356818 0.079714 +0.079714 0.356818 0.079714 +0.120832 0.356818 0.079714 +0.159284 0.356818 0.079714 +0.194868 0.356818 0.079714 +0.227530 0.356818 0.079714 +0.257434 0.356818 0.079714 +0.285092 0.356818 0.079714 +0.310738 0.356818 0.079714 +0.334585 0.356818 0.079714 +0.356818 0.356818 0.079714 +0.377602 0.356818 0.079714 +0.397079 0.356818 0.079714 +0.415373 0.356818 0.079714 +0.432594 0.356818 0.079714 +0.448839 0.356818 0.079714 +0.464192 0.356818 0.079714 +0.478729 0.356818 0.079714 +0.492515 0.356818 0.079714 +0.505612 0.356818 0.079714 +0.518072 0.356818 0.079714 +0.529943 0.356818 0.079714 +0.541266 0.356818 0.079714 +0.552083 0.356818 0.079714 +0.562427 0.356818 0.079714 +0.572331 0.356818 0.079714 +0.581823 0.356818 0.079714 +0.590929 0.356818 0.079714 +0.599674 0.356818 0.079714 +0.608079 0.356818 0.079714 +0.616166 0.356818 0.079714 +0.000001 0.377602 0.079714 +0.037293 0.377602 0.079714 +0.079714 0.377602 0.079714 +0.120832 0.377602 0.079714 +0.159284 0.377602 0.079714 +0.194868 0.377602 0.079714 +0.227530 0.377602 0.079714 +0.257434 0.377602 0.079714 +0.285092 0.377602 0.079714 +0.310738 0.377602 0.079714 +0.334585 0.377602 0.079714 +0.356818 0.377602 0.079714 +0.377602 0.377602 0.079714 +0.397079 0.377602 0.079714 +0.415373 0.377602 0.079714 +0.432594 0.377602 0.079714 +0.448839 0.377602 0.079714 +0.464192 0.377602 0.079714 +0.478729 0.377602 0.079714 +0.492515 0.377602 0.079714 +0.505612 0.377602 0.079714 +0.518072 0.377602 0.079714 +0.529943 0.377602 0.079714 +0.541266 0.377602 0.079714 +0.552083 0.377602 0.079714 +0.562427 0.377602 0.079714 +0.572331 0.377602 0.079714 +0.581823 0.377602 0.079714 +0.590929 0.377602 0.079714 +0.599674 0.377602 0.079714 +0.608079 0.377602 0.079714 +0.616166 0.377602 0.079714 +0.000001 0.397079 0.079714 +0.037293 0.397079 0.079714 +0.079714 0.397079 0.079714 +0.120832 0.397079 0.079714 +0.159284 0.397079 0.079714 +0.194868 0.397079 0.079714 +0.227530 0.397079 0.079714 +0.257434 0.397079 0.079714 +0.285092 0.397079 0.079714 +0.310738 0.397079 0.079714 +0.334585 0.397079 0.079714 +0.356818 0.397079 0.079714 +0.377602 0.397079 0.079714 +0.397079 0.397079 0.079714 +0.415373 0.397079 0.079714 +0.432594 0.397079 0.079714 +0.448839 0.397079 0.079714 +0.464192 0.397079 0.079714 +0.478729 0.397079 0.079714 +0.492515 0.397079 0.079714 +0.505612 0.397079 0.079714 +0.518072 0.397079 0.079714 +0.529943 0.397079 0.079714 +0.541266 0.397079 0.079714 +0.552083 0.397079 0.079714 +0.562427 0.397079 0.079714 +0.572331 0.397079 0.079714 +0.581823 0.397079 0.079714 +0.590929 0.397079 0.079714 +0.599674 0.397079 0.079714 +0.608079 0.397079 0.079714 +0.616166 0.397079 0.079714 +0.000001 0.415373 0.079714 +0.037293 0.415373 0.079714 +0.079714 0.415373 0.079714 +0.120832 0.415373 0.079714 +0.159284 0.415373 0.079714 +0.194868 0.415373 0.079714 +0.227530 0.415373 0.079714 +0.257434 0.415373 0.079714 +0.285092 0.415373 0.079714 +0.310738 0.415373 0.079714 +0.334585 0.415373 0.079714 +0.356818 0.415373 0.079714 +0.377602 0.415373 0.079714 +0.397079 0.415373 0.079714 +0.415373 0.415373 0.079714 +0.432594 0.415373 0.079714 +0.448839 0.415373 0.079714 +0.464192 0.415373 0.079714 +0.478729 0.415373 0.079714 +0.492515 0.415373 0.079714 +0.505612 0.415373 0.079714 +0.518072 0.415373 0.079714 +0.529943 0.415373 0.079714 +0.541266 0.415373 0.079714 +0.552083 0.415373 0.079714 +0.562427 0.415373 0.079714 +0.572331 0.415373 0.079714 +0.581823 0.415373 0.079714 +0.590929 0.415373 0.079714 +0.599674 0.415373 0.079714 +0.608079 0.415373 0.079714 +0.616166 0.415373 0.079714 +0.000001 0.432594 0.079714 +0.037293 0.432594 0.079714 +0.079714 0.432594 0.079714 +0.120832 0.432594 0.079714 +0.159284 0.432594 0.079714 +0.194868 0.432594 0.079714 +0.227530 0.432594 0.079714 +0.257434 0.432594 0.079714 +0.285092 0.432594 0.079714 +0.310738 0.432594 0.079714 +0.334585 0.432594 0.079714 +0.356818 0.432594 0.079714 +0.377602 0.432594 0.079714 +0.397079 0.432594 0.079714 +0.415373 0.432594 0.079714 +0.432594 0.432594 0.079714 +0.448839 0.432594 0.079714 +0.464192 0.432594 0.079714 +0.478729 0.432594 0.079714 +0.492515 0.432594 0.079714 +0.505612 0.432594 0.079714 +0.518072 0.432594 0.079714 +0.529943 0.432594 0.079714 +0.541266 0.432594 0.079714 +0.552083 0.432594 0.079714 +0.562427 0.432594 0.079714 +0.572331 0.432594 0.079714 +0.581823 0.432594 0.079714 +0.590929 0.432594 0.079714 +0.599674 0.432594 0.079714 +0.608079 0.432594 0.079714 +0.616166 0.432594 0.079714 +0.000001 0.448839 0.079714 +0.037293 0.448839 0.079714 +0.079714 0.448839 0.079714 +0.120832 0.448839 0.079714 +0.159284 0.448839 0.079714 +0.194868 0.448839 0.079714 +0.227530 0.448839 0.079714 +0.257434 0.448839 0.079714 +0.285092 0.448839 0.079714 +0.310738 0.448839 0.079714 +0.334585 0.448839 0.079714 +0.356818 0.448839 0.079714 +0.377602 0.448839 0.079714 +0.397079 0.448839 0.079714 +0.415373 0.448839 0.079714 +0.432594 0.448839 0.079714 +0.448839 0.448839 0.079714 +0.464192 0.448839 0.079714 +0.478729 0.448839 0.079714 +0.492515 0.448839 0.079714 +0.505612 0.448839 0.079714 +0.518072 0.448839 0.079714 +0.529943 0.448839 0.079714 +0.541266 0.448839 0.079714 +0.552083 0.448839 0.079714 +0.562427 0.448839 0.079714 +0.572331 0.448839 0.079714 +0.581823 0.448839 0.079714 +0.590929 0.448839 0.079714 +0.599674 0.448839 0.079714 +0.608079 0.448839 0.079714 +0.616166 0.448839 0.079714 +0.000001 0.464192 0.079714 +0.037293 0.464192 0.079714 +0.079714 0.464192 0.079714 +0.120832 0.464192 0.079714 +0.159284 0.464192 0.079714 +0.194868 0.464192 0.079714 +0.227530 0.464192 0.079714 +0.257434 0.464192 0.079714 +0.285092 0.464192 0.079714 +0.310738 0.464192 0.079714 +0.334585 0.464192 0.079714 +0.356818 0.464192 0.079714 +0.377602 0.464192 0.079714 +0.397079 0.464192 0.079714 +0.415373 0.464192 0.079714 +0.432594 0.464192 0.079714 +0.448839 0.464192 0.079714 +0.464192 0.464192 0.079714 +0.478729 0.464192 0.079714 +0.492515 0.464192 0.079714 +0.505612 0.464192 0.079714 +0.518072 0.464192 0.079714 +0.529943 0.464192 0.079714 +0.541266 0.464192 0.079714 +0.552083 0.464192 0.079714 +0.562427 0.464192 0.079714 +0.572331 0.464192 0.079714 +0.581823 0.464192 0.079714 +0.590929 0.464192 0.079714 +0.599674 0.464192 0.079714 +0.608079 0.464192 0.079714 +0.616166 0.464192 0.079714 +0.000001 0.478729 0.079714 +0.037293 0.478729 0.079714 +0.079714 0.478729 0.079714 +0.120832 0.478729 0.079714 +0.159284 0.478729 0.079714 +0.194868 0.478729 0.079714 +0.227530 0.478729 0.079714 +0.257434 0.478729 0.079714 +0.285092 0.478729 0.079714 +0.310738 0.478729 0.079714 +0.334585 0.478729 0.079714 +0.356818 0.478729 0.079714 +0.377602 0.478729 0.079714 +0.397079 0.478729 0.079714 +0.415373 0.478729 0.079714 +0.432594 0.478729 0.079714 +0.448839 0.478729 0.079714 +0.464192 0.478729 0.079714 +0.478729 0.478729 0.079714 +0.492515 0.478729 0.079714 +0.505612 0.478729 0.079714 +0.518072 0.478729 0.079714 +0.529943 0.478729 0.079714 +0.541266 0.478729 0.079714 +0.552083 0.478729 0.079714 +0.562427 0.478729 0.079714 +0.572331 0.478729 0.079714 +0.581823 0.478729 0.079714 +0.590929 0.478729 0.079714 +0.599674 0.478729 0.079714 +0.608079 0.478729 0.079714 +0.616166 0.478729 0.079714 +0.000001 0.492515 0.079714 +0.037293 0.492515 0.079714 +0.079714 0.492515 0.079714 +0.120832 0.492515 0.079714 +0.159284 0.492515 0.079714 +0.194868 0.492515 0.079714 +0.227530 0.492515 0.079714 +0.257434 0.492515 0.079714 +0.285092 0.492515 0.079714 +0.310738 0.492515 0.079714 +0.334585 0.492515 0.079714 +0.356818 0.492515 0.079714 +0.377602 0.492515 0.079714 +0.397079 0.492515 0.079714 +0.415373 0.492515 0.079714 +0.432594 0.492515 0.079714 +0.448839 0.492515 0.079714 +0.464192 0.492515 0.079714 +0.478729 0.492515 0.079714 +0.492515 0.492515 0.079714 +0.505612 0.492515 0.079714 +0.518072 0.492515 0.079714 +0.529943 0.492515 0.079714 +0.541266 0.492515 0.079714 +0.552083 0.492515 0.079714 +0.562427 0.492515 0.079714 +0.572331 0.492515 0.079714 +0.581823 0.492515 0.079714 +0.590929 0.492515 0.079714 +0.599674 0.492515 0.079714 +0.608079 0.492515 0.079714 +0.616166 0.492515 0.079714 +0.000001 0.505612 0.079714 +0.037293 0.505612 0.079714 +0.079714 0.505612 0.079714 +0.120832 0.505612 0.079714 +0.159284 0.505612 0.079714 +0.194868 0.505612 0.079714 +0.227530 0.505612 0.079714 +0.257434 0.505612 0.079714 +0.285092 0.505612 0.079714 +0.310738 0.505612 0.079714 +0.334585 0.505612 0.079714 +0.356818 0.505612 0.079714 +0.377602 0.505612 0.079714 +0.397079 0.505612 0.079714 +0.415373 0.505612 0.079714 +0.432594 0.505612 0.079714 +0.448839 0.505612 0.079714 +0.464192 0.505612 0.079714 +0.478729 0.505612 0.079714 +0.492515 0.505612 0.079714 +0.505612 0.505612 0.079714 +0.518072 0.505612 0.079714 +0.529943 0.505612 0.079714 +0.541266 0.505612 0.079714 +0.552083 0.505612 0.079714 +0.562427 0.505612 0.079714 +0.572331 0.505612 0.079714 +0.581823 0.505612 0.079714 +0.590929 0.505612 0.079714 +0.599674 0.505612 0.079714 +0.608079 0.505612 0.079714 +0.616166 0.505612 0.079714 +0.000001 0.518072 0.079714 +0.037293 0.518072 0.079714 +0.079714 0.518072 0.079714 +0.120832 0.518072 0.079714 +0.159284 0.518072 0.079714 +0.194868 0.518072 0.079714 +0.227530 0.518072 0.079714 +0.257434 0.518072 0.079714 +0.285092 0.518072 0.079714 +0.310738 0.518072 0.079714 +0.334585 0.518072 0.079714 +0.356818 0.518072 0.079714 +0.377602 0.518072 0.079714 +0.397079 0.518072 0.079714 +0.415373 0.518072 0.079714 +0.432594 0.518072 0.079714 +0.448839 0.518072 0.079714 +0.464192 0.518072 0.079714 +0.478729 0.518072 0.079714 +0.492515 0.518072 0.079714 +0.505612 0.518072 0.079714 +0.518072 0.518072 0.079714 +0.529943 0.518072 0.079714 +0.541266 0.518072 0.079714 +0.552083 0.518072 0.079714 +0.562427 0.518072 0.079714 +0.572331 0.518072 0.079714 +0.581823 0.518072 0.079714 +0.590929 0.518072 0.079714 +0.599674 0.518072 0.079714 +0.608079 0.518072 0.079714 +0.616166 0.518072 0.079714 +0.000001 0.529943 0.079714 +0.037293 0.529943 0.079714 +0.079714 0.529943 0.079714 +0.120832 0.529943 0.079714 +0.159284 0.529943 0.079714 +0.194868 0.529943 0.079714 +0.227530 0.529943 0.079714 +0.257434 0.529943 0.079714 +0.285092 0.529943 0.079714 +0.310738 0.529943 0.079714 +0.334585 0.529943 0.079714 +0.356818 0.529943 0.079714 +0.377602 0.529943 0.079714 +0.397079 0.529943 0.079714 +0.415373 0.529943 0.079714 +0.432594 0.529943 0.079714 +0.448839 0.529943 0.079714 +0.464192 0.529943 0.079714 +0.478729 0.529943 0.079714 +0.492515 0.529943 0.079714 +0.505612 0.529943 0.079714 +0.518072 0.529943 0.079714 +0.529943 0.529943 0.079714 +0.541266 0.529943 0.079714 +0.552083 0.529943 0.079714 +0.562427 0.529943 0.079714 +0.572331 0.529943 0.079714 +0.581823 0.529943 0.079714 +0.590929 0.529943 0.079714 +0.599674 0.529943 0.079714 +0.608079 0.529943 0.079714 +0.616166 0.529943 0.079714 +0.000001 0.541266 0.079714 +0.037293 0.541266 0.079714 +0.079714 0.541266 0.079714 +0.120832 0.541266 0.079714 +0.159284 0.541266 0.079714 +0.194868 0.541266 0.079714 +0.227530 0.541266 0.079714 +0.257434 0.541266 0.079714 +0.285092 0.541266 0.079714 +0.310738 0.541266 0.079714 +0.334585 0.541266 0.079714 +0.356818 0.541266 0.079714 +0.377602 0.541266 0.079714 +0.397079 0.541266 0.079714 +0.415373 0.541266 0.079714 +0.432594 0.541266 0.079714 +0.448839 0.541266 0.079714 +0.464192 0.541266 0.079714 +0.478729 0.541266 0.079714 +0.492515 0.541266 0.079714 +0.505612 0.541266 0.079714 +0.518072 0.541266 0.079714 +0.529943 0.541266 0.079714 +0.541266 0.541266 0.079714 +0.552083 0.541266 0.079714 +0.562427 0.541266 0.079714 +0.572331 0.541266 0.079714 +0.581823 0.541266 0.079714 +0.590929 0.541266 0.079714 +0.599674 0.541266 0.079714 +0.608079 0.541266 0.079714 +0.616166 0.541266 0.079714 +0.000001 0.552083 0.079714 +0.037293 0.552083 0.079714 +0.079714 0.552083 0.079714 +0.120832 0.552083 0.079714 +0.159284 0.552083 0.079714 +0.194868 0.552083 0.079714 +0.227530 0.552083 0.079714 +0.257434 0.552083 0.079714 +0.285092 0.552083 0.079714 +0.310738 0.552083 0.079714 +0.334585 0.552083 0.079714 +0.356818 0.552083 0.079714 +0.377602 0.552083 0.079714 +0.397079 0.552083 0.079714 +0.415373 0.552083 0.079714 +0.432594 0.552083 0.079714 +0.448839 0.552083 0.079714 +0.464192 0.552083 0.079714 +0.478729 0.552083 0.079714 +0.492515 0.552083 0.079714 +0.505612 0.552083 0.079714 +0.518072 0.552083 0.079714 +0.529943 0.552083 0.079714 +0.541266 0.552083 0.079714 +0.552083 0.552083 0.079714 +0.562427 0.552083 0.079714 +0.572331 0.552083 0.079714 +0.581823 0.552083 0.079714 +0.590929 0.552083 0.079714 +0.599674 0.552083 0.079714 +0.608079 0.552083 0.079714 +0.616166 0.552083 0.079714 +0.000001 0.562427 0.079714 +0.037293 0.562427 0.079714 +0.079714 0.562427 0.079714 +0.120832 0.562427 0.079714 +0.159284 0.562427 0.079714 +0.194868 0.562427 0.079714 +0.227530 0.562427 0.079714 +0.257434 0.562427 0.079714 +0.285092 0.562427 0.079714 +0.310738 0.562427 0.079714 +0.334585 0.562427 0.079714 +0.356818 0.562427 0.079714 +0.377602 0.562427 0.079714 +0.397079 0.562427 0.079714 +0.415373 0.562427 0.079714 +0.432594 0.562427 0.079714 +0.448839 0.562427 0.079714 +0.464192 0.562427 0.079714 +0.478729 0.562427 0.079714 +0.492515 0.562427 0.079714 +0.505612 0.562427 0.079714 +0.518072 0.562427 0.079714 +0.529943 0.562427 0.079714 +0.541266 0.562427 0.079714 +0.552083 0.562427 0.079714 +0.562427 0.562427 0.079714 +0.572331 0.562427 0.079714 +0.581823 0.562427 0.079714 +0.590929 0.562427 0.079714 +0.599674 0.562427 0.079714 +0.608079 0.562427 0.079714 +0.616166 0.562427 0.079714 +0.000001 0.572331 0.079714 +0.037293 0.572331 0.079714 +0.079714 0.572331 0.079714 +0.120832 0.572331 0.079714 +0.159284 0.572331 0.079714 +0.194868 0.572331 0.079714 +0.227530 0.572331 0.079714 +0.257434 0.572331 0.079714 +0.285092 0.572331 0.079714 +0.310738 0.572331 0.079714 +0.334585 0.572331 0.079714 +0.356818 0.572331 0.079714 +0.377602 0.572331 0.079714 +0.397079 0.572331 0.079714 +0.415373 0.572331 0.079714 +0.432594 0.572331 0.079714 +0.448839 0.572331 0.079714 +0.464192 0.572331 0.079714 +0.478729 0.572331 0.079714 +0.492515 0.572331 0.079714 +0.505612 0.572331 0.079714 +0.518072 0.572331 0.079714 +0.529943 0.572331 0.079714 +0.541266 0.572331 0.079714 +0.552083 0.572331 0.079714 +0.562427 0.572331 0.079714 +0.572331 0.572331 0.079714 +0.581823 0.572331 0.079714 +0.590929 0.572331 0.079714 +0.599674 0.572331 0.079714 +0.608079 0.572331 0.079714 +0.616166 0.572331 0.079714 +0.000001 0.581823 0.079714 +0.037293 0.581823 0.079714 +0.079714 0.581823 0.079714 +0.120832 0.581823 0.079714 +0.159284 0.581823 0.079714 +0.194868 0.581823 0.079714 +0.227530 0.581823 0.079714 +0.257434 0.581823 0.079714 +0.285092 0.581823 0.079714 +0.310738 0.581823 0.079714 +0.334585 0.581823 0.079714 +0.356818 0.581823 0.079714 +0.377602 0.581823 0.079714 +0.397079 0.581823 0.079714 +0.415373 0.581823 0.079714 +0.432594 0.581823 0.079714 +0.448839 0.581823 0.079714 +0.464192 0.581823 0.079714 +0.478729 0.581823 0.079714 +0.492515 0.581823 0.079714 +0.505612 0.581823 0.079714 +0.518072 0.581823 0.079714 +0.529943 0.581823 0.079714 +0.541266 0.581823 0.079714 +0.552083 0.581823 0.079714 +0.562427 0.581823 0.079714 +0.572331 0.581823 0.079714 +0.581823 0.581823 0.079714 +0.590929 0.581823 0.079714 +0.599674 0.581823 0.079714 +0.608079 0.581823 0.079714 +0.616166 0.581823 0.079714 +0.000001 0.590929 0.079714 +0.037293 0.590929 0.079714 +0.079714 0.590929 0.079714 +0.120832 0.590929 0.079714 +0.159284 0.590929 0.079714 +0.194868 0.590929 0.079714 +0.227530 0.590929 0.079714 +0.257434 0.590929 0.079714 +0.285092 0.590929 0.079714 +0.310738 0.590929 0.079714 +0.334585 0.590929 0.079714 +0.356818 0.590929 0.079714 +0.377602 0.590929 0.079714 +0.397079 0.590929 0.079714 +0.415373 0.590929 0.079714 +0.432594 0.590929 0.079714 +0.448839 0.590929 0.079714 +0.464192 0.590929 0.079714 +0.478729 0.590929 0.079714 +0.492515 0.590929 0.079714 +0.505612 0.590929 0.079714 +0.518072 0.590929 0.079714 +0.529943 0.590929 0.079714 +0.541266 0.590929 0.079714 +0.552083 0.590929 0.079714 +0.562427 0.590929 0.079714 +0.572331 0.590929 0.079714 +0.581823 0.590929 0.079714 +0.590929 0.590929 0.079714 +0.599674 0.590929 0.079714 +0.608079 0.590929 0.079714 +0.616166 0.590929 0.079714 +0.000001 0.599674 0.079714 +0.037293 0.599674 0.079714 +0.079714 0.599674 0.079714 +0.120832 0.599674 0.079714 +0.159284 0.599674 0.079714 +0.194868 0.599674 0.079714 +0.227530 0.599674 0.079714 +0.257434 0.599674 0.079714 +0.285092 0.599674 0.079714 +0.310738 0.599674 0.079714 +0.334585 0.599674 0.079714 +0.356818 0.599674 0.079714 +0.377602 0.599674 0.079714 +0.397079 0.599674 0.079714 +0.415373 0.599674 0.079714 +0.432594 0.599674 0.079714 +0.448839 0.599674 0.079714 +0.464192 0.599674 0.079714 +0.478729 0.599674 0.079714 +0.492515 0.599674 0.079714 +0.505612 0.599674 0.079714 +0.518072 0.599674 0.079714 +0.529943 0.599674 0.079714 +0.541266 0.599674 0.079714 +0.552083 0.599674 0.079714 +0.562427 0.599674 0.079714 +0.572331 0.599674 0.079714 +0.581823 0.599674 0.079714 +0.590929 0.599674 0.079714 +0.599674 0.599674 0.079714 +0.608079 0.599674 0.079714 +0.616166 0.599674 0.079714 +0.000001 0.608079 0.079714 +0.037293 0.608079 0.079714 +0.079714 0.608079 0.079714 +0.120832 0.608079 0.079714 +0.159284 0.608079 0.079714 +0.194868 0.608079 0.079714 +0.227530 0.608079 0.079714 +0.257434 0.608079 0.079714 +0.285092 0.608079 0.079714 +0.310738 0.608079 0.079714 +0.334585 0.608079 0.079714 +0.356818 0.608079 0.079714 +0.377602 0.608079 0.079714 +0.397079 0.608079 0.079714 +0.415373 0.608079 0.079714 +0.432594 0.608079 0.079714 +0.448839 0.608079 0.079714 +0.464192 0.608079 0.079714 +0.478729 0.608079 0.079714 +0.492515 0.608079 0.079714 +0.505612 0.608079 0.079714 +0.518072 0.608079 0.079714 +0.529943 0.608079 0.079714 +0.541266 0.608079 0.079714 +0.552083 0.608079 0.079714 +0.562427 0.608079 0.079714 +0.572331 0.608079 0.079714 +0.581823 0.608079 0.079714 +0.590929 0.608079 0.079714 +0.599674 0.608079 0.079714 +0.608079 0.608079 0.079714 +0.616166 0.608079 0.079714 +0.000001 0.616166 0.079714 +0.037293 0.616166 0.079714 +0.079714 0.616166 0.079714 +0.120832 0.616166 0.079714 +0.159284 0.616166 0.079714 +0.194868 0.616166 0.079714 +0.227530 0.616166 0.079714 +0.257434 0.616166 0.079714 +0.285092 0.616166 0.079714 +0.310738 0.616166 0.079714 +0.334585 0.616166 0.079714 +0.356818 0.616166 0.079714 +0.377602 0.616166 0.079714 +0.397079 0.616166 0.079714 +0.415373 0.616166 0.079714 +0.432594 0.616166 0.079714 +0.448839 0.616166 0.079714 +0.464192 0.616166 0.079714 +0.478729 0.616166 0.079714 +0.492515 0.616166 0.079714 +0.505612 0.616166 0.079714 +0.518072 0.616166 0.079714 +0.529943 0.616166 0.079714 +0.541266 0.616166 0.079714 +0.552083 0.616166 0.079714 +0.562427 0.616166 0.079714 +0.572331 0.616166 0.079714 +0.581823 0.616166 0.079714 +0.590929 0.616166 0.079714 +0.599674 0.616166 0.079714 +0.608079 0.616166 0.079714 +0.616166 0.616166 0.079714 +0.000001 0.000001 0.120832 +0.037293 0.000001 0.120832 +0.079714 0.000001 0.120832 +0.120832 0.000001 0.120832 +0.159284 0.000001 0.120832 +0.194868 0.000001 0.120832 +0.227530 0.000001 0.120832 +0.257434 0.000001 0.120832 +0.285092 0.000001 0.120832 +0.310738 0.000001 0.120832 +0.334585 0.000001 0.120832 +0.356818 0.000001 0.120832 +0.377602 0.000001 0.120832 +0.397079 0.000001 0.120832 +0.415373 0.000001 0.120832 +0.432594 0.000001 0.120832 +0.448839 0.000001 0.120832 +0.464192 0.000001 0.120832 +0.478729 0.000001 0.120832 +0.492515 0.000001 0.120832 +0.505612 0.000001 0.120832 +0.518072 0.000001 0.120832 +0.529943 0.000001 0.120832 +0.541266 0.000001 0.120832 +0.552083 0.000001 0.120832 +0.562427 0.000001 0.120832 +0.572331 0.000001 0.120832 +0.581823 0.000001 0.120832 +0.590929 0.000001 0.120832 +0.599674 0.000001 0.120832 +0.608079 0.000001 0.120832 +0.616166 0.000001 0.120832 +0.000001 0.037293 0.120832 +0.037293 0.037293 0.120832 +0.079714 0.037293 0.120832 +0.120832 0.037293 0.120832 +0.159284 0.037293 0.120832 +0.194868 0.037293 0.120832 +0.227530 0.037293 0.120832 +0.257434 0.037293 0.120832 +0.285092 0.037293 0.120832 +0.310738 0.037293 0.120832 +0.334585 0.037293 0.120832 +0.356818 0.037293 0.120832 +0.377602 0.037293 0.120832 +0.397079 0.037293 0.120832 +0.415373 0.037293 0.120832 +0.432594 0.037293 0.120832 +0.448839 0.037293 0.120832 +0.464192 0.037293 0.120832 +0.478729 0.037293 0.120832 +0.492515 0.037293 0.120832 +0.505612 0.037293 0.120832 +0.518072 0.037293 0.120832 +0.529943 0.037293 0.120832 +0.541266 0.037293 0.120832 +0.552083 0.037293 0.120832 +0.562427 0.037293 0.120832 +0.572331 0.037293 0.120832 +0.581823 0.037293 0.120832 +0.590929 0.037293 0.120832 +0.599674 0.037293 0.120832 +0.608079 0.037293 0.120832 +0.616166 0.037293 0.120832 +0.000001 0.079714 0.120832 +0.037293 0.079714 0.120832 +0.079714 0.079714 0.120832 +0.120832 0.079714 0.120832 +0.159284 0.079714 0.120832 +0.194868 0.079714 0.120832 +0.227530 0.079714 0.120832 +0.257434 0.079714 0.120832 +0.285092 0.079714 0.120832 +0.310738 0.079714 0.120832 +0.334585 0.079714 0.120832 +0.356818 0.079714 0.120832 +0.377602 0.079714 0.120832 +0.397079 0.079714 0.120832 +0.415373 0.079714 0.120832 +0.432594 0.079714 0.120832 +0.448839 0.079714 0.120832 +0.464192 0.079714 0.120832 +0.478729 0.079714 0.120832 +0.492515 0.079714 0.120832 +0.505612 0.079714 0.120832 +0.518072 0.079714 0.120832 +0.529943 0.079714 0.120832 +0.541266 0.079714 0.120832 +0.552083 0.079714 0.120832 +0.562427 0.079714 0.120832 +0.572331 0.079714 0.120832 +0.581823 0.079714 0.120832 +0.590929 0.079714 0.120832 +0.599674 0.079714 0.120832 +0.608079 0.079714 0.120832 +0.616166 0.079714 0.120832 +0.000001 0.120832 0.120832 +0.037293 0.120832 0.120832 +0.079714 0.120832 0.120832 +0.120832 0.120832 0.120832 +0.159284 0.120832 0.120832 +0.194868 0.120832 0.120832 +0.227530 0.120832 0.120832 +0.257434 0.120832 0.120832 +0.285092 0.120832 0.120832 +0.310738 0.120832 0.120832 +0.334585 0.120832 0.120832 +0.356818 0.120832 0.120832 +0.377602 0.120832 0.120832 +0.397079 0.120832 0.120832 +0.415373 0.120832 0.120832 +0.432594 0.120832 0.120832 +0.448839 0.120832 0.120832 +0.464192 0.120832 0.120832 +0.478729 0.120832 0.120832 +0.492515 0.120832 0.120832 +0.505612 0.120832 0.120832 +0.518072 0.120832 0.120832 +0.529943 0.120832 0.120832 +0.541266 0.120832 0.120832 +0.552083 0.120832 0.120832 +0.562427 0.120832 0.120832 +0.572331 0.120832 0.120832 +0.581823 0.120832 0.120832 +0.590929 0.120832 0.120832 +0.599674 0.120832 0.120832 +0.608079 0.120832 0.120832 +0.616166 0.120832 0.120832 +0.000001 0.159284 0.120832 +0.037293 0.159284 0.120832 +0.079714 0.159284 0.120832 +0.120832 0.159284 0.120832 +0.159284 0.159284 0.120832 +0.194868 0.159284 0.120832 +0.227530 0.159284 0.120832 +0.257434 0.159284 0.120832 +0.285092 0.159284 0.120832 +0.310738 0.159284 0.120832 +0.334585 0.159284 0.120832 +0.356818 0.159284 0.120832 +0.377602 0.159284 0.120832 +0.397079 0.159284 0.120832 +0.415373 0.159284 0.120832 +0.432594 0.159284 0.120832 +0.448839 0.159284 0.120832 +0.464192 0.159284 0.120832 +0.478729 0.159284 0.120832 +0.492515 0.159284 0.120832 +0.505612 0.159284 0.120832 +0.518072 0.159284 0.120832 +0.529943 0.159284 0.120832 +0.541266 0.159284 0.120832 +0.552083 0.159284 0.120832 +0.562427 0.159284 0.120832 +0.572331 0.159284 0.120832 +0.581823 0.159284 0.120832 +0.590929 0.159284 0.120832 +0.599674 0.159284 0.120832 +0.608079 0.159284 0.120832 +0.616166 0.159284 0.120832 +0.000001 0.194868 0.120832 +0.037293 0.194868 0.120832 +0.079714 0.194868 0.120832 +0.120832 0.194868 0.120832 +0.159284 0.194868 0.120832 +0.194868 0.194868 0.120832 +0.227530 0.194868 0.120832 +0.257434 0.194868 0.120832 +0.285092 0.194868 0.120832 +0.310738 0.194868 0.120832 +0.334585 0.194868 0.120832 +0.356818 0.194868 0.120832 +0.377602 0.194868 0.120832 +0.397079 0.194868 0.120832 +0.415373 0.194868 0.120832 +0.432594 0.194868 0.120832 +0.448839 0.194868 0.120832 +0.464192 0.194868 0.120832 +0.478729 0.194868 0.120832 +0.492515 0.194868 0.120832 +0.505612 0.194868 0.120832 +0.518072 0.194868 0.120832 +0.529943 0.194868 0.120832 +0.541266 0.194868 0.120832 +0.552083 0.194868 0.120832 +0.562427 0.194868 0.120832 +0.572331 0.194868 0.120832 +0.581823 0.194868 0.120832 +0.590929 0.194868 0.120832 +0.599674 0.194868 0.120832 +0.608079 0.194868 0.120832 +0.616166 0.194868 0.120832 +0.000001 0.227530 0.120832 +0.037293 0.227530 0.120832 +0.079714 0.227530 0.120832 +0.120832 0.227530 0.120832 +0.159284 0.227530 0.120832 +0.194868 0.227530 0.120832 +0.227530 0.227530 0.120832 +0.257434 0.227530 0.120832 +0.285092 0.227530 0.120832 +0.310738 0.227530 0.120832 +0.334585 0.227530 0.120832 +0.356818 0.227530 0.120832 +0.377602 0.227530 0.120832 +0.397079 0.227530 0.120832 +0.415373 0.227530 0.120832 +0.432594 0.227530 0.120832 +0.448839 0.227530 0.120832 +0.464192 0.227530 0.120832 +0.478729 0.227530 0.120832 +0.492515 0.227530 0.120832 +0.505612 0.227530 0.120832 +0.518072 0.227530 0.120832 +0.529943 0.227530 0.120832 +0.541266 0.227530 0.120832 +0.552083 0.227530 0.120832 +0.562427 0.227530 0.120832 +0.572331 0.227530 0.120832 +0.581823 0.227530 0.120832 +0.590929 0.227530 0.120832 +0.599674 0.227530 0.120832 +0.608079 0.227530 0.120832 +0.616166 0.227530 0.120832 +0.000001 0.257434 0.120832 +0.037293 0.257434 0.120832 +0.079714 0.257434 0.120832 +0.120832 0.257434 0.120832 +0.159284 0.257434 0.120832 +0.194868 0.257434 0.120832 +0.227530 0.257434 0.120832 +0.257434 0.257434 0.120832 +0.285092 0.257434 0.120832 +0.310738 0.257434 0.120832 +0.334585 0.257434 0.120832 +0.356818 0.257434 0.120832 +0.377602 0.257434 0.120832 +0.397079 0.257434 0.120832 +0.415373 0.257434 0.120832 +0.432594 0.257434 0.120832 +0.448839 0.257434 0.120832 +0.464192 0.257434 0.120832 +0.478729 0.257434 0.120832 +0.492515 0.257434 0.120832 +0.505612 0.257434 0.120832 +0.518072 0.257434 0.120832 +0.529943 0.257434 0.120832 +0.541266 0.257434 0.120832 +0.552083 0.257434 0.120832 +0.562427 0.257434 0.120832 +0.572331 0.257434 0.120832 +0.581823 0.257434 0.120832 +0.590929 0.257434 0.120832 +0.599674 0.257434 0.120832 +0.608079 0.257434 0.120832 +0.616166 0.257434 0.120832 +0.000001 0.285092 0.120832 +0.037293 0.285092 0.120832 +0.079714 0.285092 0.120832 +0.120832 0.285092 0.120832 +0.159284 0.285092 0.120832 +0.194868 0.285092 0.120832 +0.227530 0.285092 0.120832 +0.257434 0.285092 0.120832 +0.285092 0.285092 0.120832 +0.310738 0.285092 0.120832 +0.334585 0.285092 0.120832 +0.356818 0.285092 0.120832 +0.377602 0.285092 0.120832 +0.397079 0.285092 0.120832 +0.415373 0.285092 0.120832 +0.432594 0.285092 0.120832 +0.448839 0.285092 0.120832 +0.464192 0.285092 0.120832 +0.478729 0.285092 0.120832 +0.492515 0.285092 0.120832 +0.505612 0.285092 0.120832 +0.518072 0.285092 0.120832 +0.529943 0.285092 0.120832 +0.541266 0.285092 0.120832 +0.552083 0.285092 0.120832 +0.562427 0.285092 0.120832 +0.572331 0.285092 0.120832 +0.581823 0.285092 0.120832 +0.590929 0.285092 0.120832 +0.599674 0.285092 0.120832 +0.608079 0.285092 0.120832 +0.616166 0.285092 0.120832 +0.000001 0.310738 0.120832 +0.037293 0.310738 0.120832 +0.079714 0.310738 0.120832 +0.120832 0.310738 0.120832 +0.159284 0.310738 0.120832 +0.194868 0.310738 0.120832 +0.227530 0.310738 0.120832 +0.257434 0.310738 0.120832 +0.285092 0.310738 0.120832 +0.310738 0.310738 0.120832 +0.334585 0.310738 0.120832 +0.356818 0.310738 0.120832 +0.377602 0.310738 0.120832 +0.397079 0.310738 0.120832 +0.415373 0.310738 0.120832 +0.432594 0.310738 0.120832 +0.448839 0.310738 0.120832 +0.464192 0.310738 0.120832 +0.478729 0.310738 0.120832 +0.492515 0.310738 0.120832 +0.505612 0.310738 0.120832 +0.518072 0.310738 0.120832 +0.529943 0.310738 0.120832 +0.541266 0.310738 0.120832 +0.552083 0.310738 0.120832 +0.562427 0.310738 0.120832 +0.572331 0.310738 0.120832 +0.581823 0.310738 0.120832 +0.590929 0.310738 0.120832 +0.599674 0.310738 0.120832 +0.608079 0.310738 0.120832 +0.616166 0.310738 0.120832 +0.000001 0.334585 0.120832 +0.037293 0.334585 0.120832 +0.079714 0.334585 0.120832 +0.120832 0.334585 0.120832 +0.159284 0.334585 0.120832 +0.194868 0.334585 0.120832 +0.227530 0.334585 0.120832 +0.257434 0.334585 0.120832 +0.285092 0.334585 0.120832 +0.310738 0.334585 0.120832 +0.334585 0.334585 0.120832 +0.356818 0.334585 0.120832 +0.377602 0.334585 0.120832 +0.397079 0.334585 0.120832 +0.415373 0.334585 0.120832 +0.432594 0.334585 0.120832 +0.448839 0.334585 0.120832 +0.464192 0.334585 0.120832 +0.478729 0.334585 0.120832 +0.492515 0.334585 0.120832 +0.505612 0.334585 0.120832 +0.518072 0.334585 0.120832 +0.529943 0.334585 0.120832 +0.541266 0.334585 0.120832 +0.552083 0.334585 0.120832 +0.562427 0.334585 0.120832 +0.572331 0.334585 0.120832 +0.581823 0.334585 0.120832 +0.590929 0.334585 0.120832 +0.599674 0.334585 0.120832 +0.608079 0.334585 0.120832 +0.616166 0.334585 0.120832 +0.000001 0.356818 0.120832 +0.037293 0.356818 0.120832 +0.079714 0.356818 0.120832 +0.120832 0.356818 0.120832 +0.159284 0.356818 0.120832 +0.194868 0.356818 0.120832 +0.227530 0.356818 0.120832 +0.257434 0.356818 0.120832 +0.285092 0.356818 0.120832 +0.310738 0.356818 0.120832 +0.334585 0.356818 0.120832 +0.356818 0.356818 0.120832 +0.377602 0.356818 0.120832 +0.397079 0.356818 0.120832 +0.415373 0.356818 0.120832 +0.432594 0.356818 0.120832 +0.448839 0.356818 0.120832 +0.464192 0.356818 0.120832 +0.478729 0.356818 0.120832 +0.492515 0.356818 0.120832 +0.505612 0.356818 0.120832 +0.518072 0.356818 0.120832 +0.529943 0.356818 0.120832 +0.541266 0.356818 0.120832 +0.552083 0.356818 0.120832 +0.562427 0.356818 0.120832 +0.572331 0.356818 0.120832 +0.581823 0.356818 0.120832 +0.590929 0.356818 0.120832 +0.599674 0.356818 0.120832 +0.608079 0.356818 0.120832 +0.616166 0.356818 0.120832 +0.000001 0.377602 0.120832 +0.037293 0.377602 0.120832 +0.079714 0.377602 0.120832 +0.120832 0.377602 0.120832 +0.159284 0.377602 0.120832 +0.194868 0.377602 0.120832 +0.227530 0.377602 0.120832 +0.257434 0.377602 0.120832 +0.285092 0.377602 0.120832 +0.310738 0.377602 0.120832 +0.334585 0.377602 0.120832 +0.356818 0.377602 0.120832 +0.377602 0.377602 0.120832 +0.397079 0.377602 0.120832 +0.415373 0.377602 0.120832 +0.432594 0.377602 0.120832 +0.448839 0.377602 0.120832 +0.464192 0.377602 0.120832 +0.478729 0.377602 0.120832 +0.492515 0.377602 0.120832 +0.505612 0.377602 0.120832 +0.518072 0.377602 0.120832 +0.529943 0.377602 0.120832 +0.541266 0.377602 0.120832 +0.552083 0.377602 0.120832 +0.562427 0.377602 0.120832 +0.572331 0.377602 0.120832 +0.581823 0.377602 0.120832 +0.590929 0.377602 0.120832 +0.599674 0.377602 0.120832 +0.608079 0.377602 0.120832 +0.616166 0.377602 0.120832 +0.000001 0.397079 0.120832 +0.037293 0.397079 0.120832 +0.079714 0.397079 0.120832 +0.120832 0.397079 0.120832 +0.159284 0.397079 0.120832 +0.194868 0.397079 0.120832 +0.227530 0.397079 0.120832 +0.257434 0.397079 0.120832 +0.285092 0.397079 0.120832 +0.310738 0.397079 0.120832 +0.334585 0.397079 0.120832 +0.356818 0.397079 0.120832 +0.377602 0.397079 0.120832 +0.397079 0.397079 0.120832 +0.415373 0.397079 0.120832 +0.432594 0.397079 0.120832 +0.448839 0.397079 0.120832 +0.464192 0.397079 0.120832 +0.478729 0.397079 0.120832 +0.492515 0.397079 0.120832 +0.505612 0.397079 0.120832 +0.518072 0.397079 0.120832 +0.529943 0.397079 0.120832 +0.541266 0.397079 0.120832 +0.552083 0.397079 0.120832 +0.562427 0.397079 0.120832 +0.572331 0.397079 0.120832 +0.581823 0.397079 0.120832 +0.590929 0.397079 0.120832 +0.599674 0.397079 0.120832 +0.608079 0.397079 0.120832 +0.616166 0.397079 0.120832 +0.000001 0.415373 0.120832 +0.037293 0.415373 0.120832 +0.079714 0.415373 0.120832 +0.120832 0.415373 0.120832 +0.159284 0.415373 0.120832 +0.194868 0.415373 0.120832 +0.227530 0.415373 0.120832 +0.257434 0.415373 0.120832 +0.285092 0.415373 0.120832 +0.310738 0.415373 0.120832 +0.334585 0.415373 0.120832 +0.356818 0.415373 0.120832 +0.377602 0.415373 0.120832 +0.397079 0.415373 0.120832 +0.415373 0.415373 0.120832 +0.432594 0.415373 0.120832 +0.448839 0.415373 0.120832 +0.464192 0.415373 0.120832 +0.478729 0.415373 0.120832 +0.492515 0.415373 0.120832 +0.505612 0.415373 0.120832 +0.518072 0.415373 0.120832 +0.529943 0.415373 0.120832 +0.541266 0.415373 0.120832 +0.552083 0.415373 0.120832 +0.562427 0.415373 0.120832 +0.572331 0.415373 0.120832 +0.581823 0.415373 0.120832 +0.590929 0.415373 0.120832 +0.599674 0.415373 0.120832 +0.608079 0.415373 0.120832 +0.616166 0.415373 0.120832 +0.000001 0.432594 0.120832 +0.037293 0.432594 0.120832 +0.079714 0.432594 0.120832 +0.120832 0.432594 0.120832 +0.159284 0.432594 0.120832 +0.194868 0.432594 0.120832 +0.227530 0.432594 0.120832 +0.257434 0.432594 0.120832 +0.285092 0.432594 0.120832 +0.310738 0.432594 0.120832 +0.334585 0.432594 0.120832 +0.356818 0.432594 0.120832 +0.377602 0.432594 0.120832 +0.397079 0.432594 0.120832 +0.415373 0.432594 0.120832 +0.432594 0.432594 0.120832 +0.448839 0.432594 0.120832 +0.464192 0.432594 0.120832 +0.478729 0.432594 0.120832 +0.492515 0.432594 0.120832 +0.505612 0.432594 0.120832 +0.518072 0.432594 0.120832 +0.529943 0.432594 0.120832 +0.541266 0.432594 0.120832 +0.552083 0.432594 0.120832 +0.562427 0.432594 0.120832 +0.572331 0.432594 0.120832 +0.581823 0.432594 0.120832 +0.590929 0.432594 0.120832 +0.599674 0.432594 0.120832 +0.608079 0.432594 0.120832 +0.616166 0.432594 0.120832 +0.000001 0.448839 0.120832 +0.037293 0.448839 0.120832 +0.079714 0.448839 0.120832 +0.120832 0.448839 0.120832 +0.159284 0.448839 0.120832 +0.194868 0.448839 0.120832 +0.227530 0.448839 0.120832 +0.257434 0.448839 0.120832 +0.285092 0.448839 0.120832 +0.310738 0.448839 0.120832 +0.334585 0.448839 0.120832 +0.356818 0.448839 0.120832 +0.377602 0.448839 0.120832 +0.397079 0.448839 0.120832 +0.415373 0.448839 0.120832 +0.432594 0.448839 0.120832 +0.448839 0.448839 0.120832 +0.464192 0.448839 0.120832 +0.478729 0.448839 0.120832 +0.492515 0.448839 0.120832 +0.505612 0.448839 0.120832 +0.518072 0.448839 0.120832 +0.529943 0.448839 0.120832 +0.541266 0.448839 0.120832 +0.552083 0.448839 0.120832 +0.562427 0.448839 0.120832 +0.572331 0.448839 0.120832 +0.581823 0.448839 0.120832 +0.590929 0.448839 0.120832 +0.599674 0.448839 0.120832 +0.608079 0.448839 0.120832 +0.616166 0.448839 0.120832 +0.000001 0.464192 0.120832 +0.037293 0.464192 0.120832 +0.079714 0.464192 0.120832 +0.120832 0.464192 0.120832 +0.159284 0.464192 0.120832 +0.194868 0.464192 0.120832 +0.227530 0.464192 0.120832 +0.257434 0.464192 0.120832 +0.285092 0.464192 0.120832 +0.310738 0.464192 0.120832 +0.334585 0.464192 0.120832 +0.356818 0.464192 0.120832 +0.377602 0.464192 0.120832 +0.397079 0.464192 0.120832 +0.415373 0.464192 0.120832 +0.432594 0.464192 0.120832 +0.448839 0.464192 0.120832 +0.464192 0.464192 0.120832 +0.478729 0.464192 0.120832 +0.492515 0.464192 0.120832 +0.505612 0.464192 0.120832 +0.518072 0.464192 0.120832 +0.529943 0.464192 0.120832 +0.541266 0.464192 0.120832 +0.552083 0.464192 0.120832 +0.562427 0.464192 0.120832 +0.572331 0.464192 0.120832 +0.581823 0.464192 0.120832 +0.590929 0.464192 0.120832 +0.599674 0.464192 0.120832 +0.608079 0.464192 0.120832 +0.616166 0.464192 0.120832 +0.000001 0.478729 0.120832 +0.037293 0.478729 0.120832 +0.079714 0.478729 0.120832 +0.120832 0.478729 0.120832 +0.159284 0.478729 0.120832 +0.194868 0.478729 0.120832 +0.227530 0.478729 0.120832 +0.257434 0.478729 0.120832 +0.285092 0.478729 0.120832 +0.310738 0.478729 0.120832 +0.334585 0.478729 0.120832 +0.356818 0.478729 0.120832 +0.377602 0.478729 0.120832 +0.397079 0.478729 0.120832 +0.415373 0.478729 0.120832 +0.432594 0.478729 0.120832 +0.448839 0.478729 0.120832 +0.464192 0.478729 0.120832 +0.478729 0.478729 0.120832 +0.492515 0.478729 0.120832 +0.505612 0.478729 0.120832 +0.518072 0.478729 0.120832 +0.529943 0.478729 0.120832 +0.541266 0.478729 0.120832 +0.552083 0.478729 0.120832 +0.562427 0.478729 0.120832 +0.572331 0.478729 0.120832 +0.581823 0.478729 0.120832 +0.590929 0.478729 0.120832 +0.599674 0.478729 0.120832 +0.608079 0.478729 0.120832 +0.616166 0.478729 0.120832 +0.000001 0.492515 0.120832 +0.037293 0.492515 0.120832 +0.079714 0.492515 0.120832 +0.120832 0.492515 0.120832 +0.159284 0.492515 0.120832 +0.194868 0.492515 0.120832 +0.227530 0.492515 0.120832 +0.257434 0.492515 0.120832 +0.285092 0.492515 0.120832 +0.310738 0.492515 0.120832 +0.334585 0.492515 0.120832 +0.356818 0.492515 0.120832 +0.377602 0.492515 0.120832 +0.397079 0.492515 0.120832 +0.415373 0.492515 0.120832 +0.432594 0.492515 0.120832 +0.448839 0.492515 0.120832 +0.464192 0.492515 0.120832 +0.478729 0.492515 0.120832 +0.492515 0.492515 0.120832 +0.505612 0.492515 0.120832 +0.518072 0.492515 0.120832 +0.529943 0.492515 0.120832 +0.541266 0.492515 0.120832 +0.552083 0.492515 0.120832 +0.562427 0.492515 0.120832 +0.572331 0.492515 0.120832 +0.581823 0.492515 0.120832 +0.590929 0.492515 0.120832 +0.599674 0.492515 0.120832 +0.608079 0.492515 0.120832 +0.616166 0.492515 0.120832 +0.000001 0.505612 0.120832 +0.037293 0.505612 0.120832 +0.079714 0.505612 0.120832 +0.120832 0.505612 0.120832 +0.159284 0.505612 0.120832 +0.194868 0.505612 0.120832 +0.227530 0.505612 0.120832 +0.257434 0.505612 0.120832 +0.285092 0.505612 0.120832 +0.310738 0.505612 0.120832 +0.334585 0.505612 0.120832 +0.356818 0.505612 0.120832 +0.377602 0.505612 0.120832 +0.397079 0.505612 0.120832 +0.415373 0.505612 0.120832 +0.432594 0.505612 0.120832 +0.448839 0.505612 0.120832 +0.464192 0.505612 0.120832 +0.478729 0.505612 0.120832 +0.492515 0.505612 0.120832 +0.505612 0.505612 0.120832 +0.518072 0.505612 0.120832 +0.529943 0.505612 0.120832 +0.541266 0.505612 0.120832 +0.552083 0.505612 0.120832 +0.562427 0.505612 0.120832 +0.572331 0.505612 0.120832 +0.581823 0.505612 0.120832 +0.590929 0.505612 0.120832 +0.599674 0.505612 0.120832 +0.608079 0.505612 0.120832 +0.616166 0.505612 0.120832 +0.000001 0.518072 0.120832 +0.037293 0.518072 0.120832 +0.079714 0.518072 0.120832 +0.120832 0.518072 0.120832 +0.159284 0.518072 0.120832 +0.194868 0.518072 0.120832 +0.227530 0.518072 0.120832 +0.257434 0.518072 0.120832 +0.285092 0.518072 0.120832 +0.310738 0.518072 0.120832 +0.334585 0.518072 0.120832 +0.356818 0.518072 0.120832 +0.377602 0.518072 0.120832 +0.397079 0.518072 0.120832 +0.415373 0.518072 0.120832 +0.432594 0.518072 0.120832 +0.448839 0.518072 0.120832 +0.464192 0.518072 0.120832 +0.478729 0.518072 0.120832 +0.492515 0.518072 0.120832 +0.505612 0.518072 0.120832 +0.518072 0.518072 0.120832 +0.529943 0.518072 0.120832 +0.541266 0.518072 0.120832 +0.552083 0.518072 0.120832 +0.562427 0.518072 0.120832 +0.572331 0.518072 0.120832 +0.581823 0.518072 0.120832 +0.590929 0.518072 0.120832 +0.599674 0.518072 0.120832 +0.608079 0.518072 0.120832 +0.616166 0.518072 0.120832 +0.000001 0.529943 0.120832 +0.037293 0.529943 0.120832 +0.079714 0.529943 0.120832 +0.120832 0.529943 0.120832 +0.159284 0.529943 0.120832 +0.194868 0.529943 0.120832 +0.227530 0.529943 0.120832 +0.257434 0.529943 0.120832 +0.285092 0.529943 0.120832 +0.310738 0.529943 0.120832 +0.334585 0.529943 0.120832 +0.356818 0.529943 0.120832 +0.377602 0.529943 0.120832 +0.397079 0.529943 0.120832 +0.415373 0.529943 0.120832 +0.432594 0.529943 0.120832 +0.448839 0.529943 0.120832 +0.464192 0.529943 0.120832 +0.478729 0.529943 0.120832 +0.492515 0.529943 0.120832 +0.505612 0.529943 0.120832 +0.518072 0.529943 0.120832 +0.529943 0.529943 0.120832 +0.541266 0.529943 0.120832 +0.552083 0.529943 0.120832 +0.562427 0.529943 0.120832 +0.572331 0.529943 0.120832 +0.581823 0.529943 0.120832 +0.590929 0.529943 0.120832 +0.599674 0.529943 0.120832 +0.608079 0.529943 0.120832 +0.616166 0.529943 0.120832 +0.000001 0.541266 0.120832 +0.037293 0.541266 0.120832 +0.079714 0.541266 0.120832 +0.120832 0.541266 0.120832 +0.159284 0.541266 0.120832 +0.194868 0.541266 0.120832 +0.227530 0.541266 0.120832 +0.257434 0.541266 0.120832 +0.285092 0.541266 0.120832 +0.310738 0.541266 0.120832 +0.334585 0.541266 0.120832 +0.356818 0.541266 0.120832 +0.377602 0.541266 0.120832 +0.397079 0.541266 0.120832 +0.415373 0.541266 0.120832 +0.432594 0.541266 0.120832 +0.448839 0.541266 0.120832 +0.464192 0.541266 0.120832 +0.478729 0.541266 0.120832 +0.492515 0.541266 0.120832 +0.505612 0.541266 0.120832 +0.518072 0.541266 0.120832 +0.529943 0.541266 0.120832 +0.541266 0.541266 0.120832 +0.552083 0.541266 0.120832 +0.562427 0.541266 0.120832 +0.572331 0.541266 0.120832 +0.581823 0.541266 0.120832 +0.590929 0.541266 0.120832 +0.599674 0.541266 0.120832 +0.608079 0.541266 0.120832 +0.616166 0.541266 0.120832 +0.000001 0.552083 0.120832 +0.037293 0.552083 0.120832 +0.079714 0.552083 0.120832 +0.120832 0.552083 0.120832 +0.159284 0.552083 0.120832 +0.194868 0.552083 0.120832 +0.227530 0.552083 0.120832 +0.257434 0.552083 0.120832 +0.285092 0.552083 0.120832 +0.310738 0.552083 0.120832 +0.334585 0.552083 0.120832 +0.356818 0.552083 0.120832 +0.377602 0.552083 0.120832 +0.397079 0.552083 0.120832 +0.415373 0.552083 0.120832 +0.432594 0.552083 0.120832 +0.448839 0.552083 0.120832 +0.464192 0.552083 0.120832 +0.478729 0.552083 0.120832 +0.492515 0.552083 0.120832 +0.505612 0.552083 0.120832 +0.518072 0.552083 0.120832 +0.529943 0.552083 0.120832 +0.541266 0.552083 0.120832 +0.552083 0.552083 0.120832 +0.562427 0.552083 0.120832 +0.572331 0.552083 0.120832 +0.581823 0.552083 0.120832 +0.590929 0.552083 0.120832 +0.599674 0.552083 0.120832 +0.608079 0.552083 0.120832 +0.616166 0.552083 0.120832 +0.000001 0.562427 0.120832 +0.037293 0.562427 0.120832 +0.079714 0.562427 0.120832 +0.120832 0.562427 0.120832 +0.159284 0.562427 0.120832 +0.194868 0.562427 0.120832 +0.227530 0.562427 0.120832 +0.257434 0.562427 0.120832 +0.285092 0.562427 0.120832 +0.310738 0.562427 0.120832 +0.334585 0.562427 0.120832 +0.356818 0.562427 0.120832 +0.377602 0.562427 0.120832 +0.397079 0.562427 0.120832 +0.415373 0.562427 0.120832 +0.432594 0.562427 0.120832 +0.448839 0.562427 0.120832 +0.464192 0.562427 0.120832 +0.478729 0.562427 0.120832 +0.492515 0.562427 0.120832 +0.505612 0.562427 0.120832 +0.518072 0.562427 0.120832 +0.529943 0.562427 0.120832 +0.541266 0.562427 0.120832 +0.552083 0.562427 0.120832 +0.562427 0.562427 0.120832 +0.572331 0.562427 0.120832 +0.581823 0.562427 0.120832 +0.590929 0.562427 0.120832 +0.599674 0.562427 0.120832 +0.608079 0.562427 0.120832 +0.616166 0.562427 0.120832 +0.000001 0.572331 0.120832 +0.037293 0.572331 0.120832 +0.079714 0.572331 0.120832 +0.120832 0.572331 0.120832 +0.159284 0.572331 0.120832 +0.194868 0.572331 0.120832 +0.227530 0.572331 0.120832 +0.257434 0.572331 0.120832 +0.285092 0.572331 0.120832 +0.310738 0.572331 0.120832 +0.334585 0.572331 0.120832 +0.356818 0.572331 0.120832 +0.377602 0.572331 0.120832 +0.397079 0.572331 0.120832 +0.415373 0.572331 0.120832 +0.432594 0.572331 0.120832 +0.448839 0.572331 0.120832 +0.464192 0.572331 0.120832 +0.478729 0.572331 0.120832 +0.492515 0.572331 0.120832 +0.505612 0.572331 0.120832 +0.518072 0.572331 0.120832 +0.529943 0.572331 0.120832 +0.541266 0.572331 0.120832 +0.552083 0.572331 0.120832 +0.562427 0.572331 0.120832 +0.572331 0.572331 0.120832 +0.581823 0.572331 0.120832 +0.590929 0.572331 0.120832 +0.599674 0.572331 0.120832 +0.608079 0.572331 0.120832 +0.616166 0.572331 0.120832 +0.000001 0.581823 0.120832 +0.037293 0.581823 0.120832 +0.079714 0.581823 0.120832 +0.120832 0.581823 0.120832 +0.159284 0.581823 0.120832 +0.194868 0.581823 0.120832 +0.227530 0.581823 0.120832 +0.257434 0.581823 0.120832 +0.285092 0.581823 0.120832 +0.310738 0.581823 0.120832 +0.334585 0.581823 0.120832 +0.356818 0.581823 0.120832 +0.377602 0.581823 0.120832 +0.397079 0.581823 0.120832 +0.415373 0.581823 0.120832 +0.432594 0.581823 0.120832 +0.448839 0.581823 0.120832 +0.464192 0.581823 0.120832 +0.478729 0.581823 0.120832 +0.492515 0.581823 0.120832 +0.505612 0.581823 0.120832 +0.518072 0.581823 0.120832 +0.529943 0.581823 0.120832 +0.541266 0.581823 0.120832 +0.552083 0.581823 0.120832 +0.562427 0.581823 0.120832 +0.572331 0.581823 0.120832 +0.581823 0.581823 0.120832 +0.590929 0.581823 0.120832 +0.599674 0.581823 0.120832 +0.608079 0.581823 0.120832 +0.616166 0.581823 0.120832 +0.000001 0.590929 0.120832 +0.037293 0.590929 0.120832 +0.079714 0.590929 0.120832 +0.120832 0.590929 0.120832 +0.159284 0.590929 0.120832 +0.194868 0.590929 0.120832 +0.227530 0.590929 0.120832 +0.257434 0.590929 0.120832 +0.285092 0.590929 0.120832 +0.310738 0.590929 0.120832 +0.334585 0.590929 0.120832 +0.356818 0.590929 0.120832 +0.377602 0.590929 0.120832 +0.397079 0.590929 0.120832 +0.415373 0.590929 0.120832 +0.432594 0.590929 0.120832 +0.448839 0.590929 0.120832 +0.464192 0.590929 0.120832 +0.478729 0.590929 0.120832 +0.492515 0.590929 0.120832 +0.505612 0.590929 0.120832 +0.518072 0.590929 0.120832 +0.529943 0.590929 0.120832 +0.541266 0.590929 0.120832 +0.552083 0.590929 0.120832 +0.562427 0.590929 0.120832 +0.572331 0.590929 0.120832 +0.581823 0.590929 0.120832 +0.590929 0.590929 0.120832 +0.599674 0.590929 0.120832 +0.608079 0.590929 0.120832 +0.616166 0.590929 0.120832 +0.000001 0.599674 0.120832 +0.037293 0.599674 0.120832 +0.079714 0.599674 0.120832 +0.120832 0.599674 0.120832 +0.159284 0.599674 0.120832 +0.194868 0.599674 0.120832 +0.227530 0.599674 0.120832 +0.257434 0.599674 0.120832 +0.285092 0.599674 0.120832 +0.310738 0.599674 0.120832 +0.334585 0.599674 0.120832 +0.356818 0.599674 0.120832 +0.377602 0.599674 0.120832 +0.397079 0.599674 0.120832 +0.415373 0.599674 0.120832 +0.432594 0.599674 0.120832 +0.448839 0.599674 0.120832 +0.464192 0.599674 0.120832 +0.478729 0.599674 0.120832 +0.492515 0.599674 0.120832 +0.505612 0.599674 0.120832 +0.518072 0.599674 0.120832 +0.529943 0.599674 0.120832 +0.541266 0.599674 0.120832 +0.552083 0.599674 0.120832 +0.562427 0.599674 0.120832 +0.572331 0.599674 0.120832 +0.581823 0.599674 0.120832 +0.590929 0.599674 0.120832 +0.599674 0.599674 0.120832 +0.608079 0.599674 0.120832 +0.616166 0.599674 0.120832 +0.000001 0.608079 0.120832 +0.037293 0.608079 0.120832 +0.079714 0.608079 0.120832 +0.120832 0.608079 0.120832 +0.159284 0.608079 0.120832 +0.194868 0.608079 0.120832 +0.227530 0.608079 0.120832 +0.257434 0.608079 0.120832 +0.285092 0.608079 0.120832 +0.310738 0.608079 0.120832 +0.334585 0.608079 0.120832 +0.356818 0.608079 0.120832 +0.377602 0.608079 0.120832 +0.397079 0.608079 0.120832 +0.415373 0.608079 0.120832 +0.432594 0.608079 0.120832 +0.448839 0.608079 0.120832 +0.464192 0.608079 0.120832 +0.478729 0.608079 0.120832 +0.492515 0.608079 0.120832 +0.505612 0.608079 0.120832 +0.518072 0.608079 0.120832 +0.529943 0.608079 0.120832 +0.541266 0.608079 0.120832 +0.552083 0.608079 0.120832 +0.562427 0.608079 0.120832 +0.572331 0.608079 0.120832 +0.581823 0.608079 0.120832 +0.590929 0.608079 0.120832 +0.599674 0.608079 0.120832 +0.608079 0.608079 0.120832 +0.616166 0.608079 0.120832 +0.000001 0.616166 0.120832 +0.037293 0.616166 0.120832 +0.079714 0.616166 0.120832 +0.120832 0.616166 0.120832 +0.159284 0.616166 0.120832 +0.194868 0.616166 0.120832 +0.227530 0.616166 0.120832 +0.257434 0.616166 0.120832 +0.285092 0.616166 0.120832 +0.310738 0.616166 0.120832 +0.334585 0.616166 0.120832 +0.356818 0.616166 0.120832 +0.377602 0.616166 0.120832 +0.397079 0.616166 0.120832 +0.415373 0.616166 0.120832 +0.432594 0.616166 0.120832 +0.448839 0.616166 0.120832 +0.464192 0.616166 0.120832 +0.478729 0.616166 0.120832 +0.492515 0.616166 0.120832 +0.505612 0.616166 0.120832 +0.518072 0.616166 0.120832 +0.529943 0.616166 0.120832 +0.541266 0.616166 0.120832 +0.552083 0.616166 0.120832 +0.562427 0.616166 0.120832 +0.572331 0.616166 0.120832 +0.581823 0.616166 0.120832 +0.590929 0.616166 0.120832 +0.599674 0.616166 0.120832 +0.608079 0.616166 0.120832 +0.616166 0.616166 0.120832 +0.000001 0.000001 0.159284 +0.037293 0.000001 0.159284 +0.079714 0.000001 0.159284 +0.120832 0.000001 0.159284 +0.159284 0.000001 0.159284 +0.194868 0.000001 0.159284 +0.227530 0.000001 0.159284 +0.257434 0.000001 0.159284 +0.285092 0.000001 0.159284 +0.310738 0.000001 0.159284 +0.334585 0.000001 0.159284 +0.356818 0.000001 0.159284 +0.377602 0.000001 0.159284 +0.397079 0.000001 0.159284 +0.415373 0.000001 0.159284 +0.432594 0.000001 0.159284 +0.448839 0.000001 0.159284 +0.464192 0.000001 0.159284 +0.478729 0.000001 0.159284 +0.492515 0.000001 0.159284 +0.505612 0.000001 0.159284 +0.518072 0.000001 0.159284 +0.529943 0.000001 0.159284 +0.541266 0.000001 0.159284 +0.552083 0.000001 0.159284 +0.562427 0.000001 0.159284 +0.572331 0.000001 0.159284 +0.581823 0.000001 0.159284 +0.590929 0.000001 0.159284 +0.599674 0.000001 0.159284 +0.608079 0.000001 0.159284 +0.616166 0.000001 0.159284 +0.000001 0.037293 0.159284 +0.037293 0.037293 0.159284 +0.079714 0.037293 0.159284 +0.120832 0.037293 0.159284 +0.159284 0.037293 0.159284 +0.194868 0.037293 0.159284 +0.227530 0.037293 0.159284 +0.257434 0.037293 0.159284 +0.285092 0.037293 0.159284 +0.310738 0.037293 0.159284 +0.334585 0.037293 0.159284 +0.356818 0.037293 0.159284 +0.377602 0.037293 0.159284 +0.397079 0.037293 0.159284 +0.415373 0.037293 0.159284 +0.432594 0.037293 0.159284 +0.448839 0.037293 0.159284 +0.464192 0.037293 0.159284 +0.478729 0.037293 0.159284 +0.492515 0.037293 0.159284 +0.505612 0.037293 0.159284 +0.518072 0.037293 0.159284 +0.529943 0.037293 0.159284 +0.541266 0.037293 0.159284 +0.552083 0.037293 0.159284 +0.562427 0.037293 0.159284 +0.572331 0.037293 0.159284 +0.581823 0.037293 0.159284 +0.590929 0.037293 0.159284 +0.599674 0.037293 0.159284 +0.608079 0.037293 0.159284 +0.616166 0.037293 0.159284 +0.000001 0.079714 0.159284 +0.037293 0.079714 0.159284 +0.079714 0.079714 0.159284 +0.120832 0.079714 0.159284 +0.159284 0.079714 0.159284 +0.194868 0.079714 0.159284 +0.227530 0.079714 0.159284 +0.257434 0.079714 0.159284 +0.285092 0.079714 0.159284 +0.310738 0.079714 0.159284 +0.334585 0.079714 0.159284 +0.356818 0.079714 0.159284 +0.377602 0.079714 0.159284 +0.397079 0.079714 0.159284 +0.415373 0.079714 0.159284 +0.432594 0.079714 0.159284 +0.448839 0.079714 0.159284 +0.464192 0.079714 0.159284 +0.478729 0.079714 0.159284 +0.492515 0.079714 0.159284 +0.505612 0.079714 0.159284 +0.518072 0.079714 0.159284 +0.529943 0.079714 0.159284 +0.541266 0.079714 0.159284 +0.552083 0.079714 0.159284 +0.562427 0.079714 0.159284 +0.572331 0.079714 0.159284 +0.581823 0.079714 0.159284 +0.590929 0.079714 0.159284 +0.599674 0.079714 0.159284 +0.608079 0.079714 0.159284 +0.616166 0.079714 0.159284 +0.000001 0.120832 0.159284 +0.037293 0.120832 0.159284 +0.079714 0.120832 0.159284 +0.120832 0.120832 0.159284 +0.159284 0.120832 0.159284 +0.194868 0.120832 0.159284 +0.227530 0.120832 0.159284 +0.257434 0.120832 0.159284 +0.285092 0.120832 0.159284 +0.310738 0.120832 0.159284 +0.334585 0.120832 0.159284 +0.356818 0.120832 0.159284 +0.377602 0.120832 0.159284 +0.397079 0.120832 0.159284 +0.415373 0.120832 0.159284 +0.432594 0.120832 0.159284 +0.448839 0.120832 0.159284 +0.464192 0.120832 0.159284 +0.478729 0.120832 0.159284 +0.492515 0.120832 0.159284 +0.505612 0.120832 0.159284 +0.518072 0.120832 0.159284 +0.529943 0.120832 0.159284 +0.541266 0.120832 0.159284 +0.552083 0.120832 0.159284 +0.562427 0.120832 0.159284 +0.572331 0.120832 0.159284 +0.581823 0.120832 0.159284 +0.590929 0.120832 0.159284 +0.599674 0.120832 0.159284 +0.608079 0.120832 0.159284 +0.616166 0.120832 0.159284 +0.000001 0.159284 0.159284 +0.037293 0.159284 0.159284 +0.079714 0.159284 0.159284 +0.120832 0.159284 0.159284 +0.159284 0.159284 0.159284 +0.194868 0.159284 0.159284 +0.227530 0.159284 0.159284 +0.257434 0.159284 0.159284 +0.285092 0.159284 0.159284 +0.310738 0.159284 0.159284 +0.334585 0.159284 0.159284 +0.356818 0.159284 0.159284 +0.377602 0.159284 0.159284 +0.397079 0.159284 0.159284 +0.415373 0.159284 0.159284 +0.432594 0.159284 0.159284 +0.448839 0.159284 0.159284 +0.464192 0.159284 0.159284 +0.478729 0.159284 0.159284 +0.492515 0.159284 0.159284 +0.505612 0.159284 0.159284 +0.518072 0.159284 0.159284 +0.529943 0.159284 0.159284 +0.541266 0.159284 0.159284 +0.552083 0.159284 0.159284 +0.562427 0.159284 0.159284 +0.572331 0.159284 0.159284 +0.581823 0.159284 0.159284 +0.590929 0.159284 0.159284 +0.599674 0.159284 0.159284 +0.608079 0.159284 0.159284 +0.616166 0.159284 0.159284 +0.000001 0.194868 0.159284 +0.037293 0.194868 0.159284 +0.079714 0.194868 0.159284 +0.120832 0.194868 0.159284 +0.159284 0.194868 0.159284 +0.194868 0.194868 0.159284 +0.227530 0.194868 0.159284 +0.257434 0.194868 0.159284 +0.285092 0.194868 0.159284 +0.310738 0.194868 0.159284 +0.334585 0.194868 0.159284 +0.356818 0.194868 0.159284 +0.377602 0.194868 0.159284 +0.397079 0.194868 0.159284 +0.415373 0.194868 0.159284 +0.432594 0.194868 0.159284 +0.448839 0.194868 0.159284 +0.464192 0.194868 0.159284 +0.478729 0.194868 0.159284 +0.492515 0.194868 0.159284 +0.505612 0.194868 0.159284 +0.518072 0.194868 0.159284 +0.529943 0.194868 0.159284 +0.541266 0.194868 0.159284 +0.552083 0.194868 0.159284 +0.562427 0.194868 0.159284 +0.572331 0.194868 0.159284 +0.581823 0.194868 0.159284 +0.590929 0.194868 0.159284 +0.599674 0.194868 0.159284 +0.608079 0.194868 0.159284 +0.616166 0.194868 0.159284 +0.000001 0.227530 0.159284 +0.037293 0.227530 0.159284 +0.079714 0.227530 0.159284 +0.120832 0.227530 0.159284 +0.159284 0.227530 0.159284 +0.194868 0.227530 0.159284 +0.227530 0.227530 0.159284 +0.257434 0.227530 0.159284 +0.285092 0.227530 0.159284 +0.310738 0.227530 0.159284 +0.334585 0.227530 0.159284 +0.356818 0.227530 0.159284 +0.377602 0.227530 0.159284 +0.397079 0.227530 0.159284 +0.415373 0.227530 0.159284 +0.432594 0.227530 0.159284 +0.448839 0.227530 0.159284 +0.464192 0.227530 0.159284 +0.478729 0.227530 0.159284 +0.492515 0.227530 0.159284 +0.505612 0.227530 0.159284 +0.518072 0.227530 0.159284 +0.529943 0.227530 0.159284 +0.541266 0.227530 0.159284 +0.552083 0.227530 0.159284 +0.562427 0.227530 0.159284 +0.572331 0.227530 0.159284 +0.581823 0.227530 0.159284 +0.590929 0.227530 0.159284 +0.599674 0.227530 0.159284 +0.608079 0.227530 0.159284 +0.616166 0.227530 0.159284 +0.000001 0.257434 0.159284 +0.037293 0.257434 0.159284 +0.079714 0.257434 0.159284 +0.120832 0.257434 0.159284 +0.159284 0.257434 0.159284 +0.194868 0.257434 0.159284 +0.227530 0.257434 0.159284 +0.257434 0.257434 0.159284 +0.285092 0.257434 0.159284 +0.310738 0.257434 0.159284 +0.334585 0.257434 0.159284 +0.356818 0.257434 0.159284 +0.377602 0.257434 0.159284 +0.397079 0.257434 0.159284 +0.415373 0.257434 0.159284 +0.432594 0.257434 0.159284 +0.448839 0.257434 0.159284 +0.464192 0.257434 0.159284 +0.478729 0.257434 0.159284 +0.492515 0.257434 0.159284 +0.505612 0.257434 0.159284 +0.518072 0.257434 0.159284 +0.529943 0.257434 0.159284 +0.541266 0.257434 0.159284 +0.552083 0.257434 0.159284 +0.562427 0.257434 0.159284 +0.572331 0.257434 0.159284 +0.581823 0.257434 0.159284 +0.590929 0.257434 0.159284 +0.599674 0.257434 0.159284 +0.608079 0.257434 0.159284 +0.616166 0.257434 0.159284 +0.000001 0.285092 0.159284 +0.037293 0.285092 0.159284 +0.079714 0.285092 0.159284 +0.120832 0.285092 0.159284 +0.159284 0.285092 0.159284 +0.194868 0.285092 0.159284 +0.227530 0.285092 0.159284 +0.257434 0.285092 0.159284 +0.285092 0.285092 0.159284 +0.310738 0.285092 0.159284 +0.334585 0.285092 0.159284 +0.356818 0.285092 0.159284 +0.377602 0.285092 0.159284 +0.397079 0.285092 0.159284 +0.415373 0.285092 0.159284 +0.432594 0.285092 0.159284 +0.448839 0.285092 0.159284 +0.464192 0.285092 0.159284 +0.478729 0.285092 0.159284 +0.492515 0.285092 0.159284 +0.505612 0.285092 0.159284 +0.518072 0.285092 0.159284 +0.529943 0.285092 0.159284 +0.541266 0.285092 0.159284 +0.552083 0.285092 0.159284 +0.562427 0.285092 0.159284 +0.572331 0.285092 0.159284 +0.581823 0.285092 0.159284 +0.590929 0.285092 0.159284 +0.599674 0.285092 0.159284 +0.608079 0.285092 0.159284 +0.616166 0.285092 0.159284 +0.000001 0.310738 0.159284 +0.037293 0.310738 0.159284 +0.079714 0.310738 0.159284 +0.120832 0.310738 0.159284 +0.159284 0.310738 0.159284 +0.194868 0.310738 0.159284 +0.227530 0.310738 0.159284 +0.257434 0.310738 0.159284 +0.285092 0.310738 0.159284 +0.310738 0.310738 0.159284 +0.334585 0.310738 0.159284 +0.356818 0.310738 0.159284 +0.377602 0.310738 0.159284 +0.397079 0.310738 0.159284 +0.415373 0.310738 0.159284 +0.432594 0.310738 0.159284 +0.448839 0.310738 0.159284 +0.464192 0.310738 0.159284 +0.478729 0.310738 0.159284 +0.492515 0.310738 0.159284 +0.505612 0.310738 0.159284 +0.518072 0.310738 0.159284 +0.529943 0.310738 0.159284 +0.541266 0.310738 0.159284 +0.552083 0.310738 0.159284 +0.562427 0.310738 0.159284 +0.572331 0.310738 0.159284 +0.581823 0.310738 0.159284 +0.590929 0.310738 0.159284 +0.599674 0.310738 0.159284 +0.608079 0.310738 0.159284 +0.616166 0.310738 0.159284 +0.000001 0.334585 0.159284 +0.037293 0.334585 0.159284 +0.079714 0.334585 0.159284 +0.120832 0.334585 0.159284 +0.159284 0.334585 0.159284 +0.194868 0.334585 0.159284 +0.227530 0.334585 0.159284 +0.257434 0.334585 0.159284 +0.285092 0.334585 0.159284 +0.310738 0.334585 0.159284 +0.334585 0.334585 0.159284 +0.356818 0.334585 0.159284 +0.377602 0.334585 0.159284 +0.397079 0.334585 0.159284 +0.415373 0.334585 0.159284 +0.432594 0.334585 0.159284 +0.448839 0.334585 0.159284 +0.464192 0.334585 0.159284 +0.478729 0.334585 0.159284 +0.492515 0.334585 0.159284 +0.505612 0.334585 0.159284 +0.518072 0.334585 0.159284 +0.529943 0.334585 0.159284 +0.541266 0.334585 0.159284 +0.552083 0.334585 0.159284 +0.562427 0.334585 0.159284 +0.572331 0.334585 0.159284 +0.581823 0.334585 0.159284 +0.590929 0.334585 0.159284 +0.599674 0.334585 0.159284 +0.608079 0.334585 0.159284 +0.616166 0.334585 0.159284 +0.000001 0.356818 0.159284 +0.037293 0.356818 0.159284 +0.079714 0.356818 0.159284 +0.120832 0.356818 0.159284 +0.159284 0.356818 0.159284 +0.194868 0.356818 0.159284 +0.227530 0.356818 0.159284 +0.257434 0.356818 0.159284 +0.285092 0.356818 0.159284 +0.310738 0.356818 0.159284 +0.334585 0.356818 0.159284 +0.356818 0.356818 0.159284 +0.377602 0.356818 0.159284 +0.397079 0.356818 0.159284 +0.415373 0.356818 0.159284 +0.432594 0.356818 0.159284 +0.448839 0.356818 0.159284 +0.464192 0.356818 0.159284 +0.478729 0.356818 0.159284 +0.492515 0.356818 0.159284 +0.505612 0.356818 0.159284 +0.518072 0.356818 0.159284 +0.529943 0.356818 0.159284 +0.541266 0.356818 0.159284 +0.552083 0.356818 0.159284 +0.562427 0.356818 0.159284 +0.572331 0.356818 0.159284 +0.581823 0.356818 0.159284 +0.590929 0.356818 0.159284 +0.599674 0.356818 0.159284 +0.608079 0.356818 0.159284 +0.616166 0.356818 0.159284 +0.000001 0.377602 0.159284 +0.037293 0.377602 0.159284 +0.079714 0.377602 0.159284 +0.120832 0.377602 0.159284 +0.159284 0.377602 0.159284 +0.194868 0.377602 0.159284 +0.227530 0.377602 0.159284 +0.257434 0.377602 0.159284 +0.285092 0.377602 0.159284 +0.310738 0.377602 0.159284 +0.334585 0.377602 0.159284 +0.356818 0.377602 0.159284 +0.377602 0.377602 0.159284 +0.397079 0.377602 0.159284 +0.415373 0.377602 0.159284 +0.432594 0.377602 0.159284 +0.448839 0.377602 0.159284 +0.464192 0.377602 0.159284 +0.478729 0.377602 0.159284 +0.492515 0.377602 0.159284 +0.505612 0.377602 0.159284 +0.518072 0.377602 0.159284 +0.529943 0.377602 0.159284 +0.541266 0.377602 0.159284 +0.552083 0.377602 0.159284 +0.562427 0.377602 0.159284 +0.572331 0.377602 0.159284 +0.581823 0.377602 0.159284 +0.590929 0.377602 0.159284 +0.599674 0.377602 0.159284 +0.608079 0.377602 0.159284 +0.616166 0.377602 0.159284 +0.000001 0.397079 0.159284 +0.037293 0.397079 0.159284 +0.079714 0.397079 0.159284 +0.120832 0.397079 0.159284 +0.159284 0.397079 0.159284 +0.194868 0.397079 0.159284 +0.227530 0.397079 0.159284 +0.257434 0.397079 0.159284 +0.285092 0.397079 0.159284 +0.310738 0.397079 0.159284 +0.334585 0.397079 0.159284 +0.356818 0.397079 0.159284 +0.377602 0.397079 0.159284 +0.397079 0.397079 0.159284 +0.415373 0.397079 0.159284 +0.432594 0.397079 0.159284 +0.448839 0.397079 0.159284 +0.464192 0.397079 0.159284 +0.478729 0.397079 0.159284 +0.492515 0.397079 0.159284 +0.505612 0.397079 0.159284 +0.518072 0.397079 0.159284 +0.529943 0.397079 0.159284 +0.541266 0.397079 0.159284 +0.552083 0.397079 0.159284 +0.562427 0.397079 0.159284 +0.572331 0.397079 0.159284 +0.581823 0.397079 0.159284 +0.590929 0.397079 0.159284 +0.599674 0.397079 0.159284 +0.608079 0.397079 0.159284 +0.616166 0.397079 0.159284 +0.000001 0.415373 0.159284 +0.037293 0.415373 0.159284 +0.079714 0.415373 0.159284 +0.120832 0.415373 0.159284 +0.159284 0.415373 0.159284 +0.194868 0.415373 0.159284 +0.227530 0.415373 0.159284 +0.257434 0.415373 0.159284 +0.285092 0.415373 0.159284 +0.310738 0.415373 0.159284 +0.334585 0.415373 0.159284 +0.356818 0.415373 0.159284 +0.377602 0.415373 0.159284 +0.397079 0.415373 0.159284 +0.415373 0.415373 0.159284 +0.432594 0.415373 0.159284 +0.448839 0.415373 0.159284 +0.464192 0.415373 0.159284 +0.478729 0.415373 0.159284 +0.492515 0.415373 0.159284 +0.505612 0.415373 0.159284 +0.518072 0.415373 0.159284 +0.529943 0.415373 0.159284 +0.541266 0.415373 0.159284 +0.552083 0.415373 0.159284 +0.562427 0.415373 0.159284 +0.572331 0.415373 0.159284 +0.581823 0.415373 0.159284 +0.590929 0.415373 0.159284 +0.599674 0.415373 0.159284 +0.608079 0.415373 0.159284 +0.616166 0.415373 0.159284 +0.000001 0.432594 0.159284 +0.037293 0.432594 0.159284 +0.079714 0.432594 0.159284 +0.120832 0.432594 0.159284 +0.159284 0.432594 0.159284 +0.194868 0.432594 0.159284 +0.227530 0.432594 0.159284 +0.257434 0.432594 0.159284 +0.285092 0.432594 0.159284 +0.310738 0.432594 0.159284 +0.334585 0.432594 0.159284 +0.356818 0.432594 0.159284 +0.377602 0.432594 0.159284 +0.397079 0.432594 0.159284 +0.415373 0.432594 0.159284 +0.432594 0.432594 0.159284 +0.448839 0.432594 0.159284 +0.464192 0.432594 0.159284 +0.478729 0.432594 0.159284 +0.492515 0.432594 0.159284 +0.505612 0.432594 0.159284 +0.518072 0.432594 0.159284 +0.529943 0.432594 0.159284 +0.541266 0.432594 0.159284 +0.552083 0.432594 0.159284 +0.562427 0.432594 0.159284 +0.572331 0.432594 0.159284 +0.581823 0.432594 0.159284 +0.590929 0.432594 0.159284 +0.599674 0.432594 0.159284 +0.608079 0.432594 0.159284 +0.616166 0.432594 0.159284 +0.000001 0.448839 0.159284 +0.037293 0.448839 0.159284 +0.079714 0.448839 0.159284 +0.120832 0.448839 0.159284 +0.159284 0.448839 0.159284 +0.194868 0.448839 0.159284 +0.227530 0.448839 0.159284 +0.257434 0.448839 0.159284 +0.285092 0.448839 0.159284 +0.310738 0.448839 0.159284 +0.334585 0.448839 0.159284 +0.356818 0.448839 0.159284 +0.377602 0.448839 0.159284 +0.397079 0.448839 0.159284 +0.415373 0.448839 0.159284 +0.432594 0.448839 0.159284 +0.448839 0.448839 0.159284 +0.464192 0.448839 0.159284 +0.478729 0.448839 0.159284 +0.492515 0.448839 0.159284 +0.505612 0.448839 0.159284 +0.518072 0.448839 0.159284 +0.529943 0.448839 0.159284 +0.541266 0.448839 0.159284 +0.552083 0.448839 0.159284 +0.562427 0.448839 0.159284 +0.572331 0.448839 0.159284 +0.581823 0.448839 0.159284 +0.590929 0.448839 0.159284 +0.599674 0.448839 0.159284 +0.608079 0.448839 0.159284 +0.616166 0.448839 0.159284 +0.000001 0.464192 0.159284 +0.037293 0.464192 0.159284 +0.079714 0.464192 0.159284 +0.120832 0.464192 0.159284 +0.159284 0.464192 0.159284 +0.194868 0.464192 0.159284 +0.227530 0.464192 0.159284 +0.257434 0.464192 0.159284 +0.285092 0.464192 0.159284 +0.310738 0.464192 0.159284 +0.334585 0.464192 0.159284 +0.356818 0.464192 0.159284 +0.377602 0.464192 0.159284 +0.397079 0.464192 0.159284 +0.415373 0.464192 0.159284 +0.432594 0.464192 0.159284 +0.448839 0.464192 0.159284 +0.464192 0.464192 0.159284 +0.478729 0.464192 0.159284 +0.492515 0.464192 0.159284 +0.505612 0.464192 0.159284 +0.518072 0.464192 0.159284 +0.529943 0.464192 0.159284 +0.541266 0.464192 0.159284 +0.552083 0.464192 0.159284 +0.562427 0.464192 0.159284 +0.572331 0.464192 0.159284 +0.581823 0.464192 0.159284 +0.590929 0.464192 0.159284 +0.599674 0.464192 0.159284 +0.608079 0.464192 0.159284 +0.616166 0.464192 0.159284 +0.000001 0.478729 0.159284 +0.037293 0.478729 0.159284 +0.079714 0.478729 0.159284 +0.120832 0.478729 0.159284 +0.159284 0.478729 0.159284 +0.194868 0.478729 0.159284 +0.227530 0.478729 0.159284 +0.257434 0.478729 0.159284 +0.285092 0.478729 0.159284 +0.310738 0.478729 0.159284 +0.334585 0.478729 0.159284 +0.356818 0.478729 0.159284 +0.377602 0.478729 0.159284 +0.397079 0.478729 0.159284 +0.415373 0.478729 0.159284 +0.432594 0.478729 0.159284 +0.448839 0.478729 0.159284 +0.464192 0.478729 0.159284 +0.478729 0.478729 0.159284 +0.492515 0.478729 0.159284 +0.505612 0.478729 0.159284 +0.518072 0.478729 0.159284 +0.529943 0.478729 0.159284 +0.541266 0.478729 0.159284 +0.552083 0.478729 0.159284 +0.562427 0.478729 0.159284 +0.572331 0.478729 0.159284 +0.581823 0.478729 0.159284 +0.590929 0.478729 0.159284 +0.599674 0.478729 0.159284 +0.608079 0.478729 0.159284 +0.616166 0.478729 0.159284 +0.000001 0.492515 0.159284 +0.037293 0.492515 0.159284 +0.079714 0.492515 0.159284 +0.120832 0.492515 0.159284 +0.159284 0.492515 0.159284 +0.194868 0.492515 0.159284 +0.227530 0.492515 0.159284 +0.257434 0.492515 0.159284 +0.285092 0.492515 0.159284 +0.310738 0.492515 0.159284 +0.334585 0.492515 0.159284 +0.356818 0.492515 0.159284 +0.377602 0.492515 0.159284 +0.397079 0.492515 0.159284 +0.415373 0.492515 0.159284 +0.432594 0.492515 0.159284 +0.448839 0.492515 0.159284 +0.464192 0.492515 0.159284 +0.478729 0.492515 0.159284 +0.492515 0.492515 0.159284 +0.505612 0.492515 0.159284 +0.518072 0.492515 0.159284 +0.529943 0.492515 0.159284 +0.541266 0.492515 0.159284 +0.552083 0.492515 0.159284 +0.562427 0.492515 0.159284 +0.572331 0.492515 0.159284 +0.581823 0.492515 0.159284 +0.590929 0.492515 0.159284 +0.599674 0.492515 0.159284 +0.608079 0.492515 0.159284 +0.616166 0.492515 0.159284 +0.000001 0.505612 0.159284 +0.037293 0.505612 0.159284 +0.079714 0.505612 0.159284 +0.120832 0.505612 0.159284 +0.159284 0.505612 0.159284 +0.194868 0.505612 0.159284 +0.227530 0.505612 0.159284 +0.257434 0.505612 0.159284 +0.285092 0.505612 0.159284 +0.310738 0.505612 0.159284 +0.334585 0.505612 0.159284 +0.356818 0.505612 0.159284 +0.377602 0.505612 0.159284 +0.397079 0.505612 0.159284 +0.415373 0.505612 0.159284 +0.432594 0.505612 0.159284 +0.448839 0.505612 0.159284 +0.464192 0.505612 0.159284 +0.478729 0.505612 0.159284 +0.492515 0.505612 0.159284 +0.505612 0.505612 0.159284 +0.518072 0.505612 0.159284 +0.529943 0.505612 0.159284 +0.541266 0.505612 0.159284 +0.552083 0.505612 0.159284 +0.562427 0.505612 0.159284 +0.572331 0.505612 0.159284 +0.581823 0.505612 0.159284 +0.590929 0.505612 0.159284 +0.599674 0.505612 0.159284 +0.608079 0.505612 0.159284 +0.616166 0.505612 0.159284 +0.000001 0.518072 0.159284 +0.037293 0.518072 0.159284 +0.079714 0.518072 0.159284 +0.120832 0.518072 0.159284 +0.159284 0.518072 0.159284 +0.194868 0.518072 0.159284 +0.227530 0.518072 0.159284 +0.257434 0.518072 0.159284 +0.285092 0.518072 0.159284 +0.310738 0.518072 0.159284 +0.334585 0.518072 0.159284 +0.356818 0.518072 0.159284 +0.377602 0.518072 0.159284 +0.397079 0.518072 0.159284 +0.415373 0.518072 0.159284 +0.432594 0.518072 0.159284 +0.448839 0.518072 0.159284 +0.464192 0.518072 0.159284 +0.478729 0.518072 0.159284 +0.492515 0.518072 0.159284 +0.505612 0.518072 0.159284 +0.518072 0.518072 0.159284 +0.529943 0.518072 0.159284 +0.541266 0.518072 0.159284 +0.552083 0.518072 0.159284 +0.562427 0.518072 0.159284 +0.572331 0.518072 0.159284 +0.581823 0.518072 0.159284 +0.590929 0.518072 0.159284 +0.599674 0.518072 0.159284 +0.608079 0.518072 0.159284 +0.616166 0.518072 0.159284 +0.000001 0.529943 0.159284 +0.037293 0.529943 0.159284 +0.079714 0.529943 0.159284 +0.120832 0.529943 0.159284 +0.159284 0.529943 0.159284 +0.194868 0.529943 0.159284 +0.227530 0.529943 0.159284 +0.257434 0.529943 0.159284 +0.285092 0.529943 0.159284 +0.310738 0.529943 0.159284 +0.334585 0.529943 0.159284 +0.356818 0.529943 0.159284 +0.377602 0.529943 0.159284 +0.397079 0.529943 0.159284 +0.415373 0.529943 0.159284 +0.432594 0.529943 0.159284 +0.448839 0.529943 0.159284 +0.464192 0.529943 0.159284 +0.478729 0.529943 0.159284 +0.492515 0.529943 0.159284 +0.505612 0.529943 0.159284 +0.518072 0.529943 0.159284 +0.529943 0.529943 0.159284 +0.541266 0.529943 0.159284 +0.552083 0.529943 0.159284 +0.562427 0.529943 0.159284 +0.572331 0.529943 0.159284 +0.581823 0.529943 0.159284 +0.590929 0.529943 0.159284 +0.599674 0.529943 0.159284 +0.608079 0.529943 0.159284 +0.616166 0.529943 0.159284 +0.000001 0.541266 0.159284 +0.037293 0.541266 0.159284 +0.079714 0.541266 0.159284 +0.120832 0.541266 0.159284 +0.159284 0.541266 0.159284 +0.194868 0.541266 0.159284 +0.227530 0.541266 0.159284 +0.257434 0.541266 0.159284 +0.285092 0.541266 0.159284 +0.310738 0.541266 0.159284 +0.334585 0.541266 0.159284 +0.356818 0.541266 0.159284 +0.377602 0.541266 0.159284 +0.397079 0.541266 0.159284 +0.415373 0.541266 0.159284 +0.432594 0.541266 0.159284 +0.448839 0.541266 0.159284 +0.464192 0.541266 0.159284 +0.478729 0.541266 0.159284 +0.492515 0.541266 0.159284 +0.505612 0.541266 0.159284 +0.518072 0.541266 0.159284 +0.529943 0.541266 0.159284 +0.541266 0.541266 0.159284 +0.552083 0.541266 0.159284 +0.562427 0.541266 0.159284 +0.572331 0.541266 0.159284 +0.581823 0.541266 0.159284 +0.590929 0.541266 0.159284 +0.599674 0.541266 0.159284 +0.608079 0.541266 0.159284 +0.616166 0.541266 0.159284 +0.000001 0.552083 0.159284 +0.037293 0.552083 0.159284 +0.079714 0.552083 0.159284 +0.120832 0.552083 0.159284 +0.159284 0.552083 0.159284 +0.194868 0.552083 0.159284 +0.227530 0.552083 0.159284 +0.257434 0.552083 0.159284 +0.285092 0.552083 0.159284 +0.310738 0.552083 0.159284 +0.334585 0.552083 0.159284 +0.356818 0.552083 0.159284 +0.377602 0.552083 0.159284 +0.397079 0.552083 0.159284 +0.415373 0.552083 0.159284 +0.432594 0.552083 0.159284 +0.448839 0.552083 0.159284 +0.464192 0.552083 0.159284 +0.478729 0.552083 0.159284 +0.492515 0.552083 0.159284 +0.505612 0.552083 0.159284 +0.518072 0.552083 0.159284 +0.529943 0.552083 0.159284 +0.541266 0.552083 0.159284 +0.552083 0.552083 0.159284 +0.562427 0.552083 0.159284 +0.572331 0.552083 0.159284 +0.581823 0.552083 0.159284 +0.590929 0.552083 0.159284 +0.599674 0.552083 0.159284 +0.608079 0.552083 0.159284 +0.616166 0.552083 0.159284 +0.000001 0.562427 0.159284 +0.037293 0.562427 0.159284 +0.079714 0.562427 0.159284 +0.120832 0.562427 0.159284 +0.159284 0.562427 0.159284 +0.194868 0.562427 0.159284 +0.227530 0.562427 0.159284 +0.257434 0.562427 0.159284 +0.285092 0.562427 0.159284 +0.310738 0.562427 0.159284 +0.334585 0.562427 0.159284 +0.356818 0.562427 0.159284 +0.377602 0.562427 0.159284 +0.397079 0.562427 0.159284 +0.415373 0.562427 0.159284 +0.432594 0.562427 0.159284 +0.448839 0.562427 0.159284 +0.464192 0.562427 0.159284 +0.478729 0.562427 0.159284 +0.492515 0.562427 0.159284 +0.505612 0.562427 0.159284 +0.518072 0.562427 0.159284 +0.529943 0.562427 0.159284 +0.541266 0.562427 0.159284 +0.552083 0.562427 0.159284 +0.562427 0.562427 0.159284 +0.572331 0.562427 0.159284 +0.581823 0.562427 0.159284 +0.590929 0.562427 0.159284 +0.599674 0.562427 0.159284 +0.608079 0.562427 0.159284 +0.616166 0.562427 0.159284 +0.000001 0.572331 0.159284 +0.037293 0.572331 0.159284 +0.079714 0.572331 0.159284 +0.120832 0.572331 0.159284 +0.159284 0.572331 0.159284 +0.194868 0.572331 0.159284 +0.227530 0.572331 0.159284 +0.257434 0.572331 0.159284 +0.285092 0.572331 0.159284 +0.310738 0.572331 0.159284 +0.334585 0.572331 0.159284 +0.356818 0.572331 0.159284 +0.377602 0.572331 0.159284 +0.397079 0.572331 0.159284 +0.415373 0.572331 0.159284 +0.432594 0.572331 0.159284 +0.448839 0.572331 0.159284 +0.464192 0.572331 0.159284 +0.478729 0.572331 0.159284 +0.492515 0.572331 0.159284 +0.505612 0.572331 0.159284 +0.518072 0.572331 0.159284 +0.529943 0.572331 0.159284 +0.541266 0.572331 0.159284 +0.552083 0.572331 0.159284 +0.562427 0.572331 0.159284 +0.572331 0.572331 0.159284 +0.581823 0.572331 0.159284 +0.590929 0.572331 0.159284 +0.599674 0.572331 0.159284 +0.608079 0.572331 0.159284 +0.616166 0.572331 0.159284 +0.000001 0.581823 0.159284 +0.037293 0.581823 0.159284 +0.079714 0.581823 0.159284 +0.120832 0.581823 0.159284 +0.159284 0.581823 0.159284 +0.194868 0.581823 0.159284 +0.227530 0.581823 0.159284 +0.257434 0.581823 0.159284 +0.285092 0.581823 0.159284 +0.310738 0.581823 0.159284 +0.334585 0.581823 0.159284 +0.356818 0.581823 0.159284 +0.377602 0.581823 0.159284 +0.397079 0.581823 0.159284 +0.415373 0.581823 0.159284 +0.432594 0.581823 0.159284 +0.448839 0.581823 0.159284 +0.464192 0.581823 0.159284 +0.478729 0.581823 0.159284 +0.492515 0.581823 0.159284 +0.505612 0.581823 0.159284 +0.518072 0.581823 0.159284 +0.529943 0.581823 0.159284 +0.541266 0.581823 0.159284 +0.552083 0.581823 0.159284 +0.562427 0.581823 0.159284 +0.572331 0.581823 0.159284 +0.581823 0.581823 0.159284 +0.590929 0.581823 0.159284 +0.599674 0.581823 0.159284 +0.608079 0.581823 0.159284 +0.616166 0.581823 0.159284 +0.000001 0.590929 0.159284 +0.037293 0.590929 0.159284 +0.079714 0.590929 0.159284 +0.120832 0.590929 0.159284 +0.159284 0.590929 0.159284 +0.194868 0.590929 0.159284 +0.227530 0.590929 0.159284 +0.257434 0.590929 0.159284 +0.285092 0.590929 0.159284 +0.310738 0.590929 0.159284 +0.334585 0.590929 0.159284 +0.356818 0.590929 0.159284 +0.377602 0.590929 0.159284 +0.397079 0.590929 0.159284 +0.415373 0.590929 0.159284 +0.432594 0.590929 0.159284 +0.448839 0.590929 0.159284 +0.464192 0.590929 0.159284 +0.478729 0.590929 0.159284 +0.492515 0.590929 0.159284 +0.505612 0.590929 0.159284 +0.518072 0.590929 0.159284 +0.529943 0.590929 0.159284 +0.541266 0.590929 0.159284 +0.552083 0.590929 0.159284 +0.562427 0.590929 0.159284 +0.572331 0.590929 0.159284 +0.581823 0.590929 0.159284 +0.590929 0.590929 0.159284 +0.599674 0.590929 0.159284 +0.608079 0.590929 0.159284 +0.616166 0.590929 0.159284 +0.000001 0.599674 0.159284 +0.037293 0.599674 0.159284 +0.079714 0.599674 0.159284 +0.120832 0.599674 0.159284 +0.159284 0.599674 0.159284 +0.194868 0.599674 0.159284 +0.227530 0.599674 0.159284 +0.257434 0.599674 0.159284 +0.285092 0.599674 0.159284 +0.310738 0.599674 0.159284 +0.334585 0.599674 0.159284 +0.356818 0.599674 0.159284 +0.377602 0.599674 0.159284 +0.397079 0.599674 0.159284 +0.415373 0.599674 0.159284 +0.432594 0.599674 0.159284 +0.448839 0.599674 0.159284 +0.464192 0.599674 0.159284 +0.478729 0.599674 0.159284 +0.492515 0.599674 0.159284 +0.505612 0.599674 0.159284 +0.518072 0.599674 0.159284 +0.529943 0.599674 0.159284 +0.541266 0.599674 0.159284 +0.552083 0.599674 0.159284 +0.562427 0.599674 0.159284 +0.572331 0.599674 0.159284 +0.581823 0.599674 0.159284 +0.590929 0.599674 0.159284 +0.599674 0.599674 0.159284 +0.608079 0.599674 0.159284 +0.616166 0.599674 0.159284 +0.000001 0.608079 0.159284 +0.037293 0.608079 0.159284 +0.079714 0.608079 0.159284 +0.120832 0.608079 0.159284 +0.159284 0.608079 0.159284 +0.194868 0.608079 0.159284 +0.227530 0.608079 0.159284 +0.257434 0.608079 0.159284 +0.285092 0.608079 0.159284 +0.310738 0.608079 0.159284 +0.334585 0.608079 0.159284 +0.356818 0.608079 0.159284 +0.377602 0.608079 0.159284 +0.397079 0.608079 0.159284 +0.415373 0.608079 0.159284 +0.432594 0.608079 0.159284 +0.448839 0.608079 0.159284 +0.464192 0.608079 0.159284 +0.478729 0.608079 0.159284 +0.492515 0.608079 0.159284 +0.505612 0.608079 0.159284 +0.518072 0.608079 0.159284 +0.529943 0.608079 0.159284 +0.541266 0.608079 0.159284 +0.552083 0.608079 0.159284 +0.562427 0.608079 0.159284 +0.572331 0.608079 0.159284 +0.581823 0.608079 0.159284 +0.590929 0.608079 0.159284 +0.599674 0.608079 0.159284 +0.608079 0.608079 0.159284 +0.616166 0.608079 0.159284 +0.000001 0.616166 0.159284 +0.037293 0.616166 0.159284 +0.079714 0.616166 0.159284 +0.120832 0.616166 0.159284 +0.159284 0.616166 0.159284 +0.194868 0.616166 0.159284 +0.227530 0.616166 0.159284 +0.257434 0.616166 0.159284 +0.285092 0.616166 0.159284 +0.310738 0.616166 0.159284 +0.334585 0.616166 0.159284 +0.356818 0.616166 0.159284 +0.377602 0.616166 0.159284 +0.397079 0.616166 0.159284 +0.415373 0.616166 0.159284 +0.432594 0.616166 0.159284 +0.448839 0.616166 0.159284 +0.464192 0.616166 0.159284 +0.478729 0.616166 0.159284 +0.492515 0.616166 0.159284 +0.505612 0.616166 0.159284 +0.518072 0.616166 0.159284 +0.529943 0.616166 0.159284 +0.541266 0.616166 0.159284 +0.552083 0.616166 0.159284 +0.562427 0.616166 0.159284 +0.572331 0.616166 0.159284 +0.581823 0.616166 0.159284 +0.590929 0.616166 0.159284 +0.599674 0.616166 0.159284 +0.608079 0.616166 0.159284 +0.616166 0.616166 0.159284 +0.000001 0.000001 0.194868 +0.037293 0.000001 0.194868 +0.079714 0.000001 0.194868 +0.120832 0.000001 0.194868 +0.159284 0.000001 0.194868 +0.194868 0.000001 0.194868 +0.227530 0.000001 0.194868 +0.257434 0.000001 0.194868 +0.285092 0.000001 0.194868 +0.310738 0.000001 0.194868 +0.334585 0.000001 0.194868 +0.356818 0.000001 0.194868 +0.377602 0.000001 0.194868 +0.397079 0.000001 0.194868 +0.415373 0.000001 0.194868 +0.432594 0.000001 0.194868 +0.448839 0.000001 0.194868 +0.464192 0.000001 0.194868 +0.478729 0.000001 0.194868 +0.492515 0.000001 0.194868 +0.505612 0.000001 0.194868 +0.518072 0.000001 0.194868 +0.529943 0.000001 0.194868 +0.541266 0.000001 0.194868 +0.552083 0.000001 0.194868 +0.562427 0.000001 0.194868 +0.572331 0.000001 0.194868 +0.581823 0.000001 0.194868 +0.590929 0.000001 0.194868 +0.599674 0.000001 0.194868 +0.608079 0.000001 0.194868 +0.616166 0.000001 0.194868 +0.000001 0.037293 0.194868 +0.037293 0.037293 0.194868 +0.079714 0.037293 0.194868 +0.120832 0.037293 0.194868 +0.159284 0.037293 0.194868 +0.194868 0.037293 0.194868 +0.227530 0.037293 0.194868 +0.257434 0.037293 0.194868 +0.285092 0.037293 0.194868 +0.310738 0.037293 0.194868 +0.334585 0.037293 0.194868 +0.356818 0.037293 0.194868 +0.377602 0.037293 0.194868 +0.397079 0.037293 0.194868 +0.415373 0.037293 0.194868 +0.432594 0.037293 0.194868 +0.448839 0.037293 0.194868 +0.464192 0.037293 0.194868 +0.478729 0.037293 0.194868 +0.492515 0.037293 0.194868 +0.505612 0.037293 0.194868 +0.518072 0.037293 0.194868 +0.529943 0.037293 0.194868 +0.541266 0.037293 0.194868 +0.552083 0.037293 0.194868 +0.562427 0.037293 0.194868 +0.572331 0.037293 0.194868 +0.581823 0.037293 0.194868 +0.590929 0.037293 0.194868 +0.599674 0.037293 0.194868 +0.608079 0.037293 0.194868 +0.616166 0.037293 0.194868 +0.000001 0.079714 0.194868 +0.037293 0.079714 0.194868 +0.079714 0.079714 0.194868 +0.120832 0.079714 0.194868 +0.159284 0.079714 0.194868 +0.194868 0.079714 0.194868 +0.227530 0.079714 0.194868 +0.257434 0.079714 0.194868 +0.285092 0.079714 0.194868 +0.310738 0.079714 0.194868 +0.334585 0.079714 0.194868 +0.356818 0.079714 0.194868 +0.377602 0.079714 0.194868 +0.397079 0.079714 0.194868 +0.415373 0.079714 0.194868 +0.432594 0.079714 0.194868 +0.448839 0.079714 0.194868 +0.464192 0.079714 0.194868 +0.478729 0.079714 0.194868 +0.492515 0.079714 0.194868 +0.505612 0.079714 0.194868 +0.518072 0.079714 0.194868 +0.529943 0.079714 0.194868 +0.541266 0.079714 0.194868 +0.552083 0.079714 0.194868 +0.562427 0.079714 0.194868 +0.572331 0.079714 0.194868 +0.581823 0.079714 0.194868 +0.590929 0.079714 0.194868 +0.599674 0.079714 0.194868 +0.608079 0.079714 0.194868 +0.616166 0.079714 0.194868 +0.000001 0.120832 0.194868 +0.037293 0.120832 0.194868 +0.079714 0.120832 0.194868 +0.120832 0.120832 0.194868 +0.159284 0.120832 0.194868 +0.194868 0.120832 0.194868 +0.227530 0.120832 0.194868 +0.257434 0.120832 0.194868 +0.285092 0.120832 0.194868 +0.310738 0.120832 0.194868 +0.334585 0.120832 0.194868 +0.356818 0.120832 0.194868 +0.377602 0.120832 0.194868 +0.397079 0.120832 0.194868 +0.415373 0.120832 0.194868 +0.432594 0.120832 0.194868 +0.448839 0.120832 0.194868 +0.464192 0.120832 0.194868 +0.478729 0.120832 0.194868 +0.492515 0.120832 0.194868 +0.505612 0.120832 0.194868 +0.518072 0.120832 0.194868 +0.529943 0.120832 0.194868 +0.541266 0.120832 0.194868 +0.552083 0.120832 0.194868 +0.562427 0.120832 0.194868 +0.572331 0.120832 0.194868 +0.581823 0.120832 0.194868 +0.590929 0.120832 0.194868 +0.599674 0.120832 0.194868 +0.608079 0.120832 0.194868 +0.616166 0.120832 0.194868 +0.000001 0.159284 0.194868 +0.037293 0.159284 0.194868 +0.079714 0.159284 0.194868 +0.120832 0.159284 0.194868 +0.159284 0.159284 0.194868 +0.194868 0.159284 0.194868 +0.227530 0.159284 0.194868 +0.257434 0.159284 0.194868 +0.285092 0.159284 0.194868 +0.310738 0.159284 0.194868 +0.334585 0.159284 0.194868 +0.356818 0.159284 0.194868 +0.377602 0.159284 0.194868 +0.397079 0.159284 0.194868 +0.415373 0.159284 0.194868 +0.432594 0.159284 0.194868 +0.448839 0.159284 0.194868 +0.464192 0.159284 0.194868 +0.478729 0.159284 0.194868 +0.492515 0.159284 0.194868 +0.505612 0.159284 0.194868 +0.518072 0.159284 0.194868 +0.529943 0.159284 0.194868 +0.541266 0.159284 0.194868 +0.552083 0.159284 0.194868 +0.562427 0.159284 0.194868 +0.572331 0.159284 0.194868 +0.581823 0.159284 0.194868 +0.590929 0.159284 0.194868 +0.599674 0.159284 0.194868 +0.608079 0.159284 0.194868 +0.616166 0.159284 0.194868 +0.000001 0.194868 0.194868 +0.037293 0.194868 0.194868 +0.079714 0.194868 0.194868 +0.120832 0.194868 0.194868 +0.159284 0.194868 0.194868 +0.194868 0.194868 0.194868 +0.227530 0.194868 0.194868 +0.257434 0.194868 0.194868 +0.285092 0.194868 0.194868 +0.310738 0.194868 0.194868 +0.334585 0.194868 0.194868 +0.356818 0.194868 0.194868 +0.377602 0.194868 0.194868 +0.397079 0.194868 0.194868 +0.415373 0.194868 0.194868 +0.432594 0.194868 0.194868 +0.448839 0.194868 0.194868 +0.464192 0.194868 0.194868 +0.478729 0.194868 0.194868 +0.492515 0.194868 0.194868 +0.505612 0.194868 0.194868 +0.518072 0.194868 0.194868 +0.529943 0.194868 0.194868 +0.541266 0.194868 0.194868 +0.552083 0.194868 0.194868 +0.562427 0.194868 0.194868 +0.572331 0.194868 0.194868 +0.581823 0.194868 0.194868 +0.590929 0.194868 0.194868 +0.599674 0.194868 0.194868 +0.608079 0.194868 0.194868 +0.616166 0.194868 0.194868 +0.000001 0.227530 0.194868 +0.037293 0.227530 0.194868 +0.079714 0.227530 0.194868 +0.120832 0.227530 0.194868 +0.159284 0.227530 0.194868 +0.194868 0.227530 0.194868 +0.227530 0.227530 0.194868 +0.257434 0.227530 0.194868 +0.285092 0.227530 0.194868 +0.310738 0.227530 0.194868 +0.334585 0.227530 0.194868 +0.356818 0.227530 0.194868 +0.377602 0.227530 0.194868 +0.397079 0.227530 0.194868 +0.415373 0.227530 0.194868 +0.432594 0.227530 0.194868 +0.448839 0.227530 0.194868 +0.464192 0.227530 0.194868 +0.478729 0.227530 0.194868 +0.492515 0.227530 0.194868 +0.505612 0.227530 0.194868 +0.518072 0.227530 0.194868 +0.529943 0.227530 0.194868 +0.541266 0.227530 0.194868 +0.552083 0.227530 0.194868 +0.562427 0.227530 0.194868 +0.572331 0.227530 0.194868 +0.581823 0.227530 0.194868 +0.590929 0.227530 0.194868 +0.599674 0.227530 0.194868 +0.608079 0.227530 0.194868 +0.616166 0.227530 0.194868 +0.000001 0.257434 0.194868 +0.037293 0.257434 0.194868 +0.079714 0.257434 0.194868 +0.120832 0.257434 0.194868 +0.159284 0.257434 0.194868 +0.194868 0.257434 0.194868 +0.227530 0.257434 0.194868 +0.257434 0.257434 0.194868 +0.285092 0.257434 0.194868 +0.310738 0.257434 0.194868 +0.334585 0.257434 0.194868 +0.356818 0.257434 0.194868 +0.377602 0.257434 0.194868 +0.397079 0.257434 0.194868 +0.415373 0.257434 0.194868 +0.432594 0.257434 0.194868 +0.448839 0.257434 0.194868 +0.464192 0.257434 0.194868 +0.478729 0.257434 0.194868 +0.492515 0.257434 0.194868 +0.505612 0.257434 0.194868 +0.518072 0.257434 0.194868 +0.529943 0.257434 0.194868 +0.541266 0.257434 0.194868 +0.552083 0.257434 0.194868 +0.562427 0.257434 0.194868 +0.572331 0.257434 0.194868 +0.581823 0.257434 0.194868 +0.590929 0.257434 0.194868 +0.599674 0.257434 0.194868 +0.608079 0.257434 0.194868 +0.616166 0.257434 0.194868 +0.000001 0.285092 0.194868 +0.037293 0.285092 0.194868 +0.079714 0.285092 0.194868 +0.120832 0.285092 0.194868 +0.159284 0.285092 0.194868 +0.194868 0.285092 0.194868 +0.227530 0.285092 0.194868 +0.257434 0.285092 0.194868 +0.285092 0.285092 0.194868 +0.310738 0.285092 0.194868 +0.334585 0.285092 0.194868 +0.356818 0.285092 0.194868 +0.377602 0.285092 0.194868 +0.397079 0.285092 0.194868 +0.415373 0.285092 0.194868 +0.432594 0.285092 0.194868 +0.448839 0.285092 0.194868 +0.464192 0.285092 0.194868 +0.478729 0.285092 0.194868 +0.492515 0.285092 0.194868 +0.505612 0.285092 0.194868 +0.518072 0.285092 0.194868 +0.529943 0.285092 0.194868 +0.541266 0.285092 0.194868 +0.552083 0.285092 0.194868 +0.562427 0.285092 0.194868 +0.572331 0.285092 0.194868 +0.581823 0.285092 0.194868 +0.590929 0.285092 0.194868 +0.599674 0.285092 0.194868 +0.608079 0.285092 0.194868 +0.616166 0.285092 0.194868 +0.000001 0.310738 0.194868 +0.037293 0.310738 0.194868 +0.079714 0.310738 0.194868 +0.120832 0.310738 0.194868 +0.159284 0.310738 0.194868 +0.194868 0.310738 0.194868 +0.227530 0.310738 0.194868 +0.257434 0.310738 0.194868 +0.285092 0.310738 0.194868 +0.310738 0.310738 0.194868 +0.334585 0.310738 0.194868 +0.356818 0.310738 0.194868 +0.377602 0.310738 0.194868 +0.397079 0.310738 0.194868 +0.415373 0.310738 0.194868 +0.432594 0.310738 0.194868 +0.448839 0.310738 0.194868 +0.464192 0.310738 0.194868 +0.478729 0.310738 0.194868 +0.492515 0.310738 0.194868 +0.505612 0.310738 0.194868 +0.518072 0.310738 0.194868 +0.529943 0.310738 0.194868 +0.541266 0.310738 0.194868 +0.552083 0.310738 0.194868 +0.562427 0.310738 0.194868 +0.572331 0.310738 0.194868 +0.581823 0.310738 0.194868 +0.590929 0.310738 0.194868 +0.599674 0.310738 0.194868 +0.608079 0.310738 0.194868 +0.616166 0.310738 0.194868 +0.000001 0.334585 0.194868 +0.037293 0.334585 0.194868 +0.079714 0.334585 0.194868 +0.120832 0.334585 0.194868 +0.159284 0.334585 0.194868 +0.194868 0.334585 0.194868 +0.227530 0.334585 0.194868 +0.257434 0.334585 0.194868 +0.285092 0.334585 0.194868 +0.310738 0.334585 0.194868 +0.334585 0.334585 0.194868 +0.356818 0.334585 0.194868 +0.377602 0.334585 0.194868 +0.397079 0.334585 0.194868 +0.415373 0.334585 0.194868 +0.432594 0.334585 0.194868 +0.448839 0.334585 0.194868 +0.464192 0.334585 0.194868 +0.478729 0.334585 0.194868 +0.492515 0.334585 0.194868 +0.505612 0.334585 0.194868 +0.518072 0.334585 0.194868 +0.529943 0.334585 0.194868 +0.541266 0.334585 0.194868 +0.552083 0.334585 0.194868 +0.562427 0.334585 0.194868 +0.572331 0.334585 0.194868 +0.581823 0.334585 0.194868 +0.590929 0.334585 0.194868 +0.599674 0.334585 0.194868 +0.608079 0.334585 0.194868 +0.616166 0.334585 0.194868 +0.000001 0.356818 0.194868 +0.037293 0.356818 0.194868 +0.079714 0.356818 0.194868 +0.120832 0.356818 0.194868 +0.159284 0.356818 0.194868 +0.194868 0.356818 0.194868 +0.227530 0.356818 0.194868 +0.257434 0.356818 0.194868 +0.285092 0.356818 0.194868 +0.310738 0.356818 0.194868 +0.334585 0.356818 0.194868 +0.356818 0.356818 0.194868 +0.377602 0.356818 0.194868 +0.397079 0.356818 0.194868 +0.415373 0.356818 0.194868 +0.432594 0.356818 0.194868 +0.448839 0.356818 0.194868 +0.464192 0.356818 0.194868 +0.478729 0.356818 0.194868 +0.492515 0.356818 0.194868 +0.505612 0.356818 0.194868 +0.518072 0.356818 0.194868 +0.529943 0.356818 0.194868 +0.541266 0.356818 0.194868 +0.552083 0.356818 0.194868 +0.562427 0.356818 0.194868 +0.572331 0.356818 0.194868 +0.581823 0.356818 0.194868 +0.590929 0.356818 0.194868 +0.599674 0.356818 0.194868 +0.608079 0.356818 0.194868 +0.616166 0.356818 0.194868 +0.000001 0.377602 0.194868 +0.037293 0.377602 0.194868 +0.079714 0.377602 0.194868 +0.120832 0.377602 0.194868 +0.159284 0.377602 0.194868 +0.194868 0.377602 0.194868 +0.227530 0.377602 0.194868 +0.257434 0.377602 0.194868 +0.285092 0.377602 0.194868 +0.310738 0.377602 0.194868 +0.334585 0.377602 0.194868 +0.356818 0.377602 0.194868 +0.377602 0.377602 0.194868 +0.397079 0.377602 0.194868 +0.415373 0.377602 0.194868 +0.432594 0.377602 0.194868 +0.448839 0.377602 0.194868 +0.464192 0.377602 0.194868 +0.478729 0.377602 0.194868 +0.492515 0.377602 0.194868 +0.505612 0.377602 0.194868 +0.518072 0.377602 0.194868 +0.529943 0.377602 0.194868 +0.541266 0.377602 0.194868 +0.552083 0.377602 0.194868 +0.562427 0.377602 0.194868 +0.572331 0.377602 0.194868 +0.581823 0.377602 0.194868 +0.590929 0.377602 0.194868 +0.599674 0.377602 0.194868 +0.608079 0.377602 0.194868 +0.616166 0.377602 0.194868 +0.000001 0.397079 0.194868 +0.037293 0.397079 0.194868 +0.079714 0.397079 0.194868 +0.120832 0.397079 0.194868 +0.159284 0.397079 0.194868 +0.194868 0.397079 0.194868 +0.227530 0.397079 0.194868 +0.257434 0.397079 0.194868 +0.285092 0.397079 0.194868 +0.310738 0.397079 0.194868 +0.334585 0.397079 0.194868 +0.356818 0.397079 0.194868 +0.377602 0.397079 0.194868 +0.397079 0.397079 0.194868 +0.415373 0.397079 0.194868 +0.432594 0.397079 0.194868 +0.448839 0.397079 0.194868 +0.464192 0.397079 0.194868 +0.478729 0.397079 0.194868 +0.492515 0.397079 0.194868 +0.505612 0.397079 0.194868 +0.518072 0.397079 0.194868 +0.529943 0.397079 0.194868 +0.541266 0.397079 0.194868 +0.552083 0.397079 0.194868 +0.562427 0.397079 0.194868 +0.572331 0.397079 0.194868 +0.581823 0.397079 0.194868 +0.590929 0.397079 0.194868 +0.599674 0.397079 0.194868 +0.608079 0.397079 0.194868 +0.616166 0.397079 0.194868 +0.000001 0.415373 0.194868 +0.037293 0.415373 0.194868 +0.079714 0.415373 0.194868 +0.120832 0.415373 0.194868 +0.159284 0.415373 0.194868 +0.194868 0.415373 0.194868 +0.227530 0.415373 0.194868 +0.257434 0.415373 0.194868 +0.285092 0.415373 0.194868 +0.310738 0.415373 0.194868 +0.334585 0.415373 0.194868 +0.356818 0.415373 0.194868 +0.377602 0.415373 0.194868 +0.397079 0.415373 0.194868 +0.415373 0.415373 0.194868 +0.432594 0.415373 0.194868 +0.448839 0.415373 0.194868 +0.464192 0.415373 0.194868 +0.478729 0.415373 0.194868 +0.492515 0.415373 0.194868 +0.505612 0.415373 0.194868 +0.518072 0.415373 0.194868 +0.529943 0.415373 0.194868 +0.541266 0.415373 0.194868 +0.552083 0.415373 0.194868 +0.562427 0.415373 0.194868 +0.572331 0.415373 0.194868 +0.581823 0.415373 0.194868 +0.590929 0.415373 0.194868 +0.599674 0.415373 0.194868 +0.608079 0.415373 0.194868 +0.616166 0.415373 0.194868 +0.000001 0.432594 0.194868 +0.037293 0.432594 0.194868 +0.079714 0.432594 0.194868 +0.120832 0.432594 0.194868 +0.159284 0.432594 0.194868 +0.194868 0.432594 0.194868 +0.227530 0.432594 0.194868 +0.257434 0.432594 0.194868 +0.285092 0.432594 0.194868 +0.310738 0.432594 0.194868 +0.334585 0.432594 0.194868 +0.356818 0.432594 0.194868 +0.377602 0.432594 0.194868 +0.397079 0.432594 0.194868 +0.415373 0.432594 0.194868 +0.432594 0.432594 0.194868 +0.448839 0.432594 0.194868 +0.464192 0.432594 0.194868 +0.478729 0.432594 0.194868 +0.492515 0.432594 0.194868 +0.505612 0.432594 0.194868 +0.518072 0.432594 0.194868 +0.529943 0.432594 0.194868 +0.541266 0.432594 0.194868 +0.552083 0.432594 0.194868 +0.562427 0.432594 0.194868 +0.572331 0.432594 0.194868 +0.581823 0.432594 0.194868 +0.590929 0.432594 0.194868 +0.599674 0.432594 0.194868 +0.608079 0.432594 0.194868 +0.616166 0.432594 0.194868 +0.000001 0.448839 0.194868 +0.037293 0.448839 0.194868 +0.079714 0.448839 0.194868 +0.120832 0.448839 0.194868 +0.159284 0.448839 0.194868 +0.194868 0.448839 0.194868 +0.227530 0.448839 0.194868 +0.257434 0.448839 0.194868 +0.285092 0.448839 0.194868 +0.310738 0.448839 0.194868 +0.334585 0.448839 0.194868 +0.356818 0.448839 0.194868 +0.377602 0.448839 0.194868 +0.397079 0.448839 0.194868 +0.415373 0.448839 0.194868 +0.432594 0.448839 0.194868 +0.448839 0.448839 0.194868 +0.464192 0.448839 0.194868 +0.478729 0.448839 0.194868 +0.492515 0.448839 0.194868 +0.505612 0.448839 0.194868 +0.518072 0.448839 0.194868 +0.529943 0.448839 0.194868 +0.541266 0.448839 0.194868 +0.552083 0.448839 0.194868 +0.562427 0.448839 0.194868 +0.572331 0.448839 0.194868 +0.581823 0.448839 0.194868 +0.590929 0.448839 0.194868 +0.599674 0.448839 0.194868 +0.608079 0.448839 0.194868 +0.616166 0.448839 0.194868 +0.000001 0.464192 0.194868 +0.037293 0.464192 0.194868 +0.079714 0.464192 0.194868 +0.120832 0.464192 0.194868 +0.159284 0.464192 0.194868 +0.194868 0.464192 0.194868 +0.227530 0.464192 0.194868 +0.257434 0.464192 0.194868 +0.285092 0.464192 0.194868 +0.310738 0.464192 0.194868 +0.334585 0.464192 0.194868 +0.356818 0.464192 0.194868 +0.377602 0.464192 0.194868 +0.397079 0.464192 0.194868 +0.415373 0.464192 0.194868 +0.432594 0.464192 0.194868 +0.448839 0.464192 0.194868 +0.464192 0.464192 0.194868 +0.478729 0.464192 0.194868 +0.492515 0.464192 0.194868 +0.505612 0.464192 0.194868 +0.518072 0.464192 0.194868 +0.529943 0.464192 0.194868 +0.541266 0.464192 0.194868 +0.552083 0.464192 0.194868 +0.562427 0.464192 0.194868 +0.572331 0.464192 0.194868 +0.581823 0.464192 0.194868 +0.590929 0.464192 0.194868 +0.599674 0.464192 0.194868 +0.608079 0.464192 0.194868 +0.616166 0.464192 0.194868 +0.000001 0.478729 0.194868 +0.037293 0.478729 0.194868 +0.079714 0.478729 0.194868 +0.120832 0.478729 0.194868 +0.159284 0.478729 0.194868 +0.194868 0.478729 0.194868 +0.227530 0.478729 0.194868 +0.257434 0.478729 0.194868 +0.285092 0.478729 0.194868 +0.310738 0.478729 0.194868 +0.334585 0.478729 0.194868 +0.356818 0.478729 0.194868 +0.377602 0.478729 0.194868 +0.397079 0.478729 0.194868 +0.415373 0.478729 0.194868 +0.432594 0.478729 0.194868 +0.448839 0.478729 0.194868 +0.464192 0.478729 0.194868 +0.478729 0.478729 0.194868 +0.492515 0.478729 0.194868 +0.505612 0.478729 0.194868 +0.518072 0.478729 0.194868 +0.529943 0.478729 0.194868 +0.541266 0.478729 0.194868 +0.552083 0.478729 0.194868 +0.562427 0.478729 0.194868 +0.572331 0.478729 0.194868 +0.581823 0.478729 0.194868 +0.590929 0.478729 0.194868 +0.599674 0.478729 0.194868 +0.608079 0.478729 0.194868 +0.616166 0.478729 0.194868 +0.000001 0.492515 0.194868 +0.037293 0.492515 0.194868 +0.079714 0.492515 0.194868 +0.120832 0.492515 0.194868 +0.159284 0.492515 0.194868 +0.194868 0.492515 0.194868 +0.227530 0.492515 0.194868 +0.257434 0.492515 0.194868 +0.285092 0.492515 0.194868 +0.310738 0.492515 0.194868 +0.334585 0.492515 0.194868 +0.356818 0.492515 0.194868 +0.377602 0.492515 0.194868 +0.397079 0.492515 0.194868 +0.415373 0.492515 0.194868 +0.432594 0.492515 0.194868 +0.448839 0.492515 0.194868 +0.464192 0.492515 0.194868 +0.478729 0.492515 0.194868 +0.492515 0.492515 0.194868 +0.505612 0.492515 0.194868 +0.518072 0.492515 0.194868 +0.529943 0.492515 0.194868 +0.541266 0.492515 0.194868 +0.552083 0.492515 0.194868 +0.562427 0.492515 0.194868 +0.572331 0.492515 0.194868 +0.581823 0.492515 0.194868 +0.590929 0.492515 0.194868 +0.599674 0.492515 0.194868 +0.608079 0.492515 0.194868 +0.616166 0.492515 0.194868 +0.000001 0.505612 0.194868 +0.037293 0.505612 0.194868 +0.079714 0.505612 0.194868 +0.120832 0.505612 0.194868 +0.159284 0.505612 0.194868 +0.194868 0.505612 0.194868 +0.227530 0.505612 0.194868 +0.257434 0.505612 0.194868 +0.285092 0.505612 0.194868 +0.310738 0.505612 0.194868 +0.334585 0.505612 0.194868 +0.356818 0.505612 0.194868 +0.377602 0.505612 0.194868 +0.397079 0.505612 0.194868 +0.415373 0.505612 0.194868 +0.432594 0.505612 0.194868 +0.448839 0.505612 0.194868 +0.464192 0.505612 0.194868 +0.478729 0.505612 0.194868 +0.492515 0.505612 0.194868 +0.505612 0.505612 0.194868 +0.518072 0.505612 0.194868 +0.529943 0.505612 0.194868 +0.541266 0.505612 0.194868 +0.552083 0.505612 0.194868 +0.562427 0.505612 0.194868 +0.572331 0.505612 0.194868 +0.581823 0.505612 0.194868 +0.590929 0.505612 0.194868 +0.599674 0.505612 0.194868 +0.608079 0.505612 0.194868 +0.616166 0.505612 0.194868 +0.000001 0.518072 0.194868 +0.037293 0.518072 0.194868 +0.079714 0.518072 0.194868 +0.120832 0.518072 0.194868 +0.159284 0.518072 0.194868 +0.194868 0.518072 0.194868 +0.227530 0.518072 0.194868 +0.257434 0.518072 0.194868 +0.285092 0.518072 0.194868 +0.310738 0.518072 0.194868 +0.334585 0.518072 0.194868 +0.356818 0.518072 0.194868 +0.377602 0.518072 0.194868 +0.397079 0.518072 0.194868 +0.415373 0.518072 0.194868 +0.432594 0.518072 0.194868 +0.448839 0.518072 0.194868 +0.464192 0.518072 0.194868 +0.478729 0.518072 0.194868 +0.492515 0.518072 0.194868 +0.505612 0.518072 0.194868 +0.518072 0.518072 0.194868 +0.529943 0.518072 0.194868 +0.541266 0.518072 0.194868 +0.552083 0.518072 0.194868 +0.562427 0.518072 0.194868 +0.572331 0.518072 0.194868 +0.581823 0.518072 0.194868 +0.590929 0.518072 0.194868 +0.599674 0.518072 0.194868 +0.608079 0.518072 0.194868 +0.616166 0.518072 0.194868 +0.000001 0.529943 0.194868 +0.037293 0.529943 0.194868 +0.079714 0.529943 0.194868 +0.120832 0.529943 0.194868 +0.159284 0.529943 0.194868 +0.194868 0.529943 0.194868 +0.227530 0.529943 0.194868 +0.257434 0.529943 0.194868 +0.285092 0.529943 0.194868 +0.310738 0.529943 0.194868 +0.334585 0.529943 0.194868 +0.356818 0.529943 0.194868 +0.377602 0.529943 0.194868 +0.397079 0.529943 0.194868 +0.415373 0.529943 0.194868 +0.432594 0.529943 0.194868 +0.448839 0.529943 0.194868 +0.464192 0.529943 0.194868 +0.478729 0.529943 0.194868 +0.492515 0.529943 0.194868 +0.505612 0.529943 0.194868 +0.518072 0.529943 0.194868 +0.529943 0.529943 0.194868 +0.541266 0.529943 0.194868 +0.552083 0.529943 0.194868 +0.562427 0.529943 0.194868 +0.572331 0.529943 0.194868 +0.581823 0.529943 0.194868 +0.590929 0.529943 0.194868 +0.599674 0.529943 0.194868 +0.608079 0.529943 0.194868 +0.616166 0.529943 0.194868 +0.000001 0.541266 0.194868 +0.037293 0.541266 0.194868 +0.079714 0.541266 0.194868 +0.120832 0.541266 0.194868 +0.159284 0.541266 0.194868 +0.194868 0.541266 0.194868 +0.227530 0.541266 0.194868 +0.257434 0.541266 0.194868 +0.285092 0.541266 0.194868 +0.310738 0.541266 0.194868 +0.334585 0.541266 0.194868 +0.356818 0.541266 0.194868 +0.377602 0.541266 0.194868 +0.397079 0.541266 0.194868 +0.415373 0.541266 0.194868 +0.432594 0.541266 0.194868 +0.448839 0.541266 0.194868 +0.464192 0.541266 0.194868 +0.478729 0.541266 0.194868 +0.492515 0.541266 0.194868 +0.505612 0.541266 0.194868 +0.518072 0.541266 0.194868 +0.529943 0.541266 0.194868 +0.541266 0.541266 0.194868 +0.552083 0.541266 0.194868 +0.562427 0.541266 0.194868 +0.572331 0.541266 0.194868 +0.581823 0.541266 0.194868 +0.590929 0.541266 0.194868 +0.599674 0.541266 0.194868 +0.608079 0.541266 0.194868 +0.616166 0.541266 0.194868 +0.000001 0.552083 0.194868 +0.037293 0.552083 0.194868 +0.079714 0.552083 0.194868 +0.120832 0.552083 0.194868 +0.159284 0.552083 0.194868 +0.194868 0.552083 0.194868 +0.227530 0.552083 0.194868 +0.257434 0.552083 0.194868 +0.285092 0.552083 0.194868 +0.310738 0.552083 0.194868 +0.334585 0.552083 0.194868 +0.356818 0.552083 0.194868 +0.377602 0.552083 0.194868 +0.397079 0.552083 0.194868 +0.415373 0.552083 0.194868 +0.432594 0.552083 0.194868 +0.448839 0.552083 0.194868 +0.464192 0.552083 0.194868 +0.478729 0.552083 0.194868 +0.492515 0.552083 0.194868 +0.505612 0.552083 0.194868 +0.518072 0.552083 0.194868 +0.529943 0.552083 0.194868 +0.541266 0.552083 0.194868 +0.552083 0.552083 0.194868 +0.562427 0.552083 0.194868 +0.572331 0.552083 0.194868 +0.581823 0.552083 0.194868 +0.590929 0.552083 0.194868 +0.599674 0.552083 0.194868 +0.608079 0.552083 0.194868 +0.616166 0.552083 0.194868 +0.000001 0.562427 0.194868 +0.037293 0.562427 0.194868 +0.079714 0.562427 0.194868 +0.120832 0.562427 0.194868 +0.159284 0.562427 0.194868 +0.194868 0.562427 0.194868 +0.227530 0.562427 0.194868 +0.257434 0.562427 0.194868 +0.285092 0.562427 0.194868 +0.310738 0.562427 0.194868 +0.334585 0.562427 0.194868 +0.356818 0.562427 0.194868 +0.377602 0.562427 0.194868 +0.397079 0.562427 0.194868 +0.415373 0.562427 0.194868 +0.432594 0.562427 0.194868 +0.448839 0.562427 0.194868 +0.464192 0.562427 0.194868 +0.478729 0.562427 0.194868 +0.492515 0.562427 0.194868 +0.505612 0.562427 0.194868 +0.518072 0.562427 0.194868 +0.529943 0.562427 0.194868 +0.541266 0.562427 0.194868 +0.552083 0.562427 0.194868 +0.562427 0.562427 0.194868 +0.572331 0.562427 0.194868 +0.581823 0.562427 0.194868 +0.590929 0.562427 0.194868 +0.599674 0.562427 0.194868 +0.608079 0.562427 0.194868 +0.616166 0.562427 0.194868 +0.000001 0.572331 0.194868 +0.037293 0.572331 0.194868 +0.079714 0.572331 0.194868 +0.120832 0.572331 0.194868 +0.159284 0.572331 0.194868 +0.194868 0.572331 0.194868 +0.227530 0.572331 0.194868 +0.257434 0.572331 0.194868 +0.285092 0.572331 0.194868 +0.310738 0.572331 0.194868 +0.334585 0.572331 0.194868 +0.356818 0.572331 0.194868 +0.377602 0.572331 0.194868 +0.397079 0.572331 0.194868 +0.415373 0.572331 0.194868 +0.432594 0.572331 0.194868 +0.448839 0.572331 0.194868 +0.464192 0.572331 0.194868 +0.478729 0.572331 0.194868 +0.492515 0.572331 0.194868 +0.505612 0.572331 0.194868 +0.518072 0.572331 0.194868 +0.529943 0.572331 0.194868 +0.541266 0.572331 0.194868 +0.552083 0.572331 0.194868 +0.562427 0.572331 0.194868 +0.572331 0.572331 0.194868 +0.581823 0.572331 0.194868 +0.590929 0.572331 0.194868 +0.599674 0.572331 0.194868 +0.608079 0.572331 0.194868 +0.616166 0.572331 0.194868 +0.000001 0.581823 0.194868 +0.037293 0.581823 0.194868 +0.079714 0.581823 0.194868 +0.120832 0.581823 0.194868 +0.159284 0.581823 0.194868 +0.194868 0.581823 0.194868 +0.227530 0.581823 0.194868 +0.257434 0.581823 0.194868 +0.285092 0.581823 0.194868 +0.310738 0.581823 0.194868 +0.334585 0.581823 0.194868 +0.356818 0.581823 0.194868 +0.377602 0.581823 0.194868 +0.397079 0.581823 0.194868 +0.415373 0.581823 0.194868 +0.432594 0.581823 0.194868 +0.448839 0.581823 0.194868 +0.464192 0.581823 0.194868 +0.478729 0.581823 0.194868 +0.492515 0.581823 0.194868 +0.505612 0.581823 0.194868 +0.518072 0.581823 0.194868 +0.529943 0.581823 0.194868 +0.541266 0.581823 0.194868 +0.552083 0.581823 0.194868 +0.562427 0.581823 0.194868 +0.572331 0.581823 0.194868 +0.581823 0.581823 0.194868 +0.590929 0.581823 0.194868 +0.599674 0.581823 0.194868 +0.608079 0.581823 0.194868 +0.616166 0.581823 0.194868 +0.000001 0.590929 0.194868 +0.037293 0.590929 0.194868 +0.079714 0.590929 0.194868 +0.120832 0.590929 0.194868 +0.159284 0.590929 0.194868 +0.194868 0.590929 0.194868 +0.227530 0.590929 0.194868 +0.257434 0.590929 0.194868 +0.285092 0.590929 0.194868 +0.310738 0.590929 0.194868 +0.334585 0.590929 0.194868 +0.356818 0.590929 0.194868 +0.377602 0.590929 0.194868 +0.397079 0.590929 0.194868 +0.415373 0.590929 0.194868 +0.432594 0.590929 0.194868 +0.448839 0.590929 0.194868 +0.464192 0.590929 0.194868 +0.478729 0.590929 0.194868 +0.492515 0.590929 0.194868 +0.505612 0.590929 0.194868 +0.518072 0.590929 0.194868 +0.529943 0.590929 0.194868 +0.541266 0.590929 0.194868 +0.552083 0.590929 0.194868 +0.562427 0.590929 0.194868 +0.572331 0.590929 0.194868 +0.581823 0.590929 0.194868 +0.590929 0.590929 0.194868 +0.599674 0.590929 0.194868 +0.608079 0.590929 0.194868 +0.616166 0.590929 0.194868 +0.000001 0.599674 0.194868 +0.037293 0.599674 0.194868 +0.079714 0.599674 0.194868 +0.120832 0.599674 0.194868 +0.159284 0.599674 0.194868 +0.194868 0.599674 0.194868 +0.227530 0.599674 0.194868 +0.257434 0.599674 0.194868 +0.285092 0.599674 0.194868 +0.310738 0.599674 0.194868 +0.334585 0.599674 0.194868 +0.356818 0.599674 0.194868 +0.377602 0.599674 0.194868 +0.397079 0.599674 0.194868 +0.415373 0.599674 0.194868 +0.432594 0.599674 0.194868 +0.448839 0.599674 0.194868 +0.464192 0.599674 0.194868 +0.478729 0.599674 0.194868 +0.492515 0.599674 0.194868 +0.505612 0.599674 0.194868 +0.518072 0.599674 0.194868 +0.529943 0.599674 0.194868 +0.541266 0.599674 0.194868 +0.552083 0.599674 0.194868 +0.562427 0.599674 0.194868 +0.572331 0.599674 0.194868 +0.581823 0.599674 0.194868 +0.590929 0.599674 0.194868 +0.599674 0.599674 0.194868 +0.608079 0.599674 0.194868 +0.616166 0.599674 0.194868 +0.000001 0.608079 0.194868 +0.037293 0.608079 0.194868 +0.079714 0.608079 0.194868 +0.120832 0.608079 0.194868 +0.159284 0.608079 0.194868 +0.194868 0.608079 0.194868 +0.227530 0.608079 0.194868 +0.257434 0.608079 0.194868 +0.285092 0.608079 0.194868 +0.310738 0.608079 0.194868 +0.334585 0.608079 0.194868 +0.356818 0.608079 0.194868 +0.377602 0.608079 0.194868 +0.397079 0.608079 0.194868 +0.415373 0.608079 0.194868 +0.432594 0.608079 0.194868 +0.448839 0.608079 0.194868 +0.464192 0.608079 0.194868 +0.478729 0.608079 0.194868 +0.492515 0.608079 0.194868 +0.505612 0.608079 0.194868 +0.518072 0.608079 0.194868 +0.529943 0.608079 0.194868 +0.541266 0.608079 0.194868 +0.552083 0.608079 0.194868 +0.562427 0.608079 0.194868 +0.572331 0.608079 0.194868 +0.581823 0.608079 0.194868 +0.590929 0.608079 0.194868 +0.599674 0.608079 0.194868 +0.608079 0.608079 0.194868 +0.616166 0.608079 0.194868 +0.000001 0.616166 0.194868 +0.037293 0.616166 0.194868 +0.079714 0.616166 0.194868 +0.120832 0.616166 0.194868 +0.159284 0.616166 0.194868 +0.194868 0.616166 0.194868 +0.227530 0.616166 0.194868 +0.257434 0.616166 0.194868 +0.285092 0.616166 0.194868 +0.310738 0.616166 0.194868 +0.334585 0.616166 0.194868 +0.356818 0.616166 0.194868 +0.377602 0.616166 0.194868 +0.397079 0.616166 0.194868 +0.415373 0.616166 0.194868 +0.432594 0.616166 0.194868 +0.448839 0.616166 0.194868 +0.464192 0.616166 0.194868 +0.478729 0.616166 0.194868 +0.492515 0.616166 0.194868 +0.505612 0.616166 0.194868 +0.518072 0.616166 0.194868 +0.529943 0.616166 0.194868 +0.541266 0.616166 0.194868 +0.552083 0.616166 0.194868 +0.562427 0.616166 0.194868 +0.572331 0.616166 0.194868 +0.581823 0.616166 0.194868 +0.590929 0.616166 0.194868 +0.599674 0.616166 0.194868 +0.608079 0.616166 0.194868 +0.616166 0.616166 0.194868 +0.000001 0.000001 0.227530 +0.037293 0.000001 0.227530 +0.079714 0.000001 0.227530 +0.120832 0.000001 0.227530 +0.159284 0.000001 0.227530 +0.194868 0.000001 0.227530 +0.227530 0.000001 0.227530 +0.257434 0.000001 0.227530 +0.285092 0.000001 0.227530 +0.310738 0.000001 0.227530 +0.334585 0.000001 0.227530 +0.356818 0.000001 0.227530 +0.377602 0.000001 0.227530 +0.397079 0.000001 0.227530 +0.415373 0.000001 0.227530 +0.432594 0.000001 0.227530 +0.448839 0.000001 0.227530 +0.464192 0.000001 0.227530 +0.478729 0.000001 0.227530 +0.492515 0.000001 0.227530 +0.505612 0.000001 0.227530 +0.518072 0.000001 0.227530 +0.529943 0.000001 0.227530 +0.541266 0.000001 0.227530 +0.552083 0.000001 0.227530 +0.562427 0.000001 0.227530 +0.572331 0.000001 0.227530 +0.581823 0.000001 0.227530 +0.590929 0.000001 0.227530 +0.599674 0.000001 0.227530 +0.608079 0.000001 0.227530 +0.616166 0.000001 0.227530 +0.000001 0.037293 0.227530 +0.037293 0.037293 0.227530 +0.079714 0.037293 0.227530 +0.120832 0.037293 0.227530 +0.159284 0.037293 0.227530 +0.194868 0.037293 0.227530 +0.227530 0.037293 0.227530 +0.257434 0.037293 0.227530 +0.285092 0.037293 0.227530 +0.310738 0.037293 0.227530 +0.334585 0.037293 0.227530 +0.356818 0.037293 0.227530 +0.377602 0.037293 0.227530 +0.397079 0.037293 0.227530 +0.415373 0.037293 0.227530 +0.432594 0.037293 0.227530 +0.448839 0.037293 0.227530 +0.464192 0.037293 0.227530 +0.478729 0.037293 0.227530 +0.492515 0.037293 0.227530 +0.505612 0.037293 0.227530 +0.518072 0.037293 0.227530 +0.529943 0.037293 0.227530 +0.541266 0.037293 0.227530 +0.552083 0.037293 0.227530 +0.562427 0.037293 0.227530 +0.572331 0.037293 0.227530 +0.581823 0.037293 0.227530 +0.590929 0.037293 0.227530 +0.599674 0.037293 0.227530 +0.608079 0.037293 0.227530 +0.616166 0.037293 0.227530 +0.000001 0.079714 0.227530 +0.037293 0.079714 0.227530 +0.079714 0.079714 0.227530 +0.120832 0.079714 0.227530 +0.159284 0.079714 0.227530 +0.194868 0.079714 0.227530 +0.227530 0.079714 0.227530 +0.257434 0.079714 0.227530 +0.285092 0.079714 0.227530 +0.310738 0.079714 0.227530 +0.334585 0.079714 0.227530 +0.356818 0.079714 0.227530 +0.377602 0.079714 0.227530 +0.397079 0.079714 0.227530 +0.415373 0.079714 0.227530 +0.432594 0.079714 0.227530 +0.448839 0.079714 0.227530 +0.464192 0.079714 0.227530 +0.478729 0.079714 0.227530 +0.492515 0.079714 0.227530 +0.505612 0.079714 0.227530 +0.518072 0.079714 0.227530 +0.529943 0.079714 0.227530 +0.541266 0.079714 0.227530 +0.552083 0.079714 0.227530 +0.562427 0.079714 0.227530 +0.572331 0.079714 0.227530 +0.581823 0.079714 0.227530 +0.590929 0.079714 0.227530 +0.599674 0.079714 0.227530 +0.608079 0.079714 0.227530 +0.616166 0.079714 0.227530 +0.000001 0.120832 0.227530 +0.037293 0.120832 0.227530 +0.079714 0.120832 0.227530 +0.120832 0.120832 0.227530 +0.159284 0.120832 0.227530 +0.194868 0.120832 0.227530 +0.227530 0.120832 0.227530 +0.257434 0.120832 0.227530 +0.285092 0.120832 0.227530 +0.310738 0.120832 0.227530 +0.334585 0.120832 0.227530 +0.356818 0.120832 0.227530 +0.377602 0.120832 0.227530 +0.397079 0.120832 0.227530 +0.415373 0.120832 0.227530 +0.432594 0.120832 0.227530 +0.448839 0.120832 0.227530 +0.464192 0.120832 0.227530 +0.478729 0.120832 0.227530 +0.492515 0.120832 0.227530 +0.505612 0.120832 0.227530 +0.518072 0.120832 0.227530 +0.529943 0.120832 0.227530 +0.541266 0.120832 0.227530 +0.552083 0.120832 0.227530 +0.562427 0.120832 0.227530 +0.572331 0.120832 0.227530 +0.581823 0.120832 0.227530 +0.590929 0.120832 0.227530 +0.599674 0.120832 0.227530 +0.608079 0.120832 0.227530 +0.616166 0.120832 0.227530 +0.000001 0.159284 0.227530 +0.037293 0.159284 0.227530 +0.079714 0.159284 0.227530 +0.120832 0.159284 0.227530 +0.159284 0.159284 0.227530 +0.194868 0.159284 0.227530 +0.227530 0.159284 0.227530 +0.257434 0.159284 0.227530 +0.285092 0.159284 0.227530 +0.310738 0.159284 0.227530 +0.334585 0.159284 0.227530 +0.356818 0.159284 0.227530 +0.377602 0.159284 0.227530 +0.397079 0.159284 0.227530 +0.415373 0.159284 0.227530 +0.432594 0.159284 0.227530 +0.448839 0.159284 0.227530 +0.464192 0.159284 0.227530 +0.478729 0.159284 0.227530 +0.492515 0.159284 0.227530 +0.505612 0.159284 0.227530 +0.518072 0.159284 0.227530 +0.529943 0.159284 0.227530 +0.541266 0.159284 0.227530 +0.552083 0.159284 0.227530 +0.562427 0.159284 0.227530 +0.572331 0.159284 0.227530 +0.581823 0.159284 0.227530 +0.590929 0.159284 0.227530 +0.599674 0.159284 0.227530 +0.608079 0.159284 0.227530 +0.616166 0.159284 0.227530 +0.000001 0.194868 0.227530 +0.037293 0.194868 0.227530 +0.079714 0.194868 0.227530 +0.120832 0.194868 0.227530 +0.159284 0.194868 0.227530 +0.194868 0.194868 0.227530 +0.227530 0.194868 0.227530 +0.257434 0.194868 0.227530 +0.285092 0.194868 0.227530 +0.310738 0.194868 0.227530 +0.334585 0.194868 0.227530 +0.356818 0.194868 0.227530 +0.377602 0.194868 0.227530 +0.397079 0.194868 0.227530 +0.415373 0.194868 0.227530 +0.432594 0.194868 0.227530 +0.448839 0.194868 0.227530 +0.464192 0.194868 0.227530 +0.478729 0.194868 0.227530 +0.492515 0.194868 0.227530 +0.505612 0.194868 0.227530 +0.518072 0.194868 0.227530 +0.529943 0.194868 0.227530 +0.541266 0.194868 0.227530 +0.552083 0.194868 0.227530 +0.562427 0.194868 0.227530 +0.572331 0.194868 0.227530 +0.581823 0.194868 0.227530 +0.590929 0.194868 0.227530 +0.599674 0.194868 0.227530 +0.608079 0.194868 0.227530 +0.616166 0.194868 0.227530 +0.000001 0.227530 0.227530 +0.037293 0.227530 0.227530 +0.079714 0.227530 0.227530 +0.120832 0.227530 0.227530 +0.159284 0.227530 0.227530 +0.194868 0.227530 0.227530 +0.227530 0.227530 0.227530 +0.257434 0.227530 0.227530 +0.285092 0.227530 0.227530 +0.310738 0.227530 0.227530 +0.334585 0.227530 0.227530 +0.356818 0.227530 0.227530 +0.377602 0.227530 0.227530 +0.397079 0.227530 0.227530 +0.415373 0.227530 0.227530 +0.432594 0.227530 0.227530 +0.448839 0.227530 0.227530 +0.464192 0.227530 0.227530 +0.478729 0.227530 0.227530 +0.492515 0.227530 0.227530 +0.505612 0.227530 0.227530 +0.518072 0.227530 0.227530 +0.529943 0.227530 0.227530 +0.541266 0.227530 0.227530 +0.552083 0.227530 0.227530 +0.562427 0.227530 0.227530 +0.572331 0.227530 0.227530 +0.581823 0.227530 0.227530 +0.590929 0.227530 0.227530 +0.599674 0.227530 0.227530 +0.608079 0.227530 0.227530 +0.616166 0.227530 0.227530 +0.000001 0.257434 0.227530 +0.037293 0.257434 0.227530 +0.079714 0.257434 0.227530 +0.120832 0.257434 0.227530 +0.159284 0.257434 0.227530 +0.194868 0.257434 0.227530 +0.227530 0.257434 0.227530 +0.257434 0.257434 0.227530 +0.285092 0.257434 0.227530 +0.310738 0.257434 0.227530 +0.334585 0.257434 0.227530 +0.356818 0.257434 0.227530 +0.377602 0.257434 0.227530 +0.397079 0.257434 0.227530 +0.415373 0.257434 0.227530 +0.432594 0.257434 0.227530 +0.448839 0.257434 0.227530 +0.464192 0.257434 0.227530 +0.478729 0.257434 0.227530 +0.492515 0.257434 0.227530 +0.505612 0.257434 0.227530 +0.518072 0.257434 0.227530 +0.529943 0.257434 0.227530 +0.541266 0.257434 0.227530 +0.552083 0.257434 0.227530 +0.562427 0.257434 0.227530 +0.572331 0.257434 0.227530 +0.581823 0.257434 0.227530 +0.590929 0.257434 0.227530 +0.599674 0.257434 0.227530 +0.608079 0.257434 0.227530 +0.616166 0.257434 0.227530 +0.000001 0.285092 0.227530 +0.037293 0.285092 0.227530 +0.079714 0.285092 0.227530 +0.120832 0.285092 0.227530 +0.159284 0.285092 0.227530 +0.194868 0.285092 0.227530 +0.227530 0.285092 0.227530 +0.257434 0.285092 0.227530 +0.285092 0.285092 0.227530 +0.310738 0.285092 0.227530 +0.334585 0.285092 0.227530 +0.356818 0.285092 0.227530 +0.377602 0.285092 0.227530 +0.397079 0.285092 0.227530 +0.415373 0.285092 0.227530 +0.432594 0.285092 0.227530 +0.448839 0.285092 0.227530 +0.464192 0.285092 0.227530 +0.478729 0.285092 0.227530 +0.492515 0.285092 0.227530 +0.505612 0.285092 0.227530 +0.518072 0.285092 0.227530 +0.529943 0.285092 0.227530 +0.541266 0.285092 0.227530 +0.552083 0.285092 0.227530 +0.562427 0.285092 0.227530 +0.572331 0.285092 0.227530 +0.581823 0.285092 0.227530 +0.590929 0.285092 0.227530 +0.599674 0.285092 0.227530 +0.608079 0.285092 0.227530 +0.616166 0.285092 0.227530 +0.000001 0.310738 0.227530 +0.037293 0.310738 0.227530 +0.079714 0.310738 0.227530 +0.120832 0.310738 0.227530 +0.159284 0.310738 0.227530 +0.194868 0.310738 0.227530 +0.227530 0.310738 0.227530 +0.257434 0.310738 0.227530 +0.285092 0.310738 0.227530 +0.310738 0.310738 0.227530 +0.334585 0.310738 0.227530 +0.356818 0.310738 0.227530 +0.377602 0.310738 0.227530 +0.397079 0.310738 0.227530 +0.415373 0.310738 0.227530 +0.432594 0.310738 0.227530 +0.448839 0.310738 0.227530 +0.464192 0.310738 0.227530 +0.478729 0.310738 0.227530 +0.492515 0.310738 0.227530 +0.505612 0.310738 0.227530 +0.518072 0.310738 0.227530 +0.529943 0.310738 0.227530 +0.541266 0.310738 0.227530 +0.552083 0.310738 0.227530 +0.562427 0.310738 0.227530 +0.572331 0.310738 0.227530 +0.581823 0.310738 0.227530 +0.590929 0.310738 0.227530 +0.599674 0.310738 0.227530 +0.608079 0.310738 0.227530 +0.616166 0.310738 0.227530 +0.000001 0.334585 0.227530 +0.037293 0.334585 0.227530 +0.079714 0.334585 0.227530 +0.120832 0.334585 0.227530 +0.159284 0.334585 0.227530 +0.194868 0.334585 0.227530 +0.227530 0.334585 0.227530 +0.257434 0.334585 0.227530 +0.285092 0.334585 0.227530 +0.310738 0.334585 0.227530 +0.334585 0.334585 0.227530 +0.356818 0.334585 0.227530 +0.377602 0.334585 0.227530 +0.397079 0.334585 0.227530 +0.415373 0.334585 0.227530 +0.432594 0.334585 0.227530 +0.448839 0.334585 0.227530 +0.464192 0.334585 0.227530 +0.478729 0.334585 0.227530 +0.492515 0.334585 0.227530 +0.505612 0.334585 0.227530 +0.518072 0.334585 0.227530 +0.529943 0.334585 0.227530 +0.541266 0.334585 0.227530 +0.552083 0.334585 0.227530 +0.562427 0.334585 0.227530 +0.572331 0.334585 0.227530 +0.581823 0.334585 0.227530 +0.590929 0.334585 0.227530 +0.599674 0.334585 0.227530 +0.608079 0.334585 0.227530 +0.616166 0.334585 0.227530 +0.000001 0.356818 0.227530 +0.037293 0.356818 0.227530 +0.079714 0.356818 0.227530 +0.120832 0.356818 0.227530 +0.159284 0.356818 0.227530 +0.194868 0.356818 0.227530 +0.227530 0.356818 0.227530 +0.257434 0.356818 0.227530 +0.285092 0.356818 0.227530 +0.310738 0.356818 0.227530 +0.334585 0.356818 0.227530 +0.356818 0.356818 0.227530 +0.377602 0.356818 0.227530 +0.397079 0.356818 0.227530 +0.415373 0.356818 0.227530 +0.432594 0.356818 0.227530 +0.448839 0.356818 0.227530 +0.464192 0.356818 0.227530 +0.478729 0.356818 0.227530 +0.492515 0.356818 0.227530 +0.505612 0.356818 0.227530 +0.518072 0.356818 0.227530 +0.529943 0.356818 0.227530 +0.541266 0.356818 0.227530 +0.552083 0.356818 0.227530 +0.562427 0.356818 0.227530 +0.572331 0.356818 0.227530 +0.581823 0.356818 0.227530 +0.590929 0.356818 0.227530 +0.599674 0.356818 0.227530 +0.608079 0.356818 0.227530 +0.616166 0.356818 0.227530 +0.000001 0.377602 0.227530 +0.037293 0.377602 0.227530 +0.079714 0.377602 0.227530 +0.120832 0.377602 0.227530 +0.159284 0.377602 0.227530 +0.194868 0.377602 0.227530 +0.227530 0.377602 0.227530 +0.257434 0.377602 0.227530 +0.285092 0.377602 0.227530 +0.310738 0.377602 0.227530 +0.334585 0.377602 0.227530 +0.356818 0.377602 0.227530 +0.377602 0.377602 0.227530 +0.397079 0.377602 0.227530 +0.415373 0.377602 0.227530 +0.432594 0.377602 0.227530 +0.448839 0.377602 0.227530 +0.464192 0.377602 0.227530 +0.478729 0.377602 0.227530 +0.492515 0.377602 0.227530 +0.505612 0.377602 0.227530 +0.518072 0.377602 0.227530 +0.529943 0.377602 0.227530 +0.541266 0.377602 0.227530 +0.552083 0.377602 0.227530 +0.562427 0.377602 0.227530 +0.572331 0.377602 0.227530 +0.581823 0.377602 0.227530 +0.590929 0.377602 0.227530 +0.599674 0.377602 0.227530 +0.608079 0.377602 0.227530 +0.616166 0.377602 0.227530 +0.000001 0.397079 0.227530 +0.037293 0.397079 0.227530 +0.079714 0.397079 0.227530 +0.120832 0.397079 0.227530 +0.159284 0.397079 0.227530 +0.194868 0.397079 0.227530 +0.227530 0.397079 0.227530 +0.257434 0.397079 0.227530 +0.285092 0.397079 0.227530 +0.310738 0.397079 0.227530 +0.334585 0.397079 0.227530 +0.356818 0.397079 0.227530 +0.377602 0.397079 0.227530 +0.397079 0.397079 0.227530 +0.415373 0.397079 0.227530 +0.432594 0.397079 0.227530 +0.448839 0.397079 0.227530 +0.464192 0.397079 0.227530 +0.478729 0.397079 0.227530 +0.492515 0.397079 0.227530 +0.505612 0.397079 0.227530 +0.518072 0.397079 0.227530 +0.529943 0.397079 0.227530 +0.541266 0.397079 0.227530 +0.552083 0.397079 0.227530 +0.562427 0.397079 0.227530 +0.572331 0.397079 0.227530 +0.581823 0.397079 0.227530 +0.590929 0.397079 0.227530 +0.599674 0.397079 0.227530 +0.608079 0.397079 0.227530 +0.616166 0.397079 0.227530 +0.000001 0.415373 0.227530 +0.037293 0.415373 0.227530 +0.079714 0.415373 0.227530 +0.120832 0.415373 0.227530 +0.159284 0.415373 0.227530 +0.194868 0.415373 0.227530 +0.227530 0.415373 0.227530 +0.257434 0.415373 0.227530 +0.285092 0.415373 0.227530 +0.310738 0.415373 0.227530 +0.334585 0.415373 0.227530 +0.356818 0.415373 0.227530 +0.377602 0.415373 0.227530 +0.397079 0.415373 0.227530 +0.415373 0.415373 0.227530 +0.432594 0.415373 0.227530 +0.448839 0.415373 0.227530 +0.464192 0.415373 0.227530 +0.478729 0.415373 0.227530 +0.492515 0.415373 0.227530 +0.505612 0.415373 0.227530 +0.518072 0.415373 0.227530 +0.529943 0.415373 0.227530 +0.541266 0.415373 0.227530 +0.552083 0.415373 0.227530 +0.562427 0.415373 0.227530 +0.572331 0.415373 0.227530 +0.581823 0.415373 0.227530 +0.590929 0.415373 0.227530 +0.599674 0.415373 0.227530 +0.608079 0.415373 0.227530 +0.616166 0.415373 0.227530 +0.000001 0.432594 0.227530 +0.037293 0.432594 0.227530 +0.079714 0.432594 0.227530 +0.120832 0.432594 0.227530 +0.159284 0.432594 0.227530 +0.194868 0.432594 0.227530 +0.227530 0.432594 0.227530 +0.257434 0.432594 0.227530 +0.285092 0.432594 0.227530 +0.310738 0.432594 0.227530 +0.334585 0.432594 0.227530 +0.356818 0.432594 0.227530 +0.377602 0.432594 0.227530 +0.397079 0.432594 0.227530 +0.415373 0.432594 0.227530 +0.432594 0.432594 0.227530 +0.448839 0.432594 0.227530 +0.464192 0.432594 0.227530 +0.478729 0.432594 0.227530 +0.492515 0.432594 0.227530 +0.505612 0.432594 0.227530 +0.518072 0.432594 0.227530 +0.529943 0.432594 0.227530 +0.541266 0.432594 0.227530 +0.552083 0.432594 0.227530 +0.562427 0.432594 0.227530 +0.572331 0.432594 0.227530 +0.581823 0.432594 0.227530 +0.590929 0.432594 0.227530 +0.599674 0.432594 0.227530 +0.608079 0.432594 0.227530 +0.616166 0.432594 0.227530 +0.000001 0.448839 0.227530 +0.037293 0.448839 0.227530 +0.079714 0.448839 0.227530 +0.120832 0.448839 0.227530 +0.159284 0.448839 0.227530 +0.194868 0.448839 0.227530 +0.227530 0.448839 0.227530 +0.257434 0.448839 0.227530 +0.285092 0.448839 0.227530 +0.310738 0.448839 0.227530 +0.334585 0.448839 0.227530 +0.356818 0.448839 0.227530 +0.377602 0.448839 0.227530 +0.397079 0.448839 0.227530 +0.415373 0.448839 0.227530 +0.432594 0.448839 0.227530 +0.448839 0.448839 0.227530 +0.464192 0.448839 0.227530 +0.478729 0.448839 0.227530 +0.492515 0.448839 0.227530 +0.505612 0.448839 0.227530 +0.518072 0.448839 0.227530 +0.529943 0.448839 0.227530 +0.541266 0.448839 0.227530 +0.552083 0.448839 0.227530 +0.562427 0.448839 0.227530 +0.572331 0.448839 0.227530 +0.581823 0.448839 0.227530 +0.590929 0.448839 0.227530 +0.599674 0.448839 0.227530 +0.608079 0.448839 0.227530 +0.616166 0.448839 0.227530 +0.000001 0.464192 0.227530 +0.037293 0.464192 0.227530 +0.079714 0.464192 0.227530 +0.120832 0.464192 0.227530 +0.159284 0.464192 0.227530 +0.194868 0.464192 0.227530 +0.227530 0.464192 0.227530 +0.257434 0.464192 0.227530 +0.285092 0.464192 0.227530 +0.310738 0.464192 0.227530 +0.334585 0.464192 0.227530 +0.356818 0.464192 0.227530 +0.377602 0.464192 0.227530 +0.397079 0.464192 0.227530 +0.415373 0.464192 0.227530 +0.432594 0.464192 0.227530 +0.448839 0.464192 0.227530 +0.464192 0.464192 0.227530 +0.478729 0.464192 0.227530 +0.492515 0.464192 0.227530 +0.505612 0.464192 0.227530 +0.518072 0.464192 0.227530 +0.529943 0.464192 0.227530 +0.541266 0.464192 0.227530 +0.552083 0.464192 0.227530 +0.562427 0.464192 0.227530 +0.572331 0.464192 0.227530 +0.581823 0.464192 0.227530 +0.590929 0.464192 0.227530 +0.599674 0.464192 0.227530 +0.608079 0.464192 0.227530 +0.616166 0.464192 0.227530 +0.000001 0.478729 0.227530 +0.037293 0.478729 0.227530 +0.079714 0.478729 0.227530 +0.120832 0.478729 0.227530 +0.159284 0.478729 0.227530 +0.194868 0.478729 0.227530 +0.227530 0.478729 0.227530 +0.257434 0.478729 0.227530 +0.285092 0.478729 0.227530 +0.310738 0.478729 0.227530 +0.334585 0.478729 0.227530 +0.356818 0.478729 0.227530 +0.377602 0.478729 0.227530 +0.397079 0.478729 0.227530 +0.415373 0.478729 0.227530 +0.432594 0.478729 0.227530 +0.448839 0.478729 0.227530 +0.464192 0.478729 0.227530 +0.478729 0.478729 0.227530 +0.492515 0.478729 0.227530 +0.505612 0.478729 0.227530 +0.518072 0.478729 0.227530 +0.529943 0.478729 0.227530 +0.541266 0.478729 0.227530 +0.552083 0.478729 0.227530 +0.562427 0.478729 0.227530 +0.572331 0.478729 0.227530 +0.581823 0.478729 0.227530 +0.590929 0.478729 0.227530 +0.599674 0.478729 0.227530 +0.608079 0.478729 0.227530 +0.616166 0.478729 0.227530 +0.000001 0.492515 0.227530 +0.037293 0.492515 0.227530 +0.079714 0.492515 0.227530 +0.120832 0.492515 0.227530 +0.159284 0.492515 0.227530 +0.194868 0.492515 0.227530 +0.227530 0.492515 0.227530 +0.257434 0.492515 0.227530 +0.285092 0.492515 0.227530 +0.310738 0.492515 0.227530 +0.334585 0.492515 0.227530 +0.356818 0.492515 0.227530 +0.377602 0.492515 0.227530 +0.397079 0.492515 0.227530 +0.415373 0.492515 0.227530 +0.432594 0.492515 0.227530 +0.448839 0.492515 0.227530 +0.464192 0.492515 0.227530 +0.478729 0.492515 0.227530 +0.492515 0.492515 0.227530 +0.505612 0.492515 0.227530 +0.518072 0.492515 0.227530 +0.529943 0.492515 0.227530 +0.541266 0.492515 0.227530 +0.552083 0.492515 0.227530 +0.562427 0.492515 0.227530 +0.572331 0.492515 0.227530 +0.581823 0.492515 0.227530 +0.590929 0.492515 0.227530 +0.599674 0.492515 0.227530 +0.608079 0.492515 0.227530 +0.616166 0.492515 0.227530 +0.000001 0.505612 0.227530 +0.037293 0.505612 0.227530 +0.079714 0.505612 0.227530 +0.120832 0.505612 0.227530 +0.159284 0.505612 0.227530 +0.194868 0.505612 0.227530 +0.227530 0.505612 0.227530 +0.257434 0.505612 0.227530 +0.285092 0.505612 0.227530 +0.310738 0.505612 0.227530 +0.334585 0.505612 0.227530 +0.356818 0.505612 0.227530 +0.377602 0.505612 0.227530 +0.397079 0.505612 0.227530 +0.415373 0.505612 0.227530 +0.432594 0.505612 0.227530 +0.448839 0.505612 0.227530 +0.464192 0.505612 0.227530 +0.478729 0.505612 0.227530 +0.492515 0.505612 0.227530 +0.505612 0.505612 0.227530 +0.518072 0.505612 0.227530 +0.529943 0.505612 0.227530 +0.541266 0.505612 0.227530 +0.552083 0.505612 0.227530 +0.562427 0.505612 0.227530 +0.572331 0.505612 0.227530 +0.581823 0.505612 0.227530 +0.590929 0.505612 0.227530 +0.599674 0.505612 0.227530 +0.608079 0.505612 0.227530 +0.616166 0.505612 0.227530 +0.000001 0.518072 0.227530 +0.037293 0.518072 0.227530 +0.079714 0.518072 0.227530 +0.120832 0.518072 0.227530 +0.159284 0.518072 0.227530 +0.194868 0.518072 0.227530 +0.227530 0.518072 0.227530 +0.257434 0.518072 0.227530 +0.285092 0.518072 0.227530 +0.310738 0.518072 0.227530 +0.334585 0.518072 0.227530 +0.356818 0.518072 0.227530 +0.377602 0.518072 0.227530 +0.397079 0.518072 0.227530 +0.415373 0.518072 0.227530 +0.432594 0.518072 0.227530 +0.448839 0.518072 0.227530 +0.464192 0.518072 0.227530 +0.478729 0.518072 0.227530 +0.492515 0.518072 0.227530 +0.505612 0.518072 0.227530 +0.518072 0.518072 0.227530 +0.529943 0.518072 0.227530 +0.541266 0.518072 0.227530 +0.552083 0.518072 0.227530 +0.562427 0.518072 0.227530 +0.572331 0.518072 0.227530 +0.581823 0.518072 0.227530 +0.590929 0.518072 0.227530 +0.599674 0.518072 0.227530 +0.608079 0.518072 0.227530 +0.616166 0.518072 0.227530 +0.000001 0.529943 0.227530 +0.037293 0.529943 0.227530 +0.079714 0.529943 0.227530 +0.120832 0.529943 0.227530 +0.159284 0.529943 0.227530 +0.194868 0.529943 0.227530 +0.227530 0.529943 0.227530 +0.257434 0.529943 0.227530 +0.285092 0.529943 0.227530 +0.310738 0.529943 0.227530 +0.334585 0.529943 0.227530 +0.356818 0.529943 0.227530 +0.377602 0.529943 0.227530 +0.397079 0.529943 0.227530 +0.415373 0.529943 0.227530 +0.432594 0.529943 0.227530 +0.448839 0.529943 0.227530 +0.464192 0.529943 0.227530 +0.478729 0.529943 0.227530 +0.492515 0.529943 0.227530 +0.505612 0.529943 0.227530 +0.518072 0.529943 0.227530 +0.529943 0.529943 0.227530 +0.541266 0.529943 0.227530 +0.552083 0.529943 0.227530 +0.562427 0.529943 0.227530 +0.572331 0.529943 0.227530 +0.581823 0.529943 0.227530 +0.590929 0.529943 0.227530 +0.599674 0.529943 0.227530 +0.608079 0.529943 0.227530 +0.616166 0.529943 0.227530 +0.000001 0.541266 0.227530 +0.037293 0.541266 0.227530 +0.079714 0.541266 0.227530 +0.120832 0.541266 0.227530 +0.159284 0.541266 0.227530 +0.194868 0.541266 0.227530 +0.227530 0.541266 0.227530 +0.257434 0.541266 0.227530 +0.285092 0.541266 0.227530 +0.310738 0.541266 0.227530 +0.334585 0.541266 0.227530 +0.356818 0.541266 0.227530 +0.377602 0.541266 0.227530 +0.397079 0.541266 0.227530 +0.415373 0.541266 0.227530 +0.432594 0.541266 0.227530 +0.448839 0.541266 0.227530 +0.464192 0.541266 0.227530 +0.478729 0.541266 0.227530 +0.492515 0.541266 0.227530 +0.505612 0.541266 0.227530 +0.518072 0.541266 0.227530 +0.529943 0.541266 0.227530 +0.541266 0.541266 0.227530 +0.552083 0.541266 0.227530 +0.562427 0.541266 0.227530 +0.572331 0.541266 0.227530 +0.581823 0.541266 0.227530 +0.590929 0.541266 0.227530 +0.599674 0.541266 0.227530 +0.608079 0.541266 0.227530 +0.616166 0.541266 0.227530 +0.000001 0.552083 0.227530 +0.037293 0.552083 0.227530 +0.079714 0.552083 0.227530 +0.120832 0.552083 0.227530 +0.159284 0.552083 0.227530 +0.194868 0.552083 0.227530 +0.227530 0.552083 0.227530 +0.257434 0.552083 0.227530 +0.285092 0.552083 0.227530 +0.310738 0.552083 0.227530 +0.334585 0.552083 0.227530 +0.356818 0.552083 0.227530 +0.377602 0.552083 0.227530 +0.397079 0.552083 0.227530 +0.415373 0.552083 0.227530 +0.432594 0.552083 0.227530 +0.448839 0.552083 0.227530 +0.464192 0.552083 0.227530 +0.478729 0.552083 0.227530 +0.492515 0.552083 0.227530 +0.505612 0.552083 0.227530 +0.518072 0.552083 0.227530 +0.529943 0.552083 0.227530 +0.541266 0.552083 0.227530 +0.552083 0.552083 0.227530 +0.562427 0.552083 0.227530 +0.572331 0.552083 0.227530 +0.581823 0.552083 0.227530 +0.590929 0.552083 0.227530 +0.599674 0.552083 0.227530 +0.608079 0.552083 0.227530 +0.616166 0.552083 0.227530 +0.000001 0.562427 0.227530 +0.037293 0.562427 0.227530 +0.079714 0.562427 0.227530 +0.120832 0.562427 0.227530 +0.159284 0.562427 0.227530 +0.194868 0.562427 0.227530 +0.227530 0.562427 0.227530 +0.257434 0.562427 0.227530 +0.285092 0.562427 0.227530 +0.310738 0.562427 0.227530 +0.334585 0.562427 0.227530 +0.356818 0.562427 0.227530 +0.377602 0.562427 0.227530 +0.397079 0.562427 0.227530 +0.415373 0.562427 0.227530 +0.432594 0.562427 0.227530 +0.448839 0.562427 0.227530 +0.464192 0.562427 0.227530 +0.478729 0.562427 0.227530 +0.492515 0.562427 0.227530 +0.505612 0.562427 0.227530 +0.518072 0.562427 0.227530 +0.529943 0.562427 0.227530 +0.541266 0.562427 0.227530 +0.552083 0.562427 0.227530 +0.562427 0.562427 0.227530 +0.572331 0.562427 0.227530 +0.581823 0.562427 0.227530 +0.590929 0.562427 0.227530 +0.599674 0.562427 0.227530 +0.608079 0.562427 0.227530 +0.616166 0.562427 0.227530 +0.000001 0.572331 0.227530 +0.037293 0.572331 0.227530 +0.079714 0.572331 0.227530 +0.120832 0.572331 0.227530 +0.159284 0.572331 0.227530 +0.194868 0.572331 0.227530 +0.227530 0.572331 0.227530 +0.257434 0.572331 0.227530 +0.285092 0.572331 0.227530 +0.310738 0.572331 0.227530 +0.334585 0.572331 0.227530 +0.356818 0.572331 0.227530 +0.377602 0.572331 0.227530 +0.397079 0.572331 0.227530 +0.415373 0.572331 0.227530 +0.432594 0.572331 0.227530 +0.448839 0.572331 0.227530 +0.464192 0.572331 0.227530 +0.478729 0.572331 0.227530 +0.492515 0.572331 0.227530 +0.505612 0.572331 0.227530 +0.518072 0.572331 0.227530 +0.529943 0.572331 0.227530 +0.541266 0.572331 0.227530 +0.552083 0.572331 0.227530 +0.562427 0.572331 0.227530 +0.572331 0.572331 0.227530 +0.581823 0.572331 0.227530 +0.590929 0.572331 0.227530 +0.599674 0.572331 0.227530 +0.608079 0.572331 0.227530 +0.616166 0.572331 0.227530 +0.000001 0.581823 0.227530 +0.037293 0.581823 0.227530 +0.079714 0.581823 0.227530 +0.120832 0.581823 0.227530 +0.159284 0.581823 0.227530 +0.194868 0.581823 0.227530 +0.227530 0.581823 0.227530 +0.257434 0.581823 0.227530 +0.285092 0.581823 0.227530 +0.310738 0.581823 0.227530 +0.334585 0.581823 0.227530 +0.356818 0.581823 0.227530 +0.377602 0.581823 0.227530 +0.397079 0.581823 0.227530 +0.415373 0.581823 0.227530 +0.432594 0.581823 0.227530 +0.448839 0.581823 0.227530 +0.464192 0.581823 0.227530 +0.478729 0.581823 0.227530 +0.492515 0.581823 0.227530 +0.505612 0.581823 0.227530 +0.518072 0.581823 0.227530 +0.529943 0.581823 0.227530 +0.541266 0.581823 0.227530 +0.552083 0.581823 0.227530 +0.562427 0.581823 0.227530 +0.572331 0.581823 0.227530 +0.581823 0.581823 0.227530 +0.590929 0.581823 0.227530 +0.599674 0.581823 0.227530 +0.608079 0.581823 0.227530 +0.616166 0.581823 0.227530 +0.000001 0.590929 0.227530 +0.037293 0.590929 0.227530 +0.079714 0.590929 0.227530 +0.120832 0.590929 0.227530 +0.159284 0.590929 0.227530 +0.194868 0.590929 0.227530 +0.227530 0.590929 0.227530 +0.257434 0.590929 0.227530 +0.285092 0.590929 0.227530 +0.310738 0.590929 0.227530 +0.334585 0.590929 0.227530 +0.356818 0.590929 0.227530 +0.377602 0.590929 0.227530 +0.397079 0.590929 0.227530 +0.415373 0.590929 0.227530 +0.432594 0.590929 0.227530 +0.448839 0.590929 0.227530 +0.464192 0.590929 0.227530 +0.478729 0.590929 0.227530 +0.492515 0.590929 0.227530 +0.505612 0.590929 0.227530 +0.518072 0.590929 0.227530 +0.529943 0.590929 0.227530 +0.541266 0.590929 0.227530 +0.552083 0.590929 0.227530 +0.562427 0.590929 0.227530 +0.572331 0.590929 0.227530 +0.581823 0.590929 0.227530 +0.590929 0.590929 0.227530 +0.599674 0.590929 0.227530 +0.608079 0.590929 0.227530 +0.616166 0.590929 0.227530 +0.000001 0.599674 0.227530 +0.037293 0.599674 0.227530 +0.079714 0.599674 0.227530 +0.120832 0.599674 0.227530 +0.159284 0.599674 0.227530 +0.194868 0.599674 0.227530 +0.227530 0.599674 0.227530 +0.257434 0.599674 0.227530 +0.285092 0.599674 0.227530 +0.310738 0.599674 0.227530 +0.334585 0.599674 0.227530 +0.356818 0.599674 0.227530 +0.377602 0.599674 0.227530 +0.397079 0.599674 0.227530 +0.415373 0.599674 0.227530 +0.432594 0.599674 0.227530 +0.448839 0.599674 0.227530 +0.464192 0.599674 0.227530 +0.478729 0.599674 0.227530 +0.492515 0.599674 0.227530 +0.505612 0.599674 0.227530 +0.518072 0.599674 0.227530 +0.529943 0.599674 0.227530 +0.541266 0.599674 0.227530 +0.552083 0.599674 0.227530 +0.562427 0.599674 0.227530 +0.572331 0.599674 0.227530 +0.581823 0.599674 0.227530 +0.590929 0.599674 0.227530 +0.599674 0.599674 0.227530 +0.608079 0.599674 0.227530 +0.616166 0.599674 0.227530 +0.000001 0.608079 0.227530 +0.037293 0.608079 0.227530 +0.079714 0.608079 0.227530 +0.120832 0.608079 0.227530 +0.159284 0.608079 0.227530 +0.194868 0.608079 0.227530 +0.227530 0.608079 0.227530 +0.257434 0.608079 0.227530 +0.285092 0.608079 0.227530 +0.310738 0.608079 0.227530 +0.334585 0.608079 0.227530 +0.356818 0.608079 0.227530 +0.377602 0.608079 0.227530 +0.397079 0.608079 0.227530 +0.415373 0.608079 0.227530 +0.432594 0.608079 0.227530 +0.448839 0.608079 0.227530 +0.464192 0.608079 0.227530 +0.478729 0.608079 0.227530 +0.492515 0.608079 0.227530 +0.505612 0.608079 0.227530 +0.518072 0.608079 0.227530 +0.529943 0.608079 0.227530 +0.541266 0.608079 0.227530 +0.552083 0.608079 0.227530 +0.562427 0.608079 0.227530 +0.572331 0.608079 0.227530 +0.581823 0.608079 0.227530 +0.590929 0.608079 0.227530 +0.599674 0.608079 0.227530 +0.608079 0.608079 0.227530 +0.616166 0.608079 0.227530 +0.000001 0.616166 0.227530 +0.037293 0.616166 0.227530 +0.079714 0.616166 0.227530 +0.120832 0.616166 0.227530 +0.159284 0.616166 0.227530 +0.194868 0.616166 0.227530 +0.227530 0.616166 0.227530 +0.257434 0.616166 0.227530 +0.285092 0.616166 0.227530 +0.310738 0.616166 0.227530 +0.334585 0.616166 0.227530 +0.356818 0.616166 0.227530 +0.377602 0.616166 0.227530 +0.397079 0.616166 0.227530 +0.415373 0.616166 0.227530 +0.432594 0.616166 0.227530 +0.448839 0.616166 0.227530 +0.464192 0.616166 0.227530 +0.478729 0.616166 0.227530 +0.492515 0.616166 0.227530 +0.505612 0.616166 0.227530 +0.518072 0.616166 0.227530 +0.529943 0.616166 0.227530 +0.541266 0.616166 0.227530 +0.552083 0.616166 0.227530 +0.562427 0.616166 0.227530 +0.572331 0.616166 0.227530 +0.581823 0.616166 0.227530 +0.590929 0.616166 0.227530 +0.599674 0.616166 0.227530 +0.608079 0.616166 0.227530 +0.616166 0.616166 0.227530 +0.000001 0.000001 0.257434 +0.037293 0.000001 0.257434 +0.079714 0.000001 0.257434 +0.120832 0.000001 0.257434 +0.159284 0.000001 0.257434 +0.194868 0.000001 0.257434 +0.227530 0.000001 0.257434 +0.257434 0.000001 0.257434 +0.285092 0.000001 0.257434 +0.310738 0.000001 0.257434 +0.334585 0.000001 0.257434 +0.356818 0.000001 0.257434 +0.377602 0.000001 0.257434 +0.397079 0.000001 0.257434 +0.415373 0.000001 0.257434 +0.432594 0.000001 0.257434 +0.448839 0.000001 0.257434 +0.464192 0.000001 0.257434 +0.478729 0.000001 0.257434 +0.492515 0.000001 0.257434 +0.505612 0.000001 0.257434 +0.518072 0.000001 0.257434 +0.529943 0.000001 0.257434 +0.541266 0.000001 0.257434 +0.552083 0.000001 0.257434 +0.562427 0.000001 0.257434 +0.572331 0.000001 0.257434 +0.581823 0.000001 0.257434 +0.590929 0.000001 0.257434 +0.599674 0.000001 0.257434 +0.608079 0.000001 0.257434 +0.616166 0.000001 0.257434 +0.000001 0.037293 0.257434 +0.037293 0.037293 0.257434 +0.079714 0.037293 0.257434 +0.120832 0.037293 0.257434 +0.159284 0.037293 0.257434 +0.194868 0.037293 0.257434 +0.227530 0.037293 0.257434 +0.257434 0.037293 0.257434 +0.285092 0.037293 0.257434 +0.310738 0.037293 0.257434 +0.334585 0.037293 0.257434 +0.356818 0.037293 0.257434 +0.377602 0.037293 0.257434 +0.397079 0.037293 0.257434 +0.415373 0.037293 0.257434 +0.432594 0.037293 0.257434 +0.448839 0.037293 0.257434 +0.464192 0.037293 0.257434 +0.478729 0.037293 0.257434 +0.492515 0.037293 0.257434 +0.505612 0.037293 0.257434 +0.518072 0.037293 0.257434 +0.529943 0.037293 0.257434 +0.541266 0.037293 0.257434 +0.552083 0.037293 0.257434 +0.562427 0.037293 0.257434 +0.572331 0.037293 0.257434 +0.581823 0.037293 0.257434 +0.590929 0.037293 0.257434 +0.599674 0.037293 0.257434 +0.608079 0.037293 0.257434 +0.616166 0.037293 0.257434 +0.000001 0.079714 0.257434 +0.037293 0.079714 0.257434 +0.079714 0.079714 0.257434 +0.120832 0.079714 0.257434 +0.159284 0.079714 0.257434 +0.194868 0.079714 0.257434 +0.227530 0.079714 0.257434 +0.257434 0.079714 0.257434 +0.285092 0.079714 0.257434 +0.310738 0.079714 0.257434 +0.334585 0.079714 0.257434 +0.356818 0.079714 0.257434 +0.377602 0.079714 0.257434 +0.397079 0.079714 0.257434 +0.415373 0.079714 0.257434 +0.432594 0.079714 0.257434 +0.448839 0.079714 0.257434 +0.464192 0.079714 0.257434 +0.478729 0.079714 0.257434 +0.492515 0.079714 0.257434 +0.505612 0.079714 0.257434 +0.518072 0.079714 0.257434 +0.529943 0.079714 0.257434 +0.541266 0.079714 0.257434 +0.552083 0.079714 0.257434 +0.562427 0.079714 0.257434 +0.572331 0.079714 0.257434 +0.581823 0.079714 0.257434 +0.590929 0.079714 0.257434 +0.599674 0.079714 0.257434 +0.608079 0.079714 0.257434 +0.616166 0.079714 0.257434 +0.000001 0.120832 0.257434 +0.037293 0.120832 0.257434 +0.079714 0.120832 0.257434 +0.120832 0.120832 0.257434 +0.159284 0.120832 0.257434 +0.194868 0.120832 0.257434 +0.227530 0.120832 0.257434 +0.257434 0.120832 0.257434 +0.285092 0.120832 0.257434 +0.310738 0.120832 0.257434 +0.334585 0.120832 0.257434 +0.356818 0.120832 0.257434 +0.377602 0.120832 0.257434 +0.397079 0.120832 0.257434 +0.415373 0.120832 0.257434 +0.432594 0.120832 0.257434 +0.448839 0.120832 0.257434 +0.464192 0.120832 0.257434 +0.478729 0.120832 0.257434 +0.492515 0.120832 0.257434 +0.505612 0.120832 0.257434 +0.518072 0.120832 0.257434 +0.529943 0.120832 0.257434 +0.541266 0.120832 0.257434 +0.552083 0.120832 0.257434 +0.562427 0.120832 0.257434 +0.572331 0.120832 0.257434 +0.581823 0.120832 0.257434 +0.590929 0.120832 0.257434 +0.599674 0.120832 0.257434 +0.608079 0.120832 0.257434 +0.616166 0.120832 0.257434 +0.000001 0.159284 0.257434 +0.037293 0.159284 0.257434 +0.079714 0.159284 0.257434 +0.120832 0.159284 0.257434 +0.159284 0.159284 0.257434 +0.194868 0.159284 0.257434 +0.227530 0.159284 0.257434 +0.257434 0.159284 0.257434 +0.285092 0.159284 0.257434 +0.310738 0.159284 0.257434 +0.334585 0.159284 0.257434 +0.356818 0.159284 0.257434 +0.377602 0.159284 0.257434 +0.397079 0.159284 0.257434 +0.415373 0.159284 0.257434 +0.432594 0.159284 0.257434 +0.448839 0.159284 0.257434 +0.464192 0.159284 0.257434 +0.478729 0.159284 0.257434 +0.492515 0.159284 0.257434 +0.505612 0.159284 0.257434 +0.518072 0.159284 0.257434 +0.529943 0.159284 0.257434 +0.541266 0.159284 0.257434 +0.552083 0.159284 0.257434 +0.562427 0.159284 0.257434 +0.572331 0.159284 0.257434 +0.581823 0.159284 0.257434 +0.590929 0.159284 0.257434 +0.599674 0.159284 0.257434 +0.608079 0.159284 0.257434 +0.616166 0.159284 0.257434 +0.000001 0.194868 0.257434 +0.037293 0.194868 0.257434 +0.079714 0.194868 0.257434 +0.120832 0.194868 0.257434 +0.159284 0.194868 0.257434 +0.194868 0.194868 0.257434 +0.227530 0.194868 0.257434 +0.257434 0.194868 0.257434 +0.285092 0.194868 0.257434 +0.310738 0.194868 0.257434 +0.334585 0.194868 0.257434 +0.356818 0.194868 0.257434 +0.377602 0.194868 0.257434 +0.397079 0.194868 0.257434 +0.415373 0.194868 0.257434 +0.432594 0.194868 0.257434 +0.448839 0.194868 0.257434 +0.464192 0.194868 0.257434 +0.478729 0.194868 0.257434 +0.492515 0.194868 0.257434 +0.505612 0.194868 0.257434 +0.518072 0.194868 0.257434 +0.529943 0.194868 0.257434 +0.541266 0.194868 0.257434 +0.552083 0.194868 0.257434 +0.562427 0.194868 0.257434 +0.572331 0.194868 0.257434 +0.581823 0.194868 0.257434 +0.590929 0.194868 0.257434 +0.599674 0.194868 0.257434 +0.608079 0.194868 0.257434 +0.616166 0.194868 0.257434 +0.000001 0.227530 0.257434 +0.037293 0.227530 0.257434 +0.079714 0.227530 0.257434 +0.120832 0.227530 0.257434 +0.159284 0.227530 0.257434 +0.194868 0.227530 0.257434 +0.227530 0.227530 0.257434 +0.257434 0.227530 0.257434 +0.285092 0.227530 0.257434 +0.310738 0.227530 0.257434 +0.334585 0.227530 0.257434 +0.356818 0.227530 0.257434 +0.377602 0.227530 0.257434 +0.397079 0.227530 0.257434 +0.415373 0.227530 0.257434 +0.432594 0.227530 0.257434 +0.448839 0.227530 0.257434 +0.464192 0.227530 0.257434 +0.478729 0.227530 0.257434 +0.492515 0.227530 0.257434 +0.505612 0.227530 0.257434 +0.518072 0.227530 0.257434 +0.529943 0.227530 0.257434 +0.541266 0.227530 0.257434 +0.552083 0.227530 0.257434 +0.562427 0.227530 0.257434 +0.572331 0.227530 0.257434 +0.581823 0.227530 0.257434 +0.590929 0.227530 0.257434 +0.599674 0.227530 0.257434 +0.608079 0.227530 0.257434 +0.616166 0.227530 0.257434 +0.000001 0.257434 0.257434 +0.037293 0.257434 0.257434 +0.079714 0.257434 0.257434 +0.120832 0.257434 0.257434 +0.159284 0.257434 0.257434 +0.194868 0.257434 0.257434 +0.227530 0.257434 0.257434 +0.257434 0.257434 0.257434 +0.285092 0.257434 0.257434 +0.310738 0.257434 0.257434 +0.334585 0.257434 0.257434 +0.356818 0.257434 0.257434 +0.377602 0.257434 0.257434 +0.397079 0.257434 0.257434 +0.415373 0.257434 0.257434 +0.432594 0.257434 0.257434 +0.448839 0.257434 0.257434 +0.464192 0.257434 0.257434 +0.478729 0.257434 0.257434 +0.492515 0.257434 0.257434 +0.505612 0.257434 0.257434 +0.518072 0.257434 0.257434 +0.529943 0.257434 0.257434 +0.541266 0.257434 0.257434 +0.552083 0.257434 0.257434 +0.562427 0.257434 0.257434 +0.572331 0.257434 0.257434 +0.581823 0.257434 0.257434 +0.590929 0.257434 0.257434 +0.599674 0.257434 0.257434 +0.608079 0.257434 0.257434 +0.616166 0.257434 0.257434 +0.000001 0.285092 0.257434 +0.037293 0.285092 0.257434 +0.079714 0.285092 0.257434 +0.120832 0.285092 0.257434 +0.159284 0.285092 0.257434 +0.194868 0.285092 0.257434 +0.227530 0.285092 0.257434 +0.257434 0.285092 0.257434 +0.285092 0.285092 0.257434 +0.310738 0.285092 0.257434 +0.334585 0.285092 0.257434 +0.356818 0.285092 0.257434 +0.377602 0.285092 0.257434 +0.397079 0.285092 0.257434 +0.415373 0.285092 0.257434 +0.432594 0.285092 0.257434 +0.448839 0.285092 0.257434 +0.464192 0.285092 0.257434 +0.478729 0.285092 0.257434 +0.492515 0.285092 0.257434 +0.505612 0.285092 0.257434 +0.518072 0.285092 0.257434 +0.529943 0.285092 0.257434 +0.541266 0.285092 0.257434 +0.552083 0.285092 0.257434 +0.562427 0.285092 0.257434 +0.572331 0.285092 0.257434 +0.581823 0.285092 0.257434 +0.590929 0.285092 0.257434 +0.599674 0.285092 0.257434 +0.608079 0.285092 0.257434 +0.616166 0.285092 0.257434 +0.000001 0.310738 0.257434 +0.037293 0.310738 0.257434 +0.079714 0.310738 0.257434 +0.120832 0.310738 0.257434 +0.159284 0.310738 0.257434 +0.194868 0.310738 0.257434 +0.227530 0.310738 0.257434 +0.257434 0.310738 0.257434 +0.285092 0.310738 0.257434 +0.310738 0.310738 0.257434 +0.334585 0.310738 0.257434 +0.356818 0.310738 0.257434 +0.377602 0.310738 0.257434 +0.397079 0.310738 0.257434 +0.415373 0.310738 0.257434 +0.432594 0.310738 0.257434 +0.448839 0.310738 0.257434 +0.464192 0.310738 0.257434 +0.478729 0.310738 0.257434 +0.492515 0.310738 0.257434 +0.505612 0.310738 0.257434 +0.518072 0.310738 0.257434 +0.529943 0.310738 0.257434 +0.541266 0.310738 0.257434 +0.552083 0.310738 0.257434 +0.562427 0.310738 0.257434 +0.572331 0.310738 0.257434 +0.581823 0.310738 0.257434 +0.590929 0.310738 0.257434 +0.599674 0.310738 0.257434 +0.608079 0.310738 0.257434 +0.616166 0.310738 0.257434 +0.000001 0.334585 0.257434 +0.037293 0.334585 0.257434 +0.079714 0.334585 0.257434 +0.120832 0.334585 0.257434 +0.159284 0.334585 0.257434 +0.194868 0.334585 0.257434 +0.227530 0.334585 0.257434 +0.257434 0.334585 0.257434 +0.285092 0.334585 0.257434 +0.310738 0.334585 0.257434 +0.334585 0.334585 0.257434 +0.356818 0.334585 0.257434 +0.377602 0.334585 0.257434 +0.397079 0.334585 0.257434 +0.415373 0.334585 0.257434 +0.432594 0.334585 0.257434 +0.448839 0.334585 0.257434 +0.464192 0.334585 0.257434 +0.478729 0.334585 0.257434 +0.492515 0.334585 0.257434 +0.505612 0.334585 0.257434 +0.518072 0.334585 0.257434 +0.529943 0.334585 0.257434 +0.541266 0.334585 0.257434 +0.552083 0.334585 0.257434 +0.562427 0.334585 0.257434 +0.572331 0.334585 0.257434 +0.581823 0.334585 0.257434 +0.590929 0.334585 0.257434 +0.599674 0.334585 0.257434 +0.608079 0.334585 0.257434 +0.616166 0.334585 0.257434 +0.000001 0.356818 0.257434 +0.037293 0.356818 0.257434 +0.079714 0.356818 0.257434 +0.120832 0.356818 0.257434 +0.159284 0.356818 0.257434 +0.194868 0.356818 0.257434 +0.227530 0.356818 0.257434 +0.257434 0.356818 0.257434 +0.285092 0.356818 0.257434 +0.310738 0.356818 0.257434 +0.334585 0.356818 0.257434 +0.356818 0.356818 0.257434 +0.377602 0.356818 0.257434 +0.397079 0.356818 0.257434 +0.415373 0.356818 0.257434 +0.432594 0.356818 0.257434 +0.448839 0.356818 0.257434 +0.464192 0.356818 0.257434 +0.478729 0.356818 0.257434 +0.492515 0.356818 0.257434 +0.505612 0.356818 0.257434 +0.518072 0.356818 0.257434 +0.529943 0.356818 0.257434 +0.541266 0.356818 0.257434 +0.552083 0.356818 0.257434 +0.562427 0.356818 0.257434 +0.572331 0.356818 0.257434 +0.581823 0.356818 0.257434 +0.590929 0.356818 0.257434 +0.599674 0.356818 0.257434 +0.608079 0.356818 0.257434 +0.616166 0.356818 0.257434 +0.000001 0.377602 0.257434 +0.037293 0.377602 0.257434 +0.079714 0.377602 0.257434 +0.120832 0.377602 0.257434 +0.159284 0.377602 0.257434 +0.194868 0.377602 0.257434 +0.227530 0.377602 0.257434 +0.257434 0.377602 0.257434 +0.285092 0.377602 0.257434 +0.310738 0.377602 0.257434 +0.334585 0.377602 0.257434 +0.356818 0.377602 0.257434 +0.377602 0.377602 0.257434 +0.397079 0.377602 0.257434 +0.415373 0.377602 0.257434 +0.432594 0.377602 0.257434 +0.448839 0.377602 0.257434 +0.464192 0.377602 0.257434 +0.478729 0.377602 0.257434 +0.492515 0.377602 0.257434 +0.505612 0.377602 0.257434 +0.518072 0.377602 0.257434 +0.529943 0.377602 0.257434 +0.541266 0.377602 0.257434 +0.552083 0.377602 0.257434 +0.562427 0.377602 0.257434 +0.572331 0.377602 0.257434 +0.581823 0.377602 0.257434 +0.590929 0.377602 0.257434 +0.599674 0.377602 0.257434 +0.608079 0.377602 0.257434 +0.616166 0.377602 0.257434 +0.000001 0.397079 0.257434 +0.037293 0.397079 0.257434 +0.079714 0.397079 0.257434 +0.120832 0.397079 0.257434 +0.159284 0.397079 0.257434 +0.194868 0.397079 0.257434 +0.227530 0.397079 0.257434 +0.257434 0.397079 0.257434 +0.285092 0.397079 0.257434 +0.310738 0.397079 0.257434 +0.334585 0.397079 0.257434 +0.356818 0.397079 0.257434 +0.377602 0.397079 0.257434 +0.397079 0.397079 0.257434 +0.415373 0.397079 0.257434 +0.432594 0.397079 0.257434 +0.448839 0.397079 0.257434 +0.464192 0.397079 0.257434 +0.478729 0.397079 0.257434 +0.492515 0.397079 0.257434 +0.505612 0.397079 0.257434 +0.518072 0.397079 0.257434 +0.529943 0.397079 0.257434 +0.541266 0.397079 0.257434 +0.552083 0.397079 0.257434 +0.562427 0.397079 0.257434 +0.572331 0.397079 0.257434 +0.581823 0.397079 0.257434 +0.590929 0.397079 0.257434 +0.599674 0.397079 0.257434 +0.608079 0.397079 0.257434 +0.616166 0.397079 0.257434 +0.000001 0.415373 0.257434 +0.037293 0.415373 0.257434 +0.079714 0.415373 0.257434 +0.120832 0.415373 0.257434 +0.159284 0.415373 0.257434 +0.194868 0.415373 0.257434 +0.227530 0.415373 0.257434 +0.257434 0.415373 0.257434 +0.285092 0.415373 0.257434 +0.310738 0.415373 0.257434 +0.334585 0.415373 0.257434 +0.356818 0.415373 0.257434 +0.377602 0.415373 0.257434 +0.397079 0.415373 0.257434 +0.415373 0.415373 0.257434 +0.432594 0.415373 0.257434 +0.448839 0.415373 0.257434 +0.464192 0.415373 0.257434 +0.478729 0.415373 0.257434 +0.492515 0.415373 0.257434 +0.505612 0.415373 0.257434 +0.518072 0.415373 0.257434 +0.529943 0.415373 0.257434 +0.541266 0.415373 0.257434 +0.552083 0.415373 0.257434 +0.562427 0.415373 0.257434 +0.572331 0.415373 0.257434 +0.581823 0.415373 0.257434 +0.590929 0.415373 0.257434 +0.599674 0.415373 0.257434 +0.608079 0.415373 0.257434 +0.616166 0.415373 0.257434 +0.000001 0.432594 0.257434 +0.037293 0.432594 0.257434 +0.079714 0.432594 0.257434 +0.120832 0.432594 0.257434 +0.159284 0.432594 0.257434 +0.194868 0.432594 0.257434 +0.227530 0.432594 0.257434 +0.257434 0.432594 0.257434 +0.285092 0.432594 0.257434 +0.310738 0.432594 0.257434 +0.334585 0.432594 0.257434 +0.356818 0.432594 0.257434 +0.377602 0.432594 0.257434 +0.397079 0.432594 0.257434 +0.415373 0.432594 0.257434 +0.432594 0.432594 0.257434 +0.448839 0.432594 0.257434 +0.464192 0.432594 0.257434 +0.478729 0.432594 0.257434 +0.492515 0.432594 0.257434 +0.505612 0.432594 0.257434 +0.518072 0.432594 0.257434 +0.529943 0.432594 0.257434 +0.541266 0.432594 0.257434 +0.552083 0.432594 0.257434 +0.562427 0.432594 0.257434 +0.572331 0.432594 0.257434 +0.581823 0.432594 0.257434 +0.590929 0.432594 0.257434 +0.599674 0.432594 0.257434 +0.608079 0.432594 0.257434 +0.616166 0.432594 0.257434 +0.000001 0.448839 0.257434 +0.037293 0.448839 0.257434 +0.079714 0.448839 0.257434 +0.120832 0.448839 0.257434 +0.159284 0.448839 0.257434 +0.194868 0.448839 0.257434 +0.227530 0.448839 0.257434 +0.257434 0.448839 0.257434 +0.285092 0.448839 0.257434 +0.310738 0.448839 0.257434 +0.334585 0.448839 0.257434 +0.356818 0.448839 0.257434 +0.377602 0.448839 0.257434 +0.397079 0.448839 0.257434 +0.415373 0.448839 0.257434 +0.432594 0.448839 0.257434 +0.448839 0.448839 0.257434 +0.464192 0.448839 0.257434 +0.478729 0.448839 0.257434 +0.492515 0.448839 0.257434 +0.505612 0.448839 0.257434 +0.518072 0.448839 0.257434 +0.529943 0.448839 0.257434 +0.541266 0.448839 0.257434 +0.552083 0.448839 0.257434 +0.562427 0.448839 0.257434 +0.572331 0.448839 0.257434 +0.581823 0.448839 0.257434 +0.590929 0.448839 0.257434 +0.599674 0.448839 0.257434 +0.608079 0.448839 0.257434 +0.616166 0.448839 0.257434 +0.000001 0.464192 0.257434 +0.037293 0.464192 0.257434 +0.079714 0.464192 0.257434 +0.120832 0.464192 0.257434 +0.159284 0.464192 0.257434 +0.194868 0.464192 0.257434 +0.227530 0.464192 0.257434 +0.257434 0.464192 0.257434 +0.285092 0.464192 0.257434 +0.310738 0.464192 0.257434 +0.334585 0.464192 0.257434 +0.356818 0.464192 0.257434 +0.377602 0.464192 0.257434 +0.397079 0.464192 0.257434 +0.415373 0.464192 0.257434 +0.432594 0.464192 0.257434 +0.448839 0.464192 0.257434 +0.464192 0.464192 0.257434 +0.478729 0.464192 0.257434 +0.492515 0.464192 0.257434 +0.505612 0.464192 0.257434 +0.518072 0.464192 0.257434 +0.529943 0.464192 0.257434 +0.541266 0.464192 0.257434 +0.552083 0.464192 0.257434 +0.562427 0.464192 0.257434 +0.572331 0.464192 0.257434 +0.581823 0.464192 0.257434 +0.590929 0.464192 0.257434 +0.599674 0.464192 0.257434 +0.608079 0.464192 0.257434 +0.616166 0.464192 0.257434 +0.000001 0.478729 0.257434 +0.037293 0.478729 0.257434 +0.079714 0.478729 0.257434 +0.120832 0.478729 0.257434 +0.159284 0.478729 0.257434 +0.194868 0.478729 0.257434 +0.227530 0.478729 0.257434 +0.257434 0.478729 0.257434 +0.285092 0.478729 0.257434 +0.310738 0.478729 0.257434 +0.334585 0.478729 0.257434 +0.356818 0.478729 0.257434 +0.377602 0.478729 0.257434 +0.397079 0.478729 0.257434 +0.415373 0.478729 0.257434 +0.432594 0.478729 0.257434 +0.448839 0.478729 0.257434 +0.464192 0.478729 0.257434 +0.478729 0.478729 0.257434 +0.492515 0.478729 0.257434 +0.505612 0.478729 0.257434 +0.518072 0.478729 0.257434 +0.529943 0.478729 0.257434 +0.541266 0.478729 0.257434 +0.552083 0.478729 0.257434 +0.562427 0.478729 0.257434 +0.572331 0.478729 0.257434 +0.581823 0.478729 0.257434 +0.590929 0.478729 0.257434 +0.599674 0.478729 0.257434 +0.608079 0.478729 0.257434 +0.616166 0.478729 0.257434 +0.000001 0.492515 0.257434 +0.037293 0.492515 0.257434 +0.079714 0.492515 0.257434 +0.120832 0.492515 0.257434 +0.159284 0.492515 0.257434 +0.194868 0.492515 0.257434 +0.227530 0.492515 0.257434 +0.257434 0.492515 0.257434 +0.285092 0.492515 0.257434 +0.310738 0.492515 0.257434 +0.334585 0.492515 0.257434 +0.356818 0.492515 0.257434 +0.377602 0.492515 0.257434 +0.397079 0.492515 0.257434 +0.415373 0.492515 0.257434 +0.432594 0.492515 0.257434 +0.448839 0.492515 0.257434 +0.464192 0.492515 0.257434 +0.478729 0.492515 0.257434 +0.492515 0.492515 0.257434 +0.505612 0.492515 0.257434 +0.518072 0.492515 0.257434 +0.529943 0.492515 0.257434 +0.541266 0.492515 0.257434 +0.552083 0.492515 0.257434 +0.562427 0.492515 0.257434 +0.572331 0.492515 0.257434 +0.581823 0.492515 0.257434 +0.590929 0.492515 0.257434 +0.599674 0.492515 0.257434 +0.608079 0.492515 0.257434 +0.616166 0.492515 0.257434 +0.000001 0.505612 0.257434 +0.037293 0.505612 0.257434 +0.079714 0.505612 0.257434 +0.120832 0.505612 0.257434 +0.159284 0.505612 0.257434 +0.194868 0.505612 0.257434 +0.227530 0.505612 0.257434 +0.257434 0.505612 0.257434 +0.285092 0.505612 0.257434 +0.310738 0.505612 0.257434 +0.334585 0.505612 0.257434 +0.356818 0.505612 0.257434 +0.377602 0.505612 0.257434 +0.397079 0.505612 0.257434 +0.415373 0.505612 0.257434 +0.432594 0.505612 0.257434 +0.448839 0.505612 0.257434 +0.464192 0.505612 0.257434 +0.478729 0.505612 0.257434 +0.492515 0.505612 0.257434 +0.505612 0.505612 0.257434 +0.518072 0.505612 0.257434 +0.529943 0.505612 0.257434 +0.541266 0.505612 0.257434 +0.552083 0.505612 0.257434 +0.562427 0.505612 0.257434 +0.572331 0.505612 0.257434 +0.581823 0.505612 0.257434 +0.590929 0.505612 0.257434 +0.599674 0.505612 0.257434 +0.608079 0.505612 0.257434 +0.616166 0.505612 0.257434 +0.000001 0.518072 0.257434 +0.037293 0.518072 0.257434 +0.079714 0.518072 0.257434 +0.120832 0.518072 0.257434 +0.159284 0.518072 0.257434 +0.194868 0.518072 0.257434 +0.227530 0.518072 0.257434 +0.257434 0.518072 0.257434 +0.285092 0.518072 0.257434 +0.310738 0.518072 0.257434 +0.334585 0.518072 0.257434 +0.356818 0.518072 0.257434 +0.377602 0.518072 0.257434 +0.397079 0.518072 0.257434 +0.415373 0.518072 0.257434 +0.432594 0.518072 0.257434 +0.448839 0.518072 0.257434 +0.464192 0.518072 0.257434 +0.478729 0.518072 0.257434 +0.492515 0.518072 0.257434 +0.505612 0.518072 0.257434 +0.518072 0.518072 0.257434 +0.529943 0.518072 0.257434 +0.541266 0.518072 0.257434 +0.552083 0.518072 0.257434 +0.562427 0.518072 0.257434 +0.572331 0.518072 0.257434 +0.581823 0.518072 0.257434 +0.590929 0.518072 0.257434 +0.599674 0.518072 0.257434 +0.608079 0.518072 0.257434 +0.616166 0.518072 0.257434 +0.000001 0.529943 0.257434 +0.037293 0.529943 0.257434 +0.079714 0.529943 0.257434 +0.120832 0.529943 0.257434 +0.159284 0.529943 0.257434 +0.194868 0.529943 0.257434 +0.227530 0.529943 0.257434 +0.257434 0.529943 0.257434 +0.285092 0.529943 0.257434 +0.310738 0.529943 0.257434 +0.334585 0.529943 0.257434 +0.356818 0.529943 0.257434 +0.377602 0.529943 0.257434 +0.397079 0.529943 0.257434 +0.415373 0.529943 0.257434 +0.432594 0.529943 0.257434 +0.448839 0.529943 0.257434 +0.464192 0.529943 0.257434 +0.478729 0.529943 0.257434 +0.492515 0.529943 0.257434 +0.505612 0.529943 0.257434 +0.518072 0.529943 0.257434 +0.529943 0.529943 0.257434 +0.541266 0.529943 0.257434 +0.552083 0.529943 0.257434 +0.562427 0.529943 0.257434 +0.572331 0.529943 0.257434 +0.581823 0.529943 0.257434 +0.590929 0.529943 0.257434 +0.599674 0.529943 0.257434 +0.608079 0.529943 0.257434 +0.616166 0.529943 0.257434 +0.000001 0.541266 0.257434 +0.037293 0.541266 0.257434 +0.079714 0.541266 0.257434 +0.120832 0.541266 0.257434 +0.159284 0.541266 0.257434 +0.194868 0.541266 0.257434 +0.227530 0.541266 0.257434 +0.257434 0.541266 0.257434 +0.285092 0.541266 0.257434 +0.310738 0.541266 0.257434 +0.334585 0.541266 0.257434 +0.356818 0.541266 0.257434 +0.377602 0.541266 0.257434 +0.397079 0.541266 0.257434 +0.415373 0.541266 0.257434 +0.432594 0.541266 0.257434 +0.448839 0.541266 0.257434 +0.464192 0.541266 0.257434 +0.478729 0.541266 0.257434 +0.492515 0.541266 0.257434 +0.505612 0.541266 0.257434 +0.518072 0.541266 0.257434 +0.529943 0.541266 0.257434 +0.541266 0.541266 0.257434 +0.552083 0.541266 0.257434 +0.562427 0.541266 0.257434 +0.572331 0.541266 0.257434 +0.581823 0.541266 0.257434 +0.590929 0.541266 0.257434 +0.599674 0.541266 0.257434 +0.608079 0.541266 0.257434 +0.616166 0.541266 0.257434 +0.000001 0.552083 0.257434 +0.037293 0.552083 0.257434 +0.079714 0.552083 0.257434 +0.120832 0.552083 0.257434 +0.159284 0.552083 0.257434 +0.194868 0.552083 0.257434 +0.227530 0.552083 0.257434 +0.257434 0.552083 0.257434 +0.285092 0.552083 0.257434 +0.310738 0.552083 0.257434 +0.334585 0.552083 0.257434 +0.356818 0.552083 0.257434 +0.377602 0.552083 0.257434 +0.397079 0.552083 0.257434 +0.415373 0.552083 0.257434 +0.432594 0.552083 0.257434 +0.448839 0.552083 0.257434 +0.464192 0.552083 0.257434 +0.478729 0.552083 0.257434 +0.492515 0.552083 0.257434 +0.505612 0.552083 0.257434 +0.518072 0.552083 0.257434 +0.529943 0.552083 0.257434 +0.541266 0.552083 0.257434 +0.552083 0.552083 0.257434 +0.562427 0.552083 0.257434 +0.572331 0.552083 0.257434 +0.581823 0.552083 0.257434 +0.590929 0.552083 0.257434 +0.599674 0.552083 0.257434 +0.608079 0.552083 0.257434 +0.616166 0.552083 0.257434 +0.000001 0.562427 0.257434 +0.037293 0.562427 0.257434 +0.079714 0.562427 0.257434 +0.120832 0.562427 0.257434 +0.159284 0.562427 0.257434 +0.194868 0.562427 0.257434 +0.227530 0.562427 0.257434 +0.257434 0.562427 0.257434 +0.285092 0.562427 0.257434 +0.310738 0.562427 0.257434 +0.334585 0.562427 0.257434 +0.356818 0.562427 0.257434 +0.377602 0.562427 0.257434 +0.397079 0.562427 0.257434 +0.415373 0.562427 0.257434 +0.432594 0.562427 0.257434 +0.448839 0.562427 0.257434 +0.464192 0.562427 0.257434 +0.478729 0.562427 0.257434 +0.492515 0.562427 0.257434 +0.505612 0.562427 0.257434 +0.518072 0.562427 0.257434 +0.529943 0.562427 0.257434 +0.541266 0.562427 0.257434 +0.552083 0.562427 0.257434 +0.562427 0.562427 0.257434 +0.572331 0.562427 0.257434 +0.581823 0.562427 0.257434 +0.590929 0.562427 0.257434 +0.599674 0.562427 0.257434 +0.608079 0.562427 0.257434 +0.616166 0.562427 0.257434 +0.000001 0.572331 0.257434 +0.037293 0.572331 0.257434 +0.079714 0.572331 0.257434 +0.120832 0.572331 0.257434 +0.159284 0.572331 0.257434 +0.194868 0.572331 0.257434 +0.227530 0.572331 0.257434 +0.257434 0.572331 0.257434 +0.285092 0.572331 0.257434 +0.310738 0.572331 0.257434 +0.334585 0.572331 0.257434 +0.356818 0.572331 0.257434 +0.377602 0.572331 0.257434 +0.397079 0.572331 0.257434 +0.415373 0.572331 0.257434 +0.432594 0.572331 0.257434 +0.448839 0.572331 0.257434 +0.464192 0.572331 0.257434 +0.478729 0.572331 0.257434 +0.492515 0.572331 0.257434 +0.505612 0.572331 0.257434 +0.518072 0.572331 0.257434 +0.529943 0.572331 0.257434 +0.541266 0.572331 0.257434 +0.552083 0.572331 0.257434 +0.562427 0.572331 0.257434 +0.572331 0.572331 0.257434 +0.581823 0.572331 0.257434 +0.590929 0.572331 0.257434 +0.599674 0.572331 0.257434 +0.608079 0.572331 0.257434 +0.616166 0.572331 0.257434 +0.000001 0.581823 0.257434 +0.037293 0.581823 0.257434 +0.079714 0.581823 0.257434 +0.120832 0.581823 0.257434 +0.159284 0.581823 0.257434 +0.194868 0.581823 0.257434 +0.227530 0.581823 0.257434 +0.257434 0.581823 0.257434 +0.285092 0.581823 0.257434 +0.310738 0.581823 0.257434 +0.334585 0.581823 0.257434 +0.356818 0.581823 0.257434 +0.377602 0.581823 0.257434 +0.397079 0.581823 0.257434 +0.415373 0.581823 0.257434 +0.432594 0.581823 0.257434 +0.448839 0.581823 0.257434 +0.464192 0.581823 0.257434 +0.478729 0.581823 0.257434 +0.492515 0.581823 0.257434 +0.505612 0.581823 0.257434 +0.518072 0.581823 0.257434 +0.529943 0.581823 0.257434 +0.541266 0.581823 0.257434 +0.552083 0.581823 0.257434 +0.562427 0.581823 0.257434 +0.572331 0.581823 0.257434 +0.581823 0.581823 0.257434 +0.590929 0.581823 0.257434 +0.599674 0.581823 0.257434 +0.608079 0.581823 0.257434 +0.616166 0.581823 0.257434 +0.000001 0.590929 0.257434 +0.037293 0.590929 0.257434 +0.079714 0.590929 0.257434 +0.120832 0.590929 0.257434 +0.159284 0.590929 0.257434 +0.194868 0.590929 0.257434 +0.227530 0.590929 0.257434 +0.257434 0.590929 0.257434 +0.285092 0.590929 0.257434 +0.310738 0.590929 0.257434 +0.334585 0.590929 0.257434 +0.356818 0.590929 0.257434 +0.377602 0.590929 0.257434 +0.397079 0.590929 0.257434 +0.415373 0.590929 0.257434 +0.432594 0.590929 0.257434 +0.448839 0.590929 0.257434 +0.464192 0.590929 0.257434 +0.478729 0.590929 0.257434 +0.492515 0.590929 0.257434 +0.505612 0.590929 0.257434 +0.518072 0.590929 0.257434 +0.529943 0.590929 0.257434 +0.541266 0.590929 0.257434 +0.552083 0.590929 0.257434 +0.562427 0.590929 0.257434 +0.572331 0.590929 0.257434 +0.581823 0.590929 0.257434 +0.590929 0.590929 0.257434 +0.599674 0.590929 0.257434 +0.608079 0.590929 0.257434 +0.616166 0.590929 0.257434 +0.000001 0.599674 0.257434 +0.037293 0.599674 0.257434 +0.079714 0.599674 0.257434 +0.120832 0.599674 0.257434 +0.159284 0.599674 0.257434 +0.194868 0.599674 0.257434 +0.227530 0.599674 0.257434 +0.257434 0.599674 0.257434 +0.285092 0.599674 0.257434 +0.310738 0.599674 0.257434 +0.334585 0.599674 0.257434 +0.356818 0.599674 0.257434 +0.377602 0.599674 0.257434 +0.397079 0.599674 0.257434 +0.415373 0.599674 0.257434 +0.432594 0.599674 0.257434 +0.448839 0.599674 0.257434 +0.464192 0.599674 0.257434 +0.478729 0.599674 0.257434 +0.492515 0.599674 0.257434 +0.505612 0.599674 0.257434 +0.518072 0.599674 0.257434 +0.529943 0.599674 0.257434 +0.541266 0.599674 0.257434 +0.552083 0.599674 0.257434 +0.562427 0.599674 0.257434 +0.572331 0.599674 0.257434 +0.581823 0.599674 0.257434 +0.590929 0.599674 0.257434 +0.599674 0.599674 0.257434 +0.608079 0.599674 0.257434 +0.616166 0.599674 0.257434 +0.000001 0.608079 0.257434 +0.037293 0.608079 0.257434 +0.079714 0.608079 0.257434 +0.120832 0.608079 0.257434 +0.159284 0.608079 0.257434 +0.194868 0.608079 0.257434 +0.227530 0.608079 0.257434 +0.257434 0.608079 0.257434 +0.285092 0.608079 0.257434 +0.310738 0.608079 0.257434 +0.334585 0.608079 0.257434 +0.356818 0.608079 0.257434 +0.377602 0.608079 0.257434 +0.397079 0.608079 0.257434 +0.415373 0.608079 0.257434 +0.432594 0.608079 0.257434 +0.448839 0.608079 0.257434 +0.464192 0.608079 0.257434 +0.478729 0.608079 0.257434 +0.492515 0.608079 0.257434 +0.505612 0.608079 0.257434 +0.518072 0.608079 0.257434 +0.529943 0.608079 0.257434 +0.541266 0.608079 0.257434 +0.552083 0.608079 0.257434 +0.562427 0.608079 0.257434 +0.572331 0.608079 0.257434 +0.581823 0.608079 0.257434 +0.590929 0.608079 0.257434 +0.599674 0.608079 0.257434 +0.608079 0.608079 0.257434 +0.616166 0.608079 0.257434 +0.000001 0.616166 0.257434 +0.037293 0.616166 0.257434 +0.079714 0.616166 0.257434 +0.120832 0.616166 0.257434 +0.159284 0.616166 0.257434 +0.194868 0.616166 0.257434 +0.227530 0.616166 0.257434 +0.257434 0.616166 0.257434 +0.285092 0.616166 0.257434 +0.310738 0.616166 0.257434 +0.334585 0.616166 0.257434 +0.356818 0.616166 0.257434 +0.377602 0.616166 0.257434 +0.397079 0.616166 0.257434 +0.415373 0.616166 0.257434 +0.432594 0.616166 0.257434 +0.448839 0.616166 0.257434 +0.464192 0.616166 0.257434 +0.478729 0.616166 0.257434 +0.492515 0.616166 0.257434 +0.505612 0.616166 0.257434 +0.518072 0.616166 0.257434 +0.529943 0.616166 0.257434 +0.541266 0.616166 0.257434 +0.552083 0.616166 0.257434 +0.562427 0.616166 0.257434 +0.572331 0.616166 0.257434 +0.581823 0.616166 0.257434 +0.590929 0.616166 0.257434 +0.599674 0.616166 0.257434 +0.608079 0.616166 0.257434 +0.616166 0.616166 0.257434 +0.000001 0.000001 0.285092 +0.037293 0.000001 0.285092 +0.079714 0.000001 0.285092 +0.120832 0.000001 0.285092 +0.159284 0.000001 0.285092 +0.194868 0.000001 0.285092 +0.227530 0.000001 0.285092 +0.257434 0.000001 0.285092 +0.285092 0.000001 0.285092 +0.310738 0.000001 0.285092 +0.334585 0.000001 0.285092 +0.356818 0.000001 0.285092 +0.377602 0.000001 0.285092 +0.397079 0.000001 0.285092 +0.415373 0.000001 0.285092 +0.432594 0.000001 0.285092 +0.448839 0.000001 0.285092 +0.464192 0.000001 0.285092 +0.478729 0.000001 0.285092 +0.492515 0.000001 0.285092 +0.505612 0.000001 0.285092 +0.518072 0.000001 0.285092 +0.529943 0.000001 0.285092 +0.541266 0.000001 0.285092 +0.552083 0.000001 0.285092 +0.562427 0.000001 0.285092 +0.572331 0.000001 0.285092 +0.581823 0.000001 0.285092 +0.590929 0.000001 0.285092 +0.599674 0.000001 0.285092 +0.608079 0.000001 0.285092 +0.616166 0.000001 0.285092 +0.000001 0.037293 0.285092 +0.037293 0.037293 0.285092 +0.079714 0.037293 0.285092 +0.120832 0.037293 0.285092 +0.159284 0.037293 0.285092 +0.194868 0.037293 0.285092 +0.227530 0.037293 0.285092 +0.257434 0.037293 0.285092 +0.285092 0.037293 0.285092 +0.310738 0.037293 0.285092 +0.334585 0.037293 0.285092 +0.356818 0.037293 0.285092 +0.377602 0.037293 0.285092 +0.397079 0.037293 0.285092 +0.415373 0.037293 0.285092 +0.432594 0.037293 0.285092 +0.448839 0.037293 0.285092 +0.464192 0.037293 0.285092 +0.478729 0.037293 0.285092 +0.492515 0.037293 0.285092 +0.505612 0.037293 0.285092 +0.518072 0.037293 0.285092 +0.529943 0.037293 0.285092 +0.541266 0.037293 0.285092 +0.552083 0.037293 0.285092 +0.562427 0.037293 0.285092 +0.572331 0.037293 0.285092 +0.581823 0.037293 0.285092 +0.590929 0.037293 0.285092 +0.599674 0.037293 0.285092 +0.608079 0.037293 0.285092 +0.616166 0.037293 0.285092 +0.000001 0.079714 0.285092 +0.037293 0.079714 0.285092 +0.079714 0.079714 0.285092 +0.120832 0.079714 0.285092 +0.159284 0.079714 0.285092 +0.194868 0.079714 0.285092 +0.227530 0.079714 0.285092 +0.257434 0.079714 0.285092 +0.285092 0.079714 0.285092 +0.310738 0.079714 0.285092 +0.334585 0.079714 0.285092 +0.356818 0.079714 0.285092 +0.377602 0.079714 0.285092 +0.397079 0.079714 0.285092 +0.415373 0.079714 0.285092 +0.432594 0.079714 0.285092 +0.448839 0.079714 0.285092 +0.464192 0.079714 0.285092 +0.478729 0.079714 0.285092 +0.492515 0.079714 0.285092 +0.505612 0.079714 0.285092 +0.518072 0.079714 0.285092 +0.529943 0.079714 0.285092 +0.541266 0.079714 0.285092 +0.552083 0.079714 0.285092 +0.562427 0.079714 0.285092 +0.572331 0.079714 0.285092 +0.581823 0.079714 0.285092 +0.590929 0.079714 0.285092 +0.599674 0.079714 0.285092 +0.608079 0.079714 0.285092 +0.616166 0.079714 0.285092 +0.000001 0.120832 0.285092 +0.037293 0.120832 0.285092 +0.079714 0.120832 0.285092 +0.120832 0.120832 0.285092 +0.159284 0.120832 0.285092 +0.194868 0.120832 0.285092 +0.227530 0.120832 0.285092 +0.257434 0.120832 0.285092 +0.285092 0.120832 0.285092 +0.310738 0.120832 0.285092 +0.334585 0.120832 0.285092 +0.356818 0.120832 0.285092 +0.377602 0.120832 0.285092 +0.397079 0.120832 0.285092 +0.415373 0.120832 0.285092 +0.432594 0.120832 0.285092 +0.448839 0.120832 0.285092 +0.464192 0.120832 0.285092 +0.478729 0.120832 0.285092 +0.492515 0.120832 0.285092 +0.505612 0.120832 0.285092 +0.518072 0.120832 0.285092 +0.529943 0.120832 0.285092 +0.541266 0.120832 0.285092 +0.552083 0.120832 0.285092 +0.562427 0.120832 0.285092 +0.572331 0.120832 0.285092 +0.581823 0.120832 0.285092 +0.590929 0.120832 0.285092 +0.599674 0.120832 0.285092 +0.608079 0.120832 0.285092 +0.616166 0.120832 0.285092 +0.000001 0.159284 0.285092 +0.037293 0.159284 0.285092 +0.079714 0.159284 0.285092 +0.120832 0.159284 0.285092 +0.159284 0.159284 0.285092 +0.194868 0.159284 0.285092 +0.227530 0.159284 0.285092 +0.257434 0.159284 0.285092 +0.285092 0.159284 0.285092 +0.310738 0.159284 0.285092 +0.334585 0.159284 0.285092 +0.356818 0.159284 0.285092 +0.377602 0.159284 0.285092 +0.397079 0.159284 0.285092 +0.415373 0.159284 0.285092 +0.432594 0.159284 0.285092 +0.448839 0.159284 0.285092 +0.464192 0.159284 0.285092 +0.478729 0.159284 0.285092 +0.492515 0.159284 0.285092 +0.505612 0.159284 0.285092 +0.518072 0.159284 0.285092 +0.529943 0.159284 0.285092 +0.541266 0.159284 0.285092 +0.552083 0.159284 0.285092 +0.562427 0.159284 0.285092 +0.572331 0.159284 0.285092 +0.581823 0.159284 0.285092 +0.590929 0.159284 0.285092 +0.599674 0.159284 0.285092 +0.608079 0.159284 0.285092 +0.616166 0.159284 0.285092 +0.000001 0.194868 0.285092 +0.037293 0.194868 0.285092 +0.079714 0.194868 0.285092 +0.120832 0.194868 0.285092 +0.159284 0.194868 0.285092 +0.194868 0.194868 0.285092 +0.227530 0.194868 0.285092 +0.257434 0.194868 0.285092 +0.285092 0.194868 0.285092 +0.310738 0.194868 0.285092 +0.334585 0.194868 0.285092 +0.356818 0.194868 0.285092 +0.377602 0.194868 0.285092 +0.397079 0.194868 0.285092 +0.415373 0.194868 0.285092 +0.432594 0.194868 0.285092 +0.448839 0.194868 0.285092 +0.464192 0.194868 0.285092 +0.478729 0.194868 0.285092 +0.492515 0.194868 0.285092 +0.505612 0.194868 0.285092 +0.518072 0.194868 0.285092 +0.529943 0.194868 0.285092 +0.541266 0.194868 0.285092 +0.552083 0.194868 0.285092 +0.562427 0.194868 0.285092 +0.572331 0.194868 0.285092 +0.581823 0.194868 0.285092 +0.590929 0.194868 0.285092 +0.599674 0.194868 0.285092 +0.608079 0.194868 0.285092 +0.616166 0.194868 0.285092 +0.000001 0.227530 0.285092 +0.037293 0.227530 0.285092 +0.079714 0.227530 0.285092 +0.120832 0.227530 0.285092 +0.159284 0.227530 0.285092 +0.194868 0.227530 0.285092 +0.227530 0.227530 0.285092 +0.257434 0.227530 0.285092 +0.285092 0.227530 0.285092 +0.310738 0.227530 0.285092 +0.334585 0.227530 0.285092 +0.356818 0.227530 0.285092 +0.377602 0.227530 0.285092 +0.397079 0.227530 0.285092 +0.415373 0.227530 0.285092 +0.432594 0.227530 0.285092 +0.448839 0.227530 0.285092 +0.464192 0.227530 0.285092 +0.478729 0.227530 0.285092 +0.492515 0.227530 0.285092 +0.505612 0.227530 0.285092 +0.518072 0.227530 0.285092 +0.529943 0.227530 0.285092 +0.541266 0.227530 0.285092 +0.552083 0.227530 0.285092 +0.562427 0.227530 0.285092 +0.572331 0.227530 0.285092 +0.581823 0.227530 0.285092 +0.590929 0.227530 0.285092 +0.599674 0.227530 0.285092 +0.608079 0.227530 0.285092 +0.616166 0.227530 0.285092 +0.000001 0.257434 0.285092 +0.037293 0.257434 0.285092 +0.079714 0.257434 0.285092 +0.120832 0.257434 0.285092 +0.159284 0.257434 0.285092 +0.194868 0.257434 0.285092 +0.227530 0.257434 0.285092 +0.257434 0.257434 0.285092 +0.285092 0.257434 0.285092 +0.310738 0.257434 0.285092 +0.334585 0.257434 0.285092 +0.356818 0.257434 0.285092 +0.377602 0.257434 0.285092 +0.397079 0.257434 0.285092 +0.415373 0.257434 0.285092 +0.432594 0.257434 0.285092 +0.448839 0.257434 0.285092 +0.464192 0.257434 0.285092 +0.478729 0.257434 0.285092 +0.492515 0.257434 0.285092 +0.505612 0.257434 0.285092 +0.518072 0.257434 0.285092 +0.529943 0.257434 0.285092 +0.541266 0.257434 0.285092 +0.552083 0.257434 0.285092 +0.562427 0.257434 0.285092 +0.572331 0.257434 0.285092 +0.581823 0.257434 0.285092 +0.590929 0.257434 0.285092 +0.599674 0.257434 0.285092 +0.608079 0.257434 0.285092 +0.616166 0.257434 0.285092 +0.000001 0.285092 0.285092 +0.037293 0.285092 0.285092 +0.079714 0.285092 0.285092 +0.120832 0.285092 0.285092 +0.159284 0.285092 0.285092 +0.194868 0.285092 0.285092 +0.227530 0.285092 0.285092 +0.257434 0.285092 0.285092 +0.285092 0.285092 0.285092 +0.310738 0.285092 0.285092 +0.334585 0.285092 0.285092 +0.356818 0.285092 0.285092 +0.377602 0.285092 0.285092 +0.397079 0.285092 0.285092 +0.415373 0.285092 0.285092 +0.432594 0.285092 0.285092 +0.448839 0.285092 0.285092 +0.464192 0.285092 0.285092 +0.478729 0.285092 0.285092 +0.492515 0.285092 0.285092 +0.505612 0.285092 0.285092 +0.518072 0.285092 0.285092 +0.529943 0.285092 0.285092 +0.541266 0.285092 0.285092 +0.552083 0.285092 0.285092 +0.562427 0.285092 0.285092 +0.572331 0.285092 0.285092 +0.581823 0.285092 0.285092 +0.590929 0.285092 0.285092 +0.599674 0.285092 0.285092 +0.608079 0.285092 0.285092 +0.616166 0.285092 0.285092 +0.000001 0.310738 0.285092 +0.037293 0.310738 0.285092 +0.079714 0.310738 0.285092 +0.120832 0.310738 0.285092 +0.159284 0.310738 0.285092 +0.194868 0.310738 0.285092 +0.227530 0.310738 0.285092 +0.257434 0.310738 0.285092 +0.285092 0.310738 0.285092 +0.310738 0.310738 0.285092 +0.334585 0.310738 0.285092 +0.356818 0.310738 0.285092 +0.377602 0.310738 0.285092 +0.397079 0.310738 0.285092 +0.415373 0.310738 0.285092 +0.432594 0.310738 0.285092 +0.448839 0.310738 0.285092 +0.464192 0.310738 0.285092 +0.478729 0.310738 0.285092 +0.492515 0.310738 0.285092 +0.505612 0.310738 0.285092 +0.518072 0.310738 0.285092 +0.529943 0.310738 0.285092 +0.541266 0.310738 0.285092 +0.552083 0.310738 0.285092 +0.562427 0.310738 0.285092 +0.572331 0.310738 0.285092 +0.581823 0.310738 0.285092 +0.590929 0.310738 0.285092 +0.599674 0.310738 0.285092 +0.608079 0.310738 0.285092 +0.616166 0.310738 0.285092 +0.000001 0.334585 0.285092 +0.037293 0.334585 0.285092 +0.079714 0.334585 0.285092 +0.120832 0.334585 0.285092 +0.159284 0.334585 0.285092 +0.194868 0.334585 0.285092 +0.227530 0.334585 0.285092 +0.257434 0.334585 0.285092 +0.285092 0.334585 0.285092 +0.310738 0.334585 0.285092 +0.334585 0.334585 0.285092 +0.356818 0.334585 0.285092 +0.377602 0.334585 0.285092 +0.397079 0.334585 0.285092 +0.415373 0.334585 0.285092 +0.432594 0.334585 0.285092 +0.448839 0.334585 0.285092 +0.464192 0.334585 0.285092 +0.478729 0.334585 0.285092 +0.492515 0.334585 0.285092 +0.505612 0.334585 0.285092 +0.518072 0.334585 0.285092 +0.529943 0.334585 0.285092 +0.541266 0.334585 0.285092 +0.552083 0.334585 0.285092 +0.562427 0.334585 0.285092 +0.572331 0.334585 0.285092 +0.581823 0.334585 0.285092 +0.590929 0.334585 0.285092 +0.599674 0.334585 0.285092 +0.608079 0.334585 0.285092 +0.616166 0.334585 0.285092 +0.000001 0.356818 0.285092 +0.037293 0.356818 0.285092 +0.079714 0.356818 0.285092 +0.120832 0.356818 0.285092 +0.159284 0.356818 0.285092 +0.194868 0.356818 0.285092 +0.227530 0.356818 0.285092 +0.257434 0.356818 0.285092 +0.285092 0.356818 0.285092 +0.310738 0.356818 0.285092 +0.334585 0.356818 0.285092 +0.356818 0.356818 0.285092 +0.377602 0.356818 0.285092 +0.397079 0.356818 0.285092 +0.415373 0.356818 0.285092 +0.432594 0.356818 0.285092 +0.448839 0.356818 0.285092 +0.464192 0.356818 0.285092 +0.478729 0.356818 0.285092 +0.492515 0.356818 0.285092 +0.505612 0.356818 0.285092 +0.518072 0.356818 0.285092 +0.529943 0.356818 0.285092 +0.541266 0.356818 0.285092 +0.552083 0.356818 0.285092 +0.562427 0.356818 0.285092 +0.572331 0.356818 0.285092 +0.581823 0.356818 0.285092 +0.590929 0.356818 0.285092 +0.599674 0.356818 0.285092 +0.608079 0.356818 0.285092 +0.616166 0.356818 0.285092 +0.000001 0.377602 0.285092 +0.037293 0.377602 0.285092 +0.079714 0.377602 0.285092 +0.120832 0.377602 0.285092 +0.159284 0.377602 0.285092 +0.194868 0.377602 0.285092 +0.227530 0.377602 0.285092 +0.257434 0.377602 0.285092 +0.285092 0.377602 0.285092 +0.310738 0.377602 0.285092 +0.334585 0.377602 0.285092 +0.356818 0.377602 0.285092 +0.377602 0.377602 0.285092 +0.397079 0.377602 0.285092 +0.415373 0.377602 0.285092 +0.432594 0.377602 0.285092 +0.448839 0.377602 0.285092 +0.464192 0.377602 0.285092 +0.478729 0.377602 0.285092 +0.492515 0.377602 0.285092 +0.505612 0.377602 0.285092 +0.518072 0.377602 0.285092 +0.529943 0.377602 0.285092 +0.541266 0.377602 0.285092 +0.552083 0.377602 0.285092 +0.562427 0.377602 0.285092 +0.572331 0.377602 0.285092 +0.581823 0.377602 0.285092 +0.590929 0.377602 0.285092 +0.599674 0.377602 0.285092 +0.608079 0.377602 0.285092 +0.616166 0.377602 0.285092 +0.000001 0.397079 0.285092 +0.037293 0.397079 0.285092 +0.079714 0.397079 0.285092 +0.120832 0.397079 0.285092 +0.159284 0.397079 0.285092 +0.194868 0.397079 0.285092 +0.227530 0.397079 0.285092 +0.257434 0.397079 0.285092 +0.285092 0.397079 0.285092 +0.310738 0.397079 0.285092 +0.334585 0.397079 0.285092 +0.356818 0.397079 0.285092 +0.377602 0.397079 0.285092 +0.397079 0.397079 0.285092 +0.415373 0.397079 0.285092 +0.432594 0.397079 0.285092 +0.448839 0.397079 0.285092 +0.464192 0.397079 0.285092 +0.478729 0.397079 0.285092 +0.492515 0.397079 0.285092 +0.505612 0.397079 0.285092 +0.518072 0.397079 0.285092 +0.529943 0.397079 0.285092 +0.541266 0.397079 0.285092 +0.552083 0.397079 0.285092 +0.562427 0.397079 0.285092 +0.572331 0.397079 0.285092 +0.581823 0.397079 0.285092 +0.590929 0.397079 0.285092 +0.599674 0.397079 0.285092 +0.608079 0.397079 0.285092 +0.616166 0.397079 0.285092 +0.000001 0.415373 0.285092 +0.037293 0.415373 0.285092 +0.079714 0.415373 0.285092 +0.120832 0.415373 0.285092 +0.159284 0.415373 0.285092 +0.194868 0.415373 0.285092 +0.227530 0.415373 0.285092 +0.257434 0.415373 0.285092 +0.285092 0.415373 0.285092 +0.310738 0.415373 0.285092 +0.334585 0.415373 0.285092 +0.356818 0.415373 0.285092 +0.377602 0.415373 0.285092 +0.397079 0.415373 0.285092 +0.415373 0.415373 0.285092 +0.432594 0.415373 0.285092 +0.448839 0.415373 0.285092 +0.464192 0.415373 0.285092 +0.478729 0.415373 0.285092 +0.492515 0.415373 0.285092 +0.505612 0.415373 0.285092 +0.518072 0.415373 0.285092 +0.529943 0.415373 0.285092 +0.541266 0.415373 0.285092 +0.552083 0.415373 0.285092 +0.562427 0.415373 0.285092 +0.572331 0.415373 0.285092 +0.581823 0.415373 0.285092 +0.590929 0.415373 0.285092 +0.599674 0.415373 0.285092 +0.608079 0.415373 0.285092 +0.616166 0.415373 0.285092 +0.000001 0.432594 0.285092 +0.037293 0.432594 0.285092 +0.079714 0.432594 0.285092 +0.120832 0.432594 0.285092 +0.159284 0.432594 0.285092 +0.194868 0.432594 0.285092 +0.227530 0.432594 0.285092 +0.257434 0.432594 0.285092 +0.285092 0.432594 0.285092 +0.310738 0.432594 0.285092 +0.334585 0.432594 0.285092 +0.356818 0.432594 0.285092 +0.377602 0.432594 0.285092 +0.397079 0.432594 0.285092 +0.415373 0.432594 0.285092 +0.432594 0.432594 0.285092 +0.448839 0.432594 0.285092 +0.464192 0.432594 0.285092 +0.478729 0.432594 0.285092 +0.492515 0.432594 0.285092 +0.505612 0.432594 0.285092 +0.518072 0.432594 0.285092 +0.529943 0.432594 0.285092 +0.541266 0.432594 0.285092 +0.552083 0.432594 0.285092 +0.562427 0.432594 0.285092 +0.572331 0.432594 0.285092 +0.581823 0.432594 0.285092 +0.590929 0.432594 0.285092 +0.599674 0.432594 0.285092 +0.608079 0.432594 0.285092 +0.616166 0.432594 0.285092 +0.000001 0.448839 0.285092 +0.037293 0.448839 0.285092 +0.079714 0.448839 0.285092 +0.120832 0.448839 0.285092 +0.159284 0.448839 0.285092 +0.194868 0.448839 0.285092 +0.227530 0.448839 0.285092 +0.257434 0.448839 0.285092 +0.285092 0.448839 0.285092 +0.310738 0.448839 0.285092 +0.334585 0.448839 0.285092 +0.356818 0.448839 0.285092 +0.377602 0.448839 0.285092 +0.397079 0.448839 0.285092 +0.415373 0.448839 0.285092 +0.432594 0.448839 0.285092 +0.448839 0.448839 0.285092 +0.464192 0.448839 0.285092 +0.478729 0.448839 0.285092 +0.492515 0.448839 0.285092 +0.505612 0.448839 0.285092 +0.518072 0.448839 0.285092 +0.529943 0.448839 0.285092 +0.541266 0.448839 0.285092 +0.552083 0.448839 0.285092 +0.562427 0.448839 0.285092 +0.572331 0.448839 0.285092 +0.581823 0.448839 0.285092 +0.590929 0.448839 0.285092 +0.599674 0.448839 0.285092 +0.608079 0.448839 0.285092 +0.616166 0.448839 0.285092 +0.000001 0.464192 0.285092 +0.037293 0.464192 0.285092 +0.079714 0.464192 0.285092 +0.120832 0.464192 0.285092 +0.159284 0.464192 0.285092 +0.194868 0.464192 0.285092 +0.227530 0.464192 0.285092 +0.257434 0.464192 0.285092 +0.285092 0.464192 0.285092 +0.310738 0.464192 0.285092 +0.334585 0.464192 0.285092 +0.356818 0.464192 0.285092 +0.377602 0.464192 0.285092 +0.397079 0.464192 0.285092 +0.415373 0.464192 0.285092 +0.432594 0.464192 0.285092 +0.448839 0.464192 0.285092 +0.464192 0.464192 0.285092 +0.478729 0.464192 0.285092 +0.492515 0.464192 0.285092 +0.505612 0.464192 0.285092 +0.518072 0.464192 0.285092 +0.529943 0.464192 0.285092 +0.541266 0.464192 0.285092 +0.552083 0.464192 0.285092 +0.562427 0.464192 0.285092 +0.572331 0.464192 0.285092 +0.581823 0.464192 0.285092 +0.590929 0.464192 0.285092 +0.599674 0.464192 0.285092 +0.608079 0.464192 0.285092 +0.616166 0.464192 0.285092 +0.000001 0.478729 0.285092 +0.037293 0.478729 0.285092 +0.079714 0.478729 0.285092 +0.120832 0.478729 0.285092 +0.159284 0.478729 0.285092 +0.194868 0.478729 0.285092 +0.227530 0.478729 0.285092 +0.257434 0.478729 0.285092 +0.285092 0.478729 0.285092 +0.310738 0.478729 0.285092 +0.334585 0.478729 0.285092 +0.356818 0.478729 0.285092 +0.377602 0.478729 0.285092 +0.397079 0.478729 0.285092 +0.415373 0.478729 0.285092 +0.432594 0.478729 0.285092 +0.448839 0.478729 0.285092 +0.464192 0.478729 0.285092 +0.478729 0.478729 0.285092 +0.492515 0.478729 0.285092 +0.505612 0.478729 0.285092 +0.518072 0.478729 0.285092 +0.529943 0.478729 0.285092 +0.541266 0.478729 0.285092 +0.552083 0.478729 0.285092 +0.562427 0.478729 0.285092 +0.572331 0.478729 0.285092 +0.581823 0.478729 0.285092 +0.590929 0.478729 0.285092 +0.599674 0.478729 0.285092 +0.608079 0.478729 0.285092 +0.616166 0.478729 0.285092 +0.000001 0.492515 0.285092 +0.037293 0.492515 0.285092 +0.079714 0.492515 0.285092 +0.120832 0.492515 0.285092 +0.159284 0.492515 0.285092 +0.194868 0.492515 0.285092 +0.227530 0.492515 0.285092 +0.257434 0.492515 0.285092 +0.285092 0.492515 0.285092 +0.310738 0.492515 0.285092 +0.334585 0.492515 0.285092 +0.356818 0.492515 0.285092 +0.377602 0.492515 0.285092 +0.397079 0.492515 0.285092 +0.415373 0.492515 0.285092 +0.432594 0.492515 0.285092 +0.448839 0.492515 0.285092 +0.464192 0.492515 0.285092 +0.478729 0.492515 0.285092 +0.492515 0.492515 0.285092 +0.505612 0.492515 0.285092 +0.518072 0.492515 0.285092 +0.529943 0.492515 0.285092 +0.541266 0.492515 0.285092 +0.552083 0.492515 0.285092 +0.562427 0.492515 0.285092 +0.572331 0.492515 0.285092 +0.581823 0.492515 0.285092 +0.590929 0.492515 0.285092 +0.599674 0.492515 0.285092 +0.608079 0.492515 0.285092 +0.616166 0.492515 0.285092 +0.000001 0.505612 0.285092 +0.037293 0.505612 0.285092 +0.079714 0.505612 0.285092 +0.120832 0.505612 0.285092 +0.159284 0.505612 0.285092 +0.194868 0.505612 0.285092 +0.227530 0.505612 0.285092 +0.257434 0.505612 0.285092 +0.285092 0.505612 0.285092 +0.310738 0.505612 0.285092 +0.334585 0.505612 0.285092 +0.356818 0.505612 0.285092 +0.377602 0.505612 0.285092 +0.397079 0.505612 0.285092 +0.415373 0.505612 0.285092 +0.432594 0.505612 0.285092 +0.448839 0.505612 0.285092 +0.464192 0.505612 0.285092 +0.478729 0.505612 0.285092 +0.492515 0.505612 0.285092 +0.505612 0.505612 0.285092 +0.518072 0.505612 0.285092 +0.529943 0.505612 0.285092 +0.541266 0.505612 0.285092 +0.552083 0.505612 0.285092 +0.562427 0.505612 0.285092 +0.572331 0.505612 0.285092 +0.581823 0.505612 0.285092 +0.590929 0.505612 0.285092 +0.599674 0.505612 0.285092 +0.608079 0.505612 0.285092 +0.616166 0.505612 0.285092 +0.000001 0.518072 0.285092 +0.037293 0.518072 0.285092 +0.079714 0.518072 0.285092 +0.120832 0.518072 0.285092 +0.159284 0.518072 0.285092 +0.194868 0.518072 0.285092 +0.227530 0.518072 0.285092 +0.257434 0.518072 0.285092 +0.285092 0.518072 0.285092 +0.310738 0.518072 0.285092 +0.334585 0.518072 0.285092 +0.356818 0.518072 0.285092 +0.377602 0.518072 0.285092 +0.397079 0.518072 0.285092 +0.415373 0.518072 0.285092 +0.432594 0.518072 0.285092 +0.448839 0.518072 0.285092 +0.464192 0.518072 0.285092 +0.478729 0.518072 0.285092 +0.492515 0.518072 0.285092 +0.505612 0.518072 0.285092 +0.518072 0.518072 0.285092 +0.529943 0.518072 0.285092 +0.541266 0.518072 0.285092 +0.552083 0.518072 0.285092 +0.562427 0.518072 0.285092 +0.572331 0.518072 0.285092 +0.581823 0.518072 0.285092 +0.590929 0.518072 0.285092 +0.599674 0.518072 0.285092 +0.608079 0.518072 0.285092 +0.616166 0.518072 0.285092 +0.000001 0.529943 0.285092 +0.037293 0.529943 0.285092 +0.079714 0.529943 0.285092 +0.120832 0.529943 0.285092 +0.159284 0.529943 0.285092 +0.194868 0.529943 0.285092 +0.227530 0.529943 0.285092 +0.257434 0.529943 0.285092 +0.285092 0.529943 0.285092 +0.310738 0.529943 0.285092 +0.334585 0.529943 0.285092 +0.356818 0.529943 0.285092 +0.377602 0.529943 0.285092 +0.397079 0.529943 0.285092 +0.415373 0.529943 0.285092 +0.432594 0.529943 0.285092 +0.448839 0.529943 0.285092 +0.464192 0.529943 0.285092 +0.478729 0.529943 0.285092 +0.492515 0.529943 0.285092 +0.505612 0.529943 0.285092 +0.518072 0.529943 0.285092 +0.529943 0.529943 0.285092 +0.541266 0.529943 0.285092 +0.552083 0.529943 0.285092 +0.562427 0.529943 0.285092 +0.572331 0.529943 0.285092 +0.581823 0.529943 0.285092 +0.590929 0.529943 0.285092 +0.599674 0.529943 0.285092 +0.608079 0.529943 0.285092 +0.616166 0.529943 0.285092 +0.000001 0.541266 0.285092 +0.037293 0.541266 0.285092 +0.079714 0.541266 0.285092 +0.120832 0.541266 0.285092 +0.159284 0.541266 0.285092 +0.194868 0.541266 0.285092 +0.227530 0.541266 0.285092 +0.257434 0.541266 0.285092 +0.285092 0.541266 0.285092 +0.310738 0.541266 0.285092 +0.334585 0.541266 0.285092 +0.356818 0.541266 0.285092 +0.377602 0.541266 0.285092 +0.397079 0.541266 0.285092 +0.415373 0.541266 0.285092 +0.432594 0.541266 0.285092 +0.448839 0.541266 0.285092 +0.464192 0.541266 0.285092 +0.478729 0.541266 0.285092 +0.492515 0.541266 0.285092 +0.505612 0.541266 0.285092 +0.518072 0.541266 0.285092 +0.529943 0.541266 0.285092 +0.541266 0.541266 0.285092 +0.552083 0.541266 0.285092 +0.562427 0.541266 0.285092 +0.572331 0.541266 0.285092 +0.581823 0.541266 0.285092 +0.590929 0.541266 0.285092 +0.599674 0.541266 0.285092 +0.608079 0.541266 0.285092 +0.616166 0.541266 0.285092 +0.000001 0.552083 0.285092 +0.037293 0.552083 0.285092 +0.079714 0.552083 0.285092 +0.120832 0.552083 0.285092 +0.159284 0.552083 0.285092 +0.194868 0.552083 0.285092 +0.227530 0.552083 0.285092 +0.257434 0.552083 0.285092 +0.285092 0.552083 0.285092 +0.310738 0.552083 0.285092 +0.334585 0.552083 0.285092 +0.356818 0.552083 0.285092 +0.377602 0.552083 0.285092 +0.397079 0.552083 0.285092 +0.415373 0.552083 0.285092 +0.432594 0.552083 0.285092 +0.448839 0.552083 0.285092 +0.464192 0.552083 0.285092 +0.478729 0.552083 0.285092 +0.492515 0.552083 0.285092 +0.505612 0.552083 0.285092 +0.518072 0.552083 0.285092 +0.529943 0.552083 0.285092 +0.541266 0.552083 0.285092 +0.552083 0.552083 0.285092 +0.562427 0.552083 0.285092 +0.572331 0.552083 0.285092 +0.581823 0.552083 0.285092 +0.590929 0.552083 0.285092 +0.599674 0.552083 0.285092 +0.608079 0.552083 0.285092 +0.616166 0.552083 0.285092 +0.000001 0.562427 0.285092 +0.037293 0.562427 0.285092 +0.079714 0.562427 0.285092 +0.120832 0.562427 0.285092 +0.159284 0.562427 0.285092 +0.194868 0.562427 0.285092 +0.227530 0.562427 0.285092 +0.257434 0.562427 0.285092 +0.285092 0.562427 0.285092 +0.310738 0.562427 0.285092 +0.334585 0.562427 0.285092 +0.356818 0.562427 0.285092 +0.377602 0.562427 0.285092 +0.397079 0.562427 0.285092 +0.415373 0.562427 0.285092 +0.432594 0.562427 0.285092 +0.448839 0.562427 0.285092 +0.464192 0.562427 0.285092 +0.478729 0.562427 0.285092 +0.492515 0.562427 0.285092 +0.505612 0.562427 0.285092 +0.518072 0.562427 0.285092 +0.529943 0.562427 0.285092 +0.541266 0.562427 0.285092 +0.552083 0.562427 0.285092 +0.562427 0.562427 0.285092 +0.572331 0.562427 0.285092 +0.581823 0.562427 0.285092 +0.590929 0.562427 0.285092 +0.599674 0.562427 0.285092 +0.608079 0.562427 0.285092 +0.616166 0.562427 0.285092 +0.000001 0.572331 0.285092 +0.037293 0.572331 0.285092 +0.079714 0.572331 0.285092 +0.120832 0.572331 0.285092 +0.159284 0.572331 0.285092 +0.194868 0.572331 0.285092 +0.227530 0.572331 0.285092 +0.257434 0.572331 0.285092 +0.285092 0.572331 0.285092 +0.310738 0.572331 0.285092 +0.334585 0.572331 0.285092 +0.356818 0.572331 0.285092 +0.377602 0.572331 0.285092 +0.397079 0.572331 0.285092 +0.415373 0.572331 0.285092 +0.432594 0.572331 0.285092 +0.448839 0.572331 0.285092 +0.464192 0.572331 0.285092 +0.478729 0.572331 0.285092 +0.492515 0.572331 0.285092 +0.505612 0.572331 0.285092 +0.518072 0.572331 0.285092 +0.529943 0.572331 0.285092 +0.541266 0.572331 0.285092 +0.552083 0.572331 0.285092 +0.562427 0.572331 0.285092 +0.572331 0.572331 0.285092 +0.581823 0.572331 0.285092 +0.590929 0.572331 0.285092 +0.599674 0.572331 0.285092 +0.608079 0.572331 0.285092 +0.616166 0.572331 0.285092 +0.000001 0.581823 0.285092 +0.037293 0.581823 0.285092 +0.079714 0.581823 0.285092 +0.120832 0.581823 0.285092 +0.159284 0.581823 0.285092 +0.194868 0.581823 0.285092 +0.227530 0.581823 0.285092 +0.257434 0.581823 0.285092 +0.285092 0.581823 0.285092 +0.310738 0.581823 0.285092 +0.334585 0.581823 0.285092 +0.356818 0.581823 0.285092 +0.377602 0.581823 0.285092 +0.397079 0.581823 0.285092 +0.415373 0.581823 0.285092 +0.432594 0.581823 0.285092 +0.448839 0.581823 0.285092 +0.464192 0.581823 0.285092 +0.478729 0.581823 0.285092 +0.492515 0.581823 0.285092 +0.505612 0.581823 0.285092 +0.518072 0.581823 0.285092 +0.529943 0.581823 0.285092 +0.541266 0.581823 0.285092 +0.552083 0.581823 0.285092 +0.562427 0.581823 0.285092 +0.572331 0.581823 0.285092 +0.581823 0.581823 0.285092 +0.590929 0.581823 0.285092 +0.599674 0.581823 0.285092 +0.608079 0.581823 0.285092 +0.616166 0.581823 0.285092 +0.000001 0.590929 0.285092 +0.037293 0.590929 0.285092 +0.079714 0.590929 0.285092 +0.120832 0.590929 0.285092 +0.159284 0.590929 0.285092 +0.194868 0.590929 0.285092 +0.227530 0.590929 0.285092 +0.257434 0.590929 0.285092 +0.285092 0.590929 0.285092 +0.310738 0.590929 0.285092 +0.334585 0.590929 0.285092 +0.356818 0.590929 0.285092 +0.377602 0.590929 0.285092 +0.397079 0.590929 0.285092 +0.415373 0.590929 0.285092 +0.432594 0.590929 0.285092 +0.448839 0.590929 0.285092 +0.464192 0.590929 0.285092 +0.478729 0.590929 0.285092 +0.492515 0.590929 0.285092 +0.505612 0.590929 0.285092 +0.518072 0.590929 0.285092 +0.529943 0.590929 0.285092 +0.541266 0.590929 0.285092 +0.552083 0.590929 0.285092 +0.562427 0.590929 0.285092 +0.572331 0.590929 0.285092 +0.581823 0.590929 0.285092 +0.590929 0.590929 0.285092 +0.599674 0.590929 0.285092 +0.608079 0.590929 0.285092 +0.616166 0.590929 0.285092 +0.000001 0.599674 0.285092 +0.037293 0.599674 0.285092 +0.079714 0.599674 0.285092 +0.120832 0.599674 0.285092 +0.159284 0.599674 0.285092 +0.194868 0.599674 0.285092 +0.227530 0.599674 0.285092 +0.257434 0.599674 0.285092 +0.285092 0.599674 0.285092 +0.310738 0.599674 0.285092 +0.334585 0.599674 0.285092 +0.356818 0.599674 0.285092 +0.377602 0.599674 0.285092 +0.397079 0.599674 0.285092 +0.415373 0.599674 0.285092 +0.432594 0.599674 0.285092 +0.448839 0.599674 0.285092 +0.464192 0.599674 0.285092 +0.478729 0.599674 0.285092 +0.492515 0.599674 0.285092 +0.505612 0.599674 0.285092 +0.518072 0.599674 0.285092 +0.529943 0.599674 0.285092 +0.541266 0.599674 0.285092 +0.552083 0.599674 0.285092 +0.562427 0.599674 0.285092 +0.572331 0.599674 0.285092 +0.581823 0.599674 0.285092 +0.590929 0.599674 0.285092 +0.599674 0.599674 0.285092 +0.608079 0.599674 0.285092 +0.616166 0.599674 0.285092 +0.000001 0.608079 0.285092 +0.037293 0.608079 0.285092 +0.079714 0.608079 0.285092 +0.120832 0.608079 0.285092 +0.159284 0.608079 0.285092 +0.194868 0.608079 0.285092 +0.227530 0.608079 0.285092 +0.257434 0.608079 0.285092 +0.285092 0.608079 0.285092 +0.310738 0.608079 0.285092 +0.334585 0.608079 0.285092 +0.356818 0.608079 0.285092 +0.377602 0.608079 0.285092 +0.397079 0.608079 0.285092 +0.415373 0.608079 0.285092 +0.432594 0.608079 0.285092 +0.448839 0.608079 0.285092 +0.464192 0.608079 0.285092 +0.478729 0.608079 0.285092 +0.492515 0.608079 0.285092 +0.505612 0.608079 0.285092 +0.518072 0.608079 0.285092 +0.529943 0.608079 0.285092 +0.541266 0.608079 0.285092 +0.552083 0.608079 0.285092 +0.562427 0.608079 0.285092 +0.572331 0.608079 0.285092 +0.581823 0.608079 0.285092 +0.590929 0.608079 0.285092 +0.599674 0.608079 0.285092 +0.608079 0.608079 0.285092 +0.616166 0.608079 0.285092 +0.000001 0.616166 0.285092 +0.037293 0.616166 0.285092 +0.079714 0.616166 0.285092 +0.120832 0.616166 0.285092 +0.159284 0.616166 0.285092 +0.194868 0.616166 0.285092 +0.227530 0.616166 0.285092 +0.257434 0.616166 0.285092 +0.285092 0.616166 0.285092 +0.310738 0.616166 0.285092 +0.334585 0.616166 0.285092 +0.356818 0.616166 0.285092 +0.377602 0.616166 0.285092 +0.397079 0.616166 0.285092 +0.415373 0.616166 0.285092 +0.432594 0.616166 0.285092 +0.448839 0.616166 0.285092 +0.464192 0.616166 0.285092 +0.478729 0.616166 0.285092 +0.492515 0.616166 0.285092 +0.505612 0.616166 0.285092 +0.518072 0.616166 0.285092 +0.529943 0.616166 0.285092 +0.541266 0.616166 0.285092 +0.552083 0.616166 0.285092 +0.562427 0.616166 0.285092 +0.572331 0.616166 0.285092 +0.581823 0.616166 0.285092 +0.590929 0.616166 0.285092 +0.599674 0.616166 0.285092 +0.608079 0.616166 0.285092 +0.616166 0.616166 0.285092 +0.000001 0.000001 0.310738 +0.037293 0.000001 0.310738 +0.079714 0.000001 0.310738 +0.120832 0.000001 0.310738 +0.159284 0.000001 0.310738 +0.194868 0.000001 0.310738 +0.227530 0.000001 0.310738 +0.257434 0.000001 0.310738 +0.285092 0.000001 0.310738 +0.310738 0.000001 0.310738 +0.334585 0.000001 0.310738 +0.356818 0.000001 0.310738 +0.377602 0.000001 0.310738 +0.397079 0.000001 0.310738 +0.415373 0.000001 0.310738 +0.432594 0.000001 0.310738 +0.448839 0.000001 0.310738 +0.464192 0.000001 0.310738 +0.478729 0.000001 0.310738 +0.492515 0.000001 0.310738 +0.505612 0.000001 0.310738 +0.518072 0.000001 0.310738 +0.529943 0.000001 0.310738 +0.541266 0.000001 0.310738 +0.552083 0.000001 0.310738 +0.562427 0.000001 0.310738 +0.572331 0.000001 0.310738 +0.581823 0.000001 0.310738 +0.590929 0.000001 0.310738 +0.599674 0.000001 0.310738 +0.608079 0.000001 0.310738 +0.616166 0.000001 0.310738 +0.000001 0.037293 0.310738 +0.037293 0.037293 0.310738 +0.079714 0.037293 0.310738 +0.120832 0.037293 0.310738 +0.159284 0.037293 0.310738 +0.194868 0.037293 0.310738 +0.227530 0.037293 0.310738 +0.257434 0.037293 0.310738 +0.285092 0.037293 0.310738 +0.310738 0.037293 0.310738 +0.334585 0.037293 0.310738 +0.356818 0.037293 0.310738 +0.377602 0.037293 0.310738 +0.397079 0.037293 0.310738 +0.415373 0.037293 0.310738 +0.432594 0.037293 0.310738 +0.448839 0.037293 0.310738 +0.464192 0.037293 0.310738 +0.478729 0.037293 0.310738 +0.492515 0.037293 0.310738 +0.505612 0.037293 0.310738 +0.518072 0.037293 0.310738 +0.529943 0.037293 0.310738 +0.541266 0.037293 0.310738 +0.552083 0.037293 0.310738 +0.562427 0.037293 0.310738 +0.572331 0.037293 0.310738 +0.581823 0.037293 0.310738 +0.590929 0.037293 0.310738 +0.599674 0.037293 0.310738 +0.608079 0.037293 0.310738 +0.616166 0.037293 0.310738 +0.000001 0.079714 0.310738 +0.037293 0.079714 0.310738 +0.079714 0.079714 0.310738 +0.120832 0.079714 0.310738 +0.159284 0.079714 0.310738 +0.194868 0.079714 0.310738 +0.227530 0.079714 0.310738 +0.257434 0.079714 0.310738 +0.285092 0.079714 0.310738 +0.310738 0.079714 0.310738 +0.334585 0.079714 0.310738 +0.356818 0.079714 0.310738 +0.377602 0.079714 0.310738 +0.397079 0.079714 0.310738 +0.415373 0.079714 0.310738 +0.432594 0.079714 0.310738 +0.448839 0.079714 0.310738 +0.464192 0.079714 0.310738 +0.478729 0.079714 0.310738 +0.492515 0.079714 0.310738 +0.505612 0.079714 0.310738 +0.518072 0.079714 0.310738 +0.529943 0.079714 0.310738 +0.541266 0.079714 0.310738 +0.552083 0.079714 0.310738 +0.562427 0.079714 0.310738 +0.572331 0.079714 0.310738 +0.581823 0.079714 0.310738 +0.590929 0.079714 0.310738 +0.599674 0.079714 0.310738 +0.608079 0.079714 0.310738 +0.616166 0.079714 0.310738 +0.000001 0.120832 0.310738 +0.037293 0.120832 0.310738 +0.079714 0.120832 0.310738 +0.120832 0.120832 0.310738 +0.159284 0.120832 0.310738 +0.194868 0.120832 0.310738 +0.227530 0.120832 0.310738 +0.257434 0.120832 0.310738 +0.285092 0.120832 0.310738 +0.310738 0.120832 0.310738 +0.334585 0.120832 0.310738 +0.356818 0.120832 0.310738 +0.377602 0.120832 0.310738 +0.397079 0.120832 0.310738 +0.415373 0.120832 0.310738 +0.432594 0.120832 0.310738 +0.448839 0.120832 0.310738 +0.464192 0.120832 0.310738 +0.478729 0.120832 0.310738 +0.492515 0.120832 0.310738 +0.505612 0.120832 0.310738 +0.518072 0.120832 0.310738 +0.529943 0.120832 0.310738 +0.541266 0.120832 0.310738 +0.552083 0.120832 0.310738 +0.562427 0.120832 0.310738 +0.572331 0.120832 0.310738 +0.581823 0.120832 0.310738 +0.590929 0.120832 0.310738 +0.599674 0.120832 0.310738 +0.608079 0.120832 0.310738 +0.616166 0.120832 0.310738 +0.000001 0.159284 0.310738 +0.037293 0.159284 0.310738 +0.079714 0.159284 0.310738 +0.120832 0.159284 0.310738 +0.159284 0.159284 0.310738 +0.194868 0.159284 0.310738 +0.227530 0.159284 0.310738 +0.257434 0.159284 0.310738 +0.285092 0.159284 0.310738 +0.310738 0.159284 0.310738 +0.334585 0.159284 0.310738 +0.356818 0.159284 0.310738 +0.377602 0.159284 0.310738 +0.397079 0.159284 0.310738 +0.415373 0.159284 0.310738 +0.432594 0.159284 0.310738 +0.448839 0.159284 0.310738 +0.464192 0.159284 0.310738 +0.478729 0.159284 0.310738 +0.492515 0.159284 0.310738 +0.505612 0.159284 0.310738 +0.518072 0.159284 0.310738 +0.529943 0.159284 0.310738 +0.541266 0.159284 0.310738 +0.552083 0.159284 0.310738 +0.562427 0.159284 0.310738 +0.572331 0.159284 0.310738 +0.581823 0.159284 0.310738 +0.590929 0.159284 0.310738 +0.599674 0.159284 0.310738 +0.608079 0.159284 0.310738 +0.616166 0.159284 0.310738 +0.000001 0.194868 0.310738 +0.037293 0.194868 0.310738 +0.079714 0.194868 0.310738 +0.120832 0.194868 0.310738 +0.159284 0.194868 0.310738 +0.194868 0.194868 0.310738 +0.227530 0.194868 0.310738 +0.257434 0.194868 0.310738 +0.285092 0.194868 0.310738 +0.310738 0.194868 0.310738 +0.334585 0.194868 0.310738 +0.356818 0.194868 0.310738 +0.377602 0.194868 0.310738 +0.397079 0.194868 0.310738 +0.415373 0.194868 0.310738 +0.432594 0.194868 0.310738 +0.448839 0.194868 0.310738 +0.464192 0.194868 0.310738 +0.478729 0.194868 0.310738 +0.492515 0.194868 0.310738 +0.505612 0.194868 0.310738 +0.518072 0.194868 0.310738 +0.529943 0.194868 0.310738 +0.541266 0.194868 0.310738 +0.552083 0.194868 0.310738 +0.562427 0.194868 0.310738 +0.572331 0.194868 0.310738 +0.581823 0.194868 0.310738 +0.590929 0.194868 0.310738 +0.599674 0.194868 0.310738 +0.608079 0.194868 0.310738 +0.616166 0.194868 0.310738 +0.000001 0.227530 0.310738 +0.037293 0.227530 0.310738 +0.079714 0.227530 0.310738 +0.120832 0.227530 0.310738 +0.159284 0.227530 0.310738 +0.194868 0.227530 0.310738 +0.227530 0.227530 0.310738 +0.257434 0.227530 0.310738 +0.285092 0.227530 0.310738 +0.310738 0.227530 0.310738 +0.334585 0.227530 0.310738 +0.356818 0.227530 0.310738 +0.377602 0.227530 0.310738 +0.397079 0.227530 0.310738 +0.415373 0.227530 0.310738 +0.432594 0.227530 0.310738 +0.448839 0.227530 0.310738 +0.464192 0.227530 0.310738 +0.478729 0.227530 0.310738 +0.492515 0.227530 0.310738 +0.505612 0.227530 0.310738 +0.518072 0.227530 0.310738 +0.529943 0.227530 0.310738 +0.541266 0.227530 0.310738 +0.552083 0.227530 0.310738 +0.562427 0.227530 0.310738 +0.572331 0.227530 0.310738 +0.581823 0.227530 0.310738 +0.590929 0.227530 0.310738 +0.599674 0.227530 0.310738 +0.608079 0.227530 0.310738 +0.616166 0.227530 0.310738 +0.000001 0.257434 0.310738 +0.037293 0.257434 0.310738 +0.079714 0.257434 0.310738 +0.120832 0.257434 0.310738 +0.159284 0.257434 0.310738 +0.194868 0.257434 0.310738 +0.227530 0.257434 0.310738 +0.257434 0.257434 0.310738 +0.285092 0.257434 0.310738 +0.310738 0.257434 0.310738 +0.334585 0.257434 0.310738 +0.356818 0.257434 0.310738 +0.377602 0.257434 0.310738 +0.397079 0.257434 0.310738 +0.415373 0.257434 0.310738 +0.432594 0.257434 0.310738 +0.448839 0.257434 0.310738 +0.464192 0.257434 0.310738 +0.478729 0.257434 0.310738 +0.492515 0.257434 0.310738 +0.505612 0.257434 0.310738 +0.518072 0.257434 0.310738 +0.529943 0.257434 0.310738 +0.541266 0.257434 0.310738 +0.552083 0.257434 0.310738 +0.562427 0.257434 0.310738 +0.572331 0.257434 0.310738 +0.581823 0.257434 0.310738 +0.590929 0.257434 0.310738 +0.599674 0.257434 0.310738 +0.608079 0.257434 0.310738 +0.616166 0.257434 0.310738 +0.000001 0.285092 0.310738 +0.037293 0.285092 0.310738 +0.079714 0.285092 0.310738 +0.120832 0.285092 0.310738 +0.159284 0.285092 0.310738 +0.194868 0.285092 0.310738 +0.227530 0.285092 0.310738 +0.257434 0.285092 0.310738 +0.285092 0.285092 0.310738 +0.310738 0.285092 0.310738 +0.334585 0.285092 0.310738 +0.356818 0.285092 0.310738 +0.377602 0.285092 0.310738 +0.397079 0.285092 0.310738 +0.415373 0.285092 0.310738 +0.432594 0.285092 0.310738 +0.448839 0.285092 0.310738 +0.464192 0.285092 0.310738 +0.478729 0.285092 0.310738 +0.492515 0.285092 0.310738 +0.505612 0.285092 0.310738 +0.518072 0.285092 0.310738 +0.529943 0.285092 0.310738 +0.541266 0.285092 0.310738 +0.552083 0.285092 0.310738 +0.562427 0.285092 0.310738 +0.572331 0.285092 0.310738 +0.581823 0.285092 0.310738 +0.590929 0.285092 0.310738 +0.599674 0.285092 0.310738 +0.608079 0.285092 0.310738 +0.616166 0.285092 0.310738 +0.000001 0.310738 0.310738 +0.037293 0.310738 0.310738 +0.079714 0.310738 0.310738 +0.120832 0.310738 0.310738 +0.159284 0.310738 0.310738 +0.194868 0.310738 0.310738 +0.227530 0.310738 0.310738 +0.257434 0.310738 0.310738 +0.285092 0.310738 0.310738 +0.310738 0.310738 0.310738 +0.334585 0.310738 0.310738 +0.356818 0.310738 0.310738 +0.377602 0.310738 0.310738 +0.397079 0.310738 0.310738 +0.415373 0.310738 0.310738 +0.432594 0.310738 0.310738 +0.448839 0.310738 0.310738 +0.464192 0.310738 0.310738 +0.478729 0.310738 0.310738 +0.492515 0.310738 0.310738 +0.505612 0.310738 0.310738 +0.518072 0.310738 0.310738 +0.529943 0.310738 0.310738 +0.541266 0.310738 0.310738 +0.552083 0.310738 0.310738 +0.562427 0.310738 0.310738 +0.572331 0.310738 0.310738 +0.581823 0.310738 0.310738 +0.590929 0.310738 0.310738 +0.599674 0.310738 0.310738 +0.608079 0.310738 0.310738 +0.616166 0.310738 0.310738 +0.000001 0.334585 0.310738 +0.037293 0.334585 0.310738 +0.079714 0.334585 0.310738 +0.120832 0.334585 0.310738 +0.159284 0.334585 0.310738 +0.194868 0.334585 0.310738 +0.227530 0.334585 0.310738 +0.257434 0.334585 0.310738 +0.285092 0.334585 0.310738 +0.310738 0.334585 0.310738 +0.334585 0.334585 0.310738 +0.356818 0.334585 0.310738 +0.377602 0.334585 0.310738 +0.397079 0.334585 0.310738 +0.415373 0.334585 0.310738 +0.432594 0.334585 0.310738 +0.448839 0.334585 0.310738 +0.464192 0.334585 0.310738 +0.478729 0.334585 0.310738 +0.492515 0.334585 0.310738 +0.505612 0.334585 0.310738 +0.518072 0.334585 0.310738 +0.529943 0.334585 0.310738 +0.541266 0.334585 0.310738 +0.552083 0.334585 0.310738 +0.562427 0.334585 0.310738 +0.572331 0.334585 0.310738 +0.581823 0.334585 0.310738 +0.590929 0.334585 0.310738 +0.599674 0.334585 0.310738 +0.608079 0.334585 0.310738 +0.616166 0.334585 0.310738 +0.000001 0.356818 0.310738 +0.037293 0.356818 0.310738 +0.079714 0.356818 0.310738 +0.120832 0.356818 0.310738 +0.159284 0.356818 0.310738 +0.194868 0.356818 0.310738 +0.227530 0.356818 0.310738 +0.257434 0.356818 0.310738 +0.285092 0.356818 0.310738 +0.310738 0.356818 0.310738 +0.334585 0.356818 0.310738 +0.356818 0.356818 0.310738 +0.377602 0.356818 0.310738 +0.397079 0.356818 0.310738 +0.415373 0.356818 0.310738 +0.432594 0.356818 0.310738 +0.448839 0.356818 0.310738 +0.464192 0.356818 0.310738 +0.478729 0.356818 0.310738 +0.492515 0.356818 0.310738 +0.505612 0.356818 0.310738 +0.518072 0.356818 0.310738 +0.529943 0.356818 0.310738 +0.541266 0.356818 0.310738 +0.552083 0.356818 0.310738 +0.562427 0.356818 0.310738 +0.572331 0.356818 0.310738 +0.581823 0.356818 0.310738 +0.590929 0.356818 0.310738 +0.599674 0.356818 0.310738 +0.608079 0.356818 0.310738 +0.616166 0.356818 0.310738 +0.000001 0.377602 0.310738 +0.037293 0.377602 0.310738 +0.079714 0.377602 0.310738 +0.120832 0.377602 0.310738 +0.159284 0.377602 0.310738 +0.194868 0.377602 0.310738 +0.227530 0.377602 0.310738 +0.257434 0.377602 0.310738 +0.285092 0.377602 0.310738 +0.310738 0.377602 0.310738 +0.334585 0.377602 0.310738 +0.356818 0.377602 0.310738 +0.377602 0.377602 0.310738 +0.397079 0.377602 0.310738 +0.415373 0.377602 0.310738 +0.432594 0.377602 0.310738 +0.448839 0.377602 0.310738 +0.464192 0.377602 0.310738 +0.478729 0.377602 0.310738 +0.492515 0.377602 0.310738 +0.505612 0.377602 0.310738 +0.518072 0.377602 0.310738 +0.529943 0.377602 0.310738 +0.541266 0.377602 0.310738 +0.552083 0.377602 0.310738 +0.562427 0.377602 0.310738 +0.572331 0.377602 0.310738 +0.581823 0.377602 0.310738 +0.590929 0.377602 0.310738 +0.599674 0.377602 0.310738 +0.608079 0.377602 0.310738 +0.616166 0.377602 0.310738 +0.000001 0.397079 0.310738 +0.037293 0.397079 0.310738 +0.079714 0.397079 0.310738 +0.120832 0.397079 0.310738 +0.159284 0.397079 0.310738 +0.194868 0.397079 0.310738 +0.227530 0.397079 0.310738 +0.257434 0.397079 0.310738 +0.285092 0.397079 0.310738 +0.310738 0.397079 0.310738 +0.334585 0.397079 0.310738 +0.356818 0.397079 0.310738 +0.377602 0.397079 0.310738 +0.397079 0.397079 0.310738 +0.415373 0.397079 0.310738 +0.432594 0.397079 0.310738 +0.448839 0.397079 0.310738 +0.464192 0.397079 0.310738 +0.478729 0.397079 0.310738 +0.492515 0.397079 0.310738 +0.505612 0.397079 0.310738 +0.518072 0.397079 0.310738 +0.529943 0.397079 0.310738 +0.541266 0.397079 0.310738 +0.552083 0.397079 0.310738 +0.562427 0.397079 0.310738 +0.572331 0.397079 0.310738 +0.581823 0.397079 0.310738 +0.590929 0.397079 0.310738 +0.599674 0.397079 0.310738 +0.608079 0.397079 0.310738 +0.616166 0.397079 0.310738 +0.000001 0.415373 0.310738 +0.037293 0.415373 0.310738 +0.079714 0.415373 0.310738 +0.120832 0.415373 0.310738 +0.159284 0.415373 0.310738 +0.194868 0.415373 0.310738 +0.227530 0.415373 0.310738 +0.257434 0.415373 0.310738 +0.285092 0.415373 0.310738 +0.310738 0.415373 0.310738 +0.334585 0.415373 0.310738 +0.356818 0.415373 0.310738 +0.377602 0.415373 0.310738 +0.397079 0.415373 0.310738 +0.415373 0.415373 0.310738 +0.432594 0.415373 0.310738 +0.448839 0.415373 0.310738 +0.464192 0.415373 0.310738 +0.478729 0.415373 0.310738 +0.492515 0.415373 0.310738 +0.505612 0.415373 0.310738 +0.518072 0.415373 0.310738 +0.529943 0.415373 0.310738 +0.541266 0.415373 0.310738 +0.552083 0.415373 0.310738 +0.562427 0.415373 0.310738 +0.572331 0.415373 0.310738 +0.581823 0.415373 0.310738 +0.590929 0.415373 0.310738 +0.599674 0.415373 0.310738 +0.608079 0.415373 0.310738 +0.616166 0.415373 0.310738 +0.000001 0.432594 0.310738 +0.037293 0.432594 0.310738 +0.079714 0.432594 0.310738 +0.120832 0.432594 0.310738 +0.159284 0.432594 0.310738 +0.194868 0.432594 0.310738 +0.227530 0.432594 0.310738 +0.257434 0.432594 0.310738 +0.285092 0.432594 0.310738 +0.310738 0.432594 0.310738 +0.334585 0.432594 0.310738 +0.356818 0.432594 0.310738 +0.377602 0.432594 0.310738 +0.397079 0.432594 0.310738 +0.415373 0.432594 0.310738 +0.432594 0.432594 0.310738 +0.448839 0.432594 0.310738 +0.464192 0.432594 0.310738 +0.478729 0.432594 0.310738 +0.492515 0.432594 0.310738 +0.505612 0.432594 0.310738 +0.518072 0.432594 0.310738 +0.529943 0.432594 0.310738 +0.541266 0.432594 0.310738 +0.552083 0.432594 0.310738 +0.562427 0.432594 0.310738 +0.572331 0.432594 0.310738 +0.581823 0.432594 0.310738 +0.590929 0.432594 0.310738 +0.599674 0.432594 0.310738 +0.608079 0.432594 0.310738 +0.616166 0.432594 0.310738 +0.000001 0.448839 0.310738 +0.037293 0.448839 0.310738 +0.079714 0.448839 0.310738 +0.120832 0.448839 0.310738 +0.159284 0.448839 0.310738 +0.194868 0.448839 0.310738 +0.227530 0.448839 0.310738 +0.257434 0.448839 0.310738 +0.285092 0.448839 0.310738 +0.310738 0.448839 0.310738 +0.334585 0.448839 0.310738 +0.356818 0.448839 0.310738 +0.377602 0.448839 0.310738 +0.397079 0.448839 0.310738 +0.415373 0.448839 0.310738 +0.432594 0.448839 0.310738 +0.448839 0.448839 0.310738 +0.464192 0.448839 0.310738 +0.478729 0.448839 0.310738 +0.492515 0.448839 0.310738 +0.505612 0.448839 0.310738 +0.518072 0.448839 0.310738 +0.529943 0.448839 0.310738 +0.541266 0.448839 0.310738 +0.552083 0.448839 0.310738 +0.562427 0.448839 0.310738 +0.572331 0.448839 0.310738 +0.581823 0.448839 0.310738 +0.590929 0.448839 0.310738 +0.599674 0.448839 0.310738 +0.608079 0.448839 0.310738 +0.616166 0.448839 0.310738 +0.000001 0.464192 0.310738 +0.037293 0.464192 0.310738 +0.079714 0.464192 0.310738 +0.120832 0.464192 0.310738 +0.159284 0.464192 0.310738 +0.194868 0.464192 0.310738 +0.227530 0.464192 0.310738 +0.257434 0.464192 0.310738 +0.285092 0.464192 0.310738 +0.310738 0.464192 0.310738 +0.334585 0.464192 0.310738 +0.356818 0.464192 0.310738 +0.377602 0.464192 0.310738 +0.397079 0.464192 0.310738 +0.415373 0.464192 0.310738 +0.432594 0.464192 0.310738 +0.448839 0.464192 0.310738 +0.464192 0.464192 0.310738 +0.478729 0.464192 0.310738 +0.492515 0.464192 0.310738 +0.505612 0.464192 0.310738 +0.518072 0.464192 0.310738 +0.529943 0.464192 0.310738 +0.541266 0.464192 0.310738 +0.552083 0.464192 0.310738 +0.562427 0.464192 0.310738 +0.572331 0.464192 0.310738 +0.581823 0.464192 0.310738 +0.590929 0.464192 0.310738 +0.599674 0.464192 0.310738 +0.608079 0.464192 0.310738 +0.616166 0.464192 0.310738 +0.000001 0.478729 0.310738 +0.037293 0.478729 0.310738 +0.079714 0.478729 0.310738 +0.120832 0.478729 0.310738 +0.159284 0.478729 0.310738 +0.194868 0.478729 0.310738 +0.227530 0.478729 0.310738 +0.257434 0.478729 0.310738 +0.285092 0.478729 0.310738 +0.310738 0.478729 0.310738 +0.334585 0.478729 0.310738 +0.356818 0.478729 0.310738 +0.377602 0.478729 0.310738 +0.397079 0.478729 0.310738 +0.415373 0.478729 0.310738 +0.432594 0.478729 0.310738 +0.448839 0.478729 0.310738 +0.464192 0.478729 0.310738 +0.478729 0.478729 0.310738 +0.492515 0.478729 0.310738 +0.505612 0.478729 0.310738 +0.518072 0.478729 0.310738 +0.529943 0.478729 0.310738 +0.541266 0.478729 0.310738 +0.552083 0.478729 0.310738 +0.562427 0.478729 0.310738 +0.572331 0.478729 0.310738 +0.581823 0.478729 0.310738 +0.590929 0.478729 0.310738 +0.599674 0.478729 0.310738 +0.608079 0.478729 0.310738 +0.616166 0.478729 0.310738 +0.000001 0.492515 0.310738 +0.037293 0.492515 0.310738 +0.079714 0.492515 0.310738 +0.120832 0.492515 0.310738 +0.159284 0.492515 0.310738 +0.194868 0.492515 0.310738 +0.227530 0.492515 0.310738 +0.257434 0.492515 0.310738 +0.285092 0.492515 0.310738 +0.310738 0.492515 0.310738 +0.334585 0.492515 0.310738 +0.356818 0.492515 0.310738 +0.377602 0.492515 0.310738 +0.397079 0.492515 0.310738 +0.415373 0.492515 0.310738 +0.432594 0.492515 0.310738 +0.448839 0.492515 0.310738 +0.464192 0.492515 0.310738 +0.478729 0.492515 0.310738 +0.492515 0.492515 0.310738 +0.505612 0.492515 0.310738 +0.518072 0.492515 0.310738 +0.529943 0.492515 0.310738 +0.541266 0.492515 0.310738 +0.552083 0.492515 0.310738 +0.562427 0.492515 0.310738 +0.572331 0.492515 0.310738 +0.581823 0.492515 0.310738 +0.590929 0.492515 0.310738 +0.599674 0.492515 0.310738 +0.608079 0.492515 0.310738 +0.616166 0.492515 0.310738 +0.000001 0.505612 0.310738 +0.037293 0.505612 0.310738 +0.079714 0.505612 0.310738 +0.120832 0.505612 0.310738 +0.159284 0.505612 0.310738 +0.194868 0.505612 0.310738 +0.227530 0.505612 0.310738 +0.257434 0.505612 0.310738 +0.285092 0.505612 0.310738 +0.310738 0.505612 0.310738 +0.334585 0.505612 0.310738 +0.356818 0.505612 0.310738 +0.377602 0.505612 0.310738 +0.397079 0.505612 0.310738 +0.415373 0.505612 0.310738 +0.432594 0.505612 0.310738 +0.448839 0.505612 0.310738 +0.464192 0.505612 0.310738 +0.478729 0.505612 0.310738 +0.492515 0.505612 0.310738 +0.505612 0.505612 0.310738 +0.518072 0.505612 0.310738 +0.529943 0.505612 0.310738 +0.541266 0.505612 0.310738 +0.552083 0.505612 0.310738 +0.562427 0.505612 0.310738 +0.572331 0.505612 0.310738 +0.581823 0.505612 0.310738 +0.590929 0.505612 0.310738 +0.599674 0.505612 0.310738 +0.608079 0.505612 0.310738 +0.616166 0.505612 0.310738 +0.000001 0.518072 0.310738 +0.037293 0.518072 0.310738 +0.079714 0.518072 0.310738 +0.120832 0.518072 0.310738 +0.159284 0.518072 0.310738 +0.194868 0.518072 0.310738 +0.227530 0.518072 0.310738 +0.257434 0.518072 0.310738 +0.285092 0.518072 0.310738 +0.310738 0.518072 0.310738 +0.334585 0.518072 0.310738 +0.356818 0.518072 0.310738 +0.377602 0.518072 0.310738 +0.397079 0.518072 0.310738 +0.415373 0.518072 0.310738 +0.432594 0.518072 0.310738 +0.448839 0.518072 0.310738 +0.464192 0.518072 0.310738 +0.478729 0.518072 0.310738 +0.492515 0.518072 0.310738 +0.505612 0.518072 0.310738 +0.518072 0.518072 0.310738 +0.529943 0.518072 0.310738 +0.541266 0.518072 0.310738 +0.552083 0.518072 0.310738 +0.562427 0.518072 0.310738 +0.572331 0.518072 0.310738 +0.581823 0.518072 0.310738 +0.590929 0.518072 0.310738 +0.599674 0.518072 0.310738 +0.608079 0.518072 0.310738 +0.616166 0.518072 0.310738 +0.000001 0.529943 0.310738 +0.037293 0.529943 0.310738 +0.079714 0.529943 0.310738 +0.120832 0.529943 0.310738 +0.159284 0.529943 0.310738 +0.194868 0.529943 0.310738 +0.227530 0.529943 0.310738 +0.257434 0.529943 0.310738 +0.285092 0.529943 0.310738 +0.310738 0.529943 0.310738 +0.334585 0.529943 0.310738 +0.356818 0.529943 0.310738 +0.377602 0.529943 0.310738 +0.397079 0.529943 0.310738 +0.415373 0.529943 0.310738 +0.432594 0.529943 0.310738 +0.448839 0.529943 0.310738 +0.464192 0.529943 0.310738 +0.478729 0.529943 0.310738 +0.492515 0.529943 0.310738 +0.505612 0.529943 0.310738 +0.518072 0.529943 0.310738 +0.529943 0.529943 0.310738 +0.541266 0.529943 0.310738 +0.552083 0.529943 0.310738 +0.562427 0.529943 0.310738 +0.572331 0.529943 0.310738 +0.581823 0.529943 0.310738 +0.590929 0.529943 0.310738 +0.599674 0.529943 0.310738 +0.608079 0.529943 0.310738 +0.616166 0.529943 0.310738 +0.000001 0.541266 0.310738 +0.037293 0.541266 0.310738 +0.079714 0.541266 0.310738 +0.120832 0.541266 0.310738 +0.159284 0.541266 0.310738 +0.194868 0.541266 0.310738 +0.227530 0.541266 0.310738 +0.257434 0.541266 0.310738 +0.285092 0.541266 0.310738 +0.310738 0.541266 0.310738 +0.334585 0.541266 0.310738 +0.356818 0.541266 0.310738 +0.377602 0.541266 0.310738 +0.397079 0.541266 0.310738 +0.415373 0.541266 0.310738 +0.432594 0.541266 0.310738 +0.448839 0.541266 0.310738 +0.464192 0.541266 0.310738 +0.478729 0.541266 0.310738 +0.492515 0.541266 0.310738 +0.505612 0.541266 0.310738 +0.518072 0.541266 0.310738 +0.529943 0.541266 0.310738 +0.541266 0.541266 0.310738 +0.552083 0.541266 0.310738 +0.562427 0.541266 0.310738 +0.572331 0.541266 0.310738 +0.581823 0.541266 0.310738 +0.590929 0.541266 0.310738 +0.599674 0.541266 0.310738 +0.608079 0.541266 0.310738 +0.616166 0.541266 0.310738 +0.000001 0.552083 0.310738 +0.037293 0.552083 0.310738 +0.079714 0.552083 0.310738 +0.120832 0.552083 0.310738 +0.159284 0.552083 0.310738 +0.194868 0.552083 0.310738 +0.227530 0.552083 0.310738 +0.257434 0.552083 0.310738 +0.285092 0.552083 0.310738 +0.310738 0.552083 0.310738 +0.334585 0.552083 0.310738 +0.356818 0.552083 0.310738 +0.377602 0.552083 0.310738 +0.397079 0.552083 0.310738 +0.415373 0.552083 0.310738 +0.432594 0.552083 0.310738 +0.448839 0.552083 0.310738 +0.464192 0.552083 0.310738 +0.478729 0.552083 0.310738 +0.492515 0.552083 0.310738 +0.505612 0.552083 0.310738 +0.518072 0.552083 0.310738 +0.529943 0.552083 0.310738 +0.541266 0.552083 0.310738 +0.552083 0.552083 0.310738 +0.562427 0.552083 0.310738 +0.572331 0.552083 0.310738 +0.581823 0.552083 0.310738 +0.590929 0.552083 0.310738 +0.599674 0.552083 0.310738 +0.608079 0.552083 0.310738 +0.616166 0.552083 0.310738 +0.000001 0.562427 0.310738 +0.037293 0.562427 0.310738 +0.079714 0.562427 0.310738 +0.120832 0.562427 0.310738 +0.159284 0.562427 0.310738 +0.194868 0.562427 0.310738 +0.227530 0.562427 0.310738 +0.257434 0.562427 0.310738 +0.285092 0.562427 0.310738 +0.310738 0.562427 0.310738 +0.334585 0.562427 0.310738 +0.356818 0.562427 0.310738 +0.377602 0.562427 0.310738 +0.397079 0.562427 0.310738 +0.415373 0.562427 0.310738 +0.432594 0.562427 0.310738 +0.448839 0.562427 0.310738 +0.464192 0.562427 0.310738 +0.478729 0.562427 0.310738 +0.492515 0.562427 0.310738 +0.505612 0.562427 0.310738 +0.518072 0.562427 0.310738 +0.529943 0.562427 0.310738 +0.541266 0.562427 0.310738 +0.552083 0.562427 0.310738 +0.562427 0.562427 0.310738 +0.572331 0.562427 0.310738 +0.581823 0.562427 0.310738 +0.590929 0.562427 0.310738 +0.599674 0.562427 0.310738 +0.608079 0.562427 0.310738 +0.616166 0.562427 0.310738 +0.000001 0.572331 0.310738 +0.037293 0.572331 0.310738 +0.079714 0.572331 0.310738 +0.120832 0.572331 0.310738 +0.159284 0.572331 0.310738 +0.194868 0.572331 0.310738 +0.227530 0.572331 0.310738 +0.257434 0.572331 0.310738 +0.285092 0.572331 0.310738 +0.310738 0.572331 0.310738 +0.334585 0.572331 0.310738 +0.356818 0.572331 0.310738 +0.377602 0.572331 0.310738 +0.397079 0.572331 0.310738 +0.415373 0.572331 0.310738 +0.432594 0.572331 0.310738 +0.448839 0.572331 0.310738 +0.464192 0.572331 0.310738 +0.478729 0.572331 0.310738 +0.492515 0.572331 0.310738 +0.505612 0.572331 0.310738 +0.518072 0.572331 0.310738 +0.529943 0.572331 0.310738 +0.541266 0.572331 0.310738 +0.552083 0.572331 0.310738 +0.562427 0.572331 0.310738 +0.572331 0.572331 0.310738 +0.581823 0.572331 0.310738 +0.590929 0.572331 0.310738 +0.599674 0.572331 0.310738 +0.608079 0.572331 0.310738 +0.616166 0.572331 0.310738 +0.000001 0.581823 0.310738 +0.037293 0.581823 0.310738 +0.079714 0.581823 0.310738 +0.120832 0.581823 0.310738 +0.159284 0.581823 0.310738 +0.194868 0.581823 0.310738 +0.227530 0.581823 0.310738 +0.257434 0.581823 0.310738 +0.285092 0.581823 0.310738 +0.310738 0.581823 0.310738 +0.334585 0.581823 0.310738 +0.356818 0.581823 0.310738 +0.377602 0.581823 0.310738 +0.397079 0.581823 0.310738 +0.415373 0.581823 0.310738 +0.432594 0.581823 0.310738 +0.448839 0.581823 0.310738 +0.464192 0.581823 0.310738 +0.478729 0.581823 0.310738 +0.492515 0.581823 0.310738 +0.505612 0.581823 0.310738 +0.518072 0.581823 0.310738 +0.529943 0.581823 0.310738 +0.541266 0.581823 0.310738 +0.552083 0.581823 0.310738 +0.562427 0.581823 0.310738 +0.572331 0.581823 0.310738 +0.581823 0.581823 0.310738 +0.590929 0.581823 0.310738 +0.599674 0.581823 0.310738 +0.608079 0.581823 0.310738 +0.616166 0.581823 0.310738 +0.000001 0.590929 0.310738 +0.037293 0.590929 0.310738 +0.079714 0.590929 0.310738 +0.120832 0.590929 0.310738 +0.159284 0.590929 0.310738 +0.194868 0.590929 0.310738 +0.227530 0.590929 0.310738 +0.257434 0.590929 0.310738 +0.285092 0.590929 0.310738 +0.310738 0.590929 0.310738 +0.334585 0.590929 0.310738 +0.356818 0.590929 0.310738 +0.377602 0.590929 0.310738 +0.397079 0.590929 0.310738 +0.415373 0.590929 0.310738 +0.432594 0.590929 0.310738 +0.448839 0.590929 0.310738 +0.464192 0.590929 0.310738 +0.478729 0.590929 0.310738 +0.492515 0.590929 0.310738 +0.505612 0.590929 0.310738 +0.518072 0.590929 0.310738 +0.529943 0.590929 0.310738 +0.541266 0.590929 0.310738 +0.552083 0.590929 0.310738 +0.562427 0.590929 0.310738 +0.572331 0.590929 0.310738 +0.581823 0.590929 0.310738 +0.590929 0.590929 0.310738 +0.599674 0.590929 0.310738 +0.608079 0.590929 0.310738 +0.616166 0.590929 0.310738 +0.000001 0.599674 0.310738 +0.037293 0.599674 0.310738 +0.079714 0.599674 0.310738 +0.120832 0.599674 0.310738 +0.159284 0.599674 0.310738 +0.194868 0.599674 0.310738 +0.227530 0.599674 0.310738 +0.257434 0.599674 0.310738 +0.285092 0.599674 0.310738 +0.310738 0.599674 0.310738 +0.334585 0.599674 0.310738 +0.356818 0.599674 0.310738 +0.377602 0.599674 0.310738 +0.397079 0.599674 0.310738 +0.415373 0.599674 0.310738 +0.432594 0.599674 0.310738 +0.448839 0.599674 0.310738 +0.464192 0.599674 0.310738 +0.478729 0.599674 0.310738 +0.492515 0.599674 0.310738 +0.505612 0.599674 0.310738 +0.518072 0.599674 0.310738 +0.529943 0.599674 0.310738 +0.541266 0.599674 0.310738 +0.552083 0.599674 0.310738 +0.562427 0.599674 0.310738 +0.572331 0.599674 0.310738 +0.581823 0.599674 0.310738 +0.590929 0.599674 0.310738 +0.599674 0.599674 0.310738 +0.608079 0.599674 0.310738 +0.616166 0.599674 0.310738 +0.000001 0.608079 0.310738 +0.037293 0.608079 0.310738 +0.079714 0.608079 0.310738 +0.120832 0.608079 0.310738 +0.159284 0.608079 0.310738 +0.194868 0.608079 0.310738 +0.227530 0.608079 0.310738 +0.257434 0.608079 0.310738 +0.285092 0.608079 0.310738 +0.310738 0.608079 0.310738 +0.334585 0.608079 0.310738 +0.356818 0.608079 0.310738 +0.377602 0.608079 0.310738 +0.397079 0.608079 0.310738 +0.415373 0.608079 0.310738 +0.432594 0.608079 0.310738 +0.448839 0.608079 0.310738 +0.464192 0.608079 0.310738 +0.478729 0.608079 0.310738 +0.492515 0.608079 0.310738 +0.505612 0.608079 0.310738 +0.518072 0.608079 0.310738 +0.529943 0.608079 0.310738 +0.541266 0.608079 0.310738 +0.552083 0.608079 0.310738 +0.562427 0.608079 0.310738 +0.572331 0.608079 0.310738 +0.581823 0.608079 0.310738 +0.590929 0.608079 0.310738 +0.599674 0.608079 0.310738 +0.608079 0.608079 0.310738 +0.616166 0.608079 0.310738 +0.000001 0.616166 0.310738 +0.037293 0.616166 0.310738 +0.079714 0.616166 0.310738 +0.120832 0.616166 0.310738 +0.159284 0.616166 0.310738 +0.194868 0.616166 0.310738 +0.227530 0.616166 0.310738 +0.257434 0.616166 0.310738 +0.285092 0.616166 0.310738 +0.310738 0.616166 0.310738 +0.334585 0.616166 0.310738 +0.356818 0.616166 0.310738 +0.377602 0.616166 0.310738 +0.397079 0.616166 0.310738 +0.415373 0.616166 0.310738 +0.432594 0.616166 0.310738 +0.448839 0.616166 0.310738 +0.464192 0.616166 0.310738 +0.478729 0.616166 0.310738 +0.492515 0.616166 0.310738 +0.505612 0.616166 0.310738 +0.518072 0.616166 0.310738 +0.529943 0.616166 0.310738 +0.541266 0.616166 0.310738 +0.552083 0.616166 0.310738 +0.562427 0.616166 0.310738 +0.572331 0.616166 0.310738 +0.581823 0.616166 0.310738 +0.590929 0.616166 0.310738 +0.599674 0.616166 0.310738 +0.608079 0.616166 0.310738 +0.616166 0.616166 0.310738 +0.000001 0.000001 0.334585 +0.037293 0.000001 0.334585 +0.079714 0.000001 0.334585 +0.120832 0.000001 0.334585 +0.159284 0.000001 0.334585 +0.194868 0.000001 0.334585 +0.227530 0.000001 0.334585 +0.257434 0.000001 0.334585 +0.285092 0.000001 0.334585 +0.310738 0.000001 0.334585 +0.334585 0.000001 0.334585 +0.356818 0.000001 0.334585 +0.377602 0.000001 0.334585 +0.397079 0.000001 0.334585 +0.415373 0.000001 0.334585 +0.432594 0.000001 0.334585 +0.448839 0.000001 0.334585 +0.464192 0.000001 0.334585 +0.478729 0.000001 0.334585 +0.492515 0.000001 0.334585 +0.505612 0.000001 0.334585 +0.518072 0.000001 0.334585 +0.529943 0.000001 0.334585 +0.541266 0.000001 0.334585 +0.552083 0.000001 0.334585 +0.562427 0.000001 0.334585 +0.572331 0.000001 0.334585 +0.581823 0.000001 0.334585 +0.590929 0.000001 0.334585 +0.599674 0.000001 0.334585 +0.608079 0.000001 0.334585 +0.616166 0.000001 0.334585 +0.000001 0.037293 0.334585 +0.037293 0.037293 0.334585 +0.079714 0.037293 0.334585 +0.120832 0.037293 0.334585 +0.159284 0.037293 0.334585 +0.194868 0.037293 0.334585 +0.227530 0.037293 0.334585 +0.257434 0.037293 0.334585 +0.285092 0.037293 0.334585 +0.310738 0.037293 0.334585 +0.334585 0.037293 0.334585 +0.356818 0.037293 0.334585 +0.377602 0.037293 0.334585 +0.397079 0.037293 0.334585 +0.415373 0.037293 0.334585 +0.432594 0.037293 0.334585 +0.448839 0.037293 0.334585 +0.464192 0.037293 0.334585 +0.478729 0.037293 0.334585 +0.492515 0.037293 0.334585 +0.505612 0.037293 0.334585 +0.518072 0.037293 0.334585 +0.529943 0.037293 0.334585 +0.541266 0.037293 0.334585 +0.552083 0.037293 0.334585 +0.562427 0.037293 0.334585 +0.572331 0.037293 0.334585 +0.581823 0.037293 0.334585 +0.590929 0.037293 0.334585 +0.599674 0.037293 0.334585 +0.608079 0.037293 0.334585 +0.616166 0.037293 0.334585 +0.000001 0.079714 0.334585 +0.037293 0.079714 0.334585 +0.079714 0.079714 0.334585 +0.120832 0.079714 0.334585 +0.159284 0.079714 0.334585 +0.194868 0.079714 0.334585 +0.227530 0.079714 0.334585 +0.257434 0.079714 0.334585 +0.285092 0.079714 0.334585 +0.310738 0.079714 0.334585 +0.334585 0.079714 0.334585 +0.356818 0.079714 0.334585 +0.377602 0.079714 0.334585 +0.397079 0.079714 0.334585 +0.415373 0.079714 0.334585 +0.432594 0.079714 0.334585 +0.448839 0.079714 0.334585 +0.464192 0.079714 0.334585 +0.478729 0.079714 0.334585 +0.492515 0.079714 0.334585 +0.505612 0.079714 0.334585 +0.518072 0.079714 0.334585 +0.529943 0.079714 0.334585 +0.541266 0.079714 0.334585 +0.552083 0.079714 0.334585 +0.562427 0.079714 0.334585 +0.572331 0.079714 0.334585 +0.581823 0.079714 0.334585 +0.590929 0.079714 0.334585 +0.599674 0.079714 0.334585 +0.608079 0.079714 0.334585 +0.616166 0.079714 0.334585 +0.000001 0.120832 0.334585 +0.037293 0.120832 0.334585 +0.079714 0.120832 0.334585 +0.120832 0.120832 0.334585 +0.159284 0.120832 0.334585 +0.194868 0.120832 0.334585 +0.227530 0.120832 0.334585 +0.257434 0.120832 0.334585 +0.285092 0.120832 0.334585 +0.310738 0.120832 0.334585 +0.334585 0.120832 0.334585 +0.356818 0.120832 0.334585 +0.377602 0.120832 0.334585 +0.397079 0.120832 0.334585 +0.415373 0.120832 0.334585 +0.432594 0.120832 0.334585 +0.448839 0.120832 0.334585 +0.464192 0.120832 0.334585 +0.478729 0.120832 0.334585 +0.492515 0.120832 0.334585 +0.505612 0.120832 0.334585 +0.518072 0.120832 0.334585 +0.529943 0.120832 0.334585 +0.541266 0.120832 0.334585 +0.552083 0.120832 0.334585 +0.562427 0.120832 0.334585 +0.572331 0.120832 0.334585 +0.581823 0.120832 0.334585 +0.590929 0.120832 0.334585 +0.599674 0.120832 0.334585 +0.608079 0.120832 0.334585 +0.616166 0.120832 0.334585 +0.000001 0.159284 0.334585 +0.037293 0.159284 0.334585 +0.079714 0.159284 0.334585 +0.120832 0.159284 0.334585 +0.159284 0.159284 0.334585 +0.194868 0.159284 0.334585 +0.227530 0.159284 0.334585 +0.257434 0.159284 0.334585 +0.285092 0.159284 0.334585 +0.310738 0.159284 0.334585 +0.334585 0.159284 0.334585 +0.356818 0.159284 0.334585 +0.377602 0.159284 0.334585 +0.397079 0.159284 0.334585 +0.415373 0.159284 0.334585 +0.432594 0.159284 0.334585 +0.448839 0.159284 0.334585 +0.464192 0.159284 0.334585 +0.478729 0.159284 0.334585 +0.492515 0.159284 0.334585 +0.505612 0.159284 0.334585 +0.518072 0.159284 0.334585 +0.529943 0.159284 0.334585 +0.541266 0.159284 0.334585 +0.552083 0.159284 0.334585 +0.562427 0.159284 0.334585 +0.572331 0.159284 0.334585 +0.581823 0.159284 0.334585 +0.590929 0.159284 0.334585 +0.599674 0.159284 0.334585 +0.608079 0.159284 0.334585 +0.616166 0.159284 0.334585 +0.000001 0.194868 0.334585 +0.037293 0.194868 0.334585 +0.079714 0.194868 0.334585 +0.120832 0.194868 0.334585 +0.159284 0.194868 0.334585 +0.194868 0.194868 0.334585 +0.227530 0.194868 0.334585 +0.257434 0.194868 0.334585 +0.285092 0.194868 0.334585 +0.310738 0.194868 0.334585 +0.334585 0.194868 0.334585 +0.356818 0.194868 0.334585 +0.377602 0.194868 0.334585 +0.397079 0.194868 0.334585 +0.415373 0.194868 0.334585 +0.432594 0.194868 0.334585 +0.448839 0.194868 0.334585 +0.464192 0.194868 0.334585 +0.478729 0.194868 0.334585 +0.492515 0.194868 0.334585 +0.505612 0.194868 0.334585 +0.518072 0.194868 0.334585 +0.529943 0.194868 0.334585 +0.541266 0.194868 0.334585 +0.552083 0.194868 0.334585 +0.562427 0.194868 0.334585 +0.572331 0.194868 0.334585 +0.581823 0.194868 0.334585 +0.590929 0.194868 0.334585 +0.599674 0.194868 0.334585 +0.608079 0.194868 0.334585 +0.616166 0.194868 0.334585 +0.000001 0.227530 0.334585 +0.037293 0.227530 0.334585 +0.079714 0.227530 0.334585 +0.120832 0.227530 0.334585 +0.159284 0.227530 0.334585 +0.194868 0.227530 0.334585 +0.227530 0.227530 0.334585 +0.257434 0.227530 0.334585 +0.285092 0.227530 0.334585 +0.310738 0.227530 0.334585 +0.334585 0.227530 0.334585 +0.356818 0.227530 0.334585 +0.377602 0.227530 0.334585 +0.397079 0.227530 0.334585 +0.415373 0.227530 0.334585 +0.432594 0.227530 0.334585 +0.448839 0.227530 0.334585 +0.464192 0.227530 0.334585 +0.478729 0.227530 0.334585 +0.492515 0.227530 0.334585 +0.505612 0.227530 0.334585 +0.518072 0.227530 0.334585 +0.529943 0.227530 0.334585 +0.541266 0.227530 0.334585 +0.552083 0.227530 0.334585 +0.562427 0.227530 0.334585 +0.572331 0.227530 0.334585 +0.581823 0.227530 0.334585 +0.590929 0.227530 0.334585 +0.599674 0.227530 0.334585 +0.608079 0.227530 0.334585 +0.616166 0.227530 0.334585 +0.000001 0.257434 0.334585 +0.037293 0.257434 0.334585 +0.079714 0.257434 0.334585 +0.120832 0.257434 0.334585 +0.159284 0.257434 0.334585 +0.194868 0.257434 0.334585 +0.227530 0.257434 0.334585 +0.257434 0.257434 0.334585 +0.285092 0.257434 0.334585 +0.310738 0.257434 0.334585 +0.334585 0.257434 0.334585 +0.356818 0.257434 0.334585 +0.377602 0.257434 0.334585 +0.397079 0.257434 0.334585 +0.415373 0.257434 0.334585 +0.432594 0.257434 0.334585 +0.448839 0.257434 0.334585 +0.464192 0.257434 0.334585 +0.478729 0.257434 0.334585 +0.492515 0.257434 0.334585 +0.505612 0.257434 0.334585 +0.518072 0.257434 0.334585 +0.529943 0.257434 0.334585 +0.541266 0.257434 0.334585 +0.552083 0.257434 0.334585 +0.562427 0.257434 0.334585 +0.572331 0.257434 0.334585 +0.581823 0.257434 0.334585 +0.590929 0.257434 0.334585 +0.599674 0.257434 0.334585 +0.608079 0.257434 0.334585 +0.616166 0.257434 0.334585 +0.000001 0.285092 0.334585 +0.037293 0.285092 0.334585 +0.079714 0.285092 0.334585 +0.120832 0.285092 0.334585 +0.159284 0.285092 0.334585 +0.194868 0.285092 0.334585 +0.227530 0.285092 0.334585 +0.257434 0.285092 0.334585 +0.285092 0.285092 0.334585 +0.310738 0.285092 0.334585 +0.334585 0.285092 0.334585 +0.356818 0.285092 0.334585 +0.377602 0.285092 0.334585 +0.397079 0.285092 0.334585 +0.415373 0.285092 0.334585 +0.432594 0.285092 0.334585 +0.448839 0.285092 0.334585 +0.464192 0.285092 0.334585 +0.478729 0.285092 0.334585 +0.492515 0.285092 0.334585 +0.505612 0.285092 0.334585 +0.518072 0.285092 0.334585 +0.529943 0.285092 0.334585 +0.541266 0.285092 0.334585 +0.552083 0.285092 0.334585 +0.562427 0.285092 0.334585 +0.572331 0.285092 0.334585 +0.581823 0.285092 0.334585 +0.590929 0.285092 0.334585 +0.599674 0.285092 0.334585 +0.608079 0.285092 0.334585 +0.616166 0.285092 0.334585 +0.000001 0.310738 0.334585 +0.037293 0.310738 0.334585 +0.079714 0.310738 0.334585 +0.120832 0.310738 0.334585 +0.159284 0.310738 0.334585 +0.194868 0.310738 0.334585 +0.227530 0.310738 0.334585 +0.257434 0.310738 0.334585 +0.285092 0.310738 0.334585 +0.310738 0.310738 0.334585 +0.334585 0.310738 0.334585 +0.356818 0.310738 0.334585 +0.377602 0.310738 0.334585 +0.397079 0.310738 0.334585 +0.415373 0.310738 0.334585 +0.432594 0.310738 0.334585 +0.448839 0.310738 0.334585 +0.464192 0.310738 0.334585 +0.478729 0.310738 0.334585 +0.492515 0.310738 0.334585 +0.505612 0.310738 0.334585 +0.518072 0.310738 0.334585 +0.529943 0.310738 0.334585 +0.541266 0.310738 0.334585 +0.552083 0.310738 0.334585 +0.562427 0.310738 0.334585 +0.572331 0.310738 0.334585 +0.581823 0.310738 0.334585 +0.590929 0.310738 0.334585 +0.599674 0.310738 0.334585 +0.608079 0.310738 0.334585 +0.616166 0.310738 0.334585 +0.000001 0.334585 0.334585 +0.037293 0.334585 0.334585 +0.079714 0.334585 0.334585 +0.120832 0.334585 0.334585 +0.159284 0.334585 0.334585 +0.194868 0.334585 0.334585 +0.227530 0.334585 0.334585 +0.257434 0.334585 0.334585 +0.285092 0.334585 0.334585 +0.310738 0.334585 0.334585 +0.334585 0.334585 0.334585 +0.356818 0.334585 0.334585 +0.377602 0.334585 0.334585 +0.397079 0.334585 0.334585 +0.415373 0.334585 0.334585 +0.432594 0.334585 0.334585 +0.448839 0.334585 0.334585 +0.464192 0.334585 0.334585 +0.478729 0.334585 0.334585 +0.492515 0.334585 0.334585 +0.505612 0.334585 0.334585 +0.518072 0.334585 0.334585 +0.529943 0.334585 0.334585 +0.541266 0.334585 0.334585 +0.552083 0.334585 0.334585 +0.562427 0.334585 0.334585 +0.572331 0.334585 0.334585 +0.581823 0.334585 0.334585 +0.590929 0.334585 0.334585 +0.599674 0.334585 0.334585 +0.608079 0.334585 0.334585 +0.616166 0.334585 0.334585 +0.000001 0.356818 0.334585 +0.037293 0.356818 0.334585 +0.079714 0.356818 0.334585 +0.120832 0.356818 0.334585 +0.159284 0.356818 0.334585 +0.194868 0.356818 0.334585 +0.227530 0.356818 0.334585 +0.257434 0.356818 0.334585 +0.285092 0.356818 0.334585 +0.310738 0.356818 0.334585 +0.334585 0.356818 0.334585 +0.356818 0.356818 0.334585 +0.377602 0.356818 0.334585 +0.397079 0.356818 0.334585 +0.415373 0.356818 0.334585 +0.432594 0.356818 0.334585 +0.448839 0.356818 0.334585 +0.464192 0.356818 0.334585 +0.478729 0.356818 0.334585 +0.492515 0.356818 0.334585 +0.505612 0.356818 0.334585 +0.518072 0.356818 0.334585 +0.529943 0.356818 0.334585 +0.541266 0.356818 0.334585 +0.552083 0.356818 0.334585 +0.562427 0.356818 0.334585 +0.572331 0.356818 0.334585 +0.581823 0.356818 0.334585 +0.590929 0.356818 0.334585 +0.599674 0.356818 0.334585 +0.608079 0.356818 0.334585 +0.616166 0.356818 0.334585 +0.000001 0.377602 0.334585 +0.037293 0.377602 0.334585 +0.079714 0.377602 0.334585 +0.120832 0.377602 0.334585 +0.159284 0.377602 0.334585 +0.194868 0.377602 0.334585 +0.227530 0.377602 0.334585 +0.257434 0.377602 0.334585 +0.285092 0.377602 0.334585 +0.310738 0.377602 0.334585 +0.334585 0.377602 0.334585 +0.356818 0.377602 0.334585 +0.377602 0.377602 0.334585 +0.397079 0.377602 0.334585 +0.415373 0.377602 0.334585 +0.432594 0.377602 0.334585 +0.448839 0.377602 0.334585 +0.464192 0.377602 0.334585 +0.478729 0.377602 0.334585 +0.492515 0.377602 0.334585 +0.505612 0.377602 0.334585 +0.518072 0.377602 0.334585 +0.529943 0.377602 0.334585 +0.541266 0.377602 0.334585 +0.552083 0.377602 0.334585 +0.562427 0.377602 0.334585 +0.572331 0.377602 0.334585 +0.581823 0.377602 0.334585 +0.590929 0.377602 0.334585 +0.599674 0.377602 0.334585 +0.608079 0.377602 0.334585 +0.616166 0.377602 0.334585 +0.000001 0.397079 0.334585 +0.037293 0.397079 0.334585 +0.079714 0.397079 0.334585 +0.120832 0.397079 0.334585 +0.159284 0.397079 0.334585 +0.194868 0.397079 0.334585 +0.227530 0.397079 0.334585 +0.257434 0.397079 0.334585 +0.285092 0.397079 0.334585 +0.310738 0.397079 0.334585 +0.334585 0.397079 0.334585 +0.356818 0.397079 0.334585 +0.377602 0.397079 0.334585 +0.397079 0.397079 0.334585 +0.415373 0.397079 0.334585 +0.432594 0.397079 0.334585 +0.448839 0.397079 0.334585 +0.464192 0.397079 0.334585 +0.478729 0.397079 0.334585 +0.492515 0.397079 0.334585 +0.505612 0.397079 0.334585 +0.518072 0.397079 0.334585 +0.529943 0.397079 0.334585 +0.541266 0.397079 0.334585 +0.552083 0.397079 0.334585 +0.562427 0.397079 0.334585 +0.572331 0.397079 0.334585 +0.581823 0.397079 0.334585 +0.590929 0.397079 0.334585 +0.599674 0.397079 0.334585 +0.608079 0.397079 0.334585 +0.616166 0.397079 0.334585 +0.000001 0.415373 0.334585 +0.037293 0.415373 0.334585 +0.079714 0.415373 0.334585 +0.120832 0.415373 0.334585 +0.159284 0.415373 0.334585 +0.194868 0.415373 0.334585 +0.227530 0.415373 0.334585 +0.257434 0.415373 0.334585 +0.285092 0.415373 0.334585 +0.310738 0.415373 0.334585 +0.334585 0.415373 0.334585 +0.356818 0.415373 0.334585 +0.377602 0.415373 0.334585 +0.397079 0.415373 0.334585 +0.415373 0.415373 0.334585 +0.432594 0.415373 0.334585 +0.448839 0.415373 0.334585 +0.464192 0.415373 0.334585 +0.478729 0.415373 0.334585 +0.492515 0.415373 0.334585 +0.505612 0.415373 0.334585 +0.518072 0.415373 0.334585 +0.529943 0.415373 0.334585 +0.541266 0.415373 0.334585 +0.552083 0.415373 0.334585 +0.562427 0.415373 0.334585 +0.572331 0.415373 0.334585 +0.581823 0.415373 0.334585 +0.590929 0.415373 0.334585 +0.599674 0.415373 0.334585 +0.608079 0.415373 0.334585 +0.616166 0.415373 0.334585 +0.000001 0.432594 0.334585 +0.037293 0.432594 0.334585 +0.079714 0.432594 0.334585 +0.120832 0.432594 0.334585 +0.159284 0.432594 0.334585 +0.194868 0.432594 0.334585 +0.227530 0.432594 0.334585 +0.257434 0.432594 0.334585 +0.285092 0.432594 0.334585 +0.310738 0.432594 0.334585 +0.334585 0.432594 0.334585 +0.356818 0.432594 0.334585 +0.377602 0.432594 0.334585 +0.397079 0.432594 0.334585 +0.415373 0.432594 0.334585 +0.432594 0.432594 0.334585 +0.448839 0.432594 0.334585 +0.464192 0.432594 0.334585 +0.478729 0.432594 0.334585 +0.492515 0.432594 0.334585 +0.505612 0.432594 0.334585 +0.518072 0.432594 0.334585 +0.529943 0.432594 0.334585 +0.541266 0.432594 0.334585 +0.552083 0.432594 0.334585 +0.562427 0.432594 0.334585 +0.572331 0.432594 0.334585 +0.581823 0.432594 0.334585 +0.590929 0.432594 0.334585 +0.599674 0.432594 0.334585 +0.608079 0.432594 0.334585 +0.616166 0.432594 0.334585 +0.000001 0.448839 0.334585 +0.037293 0.448839 0.334585 +0.079714 0.448839 0.334585 +0.120832 0.448839 0.334585 +0.159284 0.448839 0.334585 +0.194868 0.448839 0.334585 +0.227530 0.448839 0.334585 +0.257434 0.448839 0.334585 +0.285092 0.448839 0.334585 +0.310738 0.448839 0.334585 +0.334585 0.448839 0.334585 +0.356818 0.448839 0.334585 +0.377602 0.448839 0.334585 +0.397079 0.448839 0.334585 +0.415373 0.448839 0.334585 +0.432594 0.448839 0.334585 +0.448839 0.448839 0.334585 +0.464192 0.448839 0.334585 +0.478729 0.448839 0.334585 +0.492515 0.448839 0.334585 +0.505612 0.448839 0.334585 +0.518072 0.448839 0.334585 +0.529943 0.448839 0.334585 +0.541266 0.448839 0.334585 +0.552083 0.448839 0.334585 +0.562427 0.448839 0.334585 +0.572331 0.448839 0.334585 +0.581823 0.448839 0.334585 +0.590929 0.448839 0.334585 +0.599674 0.448839 0.334585 +0.608079 0.448839 0.334585 +0.616166 0.448839 0.334585 +0.000001 0.464192 0.334585 +0.037293 0.464192 0.334585 +0.079714 0.464192 0.334585 +0.120832 0.464192 0.334585 +0.159284 0.464192 0.334585 +0.194868 0.464192 0.334585 +0.227530 0.464192 0.334585 +0.257434 0.464192 0.334585 +0.285092 0.464192 0.334585 +0.310738 0.464192 0.334585 +0.334585 0.464192 0.334585 +0.356818 0.464192 0.334585 +0.377602 0.464192 0.334585 +0.397079 0.464192 0.334585 +0.415373 0.464192 0.334585 +0.432594 0.464192 0.334585 +0.448839 0.464192 0.334585 +0.464192 0.464192 0.334585 +0.478729 0.464192 0.334585 +0.492515 0.464192 0.334585 +0.505612 0.464192 0.334585 +0.518072 0.464192 0.334585 +0.529943 0.464192 0.334585 +0.541266 0.464192 0.334585 +0.552083 0.464192 0.334585 +0.562427 0.464192 0.334585 +0.572331 0.464192 0.334585 +0.581823 0.464192 0.334585 +0.590929 0.464192 0.334585 +0.599674 0.464192 0.334585 +0.608079 0.464192 0.334585 +0.616166 0.464192 0.334585 +0.000001 0.478729 0.334585 +0.037293 0.478729 0.334585 +0.079714 0.478729 0.334585 +0.120832 0.478729 0.334585 +0.159284 0.478729 0.334585 +0.194868 0.478729 0.334585 +0.227530 0.478729 0.334585 +0.257434 0.478729 0.334585 +0.285092 0.478729 0.334585 +0.310738 0.478729 0.334585 +0.334585 0.478729 0.334585 +0.356818 0.478729 0.334585 +0.377602 0.478729 0.334585 +0.397079 0.478729 0.334585 +0.415373 0.478729 0.334585 +0.432594 0.478729 0.334585 +0.448839 0.478729 0.334585 +0.464192 0.478729 0.334585 +0.478729 0.478729 0.334585 +0.492515 0.478729 0.334585 +0.505612 0.478729 0.334585 +0.518072 0.478729 0.334585 +0.529943 0.478729 0.334585 +0.541266 0.478729 0.334585 +0.552083 0.478729 0.334585 +0.562427 0.478729 0.334585 +0.572331 0.478729 0.334585 +0.581823 0.478729 0.334585 +0.590929 0.478729 0.334585 +0.599674 0.478729 0.334585 +0.608079 0.478729 0.334585 +0.616166 0.478729 0.334585 +0.000001 0.492515 0.334585 +0.037293 0.492515 0.334585 +0.079714 0.492515 0.334585 +0.120832 0.492515 0.334585 +0.159284 0.492515 0.334585 +0.194868 0.492515 0.334585 +0.227530 0.492515 0.334585 +0.257434 0.492515 0.334585 +0.285092 0.492515 0.334585 +0.310738 0.492515 0.334585 +0.334585 0.492515 0.334585 +0.356818 0.492515 0.334585 +0.377602 0.492515 0.334585 +0.397079 0.492515 0.334585 +0.415373 0.492515 0.334585 +0.432594 0.492515 0.334585 +0.448839 0.492515 0.334585 +0.464192 0.492515 0.334585 +0.478729 0.492515 0.334585 +0.492515 0.492515 0.334585 +0.505612 0.492515 0.334585 +0.518072 0.492515 0.334585 +0.529943 0.492515 0.334585 +0.541266 0.492515 0.334585 +0.552083 0.492515 0.334585 +0.562427 0.492515 0.334585 +0.572331 0.492515 0.334585 +0.581823 0.492515 0.334585 +0.590929 0.492515 0.334585 +0.599674 0.492515 0.334585 +0.608079 0.492515 0.334585 +0.616166 0.492515 0.334585 +0.000001 0.505612 0.334585 +0.037293 0.505612 0.334585 +0.079714 0.505612 0.334585 +0.120832 0.505612 0.334585 +0.159284 0.505612 0.334585 +0.194868 0.505612 0.334585 +0.227530 0.505612 0.334585 +0.257434 0.505612 0.334585 +0.285092 0.505612 0.334585 +0.310738 0.505612 0.334585 +0.334585 0.505612 0.334585 +0.356818 0.505612 0.334585 +0.377602 0.505612 0.334585 +0.397079 0.505612 0.334585 +0.415373 0.505612 0.334585 +0.432594 0.505612 0.334585 +0.448839 0.505612 0.334585 +0.464192 0.505612 0.334585 +0.478729 0.505612 0.334585 +0.492515 0.505612 0.334585 +0.505612 0.505612 0.334585 +0.518072 0.505612 0.334585 +0.529943 0.505612 0.334585 +0.541266 0.505612 0.334585 +0.552083 0.505612 0.334585 +0.562427 0.505612 0.334585 +0.572331 0.505612 0.334585 +0.581823 0.505612 0.334585 +0.590929 0.505612 0.334585 +0.599674 0.505612 0.334585 +0.608079 0.505612 0.334585 +0.616166 0.505612 0.334585 +0.000001 0.518072 0.334585 +0.037293 0.518072 0.334585 +0.079714 0.518072 0.334585 +0.120832 0.518072 0.334585 +0.159284 0.518072 0.334585 +0.194868 0.518072 0.334585 +0.227530 0.518072 0.334585 +0.257434 0.518072 0.334585 +0.285092 0.518072 0.334585 +0.310738 0.518072 0.334585 +0.334585 0.518072 0.334585 +0.356818 0.518072 0.334585 +0.377602 0.518072 0.334585 +0.397079 0.518072 0.334585 +0.415373 0.518072 0.334585 +0.432594 0.518072 0.334585 +0.448839 0.518072 0.334585 +0.464192 0.518072 0.334585 +0.478729 0.518072 0.334585 +0.492515 0.518072 0.334585 +0.505612 0.518072 0.334585 +0.518072 0.518072 0.334585 +0.529943 0.518072 0.334585 +0.541266 0.518072 0.334585 +0.552083 0.518072 0.334585 +0.562427 0.518072 0.334585 +0.572331 0.518072 0.334585 +0.581823 0.518072 0.334585 +0.590929 0.518072 0.334585 +0.599674 0.518072 0.334585 +0.608079 0.518072 0.334585 +0.616166 0.518072 0.334585 +0.000001 0.529943 0.334585 +0.037293 0.529943 0.334585 +0.079714 0.529943 0.334585 +0.120832 0.529943 0.334585 +0.159284 0.529943 0.334585 +0.194868 0.529943 0.334585 +0.227530 0.529943 0.334585 +0.257434 0.529943 0.334585 +0.285092 0.529943 0.334585 +0.310738 0.529943 0.334585 +0.334585 0.529943 0.334585 +0.356818 0.529943 0.334585 +0.377602 0.529943 0.334585 +0.397079 0.529943 0.334585 +0.415373 0.529943 0.334585 +0.432594 0.529943 0.334585 +0.448839 0.529943 0.334585 +0.464192 0.529943 0.334585 +0.478729 0.529943 0.334585 +0.492515 0.529943 0.334585 +0.505612 0.529943 0.334585 +0.518072 0.529943 0.334585 +0.529943 0.529943 0.334585 +0.541266 0.529943 0.334585 +0.552083 0.529943 0.334585 +0.562427 0.529943 0.334585 +0.572331 0.529943 0.334585 +0.581823 0.529943 0.334585 +0.590929 0.529943 0.334585 +0.599674 0.529943 0.334585 +0.608079 0.529943 0.334585 +0.616166 0.529943 0.334585 +0.000001 0.541266 0.334585 +0.037293 0.541266 0.334585 +0.079714 0.541266 0.334585 +0.120832 0.541266 0.334585 +0.159284 0.541266 0.334585 +0.194868 0.541266 0.334585 +0.227530 0.541266 0.334585 +0.257434 0.541266 0.334585 +0.285092 0.541266 0.334585 +0.310738 0.541266 0.334585 +0.334585 0.541266 0.334585 +0.356818 0.541266 0.334585 +0.377602 0.541266 0.334585 +0.397079 0.541266 0.334585 +0.415373 0.541266 0.334585 +0.432594 0.541266 0.334585 +0.448839 0.541266 0.334585 +0.464192 0.541266 0.334585 +0.478729 0.541266 0.334585 +0.492515 0.541266 0.334585 +0.505612 0.541266 0.334585 +0.518072 0.541266 0.334585 +0.529943 0.541266 0.334585 +0.541266 0.541266 0.334585 +0.552083 0.541266 0.334585 +0.562427 0.541266 0.334585 +0.572331 0.541266 0.334585 +0.581823 0.541266 0.334585 +0.590929 0.541266 0.334585 +0.599674 0.541266 0.334585 +0.608079 0.541266 0.334585 +0.616166 0.541266 0.334585 +0.000001 0.552083 0.334585 +0.037293 0.552083 0.334585 +0.079714 0.552083 0.334585 +0.120832 0.552083 0.334585 +0.159284 0.552083 0.334585 +0.194868 0.552083 0.334585 +0.227530 0.552083 0.334585 +0.257434 0.552083 0.334585 +0.285092 0.552083 0.334585 +0.310738 0.552083 0.334585 +0.334585 0.552083 0.334585 +0.356818 0.552083 0.334585 +0.377602 0.552083 0.334585 +0.397079 0.552083 0.334585 +0.415373 0.552083 0.334585 +0.432594 0.552083 0.334585 +0.448839 0.552083 0.334585 +0.464192 0.552083 0.334585 +0.478729 0.552083 0.334585 +0.492515 0.552083 0.334585 +0.505612 0.552083 0.334585 +0.518072 0.552083 0.334585 +0.529943 0.552083 0.334585 +0.541266 0.552083 0.334585 +0.552083 0.552083 0.334585 +0.562427 0.552083 0.334585 +0.572331 0.552083 0.334585 +0.581823 0.552083 0.334585 +0.590929 0.552083 0.334585 +0.599674 0.552083 0.334585 +0.608079 0.552083 0.334585 +0.616166 0.552083 0.334585 +0.000001 0.562427 0.334585 +0.037293 0.562427 0.334585 +0.079714 0.562427 0.334585 +0.120832 0.562427 0.334585 +0.159284 0.562427 0.334585 +0.194868 0.562427 0.334585 +0.227530 0.562427 0.334585 +0.257434 0.562427 0.334585 +0.285092 0.562427 0.334585 +0.310738 0.562427 0.334585 +0.334585 0.562427 0.334585 +0.356818 0.562427 0.334585 +0.377602 0.562427 0.334585 +0.397079 0.562427 0.334585 +0.415373 0.562427 0.334585 +0.432594 0.562427 0.334585 +0.448839 0.562427 0.334585 +0.464192 0.562427 0.334585 +0.478729 0.562427 0.334585 +0.492515 0.562427 0.334585 +0.505612 0.562427 0.334585 +0.518072 0.562427 0.334585 +0.529943 0.562427 0.334585 +0.541266 0.562427 0.334585 +0.552083 0.562427 0.334585 +0.562427 0.562427 0.334585 +0.572331 0.562427 0.334585 +0.581823 0.562427 0.334585 +0.590929 0.562427 0.334585 +0.599674 0.562427 0.334585 +0.608079 0.562427 0.334585 +0.616166 0.562427 0.334585 +0.000001 0.572331 0.334585 +0.037293 0.572331 0.334585 +0.079714 0.572331 0.334585 +0.120832 0.572331 0.334585 +0.159284 0.572331 0.334585 +0.194868 0.572331 0.334585 +0.227530 0.572331 0.334585 +0.257434 0.572331 0.334585 +0.285092 0.572331 0.334585 +0.310738 0.572331 0.334585 +0.334585 0.572331 0.334585 +0.356818 0.572331 0.334585 +0.377602 0.572331 0.334585 +0.397079 0.572331 0.334585 +0.415373 0.572331 0.334585 +0.432594 0.572331 0.334585 +0.448839 0.572331 0.334585 +0.464192 0.572331 0.334585 +0.478729 0.572331 0.334585 +0.492515 0.572331 0.334585 +0.505612 0.572331 0.334585 +0.518072 0.572331 0.334585 +0.529943 0.572331 0.334585 +0.541266 0.572331 0.334585 +0.552083 0.572331 0.334585 +0.562427 0.572331 0.334585 +0.572331 0.572331 0.334585 +0.581823 0.572331 0.334585 +0.590929 0.572331 0.334585 +0.599674 0.572331 0.334585 +0.608079 0.572331 0.334585 +0.616166 0.572331 0.334585 +0.000001 0.581823 0.334585 +0.037293 0.581823 0.334585 +0.079714 0.581823 0.334585 +0.120832 0.581823 0.334585 +0.159284 0.581823 0.334585 +0.194868 0.581823 0.334585 +0.227530 0.581823 0.334585 +0.257434 0.581823 0.334585 +0.285092 0.581823 0.334585 +0.310738 0.581823 0.334585 +0.334585 0.581823 0.334585 +0.356818 0.581823 0.334585 +0.377602 0.581823 0.334585 +0.397079 0.581823 0.334585 +0.415373 0.581823 0.334585 +0.432594 0.581823 0.334585 +0.448839 0.581823 0.334585 +0.464192 0.581823 0.334585 +0.478729 0.581823 0.334585 +0.492515 0.581823 0.334585 +0.505612 0.581823 0.334585 +0.518072 0.581823 0.334585 +0.529943 0.581823 0.334585 +0.541266 0.581823 0.334585 +0.552083 0.581823 0.334585 +0.562427 0.581823 0.334585 +0.572331 0.581823 0.334585 +0.581823 0.581823 0.334585 +0.590929 0.581823 0.334585 +0.599674 0.581823 0.334585 +0.608079 0.581823 0.334585 +0.616166 0.581823 0.334585 +0.000001 0.590929 0.334585 +0.037293 0.590929 0.334585 +0.079714 0.590929 0.334585 +0.120832 0.590929 0.334585 +0.159284 0.590929 0.334585 +0.194868 0.590929 0.334585 +0.227530 0.590929 0.334585 +0.257434 0.590929 0.334585 +0.285092 0.590929 0.334585 +0.310738 0.590929 0.334585 +0.334585 0.590929 0.334585 +0.356818 0.590929 0.334585 +0.377602 0.590929 0.334585 +0.397079 0.590929 0.334585 +0.415373 0.590929 0.334585 +0.432594 0.590929 0.334585 +0.448839 0.590929 0.334585 +0.464192 0.590929 0.334585 +0.478729 0.590929 0.334585 +0.492515 0.590929 0.334585 +0.505612 0.590929 0.334585 +0.518072 0.590929 0.334585 +0.529943 0.590929 0.334585 +0.541266 0.590929 0.334585 +0.552083 0.590929 0.334585 +0.562427 0.590929 0.334585 +0.572331 0.590929 0.334585 +0.581823 0.590929 0.334585 +0.590929 0.590929 0.334585 +0.599674 0.590929 0.334585 +0.608079 0.590929 0.334585 +0.616166 0.590929 0.334585 +0.000001 0.599674 0.334585 +0.037293 0.599674 0.334585 +0.079714 0.599674 0.334585 +0.120832 0.599674 0.334585 +0.159284 0.599674 0.334585 +0.194868 0.599674 0.334585 +0.227530 0.599674 0.334585 +0.257434 0.599674 0.334585 +0.285092 0.599674 0.334585 +0.310738 0.599674 0.334585 +0.334585 0.599674 0.334585 +0.356818 0.599674 0.334585 +0.377602 0.599674 0.334585 +0.397079 0.599674 0.334585 +0.415373 0.599674 0.334585 +0.432594 0.599674 0.334585 +0.448839 0.599674 0.334585 +0.464192 0.599674 0.334585 +0.478729 0.599674 0.334585 +0.492515 0.599674 0.334585 +0.505612 0.599674 0.334585 +0.518072 0.599674 0.334585 +0.529943 0.599674 0.334585 +0.541266 0.599674 0.334585 +0.552083 0.599674 0.334585 +0.562427 0.599674 0.334585 +0.572331 0.599674 0.334585 +0.581823 0.599674 0.334585 +0.590929 0.599674 0.334585 +0.599674 0.599674 0.334585 +0.608079 0.599674 0.334585 +0.616166 0.599674 0.334585 +0.000001 0.608079 0.334585 +0.037293 0.608079 0.334585 +0.079714 0.608079 0.334585 +0.120832 0.608079 0.334585 +0.159284 0.608079 0.334585 +0.194868 0.608079 0.334585 +0.227530 0.608079 0.334585 +0.257434 0.608079 0.334585 +0.285092 0.608079 0.334585 +0.310738 0.608079 0.334585 +0.334585 0.608079 0.334585 +0.356818 0.608079 0.334585 +0.377602 0.608079 0.334585 +0.397079 0.608079 0.334585 +0.415373 0.608079 0.334585 +0.432594 0.608079 0.334585 +0.448839 0.608079 0.334585 +0.464192 0.608079 0.334585 +0.478729 0.608079 0.334585 +0.492515 0.608079 0.334585 +0.505612 0.608079 0.334585 +0.518072 0.608079 0.334585 +0.529943 0.608079 0.334585 +0.541266 0.608079 0.334585 +0.552083 0.608079 0.334585 +0.562427 0.608079 0.334585 +0.572331 0.608079 0.334585 +0.581823 0.608079 0.334585 +0.590929 0.608079 0.334585 +0.599674 0.608079 0.334585 +0.608079 0.608079 0.334585 +0.616166 0.608079 0.334585 +0.000001 0.616166 0.334585 +0.037293 0.616166 0.334585 +0.079714 0.616166 0.334585 +0.120832 0.616166 0.334585 +0.159284 0.616166 0.334585 +0.194868 0.616166 0.334585 +0.227530 0.616166 0.334585 +0.257434 0.616166 0.334585 +0.285092 0.616166 0.334585 +0.310738 0.616166 0.334585 +0.334585 0.616166 0.334585 +0.356818 0.616166 0.334585 +0.377602 0.616166 0.334585 +0.397079 0.616166 0.334585 +0.415373 0.616166 0.334585 +0.432594 0.616166 0.334585 +0.448839 0.616166 0.334585 +0.464192 0.616166 0.334585 +0.478729 0.616166 0.334585 +0.492515 0.616166 0.334585 +0.505612 0.616166 0.334585 +0.518072 0.616166 0.334585 +0.529943 0.616166 0.334585 +0.541266 0.616166 0.334585 +0.552083 0.616166 0.334585 +0.562427 0.616166 0.334585 +0.572331 0.616166 0.334585 +0.581823 0.616166 0.334585 +0.590929 0.616166 0.334585 +0.599674 0.616166 0.334585 +0.608079 0.616166 0.334585 +0.616166 0.616166 0.334585 +0.000001 0.000001 0.356818 +0.037293 0.000001 0.356818 +0.079714 0.000001 0.356818 +0.120832 0.000001 0.356818 +0.159284 0.000001 0.356818 +0.194868 0.000001 0.356818 +0.227530 0.000001 0.356818 +0.257434 0.000001 0.356818 +0.285092 0.000001 0.356818 +0.310738 0.000001 0.356818 +0.334585 0.000001 0.356818 +0.356818 0.000001 0.356818 +0.377602 0.000001 0.356818 +0.397079 0.000001 0.356818 +0.415373 0.000001 0.356818 +0.432594 0.000001 0.356818 +0.448839 0.000001 0.356818 +0.464192 0.000001 0.356818 +0.478729 0.000001 0.356818 +0.492515 0.000001 0.356818 +0.505612 0.000001 0.356818 +0.518072 0.000001 0.356818 +0.529943 0.000001 0.356818 +0.541266 0.000001 0.356818 +0.552083 0.000001 0.356818 +0.562427 0.000001 0.356818 +0.572331 0.000001 0.356818 +0.581823 0.000001 0.356818 +0.590929 0.000001 0.356818 +0.599674 0.000001 0.356818 +0.608079 0.000001 0.356818 +0.616166 0.000001 0.356818 +0.000001 0.037293 0.356818 +0.037293 0.037293 0.356818 +0.079714 0.037293 0.356818 +0.120832 0.037293 0.356818 +0.159284 0.037293 0.356818 +0.194868 0.037293 0.356818 +0.227530 0.037293 0.356818 +0.257434 0.037293 0.356818 +0.285092 0.037293 0.356818 +0.310738 0.037293 0.356818 +0.334585 0.037293 0.356818 +0.356818 0.037293 0.356818 +0.377602 0.037293 0.356818 +0.397079 0.037293 0.356818 +0.415373 0.037293 0.356818 +0.432594 0.037293 0.356818 +0.448839 0.037293 0.356818 +0.464192 0.037293 0.356818 +0.478729 0.037293 0.356818 +0.492515 0.037293 0.356818 +0.505612 0.037293 0.356818 +0.518072 0.037293 0.356818 +0.529943 0.037293 0.356818 +0.541266 0.037293 0.356818 +0.552083 0.037293 0.356818 +0.562427 0.037293 0.356818 +0.572331 0.037293 0.356818 +0.581823 0.037293 0.356818 +0.590929 0.037293 0.356818 +0.599674 0.037293 0.356818 +0.608079 0.037293 0.356818 +0.616166 0.037293 0.356818 +0.000001 0.079714 0.356818 +0.037293 0.079714 0.356818 +0.079714 0.079714 0.356818 +0.120832 0.079714 0.356818 +0.159284 0.079714 0.356818 +0.194868 0.079714 0.356818 +0.227530 0.079714 0.356818 +0.257434 0.079714 0.356818 +0.285092 0.079714 0.356818 +0.310738 0.079714 0.356818 +0.334585 0.079714 0.356818 +0.356818 0.079714 0.356818 +0.377602 0.079714 0.356818 +0.397079 0.079714 0.356818 +0.415373 0.079714 0.356818 +0.432594 0.079714 0.356818 +0.448839 0.079714 0.356818 +0.464192 0.079714 0.356818 +0.478729 0.079714 0.356818 +0.492515 0.079714 0.356818 +0.505612 0.079714 0.356818 +0.518072 0.079714 0.356818 +0.529943 0.079714 0.356818 +0.541266 0.079714 0.356818 +0.552083 0.079714 0.356818 +0.562427 0.079714 0.356818 +0.572331 0.079714 0.356818 +0.581823 0.079714 0.356818 +0.590929 0.079714 0.356818 +0.599674 0.079714 0.356818 +0.608079 0.079714 0.356818 +0.616166 0.079714 0.356818 +0.000001 0.120832 0.356818 +0.037293 0.120832 0.356818 +0.079714 0.120832 0.356818 +0.120832 0.120832 0.356818 +0.159284 0.120832 0.356818 +0.194868 0.120832 0.356818 +0.227530 0.120832 0.356818 +0.257434 0.120832 0.356818 +0.285092 0.120832 0.356818 +0.310738 0.120832 0.356818 +0.334585 0.120832 0.356818 +0.356818 0.120832 0.356818 +0.377602 0.120832 0.356818 +0.397079 0.120832 0.356818 +0.415373 0.120832 0.356818 +0.432594 0.120832 0.356818 +0.448839 0.120832 0.356818 +0.464192 0.120832 0.356818 +0.478729 0.120832 0.356818 +0.492515 0.120832 0.356818 +0.505612 0.120832 0.356818 +0.518072 0.120832 0.356818 +0.529943 0.120832 0.356818 +0.541266 0.120832 0.356818 +0.552083 0.120832 0.356818 +0.562427 0.120832 0.356818 +0.572331 0.120832 0.356818 +0.581823 0.120832 0.356818 +0.590929 0.120832 0.356818 +0.599674 0.120832 0.356818 +0.608079 0.120832 0.356818 +0.616166 0.120832 0.356818 +0.000001 0.159284 0.356818 +0.037293 0.159284 0.356818 +0.079714 0.159284 0.356818 +0.120832 0.159284 0.356818 +0.159284 0.159284 0.356818 +0.194868 0.159284 0.356818 +0.227530 0.159284 0.356818 +0.257434 0.159284 0.356818 +0.285092 0.159284 0.356818 +0.310738 0.159284 0.356818 +0.334585 0.159284 0.356818 +0.356818 0.159284 0.356818 +0.377602 0.159284 0.356818 +0.397079 0.159284 0.356818 +0.415373 0.159284 0.356818 +0.432594 0.159284 0.356818 +0.448839 0.159284 0.356818 +0.464192 0.159284 0.356818 +0.478729 0.159284 0.356818 +0.492515 0.159284 0.356818 +0.505612 0.159284 0.356818 +0.518072 0.159284 0.356818 +0.529943 0.159284 0.356818 +0.541266 0.159284 0.356818 +0.552083 0.159284 0.356818 +0.562427 0.159284 0.356818 +0.572331 0.159284 0.356818 +0.581823 0.159284 0.356818 +0.590929 0.159284 0.356818 +0.599674 0.159284 0.356818 +0.608079 0.159284 0.356818 +0.616166 0.159284 0.356818 +0.000001 0.194868 0.356818 +0.037293 0.194868 0.356818 +0.079714 0.194868 0.356818 +0.120832 0.194868 0.356818 +0.159284 0.194868 0.356818 +0.194868 0.194868 0.356818 +0.227530 0.194868 0.356818 +0.257434 0.194868 0.356818 +0.285092 0.194868 0.356818 +0.310738 0.194868 0.356818 +0.334585 0.194868 0.356818 +0.356818 0.194868 0.356818 +0.377602 0.194868 0.356818 +0.397079 0.194868 0.356818 +0.415373 0.194868 0.356818 +0.432594 0.194868 0.356818 +0.448839 0.194868 0.356818 +0.464192 0.194868 0.356818 +0.478729 0.194868 0.356818 +0.492515 0.194868 0.356818 +0.505612 0.194868 0.356818 +0.518072 0.194868 0.356818 +0.529943 0.194868 0.356818 +0.541266 0.194868 0.356818 +0.552083 0.194868 0.356818 +0.562427 0.194868 0.356818 +0.572331 0.194868 0.356818 +0.581823 0.194868 0.356818 +0.590929 0.194868 0.356818 +0.599674 0.194868 0.356818 +0.608079 0.194868 0.356818 +0.616166 0.194868 0.356818 +0.000001 0.227530 0.356818 +0.037293 0.227530 0.356818 +0.079714 0.227530 0.356818 +0.120832 0.227530 0.356818 +0.159284 0.227530 0.356818 +0.194868 0.227530 0.356818 +0.227530 0.227530 0.356818 +0.257434 0.227530 0.356818 +0.285092 0.227530 0.356818 +0.310738 0.227530 0.356818 +0.334585 0.227530 0.356818 +0.356818 0.227530 0.356818 +0.377602 0.227530 0.356818 +0.397079 0.227530 0.356818 +0.415373 0.227530 0.356818 +0.432594 0.227530 0.356818 +0.448839 0.227530 0.356818 +0.464192 0.227530 0.356818 +0.478729 0.227530 0.356818 +0.492515 0.227530 0.356818 +0.505612 0.227530 0.356818 +0.518072 0.227530 0.356818 +0.529943 0.227530 0.356818 +0.541266 0.227530 0.356818 +0.552083 0.227530 0.356818 +0.562427 0.227530 0.356818 +0.572331 0.227530 0.356818 +0.581823 0.227530 0.356818 +0.590929 0.227530 0.356818 +0.599674 0.227530 0.356818 +0.608079 0.227530 0.356818 +0.616166 0.227530 0.356818 +0.000001 0.257434 0.356818 +0.037293 0.257434 0.356818 +0.079714 0.257434 0.356818 +0.120832 0.257434 0.356818 +0.159284 0.257434 0.356818 +0.194868 0.257434 0.356818 +0.227530 0.257434 0.356818 +0.257434 0.257434 0.356818 +0.285092 0.257434 0.356818 +0.310738 0.257434 0.356818 +0.334585 0.257434 0.356818 +0.356818 0.257434 0.356818 +0.377602 0.257434 0.356818 +0.397079 0.257434 0.356818 +0.415373 0.257434 0.356818 +0.432594 0.257434 0.356818 +0.448839 0.257434 0.356818 +0.464192 0.257434 0.356818 +0.478729 0.257434 0.356818 +0.492515 0.257434 0.356818 +0.505612 0.257434 0.356818 +0.518072 0.257434 0.356818 +0.529943 0.257434 0.356818 +0.541266 0.257434 0.356818 +0.552083 0.257434 0.356818 +0.562427 0.257434 0.356818 +0.572331 0.257434 0.356818 +0.581823 0.257434 0.356818 +0.590929 0.257434 0.356818 +0.599674 0.257434 0.356818 +0.608079 0.257434 0.356818 +0.616166 0.257434 0.356818 +0.000001 0.285092 0.356818 +0.037293 0.285092 0.356818 +0.079714 0.285092 0.356818 +0.120832 0.285092 0.356818 +0.159284 0.285092 0.356818 +0.194868 0.285092 0.356818 +0.227530 0.285092 0.356818 +0.257434 0.285092 0.356818 +0.285092 0.285092 0.356818 +0.310738 0.285092 0.356818 +0.334585 0.285092 0.356818 +0.356818 0.285092 0.356818 +0.377602 0.285092 0.356818 +0.397079 0.285092 0.356818 +0.415373 0.285092 0.356818 +0.432594 0.285092 0.356818 +0.448839 0.285092 0.356818 +0.464192 0.285092 0.356818 +0.478729 0.285092 0.356818 +0.492515 0.285092 0.356818 +0.505612 0.285092 0.356818 +0.518072 0.285092 0.356818 +0.529943 0.285092 0.356818 +0.541266 0.285092 0.356818 +0.552083 0.285092 0.356818 +0.562427 0.285092 0.356818 +0.572331 0.285092 0.356818 +0.581823 0.285092 0.356818 +0.590929 0.285092 0.356818 +0.599674 0.285092 0.356818 +0.608079 0.285092 0.356818 +0.616166 0.285092 0.356818 +0.000001 0.310738 0.356818 +0.037293 0.310738 0.356818 +0.079714 0.310738 0.356818 +0.120832 0.310738 0.356818 +0.159284 0.310738 0.356818 +0.194868 0.310738 0.356818 +0.227530 0.310738 0.356818 +0.257434 0.310738 0.356818 +0.285092 0.310738 0.356818 +0.310738 0.310738 0.356818 +0.334585 0.310738 0.356818 +0.356818 0.310738 0.356818 +0.377602 0.310738 0.356818 +0.397079 0.310738 0.356818 +0.415373 0.310738 0.356818 +0.432594 0.310738 0.356818 +0.448839 0.310738 0.356818 +0.464192 0.310738 0.356818 +0.478729 0.310738 0.356818 +0.492515 0.310738 0.356818 +0.505612 0.310738 0.356818 +0.518072 0.310738 0.356818 +0.529943 0.310738 0.356818 +0.541266 0.310738 0.356818 +0.552083 0.310738 0.356818 +0.562427 0.310738 0.356818 +0.572331 0.310738 0.356818 +0.581823 0.310738 0.356818 +0.590929 0.310738 0.356818 +0.599674 0.310738 0.356818 +0.608079 0.310738 0.356818 +0.616166 0.310738 0.356818 +0.000001 0.334585 0.356818 +0.037293 0.334585 0.356818 +0.079714 0.334585 0.356818 +0.120832 0.334585 0.356818 +0.159284 0.334585 0.356818 +0.194868 0.334585 0.356818 +0.227530 0.334585 0.356818 +0.257434 0.334585 0.356818 +0.285092 0.334585 0.356818 +0.310738 0.334585 0.356818 +0.334585 0.334585 0.356818 +0.356818 0.334585 0.356818 +0.377602 0.334585 0.356818 +0.397079 0.334585 0.356818 +0.415373 0.334585 0.356818 +0.432594 0.334585 0.356818 +0.448839 0.334585 0.356818 +0.464192 0.334585 0.356818 +0.478729 0.334585 0.356818 +0.492515 0.334585 0.356818 +0.505612 0.334585 0.356818 +0.518072 0.334585 0.356818 +0.529943 0.334585 0.356818 +0.541266 0.334585 0.356818 +0.552083 0.334585 0.356818 +0.562427 0.334585 0.356818 +0.572331 0.334585 0.356818 +0.581823 0.334585 0.356818 +0.590929 0.334585 0.356818 +0.599674 0.334585 0.356818 +0.608079 0.334585 0.356818 +0.616166 0.334585 0.356818 +0.000001 0.356818 0.356818 +0.037293 0.356818 0.356818 +0.079714 0.356818 0.356818 +0.120832 0.356818 0.356818 +0.159284 0.356818 0.356818 +0.194868 0.356818 0.356818 +0.227530 0.356818 0.356818 +0.257434 0.356818 0.356818 +0.285092 0.356818 0.356818 +0.310738 0.356818 0.356818 +0.334585 0.356818 0.356818 +0.356818 0.356818 0.356818 +0.377602 0.356818 0.356818 +0.397079 0.356818 0.356818 +0.415373 0.356818 0.356818 +0.432594 0.356818 0.356818 +0.448839 0.356818 0.356818 +0.464192 0.356818 0.356818 +0.478729 0.356818 0.356818 +0.492515 0.356818 0.356818 +0.505612 0.356818 0.356818 +0.518072 0.356818 0.356818 +0.529943 0.356818 0.356818 +0.541266 0.356818 0.356818 +0.552083 0.356818 0.356818 +0.562427 0.356818 0.356818 +0.572331 0.356818 0.356818 +0.581823 0.356818 0.356818 +0.590929 0.356818 0.356818 +0.599674 0.356818 0.356818 +0.608079 0.356818 0.356818 +0.616166 0.356818 0.356818 +0.000001 0.377602 0.356818 +0.037293 0.377602 0.356818 +0.079714 0.377602 0.356818 +0.120832 0.377602 0.356818 +0.159284 0.377602 0.356818 +0.194868 0.377602 0.356818 +0.227530 0.377602 0.356818 +0.257434 0.377602 0.356818 +0.285092 0.377602 0.356818 +0.310738 0.377602 0.356818 +0.334585 0.377602 0.356818 +0.356818 0.377602 0.356818 +0.377602 0.377602 0.356818 +0.397079 0.377602 0.356818 +0.415373 0.377602 0.356818 +0.432594 0.377602 0.356818 +0.448839 0.377602 0.356818 +0.464192 0.377602 0.356818 +0.478729 0.377602 0.356818 +0.492515 0.377602 0.356818 +0.505612 0.377602 0.356818 +0.518072 0.377602 0.356818 +0.529943 0.377602 0.356818 +0.541266 0.377602 0.356818 +0.552083 0.377602 0.356818 +0.562427 0.377602 0.356818 +0.572331 0.377602 0.356818 +0.581823 0.377602 0.356818 +0.590929 0.377602 0.356818 +0.599674 0.377602 0.356818 +0.608079 0.377602 0.356818 +0.616166 0.377602 0.356818 +0.000001 0.397079 0.356818 +0.037293 0.397079 0.356818 +0.079714 0.397079 0.356818 +0.120832 0.397079 0.356818 +0.159284 0.397079 0.356818 +0.194868 0.397079 0.356818 +0.227530 0.397079 0.356818 +0.257434 0.397079 0.356818 +0.285092 0.397079 0.356818 +0.310738 0.397079 0.356818 +0.334585 0.397079 0.356818 +0.356818 0.397079 0.356818 +0.377602 0.397079 0.356818 +0.397079 0.397079 0.356818 +0.415373 0.397079 0.356818 +0.432594 0.397079 0.356818 +0.448839 0.397079 0.356818 +0.464192 0.397079 0.356818 +0.478729 0.397079 0.356818 +0.492515 0.397079 0.356818 +0.505612 0.397079 0.356818 +0.518072 0.397079 0.356818 +0.529943 0.397079 0.356818 +0.541266 0.397079 0.356818 +0.552083 0.397079 0.356818 +0.562427 0.397079 0.356818 +0.572331 0.397079 0.356818 +0.581823 0.397079 0.356818 +0.590929 0.397079 0.356818 +0.599674 0.397079 0.356818 +0.608079 0.397079 0.356818 +0.616166 0.397079 0.356818 +0.000001 0.415373 0.356818 +0.037293 0.415373 0.356818 +0.079714 0.415373 0.356818 +0.120832 0.415373 0.356818 +0.159284 0.415373 0.356818 +0.194868 0.415373 0.356818 +0.227530 0.415373 0.356818 +0.257434 0.415373 0.356818 +0.285092 0.415373 0.356818 +0.310738 0.415373 0.356818 +0.334585 0.415373 0.356818 +0.356818 0.415373 0.356818 +0.377602 0.415373 0.356818 +0.397079 0.415373 0.356818 +0.415373 0.415373 0.356818 +0.432594 0.415373 0.356818 +0.448839 0.415373 0.356818 +0.464192 0.415373 0.356818 +0.478729 0.415373 0.356818 +0.492515 0.415373 0.356818 +0.505612 0.415373 0.356818 +0.518072 0.415373 0.356818 +0.529943 0.415373 0.356818 +0.541266 0.415373 0.356818 +0.552083 0.415373 0.356818 +0.562427 0.415373 0.356818 +0.572331 0.415373 0.356818 +0.581823 0.415373 0.356818 +0.590929 0.415373 0.356818 +0.599674 0.415373 0.356818 +0.608079 0.415373 0.356818 +0.616166 0.415373 0.356818 +0.000001 0.432594 0.356818 +0.037293 0.432594 0.356818 +0.079714 0.432594 0.356818 +0.120832 0.432594 0.356818 +0.159284 0.432594 0.356818 +0.194868 0.432594 0.356818 +0.227530 0.432594 0.356818 +0.257434 0.432594 0.356818 +0.285092 0.432594 0.356818 +0.310738 0.432594 0.356818 +0.334585 0.432594 0.356818 +0.356818 0.432594 0.356818 +0.377602 0.432594 0.356818 +0.397079 0.432594 0.356818 +0.415373 0.432594 0.356818 +0.432594 0.432594 0.356818 +0.448839 0.432594 0.356818 +0.464192 0.432594 0.356818 +0.478729 0.432594 0.356818 +0.492515 0.432594 0.356818 +0.505612 0.432594 0.356818 +0.518072 0.432594 0.356818 +0.529943 0.432594 0.356818 +0.541266 0.432594 0.356818 +0.552083 0.432594 0.356818 +0.562427 0.432594 0.356818 +0.572331 0.432594 0.356818 +0.581823 0.432594 0.356818 +0.590929 0.432594 0.356818 +0.599674 0.432594 0.356818 +0.608079 0.432594 0.356818 +0.616166 0.432594 0.356818 +0.000001 0.448839 0.356818 +0.037293 0.448839 0.356818 +0.079714 0.448839 0.356818 +0.120832 0.448839 0.356818 +0.159284 0.448839 0.356818 +0.194868 0.448839 0.356818 +0.227530 0.448839 0.356818 +0.257434 0.448839 0.356818 +0.285092 0.448839 0.356818 +0.310738 0.448839 0.356818 +0.334585 0.448839 0.356818 +0.356818 0.448839 0.356818 +0.377602 0.448839 0.356818 +0.397079 0.448839 0.356818 +0.415373 0.448839 0.356818 +0.432594 0.448839 0.356818 +0.448839 0.448839 0.356818 +0.464192 0.448839 0.356818 +0.478729 0.448839 0.356818 +0.492515 0.448839 0.356818 +0.505612 0.448839 0.356818 +0.518072 0.448839 0.356818 +0.529943 0.448839 0.356818 +0.541266 0.448839 0.356818 +0.552083 0.448839 0.356818 +0.562427 0.448839 0.356818 +0.572331 0.448839 0.356818 +0.581823 0.448839 0.356818 +0.590929 0.448839 0.356818 +0.599674 0.448839 0.356818 +0.608079 0.448839 0.356818 +0.616166 0.448839 0.356818 +0.000001 0.464192 0.356818 +0.037293 0.464192 0.356818 +0.079714 0.464192 0.356818 +0.120832 0.464192 0.356818 +0.159284 0.464192 0.356818 +0.194868 0.464192 0.356818 +0.227530 0.464192 0.356818 +0.257434 0.464192 0.356818 +0.285092 0.464192 0.356818 +0.310738 0.464192 0.356818 +0.334585 0.464192 0.356818 +0.356818 0.464192 0.356818 +0.377602 0.464192 0.356818 +0.397079 0.464192 0.356818 +0.415373 0.464192 0.356818 +0.432594 0.464192 0.356818 +0.448839 0.464192 0.356818 +0.464192 0.464192 0.356818 +0.478729 0.464192 0.356818 +0.492515 0.464192 0.356818 +0.505612 0.464192 0.356818 +0.518072 0.464192 0.356818 +0.529943 0.464192 0.356818 +0.541266 0.464192 0.356818 +0.552083 0.464192 0.356818 +0.562427 0.464192 0.356818 +0.572331 0.464192 0.356818 +0.581823 0.464192 0.356818 +0.590929 0.464192 0.356818 +0.599674 0.464192 0.356818 +0.608079 0.464192 0.356818 +0.616166 0.464192 0.356818 +0.000001 0.478729 0.356818 +0.037293 0.478729 0.356818 +0.079714 0.478729 0.356818 +0.120832 0.478729 0.356818 +0.159284 0.478729 0.356818 +0.194868 0.478729 0.356818 +0.227530 0.478729 0.356818 +0.257434 0.478729 0.356818 +0.285092 0.478729 0.356818 +0.310738 0.478729 0.356818 +0.334585 0.478729 0.356818 +0.356818 0.478729 0.356818 +0.377602 0.478729 0.356818 +0.397079 0.478729 0.356818 +0.415373 0.478729 0.356818 +0.432594 0.478729 0.356818 +0.448839 0.478729 0.356818 +0.464192 0.478729 0.356818 +0.478729 0.478729 0.356818 +0.492515 0.478729 0.356818 +0.505612 0.478729 0.356818 +0.518072 0.478729 0.356818 +0.529943 0.478729 0.356818 +0.541266 0.478729 0.356818 +0.552083 0.478729 0.356818 +0.562427 0.478729 0.356818 +0.572331 0.478729 0.356818 +0.581823 0.478729 0.356818 +0.590929 0.478729 0.356818 +0.599674 0.478729 0.356818 +0.608079 0.478729 0.356818 +0.616166 0.478729 0.356818 +0.000001 0.492515 0.356818 +0.037293 0.492515 0.356818 +0.079714 0.492515 0.356818 +0.120832 0.492515 0.356818 +0.159284 0.492515 0.356818 +0.194868 0.492515 0.356818 +0.227530 0.492515 0.356818 +0.257434 0.492515 0.356818 +0.285092 0.492515 0.356818 +0.310738 0.492515 0.356818 +0.334585 0.492515 0.356818 +0.356818 0.492515 0.356818 +0.377602 0.492515 0.356818 +0.397079 0.492515 0.356818 +0.415373 0.492515 0.356818 +0.432594 0.492515 0.356818 +0.448839 0.492515 0.356818 +0.464192 0.492515 0.356818 +0.478729 0.492515 0.356818 +0.492515 0.492515 0.356818 +0.505612 0.492515 0.356818 +0.518072 0.492515 0.356818 +0.529943 0.492515 0.356818 +0.541266 0.492515 0.356818 +0.552083 0.492515 0.356818 +0.562427 0.492515 0.356818 +0.572331 0.492515 0.356818 +0.581823 0.492515 0.356818 +0.590929 0.492515 0.356818 +0.599674 0.492515 0.356818 +0.608079 0.492515 0.356818 +0.616166 0.492515 0.356818 +0.000001 0.505612 0.356818 +0.037293 0.505612 0.356818 +0.079714 0.505612 0.356818 +0.120832 0.505612 0.356818 +0.159284 0.505612 0.356818 +0.194868 0.505612 0.356818 +0.227530 0.505612 0.356818 +0.257434 0.505612 0.356818 +0.285092 0.505612 0.356818 +0.310738 0.505612 0.356818 +0.334585 0.505612 0.356818 +0.356818 0.505612 0.356818 +0.377602 0.505612 0.356818 +0.397079 0.505612 0.356818 +0.415373 0.505612 0.356818 +0.432594 0.505612 0.356818 +0.448839 0.505612 0.356818 +0.464192 0.505612 0.356818 +0.478729 0.505612 0.356818 +0.492515 0.505612 0.356818 +0.505612 0.505612 0.356818 +0.518072 0.505612 0.356818 +0.529943 0.505612 0.356818 +0.541266 0.505612 0.356818 +0.552083 0.505612 0.356818 +0.562427 0.505612 0.356818 +0.572331 0.505612 0.356818 +0.581823 0.505612 0.356818 +0.590929 0.505612 0.356818 +0.599674 0.505612 0.356818 +0.608079 0.505612 0.356818 +0.616166 0.505612 0.356818 +0.000001 0.518072 0.356818 +0.037293 0.518072 0.356818 +0.079714 0.518072 0.356818 +0.120832 0.518072 0.356818 +0.159284 0.518072 0.356818 +0.194868 0.518072 0.356818 +0.227530 0.518072 0.356818 +0.257434 0.518072 0.356818 +0.285092 0.518072 0.356818 +0.310738 0.518072 0.356818 +0.334585 0.518072 0.356818 +0.356818 0.518072 0.356818 +0.377602 0.518072 0.356818 +0.397079 0.518072 0.356818 +0.415373 0.518072 0.356818 +0.432594 0.518072 0.356818 +0.448839 0.518072 0.356818 +0.464192 0.518072 0.356818 +0.478729 0.518072 0.356818 +0.492515 0.518072 0.356818 +0.505612 0.518072 0.356818 +0.518072 0.518072 0.356818 +0.529943 0.518072 0.356818 +0.541266 0.518072 0.356818 +0.552083 0.518072 0.356818 +0.562427 0.518072 0.356818 +0.572331 0.518072 0.356818 +0.581823 0.518072 0.356818 +0.590929 0.518072 0.356818 +0.599674 0.518072 0.356818 +0.608079 0.518072 0.356818 +0.616166 0.518072 0.356818 +0.000001 0.529943 0.356818 +0.037293 0.529943 0.356818 +0.079714 0.529943 0.356818 +0.120832 0.529943 0.356818 +0.159284 0.529943 0.356818 +0.194868 0.529943 0.356818 +0.227530 0.529943 0.356818 +0.257434 0.529943 0.356818 +0.285092 0.529943 0.356818 +0.310738 0.529943 0.356818 +0.334585 0.529943 0.356818 +0.356818 0.529943 0.356818 +0.377602 0.529943 0.356818 +0.397079 0.529943 0.356818 +0.415373 0.529943 0.356818 +0.432594 0.529943 0.356818 +0.448839 0.529943 0.356818 +0.464192 0.529943 0.356818 +0.478729 0.529943 0.356818 +0.492515 0.529943 0.356818 +0.505612 0.529943 0.356818 +0.518072 0.529943 0.356818 +0.529943 0.529943 0.356818 +0.541266 0.529943 0.356818 +0.552083 0.529943 0.356818 +0.562427 0.529943 0.356818 +0.572331 0.529943 0.356818 +0.581823 0.529943 0.356818 +0.590929 0.529943 0.356818 +0.599674 0.529943 0.356818 +0.608079 0.529943 0.356818 +0.616166 0.529943 0.356818 +0.000001 0.541266 0.356818 +0.037293 0.541266 0.356818 +0.079714 0.541266 0.356818 +0.120832 0.541266 0.356818 +0.159284 0.541266 0.356818 +0.194868 0.541266 0.356818 +0.227530 0.541266 0.356818 +0.257434 0.541266 0.356818 +0.285092 0.541266 0.356818 +0.310738 0.541266 0.356818 +0.334585 0.541266 0.356818 +0.356818 0.541266 0.356818 +0.377602 0.541266 0.356818 +0.397079 0.541266 0.356818 +0.415373 0.541266 0.356818 +0.432594 0.541266 0.356818 +0.448839 0.541266 0.356818 +0.464192 0.541266 0.356818 +0.478729 0.541266 0.356818 +0.492515 0.541266 0.356818 +0.505612 0.541266 0.356818 +0.518072 0.541266 0.356818 +0.529943 0.541266 0.356818 +0.541266 0.541266 0.356818 +0.552083 0.541266 0.356818 +0.562427 0.541266 0.356818 +0.572331 0.541266 0.356818 +0.581823 0.541266 0.356818 +0.590929 0.541266 0.356818 +0.599674 0.541266 0.356818 +0.608079 0.541266 0.356818 +0.616166 0.541266 0.356818 +0.000001 0.552083 0.356818 +0.037293 0.552083 0.356818 +0.079714 0.552083 0.356818 +0.120832 0.552083 0.356818 +0.159284 0.552083 0.356818 +0.194868 0.552083 0.356818 +0.227530 0.552083 0.356818 +0.257434 0.552083 0.356818 +0.285092 0.552083 0.356818 +0.310738 0.552083 0.356818 +0.334585 0.552083 0.356818 +0.356818 0.552083 0.356818 +0.377602 0.552083 0.356818 +0.397079 0.552083 0.356818 +0.415373 0.552083 0.356818 +0.432594 0.552083 0.356818 +0.448839 0.552083 0.356818 +0.464192 0.552083 0.356818 +0.478729 0.552083 0.356818 +0.492515 0.552083 0.356818 +0.505612 0.552083 0.356818 +0.518072 0.552083 0.356818 +0.529943 0.552083 0.356818 +0.541266 0.552083 0.356818 +0.552083 0.552083 0.356818 +0.562427 0.552083 0.356818 +0.572331 0.552083 0.356818 +0.581823 0.552083 0.356818 +0.590929 0.552083 0.356818 +0.599674 0.552083 0.356818 +0.608079 0.552083 0.356818 +0.616166 0.552083 0.356818 +0.000001 0.562427 0.356818 +0.037293 0.562427 0.356818 +0.079714 0.562427 0.356818 +0.120832 0.562427 0.356818 +0.159284 0.562427 0.356818 +0.194868 0.562427 0.356818 +0.227530 0.562427 0.356818 +0.257434 0.562427 0.356818 +0.285092 0.562427 0.356818 +0.310738 0.562427 0.356818 +0.334585 0.562427 0.356818 +0.356818 0.562427 0.356818 +0.377602 0.562427 0.356818 +0.397079 0.562427 0.356818 +0.415373 0.562427 0.356818 +0.432594 0.562427 0.356818 +0.448839 0.562427 0.356818 +0.464192 0.562427 0.356818 +0.478729 0.562427 0.356818 +0.492515 0.562427 0.356818 +0.505612 0.562427 0.356818 +0.518072 0.562427 0.356818 +0.529943 0.562427 0.356818 +0.541266 0.562427 0.356818 +0.552083 0.562427 0.356818 +0.562427 0.562427 0.356818 +0.572331 0.562427 0.356818 +0.581823 0.562427 0.356818 +0.590929 0.562427 0.356818 +0.599674 0.562427 0.356818 +0.608079 0.562427 0.356818 +0.616166 0.562427 0.356818 +0.000001 0.572331 0.356818 +0.037293 0.572331 0.356818 +0.079714 0.572331 0.356818 +0.120832 0.572331 0.356818 +0.159284 0.572331 0.356818 +0.194868 0.572331 0.356818 +0.227530 0.572331 0.356818 +0.257434 0.572331 0.356818 +0.285092 0.572331 0.356818 +0.310738 0.572331 0.356818 +0.334585 0.572331 0.356818 +0.356818 0.572331 0.356818 +0.377602 0.572331 0.356818 +0.397079 0.572331 0.356818 +0.415373 0.572331 0.356818 +0.432594 0.572331 0.356818 +0.448839 0.572331 0.356818 +0.464192 0.572331 0.356818 +0.478729 0.572331 0.356818 +0.492515 0.572331 0.356818 +0.505612 0.572331 0.356818 +0.518072 0.572331 0.356818 +0.529943 0.572331 0.356818 +0.541266 0.572331 0.356818 +0.552083 0.572331 0.356818 +0.562427 0.572331 0.356818 +0.572331 0.572331 0.356818 +0.581823 0.572331 0.356818 +0.590929 0.572331 0.356818 +0.599674 0.572331 0.356818 +0.608079 0.572331 0.356818 +0.616166 0.572331 0.356818 +0.000001 0.581823 0.356818 +0.037293 0.581823 0.356818 +0.079714 0.581823 0.356818 +0.120832 0.581823 0.356818 +0.159284 0.581823 0.356818 +0.194868 0.581823 0.356818 +0.227530 0.581823 0.356818 +0.257434 0.581823 0.356818 +0.285092 0.581823 0.356818 +0.310738 0.581823 0.356818 +0.334585 0.581823 0.356818 +0.356818 0.581823 0.356818 +0.377602 0.581823 0.356818 +0.397079 0.581823 0.356818 +0.415373 0.581823 0.356818 +0.432594 0.581823 0.356818 +0.448839 0.581823 0.356818 +0.464192 0.581823 0.356818 +0.478729 0.581823 0.356818 +0.492515 0.581823 0.356818 +0.505612 0.581823 0.356818 +0.518072 0.581823 0.356818 +0.529943 0.581823 0.356818 +0.541266 0.581823 0.356818 +0.552083 0.581823 0.356818 +0.562427 0.581823 0.356818 +0.572331 0.581823 0.356818 +0.581823 0.581823 0.356818 +0.590929 0.581823 0.356818 +0.599674 0.581823 0.356818 +0.608079 0.581823 0.356818 +0.616166 0.581823 0.356818 +0.000001 0.590929 0.356818 +0.037293 0.590929 0.356818 +0.079714 0.590929 0.356818 +0.120832 0.590929 0.356818 +0.159284 0.590929 0.356818 +0.194868 0.590929 0.356818 +0.227530 0.590929 0.356818 +0.257434 0.590929 0.356818 +0.285092 0.590929 0.356818 +0.310738 0.590929 0.356818 +0.334585 0.590929 0.356818 +0.356818 0.590929 0.356818 +0.377602 0.590929 0.356818 +0.397079 0.590929 0.356818 +0.415373 0.590929 0.356818 +0.432594 0.590929 0.356818 +0.448839 0.590929 0.356818 +0.464192 0.590929 0.356818 +0.478729 0.590929 0.356818 +0.492515 0.590929 0.356818 +0.505612 0.590929 0.356818 +0.518072 0.590929 0.356818 +0.529943 0.590929 0.356818 +0.541266 0.590929 0.356818 +0.552083 0.590929 0.356818 +0.562427 0.590929 0.356818 +0.572331 0.590929 0.356818 +0.581823 0.590929 0.356818 +0.590929 0.590929 0.356818 +0.599674 0.590929 0.356818 +0.608079 0.590929 0.356818 +0.616166 0.590929 0.356818 +0.000001 0.599674 0.356818 +0.037293 0.599674 0.356818 +0.079714 0.599674 0.356818 +0.120832 0.599674 0.356818 +0.159284 0.599674 0.356818 +0.194868 0.599674 0.356818 +0.227530 0.599674 0.356818 +0.257434 0.599674 0.356818 +0.285092 0.599674 0.356818 +0.310738 0.599674 0.356818 +0.334585 0.599674 0.356818 +0.356818 0.599674 0.356818 +0.377602 0.599674 0.356818 +0.397079 0.599674 0.356818 +0.415373 0.599674 0.356818 +0.432594 0.599674 0.356818 +0.448839 0.599674 0.356818 +0.464192 0.599674 0.356818 +0.478729 0.599674 0.356818 +0.492515 0.599674 0.356818 +0.505612 0.599674 0.356818 +0.518072 0.599674 0.356818 +0.529943 0.599674 0.356818 +0.541266 0.599674 0.356818 +0.552083 0.599674 0.356818 +0.562427 0.599674 0.356818 +0.572331 0.599674 0.356818 +0.581823 0.599674 0.356818 +0.590929 0.599674 0.356818 +0.599674 0.599674 0.356818 +0.608079 0.599674 0.356818 +0.616166 0.599674 0.356818 +0.000001 0.608079 0.356818 +0.037293 0.608079 0.356818 +0.079714 0.608079 0.356818 +0.120832 0.608079 0.356818 +0.159284 0.608079 0.356818 +0.194868 0.608079 0.356818 +0.227530 0.608079 0.356818 +0.257434 0.608079 0.356818 +0.285092 0.608079 0.356818 +0.310738 0.608079 0.356818 +0.334585 0.608079 0.356818 +0.356818 0.608079 0.356818 +0.377602 0.608079 0.356818 +0.397079 0.608079 0.356818 +0.415373 0.608079 0.356818 +0.432594 0.608079 0.356818 +0.448839 0.608079 0.356818 +0.464192 0.608079 0.356818 +0.478729 0.608079 0.356818 +0.492515 0.608079 0.356818 +0.505612 0.608079 0.356818 +0.518072 0.608079 0.356818 +0.529943 0.608079 0.356818 +0.541266 0.608079 0.356818 +0.552083 0.608079 0.356818 +0.562427 0.608079 0.356818 +0.572331 0.608079 0.356818 +0.581823 0.608079 0.356818 +0.590929 0.608079 0.356818 +0.599674 0.608079 0.356818 +0.608079 0.608079 0.356818 +0.616166 0.608079 0.356818 +0.000001 0.616166 0.356818 +0.037293 0.616166 0.356818 +0.079714 0.616166 0.356818 +0.120832 0.616166 0.356818 +0.159284 0.616166 0.356818 +0.194868 0.616166 0.356818 +0.227530 0.616166 0.356818 +0.257434 0.616166 0.356818 +0.285092 0.616166 0.356818 +0.310738 0.616166 0.356818 +0.334585 0.616166 0.356818 +0.356818 0.616166 0.356818 +0.377602 0.616166 0.356818 +0.397079 0.616166 0.356818 +0.415373 0.616166 0.356818 +0.432594 0.616166 0.356818 +0.448839 0.616166 0.356818 +0.464192 0.616166 0.356818 +0.478729 0.616166 0.356818 +0.492515 0.616166 0.356818 +0.505612 0.616166 0.356818 +0.518072 0.616166 0.356818 +0.529943 0.616166 0.356818 +0.541266 0.616166 0.356818 +0.552083 0.616166 0.356818 +0.562427 0.616166 0.356818 +0.572331 0.616166 0.356818 +0.581823 0.616166 0.356818 +0.590929 0.616166 0.356818 +0.599674 0.616166 0.356818 +0.608079 0.616166 0.356818 +0.616166 0.616166 0.356818 +0.000001 0.000001 0.377602 +0.037293 0.000001 0.377602 +0.079714 0.000001 0.377602 +0.120832 0.000001 0.377602 +0.159284 0.000001 0.377602 +0.194868 0.000001 0.377602 +0.227530 0.000001 0.377602 +0.257434 0.000001 0.377602 +0.285092 0.000001 0.377602 +0.310738 0.000001 0.377602 +0.334585 0.000001 0.377602 +0.356818 0.000001 0.377602 +0.377602 0.000001 0.377602 +0.397079 0.000001 0.377602 +0.415373 0.000001 0.377602 +0.432594 0.000001 0.377602 +0.448839 0.000001 0.377602 +0.464192 0.000001 0.377602 +0.478729 0.000001 0.377602 +0.492515 0.000001 0.377602 +0.505612 0.000001 0.377602 +0.518072 0.000001 0.377602 +0.529943 0.000001 0.377602 +0.541266 0.000001 0.377602 +0.552083 0.000001 0.377602 +0.562427 0.000001 0.377602 +0.572331 0.000001 0.377602 +0.581823 0.000001 0.377602 +0.590929 0.000001 0.377602 +0.599674 0.000001 0.377602 +0.608079 0.000001 0.377602 +0.616166 0.000001 0.377602 +0.000001 0.037293 0.377602 +0.037293 0.037293 0.377602 +0.079714 0.037293 0.377602 +0.120832 0.037293 0.377602 +0.159284 0.037293 0.377602 +0.194868 0.037293 0.377602 +0.227530 0.037293 0.377602 +0.257434 0.037293 0.377602 +0.285092 0.037293 0.377602 +0.310738 0.037293 0.377602 +0.334585 0.037293 0.377602 +0.356818 0.037293 0.377602 +0.377602 0.037293 0.377602 +0.397079 0.037293 0.377602 +0.415373 0.037293 0.377602 +0.432594 0.037293 0.377602 +0.448839 0.037293 0.377602 +0.464192 0.037293 0.377602 +0.478729 0.037293 0.377602 +0.492515 0.037293 0.377602 +0.505612 0.037293 0.377602 +0.518072 0.037293 0.377602 +0.529943 0.037293 0.377602 +0.541266 0.037293 0.377602 +0.552083 0.037293 0.377602 +0.562427 0.037293 0.377602 +0.572331 0.037293 0.377602 +0.581823 0.037293 0.377602 +0.590929 0.037293 0.377602 +0.599674 0.037293 0.377602 +0.608079 0.037293 0.377602 +0.616166 0.037293 0.377602 +0.000001 0.079714 0.377602 +0.037293 0.079714 0.377602 +0.079714 0.079714 0.377602 +0.120832 0.079714 0.377602 +0.159284 0.079714 0.377602 +0.194868 0.079714 0.377602 +0.227530 0.079714 0.377602 +0.257434 0.079714 0.377602 +0.285092 0.079714 0.377602 +0.310738 0.079714 0.377602 +0.334585 0.079714 0.377602 +0.356818 0.079714 0.377602 +0.377602 0.079714 0.377602 +0.397079 0.079714 0.377602 +0.415373 0.079714 0.377602 +0.432594 0.079714 0.377602 +0.448839 0.079714 0.377602 +0.464192 0.079714 0.377602 +0.478729 0.079714 0.377602 +0.492515 0.079714 0.377602 +0.505612 0.079714 0.377602 +0.518072 0.079714 0.377602 +0.529943 0.079714 0.377602 +0.541266 0.079714 0.377602 +0.552083 0.079714 0.377602 +0.562427 0.079714 0.377602 +0.572331 0.079714 0.377602 +0.581823 0.079714 0.377602 +0.590929 0.079714 0.377602 +0.599674 0.079714 0.377602 +0.608079 0.079714 0.377602 +0.616166 0.079714 0.377602 +0.000001 0.120832 0.377602 +0.037293 0.120832 0.377602 +0.079714 0.120832 0.377602 +0.120832 0.120832 0.377602 +0.159284 0.120832 0.377602 +0.194868 0.120832 0.377602 +0.227530 0.120832 0.377602 +0.257434 0.120832 0.377602 +0.285092 0.120832 0.377602 +0.310738 0.120832 0.377602 +0.334585 0.120832 0.377602 +0.356818 0.120832 0.377602 +0.377602 0.120832 0.377602 +0.397079 0.120832 0.377602 +0.415373 0.120832 0.377602 +0.432594 0.120832 0.377602 +0.448839 0.120832 0.377602 +0.464192 0.120832 0.377602 +0.478729 0.120832 0.377602 +0.492515 0.120832 0.377602 +0.505612 0.120832 0.377602 +0.518072 0.120832 0.377602 +0.529943 0.120832 0.377602 +0.541266 0.120832 0.377602 +0.552083 0.120832 0.377602 +0.562427 0.120832 0.377602 +0.572331 0.120832 0.377602 +0.581823 0.120832 0.377602 +0.590929 0.120832 0.377602 +0.599674 0.120832 0.377602 +0.608079 0.120832 0.377602 +0.616166 0.120832 0.377602 +0.000001 0.159284 0.377602 +0.037293 0.159284 0.377602 +0.079714 0.159284 0.377602 +0.120832 0.159284 0.377602 +0.159284 0.159284 0.377602 +0.194868 0.159284 0.377602 +0.227530 0.159284 0.377602 +0.257434 0.159284 0.377602 +0.285092 0.159284 0.377602 +0.310738 0.159284 0.377602 +0.334585 0.159284 0.377602 +0.356818 0.159284 0.377602 +0.377602 0.159284 0.377602 +0.397079 0.159284 0.377602 +0.415373 0.159284 0.377602 +0.432594 0.159284 0.377602 +0.448839 0.159284 0.377602 +0.464192 0.159284 0.377602 +0.478729 0.159284 0.377602 +0.492515 0.159284 0.377602 +0.505612 0.159284 0.377602 +0.518072 0.159284 0.377602 +0.529943 0.159284 0.377602 +0.541266 0.159284 0.377602 +0.552083 0.159284 0.377602 +0.562427 0.159284 0.377602 +0.572331 0.159284 0.377602 +0.581823 0.159284 0.377602 +0.590929 0.159284 0.377602 +0.599674 0.159284 0.377602 +0.608079 0.159284 0.377602 +0.616166 0.159284 0.377602 +0.000001 0.194868 0.377602 +0.037293 0.194868 0.377602 +0.079714 0.194868 0.377602 +0.120832 0.194868 0.377602 +0.159284 0.194868 0.377602 +0.194868 0.194868 0.377602 +0.227530 0.194868 0.377602 +0.257434 0.194868 0.377602 +0.285092 0.194868 0.377602 +0.310738 0.194868 0.377602 +0.334585 0.194868 0.377602 +0.356818 0.194868 0.377602 +0.377602 0.194868 0.377602 +0.397079 0.194868 0.377602 +0.415373 0.194868 0.377602 +0.432594 0.194868 0.377602 +0.448839 0.194868 0.377602 +0.464192 0.194868 0.377602 +0.478729 0.194868 0.377602 +0.492515 0.194868 0.377602 +0.505612 0.194868 0.377602 +0.518072 0.194868 0.377602 +0.529943 0.194868 0.377602 +0.541266 0.194868 0.377602 +0.552083 0.194868 0.377602 +0.562427 0.194868 0.377602 +0.572331 0.194868 0.377602 +0.581823 0.194868 0.377602 +0.590929 0.194868 0.377602 +0.599674 0.194868 0.377602 +0.608079 0.194868 0.377602 +0.616166 0.194868 0.377602 +0.000001 0.227530 0.377602 +0.037293 0.227530 0.377602 +0.079714 0.227530 0.377602 +0.120832 0.227530 0.377602 +0.159284 0.227530 0.377602 +0.194868 0.227530 0.377602 +0.227530 0.227530 0.377602 +0.257434 0.227530 0.377602 +0.285092 0.227530 0.377602 +0.310738 0.227530 0.377602 +0.334585 0.227530 0.377602 +0.356818 0.227530 0.377602 +0.377602 0.227530 0.377602 +0.397079 0.227530 0.377602 +0.415373 0.227530 0.377602 +0.432594 0.227530 0.377602 +0.448839 0.227530 0.377602 +0.464192 0.227530 0.377602 +0.478729 0.227530 0.377602 +0.492515 0.227530 0.377602 +0.505612 0.227530 0.377602 +0.518072 0.227530 0.377602 +0.529943 0.227530 0.377602 +0.541266 0.227530 0.377602 +0.552083 0.227530 0.377602 +0.562427 0.227530 0.377602 +0.572331 0.227530 0.377602 +0.581823 0.227530 0.377602 +0.590929 0.227530 0.377602 +0.599674 0.227530 0.377602 +0.608079 0.227530 0.377602 +0.616166 0.227530 0.377602 +0.000001 0.257434 0.377602 +0.037293 0.257434 0.377602 +0.079714 0.257434 0.377602 +0.120832 0.257434 0.377602 +0.159284 0.257434 0.377602 +0.194868 0.257434 0.377602 +0.227530 0.257434 0.377602 +0.257434 0.257434 0.377602 +0.285092 0.257434 0.377602 +0.310738 0.257434 0.377602 +0.334585 0.257434 0.377602 +0.356818 0.257434 0.377602 +0.377602 0.257434 0.377602 +0.397079 0.257434 0.377602 +0.415373 0.257434 0.377602 +0.432594 0.257434 0.377602 +0.448839 0.257434 0.377602 +0.464192 0.257434 0.377602 +0.478729 0.257434 0.377602 +0.492515 0.257434 0.377602 +0.505612 0.257434 0.377602 +0.518072 0.257434 0.377602 +0.529943 0.257434 0.377602 +0.541266 0.257434 0.377602 +0.552083 0.257434 0.377602 +0.562427 0.257434 0.377602 +0.572331 0.257434 0.377602 +0.581823 0.257434 0.377602 +0.590929 0.257434 0.377602 +0.599674 0.257434 0.377602 +0.608079 0.257434 0.377602 +0.616166 0.257434 0.377602 +0.000001 0.285092 0.377602 +0.037293 0.285092 0.377602 +0.079714 0.285092 0.377602 +0.120832 0.285092 0.377602 +0.159284 0.285092 0.377602 +0.194868 0.285092 0.377602 +0.227530 0.285092 0.377602 +0.257434 0.285092 0.377602 +0.285092 0.285092 0.377602 +0.310738 0.285092 0.377602 +0.334585 0.285092 0.377602 +0.356818 0.285092 0.377602 +0.377602 0.285092 0.377602 +0.397079 0.285092 0.377602 +0.415373 0.285092 0.377602 +0.432594 0.285092 0.377602 +0.448839 0.285092 0.377602 +0.464192 0.285092 0.377602 +0.478729 0.285092 0.377602 +0.492515 0.285092 0.377602 +0.505612 0.285092 0.377602 +0.518072 0.285092 0.377602 +0.529943 0.285092 0.377602 +0.541266 0.285092 0.377602 +0.552083 0.285092 0.377602 +0.562427 0.285092 0.377602 +0.572331 0.285092 0.377602 +0.581823 0.285092 0.377602 +0.590929 0.285092 0.377602 +0.599674 0.285092 0.377602 +0.608079 0.285092 0.377602 +0.616166 0.285092 0.377602 +0.000001 0.310738 0.377602 +0.037293 0.310738 0.377602 +0.079714 0.310738 0.377602 +0.120832 0.310738 0.377602 +0.159284 0.310738 0.377602 +0.194868 0.310738 0.377602 +0.227530 0.310738 0.377602 +0.257434 0.310738 0.377602 +0.285092 0.310738 0.377602 +0.310738 0.310738 0.377602 +0.334585 0.310738 0.377602 +0.356818 0.310738 0.377602 +0.377602 0.310738 0.377602 +0.397079 0.310738 0.377602 +0.415373 0.310738 0.377602 +0.432594 0.310738 0.377602 +0.448839 0.310738 0.377602 +0.464192 0.310738 0.377602 +0.478729 0.310738 0.377602 +0.492515 0.310738 0.377602 +0.505612 0.310738 0.377602 +0.518072 0.310738 0.377602 +0.529943 0.310738 0.377602 +0.541266 0.310738 0.377602 +0.552083 0.310738 0.377602 +0.562427 0.310738 0.377602 +0.572331 0.310738 0.377602 +0.581823 0.310738 0.377602 +0.590929 0.310738 0.377602 +0.599674 0.310738 0.377602 +0.608079 0.310738 0.377602 +0.616166 0.310738 0.377602 +0.000001 0.334585 0.377602 +0.037293 0.334585 0.377602 +0.079714 0.334585 0.377602 +0.120832 0.334585 0.377602 +0.159284 0.334585 0.377602 +0.194868 0.334585 0.377602 +0.227530 0.334585 0.377602 +0.257434 0.334585 0.377602 +0.285092 0.334585 0.377602 +0.310738 0.334585 0.377602 +0.334585 0.334585 0.377602 +0.356818 0.334585 0.377602 +0.377602 0.334585 0.377602 +0.397079 0.334585 0.377602 +0.415373 0.334585 0.377602 +0.432594 0.334585 0.377602 +0.448839 0.334585 0.377602 +0.464192 0.334585 0.377602 +0.478729 0.334585 0.377602 +0.492515 0.334585 0.377602 +0.505612 0.334585 0.377602 +0.518072 0.334585 0.377602 +0.529943 0.334585 0.377602 +0.541266 0.334585 0.377602 +0.552083 0.334585 0.377602 +0.562427 0.334585 0.377602 +0.572331 0.334585 0.377602 +0.581823 0.334585 0.377602 +0.590929 0.334585 0.377602 +0.599674 0.334585 0.377602 +0.608079 0.334585 0.377602 +0.616166 0.334585 0.377602 +0.000001 0.356818 0.377602 +0.037293 0.356818 0.377602 +0.079714 0.356818 0.377602 +0.120832 0.356818 0.377602 +0.159284 0.356818 0.377602 +0.194868 0.356818 0.377602 +0.227530 0.356818 0.377602 +0.257434 0.356818 0.377602 +0.285092 0.356818 0.377602 +0.310738 0.356818 0.377602 +0.334585 0.356818 0.377602 +0.356818 0.356818 0.377602 +0.377602 0.356818 0.377602 +0.397079 0.356818 0.377602 +0.415373 0.356818 0.377602 +0.432594 0.356818 0.377602 +0.448839 0.356818 0.377602 +0.464192 0.356818 0.377602 +0.478729 0.356818 0.377602 +0.492515 0.356818 0.377602 +0.505612 0.356818 0.377602 +0.518072 0.356818 0.377602 +0.529943 0.356818 0.377602 +0.541266 0.356818 0.377602 +0.552083 0.356818 0.377602 +0.562427 0.356818 0.377602 +0.572331 0.356818 0.377602 +0.581823 0.356818 0.377602 +0.590929 0.356818 0.377602 +0.599674 0.356818 0.377602 +0.608079 0.356818 0.377602 +0.616166 0.356818 0.377602 +0.000001 0.377602 0.377602 +0.037293 0.377602 0.377602 +0.079714 0.377602 0.377602 +0.120832 0.377602 0.377602 +0.159284 0.377602 0.377602 +0.194868 0.377602 0.377602 +0.227530 0.377602 0.377602 +0.257434 0.377602 0.377602 +0.285092 0.377602 0.377602 +0.310738 0.377602 0.377602 +0.334585 0.377602 0.377602 +0.356818 0.377602 0.377602 +0.377602 0.377602 0.377602 +0.397079 0.377602 0.377602 +0.415373 0.377602 0.377602 +0.432594 0.377602 0.377602 +0.448839 0.377602 0.377602 +0.464192 0.377602 0.377602 +0.478729 0.377602 0.377602 +0.492515 0.377602 0.377602 +0.505612 0.377602 0.377602 +0.518072 0.377602 0.377602 +0.529943 0.377602 0.377602 +0.541266 0.377602 0.377602 +0.552083 0.377602 0.377602 +0.562427 0.377602 0.377602 +0.572331 0.377602 0.377602 +0.581823 0.377602 0.377602 +0.590929 0.377602 0.377602 +0.599674 0.377602 0.377602 +0.608079 0.377602 0.377602 +0.616166 0.377602 0.377602 +0.000001 0.397079 0.377602 +0.037293 0.397079 0.377602 +0.079714 0.397079 0.377602 +0.120832 0.397079 0.377602 +0.159284 0.397079 0.377602 +0.194868 0.397079 0.377602 +0.227530 0.397079 0.377602 +0.257434 0.397079 0.377602 +0.285092 0.397079 0.377602 +0.310738 0.397079 0.377602 +0.334585 0.397079 0.377602 +0.356818 0.397079 0.377602 +0.377602 0.397079 0.377602 +0.397079 0.397079 0.377602 +0.415373 0.397079 0.377602 +0.432594 0.397079 0.377602 +0.448839 0.397079 0.377602 +0.464192 0.397079 0.377602 +0.478729 0.397079 0.377602 +0.492515 0.397079 0.377602 +0.505612 0.397079 0.377602 +0.518072 0.397079 0.377602 +0.529943 0.397079 0.377602 +0.541266 0.397079 0.377602 +0.552083 0.397079 0.377602 +0.562427 0.397079 0.377602 +0.572331 0.397079 0.377602 +0.581823 0.397079 0.377602 +0.590929 0.397079 0.377602 +0.599674 0.397079 0.377602 +0.608079 0.397079 0.377602 +0.616166 0.397079 0.377602 +0.000001 0.415373 0.377602 +0.037293 0.415373 0.377602 +0.079714 0.415373 0.377602 +0.120832 0.415373 0.377602 +0.159284 0.415373 0.377602 +0.194868 0.415373 0.377602 +0.227530 0.415373 0.377602 +0.257434 0.415373 0.377602 +0.285092 0.415373 0.377602 +0.310738 0.415373 0.377602 +0.334585 0.415373 0.377602 +0.356818 0.415373 0.377602 +0.377602 0.415373 0.377602 +0.397079 0.415373 0.377602 +0.415373 0.415373 0.377602 +0.432594 0.415373 0.377602 +0.448839 0.415373 0.377602 +0.464192 0.415373 0.377602 +0.478729 0.415373 0.377602 +0.492515 0.415373 0.377602 +0.505612 0.415373 0.377602 +0.518072 0.415373 0.377602 +0.529943 0.415373 0.377602 +0.541266 0.415373 0.377602 +0.552083 0.415373 0.377602 +0.562427 0.415373 0.377602 +0.572331 0.415373 0.377602 +0.581823 0.415373 0.377602 +0.590929 0.415373 0.377602 +0.599674 0.415373 0.377602 +0.608079 0.415373 0.377602 +0.616166 0.415373 0.377602 +0.000001 0.432594 0.377602 +0.037293 0.432594 0.377602 +0.079714 0.432594 0.377602 +0.120832 0.432594 0.377602 +0.159284 0.432594 0.377602 +0.194868 0.432594 0.377602 +0.227530 0.432594 0.377602 +0.257434 0.432594 0.377602 +0.285092 0.432594 0.377602 +0.310738 0.432594 0.377602 +0.334585 0.432594 0.377602 +0.356818 0.432594 0.377602 +0.377602 0.432594 0.377602 +0.397079 0.432594 0.377602 +0.415373 0.432594 0.377602 +0.432594 0.432594 0.377602 +0.448839 0.432594 0.377602 +0.464192 0.432594 0.377602 +0.478729 0.432594 0.377602 +0.492515 0.432594 0.377602 +0.505612 0.432594 0.377602 +0.518072 0.432594 0.377602 +0.529943 0.432594 0.377602 +0.541266 0.432594 0.377602 +0.552083 0.432594 0.377602 +0.562427 0.432594 0.377602 +0.572331 0.432594 0.377602 +0.581823 0.432594 0.377602 +0.590929 0.432594 0.377602 +0.599674 0.432594 0.377602 +0.608079 0.432594 0.377602 +0.616166 0.432594 0.377602 +0.000001 0.448839 0.377602 +0.037293 0.448839 0.377602 +0.079714 0.448839 0.377602 +0.120832 0.448839 0.377602 +0.159284 0.448839 0.377602 +0.194868 0.448839 0.377602 +0.227530 0.448839 0.377602 +0.257434 0.448839 0.377602 +0.285092 0.448839 0.377602 +0.310738 0.448839 0.377602 +0.334585 0.448839 0.377602 +0.356818 0.448839 0.377602 +0.377602 0.448839 0.377602 +0.397079 0.448839 0.377602 +0.415373 0.448839 0.377602 +0.432594 0.448839 0.377602 +0.448839 0.448839 0.377602 +0.464192 0.448839 0.377602 +0.478729 0.448839 0.377602 +0.492515 0.448839 0.377602 +0.505612 0.448839 0.377602 +0.518072 0.448839 0.377602 +0.529943 0.448839 0.377602 +0.541266 0.448839 0.377602 +0.552083 0.448839 0.377602 +0.562427 0.448839 0.377602 +0.572331 0.448839 0.377602 +0.581823 0.448839 0.377602 +0.590929 0.448839 0.377602 +0.599674 0.448839 0.377602 +0.608079 0.448839 0.377602 +0.616166 0.448839 0.377602 +0.000001 0.464192 0.377602 +0.037293 0.464192 0.377602 +0.079714 0.464192 0.377602 +0.120832 0.464192 0.377602 +0.159284 0.464192 0.377602 +0.194868 0.464192 0.377602 +0.227530 0.464192 0.377602 +0.257434 0.464192 0.377602 +0.285092 0.464192 0.377602 +0.310738 0.464192 0.377602 +0.334585 0.464192 0.377602 +0.356818 0.464192 0.377602 +0.377602 0.464192 0.377602 +0.397079 0.464192 0.377602 +0.415373 0.464192 0.377602 +0.432594 0.464192 0.377602 +0.448839 0.464192 0.377602 +0.464192 0.464192 0.377602 +0.478729 0.464192 0.377602 +0.492515 0.464192 0.377602 +0.505612 0.464192 0.377602 +0.518072 0.464192 0.377602 +0.529943 0.464192 0.377602 +0.541266 0.464192 0.377602 +0.552083 0.464192 0.377602 +0.562427 0.464192 0.377602 +0.572331 0.464192 0.377602 +0.581823 0.464192 0.377602 +0.590929 0.464192 0.377602 +0.599674 0.464192 0.377602 +0.608079 0.464192 0.377602 +0.616166 0.464192 0.377602 +0.000001 0.478729 0.377602 +0.037293 0.478729 0.377602 +0.079714 0.478729 0.377602 +0.120832 0.478729 0.377602 +0.159284 0.478729 0.377602 +0.194868 0.478729 0.377602 +0.227530 0.478729 0.377602 +0.257434 0.478729 0.377602 +0.285092 0.478729 0.377602 +0.310738 0.478729 0.377602 +0.334585 0.478729 0.377602 +0.356818 0.478729 0.377602 +0.377602 0.478729 0.377602 +0.397079 0.478729 0.377602 +0.415373 0.478729 0.377602 +0.432594 0.478729 0.377602 +0.448839 0.478729 0.377602 +0.464192 0.478729 0.377602 +0.478729 0.478729 0.377602 +0.492515 0.478729 0.377602 +0.505612 0.478729 0.377602 +0.518072 0.478729 0.377602 +0.529943 0.478729 0.377602 +0.541266 0.478729 0.377602 +0.552083 0.478729 0.377602 +0.562427 0.478729 0.377602 +0.572331 0.478729 0.377602 +0.581823 0.478729 0.377602 +0.590929 0.478729 0.377602 +0.599674 0.478729 0.377602 +0.608079 0.478729 0.377602 +0.616166 0.478729 0.377602 +0.000001 0.492515 0.377602 +0.037293 0.492515 0.377602 +0.079714 0.492515 0.377602 +0.120832 0.492515 0.377602 +0.159284 0.492515 0.377602 +0.194868 0.492515 0.377602 +0.227530 0.492515 0.377602 +0.257434 0.492515 0.377602 +0.285092 0.492515 0.377602 +0.310738 0.492515 0.377602 +0.334585 0.492515 0.377602 +0.356818 0.492515 0.377602 +0.377602 0.492515 0.377602 +0.397079 0.492515 0.377602 +0.415373 0.492515 0.377602 +0.432594 0.492515 0.377602 +0.448839 0.492515 0.377602 +0.464192 0.492515 0.377602 +0.478729 0.492515 0.377602 +0.492515 0.492515 0.377602 +0.505612 0.492515 0.377602 +0.518072 0.492515 0.377602 +0.529943 0.492515 0.377602 +0.541266 0.492515 0.377602 +0.552083 0.492515 0.377602 +0.562427 0.492515 0.377602 +0.572331 0.492515 0.377602 +0.581823 0.492515 0.377602 +0.590929 0.492515 0.377602 +0.599674 0.492515 0.377602 +0.608079 0.492515 0.377602 +0.616166 0.492515 0.377602 +0.000001 0.505612 0.377602 +0.037293 0.505612 0.377602 +0.079714 0.505612 0.377602 +0.120832 0.505612 0.377602 +0.159284 0.505612 0.377602 +0.194868 0.505612 0.377602 +0.227530 0.505612 0.377602 +0.257434 0.505612 0.377602 +0.285092 0.505612 0.377602 +0.310738 0.505612 0.377602 +0.334585 0.505612 0.377602 +0.356818 0.505612 0.377602 +0.377602 0.505612 0.377602 +0.397079 0.505612 0.377602 +0.415373 0.505612 0.377602 +0.432594 0.505612 0.377602 +0.448839 0.505612 0.377602 +0.464192 0.505612 0.377602 +0.478729 0.505612 0.377602 +0.492515 0.505612 0.377602 +0.505612 0.505612 0.377602 +0.518072 0.505612 0.377602 +0.529943 0.505612 0.377602 +0.541266 0.505612 0.377602 +0.552083 0.505612 0.377602 +0.562427 0.505612 0.377602 +0.572331 0.505612 0.377602 +0.581823 0.505612 0.377602 +0.590929 0.505612 0.377602 +0.599674 0.505612 0.377602 +0.608079 0.505612 0.377602 +0.616166 0.505612 0.377602 +0.000001 0.518072 0.377602 +0.037293 0.518072 0.377602 +0.079714 0.518072 0.377602 +0.120832 0.518072 0.377602 +0.159284 0.518072 0.377602 +0.194868 0.518072 0.377602 +0.227530 0.518072 0.377602 +0.257434 0.518072 0.377602 +0.285092 0.518072 0.377602 +0.310738 0.518072 0.377602 +0.334585 0.518072 0.377602 +0.356818 0.518072 0.377602 +0.377602 0.518072 0.377602 +0.397079 0.518072 0.377602 +0.415373 0.518072 0.377602 +0.432594 0.518072 0.377602 +0.448839 0.518072 0.377602 +0.464192 0.518072 0.377602 +0.478729 0.518072 0.377602 +0.492515 0.518072 0.377602 +0.505612 0.518072 0.377602 +0.518072 0.518072 0.377602 +0.529943 0.518072 0.377602 +0.541266 0.518072 0.377602 +0.552083 0.518072 0.377602 +0.562427 0.518072 0.377602 +0.572331 0.518072 0.377602 +0.581823 0.518072 0.377602 +0.590929 0.518072 0.377602 +0.599674 0.518072 0.377602 +0.608079 0.518072 0.377602 +0.616166 0.518072 0.377602 +0.000001 0.529943 0.377602 +0.037293 0.529943 0.377602 +0.079714 0.529943 0.377602 +0.120832 0.529943 0.377602 +0.159284 0.529943 0.377602 +0.194868 0.529943 0.377602 +0.227530 0.529943 0.377602 +0.257434 0.529943 0.377602 +0.285092 0.529943 0.377602 +0.310738 0.529943 0.377602 +0.334585 0.529943 0.377602 +0.356818 0.529943 0.377602 +0.377602 0.529943 0.377602 +0.397079 0.529943 0.377602 +0.415373 0.529943 0.377602 +0.432594 0.529943 0.377602 +0.448839 0.529943 0.377602 +0.464192 0.529943 0.377602 +0.478729 0.529943 0.377602 +0.492515 0.529943 0.377602 +0.505612 0.529943 0.377602 +0.518072 0.529943 0.377602 +0.529943 0.529943 0.377602 +0.541266 0.529943 0.377602 +0.552083 0.529943 0.377602 +0.562427 0.529943 0.377602 +0.572331 0.529943 0.377602 +0.581823 0.529943 0.377602 +0.590929 0.529943 0.377602 +0.599674 0.529943 0.377602 +0.608079 0.529943 0.377602 +0.616166 0.529943 0.377602 +0.000001 0.541266 0.377602 +0.037293 0.541266 0.377602 +0.079714 0.541266 0.377602 +0.120832 0.541266 0.377602 +0.159284 0.541266 0.377602 +0.194868 0.541266 0.377602 +0.227530 0.541266 0.377602 +0.257434 0.541266 0.377602 +0.285092 0.541266 0.377602 +0.310738 0.541266 0.377602 +0.334585 0.541266 0.377602 +0.356818 0.541266 0.377602 +0.377602 0.541266 0.377602 +0.397079 0.541266 0.377602 +0.415373 0.541266 0.377602 +0.432594 0.541266 0.377602 +0.448839 0.541266 0.377602 +0.464192 0.541266 0.377602 +0.478729 0.541266 0.377602 +0.492515 0.541266 0.377602 +0.505612 0.541266 0.377602 +0.518072 0.541266 0.377602 +0.529943 0.541266 0.377602 +0.541266 0.541266 0.377602 +0.552083 0.541266 0.377602 +0.562427 0.541266 0.377602 +0.572331 0.541266 0.377602 +0.581823 0.541266 0.377602 +0.590929 0.541266 0.377602 +0.599674 0.541266 0.377602 +0.608079 0.541266 0.377602 +0.616166 0.541266 0.377602 +0.000001 0.552083 0.377602 +0.037293 0.552083 0.377602 +0.079714 0.552083 0.377602 +0.120832 0.552083 0.377602 +0.159284 0.552083 0.377602 +0.194868 0.552083 0.377602 +0.227530 0.552083 0.377602 +0.257434 0.552083 0.377602 +0.285092 0.552083 0.377602 +0.310738 0.552083 0.377602 +0.334585 0.552083 0.377602 +0.356818 0.552083 0.377602 +0.377602 0.552083 0.377602 +0.397079 0.552083 0.377602 +0.415373 0.552083 0.377602 +0.432594 0.552083 0.377602 +0.448839 0.552083 0.377602 +0.464192 0.552083 0.377602 +0.478729 0.552083 0.377602 +0.492515 0.552083 0.377602 +0.505612 0.552083 0.377602 +0.518072 0.552083 0.377602 +0.529943 0.552083 0.377602 +0.541266 0.552083 0.377602 +0.552083 0.552083 0.377602 +0.562427 0.552083 0.377602 +0.572331 0.552083 0.377602 +0.581823 0.552083 0.377602 +0.590929 0.552083 0.377602 +0.599674 0.552083 0.377602 +0.608079 0.552083 0.377602 +0.616166 0.552083 0.377602 +0.000001 0.562427 0.377602 +0.037293 0.562427 0.377602 +0.079714 0.562427 0.377602 +0.120832 0.562427 0.377602 +0.159284 0.562427 0.377602 +0.194868 0.562427 0.377602 +0.227530 0.562427 0.377602 +0.257434 0.562427 0.377602 +0.285092 0.562427 0.377602 +0.310738 0.562427 0.377602 +0.334585 0.562427 0.377602 +0.356818 0.562427 0.377602 +0.377602 0.562427 0.377602 +0.397079 0.562427 0.377602 +0.415373 0.562427 0.377602 +0.432594 0.562427 0.377602 +0.448839 0.562427 0.377602 +0.464192 0.562427 0.377602 +0.478729 0.562427 0.377602 +0.492515 0.562427 0.377602 +0.505612 0.562427 0.377602 +0.518072 0.562427 0.377602 +0.529943 0.562427 0.377602 +0.541266 0.562427 0.377602 +0.552083 0.562427 0.377602 +0.562427 0.562427 0.377602 +0.572331 0.562427 0.377602 +0.581823 0.562427 0.377602 +0.590929 0.562427 0.377602 +0.599674 0.562427 0.377602 +0.608079 0.562427 0.377602 +0.616166 0.562427 0.377602 +0.000001 0.572331 0.377602 +0.037293 0.572331 0.377602 +0.079714 0.572331 0.377602 +0.120832 0.572331 0.377602 +0.159284 0.572331 0.377602 +0.194868 0.572331 0.377602 +0.227530 0.572331 0.377602 +0.257434 0.572331 0.377602 +0.285092 0.572331 0.377602 +0.310738 0.572331 0.377602 +0.334585 0.572331 0.377602 +0.356818 0.572331 0.377602 +0.377602 0.572331 0.377602 +0.397079 0.572331 0.377602 +0.415373 0.572331 0.377602 +0.432594 0.572331 0.377602 +0.448839 0.572331 0.377602 +0.464192 0.572331 0.377602 +0.478729 0.572331 0.377602 +0.492515 0.572331 0.377602 +0.505612 0.572331 0.377602 +0.518072 0.572331 0.377602 +0.529943 0.572331 0.377602 +0.541266 0.572331 0.377602 +0.552083 0.572331 0.377602 +0.562427 0.572331 0.377602 +0.572331 0.572331 0.377602 +0.581823 0.572331 0.377602 +0.590929 0.572331 0.377602 +0.599674 0.572331 0.377602 +0.608079 0.572331 0.377602 +0.616166 0.572331 0.377602 +0.000001 0.581823 0.377602 +0.037293 0.581823 0.377602 +0.079714 0.581823 0.377602 +0.120832 0.581823 0.377602 +0.159284 0.581823 0.377602 +0.194868 0.581823 0.377602 +0.227530 0.581823 0.377602 +0.257434 0.581823 0.377602 +0.285092 0.581823 0.377602 +0.310738 0.581823 0.377602 +0.334585 0.581823 0.377602 +0.356818 0.581823 0.377602 +0.377602 0.581823 0.377602 +0.397079 0.581823 0.377602 +0.415373 0.581823 0.377602 +0.432594 0.581823 0.377602 +0.448839 0.581823 0.377602 +0.464192 0.581823 0.377602 +0.478729 0.581823 0.377602 +0.492515 0.581823 0.377602 +0.505612 0.581823 0.377602 +0.518072 0.581823 0.377602 +0.529943 0.581823 0.377602 +0.541266 0.581823 0.377602 +0.552083 0.581823 0.377602 +0.562427 0.581823 0.377602 +0.572331 0.581823 0.377602 +0.581823 0.581823 0.377602 +0.590929 0.581823 0.377602 +0.599674 0.581823 0.377602 +0.608079 0.581823 0.377602 +0.616166 0.581823 0.377602 +0.000001 0.590929 0.377602 +0.037293 0.590929 0.377602 +0.079714 0.590929 0.377602 +0.120832 0.590929 0.377602 +0.159284 0.590929 0.377602 +0.194868 0.590929 0.377602 +0.227530 0.590929 0.377602 +0.257434 0.590929 0.377602 +0.285092 0.590929 0.377602 +0.310738 0.590929 0.377602 +0.334585 0.590929 0.377602 +0.356818 0.590929 0.377602 +0.377602 0.590929 0.377602 +0.397079 0.590929 0.377602 +0.415373 0.590929 0.377602 +0.432594 0.590929 0.377602 +0.448839 0.590929 0.377602 +0.464192 0.590929 0.377602 +0.478729 0.590929 0.377602 +0.492515 0.590929 0.377602 +0.505612 0.590929 0.377602 +0.518072 0.590929 0.377602 +0.529943 0.590929 0.377602 +0.541266 0.590929 0.377602 +0.552083 0.590929 0.377602 +0.562427 0.590929 0.377602 +0.572331 0.590929 0.377602 +0.581823 0.590929 0.377602 +0.590929 0.590929 0.377602 +0.599674 0.590929 0.377602 +0.608079 0.590929 0.377602 +0.616166 0.590929 0.377602 +0.000001 0.599674 0.377602 +0.037293 0.599674 0.377602 +0.079714 0.599674 0.377602 +0.120832 0.599674 0.377602 +0.159284 0.599674 0.377602 +0.194868 0.599674 0.377602 +0.227530 0.599674 0.377602 +0.257434 0.599674 0.377602 +0.285092 0.599674 0.377602 +0.310738 0.599674 0.377602 +0.334585 0.599674 0.377602 +0.356818 0.599674 0.377602 +0.377602 0.599674 0.377602 +0.397079 0.599674 0.377602 +0.415373 0.599674 0.377602 +0.432594 0.599674 0.377602 +0.448839 0.599674 0.377602 +0.464192 0.599674 0.377602 +0.478729 0.599674 0.377602 +0.492515 0.599674 0.377602 +0.505612 0.599674 0.377602 +0.518072 0.599674 0.377602 +0.529943 0.599674 0.377602 +0.541266 0.599674 0.377602 +0.552083 0.599674 0.377602 +0.562427 0.599674 0.377602 +0.572331 0.599674 0.377602 +0.581823 0.599674 0.377602 +0.590929 0.599674 0.377602 +0.599674 0.599674 0.377602 +0.608079 0.599674 0.377602 +0.616166 0.599674 0.377602 +0.000001 0.608079 0.377602 +0.037293 0.608079 0.377602 +0.079714 0.608079 0.377602 +0.120832 0.608079 0.377602 +0.159284 0.608079 0.377602 +0.194868 0.608079 0.377602 +0.227530 0.608079 0.377602 +0.257434 0.608079 0.377602 +0.285092 0.608079 0.377602 +0.310738 0.608079 0.377602 +0.334585 0.608079 0.377602 +0.356818 0.608079 0.377602 +0.377602 0.608079 0.377602 +0.397079 0.608079 0.377602 +0.415373 0.608079 0.377602 +0.432594 0.608079 0.377602 +0.448839 0.608079 0.377602 +0.464192 0.608079 0.377602 +0.478729 0.608079 0.377602 +0.492515 0.608079 0.377602 +0.505612 0.608079 0.377602 +0.518072 0.608079 0.377602 +0.529943 0.608079 0.377602 +0.541266 0.608079 0.377602 +0.552083 0.608079 0.377602 +0.562427 0.608079 0.377602 +0.572331 0.608079 0.377602 +0.581823 0.608079 0.377602 +0.590929 0.608079 0.377602 +0.599674 0.608079 0.377602 +0.608079 0.608079 0.377602 +0.616166 0.608079 0.377602 +0.000001 0.616166 0.377602 +0.037293 0.616166 0.377602 +0.079714 0.616166 0.377602 +0.120832 0.616166 0.377602 +0.159284 0.616166 0.377602 +0.194868 0.616166 0.377602 +0.227530 0.616166 0.377602 +0.257434 0.616166 0.377602 +0.285092 0.616166 0.377602 +0.310738 0.616166 0.377602 +0.334585 0.616166 0.377602 +0.356818 0.616166 0.377602 +0.377602 0.616166 0.377602 +0.397079 0.616166 0.377602 +0.415373 0.616166 0.377602 +0.432594 0.616166 0.377602 +0.448839 0.616166 0.377602 +0.464192 0.616166 0.377602 +0.478729 0.616166 0.377602 +0.492515 0.616166 0.377602 +0.505612 0.616166 0.377602 +0.518072 0.616166 0.377602 +0.529943 0.616166 0.377602 +0.541266 0.616166 0.377602 +0.552083 0.616166 0.377602 +0.562427 0.616166 0.377602 +0.572331 0.616166 0.377602 +0.581823 0.616166 0.377602 +0.590929 0.616166 0.377602 +0.599674 0.616166 0.377602 +0.608079 0.616166 0.377602 +0.616166 0.616166 0.377602 +0.000001 0.000001 0.397079 +0.037293 0.000001 0.397079 +0.079714 0.000001 0.397079 +0.120832 0.000001 0.397079 +0.159284 0.000001 0.397079 +0.194868 0.000001 0.397079 +0.227530 0.000001 0.397079 +0.257434 0.000001 0.397079 +0.285092 0.000001 0.397079 +0.310738 0.000001 0.397079 +0.334585 0.000001 0.397079 +0.356818 0.000001 0.397079 +0.377602 0.000001 0.397079 +0.397079 0.000001 0.397079 +0.415373 0.000001 0.397079 +0.432594 0.000001 0.397079 +0.448839 0.000001 0.397079 +0.464192 0.000001 0.397079 +0.478729 0.000001 0.397079 +0.492515 0.000001 0.397079 +0.505612 0.000001 0.397079 +0.518072 0.000001 0.397079 +0.529943 0.000001 0.397079 +0.541266 0.000001 0.397079 +0.552083 0.000001 0.397079 +0.562427 0.000001 0.397079 +0.572331 0.000001 0.397079 +0.581823 0.000001 0.397079 +0.590929 0.000001 0.397079 +0.599674 0.000001 0.397079 +0.608079 0.000001 0.397079 +0.616166 0.000001 0.397079 +0.000001 0.037293 0.397079 +0.037293 0.037293 0.397079 +0.079714 0.037293 0.397079 +0.120832 0.037293 0.397079 +0.159284 0.037293 0.397079 +0.194868 0.037293 0.397079 +0.227530 0.037293 0.397079 +0.257434 0.037293 0.397079 +0.285092 0.037293 0.397079 +0.310738 0.037293 0.397079 +0.334585 0.037293 0.397079 +0.356818 0.037293 0.397079 +0.377602 0.037293 0.397079 +0.397079 0.037293 0.397079 +0.415373 0.037293 0.397079 +0.432594 0.037293 0.397079 +0.448839 0.037293 0.397079 +0.464192 0.037293 0.397079 +0.478729 0.037293 0.397079 +0.492515 0.037293 0.397079 +0.505612 0.037293 0.397079 +0.518072 0.037293 0.397079 +0.529943 0.037293 0.397079 +0.541266 0.037293 0.397079 +0.552083 0.037293 0.397079 +0.562427 0.037293 0.397079 +0.572331 0.037293 0.397079 +0.581823 0.037293 0.397079 +0.590929 0.037293 0.397079 +0.599674 0.037293 0.397079 +0.608079 0.037293 0.397079 +0.616166 0.037293 0.397079 +0.000001 0.079714 0.397079 +0.037293 0.079714 0.397079 +0.079714 0.079714 0.397079 +0.120832 0.079714 0.397079 +0.159284 0.079714 0.397079 +0.194868 0.079714 0.397079 +0.227530 0.079714 0.397079 +0.257434 0.079714 0.397079 +0.285092 0.079714 0.397079 +0.310738 0.079714 0.397079 +0.334585 0.079714 0.397079 +0.356818 0.079714 0.397079 +0.377602 0.079714 0.397079 +0.397079 0.079714 0.397079 +0.415373 0.079714 0.397079 +0.432594 0.079714 0.397079 +0.448839 0.079714 0.397079 +0.464192 0.079714 0.397079 +0.478729 0.079714 0.397079 +0.492515 0.079714 0.397079 +0.505612 0.079714 0.397079 +0.518072 0.079714 0.397079 +0.529943 0.079714 0.397079 +0.541266 0.079714 0.397079 +0.552083 0.079714 0.397079 +0.562427 0.079714 0.397079 +0.572331 0.079714 0.397079 +0.581823 0.079714 0.397079 +0.590929 0.079714 0.397079 +0.599674 0.079714 0.397079 +0.608079 0.079714 0.397079 +0.616166 0.079714 0.397079 +0.000001 0.120832 0.397079 +0.037293 0.120832 0.397079 +0.079714 0.120832 0.397079 +0.120832 0.120832 0.397079 +0.159284 0.120832 0.397079 +0.194868 0.120832 0.397079 +0.227530 0.120832 0.397079 +0.257434 0.120832 0.397079 +0.285092 0.120832 0.397079 +0.310738 0.120832 0.397079 +0.334585 0.120832 0.397079 +0.356818 0.120832 0.397079 +0.377602 0.120832 0.397079 +0.397079 0.120832 0.397079 +0.415373 0.120832 0.397079 +0.432594 0.120832 0.397079 +0.448839 0.120832 0.397079 +0.464192 0.120832 0.397079 +0.478729 0.120832 0.397079 +0.492515 0.120832 0.397079 +0.505612 0.120832 0.397079 +0.518072 0.120832 0.397079 +0.529943 0.120832 0.397079 +0.541266 0.120832 0.397079 +0.552083 0.120832 0.397079 +0.562427 0.120832 0.397079 +0.572331 0.120832 0.397079 +0.581823 0.120832 0.397079 +0.590929 0.120832 0.397079 +0.599674 0.120832 0.397079 +0.608079 0.120832 0.397079 +0.616166 0.120832 0.397079 +0.000001 0.159284 0.397079 +0.037293 0.159284 0.397079 +0.079714 0.159284 0.397079 +0.120832 0.159284 0.397079 +0.159284 0.159284 0.397079 +0.194868 0.159284 0.397079 +0.227530 0.159284 0.397079 +0.257434 0.159284 0.397079 +0.285092 0.159284 0.397079 +0.310738 0.159284 0.397079 +0.334585 0.159284 0.397079 +0.356818 0.159284 0.397079 +0.377602 0.159284 0.397079 +0.397079 0.159284 0.397079 +0.415373 0.159284 0.397079 +0.432594 0.159284 0.397079 +0.448839 0.159284 0.397079 +0.464192 0.159284 0.397079 +0.478729 0.159284 0.397079 +0.492515 0.159284 0.397079 +0.505612 0.159284 0.397079 +0.518072 0.159284 0.397079 +0.529943 0.159284 0.397079 +0.541266 0.159284 0.397079 +0.552083 0.159284 0.397079 +0.562427 0.159284 0.397079 +0.572331 0.159284 0.397079 +0.581823 0.159284 0.397079 +0.590929 0.159284 0.397079 +0.599674 0.159284 0.397079 +0.608079 0.159284 0.397079 +0.616166 0.159284 0.397079 +0.000001 0.194868 0.397079 +0.037293 0.194868 0.397079 +0.079714 0.194868 0.397079 +0.120832 0.194868 0.397079 +0.159284 0.194868 0.397079 +0.194868 0.194868 0.397079 +0.227530 0.194868 0.397079 +0.257434 0.194868 0.397079 +0.285092 0.194868 0.397079 +0.310738 0.194868 0.397079 +0.334585 0.194868 0.397079 +0.356818 0.194868 0.397079 +0.377602 0.194868 0.397079 +0.397079 0.194868 0.397079 +0.415373 0.194868 0.397079 +0.432594 0.194868 0.397079 +0.448839 0.194868 0.397079 +0.464192 0.194868 0.397079 +0.478729 0.194868 0.397079 +0.492515 0.194868 0.397079 +0.505612 0.194868 0.397079 +0.518072 0.194868 0.397079 +0.529943 0.194868 0.397079 +0.541266 0.194868 0.397079 +0.552083 0.194868 0.397079 +0.562427 0.194868 0.397079 +0.572331 0.194868 0.397079 +0.581823 0.194868 0.397079 +0.590929 0.194868 0.397079 +0.599674 0.194868 0.397079 +0.608079 0.194868 0.397079 +0.616166 0.194868 0.397079 +0.000001 0.227530 0.397079 +0.037293 0.227530 0.397079 +0.079714 0.227530 0.397079 +0.120832 0.227530 0.397079 +0.159284 0.227530 0.397079 +0.194868 0.227530 0.397079 +0.227530 0.227530 0.397079 +0.257434 0.227530 0.397079 +0.285092 0.227530 0.397079 +0.310738 0.227530 0.397079 +0.334585 0.227530 0.397079 +0.356818 0.227530 0.397079 +0.377602 0.227530 0.397079 +0.397079 0.227530 0.397079 +0.415373 0.227530 0.397079 +0.432594 0.227530 0.397079 +0.448839 0.227530 0.397079 +0.464192 0.227530 0.397079 +0.478729 0.227530 0.397079 +0.492515 0.227530 0.397079 +0.505612 0.227530 0.397079 +0.518072 0.227530 0.397079 +0.529943 0.227530 0.397079 +0.541266 0.227530 0.397079 +0.552083 0.227530 0.397079 +0.562427 0.227530 0.397079 +0.572331 0.227530 0.397079 +0.581823 0.227530 0.397079 +0.590929 0.227530 0.397079 +0.599674 0.227530 0.397079 +0.608079 0.227530 0.397079 +0.616166 0.227530 0.397079 +0.000001 0.257434 0.397079 +0.037293 0.257434 0.397079 +0.079714 0.257434 0.397079 +0.120832 0.257434 0.397079 +0.159284 0.257434 0.397079 +0.194868 0.257434 0.397079 +0.227530 0.257434 0.397079 +0.257434 0.257434 0.397079 +0.285092 0.257434 0.397079 +0.310738 0.257434 0.397079 +0.334585 0.257434 0.397079 +0.356818 0.257434 0.397079 +0.377602 0.257434 0.397079 +0.397079 0.257434 0.397079 +0.415373 0.257434 0.397079 +0.432594 0.257434 0.397079 +0.448839 0.257434 0.397079 +0.464192 0.257434 0.397079 +0.478729 0.257434 0.397079 +0.492515 0.257434 0.397079 +0.505612 0.257434 0.397079 +0.518072 0.257434 0.397079 +0.529943 0.257434 0.397079 +0.541266 0.257434 0.397079 +0.552083 0.257434 0.397079 +0.562427 0.257434 0.397079 +0.572331 0.257434 0.397079 +0.581823 0.257434 0.397079 +0.590929 0.257434 0.397079 +0.599674 0.257434 0.397079 +0.608079 0.257434 0.397079 +0.616166 0.257434 0.397079 +0.000001 0.285092 0.397079 +0.037293 0.285092 0.397079 +0.079714 0.285092 0.397079 +0.120832 0.285092 0.397079 +0.159284 0.285092 0.397079 +0.194868 0.285092 0.397079 +0.227530 0.285092 0.397079 +0.257434 0.285092 0.397079 +0.285092 0.285092 0.397079 +0.310738 0.285092 0.397079 +0.334585 0.285092 0.397079 +0.356818 0.285092 0.397079 +0.377602 0.285092 0.397079 +0.397079 0.285092 0.397079 +0.415373 0.285092 0.397079 +0.432594 0.285092 0.397079 +0.448839 0.285092 0.397079 +0.464192 0.285092 0.397079 +0.478729 0.285092 0.397079 +0.492515 0.285092 0.397079 +0.505612 0.285092 0.397079 +0.518072 0.285092 0.397079 +0.529943 0.285092 0.397079 +0.541266 0.285092 0.397079 +0.552083 0.285092 0.397079 +0.562427 0.285092 0.397079 +0.572331 0.285092 0.397079 +0.581823 0.285092 0.397079 +0.590929 0.285092 0.397079 +0.599674 0.285092 0.397079 +0.608079 0.285092 0.397079 +0.616166 0.285092 0.397079 +0.000001 0.310738 0.397079 +0.037293 0.310738 0.397079 +0.079714 0.310738 0.397079 +0.120832 0.310738 0.397079 +0.159284 0.310738 0.397079 +0.194868 0.310738 0.397079 +0.227530 0.310738 0.397079 +0.257434 0.310738 0.397079 +0.285092 0.310738 0.397079 +0.310738 0.310738 0.397079 +0.334585 0.310738 0.397079 +0.356818 0.310738 0.397079 +0.377602 0.310738 0.397079 +0.397079 0.310738 0.397079 +0.415373 0.310738 0.397079 +0.432594 0.310738 0.397079 +0.448839 0.310738 0.397079 +0.464192 0.310738 0.397079 +0.478729 0.310738 0.397079 +0.492515 0.310738 0.397079 +0.505612 0.310738 0.397079 +0.518072 0.310738 0.397079 +0.529943 0.310738 0.397079 +0.541266 0.310738 0.397079 +0.552083 0.310738 0.397079 +0.562427 0.310738 0.397079 +0.572331 0.310738 0.397079 +0.581823 0.310738 0.397079 +0.590929 0.310738 0.397079 +0.599674 0.310738 0.397079 +0.608079 0.310738 0.397079 +0.616166 0.310738 0.397079 +0.000001 0.334585 0.397079 +0.037293 0.334585 0.397079 +0.079714 0.334585 0.397079 +0.120832 0.334585 0.397079 +0.159284 0.334585 0.397079 +0.194868 0.334585 0.397079 +0.227530 0.334585 0.397079 +0.257434 0.334585 0.397079 +0.285092 0.334585 0.397079 +0.310738 0.334585 0.397079 +0.334585 0.334585 0.397079 +0.356818 0.334585 0.397079 +0.377602 0.334585 0.397079 +0.397079 0.334585 0.397079 +0.415373 0.334585 0.397079 +0.432594 0.334585 0.397079 +0.448839 0.334585 0.397079 +0.464192 0.334585 0.397079 +0.478729 0.334585 0.397079 +0.492515 0.334585 0.397079 +0.505612 0.334585 0.397079 +0.518072 0.334585 0.397079 +0.529943 0.334585 0.397079 +0.541266 0.334585 0.397079 +0.552083 0.334585 0.397079 +0.562427 0.334585 0.397079 +0.572331 0.334585 0.397079 +0.581823 0.334585 0.397079 +0.590929 0.334585 0.397079 +0.599674 0.334585 0.397079 +0.608079 0.334585 0.397079 +0.616166 0.334585 0.397079 +0.000001 0.356818 0.397079 +0.037293 0.356818 0.397079 +0.079714 0.356818 0.397079 +0.120832 0.356818 0.397079 +0.159284 0.356818 0.397079 +0.194868 0.356818 0.397079 +0.227530 0.356818 0.397079 +0.257434 0.356818 0.397079 +0.285092 0.356818 0.397079 +0.310738 0.356818 0.397079 +0.334585 0.356818 0.397079 +0.356818 0.356818 0.397079 +0.377602 0.356818 0.397079 +0.397079 0.356818 0.397079 +0.415373 0.356818 0.397079 +0.432594 0.356818 0.397079 +0.448839 0.356818 0.397079 +0.464192 0.356818 0.397079 +0.478729 0.356818 0.397079 +0.492515 0.356818 0.397079 +0.505612 0.356818 0.397079 +0.518072 0.356818 0.397079 +0.529943 0.356818 0.397079 +0.541266 0.356818 0.397079 +0.552083 0.356818 0.397079 +0.562427 0.356818 0.397079 +0.572331 0.356818 0.397079 +0.581823 0.356818 0.397079 +0.590929 0.356818 0.397079 +0.599674 0.356818 0.397079 +0.608079 0.356818 0.397079 +0.616166 0.356818 0.397079 +0.000001 0.377602 0.397079 +0.037293 0.377602 0.397079 +0.079714 0.377602 0.397079 +0.120832 0.377602 0.397079 +0.159284 0.377602 0.397079 +0.194868 0.377602 0.397079 +0.227530 0.377602 0.397079 +0.257434 0.377602 0.397079 +0.285092 0.377602 0.397079 +0.310738 0.377602 0.397079 +0.334585 0.377602 0.397079 +0.356818 0.377602 0.397079 +0.377602 0.377602 0.397079 +0.397079 0.377602 0.397079 +0.415373 0.377602 0.397079 +0.432594 0.377602 0.397079 +0.448839 0.377602 0.397079 +0.464192 0.377602 0.397079 +0.478729 0.377602 0.397079 +0.492515 0.377602 0.397079 +0.505612 0.377602 0.397079 +0.518072 0.377602 0.397079 +0.529943 0.377602 0.397079 +0.541266 0.377602 0.397079 +0.552083 0.377602 0.397079 +0.562427 0.377602 0.397079 +0.572331 0.377602 0.397079 +0.581823 0.377602 0.397079 +0.590929 0.377602 0.397079 +0.599674 0.377602 0.397079 +0.608079 0.377602 0.397079 +0.616166 0.377602 0.397079 +0.000001 0.397079 0.397079 +0.037293 0.397079 0.397079 +0.079714 0.397079 0.397079 +0.120832 0.397079 0.397079 +0.159284 0.397079 0.397079 +0.194868 0.397079 0.397079 +0.227530 0.397079 0.397079 +0.257434 0.397079 0.397079 +0.285092 0.397079 0.397079 +0.310738 0.397079 0.397079 +0.334585 0.397079 0.397079 +0.356818 0.397079 0.397079 +0.377602 0.397079 0.397079 +0.397079 0.397079 0.397079 +0.415373 0.397079 0.397079 +0.432594 0.397079 0.397079 +0.448839 0.397079 0.397079 +0.464192 0.397079 0.397079 +0.478729 0.397079 0.397079 +0.492515 0.397079 0.397079 +0.505612 0.397079 0.397079 +0.518072 0.397079 0.397079 +0.529943 0.397079 0.397079 +0.541266 0.397079 0.397079 +0.552083 0.397079 0.397079 +0.562427 0.397079 0.397079 +0.572331 0.397079 0.397079 +0.581823 0.397079 0.397079 +0.590929 0.397079 0.397079 +0.599674 0.397079 0.397079 +0.608079 0.397079 0.397079 +0.616166 0.397079 0.397079 +0.000001 0.415373 0.397079 +0.037293 0.415373 0.397079 +0.079714 0.415373 0.397079 +0.120832 0.415373 0.397079 +0.159284 0.415373 0.397079 +0.194868 0.415373 0.397079 +0.227530 0.415373 0.397079 +0.257434 0.415373 0.397079 +0.285092 0.415373 0.397079 +0.310738 0.415373 0.397079 +0.334585 0.415373 0.397079 +0.356818 0.415373 0.397079 +0.377602 0.415373 0.397079 +0.397079 0.415373 0.397079 +0.415373 0.415373 0.397079 +0.432594 0.415373 0.397079 +0.448839 0.415373 0.397079 +0.464192 0.415373 0.397079 +0.478729 0.415373 0.397079 +0.492515 0.415373 0.397079 +0.505612 0.415373 0.397079 +0.518072 0.415373 0.397079 +0.529943 0.415373 0.397079 +0.541266 0.415373 0.397079 +0.552083 0.415373 0.397079 +0.562427 0.415373 0.397079 +0.572331 0.415373 0.397079 +0.581823 0.415373 0.397079 +0.590929 0.415373 0.397079 +0.599674 0.415373 0.397079 +0.608079 0.415373 0.397079 +0.616166 0.415373 0.397079 +0.000001 0.432594 0.397079 +0.037293 0.432594 0.397079 +0.079714 0.432594 0.397079 +0.120832 0.432594 0.397079 +0.159284 0.432594 0.397079 +0.194868 0.432594 0.397079 +0.227530 0.432594 0.397079 +0.257434 0.432594 0.397079 +0.285092 0.432594 0.397079 +0.310738 0.432594 0.397079 +0.334585 0.432594 0.397079 +0.356818 0.432594 0.397079 +0.377602 0.432594 0.397079 +0.397079 0.432594 0.397079 +0.415373 0.432594 0.397079 +0.432594 0.432594 0.397079 +0.448839 0.432594 0.397079 +0.464192 0.432594 0.397079 +0.478729 0.432594 0.397079 +0.492515 0.432594 0.397079 +0.505612 0.432594 0.397079 +0.518072 0.432594 0.397079 +0.529943 0.432594 0.397079 +0.541266 0.432594 0.397079 +0.552083 0.432594 0.397079 +0.562427 0.432594 0.397079 +0.572331 0.432594 0.397079 +0.581823 0.432594 0.397079 +0.590929 0.432594 0.397079 +0.599674 0.432594 0.397079 +0.608079 0.432594 0.397079 +0.616166 0.432594 0.397079 +0.000001 0.448839 0.397079 +0.037293 0.448839 0.397079 +0.079714 0.448839 0.397079 +0.120832 0.448839 0.397079 +0.159284 0.448839 0.397079 +0.194868 0.448839 0.397079 +0.227530 0.448839 0.397079 +0.257434 0.448839 0.397079 +0.285092 0.448839 0.397079 +0.310738 0.448839 0.397079 +0.334585 0.448839 0.397079 +0.356818 0.448839 0.397079 +0.377602 0.448839 0.397079 +0.397079 0.448839 0.397079 +0.415373 0.448839 0.397079 +0.432594 0.448839 0.397079 +0.448839 0.448839 0.397079 +0.464192 0.448839 0.397079 +0.478729 0.448839 0.397079 +0.492515 0.448839 0.397079 +0.505612 0.448839 0.397079 +0.518072 0.448839 0.397079 +0.529943 0.448839 0.397079 +0.541266 0.448839 0.397079 +0.552083 0.448839 0.397079 +0.562427 0.448839 0.397079 +0.572331 0.448839 0.397079 +0.581823 0.448839 0.397079 +0.590929 0.448839 0.397079 +0.599674 0.448839 0.397079 +0.608079 0.448839 0.397079 +0.616166 0.448839 0.397079 +0.000001 0.464192 0.397079 +0.037293 0.464192 0.397079 +0.079714 0.464192 0.397079 +0.120832 0.464192 0.397079 +0.159284 0.464192 0.397079 +0.194868 0.464192 0.397079 +0.227530 0.464192 0.397079 +0.257434 0.464192 0.397079 +0.285092 0.464192 0.397079 +0.310738 0.464192 0.397079 +0.334585 0.464192 0.397079 +0.356818 0.464192 0.397079 +0.377602 0.464192 0.397079 +0.397079 0.464192 0.397079 +0.415373 0.464192 0.397079 +0.432594 0.464192 0.397079 +0.448839 0.464192 0.397079 +0.464192 0.464192 0.397079 +0.478729 0.464192 0.397079 +0.492515 0.464192 0.397079 +0.505612 0.464192 0.397079 +0.518072 0.464192 0.397079 +0.529943 0.464192 0.397079 +0.541266 0.464192 0.397079 +0.552083 0.464192 0.397079 +0.562427 0.464192 0.397079 +0.572331 0.464192 0.397079 +0.581823 0.464192 0.397079 +0.590929 0.464192 0.397079 +0.599674 0.464192 0.397079 +0.608079 0.464192 0.397079 +0.616166 0.464192 0.397079 +0.000001 0.478729 0.397079 +0.037293 0.478729 0.397079 +0.079714 0.478729 0.397079 +0.120832 0.478729 0.397079 +0.159284 0.478729 0.397079 +0.194868 0.478729 0.397079 +0.227530 0.478729 0.397079 +0.257434 0.478729 0.397079 +0.285092 0.478729 0.397079 +0.310738 0.478729 0.397079 +0.334585 0.478729 0.397079 +0.356818 0.478729 0.397079 +0.377602 0.478729 0.397079 +0.397079 0.478729 0.397079 +0.415373 0.478729 0.397079 +0.432594 0.478729 0.397079 +0.448839 0.478729 0.397079 +0.464192 0.478729 0.397079 +0.478729 0.478729 0.397079 +0.492515 0.478729 0.397079 +0.505612 0.478729 0.397079 +0.518072 0.478729 0.397079 +0.529943 0.478729 0.397079 +0.541266 0.478729 0.397079 +0.552083 0.478729 0.397079 +0.562427 0.478729 0.397079 +0.572331 0.478729 0.397079 +0.581823 0.478729 0.397079 +0.590929 0.478729 0.397079 +0.599674 0.478729 0.397079 +0.608079 0.478729 0.397079 +0.616166 0.478729 0.397079 +0.000001 0.492515 0.397079 +0.037293 0.492515 0.397079 +0.079714 0.492515 0.397079 +0.120832 0.492515 0.397079 +0.159284 0.492515 0.397079 +0.194868 0.492515 0.397079 +0.227530 0.492515 0.397079 +0.257434 0.492515 0.397079 +0.285092 0.492515 0.397079 +0.310738 0.492515 0.397079 +0.334585 0.492515 0.397079 +0.356818 0.492515 0.397079 +0.377602 0.492515 0.397079 +0.397079 0.492515 0.397079 +0.415373 0.492515 0.397079 +0.432594 0.492515 0.397079 +0.448839 0.492515 0.397079 +0.464192 0.492515 0.397079 +0.478729 0.492515 0.397079 +0.492515 0.492515 0.397079 +0.505612 0.492515 0.397079 +0.518072 0.492515 0.397079 +0.529943 0.492515 0.397079 +0.541266 0.492515 0.397079 +0.552083 0.492515 0.397079 +0.562427 0.492515 0.397079 +0.572331 0.492515 0.397079 +0.581823 0.492515 0.397079 +0.590929 0.492515 0.397079 +0.599674 0.492515 0.397079 +0.608079 0.492515 0.397079 +0.616166 0.492515 0.397079 +0.000001 0.505612 0.397079 +0.037293 0.505612 0.397079 +0.079714 0.505612 0.397079 +0.120832 0.505612 0.397079 +0.159284 0.505612 0.397079 +0.194868 0.505612 0.397079 +0.227530 0.505612 0.397079 +0.257434 0.505612 0.397079 +0.285092 0.505612 0.397079 +0.310738 0.505612 0.397079 +0.334585 0.505612 0.397079 +0.356818 0.505612 0.397079 +0.377602 0.505612 0.397079 +0.397079 0.505612 0.397079 +0.415373 0.505612 0.397079 +0.432594 0.505612 0.397079 +0.448839 0.505612 0.397079 +0.464192 0.505612 0.397079 +0.478729 0.505612 0.397079 +0.492515 0.505612 0.397079 +0.505612 0.505612 0.397079 +0.518072 0.505612 0.397079 +0.529943 0.505612 0.397079 +0.541266 0.505612 0.397079 +0.552083 0.505612 0.397079 +0.562427 0.505612 0.397079 +0.572331 0.505612 0.397079 +0.581823 0.505612 0.397079 +0.590929 0.505612 0.397079 +0.599674 0.505612 0.397079 +0.608079 0.505612 0.397079 +0.616166 0.505612 0.397079 +0.000001 0.518072 0.397079 +0.037293 0.518072 0.397079 +0.079714 0.518072 0.397079 +0.120832 0.518072 0.397079 +0.159284 0.518072 0.397079 +0.194868 0.518072 0.397079 +0.227530 0.518072 0.397079 +0.257434 0.518072 0.397079 +0.285092 0.518072 0.397079 +0.310738 0.518072 0.397079 +0.334585 0.518072 0.397079 +0.356818 0.518072 0.397079 +0.377602 0.518072 0.397079 +0.397079 0.518072 0.397079 +0.415373 0.518072 0.397079 +0.432594 0.518072 0.397079 +0.448839 0.518072 0.397079 +0.464192 0.518072 0.397079 +0.478729 0.518072 0.397079 +0.492515 0.518072 0.397079 +0.505612 0.518072 0.397079 +0.518072 0.518072 0.397079 +0.529943 0.518072 0.397079 +0.541266 0.518072 0.397079 +0.552083 0.518072 0.397079 +0.562427 0.518072 0.397079 +0.572331 0.518072 0.397079 +0.581823 0.518072 0.397079 +0.590929 0.518072 0.397079 +0.599674 0.518072 0.397079 +0.608079 0.518072 0.397079 +0.616166 0.518072 0.397079 +0.000001 0.529943 0.397079 +0.037293 0.529943 0.397079 +0.079714 0.529943 0.397079 +0.120832 0.529943 0.397079 +0.159284 0.529943 0.397079 +0.194868 0.529943 0.397079 +0.227530 0.529943 0.397079 +0.257434 0.529943 0.397079 +0.285092 0.529943 0.397079 +0.310738 0.529943 0.397079 +0.334585 0.529943 0.397079 +0.356818 0.529943 0.397079 +0.377602 0.529943 0.397079 +0.397079 0.529943 0.397079 +0.415373 0.529943 0.397079 +0.432594 0.529943 0.397079 +0.448839 0.529943 0.397079 +0.464192 0.529943 0.397079 +0.478729 0.529943 0.397079 +0.492515 0.529943 0.397079 +0.505612 0.529943 0.397079 +0.518072 0.529943 0.397079 +0.529943 0.529943 0.397079 +0.541266 0.529943 0.397079 +0.552083 0.529943 0.397079 +0.562427 0.529943 0.397079 +0.572331 0.529943 0.397079 +0.581823 0.529943 0.397079 +0.590929 0.529943 0.397079 +0.599674 0.529943 0.397079 +0.608079 0.529943 0.397079 +0.616166 0.529943 0.397079 +0.000001 0.541266 0.397079 +0.037293 0.541266 0.397079 +0.079714 0.541266 0.397079 +0.120832 0.541266 0.397079 +0.159284 0.541266 0.397079 +0.194868 0.541266 0.397079 +0.227530 0.541266 0.397079 +0.257434 0.541266 0.397079 +0.285092 0.541266 0.397079 +0.310738 0.541266 0.397079 +0.334585 0.541266 0.397079 +0.356818 0.541266 0.397079 +0.377602 0.541266 0.397079 +0.397079 0.541266 0.397079 +0.415373 0.541266 0.397079 +0.432594 0.541266 0.397079 +0.448839 0.541266 0.397079 +0.464192 0.541266 0.397079 +0.478729 0.541266 0.397079 +0.492515 0.541266 0.397079 +0.505612 0.541266 0.397079 +0.518072 0.541266 0.397079 +0.529943 0.541266 0.397079 +0.541266 0.541266 0.397079 +0.552083 0.541266 0.397079 +0.562427 0.541266 0.397079 +0.572331 0.541266 0.397079 +0.581823 0.541266 0.397079 +0.590929 0.541266 0.397079 +0.599674 0.541266 0.397079 +0.608079 0.541266 0.397079 +0.616166 0.541266 0.397079 +0.000001 0.552083 0.397079 +0.037293 0.552083 0.397079 +0.079714 0.552083 0.397079 +0.120832 0.552083 0.397079 +0.159284 0.552083 0.397079 +0.194868 0.552083 0.397079 +0.227530 0.552083 0.397079 +0.257434 0.552083 0.397079 +0.285092 0.552083 0.397079 +0.310738 0.552083 0.397079 +0.334585 0.552083 0.397079 +0.356818 0.552083 0.397079 +0.377602 0.552083 0.397079 +0.397079 0.552083 0.397079 +0.415373 0.552083 0.397079 +0.432594 0.552083 0.397079 +0.448839 0.552083 0.397079 +0.464192 0.552083 0.397079 +0.478729 0.552083 0.397079 +0.492515 0.552083 0.397079 +0.505612 0.552083 0.397079 +0.518072 0.552083 0.397079 +0.529943 0.552083 0.397079 +0.541266 0.552083 0.397079 +0.552083 0.552083 0.397079 +0.562427 0.552083 0.397079 +0.572331 0.552083 0.397079 +0.581823 0.552083 0.397079 +0.590929 0.552083 0.397079 +0.599674 0.552083 0.397079 +0.608079 0.552083 0.397079 +0.616166 0.552083 0.397079 +0.000001 0.562427 0.397079 +0.037293 0.562427 0.397079 +0.079714 0.562427 0.397079 +0.120832 0.562427 0.397079 +0.159284 0.562427 0.397079 +0.194868 0.562427 0.397079 +0.227530 0.562427 0.397079 +0.257434 0.562427 0.397079 +0.285092 0.562427 0.397079 +0.310738 0.562427 0.397079 +0.334585 0.562427 0.397079 +0.356818 0.562427 0.397079 +0.377602 0.562427 0.397079 +0.397079 0.562427 0.397079 +0.415373 0.562427 0.397079 +0.432594 0.562427 0.397079 +0.448839 0.562427 0.397079 +0.464192 0.562427 0.397079 +0.478729 0.562427 0.397079 +0.492515 0.562427 0.397079 +0.505612 0.562427 0.397079 +0.518072 0.562427 0.397079 +0.529943 0.562427 0.397079 +0.541266 0.562427 0.397079 +0.552083 0.562427 0.397079 +0.562427 0.562427 0.397079 +0.572331 0.562427 0.397079 +0.581823 0.562427 0.397079 +0.590929 0.562427 0.397079 +0.599674 0.562427 0.397079 +0.608079 0.562427 0.397079 +0.616166 0.562427 0.397079 +0.000001 0.572331 0.397079 +0.037293 0.572331 0.397079 +0.079714 0.572331 0.397079 +0.120832 0.572331 0.397079 +0.159284 0.572331 0.397079 +0.194868 0.572331 0.397079 +0.227530 0.572331 0.397079 +0.257434 0.572331 0.397079 +0.285092 0.572331 0.397079 +0.310738 0.572331 0.397079 +0.334585 0.572331 0.397079 +0.356818 0.572331 0.397079 +0.377602 0.572331 0.397079 +0.397079 0.572331 0.397079 +0.415373 0.572331 0.397079 +0.432594 0.572331 0.397079 +0.448839 0.572331 0.397079 +0.464192 0.572331 0.397079 +0.478729 0.572331 0.397079 +0.492515 0.572331 0.397079 +0.505612 0.572331 0.397079 +0.518072 0.572331 0.397079 +0.529943 0.572331 0.397079 +0.541266 0.572331 0.397079 +0.552083 0.572331 0.397079 +0.562427 0.572331 0.397079 +0.572331 0.572331 0.397079 +0.581823 0.572331 0.397079 +0.590929 0.572331 0.397079 +0.599674 0.572331 0.397079 +0.608079 0.572331 0.397079 +0.616166 0.572331 0.397079 +0.000001 0.581823 0.397079 +0.037293 0.581823 0.397079 +0.079714 0.581823 0.397079 +0.120832 0.581823 0.397079 +0.159284 0.581823 0.397079 +0.194868 0.581823 0.397079 +0.227530 0.581823 0.397079 +0.257434 0.581823 0.397079 +0.285092 0.581823 0.397079 +0.310738 0.581823 0.397079 +0.334585 0.581823 0.397079 +0.356818 0.581823 0.397079 +0.377602 0.581823 0.397079 +0.397079 0.581823 0.397079 +0.415373 0.581823 0.397079 +0.432594 0.581823 0.397079 +0.448839 0.581823 0.397079 +0.464192 0.581823 0.397079 +0.478729 0.581823 0.397079 +0.492515 0.581823 0.397079 +0.505612 0.581823 0.397079 +0.518072 0.581823 0.397079 +0.529943 0.581823 0.397079 +0.541266 0.581823 0.397079 +0.552083 0.581823 0.397079 +0.562427 0.581823 0.397079 +0.572331 0.581823 0.397079 +0.581823 0.581823 0.397079 +0.590929 0.581823 0.397079 +0.599674 0.581823 0.397079 +0.608079 0.581823 0.397079 +0.616166 0.581823 0.397079 +0.000001 0.590929 0.397079 +0.037293 0.590929 0.397079 +0.079714 0.590929 0.397079 +0.120832 0.590929 0.397079 +0.159284 0.590929 0.397079 +0.194868 0.590929 0.397079 +0.227530 0.590929 0.397079 +0.257434 0.590929 0.397079 +0.285092 0.590929 0.397079 +0.310738 0.590929 0.397079 +0.334585 0.590929 0.397079 +0.356818 0.590929 0.397079 +0.377602 0.590929 0.397079 +0.397079 0.590929 0.397079 +0.415373 0.590929 0.397079 +0.432594 0.590929 0.397079 +0.448839 0.590929 0.397079 +0.464192 0.590929 0.397079 +0.478729 0.590929 0.397079 +0.492515 0.590929 0.397079 +0.505612 0.590929 0.397079 +0.518072 0.590929 0.397079 +0.529943 0.590929 0.397079 +0.541266 0.590929 0.397079 +0.552083 0.590929 0.397079 +0.562427 0.590929 0.397079 +0.572331 0.590929 0.397079 +0.581823 0.590929 0.397079 +0.590929 0.590929 0.397079 +0.599674 0.590929 0.397079 +0.608079 0.590929 0.397079 +0.616166 0.590929 0.397079 +0.000001 0.599674 0.397079 +0.037293 0.599674 0.397079 +0.079714 0.599674 0.397079 +0.120832 0.599674 0.397079 +0.159284 0.599674 0.397079 +0.194868 0.599674 0.397079 +0.227530 0.599674 0.397079 +0.257434 0.599674 0.397079 +0.285092 0.599674 0.397079 +0.310738 0.599674 0.397079 +0.334585 0.599674 0.397079 +0.356818 0.599674 0.397079 +0.377602 0.599674 0.397079 +0.397079 0.599674 0.397079 +0.415373 0.599674 0.397079 +0.432594 0.599674 0.397079 +0.448839 0.599674 0.397079 +0.464192 0.599674 0.397079 +0.478729 0.599674 0.397079 +0.492515 0.599674 0.397079 +0.505612 0.599674 0.397079 +0.518072 0.599674 0.397079 +0.529943 0.599674 0.397079 +0.541266 0.599674 0.397079 +0.552083 0.599674 0.397079 +0.562427 0.599674 0.397079 +0.572331 0.599674 0.397079 +0.581823 0.599674 0.397079 +0.590929 0.599674 0.397079 +0.599674 0.599674 0.397079 +0.608079 0.599674 0.397079 +0.616166 0.599674 0.397079 +0.000001 0.608079 0.397079 +0.037293 0.608079 0.397079 +0.079714 0.608079 0.397079 +0.120832 0.608079 0.397079 +0.159284 0.608079 0.397079 +0.194868 0.608079 0.397079 +0.227530 0.608079 0.397079 +0.257434 0.608079 0.397079 +0.285092 0.608079 0.397079 +0.310738 0.608079 0.397079 +0.334585 0.608079 0.397079 +0.356818 0.608079 0.397079 +0.377602 0.608079 0.397079 +0.397079 0.608079 0.397079 +0.415373 0.608079 0.397079 +0.432594 0.608079 0.397079 +0.448839 0.608079 0.397079 +0.464192 0.608079 0.397079 +0.478729 0.608079 0.397079 +0.492515 0.608079 0.397079 +0.505612 0.608079 0.397079 +0.518072 0.608079 0.397079 +0.529943 0.608079 0.397079 +0.541266 0.608079 0.397079 +0.552083 0.608079 0.397079 +0.562427 0.608079 0.397079 +0.572331 0.608079 0.397079 +0.581823 0.608079 0.397079 +0.590929 0.608079 0.397079 +0.599674 0.608079 0.397079 +0.608079 0.608079 0.397079 +0.616166 0.608079 0.397079 +0.000001 0.616166 0.397079 +0.037293 0.616166 0.397079 +0.079714 0.616166 0.397079 +0.120832 0.616166 0.397079 +0.159284 0.616166 0.397079 +0.194868 0.616166 0.397079 +0.227530 0.616166 0.397079 +0.257434 0.616166 0.397079 +0.285092 0.616166 0.397079 +0.310738 0.616166 0.397079 +0.334585 0.616166 0.397079 +0.356818 0.616166 0.397079 +0.377602 0.616166 0.397079 +0.397079 0.616166 0.397079 +0.415373 0.616166 0.397079 +0.432594 0.616166 0.397079 +0.448839 0.616166 0.397079 +0.464192 0.616166 0.397079 +0.478729 0.616166 0.397079 +0.492515 0.616166 0.397079 +0.505612 0.616166 0.397079 +0.518072 0.616166 0.397079 +0.529943 0.616166 0.397079 +0.541266 0.616166 0.397079 +0.552083 0.616166 0.397079 +0.562427 0.616166 0.397079 +0.572331 0.616166 0.397079 +0.581823 0.616166 0.397079 +0.590929 0.616166 0.397079 +0.599674 0.616166 0.397079 +0.608079 0.616166 0.397079 +0.616166 0.616166 0.397079 +0.000001 0.000001 0.415373 +0.037293 0.000001 0.415373 +0.079714 0.000001 0.415373 +0.120832 0.000001 0.415373 +0.159284 0.000001 0.415373 +0.194868 0.000001 0.415373 +0.227530 0.000001 0.415373 +0.257434 0.000001 0.415373 +0.285092 0.000001 0.415373 +0.310738 0.000001 0.415373 +0.334585 0.000001 0.415373 +0.356818 0.000001 0.415373 +0.377602 0.000001 0.415373 +0.397079 0.000001 0.415373 +0.415373 0.000001 0.415373 +0.432594 0.000001 0.415373 +0.448839 0.000001 0.415373 +0.464192 0.000001 0.415373 +0.478729 0.000001 0.415373 +0.492515 0.000001 0.415373 +0.505612 0.000001 0.415373 +0.518072 0.000001 0.415373 +0.529943 0.000001 0.415373 +0.541266 0.000001 0.415373 +0.552083 0.000001 0.415373 +0.562427 0.000001 0.415373 +0.572331 0.000001 0.415373 +0.581823 0.000001 0.415373 +0.590929 0.000001 0.415373 +0.599674 0.000001 0.415373 +0.608079 0.000001 0.415373 +0.616166 0.000001 0.415373 +0.000001 0.037293 0.415373 +0.037293 0.037293 0.415373 +0.079714 0.037293 0.415373 +0.120832 0.037293 0.415373 +0.159284 0.037293 0.415373 +0.194868 0.037293 0.415373 +0.227530 0.037293 0.415373 +0.257434 0.037293 0.415373 +0.285092 0.037293 0.415373 +0.310738 0.037293 0.415373 +0.334585 0.037293 0.415373 +0.356818 0.037293 0.415373 +0.377602 0.037293 0.415373 +0.397079 0.037293 0.415373 +0.415373 0.037293 0.415373 +0.432594 0.037293 0.415373 +0.448839 0.037293 0.415373 +0.464192 0.037293 0.415373 +0.478729 0.037293 0.415373 +0.492515 0.037293 0.415373 +0.505612 0.037293 0.415373 +0.518072 0.037293 0.415373 +0.529943 0.037293 0.415373 +0.541266 0.037293 0.415373 +0.552083 0.037293 0.415373 +0.562427 0.037293 0.415373 +0.572331 0.037293 0.415373 +0.581823 0.037293 0.415373 +0.590929 0.037293 0.415373 +0.599674 0.037293 0.415373 +0.608079 0.037293 0.415373 +0.616166 0.037293 0.415373 +0.000001 0.079714 0.415373 +0.037293 0.079714 0.415373 +0.079714 0.079714 0.415373 +0.120832 0.079714 0.415373 +0.159284 0.079714 0.415373 +0.194868 0.079714 0.415373 +0.227530 0.079714 0.415373 +0.257434 0.079714 0.415373 +0.285092 0.079714 0.415373 +0.310738 0.079714 0.415373 +0.334585 0.079714 0.415373 +0.356818 0.079714 0.415373 +0.377602 0.079714 0.415373 +0.397079 0.079714 0.415373 +0.415373 0.079714 0.415373 +0.432594 0.079714 0.415373 +0.448839 0.079714 0.415373 +0.464192 0.079714 0.415373 +0.478729 0.079714 0.415373 +0.492515 0.079714 0.415373 +0.505612 0.079714 0.415373 +0.518072 0.079714 0.415373 +0.529943 0.079714 0.415373 +0.541266 0.079714 0.415373 +0.552083 0.079714 0.415373 +0.562427 0.079714 0.415373 +0.572331 0.079714 0.415373 +0.581823 0.079714 0.415373 +0.590929 0.079714 0.415373 +0.599674 0.079714 0.415373 +0.608079 0.079714 0.415373 +0.616166 0.079714 0.415373 +0.000001 0.120832 0.415373 +0.037293 0.120832 0.415373 +0.079714 0.120832 0.415373 +0.120832 0.120832 0.415373 +0.159284 0.120832 0.415373 +0.194868 0.120832 0.415373 +0.227530 0.120832 0.415373 +0.257434 0.120832 0.415373 +0.285092 0.120832 0.415373 +0.310738 0.120832 0.415373 +0.334585 0.120832 0.415373 +0.356818 0.120832 0.415373 +0.377602 0.120832 0.415373 +0.397079 0.120832 0.415373 +0.415373 0.120832 0.415373 +0.432594 0.120832 0.415373 +0.448839 0.120832 0.415373 +0.464192 0.120832 0.415373 +0.478729 0.120832 0.415373 +0.492515 0.120832 0.415373 +0.505612 0.120832 0.415373 +0.518072 0.120832 0.415373 +0.529943 0.120832 0.415373 +0.541266 0.120832 0.415373 +0.552083 0.120832 0.415373 +0.562427 0.120832 0.415373 +0.572331 0.120832 0.415373 +0.581823 0.120832 0.415373 +0.590929 0.120832 0.415373 +0.599674 0.120832 0.415373 +0.608079 0.120832 0.415373 +0.616166 0.120832 0.415373 +0.000001 0.159284 0.415373 +0.037293 0.159284 0.415373 +0.079714 0.159284 0.415373 +0.120832 0.159284 0.415373 +0.159284 0.159284 0.415373 +0.194868 0.159284 0.415373 +0.227530 0.159284 0.415373 +0.257434 0.159284 0.415373 +0.285092 0.159284 0.415373 +0.310738 0.159284 0.415373 +0.334585 0.159284 0.415373 +0.356818 0.159284 0.415373 +0.377602 0.159284 0.415373 +0.397079 0.159284 0.415373 +0.415373 0.159284 0.415373 +0.432594 0.159284 0.415373 +0.448839 0.159284 0.415373 +0.464192 0.159284 0.415373 +0.478729 0.159284 0.415373 +0.492515 0.159284 0.415373 +0.505612 0.159284 0.415373 +0.518072 0.159284 0.415373 +0.529943 0.159284 0.415373 +0.541266 0.159284 0.415373 +0.552083 0.159284 0.415373 +0.562427 0.159284 0.415373 +0.572331 0.159284 0.415373 +0.581823 0.159284 0.415373 +0.590929 0.159284 0.415373 +0.599674 0.159284 0.415373 +0.608079 0.159284 0.415373 +0.616166 0.159284 0.415373 +0.000001 0.194868 0.415373 +0.037293 0.194868 0.415373 +0.079714 0.194868 0.415373 +0.120832 0.194868 0.415373 +0.159284 0.194868 0.415373 +0.194868 0.194868 0.415373 +0.227530 0.194868 0.415373 +0.257434 0.194868 0.415373 +0.285092 0.194868 0.415373 +0.310738 0.194868 0.415373 +0.334585 0.194868 0.415373 +0.356818 0.194868 0.415373 +0.377602 0.194868 0.415373 +0.397079 0.194868 0.415373 +0.415373 0.194868 0.415373 +0.432594 0.194868 0.415373 +0.448839 0.194868 0.415373 +0.464192 0.194868 0.415373 +0.478729 0.194868 0.415373 +0.492515 0.194868 0.415373 +0.505612 0.194868 0.415373 +0.518072 0.194868 0.415373 +0.529943 0.194868 0.415373 +0.541266 0.194868 0.415373 +0.552083 0.194868 0.415373 +0.562427 0.194868 0.415373 +0.572331 0.194868 0.415373 +0.581823 0.194868 0.415373 +0.590929 0.194868 0.415373 +0.599674 0.194868 0.415373 +0.608079 0.194868 0.415373 +0.616166 0.194868 0.415373 +0.000001 0.227530 0.415373 +0.037293 0.227530 0.415373 +0.079714 0.227530 0.415373 +0.120832 0.227530 0.415373 +0.159284 0.227530 0.415373 +0.194868 0.227530 0.415373 +0.227530 0.227530 0.415373 +0.257434 0.227530 0.415373 +0.285092 0.227530 0.415373 +0.310738 0.227530 0.415373 +0.334585 0.227530 0.415373 +0.356818 0.227530 0.415373 +0.377602 0.227530 0.415373 +0.397079 0.227530 0.415373 +0.415373 0.227530 0.415373 +0.432594 0.227530 0.415373 +0.448839 0.227530 0.415373 +0.464192 0.227530 0.415373 +0.478729 0.227530 0.415373 +0.492515 0.227530 0.415373 +0.505612 0.227530 0.415373 +0.518072 0.227530 0.415373 +0.529943 0.227530 0.415373 +0.541266 0.227530 0.415373 +0.552083 0.227530 0.415373 +0.562427 0.227530 0.415373 +0.572331 0.227530 0.415373 +0.581823 0.227530 0.415373 +0.590929 0.227530 0.415373 +0.599674 0.227530 0.415373 +0.608079 0.227530 0.415373 +0.616166 0.227530 0.415373 +0.000001 0.257434 0.415373 +0.037293 0.257434 0.415373 +0.079714 0.257434 0.415373 +0.120832 0.257434 0.415373 +0.159284 0.257434 0.415373 +0.194868 0.257434 0.415373 +0.227530 0.257434 0.415373 +0.257434 0.257434 0.415373 +0.285092 0.257434 0.415373 +0.310738 0.257434 0.415373 +0.334585 0.257434 0.415373 +0.356818 0.257434 0.415373 +0.377602 0.257434 0.415373 +0.397079 0.257434 0.415373 +0.415373 0.257434 0.415373 +0.432594 0.257434 0.415373 +0.448839 0.257434 0.415373 +0.464192 0.257434 0.415373 +0.478729 0.257434 0.415373 +0.492515 0.257434 0.415373 +0.505612 0.257434 0.415373 +0.518072 0.257434 0.415373 +0.529943 0.257434 0.415373 +0.541266 0.257434 0.415373 +0.552083 0.257434 0.415373 +0.562427 0.257434 0.415373 +0.572331 0.257434 0.415373 +0.581823 0.257434 0.415373 +0.590929 0.257434 0.415373 +0.599674 0.257434 0.415373 +0.608079 0.257434 0.415373 +0.616166 0.257434 0.415373 +0.000001 0.285092 0.415373 +0.037293 0.285092 0.415373 +0.079714 0.285092 0.415373 +0.120832 0.285092 0.415373 +0.159284 0.285092 0.415373 +0.194868 0.285092 0.415373 +0.227530 0.285092 0.415373 +0.257434 0.285092 0.415373 +0.285092 0.285092 0.415373 +0.310738 0.285092 0.415373 +0.334585 0.285092 0.415373 +0.356818 0.285092 0.415373 +0.377602 0.285092 0.415373 +0.397079 0.285092 0.415373 +0.415373 0.285092 0.415373 +0.432594 0.285092 0.415373 +0.448839 0.285092 0.415373 +0.464192 0.285092 0.415373 +0.478729 0.285092 0.415373 +0.492515 0.285092 0.415373 +0.505612 0.285092 0.415373 +0.518072 0.285092 0.415373 +0.529943 0.285092 0.415373 +0.541266 0.285092 0.415373 +0.552083 0.285092 0.415373 +0.562427 0.285092 0.415373 +0.572331 0.285092 0.415373 +0.581823 0.285092 0.415373 +0.590929 0.285092 0.415373 +0.599674 0.285092 0.415373 +0.608079 0.285092 0.415373 +0.616166 0.285092 0.415373 +0.000001 0.310738 0.415373 +0.037293 0.310738 0.415373 +0.079714 0.310738 0.415373 +0.120832 0.310738 0.415373 +0.159284 0.310738 0.415373 +0.194868 0.310738 0.415373 +0.227530 0.310738 0.415373 +0.257434 0.310738 0.415373 +0.285092 0.310738 0.415373 +0.310738 0.310738 0.415373 +0.334585 0.310738 0.415373 +0.356818 0.310738 0.415373 +0.377602 0.310738 0.415373 +0.397079 0.310738 0.415373 +0.415373 0.310738 0.415373 +0.432594 0.310738 0.415373 +0.448839 0.310738 0.415373 +0.464192 0.310738 0.415373 +0.478729 0.310738 0.415373 +0.492515 0.310738 0.415373 +0.505612 0.310738 0.415373 +0.518072 0.310738 0.415373 +0.529943 0.310738 0.415373 +0.541266 0.310738 0.415373 +0.552083 0.310738 0.415373 +0.562427 0.310738 0.415373 +0.572331 0.310738 0.415373 +0.581823 0.310738 0.415373 +0.590929 0.310738 0.415373 +0.599674 0.310738 0.415373 +0.608079 0.310738 0.415373 +0.616166 0.310738 0.415373 +0.000001 0.334585 0.415373 +0.037293 0.334585 0.415373 +0.079714 0.334585 0.415373 +0.120832 0.334585 0.415373 +0.159284 0.334585 0.415373 +0.194868 0.334585 0.415373 +0.227530 0.334585 0.415373 +0.257434 0.334585 0.415373 +0.285092 0.334585 0.415373 +0.310738 0.334585 0.415373 +0.334585 0.334585 0.415373 +0.356818 0.334585 0.415373 +0.377602 0.334585 0.415373 +0.397079 0.334585 0.415373 +0.415373 0.334585 0.415373 +0.432594 0.334585 0.415373 +0.448839 0.334585 0.415373 +0.464192 0.334585 0.415373 +0.478729 0.334585 0.415373 +0.492515 0.334585 0.415373 +0.505612 0.334585 0.415373 +0.518072 0.334585 0.415373 +0.529943 0.334585 0.415373 +0.541266 0.334585 0.415373 +0.552083 0.334585 0.415373 +0.562427 0.334585 0.415373 +0.572331 0.334585 0.415373 +0.581823 0.334585 0.415373 +0.590929 0.334585 0.415373 +0.599674 0.334585 0.415373 +0.608079 0.334585 0.415373 +0.616166 0.334585 0.415373 +0.000001 0.356818 0.415373 +0.037293 0.356818 0.415373 +0.079714 0.356818 0.415373 +0.120832 0.356818 0.415373 +0.159284 0.356818 0.415373 +0.194868 0.356818 0.415373 +0.227530 0.356818 0.415373 +0.257434 0.356818 0.415373 +0.285092 0.356818 0.415373 +0.310738 0.356818 0.415373 +0.334585 0.356818 0.415373 +0.356818 0.356818 0.415373 +0.377602 0.356818 0.415373 +0.397079 0.356818 0.415373 +0.415373 0.356818 0.415373 +0.432594 0.356818 0.415373 +0.448839 0.356818 0.415373 +0.464192 0.356818 0.415373 +0.478729 0.356818 0.415373 +0.492515 0.356818 0.415373 +0.505612 0.356818 0.415373 +0.518072 0.356818 0.415373 +0.529943 0.356818 0.415373 +0.541266 0.356818 0.415373 +0.552083 0.356818 0.415373 +0.562427 0.356818 0.415373 +0.572331 0.356818 0.415373 +0.581823 0.356818 0.415373 +0.590929 0.356818 0.415373 +0.599674 0.356818 0.415373 +0.608079 0.356818 0.415373 +0.616166 0.356818 0.415373 +0.000001 0.377602 0.415373 +0.037293 0.377602 0.415373 +0.079714 0.377602 0.415373 +0.120832 0.377602 0.415373 +0.159284 0.377602 0.415373 +0.194868 0.377602 0.415373 +0.227530 0.377602 0.415373 +0.257434 0.377602 0.415373 +0.285092 0.377602 0.415373 +0.310738 0.377602 0.415373 +0.334585 0.377602 0.415373 +0.356818 0.377602 0.415373 +0.377602 0.377602 0.415373 +0.397079 0.377602 0.415373 +0.415373 0.377602 0.415373 +0.432594 0.377602 0.415373 +0.448839 0.377602 0.415373 +0.464192 0.377602 0.415373 +0.478729 0.377602 0.415373 +0.492515 0.377602 0.415373 +0.505612 0.377602 0.415373 +0.518072 0.377602 0.415373 +0.529943 0.377602 0.415373 +0.541266 0.377602 0.415373 +0.552083 0.377602 0.415373 +0.562427 0.377602 0.415373 +0.572331 0.377602 0.415373 +0.581823 0.377602 0.415373 +0.590929 0.377602 0.415373 +0.599674 0.377602 0.415373 +0.608079 0.377602 0.415373 +0.616166 0.377602 0.415373 +0.000001 0.397079 0.415373 +0.037293 0.397079 0.415373 +0.079714 0.397079 0.415373 +0.120832 0.397079 0.415373 +0.159284 0.397079 0.415373 +0.194868 0.397079 0.415373 +0.227530 0.397079 0.415373 +0.257434 0.397079 0.415373 +0.285092 0.397079 0.415373 +0.310738 0.397079 0.415373 +0.334585 0.397079 0.415373 +0.356818 0.397079 0.415373 +0.377602 0.397079 0.415373 +0.397079 0.397079 0.415373 +0.415373 0.397079 0.415373 +0.432594 0.397079 0.415373 +0.448839 0.397079 0.415373 +0.464192 0.397079 0.415373 +0.478729 0.397079 0.415373 +0.492515 0.397079 0.415373 +0.505612 0.397079 0.415373 +0.518072 0.397079 0.415373 +0.529943 0.397079 0.415373 +0.541266 0.397079 0.415373 +0.552083 0.397079 0.415373 +0.562427 0.397079 0.415373 +0.572331 0.397079 0.415373 +0.581823 0.397079 0.415373 +0.590929 0.397079 0.415373 +0.599674 0.397079 0.415373 +0.608079 0.397079 0.415373 +0.616166 0.397079 0.415373 +0.000001 0.415373 0.415373 +0.037293 0.415373 0.415373 +0.079714 0.415373 0.415373 +0.120832 0.415373 0.415373 +0.159284 0.415373 0.415373 +0.194868 0.415373 0.415373 +0.227530 0.415373 0.415373 +0.257434 0.415373 0.415373 +0.285092 0.415373 0.415373 +0.310738 0.415373 0.415373 +0.334585 0.415373 0.415373 +0.356818 0.415373 0.415373 +0.377602 0.415373 0.415373 +0.397079 0.415373 0.415373 +0.415373 0.415373 0.415373 +0.432594 0.415373 0.415373 +0.448839 0.415373 0.415373 +0.464192 0.415373 0.415373 +0.478729 0.415373 0.415373 +0.492515 0.415373 0.415373 +0.505612 0.415373 0.415373 +0.518072 0.415373 0.415373 +0.529943 0.415373 0.415373 +0.541266 0.415373 0.415373 +0.552083 0.415373 0.415373 +0.562427 0.415373 0.415373 +0.572331 0.415373 0.415373 +0.581823 0.415373 0.415373 +0.590929 0.415373 0.415373 +0.599674 0.415373 0.415373 +0.608079 0.415373 0.415373 +0.616166 0.415373 0.415373 +0.000001 0.432594 0.415373 +0.037293 0.432594 0.415373 +0.079714 0.432594 0.415373 +0.120832 0.432594 0.415373 +0.159284 0.432594 0.415373 +0.194868 0.432594 0.415373 +0.227530 0.432594 0.415373 +0.257434 0.432594 0.415373 +0.285092 0.432594 0.415373 +0.310738 0.432594 0.415373 +0.334585 0.432594 0.415373 +0.356818 0.432594 0.415373 +0.377602 0.432594 0.415373 +0.397079 0.432594 0.415373 +0.415373 0.432594 0.415373 +0.432594 0.432594 0.415373 +0.448839 0.432594 0.415373 +0.464192 0.432594 0.415373 +0.478729 0.432594 0.415373 +0.492515 0.432594 0.415373 +0.505612 0.432594 0.415373 +0.518072 0.432594 0.415373 +0.529943 0.432594 0.415373 +0.541266 0.432594 0.415373 +0.552083 0.432594 0.415373 +0.562427 0.432594 0.415373 +0.572331 0.432594 0.415373 +0.581823 0.432594 0.415373 +0.590929 0.432594 0.415373 +0.599674 0.432594 0.415373 +0.608079 0.432594 0.415373 +0.616166 0.432594 0.415373 +0.000001 0.448839 0.415373 +0.037293 0.448839 0.415373 +0.079714 0.448839 0.415373 +0.120832 0.448839 0.415373 +0.159284 0.448839 0.415373 +0.194868 0.448839 0.415373 +0.227530 0.448839 0.415373 +0.257434 0.448839 0.415373 +0.285092 0.448839 0.415373 +0.310738 0.448839 0.415373 +0.334585 0.448839 0.415373 +0.356818 0.448839 0.415373 +0.377602 0.448839 0.415373 +0.397079 0.448839 0.415373 +0.415373 0.448839 0.415373 +0.432594 0.448839 0.415373 +0.448839 0.448839 0.415373 +0.464192 0.448839 0.415373 +0.478729 0.448839 0.415373 +0.492515 0.448839 0.415373 +0.505612 0.448839 0.415373 +0.518072 0.448839 0.415373 +0.529943 0.448839 0.415373 +0.541266 0.448839 0.415373 +0.552083 0.448839 0.415373 +0.562427 0.448839 0.415373 +0.572331 0.448839 0.415373 +0.581823 0.448839 0.415373 +0.590929 0.448839 0.415373 +0.599674 0.448839 0.415373 +0.608079 0.448839 0.415373 +0.616166 0.448839 0.415373 +0.000001 0.464192 0.415373 +0.037293 0.464192 0.415373 +0.079714 0.464192 0.415373 +0.120832 0.464192 0.415373 +0.159284 0.464192 0.415373 +0.194868 0.464192 0.415373 +0.227530 0.464192 0.415373 +0.257434 0.464192 0.415373 +0.285092 0.464192 0.415373 +0.310738 0.464192 0.415373 +0.334585 0.464192 0.415373 +0.356818 0.464192 0.415373 +0.377602 0.464192 0.415373 +0.397079 0.464192 0.415373 +0.415373 0.464192 0.415373 +0.432594 0.464192 0.415373 +0.448839 0.464192 0.415373 +0.464192 0.464192 0.415373 +0.478729 0.464192 0.415373 +0.492515 0.464192 0.415373 +0.505612 0.464192 0.415373 +0.518072 0.464192 0.415373 +0.529943 0.464192 0.415373 +0.541266 0.464192 0.415373 +0.552083 0.464192 0.415373 +0.562427 0.464192 0.415373 +0.572331 0.464192 0.415373 +0.581823 0.464192 0.415373 +0.590929 0.464192 0.415373 +0.599674 0.464192 0.415373 +0.608079 0.464192 0.415373 +0.616166 0.464192 0.415373 +0.000001 0.478729 0.415373 +0.037293 0.478729 0.415373 +0.079714 0.478729 0.415373 +0.120832 0.478729 0.415373 +0.159284 0.478729 0.415373 +0.194868 0.478729 0.415373 +0.227530 0.478729 0.415373 +0.257434 0.478729 0.415373 +0.285092 0.478729 0.415373 +0.310738 0.478729 0.415373 +0.334585 0.478729 0.415373 +0.356818 0.478729 0.415373 +0.377602 0.478729 0.415373 +0.397079 0.478729 0.415373 +0.415373 0.478729 0.415373 +0.432594 0.478729 0.415373 +0.448839 0.478729 0.415373 +0.464192 0.478729 0.415373 +0.478729 0.478729 0.415373 +0.492515 0.478729 0.415373 +0.505612 0.478729 0.415373 +0.518072 0.478729 0.415373 +0.529943 0.478729 0.415373 +0.541266 0.478729 0.415373 +0.552083 0.478729 0.415373 +0.562427 0.478729 0.415373 +0.572331 0.478729 0.415373 +0.581823 0.478729 0.415373 +0.590929 0.478729 0.415373 +0.599674 0.478729 0.415373 +0.608079 0.478729 0.415373 +0.616166 0.478729 0.415373 +0.000001 0.492515 0.415373 +0.037293 0.492515 0.415373 +0.079714 0.492515 0.415373 +0.120832 0.492515 0.415373 +0.159284 0.492515 0.415373 +0.194868 0.492515 0.415373 +0.227530 0.492515 0.415373 +0.257434 0.492515 0.415373 +0.285092 0.492515 0.415373 +0.310738 0.492515 0.415373 +0.334585 0.492515 0.415373 +0.356818 0.492515 0.415373 +0.377602 0.492515 0.415373 +0.397079 0.492515 0.415373 +0.415373 0.492515 0.415373 +0.432594 0.492515 0.415373 +0.448839 0.492515 0.415373 +0.464192 0.492515 0.415373 +0.478729 0.492515 0.415373 +0.492515 0.492515 0.415373 +0.505612 0.492515 0.415373 +0.518072 0.492515 0.415373 +0.529943 0.492515 0.415373 +0.541266 0.492515 0.415373 +0.552083 0.492515 0.415373 +0.562427 0.492515 0.415373 +0.572331 0.492515 0.415373 +0.581823 0.492515 0.415373 +0.590929 0.492515 0.415373 +0.599674 0.492515 0.415373 +0.608079 0.492515 0.415373 +0.616166 0.492515 0.415373 +0.000001 0.505612 0.415373 +0.037293 0.505612 0.415373 +0.079714 0.505612 0.415373 +0.120832 0.505612 0.415373 +0.159284 0.505612 0.415373 +0.194868 0.505612 0.415373 +0.227530 0.505612 0.415373 +0.257434 0.505612 0.415373 +0.285092 0.505612 0.415373 +0.310738 0.505612 0.415373 +0.334585 0.505612 0.415373 +0.356818 0.505612 0.415373 +0.377602 0.505612 0.415373 +0.397079 0.505612 0.415373 +0.415373 0.505612 0.415373 +0.432594 0.505612 0.415373 +0.448839 0.505612 0.415373 +0.464192 0.505612 0.415373 +0.478729 0.505612 0.415373 +0.492515 0.505612 0.415373 +0.505612 0.505612 0.415373 +0.518072 0.505612 0.415373 +0.529943 0.505612 0.415373 +0.541266 0.505612 0.415373 +0.552083 0.505612 0.415373 +0.562427 0.505612 0.415373 +0.572331 0.505612 0.415373 +0.581823 0.505612 0.415373 +0.590929 0.505612 0.415373 +0.599674 0.505612 0.415373 +0.608079 0.505612 0.415373 +0.616166 0.505612 0.415373 +0.000001 0.518072 0.415373 +0.037293 0.518072 0.415373 +0.079714 0.518072 0.415373 +0.120832 0.518072 0.415373 +0.159284 0.518072 0.415373 +0.194868 0.518072 0.415373 +0.227530 0.518072 0.415373 +0.257434 0.518072 0.415373 +0.285092 0.518072 0.415373 +0.310738 0.518072 0.415373 +0.334585 0.518072 0.415373 +0.356818 0.518072 0.415373 +0.377602 0.518072 0.415373 +0.397079 0.518072 0.415373 +0.415373 0.518072 0.415373 +0.432594 0.518072 0.415373 +0.448839 0.518072 0.415373 +0.464192 0.518072 0.415373 +0.478729 0.518072 0.415373 +0.492515 0.518072 0.415373 +0.505612 0.518072 0.415373 +0.518072 0.518072 0.415373 +0.529943 0.518072 0.415373 +0.541266 0.518072 0.415373 +0.552083 0.518072 0.415373 +0.562427 0.518072 0.415373 +0.572331 0.518072 0.415373 +0.581823 0.518072 0.415373 +0.590929 0.518072 0.415373 +0.599674 0.518072 0.415373 +0.608079 0.518072 0.415373 +0.616166 0.518072 0.415373 +0.000001 0.529943 0.415373 +0.037293 0.529943 0.415373 +0.079714 0.529943 0.415373 +0.120832 0.529943 0.415373 +0.159284 0.529943 0.415373 +0.194868 0.529943 0.415373 +0.227530 0.529943 0.415373 +0.257434 0.529943 0.415373 +0.285092 0.529943 0.415373 +0.310738 0.529943 0.415373 +0.334585 0.529943 0.415373 +0.356818 0.529943 0.415373 +0.377602 0.529943 0.415373 +0.397079 0.529943 0.415373 +0.415373 0.529943 0.415373 +0.432594 0.529943 0.415373 +0.448839 0.529943 0.415373 +0.464192 0.529943 0.415373 +0.478729 0.529943 0.415373 +0.492515 0.529943 0.415373 +0.505612 0.529943 0.415373 +0.518072 0.529943 0.415373 +0.529943 0.529943 0.415373 +0.541266 0.529943 0.415373 +0.552083 0.529943 0.415373 +0.562427 0.529943 0.415373 +0.572331 0.529943 0.415373 +0.581823 0.529943 0.415373 +0.590929 0.529943 0.415373 +0.599674 0.529943 0.415373 +0.608079 0.529943 0.415373 +0.616166 0.529943 0.415373 +0.000001 0.541266 0.415373 +0.037293 0.541266 0.415373 +0.079714 0.541266 0.415373 +0.120832 0.541266 0.415373 +0.159284 0.541266 0.415373 +0.194868 0.541266 0.415373 +0.227530 0.541266 0.415373 +0.257434 0.541266 0.415373 +0.285092 0.541266 0.415373 +0.310738 0.541266 0.415373 +0.334585 0.541266 0.415373 +0.356818 0.541266 0.415373 +0.377602 0.541266 0.415373 +0.397079 0.541266 0.415373 +0.415373 0.541266 0.415373 +0.432594 0.541266 0.415373 +0.448839 0.541266 0.415373 +0.464192 0.541266 0.415373 +0.478729 0.541266 0.415373 +0.492515 0.541266 0.415373 +0.505612 0.541266 0.415373 +0.518072 0.541266 0.415373 +0.529943 0.541266 0.415373 +0.541266 0.541266 0.415373 +0.552083 0.541266 0.415373 +0.562427 0.541266 0.415373 +0.572331 0.541266 0.415373 +0.581823 0.541266 0.415373 +0.590929 0.541266 0.415373 +0.599674 0.541266 0.415373 +0.608079 0.541266 0.415373 +0.616166 0.541266 0.415373 +0.000001 0.552083 0.415373 +0.037293 0.552083 0.415373 +0.079714 0.552083 0.415373 +0.120832 0.552083 0.415373 +0.159284 0.552083 0.415373 +0.194868 0.552083 0.415373 +0.227530 0.552083 0.415373 +0.257434 0.552083 0.415373 +0.285092 0.552083 0.415373 +0.310738 0.552083 0.415373 +0.334585 0.552083 0.415373 +0.356818 0.552083 0.415373 +0.377602 0.552083 0.415373 +0.397079 0.552083 0.415373 +0.415373 0.552083 0.415373 +0.432594 0.552083 0.415373 +0.448839 0.552083 0.415373 +0.464192 0.552083 0.415373 +0.478729 0.552083 0.415373 +0.492515 0.552083 0.415373 +0.505612 0.552083 0.415373 +0.518072 0.552083 0.415373 +0.529943 0.552083 0.415373 +0.541266 0.552083 0.415373 +0.552083 0.552083 0.415373 +0.562427 0.552083 0.415373 +0.572331 0.552083 0.415373 +0.581823 0.552083 0.415373 +0.590929 0.552083 0.415373 +0.599674 0.552083 0.415373 +0.608079 0.552083 0.415373 +0.616166 0.552083 0.415373 +0.000001 0.562427 0.415373 +0.037293 0.562427 0.415373 +0.079714 0.562427 0.415373 +0.120832 0.562427 0.415373 +0.159284 0.562427 0.415373 +0.194868 0.562427 0.415373 +0.227530 0.562427 0.415373 +0.257434 0.562427 0.415373 +0.285092 0.562427 0.415373 +0.310738 0.562427 0.415373 +0.334585 0.562427 0.415373 +0.356818 0.562427 0.415373 +0.377602 0.562427 0.415373 +0.397079 0.562427 0.415373 +0.415373 0.562427 0.415373 +0.432594 0.562427 0.415373 +0.448839 0.562427 0.415373 +0.464192 0.562427 0.415373 +0.478729 0.562427 0.415373 +0.492515 0.562427 0.415373 +0.505612 0.562427 0.415373 +0.518072 0.562427 0.415373 +0.529943 0.562427 0.415373 +0.541266 0.562427 0.415373 +0.552083 0.562427 0.415373 +0.562427 0.562427 0.415373 +0.572331 0.562427 0.415373 +0.581823 0.562427 0.415373 +0.590929 0.562427 0.415373 +0.599674 0.562427 0.415373 +0.608079 0.562427 0.415373 +0.616166 0.562427 0.415373 +0.000001 0.572331 0.415373 +0.037293 0.572331 0.415373 +0.079714 0.572331 0.415373 +0.120832 0.572331 0.415373 +0.159284 0.572331 0.415373 +0.194868 0.572331 0.415373 +0.227530 0.572331 0.415373 +0.257434 0.572331 0.415373 +0.285092 0.572331 0.415373 +0.310738 0.572331 0.415373 +0.334585 0.572331 0.415373 +0.356818 0.572331 0.415373 +0.377602 0.572331 0.415373 +0.397079 0.572331 0.415373 +0.415373 0.572331 0.415373 +0.432594 0.572331 0.415373 +0.448839 0.572331 0.415373 +0.464192 0.572331 0.415373 +0.478729 0.572331 0.415373 +0.492515 0.572331 0.415373 +0.505612 0.572331 0.415373 +0.518072 0.572331 0.415373 +0.529943 0.572331 0.415373 +0.541266 0.572331 0.415373 +0.552083 0.572331 0.415373 +0.562427 0.572331 0.415373 +0.572331 0.572331 0.415373 +0.581823 0.572331 0.415373 +0.590929 0.572331 0.415373 +0.599674 0.572331 0.415373 +0.608079 0.572331 0.415373 +0.616166 0.572331 0.415373 +0.000001 0.581823 0.415373 +0.037293 0.581823 0.415373 +0.079714 0.581823 0.415373 +0.120832 0.581823 0.415373 +0.159284 0.581823 0.415373 +0.194868 0.581823 0.415373 +0.227530 0.581823 0.415373 +0.257434 0.581823 0.415373 +0.285092 0.581823 0.415373 +0.310738 0.581823 0.415373 +0.334585 0.581823 0.415373 +0.356818 0.581823 0.415373 +0.377602 0.581823 0.415373 +0.397079 0.581823 0.415373 +0.415373 0.581823 0.415373 +0.432594 0.581823 0.415373 +0.448839 0.581823 0.415373 +0.464192 0.581823 0.415373 +0.478729 0.581823 0.415373 +0.492515 0.581823 0.415373 +0.505612 0.581823 0.415373 +0.518072 0.581823 0.415373 +0.529943 0.581823 0.415373 +0.541266 0.581823 0.415373 +0.552083 0.581823 0.415373 +0.562427 0.581823 0.415373 +0.572331 0.581823 0.415373 +0.581823 0.581823 0.415373 +0.590929 0.581823 0.415373 +0.599674 0.581823 0.415373 +0.608079 0.581823 0.415373 +0.616166 0.581823 0.415373 +0.000001 0.590929 0.415373 +0.037293 0.590929 0.415373 +0.079714 0.590929 0.415373 +0.120832 0.590929 0.415373 +0.159284 0.590929 0.415373 +0.194868 0.590929 0.415373 +0.227530 0.590929 0.415373 +0.257434 0.590929 0.415373 +0.285092 0.590929 0.415373 +0.310738 0.590929 0.415373 +0.334585 0.590929 0.415373 +0.356818 0.590929 0.415373 +0.377602 0.590929 0.415373 +0.397079 0.590929 0.415373 +0.415373 0.590929 0.415373 +0.432594 0.590929 0.415373 +0.448839 0.590929 0.415373 +0.464192 0.590929 0.415373 +0.478729 0.590929 0.415373 +0.492515 0.590929 0.415373 +0.505612 0.590929 0.415373 +0.518072 0.590929 0.415373 +0.529943 0.590929 0.415373 +0.541266 0.590929 0.415373 +0.552083 0.590929 0.415373 +0.562427 0.590929 0.415373 +0.572331 0.590929 0.415373 +0.581823 0.590929 0.415373 +0.590929 0.590929 0.415373 +0.599674 0.590929 0.415373 +0.608079 0.590929 0.415373 +0.616166 0.590929 0.415373 +0.000001 0.599674 0.415373 +0.037293 0.599674 0.415373 +0.079714 0.599674 0.415373 +0.120832 0.599674 0.415373 +0.159284 0.599674 0.415373 +0.194868 0.599674 0.415373 +0.227530 0.599674 0.415373 +0.257434 0.599674 0.415373 +0.285092 0.599674 0.415373 +0.310738 0.599674 0.415373 +0.334585 0.599674 0.415373 +0.356818 0.599674 0.415373 +0.377602 0.599674 0.415373 +0.397079 0.599674 0.415373 +0.415373 0.599674 0.415373 +0.432594 0.599674 0.415373 +0.448839 0.599674 0.415373 +0.464192 0.599674 0.415373 +0.478729 0.599674 0.415373 +0.492515 0.599674 0.415373 +0.505612 0.599674 0.415373 +0.518072 0.599674 0.415373 +0.529943 0.599674 0.415373 +0.541266 0.599674 0.415373 +0.552083 0.599674 0.415373 +0.562427 0.599674 0.415373 +0.572331 0.599674 0.415373 +0.581823 0.599674 0.415373 +0.590929 0.599674 0.415373 +0.599674 0.599674 0.415373 +0.608079 0.599674 0.415373 +0.616166 0.599674 0.415373 +0.000001 0.608079 0.415373 +0.037293 0.608079 0.415373 +0.079714 0.608079 0.415373 +0.120832 0.608079 0.415373 +0.159284 0.608079 0.415373 +0.194868 0.608079 0.415373 +0.227530 0.608079 0.415373 +0.257434 0.608079 0.415373 +0.285092 0.608079 0.415373 +0.310738 0.608079 0.415373 +0.334585 0.608079 0.415373 +0.356818 0.608079 0.415373 +0.377602 0.608079 0.415373 +0.397079 0.608079 0.415373 +0.415373 0.608079 0.415373 +0.432594 0.608079 0.415373 +0.448839 0.608079 0.415373 +0.464192 0.608079 0.415373 +0.478729 0.608079 0.415373 +0.492515 0.608079 0.415373 +0.505612 0.608079 0.415373 +0.518072 0.608079 0.415373 +0.529943 0.608079 0.415373 +0.541266 0.608079 0.415373 +0.552083 0.608079 0.415373 +0.562427 0.608079 0.415373 +0.572331 0.608079 0.415373 +0.581823 0.608079 0.415373 +0.590929 0.608079 0.415373 +0.599674 0.608079 0.415373 +0.608079 0.608079 0.415373 +0.616166 0.608079 0.415373 +0.000001 0.616166 0.415373 +0.037293 0.616166 0.415373 +0.079714 0.616166 0.415373 +0.120832 0.616166 0.415373 +0.159284 0.616166 0.415373 +0.194868 0.616166 0.415373 +0.227530 0.616166 0.415373 +0.257434 0.616166 0.415373 +0.285092 0.616166 0.415373 +0.310738 0.616166 0.415373 +0.334585 0.616166 0.415373 +0.356818 0.616166 0.415373 +0.377602 0.616166 0.415373 +0.397079 0.616166 0.415373 +0.415373 0.616166 0.415373 +0.432594 0.616166 0.415373 +0.448839 0.616166 0.415373 +0.464192 0.616166 0.415373 +0.478729 0.616166 0.415373 +0.492515 0.616166 0.415373 +0.505612 0.616166 0.415373 +0.518072 0.616166 0.415373 +0.529943 0.616166 0.415373 +0.541266 0.616166 0.415373 +0.552083 0.616166 0.415373 +0.562427 0.616166 0.415373 +0.572331 0.616166 0.415373 +0.581823 0.616166 0.415373 +0.590929 0.616166 0.415373 +0.599674 0.616166 0.415373 +0.608079 0.616166 0.415373 +0.616166 0.616166 0.415373 +0.000001 0.000001 0.432594 +0.037293 0.000001 0.432594 +0.079714 0.000001 0.432594 +0.120832 0.000001 0.432594 +0.159284 0.000001 0.432594 +0.194868 0.000001 0.432594 +0.227530 0.000001 0.432594 +0.257434 0.000001 0.432594 +0.285092 0.000001 0.432594 +0.310738 0.000001 0.432594 +0.334585 0.000001 0.432594 +0.356818 0.000001 0.432594 +0.377602 0.000001 0.432594 +0.397079 0.000001 0.432594 +0.415373 0.000001 0.432594 +0.432594 0.000001 0.432594 +0.448839 0.000001 0.432594 +0.464192 0.000001 0.432594 +0.478729 0.000001 0.432594 +0.492515 0.000001 0.432594 +0.505612 0.000001 0.432594 +0.518072 0.000001 0.432594 +0.529943 0.000001 0.432594 +0.541266 0.000001 0.432594 +0.552083 0.000001 0.432594 +0.562427 0.000001 0.432594 +0.572331 0.000001 0.432594 +0.581823 0.000001 0.432594 +0.590929 0.000001 0.432594 +0.599674 0.000001 0.432594 +0.608079 0.000001 0.432594 +0.616166 0.000001 0.432594 +0.000001 0.037293 0.432594 +0.037293 0.037293 0.432594 +0.079714 0.037293 0.432594 +0.120832 0.037293 0.432594 +0.159284 0.037293 0.432594 +0.194868 0.037293 0.432594 +0.227530 0.037293 0.432594 +0.257434 0.037293 0.432594 +0.285092 0.037293 0.432594 +0.310738 0.037293 0.432594 +0.334585 0.037293 0.432594 +0.356818 0.037293 0.432594 +0.377602 0.037293 0.432594 +0.397079 0.037293 0.432594 +0.415373 0.037293 0.432594 +0.432594 0.037293 0.432594 +0.448839 0.037293 0.432594 +0.464192 0.037293 0.432594 +0.478729 0.037293 0.432594 +0.492515 0.037293 0.432594 +0.505612 0.037293 0.432594 +0.518072 0.037293 0.432594 +0.529943 0.037293 0.432594 +0.541266 0.037293 0.432594 +0.552083 0.037293 0.432594 +0.562427 0.037293 0.432594 +0.572331 0.037293 0.432594 +0.581823 0.037293 0.432594 +0.590929 0.037293 0.432594 +0.599674 0.037293 0.432594 +0.608079 0.037293 0.432594 +0.616166 0.037293 0.432594 +0.000001 0.079714 0.432594 +0.037293 0.079714 0.432594 +0.079714 0.079714 0.432594 +0.120832 0.079714 0.432594 +0.159284 0.079714 0.432594 +0.194868 0.079714 0.432594 +0.227530 0.079714 0.432594 +0.257434 0.079714 0.432594 +0.285092 0.079714 0.432594 +0.310738 0.079714 0.432594 +0.334585 0.079714 0.432594 +0.356818 0.079714 0.432594 +0.377602 0.079714 0.432594 +0.397079 0.079714 0.432594 +0.415373 0.079714 0.432594 +0.432594 0.079714 0.432594 +0.448839 0.079714 0.432594 +0.464192 0.079714 0.432594 +0.478729 0.079714 0.432594 +0.492515 0.079714 0.432594 +0.505612 0.079714 0.432594 +0.518072 0.079714 0.432594 +0.529943 0.079714 0.432594 +0.541266 0.079714 0.432594 +0.552083 0.079714 0.432594 +0.562427 0.079714 0.432594 +0.572331 0.079714 0.432594 +0.581823 0.079714 0.432594 +0.590929 0.079714 0.432594 +0.599674 0.079714 0.432594 +0.608079 0.079714 0.432594 +0.616166 0.079714 0.432594 +0.000001 0.120832 0.432594 +0.037293 0.120832 0.432594 +0.079714 0.120832 0.432594 +0.120832 0.120832 0.432594 +0.159284 0.120832 0.432594 +0.194868 0.120832 0.432594 +0.227530 0.120832 0.432594 +0.257434 0.120832 0.432594 +0.285092 0.120832 0.432594 +0.310738 0.120832 0.432594 +0.334585 0.120832 0.432594 +0.356818 0.120832 0.432594 +0.377602 0.120832 0.432594 +0.397079 0.120832 0.432594 +0.415373 0.120832 0.432594 +0.432594 0.120832 0.432594 +0.448839 0.120832 0.432594 +0.464192 0.120832 0.432594 +0.478729 0.120832 0.432594 +0.492515 0.120832 0.432594 +0.505612 0.120832 0.432594 +0.518072 0.120832 0.432594 +0.529943 0.120832 0.432594 +0.541266 0.120832 0.432594 +0.552083 0.120832 0.432594 +0.562427 0.120832 0.432594 +0.572331 0.120832 0.432594 +0.581823 0.120832 0.432594 +0.590929 0.120832 0.432594 +0.599674 0.120832 0.432594 +0.608079 0.120832 0.432594 +0.616166 0.120832 0.432594 +0.000001 0.159284 0.432594 +0.037293 0.159284 0.432594 +0.079714 0.159284 0.432594 +0.120832 0.159284 0.432594 +0.159284 0.159284 0.432594 +0.194868 0.159284 0.432594 +0.227530 0.159284 0.432594 +0.257434 0.159284 0.432594 +0.285092 0.159284 0.432594 +0.310738 0.159284 0.432594 +0.334585 0.159284 0.432594 +0.356818 0.159284 0.432594 +0.377602 0.159284 0.432594 +0.397079 0.159284 0.432594 +0.415373 0.159284 0.432594 +0.432594 0.159284 0.432594 +0.448839 0.159284 0.432594 +0.464192 0.159284 0.432594 +0.478729 0.159284 0.432594 +0.492515 0.159284 0.432594 +0.505612 0.159284 0.432594 +0.518072 0.159284 0.432594 +0.529943 0.159284 0.432594 +0.541266 0.159284 0.432594 +0.552083 0.159284 0.432594 +0.562427 0.159284 0.432594 +0.572331 0.159284 0.432594 +0.581823 0.159284 0.432594 +0.590929 0.159284 0.432594 +0.599674 0.159284 0.432594 +0.608079 0.159284 0.432594 +0.616166 0.159284 0.432594 +0.000001 0.194868 0.432594 +0.037293 0.194868 0.432594 +0.079714 0.194868 0.432594 +0.120832 0.194868 0.432594 +0.159284 0.194868 0.432594 +0.194868 0.194868 0.432594 +0.227530 0.194868 0.432594 +0.257434 0.194868 0.432594 +0.285092 0.194868 0.432594 +0.310738 0.194868 0.432594 +0.334585 0.194868 0.432594 +0.356818 0.194868 0.432594 +0.377602 0.194868 0.432594 +0.397079 0.194868 0.432594 +0.415373 0.194868 0.432594 +0.432594 0.194868 0.432594 +0.448839 0.194868 0.432594 +0.464192 0.194868 0.432594 +0.478729 0.194868 0.432594 +0.492515 0.194868 0.432594 +0.505612 0.194868 0.432594 +0.518072 0.194868 0.432594 +0.529943 0.194868 0.432594 +0.541266 0.194868 0.432594 +0.552083 0.194868 0.432594 +0.562427 0.194868 0.432594 +0.572331 0.194868 0.432594 +0.581823 0.194868 0.432594 +0.590929 0.194868 0.432594 +0.599674 0.194868 0.432594 +0.608079 0.194868 0.432594 +0.616166 0.194868 0.432594 +0.000001 0.227530 0.432594 +0.037293 0.227530 0.432594 +0.079714 0.227530 0.432594 +0.120832 0.227530 0.432594 +0.159284 0.227530 0.432594 +0.194868 0.227530 0.432594 +0.227530 0.227530 0.432594 +0.257434 0.227530 0.432594 +0.285092 0.227530 0.432594 +0.310738 0.227530 0.432594 +0.334585 0.227530 0.432594 +0.356818 0.227530 0.432594 +0.377602 0.227530 0.432594 +0.397079 0.227530 0.432594 +0.415373 0.227530 0.432594 +0.432594 0.227530 0.432594 +0.448839 0.227530 0.432594 +0.464192 0.227530 0.432594 +0.478729 0.227530 0.432594 +0.492515 0.227530 0.432594 +0.505612 0.227530 0.432594 +0.518072 0.227530 0.432594 +0.529943 0.227530 0.432594 +0.541266 0.227530 0.432594 +0.552083 0.227530 0.432594 +0.562427 0.227530 0.432594 +0.572331 0.227530 0.432594 +0.581823 0.227530 0.432594 +0.590929 0.227530 0.432594 +0.599674 0.227530 0.432594 +0.608079 0.227530 0.432594 +0.616166 0.227530 0.432594 +0.000001 0.257434 0.432594 +0.037293 0.257434 0.432594 +0.079714 0.257434 0.432594 +0.120832 0.257434 0.432594 +0.159284 0.257434 0.432594 +0.194868 0.257434 0.432594 +0.227530 0.257434 0.432594 +0.257434 0.257434 0.432594 +0.285092 0.257434 0.432594 +0.310738 0.257434 0.432594 +0.334585 0.257434 0.432594 +0.356818 0.257434 0.432594 +0.377602 0.257434 0.432594 +0.397079 0.257434 0.432594 +0.415373 0.257434 0.432594 +0.432594 0.257434 0.432594 +0.448839 0.257434 0.432594 +0.464192 0.257434 0.432594 +0.478729 0.257434 0.432594 +0.492515 0.257434 0.432594 +0.505612 0.257434 0.432594 +0.518072 0.257434 0.432594 +0.529943 0.257434 0.432594 +0.541266 0.257434 0.432594 +0.552083 0.257434 0.432594 +0.562427 0.257434 0.432594 +0.572331 0.257434 0.432594 +0.581823 0.257434 0.432594 +0.590929 0.257434 0.432594 +0.599674 0.257434 0.432594 +0.608079 0.257434 0.432594 +0.616166 0.257434 0.432594 +0.000001 0.285092 0.432594 +0.037293 0.285092 0.432594 +0.079714 0.285092 0.432594 +0.120832 0.285092 0.432594 +0.159284 0.285092 0.432594 +0.194868 0.285092 0.432594 +0.227530 0.285092 0.432594 +0.257434 0.285092 0.432594 +0.285092 0.285092 0.432594 +0.310738 0.285092 0.432594 +0.334585 0.285092 0.432594 +0.356818 0.285092 0.432594 +0.377602 0.285092 0.432594 +0.397079 0.285092 0.432594 +0.415373 0.285092 0.432594 +0.432594 0.285092 0.432594 +0.448839 0.285092 0.432594 +0.464192 0.285092 0.432594 +0.478729 0.285092 0.432594 +0.492515 0.285092 0.432594 +0.505612 0.285092 0.432594 +0.518072 0.285092 0.432594 +0.529943 0.285092 0.432594 +0.541266 0.285092 0.432594 +0.552083 0.285092 0.432594 +0.562427 0.285092 0.432594 +0.572331 0.285092 0.432594 +0.581823 0.285092 0.432594 +0.590929 0.285092 0.432594 +0.599674 0.285092 0.432594 +0.608079 0.285092 0.432594 +0.616166 0.285092 0.432594 +0.000001 0.310738 0.432594 +0.037293 0.310738 0.432594 +0.079714 0.310738 0.432594 +0.120832 0.310738 0.432594 +0.159284 0.310738 0.432594 +0.194868 0.310738 0.432594 +0.227530 0.310738 0.432594 +0.257434 0.310738 0.432594 +0.285092 0.310738 0.432594 +0.310738 0.310738 0.432594 +0.334585 0.310738 0.432594 +0.356818 0.310738 0.432594 +0.377602 0.310738 0.432594 +0.397079 0.310738 0.432594 +0.415373 0.310738 0.432594 +0.432594 0.310738 0.432594 +0.448839 0.310738 0.432594 +0.464192 0.310738 0.432594 +0.478729 0.310738 0.432594 +0.492515 0.310738 0.432594 +0.505612 0.310738 0.432594 +0.518072 0.310738 0.432594 +0.529943 0.310738 0.432594 +0.541266 0.310738 0.432594 +0.552083 0.310738 0.432594 +0.562427 0.310738 0.432594 +0.572331 0.310738 0.432594 +0.581823 0.310738 0.432594 +0.590929 0.310738 0.432594 +0.599674 0.310738 0.432594 +0.608079 0.310738 0.432594 +0.616166 0.310738 0.432594 +0.000001 0.334585 0.432594 +0.037293 0.334585 0.432594 +0.079714 0.334585 0.432594 +0.120832 0.334585 0.432594 +0.159284 0.334585 0.432594 +0.194868 0.334585 0.432594 +0.227530 0.334585 0.432594 +0.257434 0.334585 0.432594 +0.285092 0.334585 0.432594 +0.310738 0.334585 0.432594 +0.334585 0.334585 0.432594 +0.356818 0.334585 0.432594 +0.377602 0.334585 0.432594 +0.397079 0.334585 0.432594 +0.415373 0.334585 0.432594 +0.432594 0.334585 0.432594 +0.448839 0.334585 0.432594 +0.464192 0.334585 0.432594 +0.478729 0.334585 0.432594 +0.492515 0.334585 0.432594 +0.505612 0.334585 0.432594 +0.518072 0.334585 0.432594 +0.529943 0.334585 0.432594 +0.541266 0.334585 0.432594 +0.552083 0.334585 0.432594 +0.562427 0.334585 0.432594 +0.572331 0.334585 0.432594 +0.581823 0.334585 0.432594 +0.590929 0.334585 0.432594 +0.599674 0.334585 0.432594 +0.608079 0.334585 0.432594 +0.616166 0.334585 0.432594 +0.000001 0.356818 0.432594 +0.037293 0.356818 0.432594 +0.079714 0.356818 0.432594 +0.120832 0.356818 0.432594 +0.159284 0.356818 0.432594 +0.194868 0.356818 0.432594 +0.227530 0.356818 0.432594 +0.257434 0.356818 0.432594 +0.285092 0.356818 0.432594 +0.310738 0.356818 0.432594 +0.334585 0.356818 0.432594 +0.356818 0.356818 0.432594 +0.377602 0.356818 0.432594 +0.397079 0.356818 0.432594 +0.415373 0.356818 0.432594 +0.432594 0.356818 0.432594 +0.448839 0.356818 0.432594 +0.464192 0.356818 0.432594 +0.478729 0.356818 0.432594 +0.492515 0.356818 0.432594 +0.505612 0.356818 0.432594 +0.518072 0.356818 0.432594 +0.529943 0.356818 0.432594 +0.541266 0.356818 0.432594 +0.552083 0.356818 0.432594 +0.562427 0.356818 0.432594 +0.572331 0.356818 0.432594 +0.581823 0.356818 0.432594 +0.590929 0.356818 0.432594 +0.599674 0.356818 0.432594 +0.608079 0.356818 0.432594 +0.616166 0.356818 0.432594 +0.000001 0.377602 0.432594 +0.037293 0.377602 0.432594 +0.079714 0.377602 0.432594 +0.120832 0.377602 0.432594 +0.159284 0.377602 0.432594 +0.194868 0.377602 0.432594 +0.227530 0.377602 0.432594 +0.257434 0.377602 0.432594 +0.285092 0.377602 0.432594 +0.310738 0.377602 0.432594 +0.334585 0.377602 0.432594 +0.356818 0.377602 0.432594 +0.377602 0.377602 0.432594 +0.397079 0.377602 0.432594 +0.415373 0.377602 0.432594 +0.432594 0.377602 0.432594 +0.448839 0.377602 0.432594 +0.464192 0.377602 0.432594 +0.478729 0.377602 0.432594 +0.492515 0.377602 0.432594 +0.505612 0.377602 0.432594 +0.518072 0.377602 0.432594 +0.529943 0.377602 0.432594 +0.541266 0.377602 0.432594 +0.552083 0.377602 0.432594 +0.562427 0.377602 0.432594 +0.572331 0.377602 0.432594 +0.581823 0.377602 0.432594 +0.590929 0.377602 0.432594 +0.599674 0.377602 0.432594 +0.608079 0.377602 0.432594 +0.616166 0.377602 0.432594 +0.000001 0.397079 0.432594 +0.037293 0.397079 0.432594 +0.079714 0.397079 0.432594 +0.120832 0.397079 0.432594 +0.159284 0.397079 0.432594 +0.194868 0.397079 0.432594 +0.227530 0.397079 0.432594 +0.257434 0.397079 0.432594 +0.285092 0.397079 0.432594 +0.310738 0.397079 0.432594 +0.334585 0.397079 0.432594 +0.356818 0.397079 0.432594 +0.377602 0.397079 0.432594 +0.397079 0.397079 0.432594 +0.415373 0.397079 0.432594 +0.432594 0.397079 0.432594 +0.448839 0.397079 0.432594 +0.464192 0.397079 0.432594 +0.478729 0.397079 0.432594 +0.492515 0.397079 0.432594 +0.505612 0.397079 0.432594 +0.518072 0.397079 0.432594 +0.529943 0.397079 0.432594 +0.541266 0.397079 0.432594 +0.552083 0.397079 0.432594 +0.562427 0.397079 0.432594 +0.572331 0.397079 0.432594 +0.581823 0.397079 0.432594 +0.590929 0.397079 0.432594 +0.599674 0.397079 0.432594 +0.608079 0.397079 0.432594 +0.616166 0.397079 0.432594 +0.000001 0.415373 0.432594 +0.037293 0.415373 0.432594 +0.079714 0.415373 0.432594 +0.120832 0.415373 0.432594 +0.159284 0.415373 0.432594 +0.194868 0.415373 0.432594 +0.227530 0.415373 0.432594 +0.257434 0.415373 0.432594 +0.285092 0.415373 0.432594 +0.310738 0.415373 0.432594 +0.334585 0.415373 0.432594 +0.356818 0.415373 0.432594 +0.377602 0.415373 0.432594 +0.397079 0.415373 0.432594 +0.415373 0.415373 0.432594 +0.432594 0.415373 0.432594 +0.448839 0.415373 0.432594 +0.464192 0.415373 0.432594 +0.478729 0.415373 0.432594 +0.492515 0.415373 0.432594 +0.505612 0.415373 0.432594 +0.518072 0.415373 0.432594 +0.529943 0.415373 0.432594 +0.541266 0.415373 0.432594 +0.552083 0.415373 0.432594 +0.562427 0.415373 0.432594 +0.572331 0.415373 0.432594 +0.581823 0.415373 0.432594 +0.590929 0.415373 0.432594 +0.599674 0.415373 0.432594 +0.608079 0.415373 0.432594 +0.616166 0.415373 0.432594 +0.000001 0.432594 0.432594 +0.037293 0.432594 0.432594 +0.079714 0.432594 0.432594 +0.120832 0.432594 0.432594 +0.159284 0.432594 0.432594 +0.194868 0.432594 0.432594 +0.227530 0.432594 0.432594 +0.257434 0.432594 0.432594 +0.285092 0.432594 0.432594 +0.310738 0.432594 0.432594 +0.334585 0.432594 0.432594 +0.356818 0.432594 0.432594 +0.377602 0.432594 0.432594 +0.397079 0.432594 0.432594 +0.415373 0.432594 0.432594 +0.432594 0.432594 0.432594 +0.448839 0.432594 0.432594 +0.464192 0.432594 0.432594 +0.478729 0.432594 0.432594 +0.492515 0.432594 0.432594 +0.505612 0.432594 0.432594 +0.518072 0.432594 0.432594 +0.529943 0.432594 0.432594 +0.541266 0.432594 0.432594 +0.552083 0.432594 0.432594 +0.562427 0.432594 0.432594 +0.572331 0.432594 0.432594 +0.581823 0.432594 0.432594 +0.590929 0.432594 0.432594 +0.599674 0.432594 0.432594 +0.608079 0.432594 0.432594 +0.616166 0.432594 0.432594 +0.000001 0.448839 0.432594 +0.037293 0.448839 0.432594 +0.079714 0.448839 0.432594 +0.120832 0.448839 0.432594 +0.159284 0.448839 0.432594 +0.194868 0.448839 0.432594 +0.227530 0.448839 0.432594 +0.257434 0.448839 0.432594 +0.285092 0.448839 0.432594 +0.310738 0.448839 0.432594 +0.334585 0.448839 0.432594 +0.356818 0.448839 0.432594 +0.377602 0.448839 0.432594 +0.397079 0.448839 0.432594 +0.415373 0.448839 0.432594 +0.432594 0.448839 0.432594 +0.448839 0.448839 0.432594 +0.464192 0.448839 0.432594 +0.478729 0.448839 0.432594 +0.492515 0.448839 0.432594 +0.505612 0.448839 0.432594 +0.518072 0.448839 0.432594 +0.529943 0.448839 0.432594 +0.541266 0.448839 0.432594 +0.552083 0.448839 0.432594 +0.562427 0.448839 0.432594 +0.572331 0.448839 0.432594 +0.581823 0.448839 0.432594 +0.590929 0.448839 0.432594 +0.599674 0.448839 0.432594 +0.608079 0.448839 0.432594 +0.616166 0.448839 0.432594 +0.000001 0.464192 0.432594 +0.037293 0.464192 0.432594 +0.079714 0.464192 0.432594 +0.120832 0.464192 0.432594 +0.159284 0.464192 0.432594 +0.194868 0.464192 0.432594 +0.227530 0.464192 0.432594 +0.257434 0.464192 0.432594 +0.285092 0.464192 0.432594 +0.310738 0.464192 0.432594 +0.334585 0.464192 0.432594 +0.356818 0.464192 0.432594 +0.377602 0.464192 0.432594 +0.397079 0.464192 0.432594 +0.415373 0.464192 0.432594 +0.432594 0.464192 0.432594 +0.448839 0.464192 0.432594 +0.464192 0.464192 0.432594 +0.478729 0.464192 0.432594 +0.492515 0.464192 0.432594 +0.505612 0.464192 0.432594 +0.518072 0.464192 0.432594 +0.529943 0.464192 0.432594 +0.541266 0.464192 0.432594 +0.552083 0.464192 0.432594 +0.562427 0.464192 0.432594 +0.572331 0.464192 0.432594 +0.581823 0.464192 0.432594 +0.590929 0.464192 0.432594 +0.599674 0.464192 0.432594 +0.608079 0.464192 0.432594 +0.616166 0.464192 0.432594 +0.000001 0.478729 0.432594 +0.037293 0.478729 0.432594 +0.079714 0.478729 0.432594 +0.120832 0.478729 0.432594 +0.159284 0.478729 0.432594 +0.194868 0.478729 0.432594 +0.227530 0.478729 0.432594 +0.257434 0.478729 0.432594 +0.285092 0.478729 0.432594 +0.310738 0.478729 0.432594 +0.334585 0.478729 0.432594 +0.356818 0.478729 0.432594 +0.377602 0.478729 0.432594 +0.397079 0.478729 0.432594 +0.415373 0.478729 0.432594 +0.432594 0.478729 0.432594 +0.448839 0.478729 0.432594 +0.464192 0.478729 0.432594 +0.478729 0.478729 0.432594 +0.492515 0.478729 0.432594 +0.505612 0.478729 0.432594 +0.518072 0.478729 0.432594 +0.529943 0.478729 0.432594 +0.541266 0.478729 0.432594 +0.552083 0.478729 0.432594 +0.562427 0.478729 0.432594 +0.572331 0.478729 0.432594 +0.581823 0.478729 0.432594 +0.590929 0.478729 0.432594 +0.599674 0.478729 0.432594 +0.608079 0.478729 0.432594 +0.616166 0.478729 0.432594 +0.000001 0.492515 0.432594 +0.037293 0.492515 0.432594 +0.079714 0.492515 0.432594 +0.120832 0.492515 0.432594 +0.159284 0.492515 0.432594 +0.194868 0.492515 0.432594 +0.227530 0.492515 0.432594 +0.257434 0.492515 0.432594 +0.285092 0.492515 0.432594 +0.310738 0.492515 0.432594 +0.334585 0.492515 0.432594 +0.356818 0.492515 0.432594 +0.377602 0.492515 0.432594 +0.397079 0.492515 0.432594 +0.415373 0.492515 0.432594 +0.432594 0.492515 0.432594 +0.448839 0.492515 0.432594 +0.464192 0.492515 0.432594 +0.478729 0.492515 0.432594 +0.492515 0.492515 0.432594 +0.505612 0.492515 0.432594 +0.518072 0.492515 0.432594 +0.529943 0.492515 0.432594 +0.541266 0.492515 0.432594 +0.552083 0.492515 0.432594 +0.562427 0.492515 0.432594 +0.572331 0.492515 0.432594 +0.581823 0.492515 0.432594 +0.590929 0.492515 0.432594 +0.599674 0.492515 0.432594 +0.608079 0.492515 0.432594 +0.616166 0.492515 0.432594 +0.000001 0.505612 0.432594 +0.037293 0.505612 0.432594 +0.079714 0.505612 0.432594 +0.120832 0.505612 0.432594 +0.159284 0.505612 0.432594 +0.194868 0.505612 0.432594 +0.227530 0.505612 0.432594 +0.257434 0.505612 0.432594 +0.285092 0.505612 0.432594 +0.310738 0.505612 0.432594 +0.334585 0.505612 0.432594 +0.356818 0.505612 0.432594 +0.377602 0.505612 0.432594 +0.397079 0.505612 0.432594 +0.415373 0.505612 0.432594 +0.432594 0.505612 0.432594 +0.448839 0.505612 0.432594 +0.464192 0.505612 0.432594 +0.478729 0.505612 0.432594 +0.492515 0.505612 0.432594 +0.505612 0.505612 0.432594 +0.518072 0.505612 0.432594 +0.529943 0.505612 0.432594 +0.541266 0.505612 0.432594 +0.552083 0.505612 0.432594 +0.562427 0.505612 0.432594 +0.572331 0.505612 0.432594 +0.581823 0.505612 0.432594 +0.590929 0.505612 0.432594 +0.599674 0.505612 0.432594 +0.608079 0.505612 0.432594 +0.616166 0.505612 0.432594 +0.000001 0.518072 0.432594 +0.037293 0.518072 0.432594 +0.079714 0.518072 0.432594 +0.120832 0.518072 0.432594 +0.159284 0.518072 0.432594 +0.194868 0.518072 0.432594 +0.227530 0.518072 0.432594 +0.257434 0.518072 0.432594 +0.285092 0.518072 0.432594 +0.310738 0.518072 0.432594 +0.334585 0.518072 0.432594 +0.356818 0.518072 0.432594 +0.377602 0.518072 0.432594 +0.397079 0.518072 0.432594 +0.415373 0.518072 0.432594 +0.432594 0.518072 0.432594 +0.448839 0.518072 0.432594 +0.464192 0.518072 0.432594 +0.478729 0.518072 0.432594 +0.492515 0.518072 0.432594 +0.505612 0.518072 0.432594 +0.518072 0.518072 0.432594 +0.529943 0.518072 0.432594 +0.541266 0.518072 0.432594 +0.552083 0.518072 0.432594 +0.562427 0.518072 0.432594 +0.572331 0.518072 0.432594 +0.581823 0.518072 0.432594 +0.590929 0.518072 0.432594 +0.599674 0.518072 0.432594 +0.608079 0.518072 0.432594 +0.616166 0.518072 0.432594 +0.000001 0.529943 0.432594 +0.037293 0.529943 0.432594 +0.079714 0.529943 0.432594 +0.120832 0.529943 0.432594 +0.159284 0.529943 0.432594 +0.194868 0.529943 0.432594 +0.227530 0.529943 0.432594 +0.257434 0.529943 0.432594 +0.285092 0.529943 0.432594 +0.310738 0.529943 0.432594 +0.334585 0.529943 0.432594 +0.356818 0.529943 0.432594 +0.377602 0.529943 0.432594 +0.397079 0.529943 0.432594 +0.415373 0.529943 0.432594 +0.432594 0.529943 0.432594 +0.448839 0.529943 0.432594 +0.464192 0.529943 0.432594 +0.478729 0.529943 0.432594 +0.492515 0.529943 0.432594 +0.505612 0.529943 0.432594 +0.518072 0.529943 0.432594 +0.529943 0.529943 0.432594 +0.541266 0.529943 0.432594 +0.552083 0.529943 0.432594 +0.562427 0.529943 0.432594 +0.572331 0.529943 0.432594 +0.581823 0.529943 0.432594 +0.590929 0.529943 0.432594 +0.599674 0.529943 0.432594 +0.608079 0.529943 0.432594 +0.616166 0.529943 0.432594 +0.000001 0.541266 0.432594 +0.037293 0.541266 0.432594 +0.079714 0.541266 0.432594 +0.120832 0.541266 0.432594 +0.159284 0.541266 0.432594 +0.194868 0.541266 0.432594 +0.227530 0.541266 0.432594 +0.257434 0.541266 0.432594 +0.285092 0.541266 0.432594 +0.310738 0.541266 0.432594 +0.334585 0.541266 0.432594 +0.356818 0.541266 0.432594 +0.377602 0.541266 0.432594 +0.397079 0.541266 0.432594 +0.415373 0.541266 0.432594 +0.432594 0.541266 0.432594 +0.448839 0.541266 0.432594 +0.464192 0.541266 0.432594 +0.478729 0.541266 0.432594 +0.492515 0.541266 0.432594 +0.505612 0.541266 0.432594 +0.518072 0.541266 0.432594 +0.529943 0.541266 0.432594 +0.541266 0.541266 0.432594 +0.552083 0.541266 0.432594 +0.562427 0.541266 0.432594 +0.572331 0.541266 0.432594 +0.581823 0.541266 0.432594 +0.590929 0.541266 0.432594 +0.599674 0.541266 0.432594 +0.608079 0.541266 0.432594 +0.616166 0.541266 0.432594 +0.000001 0.552083 0.432594 +0.037293 0.552083 0.432594 +0.079714 0.552083 0.432594 +0.120832 0.552083 0.432594 +0.159284 0.552083 0.432594 +0.194868 0.552083 0.432594 +0.227530 0.552083 0.432594 +0.257434 0.552083 0.432594 +0.285092 0.552083 0.432594 +0.310738 0.552083 0.432594 +0.334585 0.552083 0.432594 +0.356818 0.552083 0.432594 +0.377602 0.552083 0.432594 +0.397079 0.552083 0.432594 +0.415373 0.552083 0.432594 +0.432594 0.552083 0.432594 +0.448839 0.552083 0.432594 +0.464192 0.552083 0.432594 +0.478729 0.552083 0.432594 +0.492515 0.552083 0.432594 +0.505612 0.552083 0.432594 +0.518072 0.552083 0.432594 +0.529943 0.552083 0.432594 +0.541266 0.552083 0.432594 +0.552083 0.552083 0.432594 +0.562427 0.552083 0.432594 +0.572331 0.552083 0.432594 +0.581823 0.552083 0.432594 +0.590929 0.552083 0.432594 +0.599674 0.552083 0.432594 +0.608079 0.552083 0.432594 +0.616166 0.552083 0.432594 +0.000001 0.562427 0.432594 +0.037293 0.562427 0.432594 +0.079714 0.562427 0.432594 +0.120832 0.562427 0.432594 +0.159284 0.562427 0.432594 +0.194868 0.562427 0.432594 +0.227530 0.562427 0.432594 +0.257434 0.562427 0.432594 +0.285092 0.562427 0.432594 +0.310738 0.562427 0.432594 +0.334585 0.562427 0.432594 +0.356818 0.562427 0.432594 +0.377602 0.562427 0.432594 +0.397079 0.562427 0.432594 +0.415373 0.562427 0.432594 +0.432594 0.562427 0.432594 +0.448839 0.562427 0.432594 +0.464192 0.562427 0.432594 +0.478729 0.562427 0.432594 +0.492515 0.562427 0.432594 +0.505612 0.562427 0.432594 +0.518072 0.562427 0.432594 +0.529943 0.562427 0.432594 +0.541266 0.562427 0.432594 +0.552083 0.562427 0.432594 +0.562427 0.562427 0.432594 +0.572331 0.562427 0.432594 +0.581823 0.562427 0.432594 +0.590929 0.562427 0.432594 +0.599674 0.562427 0.432594 +0.608079 0.562427 0.432594 +0.616166 0.562427 0.432594 +0.000001 0.572331 0.432594 +0.037293 0.572331 0.432594 +0.079714 0.572331 0.432594 +0.120832 0.572331 0.432594 +0.159284 0.572331 0.432594 +0.194868 0.572331 0.432594 +0.227530 0.572331 0.432594 +0.257434 0.572331 0.432594 +0.285092 0.572331 0.432594 +0.310738 0.572331 0.432594 +0.334585 0.572331 0.432594 +0.356818 0.572331 0.432594 +0.377602 0.572331 0.432594 +0.397079 0.572331 0.432594 +0.415373 0.572331 0.432594 +0.432594 0.572331 0.432594 +0.448839 0.572331 0.432594 +0.464192 0.572331 0.432594 +0.478729 0.572331 0.432594 +0.492515 0.572331 0.432594 +0.505612 0.572331 0.432594 +0.518072 0.572331 0.432594 +0.529943 0.572331 0.432594 +0.541266 0.572331 0.432594 +0.552083 0.572331 0.432594 +0.562427 0.572331 0.432594 +0.572331 0.572331 0.432594 +0.581823 0.572331 0.432594 +0.590929 0.572331 0.432594 +0.599674 0.572331 0.432594 +0.608079 0.572331 0.432594 +0.616166 0.572331 0.432594 +0.000001 0.581823 0.432594 +0.037293 0.581823 0.432594 +0.079714 0.581823 0.432594 +0.120832 0.581823 0.432594 +0.159284 0.581823 0.432594 +0.194868 0.581823 0.432594 +0.227530 0.581823 0.432594 +0.257434 0.581823 0.432594 +0.285092 0.581823 0.432594 +0.310738 0.581823 0.432594 +0.334585 0.581823 0.432594 +0.356818 0.581823 0.432594 +0.377602 0.581823 0.432594 +0.397079 0.581823 0.432594 +0.415373 0.581823 0.432594 +0.432594 0.581823 0.432594 +0.448839 0.581823 0.432594 +0.464192 0.581823 0.432594 +0.478729 0.581823 0.432594 +0.492515 0.581823 0.432594 +0.505612 0.581823 0.432594 +0.518072 0.581823 0.432594 +0.529943 0.581823 0.432594 +0.541266 0.581823 0.432594 +0.552083 0.581823 0.432594 +0.562427 0.581823 0.432594 +0.572331 0.581823 0.432594 +0.581823 0.581823 0.432594 +0.590929 0.581823 0.432594 +0.599674 0.581823 0.432594 +0.608079 0.581823 0.432594 +0.616166 0.581823 0.432594 +0.000001 0.590929 0.432594 +0.037293 0.590929 0.432594 +0.079714 0.590929 0.432594 +0.120832 0.590929 0.432594 +0.159284 0.590929 0.432594 +0.194868 0.590929 0.432594 +0.227530 0.590929 0.432594 +0.257434 0.590929 0.432594 +0.285092 0.590929 0.432594 +0.310738 0.590929 0.432594 +0.334585 0.590929 0.432594 +0.356818 0.590929 0.432594 +0.377602 0.590929 0.432594 +0.397079 0.590929 0.432594 +0.415373 0.590929 0.432594 +0.432594 0.590929 0.432594 +0.448839 0.590929 0.432594 +0.464192 0.590929 0.432594 +0.478729 0.590929 0.432594 +0.492515 0.590929 0.432594 +0.505612 0.590929 0.432594 +0.518072 0.590929 0.432594 +0.529943 0.590929 0.432594 +0.541266 0.590929 0.432594 +0.552083 0.590929 0.432594 +0.562427 0.590929 0.432594 +0.572331 0.590929 0.432594 +0.581823 0.590929 0.432594 +0.590929 0.590929 0.432594 +0.599674 0.590929 0.432594 +0.608079 0.590929 0.432594 +0.616166 0.590929 0.432594 +0.000001 0.599674 0.432594 +0.037293 0.599674 0.432594 +0.079714 0.599674 0.432594 +0.120832 0.599674 0.432594 +0.159284 0.599674 0.432594 +0.194868 0.599674 0.432594 +0.227530 0.599674 0.432594 +0.257434 0.599674 0.432594 +0.285092 0.599674 0.432594 +0.310738 0.599674 0.432594 +0.334585 0.599674 0.432594 +0.356818 0.599674 0.432594 +0.377602 0.599674 0.432594 +0.397079 0.599674 0.432594 +0.415373 0.599674 0.432594 +0.432594 0.599674 0.432594 +0.448839 0.599674 0.432594 +0.464192 0.599674 0.432594 +0.478729 0.599674 0.432594 +0.492515 0.599674 0.432594 +0.505612 0.599674 0.432594 +0.518072 0.599674 0.432594 +0.529943 0.599674 0.432594 +0.541266 0.599674 0.432594 +0.552083 0.599674 0.432594 +0.562427 0.599674 0.432594 +0.572331 0.599674 0.432594 +0.581823 0.599674 0.432594 +0.590929 0.599674 0.432594 +0.599674 0.599674 0.432594 +0.608079 0.599674 0.432594 +0.616166 0.599674 0.432594 +0.000001 0.608079 0.432594 +0.037293 0.608079 0.432594 +0.079714 0.608079 0.432594 +0.120832 0.608079 0.432594 +0.159284 0.608079 0.432594 +0.194868 0.608079 0.432594 +0.227530 0.608079 0.432594 +0.257434 0.608079 0.432594 +0.285092 0.608079 0.432594 +0.310738 0.608079 0.432594 +0.334585 0.608079 0.432594 +0.356818 0.608079 0.432594 +0.377602 0.608079 0.432594 +0.397079 0.608079 0.432594 +0.415373 0.608079 0.432594 +0.432594 0.608079 0.432594 +0.448839 0.608079 0.432594 +0.464192 0.608079 0.432594 +0.478729 0.608079 0.432594 +0.492515 0.608079 0.432594 +0.505612 0.608079 0.432594 +0.518072 0.608079 0.432594 +0.529943 0.608079 0.432594 +0.541266 0.608079 0.432594 +0.552083 0.608079 0.432594 +0.562427 0.608079 0.432594 +0.572331 0.608079 0.432594 +0.581823 0.608079 0.432594 +0.590929 0.608079 0.432594 +0.599674 0.608079 0.432594 +0.608079 0.608079 0.432594 +0.616166 0.608079 0.432594 +0.000001 0.616166 0.432594 +0.037293 0.616166 0.432594 +0.079714 0.616166 0.432594 +0.120832 0.616166 0.432594 +0.159284 0.616166 0.432594 +0.194868 0.616166 0.432594 +0.227530 0.616166 0.432594 +0.257434 0.616166 0.432594 +0.285092 0.616166 0.432594 +0.310738 0.616166 0.432594 +0.334585 0.616166 0.432594 +0.356818 0.616166 0.432594 +0.377602 0.616166 0.432594 +0.397079 0.616166 0.432594 +0.415373 0.616166 0.432594 +0.432594 0.616166 0.432594 +0.448839 0.616166 0.432594 +0.464192 0.616166 0.432594 +0.478729 0.616166 0.432594 +0.492515 0.616166 0.432594 +0.505612 0.616166 0.432594 +0.518072 0.616166 0.432594 +0.529943 0.616166 0.432594 +0.541266 0.616166 0.432594 +0.552083 0.616166 0.432594 +0.562427 0.616166 0.432594 +0.572331 0.616166 0.432594 +0.581823 0.616166 0.432594 +0.590929 0.616166 0.432594 +0.599674 0.616166 0.432594 +0.608079 0.616166 0.432594 +0.616166 0.616166 0.432594 +0.000001 0.000001 0.448839 +0.037293 0.000001 0.448839 +0.079714 0.000001 0.448839 +0.120832 0.000001 0.448839 +0.159284 0.000001 0.448839 +0.194868 0.000001 0.448839 +0.227530 0.000001 0.448839 +0.257434 0.000001 0.448839 +0.285092 0.000001 0.448839 +0.310738 0.000001 0.448839 +0.334585 0.000001 0.448839 +0.356818 0.000001 0.448839 +0.377602 0.000001 0.448839 +0.397079 0.000001 0.448839 +0.415373 0.000001 0.448839 +0.432594 0.000001 0.448839 +0.448839 0.000001 0.448839 +0.464192 0.000001 0.448839 +0.478729 0.000001 0.448839 +0.492515 0.000001 0.448839 +0.505612 0.000001 0.448839 +0.518072 0.000001 0.448839 +0.529943 0.000001 0.448839 +0.541266 0.000001 0.448839 +0.552083 0.000001 0.448839 +0.562427 0.000001 0.448839 +0.572331 0.000001 0.448839 +0.581823 0.000001 0.448839 +0.590929 0.000001 0.448839 +0.599674 0.000001 0.448839 +0.608079 0.000001 0.448839 +0.616166 0.000001 0.448839 +0.000001 0.037293 0.448839 +0.037293 0.037293 0.448839 +0.079714 0.037293 0.448839 +0.120832 0.037293 0.448839 +0.159284 0.037293 0.448839 +0.194868 0.037293 0.448839 +0.227530 0.037293 0.448839 +0.257434 0.037293 0.448839 +0.285092 0.037293 0.448839 +0.310738 0.037293 0.448839 +0.334585 0.037293 0.448839 +0.356818 0.037293 0.448839 +0.377602 0.037293 0.448839 +0.397079 0.037293 0.448839 +0.415373 0.037293 0.448839 +0.432594 0.037293 0.448839 +0.448839 0.037293 0.448839 +0.464192 0.037293 0.448839 +0.478729 0.037293 0.448839 +0.492515 0.037293 0.448839 +0.505612 0.037293 0.448839 +0.518072 0.037293 0.448839 +0.529943 0.037293 0.448839 +0.541266 0.037293 0.448839 +0.552083 0.037293 0.448839 +0.562427 0.037293 0.448839 +0.572331 0.037293 0.448839 +0.581823 0.037293 0.448839 +0.590929 0.037293 0.448839 +0.599674 0.037293 0.448839 +0.608079 0.037293 0.448839 +0.616166 0.037293 0.448839 +0.000001 0.079714 0.448839 +0.037293 0.079714 0.448839 +0.079714 0.079714 0.448839 +0.120832 0.079714 0.448839 +0.159284 0.079714 0.448839 +0.194868 0.079714 0.448839 +0.227530 0.079714 0.448839 +0.257434 0.079714 0.448839 +0.285092 0.079714 0.448839 +0.310738 0.079714 0.448839 +0.334585 0.079714 0.448839 +0.356818 0.079714 0.448839 +0.377602 0.079714 0.448839 +0.397079 0.079714 0.448839 +0.415373 0.079714 0.448839 +0.432594 0.079714 0.448839 +0.448839 0.079714 0.448839 +0.464192 0.079714 0.448839 +0.478729 0.079714 0.448839 +0.492515 0.079714 0.448839 +0.505612 0.079714 0.448839 +0.518072 0.079714 0.448839 +0.529943 0.079714 0.448839 +0.541266 0.079714 0.448839 +0.552083 0.079714 0.448839 +0.562427 0.079714 0.448839 +0.572331 0.079714 0.448839 +0.581823 0.079714 0.448839 +0.590929 0.079714 0.448839 +0.599674 0.079714 0.448839 +0.608079 0.079714 0.448839 +0.616166 0.079714 0.448839 +0.000001 0.120832 0.448839 +0.037293 0.120832 0.448839 +0.079714 0.120832 0.448839 +0.120832 0.120832 0.448839 +0.159284 0.120832 0.448839 +0.194868 0.120832 0.448839 +0.227530 0.120832 0.448839 +0.257434 0.120832 0.448839 +0.285092 0.120832 0.448839 +0.310738 0.120832 0.448839 +0.334585 0.120832 0.448839 +0.356818 0.120832 0.448839 +0.377602 0.120832 0.448839 +0.397079 0.120832 0.448839 +0.415373 0.120832 0.448839 +0.432594 0.120832 0.448839 +0.448839 0.120832 0.448839 +0.464192 0.120832 0.448839 +0.478729 0.120832 0.448839 +0.492515 0.120832 0.448839 +0.505612 0.120832 0.448839 +0.518072 0.120832 0.448839 +0.529943 0.120832 0.448839 +0.541266 0.120832 0.448839 +0.552083 0.120832 0.448839 +0.562427 0.120832 0.448839 +0.572331 0.120832 0.448839 +0.581823 0.120832 0.448839 +0.590929 0.120832 0.448839 +0.599674 0.120832 0.448839 +0.608079 0.120832 0.448839 +0.616166 0.120832 0.448839 +0.000001 0.159284 0.448839 +0.037293 0.159284 0.448839 +0.079714 0.159284 0.448839 +0.120832 0.159284 0.448839 +0.159284 0.159284 0.448839 +0.194868 0.159284 0.448839 +0.227530 0.159284 0.448839 +0.257434 0.159284 0.448839 +0.285092 0.159284 0.448839 +0.310738 0.159284 0.448839 +0.334585 0.159284 0.448839 +0.356818 0.159284 0.448839 +0.377602 0.159284 0.448839 +0.397079 0.159284 0.448839 +0.415373 0.159284 0.448839 +0.432594 0.159284 0.448839 +0.448839 0.159284 0.448839 +0.464192 0.159284 0.448839 +0.478729 0.159284 0.448839 +0.492515 0.159284 0.448839 +0.505612 0.159284 0.448839 +0.518072 0.159284 0.448839 +0.529943 0.159284 0.448839 +0.541266 0.159284 0.448839 +0.552083 0.159284 0.448839 +0.562427 0.159284 0.448839 +0.572331 0.159284 0.448839 +0.581823 0.159284 0.448839 +0.590929 0.159284 0.448839 +0.599674 0.159284 0.448839 +0.608079 0.159284 0.448839 +0.616166 0.159284 0.448839 +0.000001 0.194868 0.448839 +0.037293 0.194868 0.448839 +0.079714 0.194868 0.448839 +0.120832 0.194868 0.448839 +0.159284 0.194868 0.448839 +0.194868 0.194868 0.448839 +0.227530 0.194868 0.448839 +0.257434 0.194868 0.448839 +0.285092 0.194868 0.448839 +0.310738 0.194868 0.448839 +0.334585 0.194868 0.448839 +0.356818 0.194868 0.448839 +0.377602 0.194868 0.448839 +0.397079 0.194868 0.448839 +0.415373 0.194868 0.448839 +0.432594 0.194868 0.448839 +0.448839 0.194868 0.448839 +0.464192 0.194868 0.448839 +0.478729 0.194868 0.448839 +0.492515 0.194868 0.448839 +0.505612 0.194868 0.448839 +0.518072 0.194868 0.448839 +0.529943 0.194868 0.448839 +0.541266 0.194868 0.448839 +0.552083 0.194868 0.448839 +0.562427 0.194868 0.448839 +0.572331 0.194868 0.448839 +0.581823 0.194868 0.448839 +0.590929 0.194868 0.448839 +0.599674 0.194868 0.448839 +0.608079 0.194868 0.448839 +0.616166 0.194868 0.448839 +0.000001 0.227530 0.448839 +0.037293 0.227530 0.448839 +0.079714 0.227530 0.448839 +0.120832 0.227530 0.448839 +0.159284 0.227530 0.448839 +0.194868 0.227530 0.448839 +0.227530 0.227530 0.448839 +0.257434 0.227530 0.448839 +0.285092 0.227530 0.448839 +0.310738 0.227530 0.448839 +0.334585 0.227530 0.448839 +0.356818 0.227530 0.448839 +0.377602 0.227530 0.448839 +0.397079 0.227530 0.448839 +0.415373 0.227530 0.448839 +0.432594 0.227530 0.448839 +0.448839 0.227530 0.448839 +0.464192 0.227530 0.448839 +0.478729 0.227530 0.448839 +0.492515 0.227530 0.448839 +0.505612 0.227530 0.448839 +0.518072 0.227530 0.448839 +0.529943 0.227530 0.448839 +0.541266 0.227530 0.448839 +0.552083 0.227530 0.448839 +0.562427 0.227530 0.448839 +0.572331 0.227530 0.448839 +0.581823 0.227530 0.448839 +0.590929 0.227530 0.448839 +0.599674 0.227530 0.448839 +0.608079 0.227530 0.448839 +0.616166 0.227530 0.448839 +0.000001 0.257434 0.448839 +0.037293 0.257434 0.448839 +0.079714 0.257434 0.448839 +0.120832 0.257434 0.448839 +0.159284 0.257434 0.448839 +0.194868 0.257434 0.448839 +0.227530 0.257434 0.448839 +0.257434 0.257434 0.448839 +0.285092 0.257434 0.448839 +0.310738 0.257434 0.448839 +0.334585 0.257434 0.448839 +0.356818 0.257434 0.448839 +0.377602 0.257434 0.448839 +0.397079 0.257434 0.448839 +0.415373 0.257434 0.448839 +0.432594 0.257434 0.448839 +0.448839 0.257434 0.448839 +0.464192 0.257434 0.448839 +0.478729 0.257434 0.448839 +0.492515 0.257434 0.448839 +0.505612 0.257434 0.448839 +0.518072 0.257434 0.448839 +0.529943 0.257434 0.448839 +0.541266 0.257434 0.448839 +0.552083 0.257434 0.448839 +0.562427 0.257434 0.448839 +0.572331 0.257434 0.448839 +0.581823 0.257434 0.448839 +0.590929 0.257434 0.448839 +0.599674 0.257434 0.448839 +0.608079 0.257434 0.448839 +0.616166 0.257434 0.448839 +0.000001 0.285092 0.448839 +0.037293 0.285092 0.448839 +0.079714 0.285092 0.448839 +0.120832 0.285092 0.448839 +0.159284 0.285092 0.448839 +0.194868 0.285092 0.448839 +0.227530 0.285092 0.448839 +0.257434 0.285092 0.448839 +0.285092 0.285092 0.448839 +0.310738 0.285092 0.448839 +0.334585 0.285092 0.448839 +0.356818 0.285092 0.448839 +0.377602 0.285092 0.448839 +0.397079 0.285092 0.448839 +0.415373 0.285092 0.448839 +0.432594 0.285092 0.448839 +0.448839 0.285092 0.448839 +0.464192 0.285092 0.448839 +0.478729 0.285092 0.448839 +0.492515 0.285092 0.448839 +0.505612 0.285092 0.448839 +0.518072 0.285092 0.448839 +0.529943 0.285092 0.448839 +0.541266 0.285092 0.448839 +0.552083 0.285092 0.448839 +0.562427 0.285092 0.448839 +0.572331 0.285092 0.448839 +0.581823 0.285092 0.448839 +0.590929 0.285092 0.448839 +0.599674 0.285092 0.448839 +0.608079 0.285092 0.448839 +0.616166 0.285092 0.448839 +0.000001 0.310738 0.448839 +0.037293 0.310738 0.448839 +0.079714 0.310738 0.448839 +0.120832 0.310738 0.448839 +0.159284 0.310738 0.448839 +0.194868 0.310738 0.448839 +0.227530 0.310738 0.448839 +0.257434 0.310738 0.448839 +0.285092 0.310738 0.448839 +0.310738 0.310738 0.448839 +0.334585 0.310738 0.448839 +0.356818 0.310738 0.448839 +0.377602 0.310738 0.448839 +0.397079 0.310738 0.448839 +0.415373 0.310738 0.448839 +0.432594 0.310738 0.448839 +0.448839 0.310738 0.448839 +0.464192 0.310738 0.448839 +0.478729 0.310738 0.448839 +0.492515 0.310738 0.448839 +0.505612 0.310738 0.448839 +0.518072 0.310738 0.448839 +0.529943 0.310738 0.448839 +0.541266 0.310738 0.448839 +0.552083 0.310738 0.448839 +0.562427 0.310738 0.448839 +0.572331 0.310738 0.448839 +0.581823 0.310738 0.448839 +0.590929 0.310738 0.448839 +0.599674 0.310738 0.448839 +0.608079 0.310738 0.448839 +0.616166 0.310738 0.448839 +0.000001 0.334585 0.448839 +0.037293 0.334585 0.448839 +0.079714 0.334585 0.448839 +0.120832 0.334585 0.448839 +0.159284 0.334585 0.448839 +0.194868 0.334585 0.448839 +0.227530 0.334585 0.448839 +0.257434 0.334585 0.448839 +0.285092 0.334585 0.448839 +0.310738 0.334585 0.448839 +0.334585 0.334585 0.448839 +0.356818 0.334585 0.448839 +0.377602 0.334585 0.448839 +0.397079 0.334585 0.448839 +0.415373 0.334585 0.448839 +0.432594 0.334585 0.448839 +0.448839 0.334585 0.448839 +0.464192 0.334585 0.448839 +0.478729 0.334585 0.448839 +0.492515 0.334585 0.448839 +0.505612 0.334585 0.448839 +0.518072 0.334585 0.448839 +0.529943 0.334585 0.448839 +0.541266 0.334585 0.448839 +0.552083 0.334585 0.448839 +0.562427 0.334585 0.448839 +0.572331 0.334585 0.448839 +0.581823 0.334585 0.448839 +0.590929 0.334585 0.448839 +0.599674 0.334585 0.448839 +0.608079 0.334585 0.448839 +0.616166 0.334585 0.448839 +0.000001 0.356818 0.448839 +0.037293 0.356818 0.448839 +0.079714 0.356818 0.448839 +0.120832 0.356818 0.448839 +0.159284 0.356818 0.448839 +0.194868 0.356818 0.448839 +0.227530 0.356818 0.448839 +0.257434 0.356818 0.448839 +0.285092 0.356818 0.448839 +0.310738 0.356818 0.448839 +0.334585 0.356818 0.448839 +0.356818 0.356818 0.448839 +0.377602 0.356818 0.448839 +0.397079 0.356818 0.448839 +0.415373 0.356818 0.448839 +0.432594 0.356818 0.448839 +0.448839 0.356818 0.448839 +0.464192 0.356818 0.448839 +0.478729 0.356818 0.448839 +0.492515 0.356818 0.448839 +0.505612 0.356818 0.448839 +0.518072 0.356818 0.448839 +0.529943 0.356818 0.448839 +0.541266 0.356818 0.448839 +0.552083 0.356818 0.448839 +0.562427 0.356818 0.448839 +0.572331 0.356818 0.448839 +0.581823 0.356818 0.448839 +0.590929 0.356818 0.448839 +0.599674 0.356818 0.448839 +0.608079 0.356818 0.448839 +0.616166 0.356818 0.448839 +0.000001 0.377602 0.448839 +0.037293 0.377602 0.448839 +0.079714 0.377602 0.448839 +0.120832 0.377602 0.448839 +0.159284 0.377602 0.448839 +0.194868 0.377602 0.448839 +0.227530 0.377602 0.448839 +0.257434 0.377602 0.448839 +0.285092 0.377602 0.448839 +0.310738 0.377602 0.448839 +0.334585 0.377602 0.448839 +0.356818 0.377602 0.448839 +0.377602 0.377602 0.448839 +0.397079 0.377602 0.448839 +0.415373 0.377602 0.448839 +0.432594 0.377602 0.448839 +0.448839 0.377602 0.448839 +0.464192 0.377602 0.448839 +0.478729 0.377602 0.448839 +0.492515 0.377602 0.448839 +0.505612 0.377602 0.448839 +0.518072 0.377602 0.448839 +0.529943 0.377602 0.448839 +0.541266 0.377602 0.448839 +0.552083 0.377602 0.448839 +0.562427 0.377602 0.448839 +0.572331 0.377602 0.448839 +0.581823 0.377602 0.448839 +0.590929 0.377602 0.448839 +0.599674 0.377602 0.448839 +0.608079 0.377602 0.448839 +0.616166 0.377602 0.448839 +0.000001 0.397079 0.448839 +0.037293 0.397079 0.448839 +0.079714 0.397079 0.448839 +0.120832 0.397079 0.448839 +0.159284 0.397079 0.448839 +0.194868 0.397079 0.448839 +0.227530 0.397079 0.448839 +0.257434 0.397079 0.448839 +0.285092 0.397079 0.448839 +0.310738 0.397079 0.448839 +0.334585 0.397079 0.448839 +0.356818 0.397079 0.448839 +0.377602 0.397079 0.448839 +0.397079 0.397079 0.448839 +0.415373 0.397079 0.448839 +0.432594 0.397079 0.448839 +0.448839 0.397079 0.448839 +0.464192 0.397079 0.448839 +0.478729 0.397079 0.448839 +0.492515 0.397079 0.448839 +0.505612 0.397079 0.448839 +0.518072 0.397079 0.448839 +0.529943 0.397079 0.448839 +0.541266 0.397079 0.448839 +0.552083 0.397079 0.448839 +0.562427 0.397079 0.448839 +0.572331 0.397079 0.448839 +0.581823 0.397079 0.448839 +0.590929 0.397079 0.448839 +0.599674 0.397079 0.448839 +0.608079 0.397079 0.448839 +0.616166 0.397079 0.448839 +0.000001 0.415373 0.448839 +0.037293 0.415373 0.448839 +0.079714 0.415373 0.448839 +0.120832 0.415373 0.448839 +0.159284 0.415373 0.448839 +0.194868 0.415373 0.448839 +0.227530 0.415373 0.448839 +0.257434 0.415373 0.448839 +0.285092 0.415373 0.448839 +0.310738 0.415373 0.448839 +0.334585 0.415373 0.448839 +0.356818 0.415373 0.448839 +0.377602 0.415373 0.448839 +0.397079 0.415373 0.448839 +0.415373 0.415373 0.448839 +0.432594 0.415373 0.448839 +0.448839 0.415373 0.448839 +0.464192 0.415373 0.448839 +0.478729 0.415373 0.448839 +0.492515 0.415373 0.448839 +0.505612 0.415373 0.448839 +0.518072 0.415373 0.448839 +0.529943 0.415373 0.448839 +0.541266 0.415373 0.448839 +0.552083 0.415373 0.448839 +0.562427 0.415373 0.448839 +0.572331 0.415373 0.448839 +0.581823 0.415373 0.448839 +0.590929 0.415373 0.448839 +0.599674 0.415373 0.448839 +0.608079 0.415373 0.448839 +0.616166 0.415373 0.448839 +0.000001 0.432594 0.448839 +0.037293 0.432594 0.448839 +0.079714 0.432594 0.448839 +0.120832 0.432594 0.448839 +0.159284 0.432594 0.448839 +0.194868 0.432594 0.448839 +0.227530 0.432594 0.448839 +0.257434 0.432594 0.448839 +0.285092 0.432594 0.448839 +0.310738 0.432594 0.448839 +0.334585 0.432594 0.448839 +0.356818 0.432594 0.448839 +0.377602 0.432594 0.448839 +0.397079 0.432594 0.448839 +0.415373 0.432594 0.448839 +0.432594 0.432594 0.448839 +0.448839 0.432594 0.448839 +0.464192 0.432594 0.448839 +0.478729 0.432594 0.448839 +0.492515 0.432594 0.448839 +0.505612 0.432594 0.448839 +0.518072 0.432594 0.448839 +0.529943 0.432594 0.448839 +0.541266 0.432594 0.448839 +0.552083 0.432594 0.448839 +0.562427 0.432594 0.448839 +0.572331 0.432594 0.448839 +0.581823 0.432594 0.448839 +0.590929 0.432594 0.448839 +0.599674 0.432594 0.448839 +0.608079 0.432594 0.448839 +0.616166 0.432594 0.448839 +0.000001 0.448839 0.448839 +0.037293 0.448839 0.448839 +0.079714 0.448839 0.448839 +0.120832 0.448839 0.448839 +0.159284 0.448839 0.448839 +0.194868 0.448839 0.448839 +0.227530 0.448839 0.448839 +0.257434 0.448839 0.448839 +0.285092 0.448839 0.448839 +0.310738 0.448839 0.448839 +0.334585 0.448839 0.448839 +0.356818 0.448839 0.448839 +0.377602 0.448839 0.448839 +0.397079 0.448839 0.448839 +0.415373 0.448839 0.448839 +0.432594 0.448839 0.448839 +0.448839 0.448839 0.448839 +0.464192 0.448839 0.448839 +0.478729 0.448839 0.448839 +0.492515 0.448839 0.448839 +0.505612 0.448839 0.448839 +0.518072 0.448839 0.448839 +0.529943 0.448839 0.448839 +0.541266 0.448839 0.448839 +0.552083 0.448839 0.448839 +0.562427 0.448839 0.448839 +0.572331 0.448839 0.448839 +0.581823 0.448839 0.448839 +0.590929 0.448839 0.448839 +0.599674 0.448839 0.448839 +0.608079 0.448839 0.448839 +0.616166 0.448839 0.448839 +0.000001 0.464192 0.448839 +0.037293 0.464192 0.448839 +0.079714 0.464192 0.448839 +0.120832 0.464192 0.448839 +0.159284 0.464192 0.448839 +0.194868 0.464192 0.448839 +0.227530 0.464192 0.448839 +0.257434 0.464192 0.448839 +0.285092 0.464192 0.448839 +0.310738 0.464192 0.448839 +0.334585 0.464192 0.448839 +0.356818 0.464192 0.448839 +0.377602 0.464192 0.448839 +0.397079 0.464192 0.448839 +0.415373 0.464192 0.448839 +0.432594 0.464192 0.448839 +0.448839 0.464192 0.448839 +0.464192 0.464192 0.448839 +0.478729 0.464192 0.448839 +0.492515 0.464192 0.448839 +0.505612 0.464192 0.448839 +0.518072 0.464192 0.448839 +0.529943 0.464192 0.448839 +0.541266 0.464192 0.448839 +0.552083 0.464192 0.448839 +0.562427 0.464192 0.448839 +0.572331 0.464192 0.448839 +0.581823 0.464192 0.448839 +0.590929 0.464192 0.448839 +0.599674 0.464192 0.448839 +0.608079 0.464192 0.448839 +0.616166 0.464192 0.448839 +0.000001 0.478729 0.448839 +0.037293 0.478729 0.448839 +0.079714 0.478729 0.448839 +0.120832 0.478729 0.448839 +0.159284 0.478729 0.448839 +0.194868 0.478729 0.448839 +0.227530 0.478729 0.448839 +0.257434 0.478729 0.448839 +0.285092 0.478729 0.448839 +0.310738 0.478729 0.448839 +0.334585 0.478729 0.448839 +0.356818 0.478729 0.448839 +0.377602 0.478729 0.448839 +0.397079 0.478729 0.448839 +0.415373 0.478729 0.448839 +0.432594 0.478729 0.448839 +0.448839 0.478729 0.448839 +0.464192 0.478729 0.448839 +0.478729 0.478729 0.448839 +0.492515 0.478729 0.448839 +0.505612 0.478729 0.448839 +0.518072 0.478729 0.448839 +0.529943 0.478729 0.448839 +0.541266 0.478729 0.448839 +0.552083 0.478729 0.448839 +0.562427 0.478729 0.448839 +0.572331 0.478729 0.448839 +0.581823 0.478729 0.448839 +0.590929 0.478729 0.448839 +0.599674 0.478729 0.448839 +0.608079 0.478729 0.448839 +0.616166 0.478729 0.448839 +0.000001 0.492515 0.448839 +0.037293 0.492515 0.448839 +0.079714 0.492515 0.448839 +0.120832 0.492515 0.448839 +0.159284 0.492515 0.448839 +0.194868 0.492515 0.448839 +0.227530 0.492515 0.448839 +0.257434 0.492515 0.448839 +0.285092 0.492515 0.448839 +0.310738 0.492515 0.448839 +0.334585 0.492515 0.448839 +0.356818 0.492515 0.448839 +0.377602 0.492515 0.448839 +0.397079 0.492515 0.448839 +0.415373 0.492515 0.448839 +0.432594 0.492515 0.448839 +0.448839 0.492515 0.448839 +0.464192 0.492515 0.448839 +0.478729 0.492515 0.448839 +0.492515 0.492515 0.448839 +0.505612 0.492515 0.448839 +0.518072 0.492515 0.448839 +0.529943 0.492515 0.448839 +0.541266 0.492515 0.448839 +0.552083 0.492515 0.448839 +0.562427 0.492515 0.448839 +0.572331 0.492515 0.448839 +0.581823 0.492515 0.448839 +0.590929 0.492515 0.448839 +0.599674 0.492515 0.448839 +0.608079 0.492515 0.448839 +0.616166 0.492515 0.448839 +0.000001 0.505612 0.448839 +0.037293 0.505612 0.448839 +0.079714 0.505612 0.448839 +0.120832 0.505612 0.448839 +0.159284 0.505612 0.448839 +0.194868 0.505612 0.448839 +0.227530 0.505612 0.448839 +0.257434 0.505612 0.448839 +0.285092 0.505612 0.448839 +0.310738 0.505612 0.448839 +0.334585 0.505612 0.448839 +0.356818 0.505612 0.448839 +0.377602 0.505612 0.448839 +0.397079 0.505612 0.448839 +0.415373 0.505612 0.448839 +0.432594 0.505612 0.448839 +0.448839 0.505612 0.448839 +0.464192 0.505612 0.448839 +0.478729 0.505612 0.448839 +0.492515 0.505612 0.448839 +0.505612 0.505612 0.448839 +0.518072 0.505612 0.448839 +0.529943 0.505612 0.448839 +0.541266 0.505612 0.448839 +0.552083 0.505612 0.448839 +0.562427 0.505612 0.448839 +0.572331 0.505612 0.448839 +0.581823 0.505612 0.448839 +0.590929 0.505612 0.448839 +0.599674 0.505612 0.448839 +0.608079 0.505612 0.448839 +0.616166 0.505612 0.448839 +0.000001 0.518072 0.448839 +0.037293 0.518072 0.448839 +0.079714 0.518072 0.448839 +0.120832 0.518072 0.448839 +0.159284 0.518072 0.448839 +0.194868 0.518072 0.448839 +0.227530 0.518072 0.448839 +0.257434 0.518072 0.448839 +0.285092 0.518072 0.448839 +0.310738 0.518072 0.448839 +0.334585 0.518072 0.448839 +0.356818 0.518072 0.448839 +0.377602 0.518072 0.448839 +0.397079 0.518072 0.448839 +0.415373 0.518072 0.448839 +0.432594 0.518072 0.448839 +0.448839 0.518072 0.448839 +0.464192 0.518072 0.448839 +0.478729 0.518072 0.448839 +0.492515 0.518072 0.448839 +0.505612 0.518072 0.448839 +0.518072 0.518072 0.448839 +0.529943 0.518072 0.448839 +0.541266 0.518072 0.448839 +0.552083 0.518072 0.448839 +0.562427 0.518072 0.448839 +0.572331 0.518072 0.448839 +0.581823 0.518072 0.448839 +0.590929 0.518072 0.448839 +0.599674 0.518072 0.448839 +0.608079 0.518072 0.448839 +0.616166 0.518072 0.448839 +0.000001 0.529943 0.448839 +0.037293 0.529943 0.448839 +0.079714 0.529943 0.448839 +0.120832 0.529943 0.448839 +0.159284 0.529943 0.448839 +0.194868 0.529943 0.448839 +0.227530 0.529943 0.448839 +0.257434 0.529943 0.448839 +0.285092 0.529943 0.448839 +0.310738 0.529943 0.448839 +0.334585 0.529943 0.448839 +0.356818 0.529943 0.448839 +0.377602 0.529943 0.448839 +0.397079 0.529943 0.448839 +0.415373 0.529943 0.448839 +0.432594 0.529943 0.448839 +0.448839 0.529943 0.448839 +0.464192 0.529943 0.448839 +0.478729 0.529943 0.448839 +0.492515 0.529943 0.448839 +0.505612 0.529943 0.448839 +0.518072 0.529943 0.448839 +0.529943 0.529943 0.448839 +0.541266 0.529943 0.448839 +0.552083 0.529943 0.448839 +0.562427 0.529943 0.448839 +0.572331 0.529943 0.448839 +0.581823 0.529943 0.448839 +0.590929 0.529943 0.448839 +0.599674 0.529943 0.448839 +0.608079 0.529943 0.448839 +0.616166 0.529943 0.448839 +0.000001 0.541266 0.448839 +0.037293 0.541266 0.448839 +0.079714 0.541266 0.448839 +0.120832 0.541266 0.448839 +0.159284 0.541266 0.448839 +0.194868 0.541266 0.448839 +0.227530 0.541266 0.448839 +0.257434 0.541266 0.448839 +0.285092 0.541266 0.448839 +0.310738 0.541266 0.448839 +0.334585 0.541266 0.448839 +0.356818 0.541266 0.448839 +0.377602 0.541266 0.448839 +0.397079 0.541266 0.448839 +0.415373 0.541266 0.448839 +0.432594 0.541266 0.448839 +0.448839 0.541266 0.448839 +0.464192 0.541266 0.448839 +0.478729 0.541266 0.448839 +0.492515 0.541266 0.448839 +0.505612 0.541266 0.448839 +0.518072 0.541266 0.448839 +0.529943 0.541266 0.448839 +0.541266 0.541266 0.448839 +0.552083 0.541266 0.448839 +0.562427 0.541266 0.448839 +0.572331 0.541266 0.448839 +0.581823 0.541266 0.448839 +0.590929 0.541266 0.448839 +0.599674 0.541266 0.448839 +0.608079 0.541266 0.448839 +0.616166 0.541266 0.448839 +0.000001 0.552083 0.448839 +0.037293 0.552083 0.448839 +0.079714 0.552083 0.448839 +0.120832 0.552083 0.448839 +0.159284 0.552083 0.448839 +0.194868 0.552083 0.448839 +0.227530 0.552083 0.448839 +0.257434 0.552083 0.448839 +0.285092 0.552083 0.448839 +0.310738 0.552083 0.448839 +0.334585 0.552083 0.448839 +0.356818 0.552083 0.448839 +0.377602 0.552083 0.448839 +0.397079 0.552083 0.448839 +0.415373 0.552083 0.448839 +0.432594 0.552083 0.448839 +0.448839 0.552083 0.448839 +0.464192 0.552083 0.448839 +0.478729 0.552083 0.448839 +0.492515 0.552083 0.448839 +0.505612 0.552083 0.448839 +0.518072 0.552083 0.448839 +0.529943 0.552083 0.448839 +0.541266 0.552083 0.448839 +0.552083 0.552083 0.448839 +0.562427 0.552083 0.448839 +0.572331 0.552083 0.448839 +0.581823 0.552083 0.448839 +0.590929 0.552083 0.448839 +0.599674 0.552083 0.448839 +0.608079 0.552083 0.448839 +0.616166 0.552083 0.448839 +0.000001 0.562427 0.448839 +0.037293 0.562427 0.448839 +0.079714 0.562427 0.448839 +0.120832 0.562427 0.448839 +0.159284 0.562427 0.448839 +0.194868 0.562427 0.448839 +0.227530 0.562427 0.448839 +0.257434 0.562427 0.448839 +0.285092 0.562427 0.448839 +0.310738 0.562427 0.448839 +0.334585 0.562427 0.448839 +0.356818 0.562427 0.448839 +0.377602 0.562427 0.448839 +0.397079 0.562427 0.448839 +0.415373 0.562427 0.448839 +0.432594 0.562427 0.448839 +0.448839 0.562427 0.448839 +0.464192 0.562427 0.448839 +0.478729 0.562427 0.448839 +0.492515 0.562427 0.448839 +0.505612 0.562427 0.448839 +0.518072 0.562427 0.448839 +0.529943 0.562427 0.448839 +0.541266 0.562427 0.448839 +0.552083 0.562427 0.448839 +0.562427 0.562427 0.448839 +0.572331 0.562427 0.448839 +0.581823 0.562427 0.448839 +0.590929 0.562427 0.448839 +0.599674 0.562427 0.448839 +0.608079 0.562427 0.448839 +0.616166 0.562427 0.448839 +0.000001 0.572331 0.448839 +0.037293 0.572331 0.448839 +0.079714 0.572331 0.448839 +0.120832 0.572331 0.448839 +0.159284 0.572331 0.448839 +0.194868 0.572331 0.448839 +0.227530 0.572331 0.448839 +0.257434 0.572331 0.448839 +0.285092 0.572331 0.448839 +0.310738 0.572331 0.448839 +0.334585 0.572331 0.448839 +0.356818 0.572331 0.448839 +0.377602 0.572331 0.448839 +0.397079 0.572331 0.448839 +0.415373 0.572331 0.448839 +0.432594 0.572331 0.448839 +0.448839 0.572331 0.448839 +0.464192 0.572331 0.448839 +0.478729 0.572331 0.448839 +0.492515 0.572331 0.448839 +0.505612 0.572331 0.448839 +0.518072 0.572331 0.448839 +0.529943 0.572331 0.448839 +0.541266 0.572331 0.448839 +0.552083 0.572331 0.448839 +0.562427 0.572331 0.448839 +0.572331 0.572331 0.448839 +0.581823 0.572331 0.448839 +0.590929 0.572331 0.448839 +0.599674 0.572331 0.448839 +0.608079 0.572331 0.448839 +0.616166 0.572331 0.448839 +0.000001 0.581823 0.448839 +0.037293 0.581823 0.448839 +0.079714 0.581823 0.448839 +0.120832 0.581823 0.448839 +0.159284 0.581823 0.448839 +0.194868 0.581823 0.448839 +0.227530 0.581823 0.448839 +0.257434 0.581823 0.448839 +0.285092 0.581823 0.448839 +0.310738 0.581823 0.448839 +0.334585 0.581823 0.448839 +0.356818 0.581823 0.448839 +0.377602 0.581823 0.448839 +0.397079 0.581823 0.448839 +0.415373 0.581823 0.448839 +0.432594 0.581823 0.448839 +0.448839 0.581823 0.448839 +0.464192 0.581823 0.448839 +0.478729 0.581823 0.448839 +0.492515 0.581823 0.448839 +0.505612 0.581823 0.448839 +0.518072 0.581823 0.448839 +0.529943 0.581823 0.448839 +0.541266 0.581823 0.448839 +0.552083 0.581823 0.448839 +0.562427 0.581823 0.448839 +0.572331 0.581823 0.448839 +0.581823 0.581823 0.448839 +0.590929 0.581823 0.448839 +0.599674 0.581823 0.448839 +0.608079 0.581823 0.448839 +0.616166 0.581823 0.448839 +0.000001 0.590929 0.448839 +0.037293 0.590929 0.448839 +0.079714 0.590929 0.448839 +0.120832 0.590929 0.448839 +0.159284 0.590929 0.448839 +0.194868 0.590929 0.448839 +0.227530 0.590929 0.448839 +0.257434 0.590929 0.448839 +0.285092 0.590929 0.448839 +0.310738 0.590929 0.448839 +0.334585 0.590929 0.448839 +0.356818 0.590929 0.448839 +0.377602 0.590929 0.448839 +0.397079 0.590929 0.448839 +0.415373 0.590929 0.448839 +0.432594 0.590929 0.448839 +0.448839 0.590929 0.448839 +0.464192 0.590929 0.448839 +0.478729 0.590929 0.448839 +0.492515 0.590929 0.448839 +0.505612 0.590929 0.448839 +0.518072 0.590929 0.448839 +0.529943 0.590929 0.448839 +0.541266 0.590929 0.448839 +0.552083 0.590929 0.448839 +0.562427 0.590929 0.448839 +0.572331 0.590929 0.448839 +0.581823 0.590929 0.448839 +0.590929 0.590929 0.448839 +0.599674 0.590929 0.448839 +0.608079 0.590929 0.448839 +0.616166 0.590929 0.448839 +0.000001 0.599674 0.448839 +0.037293 0.599674 0.448839 +0.079714 0.599674 0.448839 +0.120832 0.599674 0.448839 +0.159284 0.599674 0.448839 +0.194868 0.599674 0.448839 +0.227530 0.599674 0.448839 +0.257434 0.599674 0.448839 +0.285092 0.599674 0.448839 +0.310738 0.599674 0.448839 +0.334585 0.599674 0.448839 +0.356818 0.599674 0.448839 +0.377602 0.599674 0.448839 +0.397079 0.599674 0.448839 +0.415373 0.599674 0.448839 +0.432594 0.599674 0.448839 +0.448839 0.599674 0.448839 +0.464192 0.599674 0.448839 +0.478729 0.599674 0.448839 +0.492515 0.599674 0.448839 +0.505612 0.599674 0.448839 +0.518072 0.599674 0.448839 +0.529943 0.599674 0.448839 +0.541266 0.599674 0.448839 +0.552083 0.599674 0.448839 +0.562427 0.599674 0.448839 +0.572331 0.599674 0.448839 +0.581823 0.599674 0.448839 +0.590929 0.599674 0.448839 +0.599674 0.599674 0.448839 +0.608079 0.599674 0.448839 +0.616166 0.599674 0.448839 +0.000001 0.608079 0.448839 +0.037293 0.608079 0.448839 +0.079714 0.608079 0.448839 +0.120832 0.608079 0.448839 +0.159284 0.608079 0.448839 +0.194868 0.608079 0.448839 +0.227530 0.608079 0.448839 +0.257434 0.608079 0.448839 +0.285092 0.608079 0.448839 +0.310738 0.608079 0.448839 +0.334585 0.608079 0.448839 +0.356818 0.608079 0.448839 +0.377602 0.608079 0.448839 +0.397079 0.608079 0.448839 +0.415373 0.608079 0.448839 +0.432594 0.608079 0.448839 +0.448839 0.608079 0.448839 +0.464192 0.608079 0.448839 +0.478729 0.608079 0.448839 +0.492515 0.608079 0.448839 +0.505612 0.608079 0.448839 +0.518072 0.608079 0.448839 +0.529943 0.608079 0.448839 +0.541266 0.608079 0.448839 +0.552083 0.608079 0.448839 +0.562427 0.608079 0.448839 +0.572331 0.608079 0.448839 +0.581823 0.608079 0.448839 +0.590929 0.608079 0.448839 +0.599674 0.608079 0.448839 +0.608079 0.608079 0.448839 +0.616166 0.608079 0.448839 +0.000001 0.616166 0.448839 +0.037293 0.616166 0.448839 +0.079714 0.616166 0.448839 +0.120832 0.616166 0.448839 +0.159284 0.616166 0.448839 +0.194868 0.616166 0.448839 +0.227530 0.616166 0.448839 +0.257434 0.616166 0.448839 +0.285092 0.616166 0.448839 +0.310738 0.616166 0.448839 +0.334585 0.616166 0.448839 +0.356818 0.616166 0.448839 +0.377602 0.616166 0.448839 +0.397079 0.616166 0.448839 +0.415373 0.616166 0.448839 +0.432594 0.616166 0.448839 +0.448839 0.616166 0.448839 +0.464192 0.616166 0.448839 +0.478729 0.616166 0.448839 +0.492515 0.616166 0.448839 +0.505612 0.616166 0.448839 +0.518072 0.616166 0.448839 +0.529943 0.616166 0.448839 +0.541266 0.616166 0.448839 +0.552083 0.616166 0.448839 +0.562427 0.616166 0.448839 +0.572331 0.616166 0.448839 +0.581823 0.616166 0.448839 +0.590929 0.616166 0.448839 +0.599674 0.616166 0.448839 +0.608079 0.616166 0.448839 +0.616166 0.616166 0.448839 +0.000001 0.000001 0.464192 +0.037293 0.000001 0.464192 +0.079714 0.000001 0.464192 +0.120832 0.000001 0.464192 +0.159284 0.000001 0.464192 +0.194868 0.000001 0.464192 +0.227530 0.000001 0.464192 +0.257434 0.000001 0.464192 +0.285092 0.000001 0.464192 +0.310738 0.000001 0.464192 +0.334585 0.000001 0.464192 +0.356818 0.000001 0.464192 +0.377602 0.000001 0.464192 +0.397079 0.000001 0.464192 +0.415373 0.000001 0.464192 +0.432594 0.000001 0.464192 +0.448839 0.000001 0.464192 +0.464192 0.000001 0.464192 +0.478729 0.000001 0.464192 +0.492515 0.000001 0.464192 +0.505612 0.000001 0.464192 +0.518072 0.000001 0.464192 +0.529943 0.000001 0.464192 +0.541266 0.000001 0.464192 +0.552083 0.000001 0.464192 +0.562427 0.000001 0.464192 +0.572331 0.000001 0.464192 +0.581823 0.000001 0.464192 +0.590929 0.000001 0.464192 +0.599674 0.000001 0.464192 +0.608079 0.000001 0.464192 +0.616166 0.000001 0.464192 +0.000001 0.037293 0.464192 +0.037293 0.037293 0.464192 +0.079714 0.037293 0.464192 +0.120832 0.037293 0.464192 +0.159284 0.037293 0.464192 +0.194868 0.037293 0.464192 +0.227530 0.037293 0.464192 +0.257434 0.037293 0.464192 +0.285092 0.037293 0.464192 +0.310738 0.037293 0.464192 +0.334585 0.037293 0.464192 +0.356818 0.037293 0.464192 +0.377602 0.037293 0.464192 +0.397079 0.037293 0.464192 +0.415373 0.037293 0.464192 +0.432594 0.037293 0.464192 +0.448839 0.037293 0.464192 +0.464192 0.037293 0.464192 +0.478729 0.037293 0.464192 +0.492515 0.037293 0.464192 +0.505612 0.037293 0.464192 +0.518072 0.037293 0.464192 +0.529943 0.037293 0.464192 +0.541266 0.037293 0.464192 +0.552083 0.037293 0.464192 +0.562427 0.037293 0.464192 +0.572331 0.037293 0.464192 +0.581823 0.037293 0.464192 +0.590929 0.037293 0.464192 +0.599674 0.037293 0.464192 +0.608079 0.037293 0.464192 +0.616166 0.037293 0.464192 +0.000001 0.079714 0.464192 +0.037293 0.079714 0.464192 +0.079714 0.079714 0.464192 +0.120832 0.079714 0.464192 +0.159284 0.079714 0.464192 +0.194868 0.079714 0.464192 +0.227530 0.079714 0.464192 +0.257434 0.079714 0.464192 +0.285092 0.079714 0.464192 +0.310738 0.079714 0.464192 +0.334585 0.079714 0.464192 +0.356818 0.079714 0.464192 +0.377602 0.079714 0.464192 +0.397079 0.079714 0.464192 +0.415373 0.079714 0.464192 +0.432594 0.079714 0.464192 +0.448839 0.079714 0.464192 +0.464192 0.079714 0.464192 +0.478729 0.079714 0.464192 +0.492515 0.079714 0.464192 +0.505612 0.079714 0.464192 +0.518072 0.079714 0.464192 +0.529943 0.079714 0.464192 +0.541266 0.079714 0.464192 +0.552083 0.079714 0.464192 +0.562427 0.079714 0.464192 +0.572331 0.079714 0.464192 +0.581823 0.079714 0.464192 +0.590929 0.079714 0.464192 +0.599674 0.079714 0.464192 +0.608079 0.079714 0.464192 +0.616166 0.079714 0.464192 +0.000001 0.120832 0.464192 +0.037293 0.120832 0.464192 +0.079714 0.120832 0.464192 +0.120832 0.120832 0.464192 +0.159284 0.120832 0.464192 +0.194868 0.120832 0.464192 +0.227530 0.120832 0.464192 +0.257434 0.120832 0.464192 +0.285092 0.120832 0.464192 +0.310738 0.120832 0.464192 +0.334585 0.120832 0.464192 +0.356818 0.120832 0.464192 +0.377602 0.120832 0.464192 +0.397079 0.120832 0.464192 +0.415373 0.120832 0.464192 +0.432594 0.120832 0.464192 +0.448839 0.120832 0.464192 +0.464192 0.120832 0.464192 +0.478729 0.120832 0.464192 +0.492515 0.120832 0.464192 +0.505612 0.120832 0.464192 +0.518072 0.120832 0.464192 +0.529943 0.120832 0.464192 +0.541266 0.120832 0.464192 +0.552083 0.120832 0.464192 +0.562427 0.120832 0.464192 +0.572331 0.120832 0.464192 +0.581823 0.120832 0.464192 +0.590929 0.120832 0.464192 +0.599674 0.120832 0.464192 +0.608079 0.120832 0.464192 +0.616166 0.120832 0.464192 +0.000001 0.159284 0.464192 +0.037293 0.159284 0.464192 +0.079714 0.159284 0.464192 +0.120832 0.159284 0.464192 +0.159284 0.159284 0.464192 +0.194868 0.159284 0.464192 +0.227530 0.159284 0.464192 +0.257434 0.159284 0.464192 +0.285092 0.159284 0.464192 +0.310738 0.159284 0.464192 +0.334585 0.159284 0.464192 +0.356818 0.159284 0.464192 +0.377602 0.159284 0.464192 +0.397079 0.159284 0.464192 +0.415373 0.159284 0.464192 +0.432594 0.159284 0.464192 +0.448839 0.159284 0.464192 +0.464192 0.159284 0.464192 +0.478729 0.159284 0.464192 +0.492515 0.159284 0.464192 +0.505612 0.159284 0.464192 +0.518072 0.159284 0.464192 +0.529943 0.159284 0.464192 +0.541266 0.159284 0.464192 +0.552083 0.159284 0.464192 +0.562427 0.159284 0.464192 +0.572331 0.159284 0.464192 +0.581823 0.159284 0.464192 +0.590929 0.159284 0.464192 +0.599674 0.159284 0.464192 +0.608079 0.159284 0.464192 +0.616166 0.159284 0.464192 +0.000001 0.194868 0.464192 +0.037293 0.194868 0.464192 +0.079714 0.194868 0.464192 +0.120832 0.194868 0.464192 +0.159284 0.194868 0.464192 +0.194868 0.194868 0.464192 +0.227530 0.194868 0.464192 +0.257434 0.194868 0.464192 +0.285092 0.194868 0.464192 +0.310738 0.194868 0.464192 +0.334585 0.194868 0.464192 +0.356818 0.194868 0.464192 +0.377602 0.194868 0.464192 +0.397079 0.194868 0.464192 +0.415373 0.194868 0.464192 +0.432594 0.194868 0.464192 +0.448839 0.194868 0.464192 +0.464192 0.194868 0.464192 +0.478729 0.194868 0.464192 +0.492515 0.194868 0.464192 +0.505612 0.194868 0.464192 +0.518072 0.194868 0.464192 +0.529943 0.194868 0.464192 +0.541266 0.194868 0.464192 +0.552083 0.194868 0.464192 +0.562427 0.194868 0.464192 +0.572331 0.194868 0.464192 +0.581823 0.194868 0.464192 +0.590929 0.194868 0.464192 +0.599674 0.194868 0.464192 +0.608079 0.194868 0.464192 +0.616166 0.194868 0.464192 +0.000001 0.227530 0.464192 +0.037293 0.227530 0.464192 +0.079714 0.227530 0.464192 +0.120832 0.227530 0.464192 +0.159284 0.227530 0.464192 +0.194868 0.227530 0.464192 +0.227530 0.227530 0.464192 +0.257434 0.227530 0.464192 +0.285092 0.227530 0.464192 +0.310738 0.227530 0.464192 +0.334585 0.227530 0.464192 +0.356818 0.227530 0.464192 +0.377602 0.227530 0.464192 +0.397079 0.227530 0.464192 +0.415373 0.227530 0.464192 +0.432594 0.227530 0.464192 +0.448839 0.227530 0.464192 +0.464192 0.227530 0.464192 +0.478729 0.227530 0.464192 +0.492515 0.227530 0.464192 +0.505612 0.227530 0.464192 +0.518072 0.227530 0.464192 +0.529943 0.227530 0.464192 +0.541266 0.227530 0.464192 +0.552083 0.227530 0.464192 +0.562427 0.227530 0.464192 +0.572331 0.227530 0.464192 +0.581823 0.227530 0.464192 +0.590929 0.227530 0.464192 +0.599674 0.227530 0.464192 +0.608079 0.227530 0.464192 +0.616166 0.227530 0.464192 +0.000001 0.257434 0.464192 +0.037293 0.257434 0.464192 +0.079714 0.257434 0.464192 +0.120832 0.257434 0.464192 +0.159284 0.257434 0.464192 +0.194868 0.257434 0.464192 +0.227530 0.257434 0.464192 +0.257434 0.257434 0.464192 +0.285092 0.257434 0.464192 +0.310738 0.257434 0.464192 +0.334585 0.257434 0.464192 +0.356818 0.257434 0.464192 +0.377602 0.257434 0.464192 +0.397079 0.257434 0.464192 +0.415373 0.257434 0.464192 +0.432594 0.257434 0.464192 +0.448839 0.257434 0.464192 +0.464192 0.257434 0.464192 +0.478729 0.257434 0.464192 +0.492515 0.257434 0.464192 +0.505612 0.257434 0.464192 +0.518072 0.257434 0.464192 +0.529943 0.257434 0.464192 +0.541266 0.257434 0.464192 +0.552083 0.257434 0.464192 +0.562427 0.257434 0.464192 +0.572331 0.257434 0.464192 +0.581823 0.257434 0.464192 +0.590929 0.257434 0.464192 +0.599674 0.257434 0.464192 +0.608079 0.257434 0.464192 +0.616166 0.257434 0.464192 +0.000001 0.285092 0.464192 +0.037293 0.285092 0.464192 +0.079714 0.285092 0.464192 +0.120832 0.285092 0.464192 +0.159284 0.285092 0.464192 +0.194868 0.285092 0.464192 +0.227530 0.285092 0.464192 +0.257434 0.285092 0.464192 +0.285092 0.285092 0.464192 +0.310738 0.285092 0.464192 +0.334585 0.285092 0.464192 +0.356818 0.285092 0.464192 +0.377602 0.285092 0.464192 +0.397079 0.285092 0.464192 +0.415373 0.285092 0.464192 +0.432594 0.285092 0.464192 +0.448839 0.285092 0.464192 +0.464192 0.285092 0.464192 +0.478729 0.285092 0.464192 +0.492515 0.285092 0.464192 +0.505612 0.285092 0.464192 +0.518072 0.285092 0.464192 +0.529943 0.285092 0.464192 +0.541266 0.285092 0.464192 +0.552083 0.285092 0.464192 +0.562427 0.285092 0.464192 +0.572331 0.285092 0.464192 +0.581823 0.285092 0.464192 +0.590929 0.285092 0.464192 +0.599674 0.285092 0.464192 +0.608079 0.285092 0.464192 +0.616166 0.285092 0.464192 +0.000001 0.310738 0.464192 +0.037293 0.310738 0.464192 +0.079714 0.310738 0.464192 +0.120832 0.310738 0.464192 +0.159284 0.310738 0.464192 +0.194868 0.310738 0.464192 +0.227530 0.310738 0.464192 +0.257434 0.310738 0.464192 +0.285092 0.310738 0.464192 +0.310738 0.310738 0.464192 +0.334585 0.310738 0.464192 +0.356818 0.310738 0.464192 +0.377602 0.310738 0.464192 +0.397079 0.310738 0.464192 +0.415373 0.310738 0.464192 +0.432594 0.310738 0.464192 +0.448839 0.310738 0.464192 +0.464192 0.310738 0.464192 +0.478729 0.310738 0.464192 +0.492515 0.310738 0.464192 +0.505612 0.310738 0.464192 +0.518072 0.310738 0.464192 +0.529943 0.310738 0.464192 +0.541266 0.310738 0.464192 +0.552083 0.310738 0.464192 +0.562427 0.310738 0.464192 +0.572331 0.310738 0.464192 +0.581823 0.310738 0.464192 +0.590929 0.310738 0.464192 +0.599674 0.310738 0.464192 +0.608079 0.310738 0.464192 +0.616166 0.310738 0.464192 +0.000001 0.334585 0.464192 +0.037293 0.334585 0.464192 +0.079714 0.334585 0.464192 +0.120832 0.334585 0.464192 +0.159284 0.334585 0.464192 +0.194868 0.334585 0.464192 +0.227530 0.334585 0.464192 +0.257434 0.334585 0.464192 +0.285092 0.334585 0.464192 +0.310738 0.334585 0.464192 +0.334585 0.334585 0.464192 +0.356818 0.334585 0.464192 +0.377602 0.334585 0.464192 +0.397079 0.334585 0.464192 +0.415373 0.334585 0.464192 +0.432594 0.334585 0.464192 +0.448839 0.334585 0.464192 +0.464192 0.334585 0.464192 +0.478729 0.334585 0.464192 +0.492515 0.334585 0.464192 +0.505612 0.334585 0.464192 +0.518072 0.334585 0.464192 +0.529943 0.334585 0.464192 +0.541266 0.334585 0.464192 +0.552083 0.334585 0.464192 +0.562427 0.334585 0.464192 +0.572331 0.334585 0.464192 +0.581823 0.334585 0.464192 +0.590929 0.334585 0.464192 +0.599674 0.334585 0.464192 +0.608079 0.334585 0.464192 +0.616166 0.334585 0.464192 +0.000001 0.356818 0.464192 +0.037293 0.356818 0.464192 +0.079714 0.356818 0.464192 +0.120832 0.356818 0.464192 +0.159284 0.356818 0.464192 +0.194868 0.356818 0.464192 +0.227530 0.356818 0.464192 +0.257434 0.356818 0.464192 +0.285092 0.356818 0.464192 +0.310738 0.356818 0.464192 +0.334585 0.356818 0.464192 +0.356818 0.356818 0.464192 +0.377602 0.356818 0.464192 +0.397079 0.356818 0.464192 +0.415373 0.356818 0.464192 +0.432594 0.356818 0.464192 +0.448839 0.356818 0.464192 +0.464192 0.356818 0.464192 +0.478729 0.356818 0.464192 +0.492515 0.356818 0.464192 +0.505612 0.356818 0.464192 +0.518072 0.356818 0.464192 +0.529943 0.356818 0.464192 +0.541266 0.356818 0.464192 +0.552083 0.356818 0.464192 +0.562427 0.356818 0.464192 +0.572331 0.356818 0.464192 +0.581823 0.356818 0.464192 +0.590929 0.356818 0.464192 +0.599674 0.356818 0.464192 +0.608079 0.356818 0.464192 +0.616166 0.356818 0.464192 +0.000001 0.377602 0.464192 +0.037293 0.377602 0.464192 +0.079714 0.377602 0.464192 +0.120832 0.377602 0.464192 +0.159284 0.377602 0.464192 +0.194868 0.377602 0.464192 +0.227530 0.377602 0.464192 +0.257434 0.377602 0.464192 +0.285092 0.377602 0.464192 +0.310738 0.377602 0.464192 +0.334585 0.377602 0.464192 +0.356818 0.377602 0.464192 +0.377602 0.377602 0.464192 +0.397079 0.377602 0.464192 +0.415373 0.377602 0.464192 +0.432594 0.377602 0.464192 +0.448839 0.377602 0.464192 +0.464192 0.377602 0.464192 +0.478729 0.377602 0.464192 +0.492515 0.377602 0.464192 +0.505612 0.377602 0.464192 +0.518072 0.377602 0.464192 +0.529943 0.377602 0.464192 +0.541266 0.377602 0.464192 +0.552083 0.377602 0.464192 +0.562427 0.377602 0.464192 +0.572331 0.377602 0.464192 +0.581823 0.377602 0.464192 +0.590929 0.377602 0.464192 +0.599674 0.377602 0.464192 +0.608079 0.377602 0.464192 +0.616166 0.377602 0.464192 +0.000001 0.397079 0.464192 +0.037293 0.397079 0.464192 +0.079714 0.397079 0.464192 +0.120832 0.397079 0.464192 +0.159284 0.397079 0.464192 +0.194868 0.397079 0.464192 +0.227530 0.397079 0.464192 +0.257434 0.397079 0.464192 +0.285092 0.397079 0.464192 +0.310738 0.397079 0.464192 +0.334585 0.397079 0.464192 +0.356818 0.397079 0.464192 +0.377602 0.397079 0.464192 +0.397079 0.397079 0.464192 +0.415373 0.397079 0.464192 +0.432594 0.397079 0.464192 +0.448839 0.397079 0.464192 +0.464192 0.397079 0.464192 +0.478729 0.397079 0.464192 +0.492515 0.397079 0.464192 +0.505612 0.397079 0.464192 +0.518072 0.397079 0.464192 +0.529943 0.397079 0.464192 +0.541266 0.397079 0.464192 +0.552083 0.397079 0.464192 +0.562427 0.397079 0.464192 +0.572331 0.397079 0.464192 +0.581823 0.397079 0.464192 +0.590929 0.397079 0.464192 +0.599674 0.397079 0.464192 +0.608079 0.397079 0.464192 +0.616166 0.397079 0.464192 +0.000001 0.415373 0.464192 +0.037293 0.415373 0.464192 +0.079714 0.415373 0.464192 +0.120832 0.415373 0.464192 +0.159284 0.415373 0.464192 +0.194868 0.415373 0.464192 +0.227530 0.415373 0.464192 +0.257434 0.415373 0.464192 +0.285092 0.415373 0.464192 +0.310738 0.415373 0.464192 +0.334585 0.415373 0.464192 +0.356818 0.415373 0.464192 +0.377602 0.415373 0.464192 +0.397079 0.415373 0.464192 +0.415373 0.415373 0.464192 +0.432594 0.415373 0.464192 +0.448839 0.415373 0.464192 +0.464192 0.415373 0.464192 +0.478729 0.415373 0.464192 +0.492515 0.415373 0.464192 +0.505612 0.415373 0.464192 +0.518072 0.415373 0.464192 +0.529943 0.415373 0.464192 +0.541266 0.415373 0.464192 +0.552083 0.415373 0.464192 +0.562427 0.415373 0.464192 +0.572331 0.415373 0.464192 +0.581823 0.415373 0.464192 +0.590929 0.415373 0.464192 +0.599674 0.415373 0.464192 +0.608079 0.415373 0.464192 +0.616166 0.415373 0.464192 +0.000001 0.432594 0.464192 +0.037293 0.432594 0.464192 +0.079714 0.432594 0.464192 +0.120832 0.432594 0.464192 +0.159284 0.432594 0.464192 +0.194868 0.432594 0.464192 +0.227530 0.432594 0.464192 +0.257434 0.432594 0.464192 +0.285092 0.432594 0.464192 +0.310738 0.432594 0.464192 +0.334585 0.432594 0.464192 +0.356818 0.432594 0.464192 +0.377602 0.432594 0.464192 +0.397079 0.432594 0.464192 +0.415373 0.432594 0.464192 +0.432594 0.432594 0.464192 +0.448839 0.432594 0.464192 +0.464192 0.432594 0.464192 +0.478729 0.432594 0.464192 +0.492515 0.432594 0.464192 +0.505612 0.432594 0.464192 +0.518072 0.432594 0.464192 +0.529943 0.432594 0.464192 +0.541266 0.432594 0.464192 +0.552083 0.432594 0.464192 +0.562427 0.432594 0.464192 +0.572331 0.432594 0.464192 +0.581823 0.432594 0.464192 +0.590929 0.432594 0.464192 +0.599674 0.432594 0.464192 +0.608079 0.432594 0.464192 +0.616166 0.432594 0.464192 +0.000001 0.448839 0.464192 +0.037293 0.448839 0.464192 +0.079714 0.448839 0.464192 +0.120832 0.448839 0.464192 +0.159284 0.448839 0.464192 +0.194868 0.448839 0.464192 +0.227530 0.448839 0.464192 +0.257434 0.448839 0.464192 +0.285092 0.448839 0.464192 +0.310738 0.448839 0.464192 +0.334585 0.448839 0.464192 +0.356818 0.448839 0.464192 +0.377602 0.448839 0.464192 +0.397079 0.448839 0.464192 +0.415373 0.448839 0.464192 +0.432594 0.448839 0.464192 +0.448839 0.448839 0.464192 +0.464192 0.448839 0.464192 +0.478729 0.448839 0.464192 +0.492515 0.448839 0.464192 +0.505612 0.448839 0.464192 +0.518072 0.448839 0.464192 +0.529943 0.448839 0.464192 +0.541266 0.448839 0.464192 +0.552083 0.448839 0.464192 +0.562427 0.448839 0.464192 +0.572331 0.448839 0.464192 +0.581823 0.448839 0.464192 +0.590929 0.448839 0.464192 +0.599674 0.448839 0.464192 +0.608079 0.448839 0.464192 +0.616166 0.448839 0.464192 +0.000001 0.464192 0.464192 +0.037293 0.464192 0.464192 +0.079714 0.464192 0.464192 +0.120832 0.464192 0.464192 +0.159284 0.464192 0.464192 +0.194868 0.464192 0.464192 +0.227530 0.464192 0.464192 +0.257434 0.464192 0.464192 +0.285092 0.464192 0.464192 +0.310738 0.464192 0.464192 +0.334585 0.464192 0.464192 +0.356818 0.464192 0.464192 +0.377602 0.464192 0.464192 +0.397079 0.464192 0.464192 +0.415373 0.464192 0.464192 +0.432594 0.464192 0.464192 +0.448839 0.464192 0.464192 +0.464192 0.464192 0.464192 +0.478729 0.464192 0.464192 +0.492515 0.464192 0.464192 +0.505612 0.464192 0.464192 +0.518072 0.464192 0.464192 +0.529943 0.464192 0.464192 +0.541266 0.464192 0.464192 +0.552083 0.464192 0.464192 +0.562427 0.464192 0.464192 +0.572331 0.464192 0.464192 +0.581823 0.464192 0.464192 +0.590929 0.464192 0.464192 +0.599674 0.464192 0.464192 +0.608079 0.464192 0.464192 +0.616166 0.464192 0.464192 +0.000001 0.478729 0.464192 +0.037293 0.478729 0.464192 +0.079714 0.478729 0.464192 +0.120832 0.478729 0.464192 +0.159284 0.478729 0.464192 +0.194868 0.478729 0.464192 +0.227530 0.478729 0.464192 +0.257434 0.478729 0.464192 +0.285092 0.478729 0.464192 +0.310738 0.478729 0.464192 +0.334585 0.478729 0.464192 +0.356818 0.478729 0.464192 +0.377602 0.478729 0.464192 +0.397079 0.478729 0.464192 +0.415373 0.478729 0.464192 +0.432594 0.478729 0.464192 +0.448839 0.478729 0.464192 +0.464192 0.478729 0.464192 +0.478729 0.478729 0.464192 +0.492515 0.478729 0.464192 +0.505612 0.478729 0.464192 +0.518072 0.478729 0.464192 +0.529943 0.478729 0.464192 +0.541266 0.478729 0.464192 +0.552083 0.478729 0.464192 +0.562427 0.478729 0.464192 +0.572331 0.478729 0.464192 +0.581823 0.478729 0.464192 +0.590929 0.478729 0.464192 +0.599674 0.478729 0.464192 +0.608079 0.478729 0.464192 +0.616166 0.478729 0.464192 +0.000001 0.492515 0.464192 +0.037293 0.492515 0.464192 +0.079714 0.492515 0.464192 +0.120832 0.492515 0.464192 +0.159284 0.492515 0.464192 +0.194868 0.492515 0.464192 +0.227530 0.492515 0.464192 +0.257434 0.492515 0.464192 +0.285092 0.492515 0.464192 +0.310738 0.492515 0.464192 +0.334585 0.492515 0.464192 +0.356818 0.492515 0.464192 +0.377602 0.492515 0.464192 +0.397079 0.492515 0.464192 +0.415373 0.492515 0.464192 +0.432594 0.492515 0.464192 +0.448839 0.492515 0.464192 +0.464192 0.492515 0.464192 +0.478729 0.492515 0.464192 +0.492515 0.492515 0.464192 +0.505612 0.492515 0.464192 +0.518072 0.492515 0.464192 +0.529943 0.492515 0.464192 +0.541266 0.492515 0.464192 +0.552083 0.492515 0.464192 +0.562427 0.492515 0.464192 +0.572331 0.492515 0.464192 +0.581823 0.492515 0.464192 +0.590929 0.492515 0.464192 +0.599674 0.492515 0.464192 +0.608079 0.492515 0.464192 +0.616166 0.492515 0.464192 +0.000001 0.505612 0.464192 +0.037293 0.505612 0.464192 +0.079714 0.505612 0.464192 +0.120832 0.505612 0.464192 +0.159284 0.505612 0.464192 +0.194868 0.505612 0.464192 +0.227530 0.505612 0.464192 +0.257434 0.505612 0.464192 +0.285092 0.505612 0.464192 +0.310738 0.505612 0.464192 +0.334585 0.505612 0.464192 +0.356818 0.505612 0.464192 +0.377602 0.505612 0.464192 +0.397079 0.505612 0.464192 +0.415373 0.505612 0.464192 +0.432594 0.505612 0.464192 +0.448839 0.505612 0.464192 +0.464192 0.505612 0.464192 +0.478729 0.505612 0.464192 +0.492515 0.505612 0.464192 +0.505612 0.505612 0.464192 +0.518072 0.505612 0.464192 +0.529943 0.505612 0.464192 +0.541266 0.505612 0.464192 +0.552083 0.505612 0.464192 +0.562427 0.505612 0.464192 +0.572331 0.505612 0.464192 +0.581823 0.505612 0.464192 +0.590929 0.505612 0.464192 +0.599674 0.505612 0.464192 +0.608079 0.505612 0.464192 +0.616166 0.505612 0.464192 +0.000001 0.518072 0.464192 +0.037293 0.518072 0.464192 +0.079714 0.518072 0.464192 +0.120832 0.518072 0.464192 +0.159284 0.518072 0.464192 +0.194868 0.518072 0.464192 +0.227530 0.518072 0.464192 +0.257434 0.518072 0.464192 +0.285092 0.518072 0.464192 +0.310738 0.518072 0.464192 +0.334585 0.518072 0.464192 +0.356818 0.518072 0.464192 +0.377602 0.518072 0.464192 +0.397079 0.518072 0.464192 +0.415373 0.518072 0.464192 +0.432594 0.518072 0.464192 +0.448839 0.518072 0.464192 +0.464192 0.518072 0.464192 +0.478729 0.518072 0.464192 +0.492515 0.518072 0.464192 +0.505612 0.518072 0.464192 +0.518072 0.518072 0.464192 +0.529943 0.518072 0.464192 +0.541266 0.518072 0.464192 +0.552083 0.518072 0.464192 +0.562427 0.518072 0.464192 +0.572331 0.518072 0.464192 +0.581823 0.518072 0.464192 +0.590929 0.518072 0.464192 +0.599674 0.518072 0.464192 +0.608079 0.518072 0.464192 +0.616166 0.518072 0.464192 +0.000001 0.529943 0.464192 +0.037293 0.529943 0.464192 +0.079714 0.529943 0.464192 +0.120832 0.529943 0.464192 +0.159284 0.529943 0.464192 +0.194868 0.529943 0.464192 +0.227530 0.529943 0.464192 +0.257434 0.529943 0.464192 +0.285092 0.529943 0.464192 +0.310738 0.529943 0.464192 +0.334585 0.529943 0.464192 +0.356818 0.529943 0.464192 +0.377602 0.529943 0.464192 +0.397079 0.529943 0.464192 +0.415373 0.529943 0.464192 +0.432594 0.529943 0.464192 +0.448839 0.529943 0.464192 +0.464192 0.529943 0.464192 +0.478729 0.529943 0.464192 +0.492515 0.529943 0.464192 +0.505612 0.529943 0.464192 +0.518072 0.529943 0.464192 +0.529943 0.529943 0.464192 +0.541266 0.529943 0.464192 +0.552083 0.529943 0.464192 +0.562427 0.529943 0.464192 +0.572331 0.529943 0.464192 +0.581823 0.529943 0.464192 +0.590929 0.529943 0.464192 +0.599674 0.529943 0.464192 +0.608079 0.529943 0.464192 +0.616166 0.529943 0.464192 +0.000001 0.541266 0.464192 +0.037293 0.541266 0.464192 +0.079714 0.541266 0.464192 +0.120832 0.541266 0.464192 +0.159284 0.541266 0.464192 +0.194868 0.541266 0.464192 +0.227530 0.541266 0.464192 +0.257434 0.541266 0.464192 +0.285092 0.541266 0.464192 +0.310738 0.541266 0.464192 +0.334585 0.541266 0.464192 +0.356818 0.541266 0.464192 +0.377602 0.541266 0.464192 +0.397079 0.541266 0.464192 +0.415373 0.541266 0.464192 +0.432594 0.541266 0.464192 +0.448839 0.541266 0.464192 +0.464192 0.541266 0.464192 +0.478729 0.541266 0.464192 +0.492515 0.541266 0.464192 +0.505612 0.541266 0.464192 +0.518072 0.541266 0.464192 +0.529943 0.541266 0.464192 +0.541266 0.541266 0.464192 +0.552083 0.541266 0.464192 +0.562427 0.541266 0.464192 +0.572331 0.541266 0.464192 +0.581823 0.541266 0.464192 +0.590929 0.541266 0.464192 +0.599674 0.541266 0.464192 +0.608079 0.541266 0.464192 +0.616166 0.541266 0.464192 +0.000001 0.552083 0.464192 +0.037293 0.552083 0.464192 +0.079714 0.552083 0.464192 +0.120832 0.552083 0.464192 +0.159284 0.552083 0.464192 +0.194868 0.552083 0.464192 +0.227530 0.552083 0.464192 +0.257434 0.552083 0.464192 +0.285092 0.552083 0.464192 +0.310738 0.552083 0.464192 +0.334585 0.552083 0.464192 +0.356818 0.552083 0.464192 +0.377602 0.552083 0.464192 +0.397079 0.552083 0.464192 +0.415373 0.552083 0.464192 +0.432594 0.552083 0.464192 +0.448839 0.552083 0.464192 +0.464192 0.552083 0.464192 +0.478729 0.552083 0.464192 +0.492515 0.552083 0.464192 +0.505612 0.552083 0.464192 +0.518072 0.552083 0.464192 +0.529943 0.552083 0.464192 +0.541266 0.552083 0.464192 +0.552083 0.552083 0.464192 +0.562427 0.552083 0.464192 +0.572331 0.552083 0.464192 +0.581823 0.552083 0.464192 +0.590929 0.552083 0.464192 +0.599674 0.552083 0.464192 +0.608079 0.552083 0.464192 +0.616166 0.552083 0.464192 +0.000001 0.562427 0.464192 +0.037293 0.562427 0.464192 +0.079714 0.562427 0.464192 +0.120832 0.562427 0.464192 +0.159284 0.562427 0.464192 +0.194868 0.562427 0.464192 +0.227530 0.562427 0.464192 +0.257434 0.562427 0.464192 +0.285092 0.562427 0.464192 +0.310738 0.562427 0.464192 +0.334585 0.562427 0.464192 +0.356818 0.562427 0.464192 +0.377602 0.562427 0.464192 +0.397079 0.562427 0.464192 +0.415373 0.562427 0.464192 +0.432594 0.562427 0.464192 +0.448839 0.562427 0.464192 +0.464192 0.562427 0.464192 +0.478729 0.562427 0.464192 +0.492515 0.562427 0.464192 +0.505612 0.562427 0.464192 +0.518072 0.562427 0.464192 +0.529943 0.562427 0.464192 +0.541266 0.562427 0.464192 +0.552083 0.562427 0.464192 +0.562427 0.562427 0.464192 +0.572331 0.562427 0.464192 +0.581823 0.562427 0.464192 +0.590929 0.562427 0.464192 +0.599674 0.562427 0.464192 +0.608079 0.562427 0.464192 +0.616166 0.562427 0.464192 +0.000001 0.572331 0.464192 +0.037293 0.572331 0.464192 +0.079714 0.572331 0.464192 +0.120832 0.572331 0.464192 +0.159284 0.572331 0.464192 +0.194868 0.572331 0.464192 +0.227530 0.572331 0.464192 +0.257434 0.572331 0.464192 +0.285092 0.572331 0.464192 +0.310738 0.572331 0.464192 +0.334585 0.572331 0.464192 +0.356818 0.572331 0.464192 +0.377602 0.572331 0.464192 +0.397079 0.572331 0.464192 +0.415373 0.572331 0.464192 +0.432594 0.572331 0.464192 +0.448839 0.572331 0.464192 +0.464192 0.572331 0.464192 +0.478729 0.572331 0.464192 +0.492515 0.572331 0.464192 +0.505612 0.572331 0.464192 +0.518072 0.572331 0.464192 +0.529943 0.572331 0.464192 +0.541266 0.572331 0.464192 +0.552083 0.572331 0.464192 +0.562427 0.572331 0.464192 +0.572331 0.572331 0.464192 +0.581823 0.572331 0.464192 +0.590929 0.572331 0.464192 +0.599674 0.572331 0.464192 +0.608079 0.572331 0.464192 +0.616166 0.572331 0.464192 +0.000001 0.581823 0.464192 +0.037293 0.581823 0.464192 +0.079714 0.581823 0.464192 +0.120832 0.581823 0.464192 +0.159284 0.581823 0.464192 +0.194868 0.581823 0.464192 +0.227530 0.581823 0.464192 +0.257434 0.581823 0.464192 +0.285092 0.581823 0.464192 +0.310738 0.581823 0.464192 +0.334585 0.581823 0.464192 +0.356818 0.581823 0.464192 +0.377602 0.581823 0.464192 +0.397079 0.581823 0.464192 +0.415373 0.581823 0.464192 +0.432594 0.581823 0.464192 +0.448839 0.581823 0.464192 +0.464192 0.581823 0.464192 +0.478729 0.581823 0.464192 +0.492515 0.581823 0.464192 +0.505612 0.581823 0.464192 +0.518072 0.581823 0.464192 +0.529943 0.581823 0.464192 +0.541266 0.581823 0.464192 +0.552083 0.581823 0.464192 +0.562427 0.581823 0.464192 +0.572331 0.581823 0.464192 +0.581823 0.581823 0.464192 +0.590929 0.581823 0.464192 +0.599674 0.581823 0.464192 +0.608079 0.581823 0.464192 +0.616166 0.581823 0.464192 +0.000001 0.590929 0.464192 +0.037293 0.590929 0.464192 +0.079714 0.590929 0.464192 +0.120832 0.590929 0.464192 +0.159284 0.590929 0.464192 +0.194868 0.590929 0.464192 +0.227530 0.590929 0.464192 +0.257434 0.590929 0.464192 +0.285092 0.590929 0.464192 +0.310738 0.590929 0.464192 +0.334585 0.590929 0.464192 +0.356818 0.590929 0.464192 +0.377602 0.590929 0.464192 +0.397079 0.590929 0.464192 +0.415373 0.590929 0.464192 +0.432594 0.590929 0.464192 +0.448839 0.590929 0.464192 +0.464192 0.590929 0.464192 +0.478729 0.590929 0.464192 +0.492515 0.590929 0.464192 +0.505612 0.590929 0.464192 +0.518072 0.590929 0.464192 +0.529943 0.590929 0.464192 +0.541266 0.590929 0.464192 +0.552083 0.590929 0.464192 +0.562427 0.590929 0.464192 +0.572331 0.590929 0.464192 +0.581823 0.590929 0.464192 +0.590929 0.590929 0.464192 +0.599674 0.590929 0.464192 +0.608079 0.590929 0.464192 +0.616166 0.590929 0.464192 +0.000001 0.599674 0.464192 +0.037293 0.599674 0.464192 +0.079714 0.599674 0.464192 +0.120832 0.599674 0.464192 +0.159284 0.599674 0.464192 +0.194868 0.599674 0.464192 +0.227530 0.599674 0.464192 +0.257434 0.599674 0.464192 +0.285092 0.599674 0.464192 +0.310738 0.599674 0.464192 +0.334585 0.599674 0.464192 +0.356818 0.599674 0.464192 +0.377602 0.599674 0.464192 +0.397079 0.599674 0.464192 +0.415373 0.599674 0.464192 +0.432594 0.599674 0.464192 +0.448839 0.599674 0.464192 +0.464192 0.599674 0.464192 +0.478729 0.599674 0.464192 +0.492515 0.599674 0.464192 +0.505612 0.599674 0.464192 +0.518072 0.599674 0.464192 +0.529943 0.599674 0.464192 +0.541266 0.599674 0.464192 +0.552083 0.599674 0.464192 +0.562427 0.599674 0.464192 +0.572331 0.599674 0.464192 +0.581823 0.599674 0.464192 +0.590929 0.599674 0.464192 +0.599674 0.599674 0.464192 +0.608079 0.599674 0.464192 +0.616166 0.599674 0.464192 +0.000001 0.608079 0.464192 +0.037293 0.608079 0.464192 +0.079714 0.608079 0.464192 +0.120832 0.608079 0.464192 +0.159284 0.608079 0.464192 +0.194868 0.608079 0.464192 +0.227530 0.608079 0.464192 +0.257434 0.608079 0.464192 +0.285092 0.608079 0.464192 +0.310738 0.608079 0.464192 +0.334585 0.608079 0.464192 +0.356818 0.608079 0.464192 +0.377602 0.608079 0.464192 +0.397079 0.608079 0.464192 +0.415373 0.608079 0.464192 +0.432594 0.608079 0.464192 +0.448839 0.608079 0.464192 +0.464192 0.608079 0.464192 +0.478729 0.608079 0.464192 +0.492515 0.608079 0.464192 +0.505612 0.608079 0.464192 +0.518072 0.608079 0.464192 +0.529943 0.608079 0.464192 +0.541266 0.608079 0.464192 +0.552083 0.608079 0.464192 +0.562427 0.608079 0.464192 +0.572331 0.608079 0.464192 +0.581823 0.608079 0.464192 +0.590929 0.608079 0.464192 +0.599674 0.608079 0.464192 +0.608079 0.608079 0.464192 +0.616166 0.608079 0.464192 +0.000001 0.616166 0.464192 +0.037293 0.616166 0.464192 +0.079714 0.616166 0.464192 +0.120832 0.616166 0.464192 +0.159284 0.616166 0.464192 +0.194868 0.616166 0.464192 +0.227530 0.616166 0.464192 +0.257434 0.616166 0.464192 +0.285092 0.616166 0.464192 +0.310738 0.616166 0.464192 +0.334585 0.616166 0.464192 +0.356818 0.616166 0.464192 +0.377602 0.616166 0.464192 +0.397079 0.616166 0.464192 +0.415373 0.616166 0.464192 +0.432594 0.616166 0.464192 +0.448839 0.616166 0.464192 +0.464192 0.616166 0.464192 +0.478729 0.616166 0.464192 +0.492515 0.616166 0.464192 +0.505612 0.616166 0.464192 +0.518072 0.616166 0.464192 +0.529943 0.616166 0.464192 +0.541266 0.616166 0.464192 +0.552083 0.616166 0.464192 +0.562427 0.616166 0.464192 +0.572331 0.616166 0.464192 +0.581823 0.616166 0.464192 +0.590929 0.616166 0.464192 +0.599674 0.616166 0.464192 +0.608079 0.616166 0.464192 +0.616166 0.616166 0.464192 +0.000001 0.000001 0.478729 +0.037293 0.000001 0.478729 +0.079714 0.000001 0.478729 +0.120832 0.000001 0.478729 +0.159284 0.000001 0.478729 +0.194868 0.000001 0.478729 +0.227530 0.000001 0.478729 +0.257434 0.000001 0.478729 +0.285092 0.000001 0.478729 +0.310738 0.000001 0.478729 +0.334585 0.000001 0.478729 +0.356818 0.000001 0.478729 +0.377602 0.000001 0.478729 +0.397079 0.000001 0.478729 +0.415373 0.000001 0.478729 +0.432594 0.000001 0.478729 +0.448839 0.000001 0.478729 +0.464192 0.000001 0.478729 +0.478729 0.000001 0.478729 +0.492515 0.000001 0.478729 +0.505612 0.000001 0.478729 +0.518072 0.000001 0.478729 +0.529943 0.000001 0.478729 +0.541266 0.000001 0.478729 +0.552083 0.000001 0.478729 +0.562427 0.000001 0.478729 +0.572331 0.000001 0.478729 +0.581823 0.000001 0.478729 +0.590929 0.000001 0.478729 +0.599674 0.000001 0.478729 +0.608079 0.000001 0.478729 +0.616166 0.000001 0.478729 +0.000001 0.037293 0.478729 +0.037293 0.037293 0.478729 +0.079714 0.037293 0.478729 +0.120832 0.037293 0.478729 +0.159284 0.037293 0.478729 +0.194868 0.037293 0.478729 +0.227530 0.037293 0.478729 +0.257434 0.037293 0.478729 +0.285092 0.037293 0.478729 +0.310738 0.037293 0.478729 +0.334585 0.037293 0.478729 +0.356818 0.037293 0.478729 +0.377602 0.037293 0.478729 +0.397079 0.037293 0.478729 +0.415373 0.037293 0.478729 +0.432594 0.037293 0.478729 +0.448839 0.037293 0.478729 +0.464192 0.037293 0.478729 +0.478729 0.037293 0.478729 +0.492515 0.037293 0.478729 +0.505612 0.037293 0.478729 +0.518072 0.037293 0.478729 +0.529943 0.037293 0.478729 +0.541266 0.037293 0.478729 +0.552083 0.037293 0.478729 +0.562427 0.037293 0.478729 +0.572331 0.037293 0.478729 +0.581823 0.037293 0.478729 +0.590929 0.037293 0.478729 +0.599674 0.037293 0.478729 +0.608079 0.037293 0.478729 +0.616166 0.037293 0.478729 +0.000001 0.079714 0.478729 +0.037293 0.079714 0.478729 +0.079714 0.079714 0.478729 +0.120832 0.079714 0.478729 +0.159284 0.079714 0.478729 +0.194868 0.079714 0.478729 +0.227530 0.079714 0.478729 +0.257434 0.079714 0.478729 +0.285092 0.079714 0.478729 +0.310738 0.079714 0.478729 +0.334585 0.079714 0.478729 +0.356818 0.079714 0.478729 +0.377602 0.079714 0.478729 +0.397079 0.079714 0.478729 +0.415373 0.079714 0.478729 +0.432594 0.079714 0.478729 +0.448839 0.079714 0.478729 +0.464192 0.079714 0.478729 +0.478729 0.079714 0.478729 +0.492515 0.079714 0.478729 +0.505612 0.079714 0.478729 +0.518072 0.079714 0.478729 +0.529943 0.079714 0.478729 +0.541266 0.079714 0.478729 +0.552083 0.079714 0.478729 +0.562427 0.079714 0.478729 +0.572331 0.079714 0.478729 +0.581823 0.079714 0.478729 +0.590929 0.079714 0.478729 +0.599674 0.079714 0.478729 +0.608079 0.079714 0.478729 +0.616166 0.079714 0.478729 +0.000001 0.120832 0.478729 +0.037293 0.120832 0.478729 +0.079714 0.120832 0.478729 +0.120832 0.120832 0.478729 +0.159284 0.120832 0.478729 +0.194868 0.120832 0.478729 +0.227530 0.120832 0.478729 +0.257434 0.120832 0.478729 +0.285092 0.120832 0.478729 +0.310738 0.120832 0.478729 +0.334585 0.120832 0.478729 +0.356818 0.120832 0.478729 +0.377602 0.120832 0.478729 +0.397079 0.120832 0.478729 +0.415373 0.120832 0.478729 +0.432594 0.120832 0.478729 +0.448839 0.120832 0.478729 +0.464192 0.120832 0.478729 +0.478729 0.120832 0.478729 +0.492515 0.120832 0.478729 +0.505612 0.120832 0.478729 +0.518072 0.120832 0.478729 +0.529943 0.120832 0.478729 +0.541266 0.120832 0.478729 +0.552083 0.120832 0.478729 +0.562427 0.120832 0.478729 +0.572331 0.120832 0.478729 +0.581823 0.120832 0.478729 +0.590929 0.120832 0.478729 +0.599674 0.120832 0.478729 +0.608079 0.120832 0.478729 +0.616166 0.120832 0.478729 +0.000001 0.159284 0.478729 +0.037293 0.159284 0.478729 +0.079714 0.159284 0.478729 +0.120832 0.159284 0.478729 +0.159284 0.159284 0.478729 +0.194868 0.159284 0.478729 +0.227530 0.159284 0.478729 +0.257434 0.159284 0.478729 +0.285092 0.159284 0.478729 +0.310738 0.159284 0.478729 +0.334585 0.159284 0.478729 +0.356818 0.159284 0.478729 +0.377602 0.159284 0.478729 +0.397079 0.159284 0.478729 +0.415373 0.159284 0.478729 +0.432594 0.159284 0.478729 +0.448839 0.159284 0.478729 +0.464192 0.159284 0.478729 +0.478729 0.159284 0.478729 +0.492515 0.159284 0.478729 +0.505612 0.159284 0.478729 +0.518072 0.159284 0.478729 +0.529943 0.159284 0.478729 +0.541266 0.159284 0.478729 +0.552083 0.159284 0.478729 +0.562427 0.159284 0.478729 +0.572331 0.159284 0.478729 +0.581823 0.159284 0.478729 +0.590929 0.159284 0.478729 +0.599674 0.159284 0.478729 +0.608079 0.159284 0.478729 +0.616166 0.159284 0.478729 +0.000001 0.194868 0.478729 +0.037293 0.194868 0.478729 +0.079714 0.194868 0.478729 +0.120832 0.194868 0.478729 +0.159284 0.194868 0.478729 +0.194868 0.194868 0.478729 +0.227530 0.194868 0.478729 +0.257434 0.194868 0.478729 +0.285092 0.194868 0.478729 +0.310738 0.194868 0.478729 +0.334585 0.194868 0.478729 +0.356818 0.194868 0.478729 +0.377602 0.194868 0.478729 +0.397079 0.194868 0.478729 +0.415373 0.194868 0.478729 +0.432594 0.194868 0.478729 +0.448839 0.194868 0.478729 +0.464192 0.194868 0.478729 +0.478729 0.194868 0.478729 +0.492515 0.194868 0.478729 +0.505612 0.194868 0.478729 +0.518072 0.194868 0.478729 +0.529943 0.194868 0.478729 +0.541266 0.194868 0.478729 +0.552083 0.194868 0.478729 +0.562427 0.194868 0.478729 +0.572331 0.194868 0.478729 +0.581823 0.194868 0.478729 +0.590929 0.194868 0.478729 +0.599674 0.194868 0.478729 +0.608079 0.194868 0.478729 +0.616166 0.194868 0.478729 +0.000001 0.227530 0.478729 +0.037293 0.227530 0.478729 +0.079714 0.227530 0.478729 +0.120832 0.227530 0.478729 +0.159284 0.227530 0.478729 +0.194868 0.227530 0.478729 +0.227530 0.227530 0.478729 +0.257434 0.227530 0.478729 +0.285092 0.227530 0.478729 +0.310738 0.227530 0.478729 +0.334585 0.227530 0.478729 +0.356818 0.227530 0.478729 +0.377602 0.227530 0.478729 +0.397079 0.227530 0.478729 +0.415373 0.227530 0.478729 +0.432594 0.227530 0.478729 +0.448839 0.227530 0.478729 +0.464192 0.227530 0.478729 +0.478729 0.227530 0.478729 +0.492515 0.227530 0.478729 +0.505612 0.227530 0.478729 +0.518072 0.227530 0.478729 +0.529943 0.227530 0.478729 +0.541266 0.227530 0.478729 +0.552083 0.227530 0.478729 +0.562427 0.227530 0.478729 +0.572331 0.227530 0.478729 +0.581823 0.227530 0.478729 +0.590929 0.227530 0.478729 +0.599674 0.227530 0.478729 +0.608079 0.227530 0.478729 +0.616166 0.227530 0.478729 +0.000001 0.257434 0.478729 +0.037293 0.257434 0.478729 +0.079714 0.257434 0.478729 +0.120832 0.257434 0.478729 +0.159284 0.257434 0.478729 +0.194868 0.257434 0.478729 +0.227530 0.257434 0.478729 +0.257434 0.257434 0.478729 +0.285092 0.257434 0.478729 +0.310738 0.257434 0.478729 +0.334585 0.257434 0.478729 +0.356818 0.257434 0.478729 +0.377602 0.257434 0.478729 +0.397079 0.257434 0.478729 +0.415373 0.257434 0.478729 +0.432594 0.257434 0.478729 +0.448839 0.257434 0.478729 +0.464192 0.257434 0.478729 +0.478729 0.257434 0.478729 +0.492515 0.257434 0.478729 +0.505612 0.257434 0.478729 +0.518072 0.257434 0.478729 +0.529943 0.257434 0.478729 +0.541266 0.257434 0.478729 +0.552083 0.257434 0.478729 +0.562427 0.257434 0.478729 +0.572331 0.257434 0.478729 +0.581823 0.257434 0.478729 +0.590929 0.257434 0.478729 +0.599674 0.257434 0.478729 +0.608079 0.257434 0.478729 +0.616166 0.257434 0.478729 +0.000001 0.285092 0.478729 +0.037293 0.285092 0.478729 +0.079714 0.285092 0.478729 +0.120832 0.285092 0.478729 +0.159284 0.285092 0.478729 +0.194868 0.285092 0.478729 +0.227530 0.285092 0.478729 +0.257434 0.285092 0.478729 +0.285092 0.285092 0.478729 +0.310738 0.285092 0.478729 +0.334585 0.285092 0.478729 +0.356818 0.285092 0.478729 +0.377602 0.285092 0.478729 +0.397079 0.285092 0.478729 +0.415373 0.285092 0.478729 +0.432594 0.285092 0.478729 +0.448839 0.285092 0.478729 +0.464192 0.285092 0.478729 +0.478729 0.285092 0.478729 +0.492515 0.285092 0.478729 +0.505612 0.285092 0.478729 +0.518072 0.285092 0.478729 +0.529943 0.285092 0.478729 +0.541266 0.285092 0.478729 +0.552083 0.285092 0.478729 +0.562427 0.285092 0.478729 +0.572331 0.285092 0.478729 +0.581823 0.285092 0.478729 +0.590929 0.285092 0.478729 +0.599674 0.285092 0.478729 +0.608079 0.285092 0.478729 +0.616166 0.285092 0.478729 +0.000001 0.310738 0.478729 +0.037293 0.310738 0.478729 +0.079714 0.310738 0.478729 +0.120832 0.310738 0.478729 +0.159284 0.310738 0.478729 +0.194868 0.310738 0.478729 +0.227530 0.310738 0.478729 +0.257434 0.310738 0.478729 +0.285092 0.310738 0.478729 +0.310738 0.310738 0.478729 +0.334585 0.310738 0.478729 +0.356818 0.310738 0.478729 +0.377602 0.310738 0.478729 +0.397079 0.310738 0.478729 +0.415373 0.310738 0.478729 +0.432594 0.310738 0.478729 +0.448839 0.310738 0.478729 +0.464192 0.310738 0.478729 +0.478729 0.310738 0.478729 +0.492515 0.310738 0.478729 +0.505612 0.310738 0.478729 +0.518072 0.310738 0.478729 +0.529943 0.310738 0.478729 +0.541266 0.310738 0.478729 +0.552083 0.310738 0.478729 +0.562427 0.310738 0.478729 +0.572331 0.310738 0.478729 +0.581823 0.310738 0.478729 +0.590929 0.310738 0.478729 +0.599674 0.310738 0.478729 +0.608079 0.310738 0.478729 +0.616166 0.310738 0.478729 +0.000001 0.334585 0.478729 +0.037293 0.334585 0.478729 +0.079714 0.334585 0.478729 +0.120832 0.334585 0.478729 +0.159284 0.334585 0.478729 +0.194868 0.334585 0.478729 +0.227530 0.334585 0.478729 +0.257434 0.334585 0.478729 +0.285092 0.334585 0.478729 +0.310738 0.334585 0.478729 +0.334585 0.334585 0.478729 +0.356818 0.334585 0.478729 +0.377602 0.334585 0.478729 +0.397079 0.334585 0.478729 +0.415373 0.334585 0.478729 +0.432594 0.334585 0.478729 +0.448839 0.334585 0.478729 +0.464192 0.334585 0.478729 +0.478729 0.334585 0.478729 +0.492515 0.334585 0.478729 +0.505612 0.334585 0.478729 +0.518072 0.334585 0.478729 +0.529943 0.334585 0.478729 +0.541266 0.334585 0.478729 +0.552083 0.334585 0.478729 +0.562427 0.334585 0.478729 +0.572331 0.334585 0.478729 +0.581823 0.334585 0.478729 +0.590929 0.334585 0.478729 +0.599674 0.334585 0.478729 +0.608079 0.334585 0.478729 +0.616166 0.334585 0.478729 +0.000001 0.356818 0.478729 +0.037293 0.356818 0.478729 +0.079714 0.356818 0.478729 +0.120832 0.356818 0.478729 +0.159284 0.356818 0.478729 +0.194868 0.356818 0.478729 +0.227530 0.356818 0.478729 +0.257434 0.356818 0.478729 +0.285092 0.356818 0.478729 +0.310738 0.356818 0.478729 +0.334585 0.356818 0.478729 +0.356818 0.356818 0.478729 +0.377602 0.356818 0.478729 +0.397079 0.356818 0.478729 +0.415373 0.356818 0.478729 +0.432594 0.356818 0.478729 +0.448839 0.356818 0.478729 +0.464192 0.356818 0.478729 +0.478729 0.356818 0.478729 +0.492515 0.356818 0.478729 +0.505612 0.356818 0.478729 +0.518072 0.356818 0.478729 +0.529943 0.356818 0.478729 +0.541266 0.356818 0.478729 +0.552083 0.356818 0.478729 +0.562427 0.356818 0.478729 +0.572331 0.356818 0.478729 +0.581823 0.356818 0.478729 +0.590929 0.356818 0.478729 +0.599674 0.356818 0.478729 +0.608079 0.356818 0.478729 +0.616166 0.356818 0.478729 +0.000001 0.377602 0.478729 +0.037293 0.377602 0.478729 +0.079714 0.377602 0.478729 +0.120832 0.377602 0.478729 +0.159284 0.377602 0.478729 +0.194868 0.377602 0.478729 +0.227530 0.377602 0.478729 +0.257434 0.377602 0.478729 +0.285092 0.377602 0.478729 +0.310738 0.377602 0.478729 +0.334585 0.377602 0.478729 +0.356818 0.377602 0.478729 +0.377602 0.377602 0.478729 +0.397079 0.377602 0.478729 +0.415373 0.377602 0.478729 +0.432594 0.377602 0.478729 +0.448839 0.377602 0.478729 +0.464192 0.377602 0.478729 +0.478729 0.377602 0.478729 +0.492515 0.377602 0.478729 +0.505612 0.377602 0.478729 +0.518072 0.377602 0.478729 +0.529943 0.377602 0.478729 +0.541266 0.377602 0.478729 +0.552083 0.377602 0.478729 +0.562427 0.377602 0.478729 +0.572331 0.377602 0.478729 +0.581823 0.377602 0.478729 +0.590929 0.377602 0.478729 +0.599674 0.377602 0.478729 +0.608079 0.377602 0.478729 +0.616166 0.377602 0.478729 +0.000001 0.397079 0.478729 +0.037293 0.397079 0.478729 +0.079714 0.397079 0.478729 +0.120832 0.397079 0.478729 +0.159284 0.397079 0.478729 +0.194868 0.397079 0.478729 +0.227530 0.397079 0.478729 +0.257434 0.397079 0.478729 +0.285092 0.397079 0.478729 +0.310738 0.397079 0.478729 +0.334585 0.397079 0.478729 +0.356818 0.397079 0.478729 +0.377602 0.397079 0.478729 +0.397079 0.397079 0.478729 +0.415373 0.397079 0.478729 +0.432594 0.397079 0.478729 +0.448839 0.397079 0.478729 +0.464192 0.397079 0.478729 +0.478729 0.397079 0.478729 +0.492515 0.397079 0.478729 +0.505612 0.397079 0.478729 +0.518072 0.397079 0.478729 +0.529943 0.397079 0.478729 +0.541266 0.397079 0.478729 +0.552083 0.397079 0.478729 +0.562427 0.397079 0.478729 +0.572331 0.397079 0.478729 +0.581823 0.397079 0.478729 +0.590929 0.397079 0.478729 +0.599674 0.397079 0.478729 +0.608079 0.397079 0.478729 +0.616166 0.397079 0.478729 +0.000001 0.415373 0.478729 +0.037293 0.415373 0.478729 +0.079714 0.415373 0.478729 +0.120832 0.415373 0.478729 +0.159284 0.415373 0.478729 +0.194868 0.415373 0.478729 +0.227530 0.415373 0.478729 +0.257434 0.415373 0.478729 +0.285092 0.415373 0.478729 +0.310738 0.415373 0.478729 +0.334585 0.415373 0.478729 +0.356818 0.415373 0.478729 +0.377602 0.415373 0.478729 +0.397079 0.415373 0.478729 +0.415373 0.415373 0.478729 +0.432594 0.415373 0.478729 +0.448839 0.415373 0.478729 +0.464192 0.415373 0.478729 +0.478729 0.415373 0.478729 +0.492515 0.415373 0.478729 +0.505612 0.415373 0.478729 +0.518072 0.415373 0.478729 +0.529943 0.415373 0.478729 +0.541266 0.415373 0.478729 +0.552083 0.415373 0.478729 +0.562427 0.415373 0.478729 +0.572331 0.415373 0.478729 +0.581823 0.415373 0.478729 +0.590929 0.415373 0.478729 +0.599674 0.415373 0.478729 +0.608079 0.415373 0.478729 +0.616166 0.415373 0.478729 +0.000001 0.432594 0.478729 +0.037293 0.432594 0.478729 +0.079714 0.432594 0.478729 +0.120832 0.432594 0.478729 +0.159284 0.432594 0.478729 +0.194868 0.432594 0.478729 +0.227530 0.432594 0.478729 +0.257434 0.432594 0.478729 +0.285092 0.432594 0.478729 +0.310738 0.432594 0.478729 +0.334585 0.432594 0.478729 +0.356818 0.432594 0.478729 +0.377602 0.432594 0.478729 +0.397079 0.432594 0.478729 +0.415373 0.432594 0.478729 +0.432594 0.432594 0.478729 +0.448839 0.432594 0.478729 +0.464192 0.432594 0.478729 +0.478729 0.432594 0.478729 +0.492515 0.432594 0.478729 +0.505612 0.432594 0.478729 +0.518072 0.432594 0.478729 +0.529943 0.432594 0.478729 +0.541266 0.432594 0.478729 +0.552083 0.432594 0.478729 +0.562427 0.432594 0.478729 +0.572331 0.432594 0.478729 +0.581823 0.432594 0.478729 +0.590929 0.432594 0.478729 +0.599674 0.432594 0.478729 +0.608079 0.432594 0.478729 +0.616166 0.432594 0.478729 +0.000001 0.448839 0.478729 +0.037293 0.448839 0.478729 +0.079714 0.448839 0.478729 +0.120832 0.448839 0.478729 +0.159284 0.448839 0.478729 +0.194868 0.448839 0.478729 +0.227530 0.448839 0.478729 +0.257434 0.448839 0.478729 +0.285092 0.448839 0.478729 +0.310738 0.448839 0.478729 +0.334585 0.448839 0.478729 +0.356818 0.448839 0.478729 +0.377602 0.448839 0.478729 +0.397079 0.448839 0.478729 +0.415373 0.448839 0.478729 +0.432594 0.448839 0.478729 +0.448839 0.448839 0.478729 +0.464192 0.448839 0.478729 +0.478729 0.448839 0.478729 +0.492515 0.448839 0.478729 +0.505612 0.448839 0.478729 +0.518072 0.448839 0.478729 +0.529943 0.448839 0.478729 +0.541266 0.448839 0.478729 +0.552083 0.448839 0.478729 +0.562427 0.448839 0.478729 +0.572331 0.448839 0.478729 +0.581823 0.448839 0.478729 +0.590929 0.448839 0.478729 +0.599674 0.448839 0.478729 +0.608079 0.448839 0.478729 +0.616166 0.448839 0.478729 +0.000001 0.464192 0.478729 +0.037293 0.464192 0.478729 +0.079714 0.464192 0.478729 +0.120832 0.464192 0.478729 +0.159284 0.464192 0.478729 +0.194868 0.464192 0.478729 +0.227530 0.464192 0.478729 +0.257434 0.464192 0.478729 +0.285092 0.464192 0.478729 +0.310738 0.464192 0.478729 +0.334585 0.464192 0.478729 +0.356818 0.464192 0.478729 +0.377602 0.464192 0.478729 +0.397079 0.464192 0.478729 +0.415373 0.464192 0.478729 +0.432594 0.464192 0.478729 +0.448839 0.464192 0.478729 +0.464192 0.464192 0.478729 +0.478729 0.464192 0.478729 +0.492515 0.464192 0.478729 +0.505612 0.464192 0.478729 +0.518072 0.464192 0.478729 +0.529943 0.464192 0.478729 +0.541266 0.464192 0.478729 +0.552083 0.464192 0.478729 +0.562427 0.464192 0.478729 +0.572331 0.464192 0.478729 +0.581823 0.464192 0.478729 +0.590929 0.464192 0.478729 +0.599674 0.464192 0.478729 +0.608079 0.464192 0.478729 +0.616166 0.464192 0.478729 +0.000001 0.478729 0.478729 +0.037293 0.478729 0.478729 +0.079714 0.478729 0.478729 +0.120832 0.478729 0.478729 +0.159284 0.478729 0.478729 +0.194868 0.478729 0.478729 +0.227530 0.478729 0.478729 +0.257434 0.478729 0.478729 +0.285092 0.478729 0.478729 +0.310738 0.478729 0.478729 +0.334585 0.478729 0.478729 +0.356818 0.478729 0.478729 +0.377602 0.478729 0.478729 +0.397079 0.478729 0.478729 +0.415373 0.478729 0.478729 +0.432594 0.478729 0.478729 +0.448839 0.478729 0.478729 +0.464192 0.478729 0.478729 +0.478729 0.478729 0.478729 +0.492515 0.478729 0.478729 +0.505612 0.478729 0.478729 +0.518072 0.478729 0.478729 +0.529943 0.478729 0.478729 +0.541266 0.478729 0.478729 +0.552083 0.478729 0.478729 +0.562427 0.478729 0.478729 +0.572331 0.478729 0.478729 +0.581823 0.478729 0.478729 +0.590929 0.478729 0.478729 +0.599674 0.478729 0.478729 +0.608079 0.478729 0.478729 +0.616166 0.478729 0.478729 +0.000001 0.492515 0.478729 +0.037293 0.492515 0.478729 +0.079714 0.492515 0.478729 +0.120832 0.492515 0.478729 +0.159284 0.492515 0.478729 +0.194868 0.492515 0.478729 +0.227530 0.492515 0.478729 +0.257434 0.492515 0.478729 +0.285092 0.492515 0.478729 +0.310738 0.492515 0.478729 +0.334585 0.492515 0.478729 +0.356818 0.492515 0.478729 +0.377602 0.492515 0.478729 +0.397079 0.492515 0.478729 +0.415373 0.492515 0.478729 +0.432594 0.492515 0.478729 +0.448839 0.492515 0.478729 +0.464192 0.492515 0.478729 +0.478729 0.492515 0.478729 +0.492515 0.492515 0.478729 +0.505612 0.492515 0.478729 +0.518072 0.492515 0.478729 +0.529943 0.492515 0.478729 +0.541266 0.492515 0.478729 +0.552083 0.492515 0.478729 +0.562427 0.492515 0.478729 +0.572331 0.492515 0.478729 +0.581823 0.492515 0.478729 +0.590929 0.492515 0.478729 +0.599674 0.492515 0.478729 +0.608079 0.492515 0.478729 +0.616166 0.492515 0.478729 +0.000001 0.505612 0.478729 +0.037293 0.505612 0.478729 +0.079714 0.505612 0.478729 +0.120832 0.505612 0.478729 +0.159284 0.505612 0.478729 +0.194868 0.505612 0.478729 +0.227530 0.505612 0.478729 +0.257434 0.505612 0.478729 +0.285092 0.505612 0.478729 +0.310738 0.505612 0.478729 +0.334585 0.505612 0.478729 +0.356818 0.505612 0.478729 +0.377602 0.505612 0.478729 +0.397079 0.505612 0.478729 +0.415373 0.505612 0.478729 +0.432594 0.505612 0.478729 +0.448839 0.505612 0.478729 +0.464192 0.505612 0.478729 +0.478729 0.505612 0.478729 +0.492515 0.505612 0.478729 +0.505612 0.505612 0.478729 +0.518072 0.505612 0.478729 +0.529943 0.505612 0.478729 +0.541266 0.505612 0.478729 +0.552083 0.505612 0.478729 +0.562427 0.505612 0.478729 +0.572331 0.505612 0.478729 +0.581823 0.505612 0.478729 +0.590929 0.505612 0.478729 +0.599674 0.505612 0.478729 +0.608079 0.505612 0.478729 +0.616166 0.505612 0.478729 +0.000001 0.518072 0.478729 +0.037293 0.518072 0.478729 +0.079714 0.518072 0.478729 +0.120832 0.518072 0.478729 +0.159284 0.518072 0.478729 +0.194868 0.518072 0.478729 +0.227530 0.518072 0.478729 +0.257434 0.518072 0.478729 +0.285092 0.518072 0.478729 +0.310738 0.518072 0.478729 +0.334585 0.518072 0.478729 +0.356818 0.518072 0.478729 +0.377602 0.518072 0.478729 +0.397079 0.518072 0.478729 +0.415373 0.518072 0.478729 +0.432594 0.518072 0.478729 +0.448839 0.518072 0.478729 +0.464192 0.518072 0.478729 +0.478729 0.518072 0.478729 +0.492515 0.518072 0.478729 +0.505612 0.518072 0.478729 +0.518072 0.518072 0.478729 +0.529943 0.518072 0.478729 +0.541266 0.518072 0.478729 +0.552083 0.518072 0.478729 +0.562427 0.518072 0.478729 +0.572331 0.518072 0.478729 +0.581823 0.518072 0.478729 +0.590929 0.518072 0.478729 +0.599674 0.518072 0.478729 +0.608079 0.518072 0.478729 +0.616166 0.518072 0.478729 +0.000001 0.529943 0.478729 +0.037293 0.529943 0.478729 +0.079714 0.529943 0.478729 +0.120832 0.529943 0.478729 +0.159284 0.529943 0.478729 +0.194868 0.529943 0.478729 +0.227530 0.529943 0.478729 +0.257434 0.529943 0.478729 +0.285092 0.529943 0.478729 +0.310738 0.529943 0.478729 +0.334585 0.529943 0.478729 +0.356818 0.529943 0.478729 +0.377602 0.529943 0.478729 +0.397079 0.529943 0.478729 +0.415373 0.529943 0.478729 +0.432594 0.529943 0.478729 +0.448839 0.529943 0.478729 +0.464192 0.529943 0.478729 +0.478729 0.529943 0.478729 +0.492515 0.529943 0.478729 +0.505612 0.529943 0.478729 +0.518072 0.529943 0.478729 +0.529943 0.529943 0.478729 +0.541266 0.529943 0.478729 +0.552083 0.529943 0.478729 +0.562427 0.529943 0.478729 +0.572331 0.529943 0.478729 +0.581823 0.529943 0.478729 +0.590929 0.529943 0.478729 +0.599674 0.529943 0.478729 +0.608079 0.529943 0.478729 +0.616166 0.529943 0.478729 +0.000001 0.541266 0.478729 +0.037293 0.541266 0.478729 +0.079714 0.541266 0.478729 +0.120832 0.541266 0.478729 +0.159284 0.541266 0.478729 +0.194868 0.541266 0.478729 +0.227530 0.541266 0.478729 +0.257434 0.541266 0.478729 +0.285092 0.541266 0.478729 +0.310738 0.541266 0.478729 +0.334585 0.541266 0.478729 +0.356818 0.541266 0.478729 +0.377602 0.541266 0.478729 +0.397079 0.541266 0.478729 +0.415373 0.541266 0.478729 +0.432594 0.541266 0.478729 +0.448839 0.541266 0.478729 +0.464192 0.541266 0.478729 +0.478729 0.541266 0.478729 +0.492515 0.541266 0.478729 +0.505612 0.541266 0.478729 +0.518072 0.541266 0.478729 +0.529943 0.541266 0.478729 +0.541266 0.541266 0.478729 +0.552083 0.541266 0.478729 +0.562427 0.541266 0.478729 +0.572331 0.541266 0.478729 +0.581823 0.541266 0.478729 +0.590929 0.541266 0.478729 +0.599674 0.541266 0.478729 +0.608079 0.541266 0.478729 +0.616166 0.541266 0.478729 +0.000001 0.552083 0.478729 +0.037293 0.552083 0.478729 +0.079714 0.552083 0.478729 +0.120832 0.552083 0.478729 +0.159284 0.552083 0.478729 +0.194868 0.552083 0.478729 +0.227530 0.552083 0.478729 +0.257434 0.552083 0.478729 +0.285092 0.552083 0.478729 +0.310738 0.552083 0.478729 +0.334585 0.552083 0.478729 +0.356818 0.552083 0.478729 +0.377602 0.552083 0.478729 +0.397079 0.552083 0.478729 +0.415373 0.552083 0.478729 +0.432594 0.552083 0.478729 +0.448839 0.552083 0.478729 +0.464192 0.552083 0.478729 +0.478729 0.552083 0.478729 +0.492515 0.552083 0.478729 +0.505612 0.552083 0.478729 +0.518072 0.552083 0.478729 +0.529943 0.552083 0.478729 +0.541266 0.552083 0.478729 +0.552083 0.552083 0.478729 +0.562427 0.552083 0.478729 +0.572331 0.552083 0.478729 +0.581823 0.552083 0.478729 +0.590929 0.552083 0.478729 +0.599674 0.552083 0.478729 +0.608079 0.552083 0.478729 +0.616166 0.552083 0.478729 +0.000001 0.562427 0.478729 +0.037293 0.562427 0.478729 +0.079714 0.562427 0.478729 +0.120832 0.562427 0.478729 +0.159284 0.562427 0.478729 +0.194868 0.562427 0.478729 +0.227530 0.562427 0.478729 +0.257434 0.562427 0.478729 +0.285092 0.562427 0.478729 +0.310738 0.562427 0.478729 +0.334585 0.562427 0.478729 +0.356818 0.562427 0.478729 +0.377602 0.562427 0.478729 +0.397079 0.562427 0.478729 +0.415373 0.562427 0.478729 +0.432594 0.562427 0.478729 +0.448839 0.562427 0.478729 +0.464192 0.562427 0.478729 +0.478729 0.562427 0.478729 +0.492515 0.562427 0.478729 +0.505612 0.562427 0.478729 +0.518072 0.562427 0.478729 +0.529943 0.562427 0.478729 +0.541266 0.562427 0.478729 +0.552083 0.562427 0.478729 +0.562427 0.562427 0.478729 +0.572331 0.562427 0.478729 +0.581823 0.562427 0.478729 +0.590929 0.562427 0.478729 +0.599674 0.562427 0.478729 +0.608079 0.562427 0.478729 +0.616166 0.562427 0.478729 +0.000001 0.572331 0.478729 +0.037293 0.572331 0.478729 +0.079714 0.572331 0.478729 +0.120832 0.572331 0.478729 +0.159284 0.572331 0.478729 +0.194868 0.572331 0.478729 +0.227530 0.572331 0.478729 +0.257434 0.572331 0.478729 +0.285092 0.572331 0.478729 +0.310738 0.572331 0.478729 +0.334585 0.572331 0.478729 +0.356818 0.572331 0.478729 +0.377602 0.572331 0.478729 +0.397079 0.572331 0.478729 +0.415373 0.572331 0.478729 +0.432594 0.572331 0.478729 +0.448839 0.572331 0.478729 +0.464192 0.572331 0.478729 +0.478729 0.572331 0.478729 +0.492515 0.572331 0.478729 +0.505612 0.572331 0.478729 +0.518072 0.572331 0.478729 +0.529943 0.572331 0.478729 +0.541266 0.572331 0.478729 +0.552083 0.572331 0.478729 +0.562427 0.572331 0.478729 +0.572331 0.572331 0.478729 +0.581823 0.572331 0.478729 +0.590929 0.572331 0.478729 +0.599674 0.572331 0.478729 +0.608079 0.572331 0.478729 +0.616166 0.572331 0.478729 +0.000001 0.581823 0.478729 +0.037293 0.581823 0.478729 +0.079714 0.581823 0.478729 +0.120832 0.581823 0.478729 +0.159284 0.581823 0.478729 +0.194868 0.581823 0.478729 +0.227530 0.581823 0.478729 +0.257434 0.581823 0.478729 +0.285092 0.581823 0.478729 +0.310738 0.581823 0.478729 +0.334585 0.581823 0.478729 +0.356818 0.581823 0.478729 +0.377602 0.581823 0.478729 +0.397079 0.581823 0.478729 +0.415373 0.581823 0.478729 +0.432594 0.581823 0.478729 +0.448839 0.581823 0.478729 +0.464192 0.581823 0.478729 +0.478729 0.581823 0.478729 +0.492515 0.581823 0.478729 +0.505612 0.581823 0.478729 +0.518072 0.581823 0.478729 +0.529943 0.581823 0.478729 +0.541266 0.581823 0.478729 +0.552083 0.581823 0.478729 +0.562427 0.581823 0.478729 +0.572331 0.581823 0.478729 +0.581823 0.581823 0.478729 +0.590929 0.581823 0.478729 +0.599674 0.581823 0.478729 +0.608079 0.581823 0.478729 +0.616166 0.581823 0.478729 +0.000001 0.590929 0.478729 +0.037293 0.590929 0.478729 +0.079714 0.590929 0.478729 +0.120832 0.590929 0.478729 +0.159284 0.590929 0.478729 +0.194868 0.590929 0.478729 +0.227530 0.590929 0.478729 +0.257434 0.590929 0.478729 +0.285092 0.590929 0.478729 +0.310738 0.590929 0.478729 +0.334585 0.590929 0.478729 +0.356818 0.590929 0.478729 +0.377602 0.590929 0.478729 +0.397079 0.590929 0.478729 +0.415373 0.590929 0.478729 +0.432594 0.590929 0.478729 +0.448839 0.590929 0.478729 +0.464192 0.590929 0.478729 +0.478729 0.590929 0.478729 +0.492515 0.590929 0.478729 +0.505612 0.590929 0.478729 +0.518072 0.590929 0.478729 +0.529943 0.590929 0.478729 +0.541266 0.590929 0.478729 +0.552083 0.590929 0.478729 +0.562427 0.590929 0.478729 +0.572331 0.590929 0.478729 +0.581823 0.590929 0.478729 +0.590929 0.590929 0.478729 +0.599674 0.590929 0.478729 +0.608079 0.590929 0.478729 +0.616166 0.590929 0.478729 +0.000001 0.599674 0.478729 +0.037293 0.599674 0.478729 +0.079714 0.599674 0.478729 +0.120832 0.599674 0.478729 +0.159284 0.599674 0.478729 +0.194868 0.599674 0.478729 +0.227530 0.599674 0.478729 +0.257434 0.599674 0.478729 +0.285092 0.599674 0.478729 +0.310738 0.599674 0.478729 +0.334585 0.599674 0.478729 +0.356818 0.599674 0.478729 +0.377602 0.599674 0.478729 +0.397079 0.599674 0.478729 +0.415373 0.599674 0.478729 +0.432594 0.599674 0.478729 +0.448839 0.599674 0.478729 +0.464192 0.599674 0.478729 +0.478729 0.599674 0.478729 +0.492515 0.599674 0.478729 +0.505612 0.599674 0.478729 +0.518072 0.599674 0.478729 +0.529943 0.599674 0.478729 +0.541266 0.599674 0.478729 +0.552083 0.599674 0.478729 +0.562427 0.599674 0.478729 +0.572331 0.599674 0.478729 +0.581823 0.599674 0.478729 +0.590929 0.599674 0.478729 +0.599674 0.599674 0.478729 +0.608079 0.599674 0.478729 +0.616166 0.599674 0.478729 +0.000001 0.608079 0.478729 +0.037293 0.608079 0.478729 +0.079714 0.608079 0.478729 +0.120832 0.608079 0.478729 +0.159284 0.608079 0.478729 +0.194868 0.608079 0.478729 +0.227530 0.608079 0.478729 +0.257434 0.608079 0.478729 +0.285092 0.608079 0.478729 +0.310738 0.608079 0.478729 +0.334585 0.608079 0.478729 +0.356818 0.608079 0.478729 +0.377602 0.608079 0.478729 +0.397079 0.608079 0.478729 +0.415373 0.608079 0.478729 +0.432594 0.608079 0.478729 +0.448839 0.608079 0.478729 +0.464192 0.608079 0.478729 +0.478729 0.608079 0.478729 +0.492515 0.608079 0.478729 +0.505612 0.608079 0.478729 +0.518072 0.608079 0.478729 +0.529943 0.608079 0.478729 +0.541266 0.608079 0.478729 +0.552083 0.608079 0.478729 +0.562427 0.608079 0.478729 +0.572331 0.608079 0.478729 +0.581823 0.608079 0.478729 +0.590929 0.608079 0.478729 +0.599674 0.608079 0.478729 +0.608079 0.608079 0.478729 +0.616166 0.608079 0.478729 +0.000001 0.616166 0.478729 +0.037293 0.616166 0.478729 +0.079714 0.616166 0.478729 +0.120832 0.616166 0.478729 +0.159284 0.616166 0.478729 +0.194868 0.616166 0.478729 +0.227530 0.616166 0.478729 +0.257434 0.616166 0.478729 +0.285092 0.616166 0.478729 +0.310738 0.616166 0.478729 +0.334585 0.616166 0.478729 +0.356818 0.616166 0.478729 +0.377602 0.616166 0.478729 +0.397079 0.616166 0.478729 +0.415373 0.616166 0.478729 +0.432594 0.616166 0.478729 +0.448839 0.616166 0.478729 +0.464192 0.616166 0.478729 +0.478729 0.616166 0.478729 +0.492515 0.616166 0.478729 +0.505612 0.616166 0.478729 +0.518072 0.616166 0.478729 +0.529943 0.616166 0.478729 +0.541266 0.616166 0.478729 +0.552083 0.616166 0.478729 +0.562427 0.616166 0.478729 +0.572331 0.616166 0.478729 +0.581823 0.616166 0.478729 +0.590929 0.616166 0.478729 +0.599674 0.616166 0.478729 +0.608079 0.616166 0.478729 +0.616166 0.616166 0.478729 +0.000001 0.000001 0.492515 +0.037293 0.000001 0.492515 +0.079714 0.000001 0.492515 +0.120832 0.000001 0.492515 +0.159284 0.000001 0.492515 +0.194868 0.000001 0.492515 +0.227530 0.000001 0.492515 +0.257434 0.000001 0.492515 +0.285092 0.000001 0.492515 +0.310738 0.000001 0.492515 +0.334585 0.000001 0.492515 +0.356818 0.000001 0.492515 +0.377602 0.000001 0.492515 +0.397079 0.000001 0.492515 +0.415373 0.000001 0.492515 +0.432594 0.000001 0.492515 +0.448839 0.000001 0.492515 +0.464192 0.000001 0.492515 +0.478729 0.000001 0.492515 +0.492515 0.000001 0.492515 +0.505612 0.000001 0.492515 +0.518072 0.000001 0.492515 +0.529943 0.000001 0.492515 +0.541266 0.000001 0.492515 +0.552083 0.000001 0.492515 +0.562427 0.000001 0.492515 +0.572331 0.000001 0.492515 +0.581823 0.000001 0.492515 +0.590929 0.000001 0.492515 +0.599674 0.000001 0.492515 +0.608079 0.000001 0.492515 +0.616166 0.000001 0.492515 +0.000001 0.037293 0.492515 +0.037293 0.037293 0.492515 +0.079714 0.037293 0.492515 +0.120832 0.037293 0.492515 +0.159284 0.037293 0.492515 +0.194868 0.037293 0.492515 +0.227530 0.037293 0.492515 +0.257434 0.037293 0.492515 +0.285092 0.037293 0.492515 +0.310738 0.037293 0.492515 +0.334585 0.037293 0.492515 +0.356818 0.037293 0.492515 +0.377602 0.037293 0.492515 +0.397079 0.037293 0.492515 +0.415373 0.037293 0.492515 +0.432594 0.037293 0.492515 +0.448839 0.037293 0.492515 +0.464192 0.037293 0.492515 +0.478729 0.037293 0.492515 +0.492515 0.037293 0.492515 +0.505612 0.037293 0.492515 +0.518072 0.037293 0.492515 +0.529943 0.037293 0.492515 +0.541266 0.037293 0.492515 +0.552083 0.037293 0.492515 +0.562427 0.037293 0.492515 +0.572331 0.037293 0.492515 +0.581823 0.037293 0.492515 +0.590929 0.037293 0.492515 +0.599674 0.037293 0.492515 +0.608079 0.037293 0.492515 +0.616166 0.037293 0.492515 +0.000001 0.079714 0.492515 +0.037293 0.079714 0.492515 +0.079714 0.079714 0.492515 +0.120832 0.079714 0.492515 +0.159284 0.079714 0.492515 +0.194868 0.079714 0.492515 +0.227530 0.079714 0.492515 +0.257434 0.079714 0.492515 +0.285092 0.079714 0.492515 +0.310738 0.079714 0.492515 +0.334585 0.079714 0.492515 +0.356818 0.079714 0.492515 +0.377602 0.079714 0.492515 +0.397079 0.079714 0.492515 +0.415373 0.079714 0.492515 +0.432594 0.079714 0.492515 +0.448839 0.079714 0.492515 +0.464192 0.079714 0.492515 +0.478729 0.079714 0.492515 +0.492515 0.079714 0.492515 +0.505612 0.079714 0.492515 +0.518072 0.079714 0.492515 +0.529943 0.079714 0.492515 +0.541266 0.079714 0.492515 +0.552083 0.079714 0.492515 +0.562427 0.079714 0.492515 +0.572331 0.079714 0.492515 +0.581823 0.079714 0.492515 +0.590929 0.079714 0.492515 +0.599674 0.079714 0.492515 +0.608079 0.079714 0.492515 +0.616166 0.079714 0.492515 +0.000001 0.120832 0.492515 +0.037293 0.120832 0.492515 +0.079714 0.120832 0.492515 +0.120832 0.120832 0.492515 +0.159284 0.120832 0.492515 +0.194868 0.120832 0.492515 +0.227530 0.120832 0.492515 +0.257434 0.120832 0.492515 +0.285092 0.120832 0.492515 +0.310738 0.120832 0.492515 +0.334585 0.120832 0.492515 +0.356818 0.120832 0.492515 +0.377602 0.120832 0.492515 +0.397079 0.120832 0.492515 +0.415373 0.120832 0.492515 +0.432594 0.120832 0.492515 +0.448839 0.120832 0.492515 +0.464192 0.120832 0.492515 +0.478729 0.120832 0.492515 +0.492515 0.120832 0.492515 +0.505612 0.120832 0.492515 +0.518072 0.120832 0.492515 +0.529943 0.120832 0.492515 +0.541266 0.120832 0.492515 +0.552083 0.120832 0.492515 +0.562427 0.120832 0.492515 +0.572331 0.120832 0.492515 +0.581823 0.120832 0.492515 +0.590929 0.120832 0.492515 +0.599674 0.120832 0.492515 +0.608079 0.120832 0.492515 +0.616166 0.120832 0.492515 +0.000001 0.159284 0.492515 +0.037293 0.159284 0.492515 +0.079714 0.159284 0.492515 +0.120832 0.159284 0.492515 +0.159284 0.159284 0.492515 +0.194868 0.159284 0.492515 +0.227530 0.159284 0.492515 +0.257434 0.159284 0.492515 +0.285092 0.159284 0.492515 +0.310738 0.159284 0.492515 +0.334585 0.159284 0.492515 +0.356818 0.159284 0.492515 +0.377602 0.159284 0.492515 +0.397079 0.159284 0.492515 +0.415373 0.159284 0.492515 +0.432594 0.159284 0.492515 +0.448839 0.159284 0.492515 +0.464192 0.159284 0.492515 +0.478729 0.159284 0.492515 +0.492515 0.159284 0.492515 +0.505612 0.159284 0.492515 +0.518072 0.159284 0.492515 +0.529943 0.159284 0.492515 +0.541266 0.159284 0.492515 +0.552083 0.159284 0.492515 +0.562427 0.159284 0.492515 +0.572331 0.159284 0.492515 +0.581823 0.159284 0.492515 +0.590929 0.159284 0.492515 +0.599674 0.159284 0.492515 +0.608079 0.159284 0.492515 +0.616166 0.159284 0.492515 +0.000001 0.194868 0.492515 +0.037293 0.194868 0.492515 +0.079714 0.194868 0.492515 +0.120832 0.194868 0.492515 +0.159284 0.194868 0.492515 +0.194868 0.194868 0.492515 +0.227530 0.194868 0.492515 +0.257434 0.194868 0.492515 +0.285092 0.194868 0.492515 +0.310738 0.194868 0.492515 +0.334585 0.194868 0.492515 +0.356818 0.194868 0.492515 +0.377602 0.194868 0.492515 +0.397079 0.194868 0.492515 +0.415373 0.194868 0.492515 +0.432594 0.194868 0.492515 +0.448839 0.194868 0.492515 +0.464192 0.194868 0.492515 +0.478729 0.194868 0.492515 +0.492515 0.194868 0.492515 +0.505612 0.194868 0.492515 +0.518072 0.194868 0.492515 +0.529943 0.194868 0.492515 +0.541266 0.194868 0.492515 +0.552083 0.194868 0.492515 +0.562427 0.194868 0.492515 +0.572331 0.194868 0.492515 +0.581823 0.194868 0.492515 +0.590929 0.194868 0.492515 +0.599674 0.194868 0.492515 +0.608079 0.194868 0.492515 +0.616166 0.194868 0.492515 +0.000001 0.227530 0.492515 +0.037293 0.227530 0.492515 +0.079714 0.227530 0.492515 +0.120832 0.227530 0.492515 +0.159284 0.227530 0.492515 +0.194868 0.227530 0.492515 +0.227530 0.227530 0.492515 +0.257434 0.227530 0.492515 +0.285092 0.227530 0.492515 +0.310738 0.227530 0.492515 +0.334585 0.227530 0.492515 +0.356818 0.227530 0.492515 +0.377602 0.227530 0.492515 +0.397079 0.227530 0.492515 +0.415373 0.227530 0.492515 +0.432594 0.227530 0.492515 +0.448839 0.227530 0.492515 +0.464192 0.227530 0.492515 +0.478729 0.227530 0.492515 +0.492515 0.227530 0.492515 +0.505612 0.227530 0.492515 +0.518072 0.227530 0.492515 +0.529943 0.227530 0.492515 +0.541266 0.227530 0.492515 +0.552083 0.227530 0.492515 +0.562427 0.227530 0.492515 +0.572331 0.227530 0.492515 +0.581823 0.227530 0.492515 +0.590929 0.227530 0.492515 +0.599674 0.227530 0.492515 +0.608079 0.227530 0.492515 +0.616166 0.227530 0.492515 +0.000001 0.257434 0.492515 +0.037293 0.257434 0.492515 +0.079714 0.257434 0.492515 +0.120832 0.257434 0.492515 +0.159284 0.257434 0.492515 +0.194868 0.257434 0.492515 +0.227530 0.257434 0.492515 +0.257434 0.257434 0.492515 +0.285092 0.257434 0.492515 +0.310738 0.257434 0.492515 +0.334585 0.257434 0.492515 +0.356818 0.257434 0.492515 +0.377602 0.257434 0.492515 +0.397079 0.257434 0.492515 +0.415373 0.257434 0.492515 +0.432594 0.257434 0.492515 +0.448839 0.257434 0.492515 +0.464192 0.257434 0.492515 +0.478729 0.257434 0.492515 +0.492515 0.257434 0.492515 +0.505612 0.257434 0.492515 +0.518072 0.257434 0.492515 +0.529943 0.257434 0.492515 +0.541266 0.257434 0.492515 +0.552083 0.257434 0.492515 +0.562427 0.257434 0.492515 +0.572331 0.257434 0.492515 +0.581823 0.257434 0.492515 +0.590929 0.257434 0.492515 +0.599674 0.257434 0.492515 +0.608079 0.257434 0.492515 +0.616166 0.257434 0.492515 +0.000001 0.285092 0.492515 +0.037293 0.285092 0.492515 +0.079714 0.285092 0.492515 +0.120832 0.285092 0.492515 +0.159284 0.285092 0.492515 +0.194868 0.285092 0.492515 +0.227530 0.285092 0.492515 +0.257434 0.285092 0.492515 +0.285092 0.285092 0.492515 +0.310738 0.285092 0.492515 +0.334585 0.285092 0.492515 +0.356818 0.285092 0.492515 +0.377602 0.285092 0.492515 +0.397079 0.285092 0.492515 +0.415373 0.285092 0.492515 +0.432594 0.285092 0.492515 +0.448839 0.285092 0.492515 +0.464192 0.285092 0.492515 +0.478729 0.285092 0.492515 +0.492515 0.285092 0.492515 +0.505612 0.285092 0.492515 +0.518072 0.285092 0.492515 +0.529943 0.285092 0.492515 +0.541266 0.285092 0.492515 +0.552083 0.285092 0.492515 +0.562427 0.285092 0.492515 +0.572331 0.285092 0.492515 +0.581823 0.285092 0.492515 +0.590929 0.285092 0.492515 +0.599674 0.285092 0.492515 +0.608079 0.285092 0.492515 +0.616166 0.285092 0.492515 +0.000001 0.310738 0.492515 +0.037293 0.310738 0.492515 +0.079714 0.310738 0.492515 +0.120832 0.310738 0.492515 +0.159284 0.310738 0.492515 +0.194868 0.310738 0.492515 +0.227530 0.310738 0.492515 +0.257434 0.310738 0.492515 +0.285092 0.310738 0.492515 +0.310738 0.310738 0.492515 +0.334585 0.310738 0.492515 +0.356818 0.310738 0.492515 +0.377602 0.310738 0.492515 +0.397079 0.310738 0.492515 +0.415373 0.310738 0.492515 +0.432594 0.310738 0.492515 +0.448839 0.310738 0.492515 +0.464192 0.310738 0.492515 +0.478729 0.310738 0.492515 +0.492515 0.310738 0.492515 +0.505612 0.310738 0.492515 +0.518072 0.310738 0.492515 +0.529943 0.310738 0.492515 +0.541266 0.310738 0.492515 +0.552083 0.310738 0.492515 +0.562427 0.310738 0.492515 +0.572331 0.310738 0.492515 +0.581823 0.310738 0.492515 +0.590929 0.310738 0.492515 +0.599674 0.310738 0.492515 +0.608079 0.310738 0.492515 +0.616166 0.310738 0.492515 +0.000001 0.334585 0.492515 +0.037293 0.334585 0.492515 +0.079714 0.334585 0.492515 +0.120832 0.334585 0.492515 +0.159284 0.334585 0.492515 +0.194868 0.334585 0.492515 +0.227530 0.334585 0.492515 +0.257434 0.334585 0.492515 +0.285092 0.334585 0.492515 +0.310738 0.334585 0.492515 +0.334585 0.334585 0.492515 +0.356818 0.334585 0.492515 +0.377602 0.334585 0.492515 +0.397079 0.334585 0.492515 +0.415373 0.334585 0.492515 +0.432594 0.334585 0.492515 +0.448839 0.334585 0.492515 +0.464192 0.334585 0.492515 +0.478729 0.334585 0.492515 +0.492515 0.334585 0.492515 +0.505612 0.334585 0.492515 +0.518072 0.334585 0.492515 +0.529943 0.334585 0.492515 +0.541266 0.334585 0.492515 +0.552083 0.334585 0.492515 +0.562427 0.334585 0.492515 +0.572331 0.334585 0.492515 +0.581823 0.334585 0.492515 +0.590929 0.334585 0.492515 +0.599674 0.334585 0.492515 +0.608079 0.334585 0.492515 +0.616166 0.334585 0.492515 +0.000001 0.356818 0.492515 +0.037293 0.356818 0.492515 +0.079714 0.356818 0.492515 +0.120832 0.356818 0.492515 +0.159284 0.356818 0.492515 +0.194868 0.356818 0.492515 +0.227530 0.356818 0.492515 +0.257434 0.356818 0.492515 +0.285092 0.356818 0.492515 +0.310738 0.356818 0.492515 +0.334585 0.356818 0.492515 +0.356818 0.356818 0.492515 +0.377602 0.356818 0.492515 +0.397079 0.356818 0.492515 +0.415373 0.356818 0.492515 +0.432594 0.356818 0.492515 +0.448839 0.356818 0.492515 +0.464192 0.356818 0.492515 +0.478729 0.356818 0.492515 +0.492515 0.356818 0.492515 +0.505612 0.356818 0.492515 +0.518072 0.356818 0.492515 +0.529943 0.356818 0.492515 +0.541266 0.356818 0.492515 +0.552083 0.356818 0.492515 +0.562427 0.356818 0.492515 +0.572331 0.356818 0.492515 +0.581823 0.356818 0.492515 +0.590929 0.356818 0.492515 +0.599674 0.356818 0.492515 +0.608079 0.356818 0.492515 +0.616166 0.356818 0.492515 +0.000001 0.377602 0.492515 +0.037293 0.377602 0.492515 +0.079714 0.377602 0.492515 +0.120832 0.377602 0.492515 +0.159284 0.377602 0.492515 +0.194868 0.377602 0.492515 +0.227530 0.377602 0.492515 +0.257434 0.377602 0.492515 +0.285092 0.377602 0.492515 +0.310738 0.377602 0.492515 +0.334585 0.377602 0.492515 +0.356818 0.377602 0.492515 +0.377602 0.377602 0.492515 +0.397079 0.377602 0.492515 +0.415373 0.377602 0.492515 +0.432594 0.377602 0.492515 +0.448839 0.377602 0.492515 +0.464192 0.377602 0.492515 +0.478729 0.377602 0.492515 +0.492515 0.377602 0.492515 +0.505612 0.377602 0.492515 +0.518072 0.377602 0.492515 +0.529943 0.377602 0.492515 +0.541266 0.377602 0.492515 +0.552083 0.377602 0.492515 +0.562427 0.377602 0.492515 +0.572331 0.377602 0.492515 +0.581823 0.377602 0.492515 +0.590929 0.377602 0.492515 +0.599674 0.377602 0.492515 +0.608079 0.377602 0.492515 +0.616166 0.377602 0.492515 +0.000001 0.397079 0.492515 +0.037293 0.397079 0.492515 +0.079714 0.397079 0.492515 +0.120832 0.397079 0.492515 +0.159284 0.397079 0.492515 +0.194868 0.397079 0.492515 +0.227530 0.397079 0.492515 +0.257434 0.397079 0.492515 +0.285092 0.397079 0.492515 +0.310738 0.397079 0.492515 +0.334585 0.397079 0.492515 +0.356818 0.397079 0.492515 +0.377602 0.397079 0.492515 +0.397079 0.397079 0.492515 +0.415373 0.397079 0.492515 +0.432594 0.397079 0.492515 +0.448839 0.397079 0.492515 +0.464192 0.397079 0.492515 +0.478729 0.397079 0.492515 +0.492515 0.397079 0.492515 +0.505612 0.397079 0.492515 +0.518072 0.397079 0.492515 +0.529943 0.397079 0.492515 +0.541266 0.397079 0.492515 +0.552083 0.397079 0.492515 +0.562427 0.397079 0.492515 +0.572331 0.397079 0.492515 +0.581823 0.397079 0.492515 +0.590929 0.397079 0.492515 +0.599674 0.397079 0.492515 +0.608079 0.397079 0.492515 +0.616166 0.397079 0.492515 +0.000001 0.415373 0.492515 +0.037293 0.415373 0.492515 +0.079714 0.415373 0.492515 +0.120832 0.415373 0.492515 +0.159284 0.415373 0.492515 +0.194868 0.415373 0.492515 +0.227530 0.415373 0.492515 +0.257434 0.415373 0.492515 +0.285092 0.415373 0.492515 +0.310738 0.415373 0.492515 +0.334585 0.415373 0.492515 +0.356818 0.415373 0.492515 +0.377602 0.415373 0.492515 +0.397079 0.415373 0.492515 +0.415373 0.415373 0.492515 +0.432594 0.415373 0.492515 +0.448839 0.415373 0.492515 +0.464192 0.415373 0.492515 +0.478729 0.415373 0.492515 +0.492515 0.415373 0.492515 +0.505612 0.415373 0.492515 +0.518072 0.415373 0.492515 +0.529943 0.415373 0.492515 +0.541266 0.415373 0.492515 +0.552083 0.415373 0.492515 +0.562427 0.415373 0.492515 +0.572331 0.415373 0.492515 +0.581823 0.415373 0.492515 +0.590929 0.415373 0.492515 +0.599674 0.415373 0.492515 +0.608079 0.415373 0.492515 +0.616166 0.415373 0.492515 +0.000001 0.432594 0.492515 +0.037293 0.432594 0.492515 +0.079714 0.432594 0.492515 +0.120832 0.432594 0.492515 +0.159284 0.432594 0.492515 +0.194868 0.432594 0.492515 +0.227530 0.432594 0.492515 +0.257434 0.432594 0.492515 +0.285092 0.432594 0.492515 +0.310738 0.432594 0.492515 +0.334585 0.432594 0.492515 +0.356818 0.432594 0.492515 +0.377602 0.432594 0.492515 +0.397079 0.432594 0.492515 +0.415373 0.432594 0.492515 +0.432594 0.432594 0.492515 +0.448839 0.432594 0.492515 +0.464192 0.432594 0.492515 +0.478729 0.432594 0.492515 +0.492515 0.432594 0.492515 +0.505612 0.432594 0.492515 +0.518072 0.432594 0.492515 +0.529943 0.432594 0.492515 +0.541266 0.432594 0.492515 +0.552083 0.432594 0.492515 +0.562427 0.432594 0.492515 +0.572331 0.432594 0.492515 +0.581823 0.432594 0.492515 +0.590929 0.432594 0.492515 +0.599674 0.432594 0.492515 +0.608079 0.432594 0.492515 +0.616166 0.432594 0.492515 +0.000001 0.448839 0.492515 +0.037293 0.448839 0.492515 +0.079714 0.448839 0.492515 +0.120832 0.448839 0.492515 +0.159284 0.448839 0.492515 +0.194868 0.448839 0.492515 +0.227530 0.448839 0.492515 +0.257434 0.448839 0.492515 +0.285092 0.448839 0.492515 +0.310738 0.448839 0.492515 +0.334585 0.448839 0.492515 +0.356818 0.448839 0.492515 +0.377602 0.448839 0.492515 +0.397079 0.448839 0.492515 +0.415373 0.448839 0.492515 +0.432594 0.448839 0.492515 +0.448839 0.448839 0.492515 +0.464192 0.448839 0.492515 +0.478729 0.448839 0.492515 +0.492515 0.448839 0.492515 +0.505612 0.448839 0.492515 +0.518072 0.448839 0.492515 +0.529943 0.448839 0.492515 +0.541266 0.448839 0.492515 +0.552083 0.448839 0.492515 +0.562427 0.448839 0.492515 +0.572331 0.448839 0.492515 +0.581823 0.448839 0.492515 +0.590929 0.448839 0.492515 +0.599674 0.448839 0.492515 +0.608079 0.448839 0.492515 +0.616166 0.448839 0.492515 +0.000001 0.464192 0.492515 +0.037293 0.464192 0.492515 +0.079714 0.464192 0.492515 +0.120832 0.464192 0.492515 +0.159284 0.464192 0.492515 +0.194868 0.464192 0.492515 +0.227530 0.464192 0.492515 +0.257434 0.464192 0.492515 +0.285092 0.464192 0.492515 +0.310738 0.464192 0.492515 +0.334585 0.464192 0.492515 +0.356818 0.464192 0.492515 +0.377602 0.464192 0.492515 +0.397079 0.464192 0.492515 +0.415373 0.464192 0.492515 +0.432594 0.464192 0.492515 +0.448839 0.464192 0.492515 +0.464192 0.464192 0.492515 +0.478729 0.464192 0.492515 +0.492515 0.464192 0.492515 +0.505612 0.464192 0.492515 +0.518072 0.464192 0.492515 +0.529943 0.464192 0.492515 +0.541266 0.464192 0.492515 +0.552083 0.464192 0.492515 +0.562427 0.464192 0.492515 +0.572331 0.464192 0.492515 +0.581823 0.464192 0.492515 +0.590929 0.464192 0.492515 +0.599674 0.464192 0.492515 +0.608079 0.464192 0.492515 +0.616166 0.464192 0.492515 +0.000001 0.478729 0.492515 +0.037293 0.478729 0.492515 +0.079714 0.478729 0.492515 +0.120832 0.478729 0.492515 +0.159284 0.478729 0.492515 +0.194868 0.478729 0.492515 +0.227530 0.478729 0.492515 +0.257434 0.478729 0.492515 +0.285092 0.478729 0.492515 +0.310738 0.478729 0.492515 +0.334585 0.478729 0.492515 +0.356818 0.478729 0.492515 +0.377602 0.478729 0.492515 +0.397079 0.478729 0.492515 +0.415373 0.478729 0.492515 +0.432594 0.478729 0.492515 +0.448839 0.478729 0.492515 +0.464192 0.478729 0.492515 +0.478729 0.478729 0.492515 +0.492515 0.478729 0.492515 +0.505612 0.478729 0.492515 +0.518072 0.478729 0.492515 +0.529943 0.478729 0.492515 +0.541266 0.478729 0.492515 +0.552083 0.478729 0.492515 +0.562427 0.478729 0.492515 +0.572331 0.478729 0.492515 +0.581823 0.478729 0.492515 +0.590929 0.478729 0.492515 +0.599674 0.478729 0.492515 +0.608079 0.478729 0.492515 +0.616166 0.478729 0.492515 +0.000001 0.492515 0.492515 +0.037293 0.492515 0.492515 +0.079714 0.492515 0.492515 +0.120832 0.492515 0.492515 +0.159284 0.492515 0.492515 +0.194868 0.492515 0.492515 +0.227530 0.492515 0.492515 +0.257434 0.492515 0.492515 +0.285092 0.492515 0.492515 +0.310738 0.492515 0.492515 +0.334585 0.492515 0.492515 +0.356818 0.492515 0.492515 +0.377602 0.492515 0.492515 +0.397079 0.492515 0.492515 +0.415373 0.492515 0.492515 +0.432594 0.492515 0.492515 +0.448839 0.492515 0.492515 +0.464192 0.492515 0.492515 +0.478729 0.492515 0.492515 +0.492515 0.492515 0.492515 +0.505612 0.492515 0.492515 +0.518072 0.492515 0.492515 +0.529943 0.492515 0.492515 +0.541266 0.492515 0.492515 +0.552083 0.492515 0.492515 +0.562427 0.492515 0.492515 +0.572331 0.492515 0.492515 +0.581823 0.492515 0.492515 +0.590929 0.492515 0.492515 +0.599674 0.492515 0.492515 +0.608079 0.492515 0.492515 +0.616166 0.492515 0.492515 +0.000001 0.505612 0.492515 +0.037293 0.505612 0.492515 +0.079714 0.505612 0.492515 +0.120832 0.505612 0.492515 +0.159284 0.505612 0.492515 +0.194868 0.505612 0.492515 +0.227530 0.505612 0.492515 +0.257434 0.505612 0.492515 +0.285092 0.505612 0.492515 +0.310738 0.505612 0.492515 +0.334585 0.505612 0.492515 +0.356818 0.505612 0.492515 +0.377602 0.505612 0.492515 +0.397079 0.505612 0.492515 +0.415373 0.505612 0.492515 +0.432594 0.505612 0.492515 +0.448839 0.505612 0.492515 +0.464192 0.505612 0.492515 +0.478729 0.505612 0.492515 +0.492515 0.505612 0.492515 +0.505612 0.505612 0.492515 +0.518072 0.505612 0.492515 +0.529943 0.505612 0.492515 +0.541266 0.505612 0.492515 +0.552083 0.505612 0.492515 +0.562427 0.505612 0.492515 +0.572331 0.505612 0.492515 +0.581823 0.505612 0.492515 +0.590929 0.505612 0.492515 +0.599674 0.505612 0.492515 +0.608079 0.505612 0.492515 +0.616166 0.505612 0.492515 +0.000001 0.518072 0.492515 +0.037293 0.518072 0.492515 +0.079714 0.518072 0.492515 +0.120832 0.518072 0.492515 +0.159284 0.518072 0.492515 +0.194868 0.518072 0.492515 +0.227530 0.518072 0.492515 +0.257434 0.518072 0.492515 +0.285092 0.518072 0.492515 +0.310738 0.518072 0.492515 +0.334585 0.518072 0.492515 +0.356818 0.518072 0.492515 +0.377602 0.518072 0.492515 +0.397079 0.518072 0.492515 +0.415373 0.518072 0.492515 +0.432594 0.518072 0.492515 +0.448839 0.518072 0.492515 +0.464192 0.518072 0.492515 +0.478729 0.518072 0.492515 +0.492515 0.518072 0.492515 +0.505612 0.518072 0.492515 +0.518072 0.518072 0.492515 +0.529943 0.518072 0.492515 +0.541266 0.518072 0.492515 +0.552083 0.518072 0.492515 +0.562427 0.518072 0.492515 +0.572331 0.518072 0.492515 +0.581823 0.518072 0.492515 +0.590929 0.518072 0.492515 +0.599674 0.518072 0.492515 +0.608079 0.518072 0.492515 +0.616166 0.518072 0.492515 +0.000001 0.529943 0.492515 +0.037293 0.529943 0.492515 +0.079714 0.529943 0.492515 +0.120832 0.529943 0.492515 +0.159284 0.529943 0.492515 +0.194868 0.529943 0.492515 +0.227530 0.529943 0.492515 +0.257434 0.529943 0.492515 +0.285092 0.529943 0.492515 +0.310738 0.529943 0.492515 +0.334585 0.529943 0.492515 +0.356818 0.529943 0.492515 +0.377602 0.529943 0.492515 +0.397079 0.529943 0.492515 +0.415373 0.529943 0.492515 +0.432594 0.529943 0.492515 +0.448839 0.529943 0.492515 +0.464192 0.529943 0.492515 +0.478729 0.529943 0.492515 +0.492515 0.529943 0.492515 +0.505612 0.529943 0.492515 +0.518072 0.529943 0.492515 +0.529943 0.529943 0.492515 +0.541266 0.529943 0.492515 +0.552083 0.529943 0.492515 +0.562427 0.529943 0.492515 +0.572331 0.529943 0.492515 +0.581823 0.529943 0.492515 +0.590929 0.529943 0.492515 +0.599674 0.529943 0.492515 +0.608079 0.529943 0.492515 +0.616166 0.529943 0.492515 +0.000001 0.541266 0.492515 +0.037293 0.541266 0.492515 +0.079714 0.541266 0.492515 +0.120832 0.541266 0.492515 +0.159284 0.541266 0.492515 +0.194868 0.541266 0.492515 +0.227530 0.541266 0.492515 +0.257434 0.541266 0.492515 +0.285092 0.541266 0.492515 +0.310738 0.541266 0.492515 +0.334585 0.541266 0.492515 +0.356818 0.541266 0.492515 +0.377602 0.541266 0.492515 +0.397079 0.541266 0.492515 +0.415373 0.541266 0.492515 +0.432594 0.541266 0.492515 +0.448839 0.541266 0.492515 +0.464192 0.541266 0.492515 +0.478729 0.541266 0.492515 +0.492515 0.541266 0.492515 +0.505612 0.541266 0.492515 +0.518072 0.541266 0.492515 +0.529943 0.541266 0.492515 +0.541266 0.541266 0.492515 +0.552083 0.541266 0.492515 +0.562427 0.541266 0.492515 +0.572331 0.541266 0.492515 +0.581823 0.541266 0.492515 +0.590929 0.541266 0.492515 +0.599674 0.541266 0.492515 +0.608079 0.541266 0.492515 +0.616166 0.541266 0.492515 +0.000001 0.552083 0.492515 +0.037293 0.552083 0.492515 +0.079714 0.552083 0.492515 +0.120832 0.552083 0.492515 +0.159284 0.552083 0.492515 +0.194868 0.552083 0.492515 +0.227530 0.552083 0.492515 +0.257434 0.552083 0.492515 +0.285092 0.552083 0.492515 +0.310738 0.552083 0.492515 +0.334585 0.552083 0.492515 +0.356818 0.552083 0.492515 +0.377602 0.552083 0.492515 +0.397079 0.552083 0.492515 +0.415373 0.552083 0.492515 +0.432594 0.552083 0.492515 +0.448839 0.552083 0.492515 +0.464192 0.552083 0.492515 +0.478729 0.552083 0.492515 +0.492515 0.552083 0.492515 +0.505612 0.552083 0.492515 +0.518072 0.552083 0.492515 +0.529943 0.552083 0.492515 +0.541266 0.552083 0.492515 +0.552083 0.552083 0.492515 +0.562427 0.552083 0.492515 +0.572331 0.552083 0.492515 +0.581823 0.552083 0.492515 +0.590929 0.552083 0.492515 +0.599674 0.552083 0.492515 +0.608079 0.552083 0.492515 +0.616166 0.552083 0.492515 +0.000001 0.562427 0.492515 +0.037293 0.562427 0.492515 +0.079714 0.562427 0.492515 +0.120832 0.562427 0.492515 +0.159284 0.562427 0.492515 +0.194868 0.562427 0.492515 +0.227530 0.562427 0.492515 +0.257434 0.562427 0.492515 +0.285092 0.562427 0.492515 +0.310738 0.562427 0.492515 +0.334585 0.562427 0.492515 +0.356818 0.562427 0.492515 +0.377602 0.562427 0.492515 +0.397079 0.562427 0.492515 +0.415373 0.562427 0.492515 +0.432594 0.562427 0.492515 +0.448839 0.562427 0.492515 +0.464192 0.562427 0.492515 +0.478729 0.562427 0.492515 +0.492515 0.562427 0.492515 +0.505612 0.562427 0.492515 +0.518072 0.562427 0.492515 +0.529943 0.562427 0.492515 +0.541266 0.562427 0.492515 +0.552083 0.562427 0.492515 +0.562427 0.562427 0.492515 +0.572331 0.562427 0.492515 +0.581823 0.562427 0.492515 +0.590929 0.562427 0.492515 +0.599674 0.562427 0.492515 +0.608079 0.562427 0.492515 +0.616166 0.562427 0.492515 +0.000001 0.572331 0.492515 +0.037293 0.572331 0.492515 +0.079714 0.572331 0.492515 +0.120832 0.572331 0.492515 +0.159284 0.572331 0.492515 +0.194868 0.572331 0.492515 +0.227530 0.572331 0.492515 +0.257434 0.572331 0.492515 +0.285092 0.572331 0.492515 +0.310738 0.572331 0.492515 +0.334585 0.572331 0.492515 +0.356818 0.572331 0.492515 +0.377602 0.572331 0.492515 +0.397079 0.572331 0.492515 +0.415373 0.572331 0.492515 +0.432594 0.572331 0.492515 +0.448839 0.572331 0.492515 +0.464192 0.572331 0.492515 +0.478729 0.572331 0.492515 +0.492515 0.572331 0.492515 +0.505612 0.572331 0.492515 +0.518072 0.572331 0.492515 +0.529943 0.572331 0.492515 +0.541266 0.572331 0.492515 +0.552083 0.572331 0.492515 +0.562427 0.572331 0.492515 +0.572331 0.572331 0.492515 +0.581823 0.572331 0.492515 +0.590929 0.572331 0.492515 +0.599674 0.572331 0.492515 +0.608079 0.572331 0.492515 +0.616166 0.572331 0.492515 +0.000001 0.581823 0.492515 +0.037293 0.581823 0.492515 +0.079714 0.581823 0.492515 +0.120832 0.581823 0.492515 +0.159284 0.581823 0.492515 +0.194868 0.581823 0.492515 +0.227530 0.581823 0.492515 +0.257434 0.581823 0.492515 +0.285092 0.581823 0.492515 +0.310738 0.581823 0.492515 +0.334585 0.581823 0.492515 +0.356818 0.581823 0.492515 +0.377602 0.581823 0.492515 +0.397079 0.581823 0.492515 +0.415373 0.581823 0.492515 +0.432594 0.581823 0.492515 +0.448839 0.581823 0.492515 +0.464192 0.581823 0.492515 +0.478729 0.581823 0.492515 +0.492515 0.581823 0.492515 +0.505612 0.581823 0.492515 +0.518072 0.581823 0.492515 +0.529943 0.581823 0.492515 +0.541266 0.581823 0.492515 +0.552083 0.581823 0.492515 +0.562427 0.581823 0.492515 +0.572331 0.581823 0.492515 +0.581823 0.581823 0.492515 +0.590929 0.581823 0.492515 +0.599674 0.581823 0.492515 +0.608079 0.581823 0.492515 +0.616166 0.581823 0.492515 +0.000001 0.590929 0.492515 +0.037293 0.590929 0.492515 +0.079714 0.590929 0.492515 +0.120832 0.590929 0.492515 +0.159284 0.590929 0.492515 +0.194868 0.590929 0.492515 +0.227530 0.590929 0.492515 +0.257434 0.590929 0.492515 +0.285092 0.590929 0.492515 +0.310738 0.590929 0.492515 +0.334585 0.590929 0.492515 +0.356818 0.590929 0.492515 +0.377602 0.590929 0.492515 +0.397079 0.590929 0.492515 +0.415373 0.590929 0.492515 +0.432594 0.590929 0.492515 +0.448839 0.590929 0.492515 +0.464192 0.590929 0.492515 +0.478729 0.590929 0.492515 +0.492515 0.590929 0.492515 +0.505612 0.590929 0.492515 +0.518072 0.590929 0.492515 +0.529943 0.590929 0.492515 +0.541266 0.590929 0.492515 +0.552083 0.590929 0.492515 +0.562427 0.590929 0.492515 +0.572331 0.590929 0.492515 +0.581823 0.590929 0.492515 +0.590929 0.590929 0.492515 +0.599674 0.590929 0.492515 +0.608079 0.590929 0.492515 +0.616166 0.590929 0.492515 +0.000001 0.599674 0.492515 +0.037293 0.599674 0.492515 +0.079714 0.599674 0.492515 +0.120832 0.599674 0.492515 +0.159284 0.599674 0.492515 +0.194868 0.599674 0.492515 +0.227530 0.599674 0.492515 +0.257434 0.599674 0.492515 +0.285092 0.599674 0.492515 +0.310738 0.599674 0.492515 +0.334585 0.599674 0.492515 +0.356818 0.599674 0.492515 +0.377602 0.599674 0.492515 +0.397079 0.599674 0.492515 +0.415373 0.599674 0.492515 +0.432594 0.599674 0.492515 +0.448839 0.599674 0.492515 +0.464192 0.599674 0.492515 +0.478729 0.599674 0.492515 +0.492515 0.599674 0.492515 +0.505612 0.599674 0.492515 +0.518072 0.599674 0.492515 +0.529943 0.599674 0.492515 +0.541266 0.599674 0.492515 +0.552083 0.599674 0.492515 +0.562427 0.599674 0.492515 +0.572331 0.599674 0.492515 +0.581823 0.599674 0.492515 +0.590929 0.599674 0.492515 +0.599674 0.599674 0.492515 +0.608079 0.599674 0.492515 +0.616166 0.599674 0.492515 +0.000001 0.608079 0.492515 +0.037293 0.608079 0.492515 +0.079714 0.608079 0.492515 +0.120832 0.608079 0.492515 +0.159284 0.608079 0.492515 +0.194868 0.608079 0.492515 +0.227530 0.608079 0.492515 +0.257434 0.608079 0.492515 +0.285092 0.608079 0.492515 +0.310738 0.608079 0.492515 +0.334585 0.608079 0.492515 +0.356818 0.608079 0.492515 +0.377602 0.608079 0.492515 +0.397079 0.608079 0.492515 +0.415373 0.608079 0.492515 +0.432594 0.608079 0.492515 +0.448839 0.608079 0.492515 +0.464192 0.608079 0.492515 +0.478729 0.608079 0.492515 +0.492515 0.608079 0.492515 +0.505612 0.608079 0.492515 +0.518072 0.608079 0.492515 +0.529943 0.608079 0.492515 +0.541266 0.608079 0.492515 +0.552083 0.608079 0.492515 +0.562427 0.608079 0.492515 +0.572331 0.608079 0.492515 +0.581823 0.608079 0.492515 +0.590929 0.608079 0.492515 +0.599674 0.608079 0.492515 +0.608079 0.608079 0.492515 +0.616166 0.608079 0.492515 +0.000001 0.616166 0.492515 +0.037293 0.616166 0.492515 +0.079714 0.616166 0.492515 +0.120832 0.616166 0.492515 +0.159284 0.616166 0.492515 +0.194868 0.616166 0.492515 +0.227530 0.616166 0.492515 +0.257434 0.616166 0.492515 +0.285092 0.616166 0.492515 +0.310738 0.616166 0.492515 +0.334585 0.616166 0.492515 +0.356818 0.616166 0.492515 +0.377602 0.616166 0.492515 +0.397079 0.616166 0.492515 +0.415373 0.616166 0.492515 +0.432594 0.616166 0.492515 +0.448839 0.616166 0.492515 +0.464192 0.616166 0.492515 +0.478729 0.616166 0.492515 +0.492515 0.616166 0.492515 +0.505612 0.616166 0.492515 +0.518072 0.616166 0.492515 +0.529943 0.616166 0.492515 +0.541266 0.616166 0.492515 +0.552083 0.616166 0.492515 +0.562427 0.616166 0.492515 +0.572331 0.616166 0.492515 +0.581823 0.616166 0.492515 +0.590929 0.616166 0.492515 +0.599674 0.616166 0.492515 +0.608079 0.616166 0.492515 +0.616166 0.616166 0.492515 +0.000001 0.000001 0.505612 +0.037293 0.000001 0.505612 +0.079714 0.000001 0.505612 +0.120832 0.000001 0.505612 +0.159284 0.000001 0.505612 +0.194868 0.000001 0.505612 +0.227530 0.000001 0.505612 +0.257434 0.000001 0.505612 +0.285092 0.000001 0.505612 +0.310738 0.000001 0.505612 +0.334585 0.000001 0.505612 +0.356818 0.000001 0.505612 +0.377602 0.000001 0.505612 +0.397079 0.000001 0.505612 +0.415373 0.000001 0.505612 +0.432594 0.000001 0.505612 +0.448839 0.000001 0.505612 +0.464192 0.000001 0.505612 +0.478729 0.000001 0.505612 +0.492515 0.000001 0.505612 +0.505612 0.000001 0.505612 +0.518072 0.000001 0.505612 +0.529943 0.000001 0.505612 +0.541266 0.000001 0.505612 +0.552083 0.000001 0.505612 +0.562427 0.000001 0.505612 +0.572331 0.000001 0.505612 +0.581823 0.000001 0.505612 +0.590929 0.000001 0.505612 +0.599674 0.000001 0.505612 +0.608079 0.000001 0.505612 +0.616166 0.000001 0.505612 +0.000001 0.037293 0.505612 +0.037293 0.037293 0.505612 +0.079714 0.037293 0.505612 +0.120832 0.037293 0.505612 +0.159284 0.037293 0.505612 +0.194868 0.037293 0.505612 +0.227530 0.037293 0.505612 +0.257434 0.037293 0.505612 +0.285092 0.037293 0.505612 +0.310738 0.037293 0.505612 +0.334585 0.037293 0.505612 +0.356818 0.037293 0.505612 +0.377602 0.037293 0.505612 +0.397079 0.037293 0.505612 +0.415373 0.037293 0.505612 +0.432594 0.037293 0.505612 +0.448839 0.037293 0.505612 +0.464192 0.037293 0.505612 +0.478729 0.037293 0.505612 +0.492515 0.037293 0.505612 +0.505612 0.037293 0.505612 +0.518072 0.037293 0.505612 +0.529943 0.037293 0.505612 +0.541266 0.037293 0.505612 +0.552083 0.037293 0.505612 +0.562427 0.037293 0.505612 +0.572331 0.037293 0.505612 +0.581823 0.037293 0.505612 +0.590929 0.037293 0.505612 +0.599674 0.037293 0.505612 +0.608079 0.037293 0.505612 +0.616166 0.037293 0.505612 +0.000001 0.079714 0.505612 +0.037293 0.079714 0.505612 +0.079714 0.079714 0.505612 +0.120832 0.079714 0.505612 +0.159284 0.079714 0.505612 +0.194868 0.079714 0.505612 +0.227530 0.079714 0.505612 +0.257434 0.079714 0.505612 +0.285092 0.079714 0.505612 +0.310738 0.079714 0.505612 +0.334585 0.079714 0.505612 +0.356818 0.079714 0.505612 +0.377602 0.079714 0.505612 +0.397079 0.079714 0.505612 +0.415373 0.079714 0.505612 +0.432594 0.079714 0.505612 +0.448839 0.079714 0.505612 +0.464192 0.079714 0.505612 +0.478729 0.079714 0.505612 +0.492515 0.079714 0.505612 +0.505612 0.079714 0.505612 +0.518072 0.079714 0.505612 +0.529943 0.079714 0.505612 +0.541266 0.079714 0.505612 +0.552083 0.079714 0.505612 +0.562427 0.079714 0.505612 +0.572331 0.079714 0.505612 +0.581823 0.079714 0.505612 +0.590929 0.079714 0.505612 +0.599674 0.079714 0.505612 +0.608079 0.079714 0.505612 +0.616166 0.079714 0.505612 +0.000001 0.120832 0.505612 +0.037293 0.120832 0.505612 +0.079714 0.120832 0.505612 +0.120832 0.120832 0.505612 +0.159284 0.120832 0.505612 +0.194868 0.120832 0.505612 +0.227530 0.120832 0.505612 +0.257434 0.120832 0.505612 +0.285092 0.120832 0.505612 +0.310738 0.120832 0.505612 +0.334585 0.120832 0.505612 +0.356818 0.120832 0.505612 +0.377602 0.120832 0.505612 +0.397079 0.120832 0.505612 +0.415373 0.120832 0.505612 +0.432594 0.120832 0.505612 +0.448839 0.120832 0.505612 +0.464192 0.120832 0.505612 +0.478729 0.120832 0.505612 +0.492515 0.120832 0.505612 +0.505612 0.120832 0.505612 +0.518072 0.120832 0.505612 +0.529943 0.120832 0.505612 +0.541266 0.120832 0.505612 +0.552083 0.120832 0.505612 +0.562427 0.120832 0.505612 +0.572331 0.120832 0.505612 +0.581823 0.120832 0.505612 +0.590929 0.120832 0.505612 +0.599674 0.120832 0.505612 +0.608079 0.120832 0.505612 +0.616166 0.120832 0.505612 +0.000001 0.159284 0.505612 +0.037293 0.159284 0.505612 +0.079714 0.159284 0.505612 +0.120832 0.159284 0.505612 +0.159284 0.159284 0.505612 +0.194868 0.159284 0.505612 +0.227530 0.159284 0.505612 +0.257434 0.159284 0.505612 +0.285092 0.159284 0.505612 +0.310738 0.159284 0.505612 +0.334585 0.159284 0.505612 +0.356818 0.159284 0.505612 +0.377602 0.159284 0.505612 +0.397079 0.159284 0.505612 +0.415373 0.159284 0.505612 +0.432594 0.159284 0.505612 +0.448839 0.159284 0.505612 +0.464192 0.159284 0.505612 +0.478729 0.159284 0.505612 +0.492515 0.159284 0.505612 +0.505612 0.159284 0.505612 +0.518072 0.159284 0.505612 +0.529943 0.159284 0.505612 +0.541266 0.159284 0.505612 +0.552083 0.159284 0.505612 +0.562427 0.159284 0.505612 +0.572331 0.159284 0.505612 +0.581823 0.159284 0.505612 +0.590929 0.159284 0.505612 +0.599674 0.159284 0.505612 +0.608079 0.159284 0.505612 +0.616166 0.159284 0.505612 +0.000001 0.194868 0.505612 +0.037293 0.194868 0.505612 +0.079714 0.194868 0.505612 +0.120832 0.194868 0.505612 +0.159284 0.194868 0.505612 +0.194868 0.194868 0.505612 +0.227530 0.194868 0.505612 +0.257434 0.194868 0.505612 +0.285092 0.194868 0.505612 +0.310738 0.194868 0.505612 +0.334585 0.194868 0.505612 +0.356818 0.194868 0.505612 +0.377602 0.194868 0.505612 +0.397079 0.194868 0.505612 +0.415373 0.194868 0.505612 +0.432594 0.194868 0.505612 +0.448839 0.194868 0.505612 +0.464192 0.194868 0.505612 +0.478729 0.194868 0.505612 +0.492515 0.194868 0.505612 +0.505612 0.194868 0.505612 +0.518072 0.194868 0.505612 +0.529943 0.194868 0.505612 +0.541266 0.194868 0.505612 +0.552083 0.194868 0.505612 +0.562427 0.194868 0.505612 +0.572331 0.194868 0.505612 +0.581823 0.194868 0.505612 +0.590929 0.194868 0.505612 +0.599674 0.194868 0.505612 +0.608079 0.194868 0.505612 +0.616166 0.194868 0.505612 +0.000001 0.227530 0.505612 +0.037293 0.227530 0.505612 +0.079714 0.227530 0.505612 +0.120832 0.227530 0.505612 +0.159284 0.227530 0.505612 +0.194868 0.227530 0.505612 +0.227530 0.227530 0.505612 +0.257434 0.227530 0.505612 +0.285092 0.227530 0.505612 +0.310738 0.227530 0.505612 +0.334585 0.227530 0.505612 +0.356818 0.227530 0.505612 +0.377602 0.227530 0.505612 +0.397079 0.227530 0.505612 +0.415373 0.227530 0.505612 +0.432594 0.227530 0.505612 +0.448839 0.227530 0.505612 +0.464192 0.227530 0.505612 +0.478729 0.227530 0.505612 +0.492515 0.227530 0.505612 +0.505612 0.227530 0.505612 +0.518072 0.227530 0.505612 +0.529943 0.227530 0.505612 +0.541266 0.227530 0.505612 +0.552083 0.227530 0.505612 +0.562427 0.227530 0.505612 +0.572331 0.227530 0.505612 +0.581823 0.227530 0.505612 +0.590929 0.227530 0.505612 +0.599674 0.227530 0.505612 +0.608079 0.227530 0.505612 +0.616166 0.227530 0.505612 +0.000001 0.257434 0.505612 +0.037293 0.257434 0.505612 +0.079714 0.257434 0.505612 +0.120832 0.257434 0.505612 +0.159284 0.257434 0.505612 +0.194868 0.257434 0.505612 +0.227530 0.257434 0.505612 +0.257434 0.257434 0.505612 +0.285092 0.257434 0.505612 +0.310738 0.257434 0.505612 +0.334585 0.257434 0.505612 +0.356818 0.257434 0.505612 +0.377602 0.257434 0.505612 +0.397079 0.257434 0.505612 +0.415373 0.257434 0.505612 +0.432594 0.257434 0.505612 +0.448839 0.257434 0.505612 +0.464192 0.257434 0.505612 +0.478729 0.257434 0.505612 +0.492515 0.257434 0.505612 +0.505612 0.257434 0.505612 +0.518072 0.257434 0.505612 +0.529943 0.257434 0.505612 +0.541266 0.257434 0.505612 +0.552083 0.257434 0.505612 +0.562427 0.257434 0.505612 +0.572331 0.257434 0.505612 +0.581823 0.257434 0.505612 +0.590929 0.257434 0.505612 +0.599674 0.257434 0.505612 +0.608079 0.257434 0.505612 +0.616166 0.257434 0.505612 +0.000001 0.285092 0.505612 +0.037293 0.285092 0.505612 +0.079714 0.285092 0.505612 +0.120832 0.285092 0.505612 +0.159284 0.285092 0.505612 +0.194868 0.285092 0.505612 +0.227530 0.285092 0.505612 +0.257434 0.285092 0.505612 +0.285092 0.285092 0.505612 +0.310738 0.285092 0.505612 +0.334585 0.285092 0.505612 +0.356818 0.285092 0.505612 +0.377602 0.285092 0.505612 +0.397079 0.285092 0.505612 +0.415373 0.285092 0.505612 +0.432594 0.285092 0.505612 +0.448839 0.285092 0.505612 +0.464192 0.285092 0.505612 +0.478729 0.285092 0.505612 +0.492515 0.285092 0.505612 +0.505612 0.285092 0.505612 +0.518072 0.285092 0.505612 +0.529943 0.285092 0.505612 +0.541266 0.285092 0.505612 +0.552083 0.285092 0.505612 +0.562427 0.285092 0.505612 +0.572331 0.285092 0.505612 +0.581823 0.285092 0.505612 +0.590929 0.285092 0.505612 +0.599674 0.285092 0.505612 +0.608079 0.285092 0.505612 +0.616166 0.285092 0.505612 +0.000001 0.310738 0.505612 +0.037293 0.310738 0.505612 +0.079714 0.310738 0.505612 +0.120832 0.310738 0.505612 +0.159284 0.310738 0.505612 +0.194868 0.310738 0.505612 +0.227530 0.310738 0.505612 +0.257434 0.310738 0.505612 +0.285092 0.310738 0.505612 +0.310738 0.310738 0.505612 +0.334585 0.310738 0.505612 +0.356818 0.310738 0.505612 +0.377602 0.310738 0.505612 +0.397079 0.310738 0.505612 +0.415373 0.310738 0.505612 +0.432594 0.310738 0.505612 +0.448839 0.310738 0.505612 +0.464192 0.310738 0.505612 +0.478729 0.310738 0.505612 +0.492515 0.310738 0.505612 +0.505612 0.310738 0.505612 +0.518072 0.310738 0.505612 +0.529943 0.310738 0.505612 +0.541266 0.310738 0.505612 +0.552083 0.310738 0.505612 +0.562427 0.310738 0.505612 +0.572331 0.310738 0.505612 +0.581823 0.310738 0.505612 +0.590929 0.310738 0.505612 +0.599674 0.310738 0.505612 +0.608079 0.310738 0.505612 +0.616166 0.310738 0.505612 +0.000001 0.334585 0.505612 +0.037293 0.334585 0.505612 +0.079714 0.334585 0.505612 +0.120832 0.334585 0.505612 +0.159284 0.334585 0.505612 +0.194868 0.334585 0.505612 +0.227530 0.334585 0.505612 +0.257434 0.334585 0.505612 +0.285092 0.334585 0.505612 +0.310738 0.334585 0.505612 +0.334585 0.334585 0.505612 +0.356818 0.334585 0.505612 +0.377602 0.334585 0.505612 +0.397079 0.334585 0.505612 +0.415373 0.334585 0.505612 +0.432594 0.334585 0.505612 +0.448839 0.334585 0.505612 +0.464192 0.334585 0.505612 +0.478729 0.334585 0.505612 +0.492515 0.334585 0.505612 +0.505612 0.334585 0.505612 +0.518072 0.334585 0.505612 +0.529943 0.334585 0.505612 +0.541266 0.334585 0.505612 +0.552083 0.334585 0.505612 +0.562427 0.334585 0.505612 +0.572331 0.334585 0.505612 +0.581823 0.334585 0.505612 +0.590929 0.334585 0.505612 +0.599674 0.334585 0.505612 +0.608079 0.334585 0.505612 +0.616166 0.334585 0.505612 +0.000001 0.356818 0.505612 +0.037293 0.356818 0.505612 +0.079714 0.356818 0.505612 +0.120832 0.356818 0.505612 +0.159284 0.356818 0.505612 +0.194868 0.356818 0.505612 +0.227530 0.356818 0.505612 +0.257434 0.356818 0.505612 +0.285092 0.356818 0.505612 +0.310738 0.356818 0.505612 +0.334585 0.356818 0.505612 +0.356818 0.356818 0.505612 +0.377602 0.356818 0.505612 +0.397079 0.356818 0.505612 +0.415373 0.356818 0.505612 +0.432594 0.356818 0.505612 +0.448839 0.356818 0.505612 +0.464192 0.356818 0.505612 +0.478729 0.356818 0.505612 +0.492515 0.356818 0.505612 +0.505612 0.356818 0.505612 +0.518072 0.356818 0.505612 +0.529943 0.356818 0.505612 +0.541266 0.356818 0.505612 +0.552083 0.356818 0.505612 +0.562427 0.356818 0.505612 +0.572331 0.356818 0.505612 +0.581823 0.356818 0.505612 +0.590929 0.356818 0.505612 +0.599674 0.356818 0.505612 +0.608079 0.356818 0.505612 +0.616166 0.356818 0.505612 +0.000001 0.377602 0.505612 +0.037293 0.377602 0.505612 +0.079714 0.377602 0.505612 +0.120832 0.377602 0.505612 +0.159284 0.377602 0.505612 +0.194868 0.377602 0.505612 +0.227530 0.377602 0.505612 +0.257434 0.377602 0.505612 +0.285092 0.377602 0.505612 +0.310738 0.377602 0.505612 +0.334585 0.377602 0.505612 +0.356818 0.377602 0.505612 +0.377602 0.377602 0.505612 +0.397079 0.377602 0.505612 +0.415373 0.377602 0.505612 +0.432594 0.377602 0.505612 +0.448839 0.377602 0.505612 +0.464192 0.377602 0.505612 +0.478729 0.377602 0.505612 +0.492515 0.377602 0.505612 +0.505612 0.377602 0.505612 +0.518072 0.377602 0.505612 +0.529943 0.377602 0.505612 +0.541266 0.377602 0.505612 +0.552083 0.377602 0.505612 +0.562427 0.377602 0.505612 +0.572331 0.377602 0.505612 +0.581823 0.377602 0.505612 +0.590929 0.377602 0.505612 +0.599674 0.377602 0.505612 +0.608079 0.377602 0.505612 +0.616166 0.377602 0.505612 +0.000001 0.397079 0.505612 +0.037293 0.397079 0.505612 +0.079714 0.397079 0.505612 +0.120832 0.397079 0.505612 +0.159284 0.397079 0.505612 +0.194868 0.397079 0.505612 +0.227530 0.397079 0.505612 +0.257434 0.397079 0.505612 +0.285092 0.397079 0.505612 +0.310738 0.397079 0.505612 +0.334585 0.397079 0.505612 +0.356818 0.397079 0.505612 +0.377602 0.397079 0.505612 +0.397079 0.397079 0.505612 +0.415373 0.397079 0.505612 +0.432594 0.397079 0.505612 +0.448839 0.397079 0.505612 +0.464192 0.397079 0.505612 +0.478729 0.397079 0.505612 +0.492515 0.397079 0.505612 +0.505612 0.397079 0.505612 +0.518072 0.397079 0.505612 +0.529943 0.397079 0.505612 +0.541266 0.397079 0.505612 +0.552083 0.397079 0.505612 +0.562427 0.397079 0.505612 +0.572331 0.397079 0.505612 +0.581823 0.397079 0.505612 +0.590929 0.397079 0.505612 +0.599674 0.397079 0.505612 +0.608079 0.397079 0.505612 +0.616166 0.397079 0.505612 +0.000001 0.415373 0.505612 +0.037293 0.415373 0.505612 +0.079714 0.415373 0.505612 +0.120832 0.415373 0.505612 +0.159284 0.415373 0.505612 +0.194868 0.415373 0.505612 +0.227530 0.415373 0.505612 +0.257434 0.415373 0.505612 +0.285092 0.415373 0.505612 +0.310738 0.415373 0.505612 +0.334585 0.415373 0.505612 +0.356818 0.415373 0.505612 +0.377602 0.415373 0.505612 +0.397079 0.415373 0.505612 +0.415373 0.415373 0.505612 +0.432594 0.415373 0.505612 +0.448839 0.415373 0.505612 +0.464192 0.415373 0.505612 +0.478729 0.415373 0.505612 +0.492515 0.415373 0.505612 +0.505612 0.415373 0.505612 +0.518072 0.415373 0.505612 +0.529943 0.415373 0.505612 +0.541266 0.415373 0.505612 +0.552083 0.415373 0.505612 +0.562427 0.415373 0.505612 +0.572331 0.415373 0.505612 +0.581823 0.415373 0.505612 +0.590929 0.415373 0.505612 +0.599674 0.415373 0.505612 +0.608079 0.415373 0.505612 +0.616166 0.415373 0.505612 +0.000001 0.432594 0.505612 +0.037293 0.432594 0.505612 +0.079714 0.432594 0.505612 +0.120832 0.432594 0.505612 +0.159284 0.432594 0.505612 +0.194868 0.432594 0.505612 +0.227530 0.432594 0.505612 +0.257434 0.432594 0.505612 +0.285092 0.432594 0.505612 +0.310738 0.432594 0.505612 +0.334585 0.432594 0.505612 +0.356818 0.432594 0.505612 +0.377602 0.432594 0.505612 +0.397079 0.432594 0.505612 +0.415373 0.432594 0.505612 +0.432594 0.432594 0.505612 +0.448839 0.432594 0.505612 +0.464192 0.432594 0.505612 +0.478729 0.432594 0.505612 +0.492515 0.432594 0.505612 +0.505612 0.432594 0.505612 +0.518072 0.432594 0.505612 +0.529943 0.432594 0.505612 +0.541266 0.432594 0.505612 +0.552083 0.432594 0.505612 +0.562427 0.432594 0.505612 +0.572331 0.432594 0.505612 +0.581823 0.432594 0.505612 +0.590929 0.432594 0.505612 +0.599674 0.432594 0.505612 +0.608079 0.432594 0.505612 +0.616166 0.432594 0.505612 +0.000001 0.448839 0.505612 +0.037293 0.448839 0.505612 +0.079714 0.448839 0.505612 +0.120832 0.448839 0.505612 +0.159284 0.448839 0.505612 +0.194868 0.448839 0.505612 +0.227530 0.448839 0.505612 +0.257434 0.448839 0.505612 +0.285092 0.448839 0.505612 +0.310738 0.448839 0.505612 +0.334585 0.448839 0.505612 +0.356818 0.448839 0.505612 +0.377602 0.448839 0.505612 +0.397079 0.448839 0.505612 +0.415373 0.448839 0.505612 +0.432594 0.448839 0.505612 +0.448839 0.448839 0.505612 +0.464192 0.448839 0.505612 +0.478729 0.448839 0.505612 +0.492515 0.448839 0.505612 +0.505612 0.448839 0.505612 +0.518072 0.448839 0.505612 +0.529943 0.448839 0.505612 +0.541266 0.448839 0.505612 +0.552083 0.448839 0.505612 +0.562427 0.448839 0.505612 +0.572331 0.448839 0.505612 +0.581823 0.448839 0.505612 +0.590929 0.448839 0.505612 +0.599674 0.448839 0.505612 +0.608079 0.448839 0.505612 +0.616166 0.448839 0.505612 +0.000001 0.464192 0.505612 +0.037293 0.464192 0.505612 +0.079714 0.464192 0.505612 +0.120832 0.464192 0.505612 +0.159284 0.464192 0.505612 +0.194868 0.464192 0.505612 +0.227530 0.464192 0.505612 +0.257434 0.464192 0.505612 +0.285092 0.464192 0.505612 +0.310738 0.464192 0.505612 +0.334585 0.464192 0.505612 +0.356818 0.464192 0.505612 +0.377602 0.464192 0.505612 +0.397079 0.464192 0.505612 +0.415373 0.464192 0.505612 +0.432594 0.464192 0.505612 +0.448839 0.464192 0.505612 +0.464192 0.464192 0.505612 +0.478729 0.464192 0.505612 +0.492515 0.464192 0.505612 +0.505612 0.464192 0.505612 +0.518072 0.464192 0.505612 +0.529943 0.464192 0.505612 +0.541266 0.464192 0.505612 +0.552083 0.464192 0.505612 +0.562427 0.464192 0.505612 +0.572331 0.464192 0.505612 +0.581823 0.464192 0.505612 +0.590929 0.464192 0.505612 +0.599674 0.464192 0.505612 +0.608079 0.464192 0.505612 +0.616166 0.464192 0.505612 +0.000001 0.478729 0.505612 +0.037293 0.478729 0.505612 +0.079714 0.478729 0.505612 +0.120832 0.478729 0.505612 +0.159284 0.478729 0.505612 +0.194868 0.478729 0.505612 +0.227530 0.478729 0.505612 +0.257434 0.478729 0.505612 +0.285092 0.478729 0.505612 +0.310738 0.478729 0.505612 +0.334585 0.478729 0.505612 +0.356818 0.478729 0.505612 +0.377602 0.478729 0.505612 +0.397079 0.478729 0.505612 +0.415373 0.478729 0.505612 +0.432594 0.478729 0.505612 +0.448839 0.478729 0.505612 +0.464192 0.478729 0.505612 +0.478729 0.478729 0.505612 +0.492515 0.478729 0.505612 +0.505612 0.478729 0.505612 +0.518072 0.478729 0.505612 +0.529943 0.478729 0.505612 +0.541266 0.478729 0.505612 +0.552083 0.478729 0.505612 +0.562427 0.478729 0.505612 +0.572331 0.478729 0.505612 +0.581823 0.478729 0.505612 +0.590929 0.478729 0.505612 +0.599674 0.478729 0.505612 +0.608079 0.478729 0.505612 +0.616166 0.478729 0.505612 +0.000001 0.492515 0.505612 +0.037293 0.492515 0.505612 +0.079714 0.492515 0.505612 +0.120832 0.492515 0.505612 +0.159284 0.492515 0.505612 +0.194868 0.492515 0.505612 +0.227530 0.492515 0.505612 +0.257434 0.492515 0.505612 +0.285092 0.492515 0.505612 +0.310738 0.492515 0.505612 +0.334585 0.492515 0.505612 +0.356818 0.492515 0.505612 +0.377602 0.492515 0.505612 +0.397079 0.492515 0.505612 +0.415373 0.492515 0.505612 +0.432594 0.492515 0.505612 +0.448839 0.492515 0.505612 +0.464192 0.492515 0.505612 +0.478729 0.492515 0.505612 +0.492515 0.492515 0.505612 +0.505612 0.492515 0.505612 +0.518072 0.492515 0.505612 +0.529943 0.492515 0.505612 +0.541266 0.492515 0.505612 +0.552083 0.492515 0.505612 +0.562427 0.492515 0.505612 +0.572331 0.492515 0.505612 +0.581823 0.492515 0.505612 +0.590929 0.492515 0.505612 +0.599674 0.492515 0.505612 +0.608079 0.492515 0.505612 +0.616166 0.492515 0.505612 +0.000001 0.505612 0.505612 +0.037293 0.505612 0.505612 +0.079714 0.505612 0.505612 +0.120832 0.505612 0.505612 +0.159284 0.505612 0.505612 +0.194868 0.505612 0.505612 +0.227530 0.505612 0.505612 +0.257434 0.505612 0.505612 +0.285092 0.505612 0.505612 +0.310738 0.505612 0.505612 +0.334585 0.505612 0.505612 +0.356818 0.505612 0.505612 +0.377602 0.505612 0.505612 +0.397079 0.505612 0.505612 +0.415373 0.505612 0.505612 +0.432594 0.505612 0.505612 +0.448839 0.505612 0.505612 +0.464192 0.505612 0.505612 +0.478729 0.505612 0.505612 +0.492515 0.505612 0.505612 +0.505612 0.505612 0.505612 +0.518072 0.505612 0.505612 +0.529943 0.505612 0.505612 +0.541266 0.505612 0.505612 +0.552083 0.505612 0.505612 +0.562427 0.505612 0.505612 +0.572331 0.505612 0.505612 +0.581823 0.505612 0.505612 +0.590929 0.505612 0.505612 +0.599674 0.505612 0.505612 +0.608079 0.505612 0.505612 +0.616166 0.505612 0.505612 +0.000001 0.518072 0.505612 +0.037293 0.518072 0.505612 +0.079714 0.518072 0.505612 +0.120832 0.518072 0.505612 +0.159284 0.518072 0.505612 +0.194868 0.518072 0.505612 +0.227530 0.518072 0.505612 +0.257434 0.518072 0.505612 +0.285092 0.518072 0.505612 +0.310738 0.518072 0.505612 +0.334585 0.518072 0.505612 +0.356818 0.518072 0.505612 +0.377602 0.518072 0.505612 +0.397079 0.518072 0.505612 +0.415373 0.518072 0.505612 +0.432594 0.518072 0.505612 +0.448839 0.518072 0.505612 +0.464192 0.518072 0.505612 +0.478729 0.518072 0.505612 +0.492515 0.518072 0.505612 +0.505612 0.518072 0.505612 +0.518072 0.518072 0.505612 +0.529943 0.518072 0.505612 +0.541266 0.518072 0.505612 +0.552083 0.518072 0.505612 +0.562427 0.518072 0.505612 +0.572331 0.518072 0.505612 +0.581823 0.518072 0.505612 +0.590929 0.518072 0.505612 +0.599674 0.518072 0.505612 +0.608079 0.518072 0.505612 +0.616166 0.518072 0.505612 +0.000001 0.529943 0.505612 +0.037293 0.529943 0.505612 +0.079714 0.529943 0.505612 +0.120832 0.529943 0.505612 +0.159284 0.529943 0.505612 +0.194868 0.529943 0.505612 +0.227530 0.529943 0.505612 +0.257434 0.529943 0.505612 +0.285092 0.529943 0.505612 +0.310738 0.529943 0.505612 +0.334585 0.529943 0.505612 +0.356818 0.529943 0.505612 +0.377602 0.529943 0.505612 +0.397079 0.529943 0.505612 +0.415373 0.529943 0.505612 +0.432594 0.529943 0.505612 +0.448839 0.529943 0.505612 +0.464192 0.529943 0.505612 +0.478729 0.529943 0.505612 +0.492515 0.529943 0.505612 +0.505612 0.529943 0.505612 +0.518072 0.529943 0.505612 +0.529943 0.529943 0.505612 +0.541266 0.529943 0.505612 +0.552083 0.529943 0.505612 +0.562427 0.529943 0.505612 +0.572331 0.529943 0.505612 +0.581823 0.529943 0.505612 +0.590929 0.529943 0.505612 +0.599674 0.529943 0.505612 +0.608079 0.529943 0.505612 +0.616166 0.529943 0.505612 +0.000001 0.541266 0.505612 +0.037293 0.541266 0.505612 +0.079714 0.541266 0.505612 +0.120832 0.541266 0.505612 +0.159284 0.541266 0.505612 +0.194868 0.541266 0.505612 +0.227530 0.541266 0.505612 +0.257434 0.541266 0.505612 +0.285092 0.541266 0.505612 +0.310738 0.541266 0.505612 +0.334585 0.541266 0.505612 +0.356818 0.541266 0.505612 +0.377602 0.541266 0.505612 +0.397079 0.541266 0.505612 +0.415373 0.541266 0.505612 +0.432594 0.541266 0.505612 +0.448839 0.541266 0.505612 +0.464192 0.541266 0.505612 +0.478729 0.541266 0.505612 +0.492515 0.541266 0.505612 +0.505612 0.541266 0.505612 +0.518072 0.541266 0.505612 +0.529943 0.541266 0.505612 +0.541266 0.541266 0.505612 +0.552083 0.541266 0.505612 +0.562427 0.541266 0.505612 +0.572331 0.541266 0.505612 +0.581823 0.541266 0.505612 +0.590929 0.541266 0.505612 +0.599674 0.541266 0.505612 +0.608079 0.541266 0.505612 +0.616166 0.541266 0.505612 +0.000001 0.552083 0.505612 +0.037293 0.552083 0.505612 +0.079714 0.552083 0.505612 +0.120832 0.552083 0.505612 +0.159284 0.552083 0.505612 +0.194868 0.552083 0.505612 +0.227530 0.552083 0.505612 +0.257434 0.552083 0.505612 +0.285092 0.552083 0.505612 +0.310738 0.552083 0.505612 +0.334585 0.552083 0.505612 +0.356818 0.552083 0.505612 +0.377602 0.552083 0.505612 +0.397079 0.552083 0.505612 +0.415373 0.552083 0.505612 +0.432594 0.552083 0.505612 +0.448839 0.552083 0.505612 +0.464192 0.552083 0.505612 +0.478729 0.552083 0.505612 +0.492515 0.552083 0.505612 +0.505612 0.552083 0.505612 +0.518072 0.552083 0.505612 +0.529943 0.552083 0.505612 +0.541266 0.552083 0.505612 +0.552083 0.552083 0.505612 +0.562427 0.552083 0.505612 +0.572331 0.552083 0.505612 +0.581823 0.552083 0.505612 +0.590929 0.552083 0.505612 +0.599674 0.552083 0.505612 +0.608079 0.552083 0.505612 +0.616166 0.552083 0.505612 +0.000001 0.562427 0.505612 +0.037293 0.562427 0.505612 +0.079714 0.562427 0.505612 +0.120832 0.562427 0.505612 +0.159284 0.562427 0.505612 +0.194868 0.562427 0.505612 +0.227530 0.562427 0.505612 +0.257434 0.562427 0.505612 +0.285092 0.562427 0.505612 +0.310738 0.562427 0.505612 +0.334585 0.562427 0.505612 +0.356818 0.562427 0.505612 +0.377602 0.562427 0.505612 +0.397079 0.562427 0.505612 +0.415373 0.562427 0.505612 +0.432594 0.562427 0.505612 +0.448839 0.562427 0.505612 +0.464192 0.562427 0.505612 +0.478729 0.562427 0.505612 +0.492515 0.562427 0.505612 +0.505612 0.562427 0.505612 +0.518072 0.562427 0.505612 +0.529943 0.562427 0.505612 +0.541266 0.562427 0.505612 +0.552083 0.562427 0.505612 +0.562427 0.562427 0.505612 +0.572331 0.562427 0.505612 +0.581823 0.562427 0.505612 +0.590929 0.562427 0.505612 +0.599674 0.562427 0.505612 +0.608079 0.562427 0.505612 +0.616166 0.562427 0.505612 +0.000001 0.572331 0.505612 +0.037293 0.572331 0.505612 +0.079714 0.572331 0.505612 +0.120832 0.572331 0.505612 +0.159284 0.572331 0.505612 +0.194868 0.572331 0.505612 +0.227530 0.572331 0.505612 +0.257434 0.572331 0.505612 +0.285092 0.572331 0.505612 +0.310738 0.572331 0.505612 +0.334585 0.572331 0.505612 +0.356818 0.572331 0.505612 +0.377602 0.572331 0.505612 +0.397079 0.572331 0.505612 +0.415373 0.572331 0.505612 +0.432594 0.572331 0.505612 +0.448839 0.572331 0.505612 +0.464192 0.572331 0.505612 +0.478729 0.572331 0.505612 +0.492515 0.572331 0.505612 +0.505612 0.572331 0.505612 +0.518072 0.572331 0.505612 +0.529943 0.572331 0.505612 +0.541266 0.572331 0.505612 +0.552083 0.572331 0.505612 +0.562427 0.572331 0.505612 +0.572331 0.572331 0.505612 +0.581823 0.572331 0.505612 +0.590929 0.572331 0.505612 +0.599674 0.572331 0.505612 +0.608079 0.572331 0.505612 +0.616166 0.572331 0.505612 +0.000001 0.581823 0.505612 +0.037293 0.581823 0.505612 +0.079714 0.581823 0.505612 +0.120832 0.581823 0.505612 +0.159284 0.581823 0.505612 +0.194868 0.581823 0.505612 +0.227530 0.581823 0.505612 +0.257434 0.581823 0.505612 +0.285092 0.581823 0.505612 +0.310738 0.581823 0.505612 +0.334585 0.581823 0.505612 +0.356818 0.581823 0.505612 +0.377602 0.581823 0.505612 +0.397079 0.581823 0.505612 +0.415373 0.581823 0.505612 +0.432594 0.581823 0.505612 +0.448839 0.581823 0.505612 +0.464192 0.581823 0.505612 +0.478729 0.581823 0.505612 +0.492515 0.581823 0.505612 +0.505612 0.581823 0.505612 +0.518072 0.581823 0.505612 +0.529943 0.581823 0.505612 +0.541266 0.581823 0.505612 +0.552083 0.581823 0.505612 +0.562427 0.581823 0.505612 +0.572331 0.581823 0.505612 +0.581823 0.581823 0.505612 +0.590929 0.581823 0.505612 +0.599674 0.581823 0.505612 +0.608079 0.581823 0.505612 +0.616166 0.581823 0.505612 +0.000001 0.590929 0.505612 +0.037293 0.590929 0.505612 +0.079714 0.590929 0.505612 +0.120832 0.590929 0.505612 +0.159284 0.590929 0.505612 +0.194868 0.590929 0.505612 +0.227530 0.590929 0.505612 +0.257434 0.590929 0.505612 +0.285092 0.590929 0.505612 +0.310738 0.590929 0.505612 +0.334585 0.590929 0.505612 +0.356818 0.590929 0.505612 +0.377602 0.590929 0.505612 +0.397079 0.590929 0.505612 +0.415373 0.590929 0.505612 +0.432594 0.590929 0.505612 +0.448839 0.590929 0.505612 +0.464192 0.590929 0.505612 +0.478729 0.590929 0.505612 +0.492515 0.590929 0.505612 +0.505612 0.590929 0.505612 +0.518072 0.590929 0.505612 +0.529943 0.590929 0.505612 +0.541266 0.590929 0.505612 +0.552083 0.590929 0.505612 +0.562427 0.590929 0.505612 +0.572331 0.590929 0.505612 +0.581823 0.590929 0.505612 +0.590929 0.590929 0.505612 +0.599674 0.590929 0.505612 +0.608079 0.590929 0.505612 +0.616166 0.590929 0.505612 +0.000001 0.599674 0.505612 +0.037293 0.599674 0.505612 +0.079714 0.599674 0.505612 +0.120832 0.599674 0.505612 +0.159284 0.599674 0.505612 +0.194868 0.599674 0.505612 +0.227530 0.599674 0.505612 +0.257434 0.599674 0.505612 +0.285092 0.599674 0.505612 +0.310738 0.599674 0.505612 +0.334585 0.599674 0.505612 +0.356818 0.599674 0.505612 +0.377602 0.599674 0.505612 +0.397079 0.599674 0.505612 +0.415373 0.599674 0.505612 +0.432594 0.599674 0.505612 +0.448839 0.599674 0.505612 +0.464192 0.599674 0.505612 +0.478729 0.599674 0.505612 +0.492515 0.599674 0.505612 +0.505612 0.599674 0.505612 +0.518072 0.599674 0.505612 +0.529943 0.599674 0.505612 +0.541266 0.599674 0.505612 +0.552083 0.599674 0.505612 +0.562427 0.599674 0.505612 +0.572331 0.599674 0.505612 +0.581823 0.599674 0.505612 +0.590929 0.599674 0.505612 +0.599674 0.599674 0.505612 +0.608079 0.599674 0.505612 +0.616166 0.599674 0.505612 +0.000001 0.608079 0.505612 +0.037293 0.608079 0.505612 +0.079714 0.608079 0.505612 +0.120832 0.608079 0.505612 +0.159284 0.608079 0.505612 +0.194868 0.608079 0.505612 +0.227530 0.608079 0.505612 +0.257434 0.608079 0.505612 +0.285092 0.608079 0.505612 +0.310738 0.608079 0.505612 +0.334585 0.608079 0.505612 +0.356818 0.608079 0.505612 +0.377602 0.608079 0.505612 +0.397079 0.608079 0.505612 +0.415373 0.608079 0.505612 +0.432594 0.608079 0.505612 +0.448839 0.608079 0.505612 +0.464192 0.608079 0.505612 +0.478729 0.608079 0.505612 +0.492515 0.608079 0.505612 +0.505612 0.608079 0.505612 +0.518072 0.608079 0.505612 +0.529943 0.608079 0.505612 +0.541266 0.608079 0.505612 +0.552083 0.608079 0.505612 +0.562427 0.608079 0.505612 +0.572331 0.608079 0.505612 +0.581823 0.608079 0.505612 +0.590929 0.608079 0.505612 +0.599674 0.608079 0.505612 +0.608079 0.608079 0.505612 +0.616166 0.608079 0.505612 +0.000001 0.616166 0.505612 +0.037293 0.616166 0.505612 +0.079714 0.616166 0.505612 +0.120832 0.616166 0.505612 +0.159284 0.616166 0.505612 +0.194868 0.616166 0.505612 +0.227530 0.616166 0.505612 +0.257434 0.616166 0.505612 +0.285092 0.616166 0.505612 +0.310738 0.616166 0.505612 +0.334585 0.616166 0.505612 +0.356818 0.616166 0.505612 +0.377602 0.616166 0.505612 +0.397079 0.616166 0.505612 +0.415373 0.616166 0.505612 +0.432594 0.616166 0.505612 +0.448839 0.616166 0.505612 +0.464192 0.616166 0.505612 +0.478729 0.616166 0.505612 +0.492515 0.616166 0.505612 +0.505612 0.616166 0.505612 +0.518072 0.616166 0.505612 +0.529943 0.616166 0.505612 +0.541266 0.616166 0.505612 +0.552083 0.616166 0.505612 +0.562427 0.616166 0.505612 +0.572331 0.616166 0.505612 +0.581823 0.616166 0.505612 +0.590929 0.616166 0.505612 +0.599674 0.616166 0.505612 +0.608079 0.616166 0.505612 +0.616166 0.616166 0.505612 +0.000001 0.000001 0.518072 +0.037293 0.000001 0.518072 +0.079714 0.000001 0.518072 +0.120832 0.000001 0.518072 +0.159284 0.000001 0.518072 +0.194868 0.000001 0.518072 +0.227530 0.000001 0.518072 +0.257434 0.000001 0.518072 +0.285092 0.000001 0.518072 +0.310738 0.000001 0.518072 +0.334585 0.000001 0.518072 +0.356818 0.000001 0.518072 +0.377602 0.000001 0.518072 +0.397079 0.000001 0.518072 +0.415373 0.000001 0.518072 +0.432594 0.000001 0.518072 +0.448839 0.000001 0.518072 +0.464192 0.000001 0.518072 +0.478729 0.000001 0.518072 +0.492515 0.000001 0.518072 +0.505612 0.000001 0.518072 +0.518072 0.000001 0.518072 +0.529943 0.000001 0.518072 +0.541266 0.000001 0.518072 +0.552083 0.000001 0.518072 +0.562427 0.000001 0.518072 +0.572331 0.000001 0.518072 +0.581823 0.000001 0.518072 +0.590929 0.000001 0.518072 +0.599674 0.000001 0.518072 +0.608079 0.000001 0.518072 +0.616166 0.000001 0.518072 +0.000001 0.037293 0.518072 +0.037293 0.037293 0.518072 +0.079714 0.037293 0.518072 +0.120832 0.037293 0.518072 +0.159284 0.037293 0.518072 +0.194868 0.037293 0.518072 +0.227530 0.037293 0.518072 +0.257434 0.037293 0.518072 +0.285092 0.037293 0.518072 +0.310738 0.037293 0.518072 +0.334585 0.037293 0.518072 +0.356818 0.037293 0.518072 +0.377602 0.037293 0.518072 +0.397079 0.037293 0.518072 +0.415373 0.037293 0.518072 +0.432594 0.037293 0.518072 +0.448839 0.037293 0.518072 +0.464192 0.037293 0.518072 +0.478729 0.037293 0.518072 +0.492515 0.037293 0.518072 +0.505612 0.037293 0.518072 +0.518072 0.037293 0.518072 +0.529943 0.037293 0.518072 +0.541266 0.037293 0.518072 +0.552083 0.037293 0.518072 +0.562427 0.037293 0.518072 +0.572331 0.037293 0.518072 +0.581823 0.037293 0.518072 +0.590929 0.037293 0.518072 +0.599674 0.037293 0.518072 +0.608079 0.037293 0.518072 +0.616166 0.037293 0.518072 +0.000001 0.079714 0.518072 +0.037293 0.079714 0.518072 +0.079714 0.079714 0.518072 +0.120832 0.079714 0.518072 +0.159284 0.079714 0.518072 +0.194868 0.079714 0.518072 +0.227530 0.079714 0.518072 +0.257434 0.079714 0.518072 +0.285092 0.079714 0.518072 +0.310738 0.079714 0.518072 +0.334585 0.079714 0.518072 +0.356818 0.079714 0.518072 +0.377602 0.079714 0.518072 +0.397079 0.079714 0.518072 +0.415373 0.079714 0.518072 +0.432594 0.079714 0.518072 +0.448839 0.079714 0.518072 +0.464192 0.079714 0.518072 +0.478729 0.079714 0.518072 +0.492515 0.079714 0.518072 +0.505612 0.079714 0.518072 +0.518072 0.079714 0.518072 +0.529943 0.079714 0.518072 +0.541266 0.079714 0.518072 +0.552083 0.079714 0.518072 +0.562427 0.079714 0.518072 +0.572331 0.079714 0.518072 +0.581823 0.079714 0.518072 +0.590929 0.079714 0.518072 +0.599674 0.079714 0.518072 +0.608079 0.079714 0.518072 +0.616166 0.079714 0.518072 +0.000001 0.120832 0.518072 +0.037293 0.120832 0.518072 +0.079714 0.120832 0.518072 +0.120832 0.120832 0.518072 +0.159284 0.120832 0.518072 +0.194868 0.120832 0.518072 +0.227530 0.120832 0.518072 +0.257434 0.120832 0.518072 +0.285092 0.120832 0.518072 +0.310738 0.120832 0.518072 +0.334585 0.120832 0.518072 +0.356818 0.120832 0.518072 +0.377602 0.120832 0.518072 +0.397079 0.120832 0.518072 +0.415373 0.120832 0.518072 +0.432594 0.120832 0.518072 +0.448839 0.120832 0.518072 +0.464192 0.120832 0.518072 +0.478729 0.120832 0.518072 +0.492515 0.120832 0.518072 +0.505612 0.120832 0.518072 +0.518072 0.120832 0.518072 +0.529943 0.120832 0.518072 +0.541266 0.120832 0.518072 +0.552083 0.120832 0.518072 +0.562427 0.120832 0.518072 +0.572331 0.120832 0.518072 +0.581823 0.120832 0.518072 +0.590929 0.120832 0.518072 +0.599674 0.120832 0.518072 +0.608079 0.120832 0.518072 +0.616166 0.120832 0.518072 +0.000001 0.159284 0.518072 +0.037293 0.159284 0.518072 +0.079714 0.159284 0.518072 +0.120832 0.159284 0.518072 +0.159284 0.159284 0.518072 +0.194868 0.159284 0.518072 +0.227530 0.159284 0.518072 +0.257434 0.159284 0.518072 +0.285092 0.159284 0.518072 +0.310738 0.159284 0.518072 +0.334585 0.159284 0.518072 +0.356818 0.159284 0.518072 +0.377602 0.159284 0.518072 +0.397079 0.159284 0.518072 +0.415373 0.159284 0.518072 +0.432594 0.159284 0.518072 +0.448839 0.159284 0.518072 +0.464192 0.159284 0.518072 +0.478729 0.159284 0.518072 +0.492515 0.159284 0.518072 +0.505612 0.159284 0.518072 +0.518072 0.159284 0.518072 +0.529943 0.159284 0.518072 +0.541266 0.159284 0.518072 +0.552083 0.159284 0.518072 +0.562427 0.159284 0.518072 +0.572331 0.159284 0.518072 +0.581823 0.159284 0.518072 +0.590929 0.159284 0.518072 +0.599674 0.159284 0.518072 +0.608079 0.159284 0.518072 +0.616166 0.159284 0.518072 +0.000001 0.194868 0.518072 +0.037293 0.194868 0.518072 +0.079714 0.194868 0.518072 +0.120832 0.194868 0.518072 +0.159284 0.194868 0.518072 +0.194868 0.194868 0.518072 +0.227530 0.194868 0.518072 +0.257434 0.194868 0.518072 +0.285092 0.194868 0.518072 +0.310738 0.194868 0.518072 +0.334585 0.194868 0.518072 +0.356818 0.194868 0.518072 +0.377602 0.194868 0.518072 +0.397079 0.194868 0.518072 +0.415373 0.194868 0.518072 +0.432594 0.194868 0.518072 +0.448839 0.194868 0.518072 +0.464192 0.194868 0.518072 +0.478729 0.194868 0.518072 +0.492515 0.194868 0.518072 +0.505612 0.194868 0.518072 +0.518072 0.194868 0.518072 +0.529943 0.194868 0.518072 +0.541266 0.194868 0.518072 +0.552083 0.194868 0.518072 +0.562427 0.194868 0.518072 +0.572331 0.194868 0.518072 +0.581823 0.194868 0.518072 +0.590929 0.194868 0.518072 +0.599674 0.194868 0.518072 +0.608079 0.194868 0.518072 +0.616166 0.194868 0.518072 +0.000001 0.227530 0.518072 +0.037293 0.227530 0.518072 +0.079714 0.227530 0.518072 +0.120832 0.227530 0.518072 +0.159284 0.227530 0.518072 +0.194868 0.227530 0.518072 +0.227530 0.227530 0.518072 +0.257434 0.227530 0.518072 +0.285092 0.227530 0.518072 +0.310738 0.227530 0.518072 +0.334585 0.227530 0.518072 +0.356818 0.227530 0.518072 +0.377602 0.227530 0.518072 +0.397079 0.227530 0.518072 +0.415373 0.227530 0.518072 +0.432594 0.227530 0.518072 +0.448839 0.227530 0.518072 +0.464192 0.227530 0.518072 +0.478729 0.227530 0.518072 +0.492515 0.227530 0.518072 +0.505612 0.227530 0.518072 +0.518072 0.227530 0.518072 +0.529943 0.227530 0.518072 +0.541266 0.227530 0.518072 +0.552083 0.227530 0.518072 +0.562427 0.227530 0.518072 +0.572331 0.227530 0.518072 +0.581823 0.227530 0.518072 +0.590929 0.227530 0.518072 +0.599674 0.227530 0.518072 +0.608079 0.227530 0.518072 +0.616166 0.227530 0.518072 +0.000001 0.257434 0.518072 +0.037293 0.257434 0.518072 +0.079714 0.257434 0.518072 +0.120832 0.257434 0.518072 +0.159284 0.257434 0.518072 +0.194868 0.257434 0.518072 +0.227530 0.257434 0.518072 +0.257434 0.257434 0.518072 +0.285092 0.257434 0.518072 +0.310738 0.257434 0.518072 +0.334585 0.257434 0.518072 +0.356818 0.257434 0.518072 +0.377602 0.257434 0.518072 +0.397079 0.257434 0.518072 +0.415373 0.257434 0.518072 +0.432594 0.257434 0.518072 +0.448839 0.257434 0.518072 +0.464192 0.257434 0.518072 +0.478729 0.257434 0.518072 +0.492515 0.257434 0.518072 +0.505612 0.257434 0.518072 +0.518072 0.257434 0.518072 +0.529943 0.257434 0.518072 +0.541266 0.257434 0.518072 +0.552083 0.257434 0.518072 +0.562427 0.257434 0.518072 +0.572331 0.257434 0.518072 +0.581823 0.257434 0.518072 +0.590929 0.257434 0.518072 +0.599674 0.257434 0.518072 +0.608079 0.257434 0.518072 +0.616166 0.257434 0.518072 +0.000001 0.285092 0.518072 +0.037293 0.285092 0.518072 +0.079714 0.285092 0.518072 +0.120832 0.285092 0.518072 +0.159284 0.285092 0.518072 +0.194868 0.285092 0.518072 +0.227530 0.285092 0.518072 +0.257434 0.285092 0.518072 +0.285092 0.285092 0.518072 +0.310738 0.285092 0.518072 +0.334585 0.285092 0.518072 +0.356818 0.285092 0.518072 +0.377602 0.285092 0.518072 +0.397079 0.285092 0.518072 +0.415373 0.285092 0.518072 +0.432594 0.285092 0.518072 +0.448839 0.285092 0.518072 +0.464192 0.285092 0.518072 +0.478729 0.285092 0.518072 +0.492515 0.285092 0.518072 +0.505612 0.285092 0.518072 +0.518072 0.285092 0.518072 +0.529943 0.285092 0.518072 +0.541266 0.285092 0.518072 +0.552083 0.285092 0.518072 +0.562427 0.285092 0.518072 +0.572331 0.285092 0.518072 +0.581823 0.285092 0.518072 +0.590929 0.285092 0.518072 +0.599674 0.285092 0.518072 +0.608079 0.285092 0.518072 +0.616166 0.285092 0.518072 +0.000001 0.310738 0.518072 +0.037293 0.310738 0.518072 +0.079714 0.310738 0.518072 +0.120832 0.310738 0.518072 +0.159284 0.310738 0.518072 +0.194868 0.310738 0.518072 +0.227530 0.310738 0.518072 +0.257434 0.310738 0.518072 +0.285092 0.310738 0.518072 +0.310738 0.310738 0.518072 +0.334585 0.310738 0.518072 +0.356818 0.310738 0.518072 +0.377602 0.310738 0.518072 +0.397079 0.310738 0.518072 +0.415373 0.310738 0.518072 +0.432594 0.310738 0.518072 +0.448839 0.310738 0.518072 +0.464192 0.310738 0.518072 +0.478729 0.310738 0.518072 +0.492515 0.310738 0.518072 +0.505612 0.310738 0.518072 +0.518072 0.310738 0.518072 +0.529943 0.310738 0.518072 +0.541266 0.310738 0.518072 +0.552083 0.310738 0.518072 +0.562427 0.310738 0.518072 +0.572331 0.310738 0.518072 +0.581823 0.310738 0.518072 +0.590929 0.310738 0.518072 +0.599674 0.310738 0.518072 +0.608079 0.310738 0.518072 +0.616166 0.310738 0.518072 +0.000001 0.334585 0.518072 +0.037293 0.334585 0.518072 +0.079714 0.334585 0.518072 +0.120832 0.334585 0.518072 +0.159284 0.334585 0.518072 +0.194868 0.334585 0.518072 +0.227530 0.334585 0.518072 +0.257434 0.334585 0.518072 +0.285092 0.334585 0.518072 +0.310738 0.334585 0.518072 +0.334585 0.334585 0.518072 +0.356818 0.334585 0.518072 +0.377602 0.334585 0.518072 +0.397079 0.334585 0.518072 +0.415373 0.334585 0.518072 +0.432594 0.334585 0.518072 +0.448839 0.334585 0.518072 +0.464192 0.334585 0.518072 +0.478729 0.334585 0.518072 +0.492515 0.334585 0.518072 +0.505612 0.334585 0.518072 +0.518072 0.334585 0.518072 +0.529943 0.334585 0.518072 +0.541266 0.334585 0.518072 +0.552083 0.334585 0.518072 +0.562427 0.334585 0.518072 +0.572331 0.334585 0.518072 +0.581823 0.334585 0.518072 +0.590929 0.334585 0.518072 +0.599674 0.334585 0.518072 +0.608079 0.334585 0.518072 +0.616166 0.334585 0.518072 +0.000001 0.356818 0.518072 +0.037293 0.356818 0.518072 +0.079714 0.356818 0.518072 +0.120832 0.356818 0.518072 +0.159284 0.356818 0.518072 +0.194868 0.356818 0.518072 +0.227530 0.356818 0.518072 +0.257434 0.356818 0.518072 +0.285092 0.356818 0.518072 +0.310738 0.356818 0.518072 +0.334585 0.356818 0.518072 +0.356818 0.356818 0.518072 +0.377602 0.356818 0.518072 +0.397079 0.356818 0.518072 +0.415373 0.356818 0.518072 +0.432594 0.356818 0.518072 +0.448839 0.356818 0.518072 +0.464192 0.356818 0.518072 +0.478729 0.356818 0.518072 +0.492515 0.356818 0.518072 +0.505612 0.356818 0.518072 +0.518072 0.356818 0.518072 +0.529943 0.356818 0.518072 +0.541266 0.356818 0.518072 +0.552083 0.356818 0.518072 +0.562427 0.356818 0.518072 +0.572331 0.356818 0.518072 +0.581823 0.356818 0.518072 +0.590929 0.356818 0.518072 +0.599674 0.356818 0.518072 +0.608079 0.356818 0.518072 +0.616166 0.356818 0.518072 +0.000001 0.377602 0.518072 +0.037293 0.377602 0.518072 +0.079714 0.377602 0.518072 +0.120832 0.377602 0.518072 +0.159284 0.377602 0.518072 +0.194868 0.377602 0.518072 +0.227530 0.377602 0.518072 +0.257434 0.377602 0.518072 +0.285092 0.377602 0.518072 +0.310738 0.377602 0.518072 +0.334585 0.377602 0.518072 +0.356818 0.377602 0.518072 +0.377602 0.377602 0.518072 +0.397079 0.377602 0.518072 +0.415373 0.377602 0.518072 +0.432594 0.377602 0.518072 +0.448839 0.377602 0.518072 +0.464192 0.377602 0.518072 +0.478729 0.377602 0.518072 +0.492515 0.377602 0.518072 +0.505612 0.377602 0.518072 +0.518072 0.377602 0.518072 +0.529943 0.377602 0.518072 +0.541266 0.377602 0.518072 +0.552083 0.377602 0.518072 +0.562427 0.377602 0.518072 +0.572331 0.377602 0.518072 +0.581823 0.377602 0.518072 +0.590929 0.377602 0.518072 +0.599674 0.377602 0.518072 +0.608079 0.377602 0.518072 +0.616166 0.377602 0.518072 +0.000001 0.397079 0.518072 +0.037293 0.397079 0.518072 +0.079714 0.397079 0.518072 +0.120832 0.397079 0.518072 +0.159284 0.397079 0.518072 +0.194868 0.397079 0.518072 +0.227530 0.397079 0.518072 +0.257434 0.397079 0.518072 +0.285092 0.397079 0.518072 +0.310738 0.397079 0.518072 +0.334585 0.397079 0.518072 +0.356818 0.397079 0.518072 +0.377602 0.397079 0.518072 +0.397079 0.397079 0.518072 +0.415373 0.397079 0.518072 +0.432594 0.397079 0.518072 +0.448839 0.397079 0.518072 +0.464192 0.397079 0.518072 +0.478729 0.397079 0.518072 +0.492515 0.397079 0.518072 +0.505612 0.397079 0.518072 +0.518072 0.397079 0.518072 +0.529943 0.397079 0.518072 +0.541266 0.397079 0.518072 +0.552083 0.397079 0.518072 +0.562427 0.397079 0.518072 +0.572331 0.397079 0.518072 +0.581823 0.397079 0.518072 +0.590929 0.397079 0.518072 +0.599674 0.397079 0.518072 +0.608079 0.397079 0.518072 +0.616166 0.397079 0.518072 +0.000001 0.415373 0.518072 +0.037293 0.415373 0.518072 +0.079714 0.415373 0.518072 +0.120832 0.415373 0.518072 +0.159284 0.415373 0.518072 +0.194868 0.415373 0.518072 +0.227530 0.415373 0.518072 +0.257434 0.415373 0.518072 +0.285092 0.415373 0.518072 +0.310738 0.415373 0.518072 +0.334585 0.415373 0.518072 +0.356818 0.415373 0.518072 +0.377602 0.415373 0.518072 +0.397079 0.415373 0.518072 +0.415373 0.415373 0.518072 +0.432594 0.415373 0.518072 +0.448839 0.415373 0.518072 +0.464192 0.415373 0.518072 +0.478729 0.415373 0.518072 +0.492515 0.415373 0.518072 +0.505612 0.415373 0.518072 +0.518072 0.415373 0.518072 +0.529943 0.415373 0.518072 +0.541266 0.415373 0.518072 +0.552083 0.415373 0.518072 +0.562427 0.415373 0.518072 +0.572331 0.415373 0.518072 +0.581823 0.415373 0.518072 +0.590929 0.415373 0.518072 +0.599674 0.415373 0.518072 +0.608079 0.415373 0.518072 +0.616166 0.415373 0.518072 +0.000001 0.432594 0.518072 +0.037293 0.432594 0.518072 +0.079714 0.432594 0.518072 +0.120832 0.432594 0.518072 +0.159284 0.432594 0.518072 +0.194868 0.432594 0.518072 +0.227530 0.432594 0.518072 +0.257434 0.432594 0.518072 +0.285092 0.432594 0.518072 +0.310738 0.432594 0.518072 +0.334585 0.432594 0.518072 +0.356818 0.432594 0.518072 +0.377602 0.432594 0.518072 +0.397079 0.432594 0.518072 +0.415373 0.432594 0.518072 +0.432594 0.432594 0.518072 +0.448839 0.432594 0.518072 +0.464192 0.432594 0.518072 +0.478729 0.432594 0.518072 +0.492515 0.432594 0.518072 +0.505612 0.432594 0.518072 +0.518072 0.432594 0.518072 +0.529943 0.432594 0.518072 +0.541266 0.432594 0.518072 +0.552083 0.432594 0.518072 +0.562427 0.432594 0.518072 +0.572331 0.432594 0.518072 +0.581823 0.432594 0.518072 +0.590929 0.432594 0.518072 +0.599674 0.432594 0.518072 +0.608079 0.432594 0.518072 +0.616166 0.432594 0.518072 +0.000001 0.448839 0.518072 +0.037293 0.448839 0.518072 +0.079714 0.448839 0.518072 +0.120832 0.448839 0.518072 +0.159284 0.448839 0.518072 +0.194868 0.448839 0.518072 +0.227530 0.448839 0.518072 +0.257434 0.448839 0.518072 +0.285092 0.448839 0.518072 +0.310738 0.448839 0.518072 +0.334585 0.448839 0.518072 +0.356818 0.448839 0.518072 +0.377602 0.448839 0.518072 +0.397079 0.448839 0.518072 +0.415373 0.448839 0.518072 +0.432594 0.448839 0.518072 +0.448839 0.448839 0.518072 +0.464192 0.448839 0.518072 +0.478729 0.448839 0.518072 +0.492515 0.448839 0.518072 +0.505612 0.448839 0.518072 +0.518072 0.448839 0.518072 +0.529943 0.448839 0.518072 +0.541266 0.448839 0.518072 +0.552083 0.448839 0.518072 +0.562427 0.448839 0.518072 +0.572331 0.448839 0.518072 +0.581823 0.448839 0.518072 +0.590929 0.448839 0.518072 +0.599674 0.448839 0.518072 +0.608079 0.448839 0.518072 +0.616166 0.448839 0.518072 +0.000001 0.464192 0.518072 +0.037293 0.464192 0.518072 +0.079714 0.464192 0.518072 +0.120832 0.464192 0.518072 +0.159284 0.464192 0.518072 +0.194868 0.464192 0.518072 +0.227530 0.464192 0.518072 +0.257434 0.464192 0.518072 +0.285092 0.464192 0.518072 +0.310738 0.464192 0.518072 +0.334585 0.464192 0.518072 +0.356818 0.464192 0.518072 +0.377602 0.464192 0.518072 +0.397079 0.464192 0.518072 +0.415373 0.464192 0.518072 +0.432594 0.464192 0.518072 +0.448839 0.464192 0.518072 +0.464192 0.464192 0.518072 +0.478729 0.464192 0.518072 +0.492515 0.464192 0.518072 +0.505612 0.464192 0.518072 +0.518072 0.464192 0.518072 +0.529943 0.464192 0.518072 +0.541266 0.464192 0.518072 +0.552083 0.464192 0.518072 +0.562427 0.464192 0.518072 +0.572331 0.464192 0.518072 +0.581823 0.464192 0.518072 +0.590929 0.464192 0.518072 +0.599674 0.464192 0.518072 +0.608079 0.464192 0.518072 +0.616166 0.464192 0.518072 +0.000001 0.478729 0.518072 +0.037293 0.478729 0.518072 +0.079714 0.478729 0.518072 +0.120832 0.478729 0.518072 +0.159284 0.478729 0.518072 +0.194868 0.478729 0.518072 +0.227530 0.478729 0.518072 +0.257434 0.478729 0.518072 +0.285092 0.478729 0.518072 +0.310738 0.478729 0.518072 +0.334585 0.478729 0.518072 +0.356818 0.478729 0.518072 +0.377602 0.478729 0.518072 +0.397079 0.478729 0.518072 +0.415373 0.478729 0.518072 +0.432594 0.478729 0.518072 +0.448839 0.478729 0.518072 +0.464192 0.478729 0.518072 +0.478729 0.478729 0.518072 +0.492515 0.478729 0.518072 +0.505612 0.478729 0.518072 +0.518072 0.478729 0.518072 +0.529943 0.478729 0.518072 +0.541266 0.478729 0.518072 +0.552083 0.478729 0.518072 +0.562427 0.478729 0.518072 +0.572331 0.478729 0.518072 +0.581823 0.478729 0.518072 +0.590929 0.478729 0.518072 +0.599674 0.478729 0.518072 +0.608079 0.478729 0.518072 +0.616166 0.478729 0.518072 +0.000001 0.492515 0.518072 +0.037293 0.492515 0.518072 +0.079714 0.492515 0.518072 +0.120832 0.492515 0.518072 +0.159284 0.492515 0.518072 +0.194868 0.492515 0.518072 +0.227530 0.492515 0.518072 +0.257434 0.492515 0.518072 +0.285092 0.492515 0.518072 +0.310738 0.492515 0.518072 +0.334585 0.492515 0.518072 +0.356818 0.492515 0.518072 +0.377602 0.492515 0.518072 +0.397079 0.492515 0.518072 +0.415373 0.492515 0.518072 +0.432594 0.492515 0.518072 +0.448839 0.492515 0.518072 +0.464192 0.492515 0.518072 +0.478729 0.492515 0.518072 +0.492515 0.492515 0.518072 +0.505612 0.492515 0.518072 +0.518072 0.492515 0.518072 +0.529943 0.492515 0.518072 +0.541266 0.492515 0.518072 +0.552083 0.492515 0.518072 +0.562427 0.492515 0.518072 +0.572331 0.492515 0.518072 +0.581823 0.492515 0.518072 +0.590929 0.492515 0.518072 +0.599674 0.492515 0.518072 +0.608079 0.492515 0.518072 +0.616166 0.492515 0.518072 +0.000001 0.505612 0.518072 +0.037293 0.505612 0.518072 +0.079714 0.505612 0.518072 +0.120832 0.505612 0.518072 +0.159284 0.505612 0.518072 +0.194868 0.505612 0.518072 +0.227530 0.505612 0.518072 +0.257434 0.505612 0.518072 +0.285092 0.505612 0.518072 +0.310738 0.505612 0.518072 +0.334585 0.505612 0.518072 +0.356818 0.505612 0.518072 +0.377602 0.505612 0.518072 +0.397079 0.505612 0.518072 +0.415373 0.505612 0.518072 +0.432594 0.505612 0.518072 +0.448839 0.505612 0.518072 +0.464192 0.505612 0.518072 +0.478729 0.505612 0.518072 +0.492515 0.505612 0.518072 +0.505612 0.505612 0.518072 +0.518072 0.505612 0.518072 +0.529943 0.505612 0.518072 +0.541266 0.505612 0.518072 +0.552083 0.505612 0.518072 +0.562427 0.505612 0.518072 +0.572331 0.505612 0.518072 +0.581823 0.505612 0.518072 +0.590929 0.505612 0.518072 +0.599674 0.505612 0.518072 +0.608079 0.505612 0.518072 +0.616166 0.505612 0.518072 +0.000001 0.518072 0.518072 +0.037293 0.518072 0.518072 +0.079714 0.518072 0.518072 +0.120832 0.518072 0.518072 +0.159284 0.518072 0.518072 +0.194868 0.518072 0.518072 +0.227530 0.518072 0.518072 +0.257434 0.518072 0.518072 +0.285092 0.518072 0.518072 +0.310738 0.518072 0.518072 +0.334585 0.518072 0.518072 +0.356818 0.518072 0.518072 +0.377602 0.518072 0.518072 +0.397079 0.518072 0.518072 +0.415373 0.518072 0.518072 +0.432594 0.518072 0.518072 +0.448839 0.518072 0.518072 +0.464192 0.518072 0.518072 +0.478729 0.518072 0.518072 +0.492515 0.518072 0.518072 +0.505612 0.518072 0.518072 +0.518072 0.518072 0.518072 +0.529943 0.518072 0.518072 +0.541266 0.518072 0.518072 +0.552083 0.518072 0.518072 +0.562427 0.518072 0.518072 +0.572331 0.518072 0.518072 +0.581823 0.518072 0.518072 +0.590929 0.518072 0.518072 +0.599674 0.518072 0.518072 +0.608079 0.518072 0.518072 +0.616166 0.518072 0.518072 +0.000001 0.529943 0.518072 +0.037293 0.529943 0.518072 +0.079714 0.529943 0.518072 +0.120832 0.529943 0.518072 +0.159284 0.529943 0.518072 +0.194868 0.529943 0.518072 +0.227530 0.529943 0.518072 +0.257434 0.529943 0.518072 +0.285092 0.529943 0.518072 +0.310738 0.529943 0.518072 +0.334585 0.529943 0.518072 +0.356818 0.529943 0.518072 +0.377602 0.529943 0.518072 +0.397079 0.529943 0.518072 +0.415373 0.529943 0.518072 +0.432594 0.529943 0.518072 +0.448839 0.529943 0.518072 +0.464192 0.529943 0.518072 +0.478729 0.529943 0.518072 +0.492515 0.529943 0.518072 +0.505612 0.529943 0.518072 +0.518072 0.529943 0.518072 +0.529943 0.529943 0.518072 +0.541266 0.529943 0.518072 +0.552083 0.529943 0.518072 +0.562427 0.529943 0.518072 +0.572331 0.529943 0.518072 +0.581823 0.529943 0.518072 +0.590929 0.529943 0.518072 +0.599674 0.529943 0.518072 +0.608079 0.529943 0.518072 +0.616166 0.529943 0.518072 +0.000001 0.541266 0.518072 +0.037293 0.541266 0.518072 +0.079714 0.541266 0.518072 +0.120832 0.541266 0.518072 +0.159284 0.541266 0.518072 +0.194868 0.541266 0.518072 +0.227530 0.541266 0.518072 +0.257434 0.541266 0.518072 +0.285092 0.541266 0.518072 +0.310738 0.541266 0.518072 +0.334585 0.541266 0.518072 +0.356818 0.541266 0.518072 +0.377602 0.541266 0.518072 +0.397079 0.541266 0.518072 +0.415373 0.541266 0.518072 +0.432594 0.541266 0.518072 +0.448839 0.541266 0.518072 +0.464192 0.541266 0.518072 +0.478729 0.541266 0.518072 +0.492515 0.541266 0.518072 +0.505612 0.541266 0.518072 +0.518072 0.541266 0.518072 +0.529943 0.541266 0.518072 +0.541266 0.541266 0.518072 +0.552083 0.541266 0.518072 +0.562427 0.541266 0.518072 +0.572331 0.541266 0.518072 +0.581823 0.541266 0.518072 +0.590929 0.541266 0.518072 +0.599674 0.541266 0.518072 +0.608079 0.541266 0.518072 +0.616166 0.541266 0.518072 +0.000001 0.552083 0.518072 +0.037293 0.552083 0.518072 +0.079714 0.552083 0.518072 +0.120832 0.552083 0.518072 +0.159284 0.552083 0.518072 +0.194868 0.552083 0.518072 +0.227530 0.552083 0.518072 +0.257434 0.552083 0.518072 +0.285092 0.552083 0.518072 +0.310738 0.552083 0.518072 +0.334585 0.552083 0.518072 +0.356818 0.552083 0.518072 +0.377602 0.552083 0.518072 +0.397079 0.552083 0.518072 +0.415373 0.552083 0.518072 +0.432594 0.552083 0.518072 +0.448839 0.552083 0.518072 +0.464192 0.552083 0.518072 +0.478729 0.552083 0.518072 +0.492515 0.552083 0.518072 +0.505612 0.552083 0.518072 +0.518072 0.552083 0.518072 +0.529943 0.552083 0.518072 +0.541266 0.552083 0.518072 +0.552083 0.552083 0.518072 +0.562427 0.552083 0.518072 +0.572331 0.552083 0.518072 +0.581823 0.552083 0.518072 +0.590929 0.552083 0.518072 +0.599674 0.552083 0.518072 +0.608079 0.552083 0.518072 +0.616166 0.552083 0.518072 +0.000001 0.562427 0.518072 +0.037293 0.562427 0.518072 +0.079714 0.562427 0.518072 +0.120832 0.562427 0.518072 +0.159284 0.562427 0.518072 +0.194868 0.562427 0.518072 +0.227530 0.562427 0.518072 +0.257434 0.562427 0.518072 +0.285092 0.562427 0.518072 +0.310738 0.562427 0.518072 +0.334585 0.562427 0.518072 +0.356818 0.562427 0.518072 +0.377602 0.562427 0.518072 +0.397079 0.562427 0.518072 +0.415373 0.562427 0.518072 +0.432594 0.562427 0.518072 +0.448839 0.562427 0.518072 +0.464192 0.562427 0.518072 +0.478729 0.562427 0.518072 +0.492515 0.562427 0.518072 +0.505612 0.562427 0.518072 +0.518072 0.562427 0.518072 +0.529943 0.562427 0.518072 +0.541266 0.562427 0.518072 +0.552083 0.562427 0.518072 +0.562427 0.562427 0.518072 +0.572331 0.562427 0.518072 +0.581823 0.562427 0.518072 +0.590929 0.562427 0.518072 +0.599674 0.562427 0.518072 +0.608079 0.562427 0.518072 +0.616166 0.562427 0.518072 +0.000001 0.572331 0.518072 +0.037293 0.572331 0.518072 +0.079714 0.572331 0.518072 +0.120832 0.572331 0.518072 +0.159284 0.572331 0.518072 +0.194868 0.572331 0.518072 +0.227530 0.572331 0.518072 +0.257434 0.572331 0.518072 +0.285092 0.572331 0.518072 +0.310738 0.572331 0.518072 +0.334585 0.572331 0.518072 +0.356818 0.572331 0.518072 +0.377602 0.572331 0.518072 +0.397079 0.572331 0.518072 +0.415373 0.572331 0.518072 +0.432594 0.572331 0.518072 +0.448839 0.572331 0.518072 +0.464192 0.572331 0.518072 +0.478729 0.572331 0.518072 +0.492515 0.572331 0.518072 +0.505612 0.572331 0.518072 +0.518072 0.572331 0.518072 +0.529943 0.572331 0.518072 +0.541266 0.572331 0.518072 +0.552083 0.572331 0.518072 +0.562427 0.572331 0.518072 +0.572331 0.572331 0.518072 +0.581823 0.572331 0.518072 +0.590929 0.572331 0.518072 +0.599674 0.572331 0.518072 +0.608079 0.572331 0.518072 +0.616166 0.572331 0.518072 +0.000001 0.581823 0.518072 +0.037293 0.581823 0.518072 +0.079714 0.581823 0.518072 +0.120832 0.581823 0.518072 +0.159284 0.581823 0.518072 +0.194868 0.581823 0.518072 +0.227530 0.581823 0.518072 +0.257434 0.581823 0.518072 +0.285092 0.581823 0.518072 +0.310738 0.581823 0.518072 +0.334585 0.581823 0.518072 +0.356818 0.581823 0.518072 +0.377602 0.581823 0.518072 +0.397079 0.581823 0.518072 +0.415373 0.581823 0.518072 +0.432594 0.581823 0.518072 +0.448839 0.581823 0.518072 +0.464192 0.581823 0.518072 +0.478729 0.581823 0.518072 +0.492515 0.581823 0.518072 +0.505612 0.581823 0.518072 +0.518072 0.581823 0.518072 +0.529943 0.581823 0.518072 +0.541266 0.581823 0.518072 +0.552083 0.581823 0.518072 +0.562427 0.581823 0.518072 +0.572331 0.581823 0.518072 +0.581823 0.581823 0.518072 +0.590929 0.581823 0.518072 +0.599674 0.581823 0.518072 +0.608079 0.581823 0.518072 +0.616166 0.581823 0.518072 +0.000001 0.590929 0.518072 +0.037293 0.590929 0.518072 +0.079714 0.590929 0.518072 +0.120832 0.590929 0.518072 +0.159284 0.590929 0.518072 +0.194868 0.590929 0.518072 +0.227530 0.590929 0.518072 +0.257434 0.590929 0.518072 +0.285092 0.590929 0.518072 +0.310738 0.590929 0.518072 +0.334585 0.590929 0.518072 +0.356818 0.590929 0.518072 +0.377602 0.590929 0.518072 +0.397079 0.590929 0.518072 +0.415373 0.590929 0.518072 +0.432594 0.590929 0.518072 +0.448839 0.590929 0.518072 +0.464192 0.590929 0.518072 +0.478729 0.590929 0.518072 +0.492515 0.590929 0.518072 +0.505612 0.590929 0.518072 +0.518072 0.590929 0.518072 +0.529943 0.590929 0.518072 +0.541266 0.590929 0.518072 +0.552083 0.590929 0.518072 +0.562427 0.590929 0.518072 +0.572331 0.590929 0.518072 +0.581823 0.590929 0.518072 +0.590929 0.590929 0.518072 +0.599674 0.590929 0.518072 +0.608079 0.590929 0.518072 +0.616166 0.590929 0.518072 +0.000001 0.599674 0.518072 +0.037293 0.599674 0.518072 +0.079714 0.599674 0.518072 +0.120832 0.599674 0.518072 +0.159284 0.599674 0.518072 +0.194868 0.599674 0.518072 +0.227530 0.599674 0.518072 +0.257434 0.599674 0.518072 +0.285092 0.599674 0.518072 +0.310738 0.599674 0.518072 +0.334585 0.599674 0.518072 +0.356818 0.599674 0.518072 +0.377602 0.599674 0.518072 +0.397079 0.599674 0.518072 +0.415373 0.599674 0.518072 +0.432594 0.599674 0.518072 +0.448839 0.599674 0.518072 +0.464192 0.599674 0.518072 +0.478729 0.599674 0.518072 +0.492515 0.599674 0.518072 +0.505612 0.599674 0.518072 +0.518072 0.599674 0.518072 +0.529943 0.599674 0.518072 +0.541266 0.599674 0.518072 +0.552083 0.599674 0.518072 +0.562427 0.599674 0.518072 +0.572331 0.599674 0.518072 +0.581823 0.599674 0.518072 +0.590929 0.599674 0.518072 +0.599674 0.599674 0.518072 +0.608079 0.599674 0.518072 +0.616166 0.599674 0.518072 +0.000001 0.608079 0.518072 +0.037293 0.608079 0.518072 +0.079714 0.608079 0.518072 +0.120832 0.608079 0.518072 +0.159284 0.608079 0.518072 +0.194868 0.608079 0.518072 +0.227530 0.608079 0.518072 +0.257434 0.608079 0.518072 +0.285092 0.608079 0.518072 +0.310738 0.608079 0.518072 +0.334585 0.608079 0.518072 +0.356818 0.608079 0.518072 +0.377602 0.608079 0.518072 +0.397079 0.608079 0.518072 +0.415373 0.608079 0.518072 +0.432594 0.608079 0.518072 +0.448839 0.608079 0.518072 +0.464192 0.608079 0.518072 +0.478729 0.608079 0.518072 +0.492515 0.608079 0.518072 +0.505612 0.608079 0.518072 +0.518072 0.608079 0.518072 +0.529943 0.608079 0.518072 +0.541266 0.608079 0.518072 +0.552083 0.608079 0.518072 +0.562427 0.608079 0.518072 +0.572331 0.608079 0.518072 +0.581823 0.608079 0.518072 +0.590929 0.608079 0.518072 +0.599674 0.608079 0.518072 +0.608079 0.608079 0.518072 +0.616166 0.608079 0.518072 +0.000001 0.616166 0.518072 +0.037293 0.616166 0.518072 +0.079714 0.616166 0.518072 +0.120832 0.616166 0.518072 +0.159284 0.616166 0.518072 +0.194868 0.616166 0.518072 +0.227530 0.616166 0.518072 +0.257434 0.616166 0.518072 +0.285092 0.616166 0.518072 +0.310738 0.616166 0.518072 +0.334585 0.616166 0.518072 +0.356818 0.616166 0.518072 +0.377602 0.616166 0.518072 +0.397079 0.616166 0.518072 +0.415373 0.616166 0.518072 +0.432594 0.616166 0.518072 +0.448839 0.616166 0.518072 +0.464192 0.616166 0.518072 +0.478729 0.616166 0.518072 +0.492515 0.616166 0.518072 +0.505612 0.616166 0.518072 +0.518072 0.616166 0.518072 +0.529943 0.616166 0.518072 +0.541266 0.616166 0.518072 +0.552083 0.616166 0.518072 +0.562427 0.616166 0.518072 +0.572331 0.616166 0.518072 +0.581823 0.616166 0.518072 +0.590929 0.616166 0.518072 +0.599674 0.616166 0.518072 +0.608079 0.616166 0.518072 +0.616166 0.616166 0.518072 +0.000001 0.000001 0.529943 +0.037293 0.000001 0.529943 +0.079714 0.000001 0.529943 +0.120832 0.000001 0.529943 +0.159284 0.000001 0.529943 +0.194868 0.000001 0.529943 +0.227530 0.000001 0.529943 +0.257434 0.000001 0.529943 +0.285092 0.000001 0.529943 +0.310738 0.000001 0.529943 +0.334585 0.000001 0.529943 +0.356818 0.000001 0.529943 +0.377602 0.000001 0.529943 +0.397079 0.000001 0.529943 +0.415373 0.000001 0.529943 +0.432594 0.000001 0.529943 +0.448839 0.000001 0.529943 +0.464192 0.000001 0.529943 +0.478729 0.000001 0.529943 +0.492515 0.000001 0.529943 +0.505612 0.000001 0.529943 +0.518072 0.000001 0.529943 +0.529943 0.000001 0.529943 +0.541266 0.000001 0.529943 +0.552083 0.000001 0.529943 +0.562427 0.000001 0.529943 +0.572331 0.000001 0.529943 +0.581823 0.000001 0.529943 +0.590929 0.000001 0.529943 +0.599674 0.000001 0.529943 +0.608079 0.000001 0.529943 +0.616166 0.000001 0.529943 +0.000001 0.037293 0.529943 +0.037293 0.037293 0.529943 +0.079714 0.037293 0.529943 +0.120832 0.037293 0.529943 +0.159284 0.037293 0.529943 +0.194868 0.037293 0.529943 +0.227530 0.037293 0.529943 +0.257434 0.037293 0.529943 +0.285092 0.037293 0.529943 +0.310738 0.037293 0.529943 +0.334585 0.037293 0.529943 +0.356818 0.037293 0.529943 +0.377602 0.037293 0.529943 +0.397079 0.037293 0.529943 +0.415373 0.037293 0.529943 +0.432594 0.037293 0.529943 +0.448839 0.037293 0.529943 +0.464192 0.037293 0.529943 +0.478729 0.037293 0.529943 +0.492515 0.037293 0.529943 +0.505612 0.037293 0.529943 +0.518072 0.037293 0.529943 +0.529943 0.037293 0.529943 +0.541266 0.037293 0.529943 +0.552083 0.037293 0.529943 +0.562427 0.037293 0.529943 +0.572331 0.037293 0.529943 +0.581823 0.037293 0.529943 +0.590929 0.037293 0.529943 +0.599674 0.037293 0.529943 +0.608079 0.037293 0.529943 +0.616166 0.037293 0.529943 +0.000001 0.079714 0.529943 +0.037293 0.079714 0.529943 +0.079714 0.079714 0.529943 +0.120832 0.079714 0.529943 +0.159284 0.079714 0.529943 +0.194868 0.079714 0.529943 +0.227530 0.079714 0.529943 +0.257434 0.079714 0.529943 +0.285092 0.079714 0.529943 +0.310738 0.079714 0.529943 +0.334585 0.079714 0.529943 +0.356818 0.079714 0.529943 +0.377602 0.079714 0.529943 +0.397079 0.079714 0.529943 +0.415373 0.079714 0.529943 +0.432594 0.079714 0.529943 +0.448839 0.079714 0.529943 +0.464192 0.079714 0.529943 +0.478729 0.079714 0.529943 +0.492515 0.079714 0.529943 +0.505612 0.079714 0.529943 +0.518072 0.079714 0.529943 +0.529943 0.079714 0.529943 +0.541266 0.079714 0.529943 +0.552083 0.079714 0.529943 +0.562427 0.079714 0.529943 +0.572331 0.079714 0.529943 +0.581823 0.079714 0.529943 +0.590929 0.079714 0.529943 +0.599674 0.079714 0.529943 +0.608079 0.079714 0.529943 +0.616166 0.079714 0.529943 +0.000001 0.120832 0.529943 +0.037293 0.120832 0.529943 +0.079714 0.120832 0.529943 +0.120832 0.120832 0.529943 +0.159284 0.120832 0.529943 +0.194868 0.120832 0.529943 +0.227530 0.120832 0.529943 +0.257434 0.120832 0.529943 +0.285092 0.120832 0.529943 +0.310738 0.120832 0.529943 +0.334585 0.120832 0.529943 +0.356818 0.120832 0.529943 +0.377602 0.120832 0.529943 +0.397079 0.120832 0.529943 +0.415373 0.120832 0.529943 +0.432594 0.120832 0.529943 +0.448839 0.120832 0.529943 +0.464192 0.120832 0.529943 +0.478729 0.120832 0.529943 +0.492515 0.120832 0.529943 +0.505612 0.120832 0.529943 +0.518072 0.120832 0.529943 +0.529943 0.120832 0.529943 +0.541266 0.120832 0.529943 +0.552083 0.120832 0.529943 +0.562427 0.120832 0.529943 +0.572331 0.120832 0.529943 +0.581823 0.120832 0.529943 +0.590929 0.120832 0.529943 +0.599674 0.120832 0.529943 +0.608079 0.120832 0.529943 +0.616166 0.120832 0.529943 +0.000001 0.159284 0.529943 +0.037293 0.159284 0.529943 +0.079714 0.159284 0.529943 +0.120832 0.159284 0.529943 +0.159284 0.159284 0.529943 +0.194868 0.159284 0.529943 +0.227530 0.159284 0.529943 +0.257434 0.159284 0.529943 +0.285092 0.159284 0.529943 +0.310738 0.159284 0.529943 +0.334585 0.159284 0.529943 +0.356818 0.159284 0.529943 +0.377602 0.159284 0.529943 +0.397079 0.159284 0.529943 +0.415373 0.159284 0.529943 +0.432594 0.159284 0.529943 +0.448839 0.159284 0.529943 +0.464192 0.159284 0.529943 +0.478729 0.159284 0.529943 +0.492515 0.159284 0.529943 +0.505612 0.159284 0.529943 +0.518072 0.159284 0.529943 +0.529943 0.159284 0.529943 +0.541266 0.159284 0.529943 +0.552083 0.159284 0.529943 +0.562427 0.159284 0.529943 +0.572331 0.159284 0.529943 +0.581823 0.159284 0.529943 +0.590929 0.159284 0.529943 +0.599674 0.159284 0.529943 +0.608079 0.159284 0.529943 +0.616166 0.159284 0.529943 +0.000001 0.194868 0.529943 +0.037293 0.194868 0.529943 +0.079714 0.194868 0.529943 +0.120832 0.194868 0.529943 +0.159284 0.194868 0.529943 +0.194868 0.194868 0.529943 +0.227530 0.194868 0.529943 +0.257434 0.194868 0.529943 +0.285092 0.194868 0.529943 +0.310738 0.194868 0.529943 +0.334585 0.194868 0.529943 +0.356818 0.194868 0.529943 +0.377602 0.194868 0.529943 +0.397079 0.194868 0.529943 +0.415373 0.194868 0.529943 +0.432594 0.194868 0.529943 +0.448839 0.194868 0.529943 +0.464192 0.194868 0.529943 +0.478729 0.194868 0.529943 +0.492515 0.194868 0.529943 +0.505612 0.194868 0.529943 +0.518072 0.194868 0.529943 +0.529943 0.194868 0.529943 +0.541266 0.194868 0.529943 +0.552083 0.194868 0.529943 +0.562427 0.194868 0.529943 +0.572331 0.194868 0.529943 +0.581823 0.194868 0.529943 +0.590929 0.194868 0.529943 +0.599674 0.194868 0.529943 +0.608079 0.194868 0.529943 +0.616166 0.194868 0.529943 +0.000001 0.227530 0.529943 +0.037293 0.227530 0.529943 +0.079714 0.227530 0.529943 +0.120832 0.227530 0.529943 +0.159284 0.227530 0.529943 +0.194868 0.227530 0.529943 +0.227530 0.227530 0.529943 +0.257434 0.227530 0.529943 +0.285092 0.227530 0.529943 +0.310738 0.227530 0.529943 +0.334585 0.227530 0.529943 +0.356818 0.227530 0.529943 +0.377602 0.227530 0.529943 +0.397079 0.227530 0.529943 +0.415373 0.227530 0.529943 +0.432594 0.227530 0.529943 +0.448839 0.227530 0.529943 +0.464192 0.227530 0.529943 +0.478729 0.227530 0.529943 +0.492515 0.227530 0.529943 +0.505612 0.227530 0.529943 +0.518072 0.227530 0.529943 +0.529943 0.227530 0.529943 +0.541266 0.227530 0.529943 +0.552083 0.227530 0.529943 +0.562427 0.227530 0.529943 +0.572331 0.227530 0.529943 +0.581823 0.227530 0.529943 +0.590929 0.227530 0.529943 +0.599674 0.227530 0.529943 +0.608079 0.227530 0.529943 +0.616166 0.227530 0.529943 +0.000001 0.257434 0.529943 +0.037293 0.257434 0.529943 +0.079714 0.257434 0.529943 +0.120832 0.257434 0.529943 +0.159284 0.257434 0.529943 +0.194868 0.257434 0.529943 +0.227530 0.257434 0.529943 +0.257434 0.257434 0.529943 +0.285092 0.257434 0.529943 +0.310738 0.257434 0.529943 +0.334585 0.257434 0.529943 +0.356818 0.257434 0.529943 +0.377602 0.257434 0.529943 +0.397079 0.257434 0.529943 +0.415373 0.257434 0.529943 +0.432594 0.257434 0.529943 +0.448839 0.257434 0.529943 +0.464192 0.257434 0.529943 +0.478729 0.257434 0.529943 +0.492515 0.257434 0.529943 +0.505612 0.257434 0.529943 +0.518072 0.257434 0.529943 +0.529943 0.257434 0.529943 +0.541266 0.257434 0.529943 +0.552083 0.257434 0.529943 +0.562427 0.257434 0.529943 +0.572331 0.257434 0.529943 +0.581823 0.257434 0.529943 +0.590929 0.257434 0.529943 +0.599674 0.257434 0.529943 +0.608079 0.257434 0.529943 +0.616166 0.257434 0.529943 +0.000001 0.285092 0.529943 +0.037293 0.285092 0.529943 +0.079714 0.285092 0.529943 +0.120832 0.285092 0.529943 +0.159284 0.285092 0.529943 +0.194868 0.285092 0.529943 +0.227530 0.285092 0.529943 +0.257434 0.285092 0.529943 +0.285092 0.285092 0.529943 +0.310738 0.285092 0.529943 +0.334585 0.285092 0.529943 +0.356818 0.285092 0.529943 +0.377602 0.285092 0.529943 +0.397079 0.285092 0.529943 +0.415373 0.285092 0.529943 +0.432594 0.285092 0.529943 +0.448839 0.285092 0.529943 +0.464192 0.285092 0.529943 +0.478729 0.285092 0.529943 +0.492515 0.285092 0.529943 +0.505612 0.285092 0.529943 +0.518072 0.285092 0.529943 +0.529943 0.285092 0.529943 +0.541266 0.285092 0.529943 +0.552083 0.285092 0.529943 +0.562427 0.285092 0.529943 +0.572331 0.285092 0.529943 +0.581823 0.285092 0.529943 +0.590929 0.285092 0.529943 +0.599674 0.285092 0.529943 +0.608079 0.285092 0.529943 +0.616166 0.285092 0.529943 +0.000001 0.310738 0.529943 +0.037293 0.310738 0.529943 +0.079714 0.310738 0.529943 +0.120832 0.310738 0.529943 +0.159284 0.310738 0.529943 +0.194868 0.310738 0.529943 +0.227530 0.310738 0.529943 +0.257434 0.310738 0.529943 +0.285092 0.310738 0.529943 +0.310738 0.310738 0.529943 +0.334585 0.310738 0.529943 +0.356818 0.310738 0.529943 +0.377602 0.310738 0.529943 +0.397079 0.310738 0.529943 +0.415373 0.310738 0.529943 +0.432594 0.310738 0.529943 +0.448839 0.310738 0.529943 +0.464192 0.310738 0.529943 +0.478729 0.310738 0.529943 +0.492515 0.310738 0.529943 +0.505612 0.310738 0.529943 +0.518072 0.310738 0.529943 +0.529943 0.310738 0.529943 +0.541266 0.310738 0.529943 +0.552083 0.310738 0.529943 +0.562427 0.310738 0.529943 +0.572331 0.310738 0.529943 +0.581823 0.310738 0.529943 +0.590929 0.310738 0.529943 +0.599674 0.310738 0.529943 +0.608079 0.310738 0.529943 +0.616166 0.310738 0.529943 +0.000001 0.334585 0.529943 +0.037293 0.334585 0.529943 +0.079714 0.334585 0.529943 +0.120832 0.334585 0.529943 +0.159284 0.334585 0.529943 +0.194868 0.334585 0.529943 +0.227530 0.334585 0.529943 +0.257434 0.334585 0.529943 +0.285092 0.334585 0.529943 +0.310738 0.334585 0.529943 +0.334585 0.334585 0.529943 +0.356818 0.334585 0.529943 +0.377602 0.334585 0.529943 +0.397079 0.334585 0.529943 +0.415373 0.334585 0.529943 +0.432594 0.334585 0.529943 +0.448839 0.334585 0.529943 +0.464192 0.334585 0.529943 +0.478729 0.334585 0.529943 +0.492515 0.334585 0.529943 +0.505612 0.334585 0.529943 +0.518072 0.334585 0.529943 +0.529943 0.334585 0.529943 +0.541266 0.334585 0.529943 +0.552083 0.334585 0.529943 +0.562427 0.334585 0.529943 +0.572331 0.334585 0.529943 +0.581823 0.334585 0.529943 +0.590929 0.334585 0.529943 +0.599674 0.334585 0.529943 +0.608079 0.334585 0.529943 +0.616166 0.334585 0.529943 +0.000001 0.356818 0.529943 +0.037293 0.356818 0.529943 +0.079714 0.356818 0.529943 +0.120832 0.356818 0.529943 +0.159284 0.356818 0.529943 +0.194868 0.356818 0.529943 +0.227530 0.356818 0.529943 +0.257434 0.356818 0.529943 +0.285092 0.356818 0.529943 +0.310738 0.356818 0.529943 +0.334585 0.356818 0.529943 +0.356818 0.356818 0.529943 +0.377602 0.356818 0.529943 +0.397079 0.356818 0.529943 +0.415373 0.356818 0.529943 +0.432594 0.356818 0.529943 +0.448839 0.356818 0.529943 +0.464192 0.356818 0.529943 +0.478729 0.356818 0.529943 +0.492515 0.356818 0.529943 +0.505612 0.356818 0.529943 +0.518072 0.356818 0.529943 +0.529943 0.356818 0.529943 +0.541266 0.356818 0.529943 +0.552083 0.356818 0.529943 +0.562427 0.356818 0.529943 +0.572331 0.356818 0.529943 +0.581823 0.356818 0.529943 +0.590929 0.356818 0.529943 +0.599674 0.356818 0.529943 +0.608079 0.356818 0.529943 +0.616166 0.356818 0.529943 +0.000001 0.377602 0.529943 +0.037293 0.377602 0.529943 +0.079714 0.377602 0.529943 +0.120832 0.377602 0.529943 +0.159284 0.377602 0.529943 +0.194868 0.377602 0.529943 +0.227530 0.377602 0.529943 +0.257434 0.377602 0.529943 +0.285092 0.377602 0.529943 +0.310738 0.377602 0.529943 +0.334585 0.377602 0.529943 +0.356818 0.377602 0.529943 +0.377602 0.377602 0.529943 +0.397079 0.377602 0.529943 +0.415373 0.377602 0.529943 +0.432594 0.377602 0.529943 +0.448839 0.377602 0.529943 +0.464192 0.377602 0.529943 +0.478729 0.377602 0.529943 +0.492515 0.377602 0.529943 +0.505612 0.377602 0.529943 +0.518072 0.377602 0.529943 +0.529943 0.377602 0.529943 +0.541266 0.377602 0.529943 +0.552083 0.377602 0.529943 +0.562427 0.377602 0.529943 +0.572331 0.377602 0.529943 +0.581823 0.377602 0.529943 +0.590929 0.377602 0.529943 +0.599674 0.377602 0.529943 +0.608079 0.377602 0.529943 +0.616166 0.377602 0.529943 +0.000001 0.397079 0.529943 +0.037293 0.397079 0.529943 +0.079714 0.397079 0.529943 +0.120832 0.397079 0.529943 +0.159284 0.397079 0.529943 +0.194868 0.397079 0.529943 +0.227530 0.397079 0.529943 +0.257434 0.397079 0.529943 +0.285092 0.397079 0.529943 +0.310738 0.397079 0.529943 +0.334585 0.397079 0.529943 +0.356818 0.397079 0.529943 +0.377602 0.397079 0.529943 +0.397079 0.397079 0.529943 +0.415373 0.397079 0.529943 +0.432594 0.397079 0.529943 +0.448839 0.397079 0.529943 +0.464192 0.397079 0.529943 +0.478729 0.397079 0.529943 +0.492515 0.397079 0.529943 +0.505612 0.397079 0.529943 +0.518072 0.397079 0.529943 +0.529943 0.397079 0.529943 +0.541266 0.397079 0.529943 +0.552083 0.397079 0.529943 +0.562427 0.397079 0.529943 +0.572331 0.397079 0.529943 +0.581823 0.397079 0.529943 +0.590929 0.397079 0.529943 +0.599674 0.397079 0.529943 +0.608079 0.397079 0.529943 +0.616166 0.397079 0.529943 +0.000001 0.415373 0.529943 +0.037293 0.415373 0.529943 +0.079714 0.415373 0.529943 +0.120832 0.415373 0.529943 +0.159284 0.415373 0.529943 +0.194868 0.415373 0.529943 +0.227530 0.415373 0.529943 +0.257434 0.415373 0.529943 +0.285092 0.415373 0.529943 +0.310738 0.415373 0.529943 +0.334585 0.415373 0.529943 +0.356818 0.415373 0.529943 +0.377602 0.415373 0.529943 +0.397079 0.415373 0.529943 +0.415373 0.415373 0.529943 +0.432594 0.415373 0.529943 +0.448839 0.415373 0.529943 +0.464192 0.415373 0.529943 +0.478729 0.415373 0.529943 +0.492515 0.415373 0.529943 +0.505612 0.415373 0.529943 +0.518072 0.415373 0.529943 +0.529943 0.415373 0.529943 +0.541266 0.415373 0.529943 +0.552083 0.415373 0.529943 +0.562427 0.415373 0.529943 +0.572331 0.415373 0.529943 +0.581823 0.415373 0.529943 +0.590929 0.415373 0.529943 +0.599674 0.415373 0.529943 +0.608079 0.415373 0.529943 +0.616166 0.415373 0.529943 +0.000001 0.432594 0.529943 +0.037293 0.432594 0.529943 +0.079714 0.432594 0.529943 +0.120832 0.432594 0.529943 +0.159284 0.432594 0.529943 +0.194868 0.432594 0.529943 +0.227530 0.432594 0.529943 +0.257434 0.432594 0.529943 +0.285092 0.432594 0.529943 +0.310738 0.432594 0.529943 +0.334585 0.432594 0.529943 +0.356818 0.432594 0.529943 +0.377602 0.432594 0.529943 +0.397079 0.432594 0.529943 +0.415373 0.432594 0.529943 +0.432594 0.432594 0.529943 +0.448839 0.432594 0.529943 +0.464192 0.432594 0.529943 +0.478729 0.432594 0.529943 +0.492515 0.432594 0.529943 +0.505612 0.432594 0.529943 +0.518072 0.432594 0.529943 +0.529943 0.432594 0.529943 +0.541266 0.432594 0.529943 +0.552083 0.432594 0.529943 +0.562427 0.432594 0.529943 +0.572331 0.432594 0.529943 +0.581823 0.432594 0.529943 +0.590929 0.432594 0.529943 +0.599674 0.432594 0.529943 +0.608079 0.432594 0.529943 +0.616166 0.432594 0.529943 +0.000001 0.448839 0.529943 +0.037293 0.448839 0.529943 +0.079714 0.448839 0.529943 +0.120832 0.448839 0.529943 +0.159284 0.448839 0.529943 +0.194868 0.448839 0.529943 +0.227530 0.448839 0.529943 +0.257434 0.448839 0.529943 +0.285092 0.448839 0.529943 +0.310738 0.448839 0.529943 +0.334585 0.448839 0.529943 +0.356818 0.448839 0.529943 +0.377602 0.448839 0.529943 +0.397079 0.448839 0.529943 +0.415373 0.448839 0.529943 +0.432594 0.448839 0.529943 +0.448839 0.448839 0.529943 +0.464192 0.448839 0.529943 +0.478729 0.448839 0.529943 +0.492515 0.448839 0.529943 +0.505612 0.448839 0.529943 +0.518072 0.448839 0.529943 +0.529943 0.448839 0.529943 +0.541266 0.448839 0.529943 +0.552083 0.448839 0.529943 +0.562427 0.448839 0.529943 +0.572331 0.448839 0.529943 +0.581823 0.448839 0.529943 +0.590929 0.448839 0.529943 +0.599674 0.448839 0.529943 +0.608079 0.448839 0.529943 +0.616166 0.448839 0.529943 +0.000001 0.464192 0.529943 +0.037293 0.464192 0.529943 +0.079714 0.464192 0.529943 +0.120832 0.464192 0.529943 +0.159284 0.464192 0.529943 +0.194868 0.464192 0.529943 +0.227530 0.464192 0.529943 +0.257434 0.464192 0.529943 +0.285092 0.464192 0.529943 +0.310738 0.464192 0.529943 +0.334585 0.464192 0.529943 +0.356818 0.464192 0.529943 +0.377602 0.464192 0.529943 +0.397079 0.464192 0.529943 +0.415373 0.464192 0.529943 +0.432594 0.464192 0.529943 +0.448839 0.464192 0.529943 +0.464192 0.464192 0.529943 +0.478729 0.464192 0.529943 +0.492515 0.464192 0.529943 +0.505612 0.464192 0.529943 +0.518072 0.464192 0.529943 +0.529943 0.464192 0.529943 +0.541266 0.464192 0.529943 +0.552083 0.464192 0.529943 +0.562427 0.464192 0.529943 +0.572331 0.464192 0.529943 +0.581823 0.464192 0.529943 +0.590929 0.464192 0.529943 +0.599674 0.464192 0.529943 +0.608079 0.464192 0.529943 +0.616166 0.464192 0.529943 +0.000001 0.478729 0.529943 +0.037293 0.478729 0.529943 +0.079714 0.478729 0.529943 +0.120832 0.478729 0.529943 +0.159284 0.478729 0.529943 +0.194868 0.478729 0.529943 +0.227530 0.478729 0.529943 +0.257434 0.478729 0.529943 +0.285092 0.478729 0.529943 +0.310738 0.478729 0.529943 +0.334585 0.478729 0.529943 +0.356818 0.478729 0.529943 +0.377602 0.478729 0.529943 +0.397079 0.478729 0.529943 +0.415373 0.478729 0.529943 +0.432594 0.478729 0.529943 +0.448839 0.478729 0.529943 +0.464192 0.478729 0.529943 +0.478729 0.478729 0.529943 +0.492515 0.478729 0.529943 +0.505612 0.478729 0.529943 +0.518072 0.478729 0.529943 +0.529943 0.478729 0.529943 +0.541266 0.478729 0.529943 +0.552083 0.478729 0.529943 +0.562427 0.478729 0.529943 +0.572331 0.478729 0.529943 +0.581823 0.478729 0.529943 +0.590929 0.478729 0.529943 +0.599674 0.478729 0.529943 +0.608079 0.478729 0.529943 +0.616166 0.478729 0.529943 +0.000001 0.492515 0.529943 +0.037293 0.492515 0.529943 +0.079714 0.492515 0.529943 +0.120832 0.492515 0.529943 +0.159284 0.492515 0.529943 +0.194868 0.492515 0.529943 +0.227530 0.492515 0.529943 +0.257434 0.492515 0.529943 +0.285092 0.492515 0.529943 +0.310738 0.492515 0.529943 +0.334585 0.492515 0.529943 +0.356818 0.492515 0.529943 +0.377602 0.492515 0.529943 +0.397079 0.492515 0.529943 +0.415373 0.492515 0.529943 +0.432594 0.492515 0.529943 +0.448839 0.492515 0.529943 +0.464192 0.492515 0.529943 +0.478729 0.492515 0.529943 +0.492515 0.492515 0.529943 +0.505612 0.492515 0.529943 +0.518072 0.492515 0.529943 +0.529943 0.492515 0.529943 +0.541266 0.492515 0.529943 +0.552083 0.492515 0.529943 +0.562427 0.492515 0.529943 +0.572331 0.492515 0.529943 +0.581823 0.492515 0.529943 +0.590929 0.492515 0.529943 +0.599674 0.492515 0.529943 +0.608079 0.492515 0.529943 +0.616166 0.492515 0.529943 +0.000001 0.505612 0.529943 +0.037293 0.505612 0.529943 +0.079714 0.505612 0.529943 +0.120832 0.505612 0.529943 +0.159284 0.505612 0.529943 +0.194868 0.505612 0.529943 +0.227530 0.505612 0.529943 +0.257434 0.505612 0.529943 +0.285092 0.505612 0.529943 +0.310738 0.505612 0.529943 +0.334585 0.505612 0.529943 +0.356818 0.505612 0.529943 +0.377602 0.505612 0.529943 +0.397079 0.505612 0.529943 +0.415373 0.505612 0.529943 +0.432594 0.505612 0.529943 +0.448839 0.505612 0.529943 +0.464192 0.505612 0.529943 +0.478729 0.505612 0.529943 +0.492515 0.505612 0.529943 +0.505612 0.505612 0.529943 +0.518072 0.505612 0.529943 +0.529943 0.505612 0.529943 +0.541266 0.505612 0.529943 +0.552083 0.505612 0.529943 +0.562427 0.505612 0.529943 +0.572331 0.505612 0.529943 +0.581823 0.505612 0.529943 +0.590929 0.505612 0.529943 +0.599674 0.505612 0.529943 +0.608079 0.505612 0.529943 +0.616166 0.505612 0.529943 +0.000001 0.518072 0.529943 +0.037293 0.518072 0.529943 +0.079714 0.518072 0.529943 +0.120832 0.518072 0.529943 +0.159284 0.518072 0.529943 +0.194868 0.518072 0.529943 +0.227530 0.518072 0.529943 +0.257434 0.518072 0.529943 +0.285092 0.518072 0.529943 +0.310738 0.518072 0.529943 +0.334585 0.518072 0.529943 +0.356818 0.518072 0.529943 +0.377602 0.518072 0.529943 +0.397079 0.518072 0.529943 +0.415373 0.518072 0.529943 +0.432594 0.518072 0.529943 +0.448839 0.518072 0.529943 +0.464192 0.518072 0.529943 +0.478729 0.518072 0.529943 +0.492515 0.518072 0.529943 +0.505612 0.518072 0.529943 +0.518072 0.518072 0.529943 +0.529943 0.518072 0.529943 +0.541266 0.518072 0.529943 +0.552083 0.518072 0.529943 +0.562427 0.518072 0.529943 +0.572331 0.518072 0.529943 +0.581823 0.518072 0.529943 +0.590929 0.518072 0.529943 +0.599674 0.518072 0.529943 +0.608079 0.518072 0.529943 +0.616166 0.518072 0.529943 +0.000001 0.529943 0.529943 +0.037293 0.529943 0.529943 +0.079714 0.529943 0.529943 +0.120832 0.529943 0.529943 +0.159284 0.529943 0.529943 +0.194868 0.529943 0.529943 +0.227530 0.529943 0.529943 +0.257434 0.529943 0.529943 +0.285092 0.529943 0.529943 +0.310738 0.529943 0.529943 +0.334585 0.529943 0.529943 +0.356818 0.529943 0.529943 +0.377602 0.529943 0.529943 +0.397079 0.529943 0.529943 +0.415373 0.529943 0.529943 +0.432594 0.529943 0.529943 +0.448839 0.529943 0.529943 +0.464192 0.529943 0.529943 +0.478729 0.529943 0.529943 +0.492515 0.529943 0.529943 +0.505612 0.529943 0.529943 +0.518072 0.529943 0.529943 +0.529943 0.529943 0.529943 +0.541266 0.529943 0.529943 +0.552083 0.529943 0.529943 +0.562427 0.529943 0.529943 +0.572331 0.529943 0.529943 +0.581823 0.529943 0.529943 +0.590929 0.529943 0.529943 +0.599674 0.529943 0.529943 +0.608079 0.529943 0.529943 +0.616166 0.529943 0.529943 +0.000001 0.541266 0.529943 +0.037293 0.541266 0.529943 +0.079714 0.541266 0.529943 +0.120832 0.541266 0.529943 +0.159284 0.541266 0.529943 +0.194868 0.541266 0.529943 +0.227530 0.541266 0.529943 +0.257434 0.541266 0.529943 +0.285092 0.541266 0.529943 +0.310738 0.541266 0.529943 +0.334585 0.541266 0.529943 +0.356818 0.541266 0.529943 +0.377602 0.541266 0.529943 +0.397079 0.541266 0.529943 +0.415373 0.541266 0.529943 +0.432594 0.541266 0.529943 +0.448839 0.541266 0.529943 +0.464192 0.541266 0.529943 +0.478729 0.541266 0.529943 +0.492515 0.541266 0.529943 +0.505612 0.541266 0.529943 +0.518072 0.541266 0.529943 +0.529943 0.541266 0.529943 +0.541266 0.541266 0.529943 +0.552083 0.541266 0.529943 +0.562427 0.541266 0.529943 +0.572331 0.541266 0.529943 +0.581823 0.541266 0.529943 +0.590929 0.541266 0.529943 +0.599674 0.541266 0.529943 +0.608079 0.541266 0.529943 +0.616166 0.541266 0.529943 +0.000001 0.552083 0.529943 +0.037293 0.552083 0.529943 +0.079714 0.552083 0.529943 +0.120832 0.552083 0.529943 +0.159284 0.552083 0.529943 +0.194868 0.552083 0.529943 +0.227530 0.552083 0.529943 +0.257434 0.552083 0.529943 +0.285092 0.552083 0.529943 +0.310738 0.552083 0.529943 +0.334585 0.552083 0.529943 +0.356818 0.552083 0.529943 +0.377602 0.552083 0.529943 +0.397079 0.552083 0.529943 +0.415373 0.552083 0.529943 +0.432594 0.552083 0.529943 +0.448839 0.552083 0.529943 +0.464192 0.552083 0.529943 +0.478729 0.552083 0.529943 +0.492515 0.552083 0.529943 +0.505612 0.552083 0.529943 +0.518072 0.552083 0.529943 +0.529943 0.552083 0.529943 +0.541266 0.552083 0.529943 +0.552083 0.552083 0.529943 +0.562427 0.552083 0.529943 +0.572331 0.552083 0.529943 +0.581823 0.552083 0.529943 +0.590929 0.552083 0.529943 +0.599674 0.552083 0.529943 +0.608079 0.552083 0.529943 +0.616166 0.552083 0.529943 +0.000001 0.562427 0.529943 +0.037293 0.562427 0.529943 +0.079714 0.562427 0.529943 +0.120832 0.562427 0.529943 +0.159284 0.562427 0.529943 +0.194868 0.562427 0.529943 +0.227530 0.562427 0.529943 +0.257434 0.562427 0.529943 +0.285092 0.562427 0.529943 +0.310738 0.562427 0.529943 +0.334585 0.562427 0.529943 +0.356818 0.562427 0.529943 +0.377602 0.562427 0.529943 +0.397079 0.562427 0.529943 +0.415373 0.562427 0.529943 +0.432594 0.562427 0.529943 +0.448839 0.562427 0.529943 +0.464192 0.562427 0.529943 +0.478729 0.562427 0.529943 +0.492515 0.562427 0.529943 +0.505612 0.562427 0.529943 +0.518072 0.562427 0.529943 +0.529943 0.562427 0.529943 +0.541266 0.562427 0.529943 +0.552083 0.562427 0.529943 +0.562427 0.562427 0.529943 +0.572331 0.562427 0.529943 +0.581823 0.562427 0.529943 +0.590929 0.562427 0.529943 +0.599674 0.562427 0.529943 +0.608079 0.562427 0.529943 +0.616166 0.562427 0.529943 +0.000001 0.572331 0.529943 +0.037293 0.572331 0.529943 +0.079714 0.572331 0.529943 +0.120832 0.572331 0.529943 +0.159284 0.572331 0.529943 +0.194868 0.572331 0.529943 +0.227530 0.572331 0.529943 +0.257434 0.572331 0.529943 +0.285092 0.572331 0.529943 +0.310738 0.572331 0.529943 +0.334585 0.572331 0.529943 +0.356818 0.572331 0.529943 +0.377602 0.572331 0.529943 +0.397079 0.572331 0.529943 +0.415373 0.572331 0.529943 +0.432594 0.572331 0.529943 +0.448839 0.572331 0.529943 +0.464192 0.572331 0.529943 +0.478729 0.572331 0.529943 +0.492515 0.572331 0.529943 +0.505612 0.572331 0.529943 +0.518072 0.572331 0.529943 +0.529943 0.572331 0.529943 +0.541266 0.572331 0.529943 +0.552083 0.572331 0.529943 +0.562427 0.572331 0.529943 +0.572331 0.572331 0.529943 +0.581823 0.572331 0.529943 +0.590929 0.572331 0.529943 +0.599674 0.572331 0.529943 +0.608079 0.572331 0.529943 +0.616166 0.572331 0.529943 +0.000001 0.581823 0.529943 +0.037293 0.581823 0.529943 +0.079714 0.581823 0.529943 +0.120832 0.581823 0.529943 +0.159284 0.581823 0.529943 +0.194868 0.581823 0.529943 +0.227530 0.581823 0.529943 +0.257434 0.581823 0.529943 +0.285092 0.581823 0.529943 +0.310738 0.581823 0.529943 +0.334585 0.581823 0.529943 +0.356818 0.581823 0.529943 +0.377602 0.581823 0.529943 +0.397079 0.581823 0.529943 +0.415373 0.581823 0.529943 +0.432594 0.581823 0.529943 +0.448839 0.581823 0.529943 +0.464192 0.581823 0.529943 +0.478729 0.581823 0.529943 +0.492515 0.581823 0.529943 +0.505612 0.581823 0.529943 +0.518072 0.581823 0.529943 +0.529943 0.581823 0.529943 +0.541266 0.581823 0.529943 +0.552083 0.581823 0.529943 +0.562427 0.581823 0.529943 +0.572331 0.581823 0.529943 +0.581823 0.581823 0.529943 +0.590929 0.581823 0.529943 +0.599674 0.581823 0.529943 +0.608079 0.581823 0.529943 +0.616166 0.581823 0.529943 +0.000001 0.590929 0.529943 +0.037293 0.590929 0.529943 +0.079714 0.590929 0.529943 +0.120832 0.590929 0.529943 +0.159284 0.590929 0.529943 +0.194868 0.590929 0.529943 +0.227530 0.590929 0.529943 +0.257434 0.590929 0.529943 +0.285092 0.590929 0.529943 +0.310738 0.590929 0.529943 +0.334585 0.590929 0.529943 +0.356818 0.590929 0.529943 +0.377602 0.590929 0.529943 +0.397079 0.590929 0.529943 +0.415373 0.590929 0.529943 +0.432594 0.590929 0.529943 +0.448839 0.590929 0.529943 +0.464192 0.590929 0.529943 +0.478729 0.590929 0.529943 +0.492515 0.590929 0.529943 +0.505612 0.590929 0.529943 +0.518072 0.590929 0.529943 +0.529943 0.590929 0.529943 +0.541266 0.590929 0.529943 +0.552083 0.590929 0.529943 +0.562427 0.590929 0.529943 +0.572331 0.590929 0.529943 +0.581823 0.590929 0.529943 +0.590929 0.590929 0.529943 +0.599674 0.590929 0.529943 +0.608079 0.590929 0.529943 +0.616166 0.590929 0.529943 +0.000001 0.599674 0.529943 +0.037293 0.599674 0.529943 +0.079714 0.599674 0.529943 +0.120832 0.599674 0.529943 +0.159284 0.599674 0.529943 +0.194868 0.599674 0.529943 +0.227530 0.599674 0.529943 +0.257434 0.599674 0.529943 +0.285092 0.599674 0.529943 +0.310738 0.599674 0.529943 +0.334585 0.599674 0.529943 +0.356818 0.599674 0.529943 +0.377602 0.599674 0.529943 +0.397079 0.599674 0.529943 +0.415373 0.599674 0.529943 +0.432594 0.599674 0.529943 +0.448839 0.599674 0.529943 +0.464192 0.599674 0.529943 +0.478729 0.599674 0.529943 +0.492515 0.599674 0.529943 +0.505612 0.599674 0.529943 +0.518072 0.599674 0.529943 +0.529943 0.599674 0.529943 +0.541266 0.599674 0.529943 +0.552083 0.599674 0.529943 +0.562427 0.599674 0.529943 +0.572331 0.599674 0.529943 +0.581823 0.599674 0.529943 +0.590929 0.599674 0.529943 +0.599674 0.599674 0.529943 +0.608079 0.599674 0.529943 +0.616166 0.599674 0.529943 +0.000001 0.608079 0.529943 +0.037293 0.608079 0.529943 +0.079714 0.608079 0.529943 +0.120832 0.608079 0.529943 +0.159284 0.608079 0.529943 +0.194868 0.608079 0.529943 +0.227530 0.608079 0.529943 +0.257434 0.608079 0.529943 +0.285092 0.608079 0.529943 +0.310738 0.608079 0.529943 +0.334585 0.608079 0.529943 +0.356818 0.608079 0.529943 +0.377602 0.608079 0.529943 +0.397079 0.608079 0.529943 +0.415373 0.608079 0.529943 +0.432594 0.608079 0.529943 +0.448839 0.608079 0.529943 +0.464192 0.608079 0.529943 +0.478729 0.608079 0.529943 +0.492515 0.608079 0.529943 +0.505612 0.608079 0.529943 +0.518072 0.608079 0.529943 +0.529943 0.608079 0.529943 +0.541266 0.608079 0.529943 +0.552083 0.608079 0.529943 +0.562427 0.608079 0.529943 +0.572331 0.608079 0.529943 +0.581823 0.608079 0.529943 +0.590929 0.608079 0.529943 +0.599674 0.608079 0.529943 +0.608079 0.608079 0.529943 +0.616166 0.608079 0.529943 +0.000001 0.616166 0.529943 +0.037293 0.616166 0.529943 +0.079714 0.616166 0.529943 +0.120832 0.616166 0.529943 +0.159284 0.616166 0.529943 +0.194868 0.616166 0.529943 +0.227530 0.616166 0.529943 +0.257434 0.616166 0.529943 +0.285092 0.616166 0.529943 +0.310738 0.616166 0.529943 +0.334585 0.616166 0.529943 +0.356818 0.616166 0.529943 +0.377602 0.616166 0.529943 +0.397079 0.616166 0.529943 +0.415373 0.616166 0.529943 +0.432594 0.616166 0.529943 +0.448839 0.616166 0.529943 +0.464192 0.616166 0.529943 +0.478729 0.616166 0.529943 +0.492515 0.616166 0.529943 +0.505612 0.616166 0.529943 +0.518072 0.616166 0.529943 +0.529943 0.616166 0.529943 +0.541266 0.616166 0.529943 +0.552083 0.616166 0.529943 +0.562427 0.616166 0.529943 +0.572331 0.616166 0.529943 +0.581823 0.616166 0.529943 +0.590929 0.616166 0.529943 +0.599674 0.616166 0.529943 +0.608079 0.616166 0.529943 +0.616166 0.616166 0.529943 +0.000001 0.000001 0.541266 +0.037293 0.000001 0.541266 +0.079714 0.000001 0.541266 +0.120832 0.000001 0.541266 +0.159284 0.000001 0.541266 +0.194868 0.000001 0.541266 +0.227530 0.000001 0.541266 +0.257434 0.000001 0.541266 +0.285092 0.000001 0.541266 +0.310738 0.000001 0.541266 +0.334585 0.000001 0.541266 +0.356818 0.000001 0.541266 +0.377602 0.000001 0.541266 +0.397079 0.000001 0.541266 +0.415373 0.000001 0.541266 +0.432594 0.000001 0.541266 +0.448839 0.000001 0.541266 +0.464192 0.000001 0.541266 +0.478729 0.000001 0.541266 +0.492515 0.000001 0.541266 +0.505612 0.000001 0.541266 +0.518072 0.000001 0.541266 +0.529943 0.000001 0.541266 +0.541266 0.000001 0.541266 +0.552083 0.000001 0.541266 +0.562427 0.000001 0.541266 +0.572331 0.000001 0.541266 +0.581823 0.000001 0.541266 +0.590929 0.000001 0.541266 +0.599674 0.000001 0.541266 +0.608079 0.000001 0.541266 +0.616166 0.000001 0.541266 +0.000001 0.037293 0.541266 +0.037293 0.037293 0.541266 +0.079714 0.037293 0.541266 +0.120832 0.037293 0.541266 +0.159284 0.037293 0.541266 +0.194868 0.037293 0.541266 +0.227530 0.037293 0.541266 +0.257434 0.037293 0.541266 +0.285092 0.037293 0.541266 +0.310738 0.037293 0.541266 +0.334585 0.037293 0.541266 +0.356818 0.037293 0.541266 +0.377602 0.037293 0.541266 +0.397079 0.037293 0.541266 +0.415373 0.037293 0.541266 +0.432594 0.037293 0.541266 +0.448839 0.037293 0.541266 +0.464192 0.037293 0.541266 +0.478729 0.037293 0.541266 +0.492515 0.037293 0.541266 +0.505612 0.037293 0.541266 +0.518072 0.037293 0.541266 +0.529943 0.037293 0.541266 +0.541266 0.037293 0.541266 +0.552083 0.037293 0.541266 +0.562427 0.037293 0.541266 +0.572331 0.037293 0.541266 +0.581823 0.037293 0.541266 +0.590929 0.037293 0.541266 +0.599674 0.037293 0.541266 +0.608079 0.037293 0.541266 +0.616166 0.037293 0.541266 +0.000001 0.079714 0.541266 +0.037293 0.079714 0.541266 +0.079714 0.079714 0.541266 +0.120832 0.079714 0.541266 +0.159284 0.079714 0.541266 +0.194868 0.079714 0.541266 +0.227530 0.079714 0.541266 +0.257434 0.079714 0.541266 +0.285092 0.079714 0.541266 +0.310738 0.079714 0.541266 +0.334585 0.079714 0.541266 +0.356818 0.079714 0.541266 +0.377602 0.079714 0.541266 +0.397079 0.079714 0.541266 +0.415373 0.079714 0.541266 +0.432594 0.079714 0.541266 +0.448839 0.079714 0.541266 +0.464192 0.079714 0.541266 +0.478729 0.079714 0.541266 +0.492515 0.079714 0.541266 +0.505612 0.079714 0.541266 +0.518072 0.079714 0.541266 +0.529943 0.079714 0.541266 +0.541266 0.079714 0.541266 +0.552083 0.079714 0.541266 +0.562427 0.079714 0.541266 +0.572331 0.079714 0.541266 +0.581823 0.079714 0.541266 +0.590929 0.079714 0.541266 +0.599674 0.079714 0.541266 +0.608079 0.079714 0.541266 +0.616166 0.079714 0.541266 +0.000001 0.120832 0.541266 +0.037293 0.120832 0.541266 +0.079714 0.120832 0.541266 +0.120832 0.120832 0.541266 +0.159284 0.120832 0.541266 +0.194868 0.120832 0.541266 +0.227530 0.120832 0.541266 +0.257434 0.120832 0.541266 +0.285092 0.120832 0.541266 +0.310738 0.120832 0.541266 +0.334585 0.120832 0.541266 +0.356818 0.120832 0.541266 +0.377602 0.120832 0.541266 +0.397079 0.120832 0.541266 +0.415373 0.120832 0.541266 +0.432594 0.120832 0.541266 +0.448839 0.120832 0.541266 +0.464192 0.120832 0.541266 +0.478729 0.120832 0.541266 +0.492515 0.120832 0.541266 +0.505612 0.120832 0.541266 +0.518072 0.120832 0.541266 +0.529943 0.120832 0.541266 +0.541266 0.120832 0.541266 +0.552083 0.120832 0.541266 +0.562427 0.120832 0.541266 +0.572331 0.120832 0.541266 +0.581823 0.120832 0.541266 +0.590929 0.120832 0.541266 +0.599674 0.120832 0.541266 +0.608079 0.120832 0.541266 +0.616166 0.120832 0.541266 +0.000001 0.159284 0.541266 +0.037293 0.159284 0.541266 +0.079714 0.159284 0.541266 +0.120832 0.159284 0.541266 +0.159284 0.159284 0.541266 +0.194868 0.159284 0.541266 +0.227530 0.159284 0.541266 +0.257434 0.159284 0.541266 +0.285092 0.159284 0.541266 +0.310738 0.159284 0.541266 +0.334585 0.159284 0.541266 +0.356818 0.159284 0.541266 +0.377602 0.159284 0.541266 +0.397079 0.159284 0.541266 +0.415373 0.159284 0.541266 +0.432594 0.159284 0.541266 +0.448839 0.159284 0.541266 +0.464192 0.159284 0.541266 +0.478729 0.159284 0.541266 +0.492515 0.159284 0.541266 +0.505612 0.159284 0.541266 +0.518072 0.159284 0.541266 +0.529943 0.159284 0.541266 +0.541266 0.159284 0.541266 +0.552083 0.159284 0.541266 +0.562427 0.159284 0.541266 +0.572331 0.159284 0.541266 +0.581823 0.159284 0.541266 +0.590929 0.159284 0.541266 +0.599674 0.159284 0.541266 +0.608079 0.159284 0.541266 +0.616166 0.159284 0.541266 +0.000001 0.194868 0.541266 +0.037293 0.194868 0.541266 +0.079714 0.194868 0.541266 +0.120832 0.194868 0.541266 +0.159284 0.194868 0.541266 +0.194868 0.194868 0.541266 +0.227530 0.194868 0.541266 +0.257434 0.194868 0.541266 +0.285092 0.194868 0.541266 +0.310738 0.194868 0.541266 +0.334585 0.194868 0.541266 +0.356818 0.194868 0.541266 +0.377602 0.194868 0.541266 +0.397079 0.194868 0.541266 +0.415373 0.194868 0.541266 +0.432594 0.194868 0.541266 +0.448839 0.194868 0.541266 +0.464192 0.194868 0.541266 +0.478729 0.194868 0.541266 +0.492515 0.194868 0.541266 +0.505612 0.194868 0.541266 +0.518072 0.194868 0.541266 +0.529943 0.194868 0.541266 +0.541266 0.194868 0.541266 +0.552083 0.194868 0.541266 +0.562427 0.194868 0.541266 +0.572331 0.194868 0.541266 +0.581823 0.194868 0.541266 +0.590929 0.194868 0.541266 +0.599674 0.194868 0.541266 +0.608079 0.194868 0.541266 +0.616166 0.194868 0.541266 +0.000001 0.227530 0.541266 +0.037293 0.227530 0.541266 +0.079714 0.227530 0.541266 +0.120832 0.227530 0.541266 +0.159284 0.227530 0.541266 +0.194868 0.227530 0.541266 +0.227530 0.227530 0.541266 +0.257434 0.227530 0.541266 +0.285092 0.227530 0.541266 +0.310738 0.227530 0.541266 +0.334585 0.227530 0.541266 +0.356818 0.227530 0.541266 +0.377602 0.227530 0.541266 +0.397079 0.227530 0.541266 +0.415373 0.227530 0.541266 +0.432594 0.227530 0.541266 +0.448839 0.227530 0.541266 +0.464192 0.227530 0.541266 +0.478729 0.227530 0.541266 +0.492515 0.227530 0.541266 +0.505612 0.227530 0.541266 +0.518072 0.227530 0.541266 +0.529943 0.227530 0.541266 +0.541266 0.227530 0.541266 +0.552083 0.227530 0.541266 +0.562427 0.227530 0.541266 +0.572331 0.227530 0.541266 +0.581823 0.227530 0.541266 +0.590929 0.227530 0.541266 +0.599674 0.227530 0.541266 +0.608079 0.227530 0.541266 +0.616166 0.227530 0.541266 +0.000001 0.257434 0.541266 +0.037293 0.257434 0.541266 +0.079714 0.257434 0.541266 +0.120832 0.257434 0.541266 +0.159284 0.257434 0.541266 +0.194868 0.257434 0.541266 +0.227530 0.257434 0.541266 +0.257434 0.257434 0.541266 +0.285092 0.257434 0.541266 +0.310738 0.257434 0.541266 +0.334585 0.257434 0.541266 +0.356818 0.257434 0.541266 +0.377602 0.257434 0.541266 +0.397079 0.257434 0.541266 +0.415373 0.257434 0.541266 +0.432594 0.257434 0.541266 +0.448839 0.257434 0.541266 +0.464192 0.257434 0.541266 +0.478729 0.257434 0.541266 +0.492515 0.257434 0.541266 +0.505612 0.257434 0.541266 +0.518072 0.257434 0.541266 +0.529943 0.257434 0.541266 +0.541266 0.257434 0.541266 +0.552083 0.257434 0.541266 +0.562427 0.257434 0.541266 +0.572331 0.257434 0.541266 +0.581823 0.257434 0.541266 +0.590929 0.257434 0.541266 +0.599674 0.257434 0.541266 +0.608079 0.257434 0.541266 +0.616166 0.257434 0.541266 +0.000001 0.285092 0.541266 +0.037293 0.285092 0.541266 +0.079714 0.285092 0.541266 +0.120832 0.285092 0.541266 +0.159284 0.285092 0.541266 +0.194868 0.285092 0.541266 +0.227530 0.285092 0.541266 +0.257434 0.285092 0.541266 +0.285092 0.285092 0.541266 +0.310738 0.285092 0.541266 +0.334585 0.285092 0.541266 +0.356818 0.285092 0.541266 +0.377602 0.285092 0.541266 +0.397079 0.285092 0.541266 +0.415373 0.285092 0.541266 +0.432594 0.285092 0.541266 +0.448839 0.285092 0.541266 +0.464192 0.285092 0.541266 +0.478729 0.285092 0.541266 +0.492515 0.285092 0.541266 +0.505612 0.285092 0.541266 +0.518072 0.285092 0.541266 +0.529943 0.285092 0.541266 +0.541266 0.285092 0.541266 +0.552083 0.285092 0.541266 +0.562427 0.285092 0.541266 +0.572331 0.285092 0.541266 +0.581823 0.285092 0.541266 +0.590929 0.285092 0.541266 +0.599674 0.285092 0.541266 +0.608079 0.285092 0.541266 +0.616166 0.285092 0.541266 +0.000001 0.310738 0.541266 +0.037293 0.310738 0.541266 +0.079714 0.310738 0.541266 +0.120832 0.310738 0.541266 +0.159284 0.310738 0.541266 +0.194868 0.310738 0.541266 +0.227530 0.310738 0.541266 +0.257434 0.310738 0.541266 +0.285092 0.310738 0.541266 +0.310738 0.310738 0.541266 +0.334585 0.310738 0.541266 +0.356818 0.310738 0.541266 +0.377602 0.310738 0.541266 +0.397079 0.310738 0.541266 +0.415373 0.310738 0.541266 +0.432594 0.310738 0.541266 +0.448839 0.310738 0.541266 +0.464192 0.310738 0.541266 +0.478729 0.310738 0.541266 +0.492515 0.310738 0.541266 +0.505612 0.310738 0.541266 +0.518072 0.310738 0.541266 +0.529943 0.310738 0.541266 +0.541266 0.310738 0.541266 +0.552083 0.310738 0.541266 +0.562427 0.310738 0.541266 +0.572331 0.310738 0.541266 +0.581823 0.310738 0.541266 +0.590929 0.310738 0.541266 +0.599674 0.310738 0.541266 +0.608079 0.310738 0.541266 +0.616166 0.310738 0.541266 +0.000001 0.334585 0.541266 +0.037293 0.334585 0.541266 +0.079714 0.334585 0.541266 +0.120832 0.334585 0.541266 +0.159284 0.334585 0.541266 +0.194868 0.334585 0.541266 +0.227530 0.334585 0.541266 +0.257434 0.334585 0.541266 +0.285092 0.334585 0.541266 +0.310738 0.334585 0.541266 +0.334585 0.334585 0.541266 +0.356818 0.334585 0.541266 +0.377602 0.334585 0.541266 +0.397079 0.334585 0.541266 +0.415373 0.334585 0.541266 +0.432594 0.334585 0.541266 +0.448839 0.334585 0.541266 +0.464192 0.334585 0.541266 +0.478729 0.334585 0.541266 +0.492515 0.334585 0.541266 +0.505612 0.334585 0.541266 +0.518072 0.334585 0.541266 +0.529943 0.334585 0.541266 +0.541266 0.334585 0.541266 +0.552083 0.334585 0.541266 +0.562427 0.334585 0.541266 +0.572331 0.334585 0.541266 +0.581823 0.334585 0.541266 +0.590929 0.334585 0.541266 +0.599674 0.334585 0.541266 +0.608079 0.334585 0.541266 +0.616166 0.334585 0.541266 +0.000001 0.356818 0.541266 +0.037293 0.356818 0.541266 +0.079714 0.356818 0.541266 +0.120832 0.356818 0.541266 +0.159284 0.356818 0.541266 +0.194868 0.356818 0.541266 +0.227530 0.356818 0.541266 +0.257434 0.356818 0.541266 +0.285092 0.356818 0.541266 +0.310738 0.356818 0.541266 +0.334585 0.356818 0.541266 +0.356818 0.356818 0.541266 +0.377602 0.356818 0.541266 +0.397079 0.356818 0.541266 +0.415373 0.356818 0.541266 +0.432594 0.356818 0.541266 +0.448839 0.356818 0.541266 +0.464192 0.356818 0.541266 +0.478729 0.356818 0.541266 +0.492515 0.356818 0.541266 +0.505612 0.356818 0.541266 +0.518072 0.356818 0.541266 +0.529943 0.356818 0.541266 +0.541266 0.356818 0.541266 +0.552083 0.356818 0.541266 +0.562427 0.356818 0.541266 +0.572331 0.356818 0.541266 +0.581823 0.356818 0.541266 +0.590929 0.356818 0.541266 +0.599674 0.356818 0.541266 +0.608079 0.356818 0.541266 +0.616166 0.356818 0.541266 +0.000001 0.377602 0.541266 +0.037293 0.377602 0.541266 +0.079714 0.377602 0.541266 +0.120832 0.377602 0.541266 +0.159284 0.377602 0.541266 +0.194868 0.377602 0.541266 +0.227530 0.377602 0.541266 +0.257434 0.377602 0.541266 +0.285092 0.377602 0.541266 +0.310738 0.377602 0.541266 +0.334585 0.377602 0.541266 +0.356818 0.377602 0.541266 +0.377602 0.377602 0.541266 +0.397079 0.377602 0.541266 +0.415373 0.377602 0.541266 +0.432594 0.377602 0.541266 +0.448839 0.377602 0.541266 +0.464192 0.377602 0.541266 +0.478729 0.377602 0.541266 +0.492515 0.377602 0.541266 +0.505612 0.377602 0.541266 +0.518072 0.377602 0.541266 +0.529943 0.377602 0.541266 +0.541266 0.377602 0.541266 +0.552083 0.377602 0.541266 +0.562427 0.377602 0.541266 +0.572331 0.377602 0.541266 +0.581823 0.377602 0.541266 +0.590929 0.377602 0.541266 +0.599674 0.377602 0.541266 +0.608079 0.377602 0.541266 +0.616166 0.377602 0.541266 +0.000001 0.397079 0.541266 +0.037293 0.397079 0.541266 +0.079714 0.397079 0.541266 +0.120832 0.397079 0.541266 +0.159284 0.397079 0.541266 +0.194868 0.397079 0.541266 +0.227530 0.397079 0.541266 +0.257434 0.397079 0.541266 +0.285092 0.397079 0.541266 +0.310738 0.397079 0.541266 +0.334585 0.397079 0.541266 +0.356818 0.397079 0.541266 +0.377602 0.397079 0.541266 +0.397079 0.397079 0.541266 +0.415373 0.397079 0.541266 +0.432594 0.397079 0.541266 +0.448839 0.397079 0.541266 +0.464192 0.397079 0.541266 +0.478729 0.397079 0.541266 +0.492515 0.397079 0.541266 +0.505612 0.397079 0.541266 +0.518072 0.397079 0.541266 +0.529943 0.397079 0.541266 +0.541266 0.397079 0.541266 +0.552083 0.397079 0.541266 +0.562427 0.397079 0.541266 +0.572331 0.397079 0.541266 +0.581823 0.397079 0.541266 +0.590929 0.397079 0.541266 +0.599674 0.397079 0.541266 +0.608079 0.397079 0.541266 +0.616166 0.397079 0.541266 +0.000001 0.415373 0.541266 +0.037293 0.415373 0.541266 +0.079714 0.415373 0.541266 +0.120832 0.415373 0.541266 +0.159284 0.415373 0.541266 +0.194868 0.415373 0.541266 +0.227530 0.415373 0.541266 +0.257434 0.415373 0.541266 +0.285092 0.415373 0.541266 +0.310738 0.415373 0.541266 +0.334585 0.415373 0.541266 +0.356818 0.415373 0.541266 +0.377602 0.415373 0.541266 +0.397079 0.415373 0.541266 +0.415373 0.415373 0.541266 +0.432594 0.415373 0.541266 +0.448839 0.415373 0.541266 +0.464192 0.415373 0.541266 +0.478729 0.415373 0.541266 +0.492515 0.415373 0.541266 +0.505612 0.415373 0.541266 +0.518072 0.415373 0.541266 +0.529943 0.415373 0.541266 +0.541266 0.415373 0.541266 +0.552083 0.415373 0.541266 +0.562427 0.415373 0.541266 +0.572331 0.415373 0.541266 +0.581823 0.415373 0.541266 +0.590929 0.415373 0.541266 +0.599674 0.415373 0.541266 +0.608079 0.415373 0.541266 +0.616166 0.415373 0.541266 +0.000001 0.432594 0.541266 +0.037293 0.432594 0.541266 +0.079714 0.432594 0.541266 +0.120832 0.432594 0.541266 +0.159284 0.432594 0.541266 +0.194868 0.432594 0.541266 +0.227530 0.432594 0.541266 +0.257434 0.432594 0.541266 +0.285092 0.432594 0.541266 +0.310738 0.432594 0.541266 +0.334585 0.432594 0.541266 +0.356818 0.432594 0.541266 +0.377602 0.432594 0.541266 +0.397079 0.432594 0.541266 +0.415373 0.432594 0.541266 +0.432594 0.432594 0.541266 +0.448839 0.432594 0.541266 +0.464192 0.432594 0.541266 +0.478729 0.432594 0.541266 +0.492515 0.432594 0.541266 +0.505612 0.432594 0.541266 +0.518072 0.432594 0.541266 +0.529943 0.432594 0.541266 +0.541266 0.432594 0.541266 +0.552083 0.432594 0.541266 +0.562427 0.432594 0.541266 +0.572331 0.432594 0.541266 +0.581823 0.432594 0.541266 +0.590929 0.432594 0.541266 +0.599674 0.432594 0.541266 +0.608079 0.432594 0.541266 +0.616166 0.432594 0.541266 +0.000001 0.448839 0.541266 +0.037293 0.448839 0.541266 +0.079714 0.448839 0.541266 +0.120832 0.448839 0.541266 +0.159284 0.448839 0.541266 +0.194868 0.448839 0.541266 +0.227530 0.448839 0.541266 +0.257434 0.448839 0.541266 +0.285092 0.448839 0.541266 +0.310738 0.448839 0.541266 +0.334585 0.448839 0.541266 +0.356818 0.448839 0.541266 +0.377602 0.448839 0.541266 +0.397079 0.448839 0.541266 +0.415373 0.448839 0.541266 +0.432594 0.448839 0.541266 +0.448839 0.448839 0.541266 +0.464192 0.448839 0.541266 +0.478729 0.448839 0.541266 +0.492515 0.448839 0.541266 +0.505612 0.448839 0.541266 +0.518072 0.448839 0.541266 +0.529943 0.448839 0.541266 +0.541266 0.448839 0.541266 +0.552083 0.448839 0.541266 +0.562427 0.448839 0.541266 +0.572331 0.448839 0.541266 +0.581823 0.448839 0.541266 +0.590929 0.448839 0.541266 +0.599674 0.448839 0.541266 +0.608079 0.448839 0.541266 +0.616166 0.448839 0.541266 +0.000001 0.464192 0.541266 +0.037293 0.464192 0.541266 +0.079714 0.464192 0.541266 +0.120832 0.464192 0.541266 +0.159284 0.464192 0.541266 +0.194868 0.464192 0.541266 +0.227530 0.464192 0.541266 +0.257434 0.464192 0.541266 +0.285092 0.464192 0.541266 +0.310738 0.464192 0.541266 +0.334585 0.464192 0.541266 +0.356818 0.464192 0.541266 +0.377602 0.464192 0.541266 +0.397079 0.464192 0.541266 +0.415373 0.464192 0.541266 +0.432594 0.464192 0.541266 +0.448839 0.464192 0.541266 +0.464192 0.464192 0.541266 +0.478729 0.464192 0.541266 +0.492515 0.464192 0.541266 +0.505612 0.464192 0.541266 +0.518072 0.464192 0.541266 +0.529943 0.464192 0.541266 +0.541266 0.464192 0.541266 +0.552083 0.464192 0.541266 +0.562427 0.464192 0.541266 +0.572331 0.464192 0.541266 +0.581823 0.464192 0.541266 +0.590929 0.464192 0.541266 +0.599674 0.464192 0.541266 +0.608079 0.464192 0.541266 +0.616166 0.464192 0.541266 +0.000001 0.478729 0.541266 +0.037293 0.478729 0.541266 +0.079714 0.478729 0.541266 +0.120832 0.478729 0.541266 +0.159284 0.478729 0.541266 +0.194868 0.478729 0.541266 +0.227530 0.478729 0.541266 +0.257434 0.478729 0.541266 +0.285092 0.478729 0.541266 +0.310738 0.478729 0.541266 +0.334585 0.478729 0.541266 +0.356818 0.478729 0.541266 +0.377602 0.478729 0.541266 +0.397079 0.478729 0.541266 +0.415373 0.478729 0.541266 +0.432594 0.478729 0.541266 +0.448839 0.478729 0.541266 +0.464192 0.478729 0.541266 +0.478729 0.478729 0.541266 +0.492515 0.478729 0.541266 +0.505612 0.478729 0.541266 +0.518072 0.478729 0.541266 +0.529943 0.478729 0.541266 +0.541266 0.478729 0.541266 +0.552083 0.478729 0.541266 +0.562427 0.478729 0.541266 +0.572331 0.478729 0.541266 +0.581823 0.478729 0.541266 +0.590929 0.478729 0.541266 +0.599674 0.478729 0.541266 +0.608079 0.478729 0.541266 +0.616166 0.478729 0.541266 +0.000001 0.492515 0.541266 +0.037293 0.492515 0.541266 +0.079714 0.492515 0.541266 +0.120832 0.492515 0.541266 +0.159284 0.492515 0.541266 +0.194868 0.492515 0.541266 +0.227530 0.492515 0.541266 +0.257434 0.492515 0.541266 +0.285092 0.492515 0.541266 +0.310738 0.492515 0.541266 +0.334585 0.492515 0.541266 +0.356818 0.492515 0.541266 +0.377602 0.492515 0.541266 +0.397079 0.492515 0.541266 +0.415373 0.492515 0.541266 +0.432594 0.492515 0.541266 +0.448839 0.492515 0.541266 +0.464192 0.492515 0.541266 +0.478729 0.492515 0.541266 +0.492515 0.492515 0.541266 +0.505612 0.492515 0.541266 +0.518072 0.492515 0.541266 +0.529943 0.492515 0.541266 +0.541266 0.492515 0.541266 +0.552083 0.492515 0.541266 +0.562427 0.492515 0.541266 +0.572331 0.492515 0.541266 +0.581823 0.492515 0.541266 +0.590929 0.492515 0.541266 +0.599674 0.492515 0.541266 +0.608079 0.492515 0.541266 +0.616166 0.492515 0.541266 +0.000001 0.505612 0.541266 +0.037293 0.505612 0.541266 +0.079714 0.505612 0.541266 +0.120832 0.505612 0.541266 +0.159284 0.505612 0.541266 +0.194868 0.505612 0.541266 +0.227530 0.505612 0.541266 +0.257434 0.505612 0.541266 +0.285092 0.505612 0.541266 +0.310738 0.505612 0.541266 +0.334585 0.505612 0.541266 +0.356818 0.505612 0.541266 +0.377602 0.505612 0.541266 +0.397079 0.505612 0.541266 +0.415373 0.505612 0.541266 +0.432594 0.505612 0.541266 +0.448839 0.505612 0.541266 +0.464192 0.505612 0.541266 +0.478729 0.505612 0.541266 +0.492515 0.505612 0.541266 +0.505612 0.505612 0.541266 +0.518072 0.505612 0.541266 +0.529943 0.505612 0.541266 +0.541266 0.505612 0.541266 +0.552083 0.505612 0.541266 +0.562427 0.505612 0.541266 +0.572331 0.505612 0.541266 +0.581823 0.505612 0.541266 +0.590929 0.505612 0.541266 +0.599674 0.505612 0.541266 +0.608079 0.505612 0.541266 +0.616166 0.505612 0.541266 +0.000001 0.518072 0.541266 +0.037293 0.518072 0.541266 +0.079714 0.518072 0.541266 +0.120832 0.518072 0.541266 +0.159284 0.518072 0.541266 +0.194868 0.518072 0.541266 +0.227530 0.518072 0.541266 +0.257434 0.518072 0.541266 +0.285092 0.518072 0.541266 +0.310738 0.518072 0.541266 +0.334585 0.518072 0.541266 +0.356818 0.518072 0.541266 +0.377602 0.518072 0.541266 +0.397079 0.518072 0.541266 +0.415373 0.518072 0.541266 +0.432594 0.518072 0.541266 +0.448839 0.518072 0.541266 +0.464192 0.518072 0.541266 +0.478729 0.518072 0.541266 +0.492515 0.518072 0.541266 +0.505612 0.518072 0.541266 +0.518072 0.518072 0.541266 +0.529943 0.518072 0.541266 +0.541266 0.518072 0.541266 +0.552083 0.518072 0.541266 +0.562427 0.518072 0.541266 +0.572331 0.518072 0.541266 +0.581823 0.518072 0.541266 +0.590929 0.518072 0.541266 +0.599674 0.518072 0.541266 +0.608079 0.518072 0.541266 +0.616166 0.518072 0.541266 +0.000001 0.529943 0.541266 +0.037293 0.529943 0.541266 +0.079714 0.529943 0.541266 +0.120832 0.529943 0.541266 +0.159284 0.529943 0.541266 +0.194868 0.529943 0.541266 +0.227530 0.529943 0.541266 +0.257434 0.529943 0.541266 +0.285092 0.529943 0.541266 +0.310738 0.529943 0.541266 +0.334585 0.529943 0.541266 +0.356818 0.529943 0.541266 +0.377602 0.529943 0.541266 +0.397079 0.529943 0.541266 +0.415373 0.529943 0.541266 +0.432594 0.529943 0.541266 +0.448839 0.529943 0.541266 +0.464192 0.529943 0.541266 +0.478729 0.529943 0.541266 +0.492515 0.529943 0.541266 +0.505612 0.529943 0.541266 +0.518072 0.529943 0.541266 +0.529943 0.529943 0.541266 +0.541266 0.529943 0.541266 +0.552083 0.529943 0.541266 +0.562427 0.529943 0.541266 +0.572331 0.529943 0.541266 +0.581823 0.529943 0.541266 +0.590929 0.529943 0.541266 +0.599674 0.529943 0.541266 +0.608079 0.529943 0.541266 +0.616166 0.529943 0.541266 +0.000001 0.541266 0.541266 +0.037293 0.541266 0.541266 +0.079714 0.541266 0.541266 +0.120832 0.541266 0.541266 +0.159284 0.541266 0.541266 +0.194868 0.541266 0.541266 +0.227530 0.541266 0.541266 +0.257434 0.541266 0.541266 +0.285092 0.541266 0.541266 +0.310738 0.541266 0.541266 +0.334585 0.541266 0.541266 +0.356818 0.541266 0.541266 +0.377602 0.541266 0.541266 +0.397079 0.541266 0.541266 +0.415373 0.541266 0.541266 +0.432594 0.541266 0.541266 +0.448839 0.541266 0.541266 +0.464192 0.541266 0.541266 +0.478729 0.541266 0.541266 +0.492515 0.541266 0.541266 +0.505612 0.541266 0.541266 +0.518072 0.541266 0.541266 +0.529943 0.541266 0.541266 +0.541266 0.541266 0.541266 +0.552083 0.541266 0.541266 +0.562427 0.541266 0.541266 +0.572331 0.541266 0.541266 +0.581823 0.541266 0.541266 +0.590929 0.541266 0.541266 +0.599674 0.541266 0.541266 +0.608079 0.541266 0.541266 +0.616166 0.541266 0.541266 +0.000001 0.552083 0.541266 +0.037293 0.552083 0.541266 +0.079714 0.552083 0.541266 +0.120832 0.552083 0.541266 +0.159284 0.552083 0.541266 +0.194868 0.552083 0.541266 +0.227530 0.552083 0.541266 +0.257434 0.552083 0.541266 +0.285092 0.552083 0.541266 +0.310738 0.552083 0.541266 +0.334585 0.552083 0.541266 +0.356818 0.552083 0.541266 +0.377602 0.552083 0.541266 +0.397079 0.552083 0.541266 +0.415373 0.552083 0.541266 +0.432594 0.552083 0.541266 +0.448839 0.552083 0.541266 +0.464192 0.552083 0.541266 +0.478729 0.552083 0.541266 +0.492515 0.552083 0.541266 +0.505612 0.552083 0.541266 +0.518072 0.552083 0.541266 +0.529943 0.552083 0.541266 +0.541266 0.552083 0.541266 +0.552083 0.552083 0.541266 +0.562427 0.552083 0.541266 +0.572331 0.552083 0.541266 +0.581823 0.552083 0.541266 +0.590929 0.552083 0.541266 +0.599674 0.552083 0.541266 +0.608079 0.552083 0.541266 +0.616166 0.552083 0.541266 +0.000001 0.562427 0.541266 +0.037293 0.562427 0.541266 +0.079714 0.562427 0.541266 +0.120832 0.562427 0.541266 +0.159284 0.562427 0.541266 +0.194868 0.562427 0.541266 +0.227530 0.562427 0.541266 +0.257434 0.562427 0.541266 +0.285092 0.562427 0.541266 +0.310738 0.562427 0.541266 +0.334585 0.562427 0.541266 +0.356818 0.562427 0.541266 +0.377602 0.562427 0.541266 +0.397079 0.562427 0.541266 +0.415373 0.562427 0.541266 +0.432594 0.562427 0.541266 +0.448839 0.562427 0.541266 +0.464192 0.562427 0.541266 +0.478729 0.562427 0.541266 +0.492515 0.562427 0.541266 +0.505612 0.562427 0.541266 +0.518072 0.562427 0.541266 +0.529943 0.562427 0.541266 +0.541266 0.562427 0.541266 +0.552083 0.562427 0.541266 +0.562427 0.562427 0.541266 +0.572331 0.562427 0.541266 +0.581823 0.562427 0.541266 +0.590929 0.562427 0.541266 +0.599674 0.562427 0.541266 +0.608079 0.562427 0.541266 +0.616166 0.562427 0.541266 +0.000001 0.572331 0.541266 +0.037293 0.572331 0.541266 +0.079714 0.572331 0.541266 +0.120832 0.572331 0.541266 +0.159284 0.572331 0.541266 +0.194868 0.572331 0.541266 +0.227530 0.572331 0.541266 +0.257434 0.572331 0.541266 +0.285092 0.572331 0.541266 +0.310738 0.572331 0.541266 +0.334585 0.572331 0.541266 +0.356818 0.572331 0.541266 +0.377602 0.572331 0.541266 +0.397079 0.572331 0.541266 +0.415373 0.572331 0.541266 +0.432594 0.572331 0.541266 +0.448839 0.572331 0.541266 +0.464192 0.572331 0.541266 +0.478729 0.572331 0.541266 +0.492515 0.572331 0.541266 +0.505612 0.572331 0.541266 +0.518072 0.572331 0.541266 +0.529943 0.572331 0.541266 +0.541266 0.572331 0.541266 +0.552083 0.572331 0.541266 +0.562427 0.572331 0.541266 +0.572331 0.572331 0.541266 +0.581823 0.572331 0.541266 +0.590929 0.572331 0.541266 +0.599674 0.572331 0.541266 +0.608079 0.572331 0.541266 +0.616166 0.572331 0.541266 +0.000001 0.581823 0.541266 +0.037293 0.581823 0.541266 +0.079714 0.581823 0.541266 +0.120832 0.581823 0.541266 +0.159284 0.581823 0.541266 +0.194868 0.581823 0.541266 +0.227530 0.581823 0.541266 +0.257434 0.581823 0.541266 +0.285092 0.581823 0.541266 +0.310738 0.581823 0.541266 +0.334585 0.581823 0.541266 +0.356818 0.581823 0.541266 +0.377602 0.581823 0.541266 +0.397079 0.581823 0.541266 +0.415373 0.581823 0.541266 +0.432594 0.581823 0.541266 +0.448839 0.581823 0.541266 +0.464192 0.581823 0.541266 +0.478729 0.581823 0.541266 +0.492515 0.581823 0.541266 +0.505612 0.581823 0.541266 +0.518072 0.581823 0.541266 +0.529943 0.581823 0.541266 +0.541266 0.581823 0.541266 +0.552083 0.581823 0.541266 +0.562427 0.581823 0.541266 +0.572331 0.581823 0.541266 +0.581823 0.581823 0.541266 +0.590929 0.581823 0.541266 +0.599674 0.581823 0.541266 +0.608079 0.581823 0.541266 +0.616166 0.581823 0.541266 +0.000001 0.590929 0.541266 +0.037293 0.590929 0.541266 +0.079714 0.590929 0.541266 +0.120832 0.590929 0.541266 +0.159284 0.590929 0.541266 +0.194868 0.590929 0.541266 +0.227530 0.590929 0.541266 +0.257434 0.590929 0.541266 +0.285092 0.590929 0.541266 +0.310738 0.590929 0.541266 +0.334585 0.590929 0.541266 +0.356818 0.590929 0.541266 +0.377602 0.590929 0.541266 +0.397079 0.590929 0.541266 +0.415373 0.590929 0.541266 +0.432594 0.590929 0.541266 +0.448839 0.590929 0.541266 +0.464192 0.590929 0.541266 +0.478729 0.590929 0.541266 +0.492515 0.590929 0.541266 +0.505612 0.590929 0.541266 +0.518072 0.590929 0.541266 +0.529943 0.590929 0.541266 +0.541266 0.590929 0.541266 +0.552083 0.590929 0.541266 +0.562427 0.590929 0.541266 +0.572331 0.590929 0.541266 +0.581823 0.590929 0.541266 +0.590929 0.590929 0.541266 +0.599674 0.590929 0.541266 +0.608079 0.590929 0.541266 +0.616166 0.590929 0.541266 +0.000001 0.599674 0.541266 +0.037293 0.599674 0.541266 +0.079714 0.599674 0.541266 +0.120832 0.599674 0.541266 +0.159284 0.599674 0.541266 +0.194868 0.599674 0.541266 +0.227530 0.599674 0.541266 +0.257434 0.599674 0.541266 +0.285092 0.599674 0.541266 +0.310738 0.599674 0.541266 +0.334585 0.599674 0.541266 +0.356818 0.599674 0.541266 +0.377602 0.599674 0.541266 +0.397079 0.599674 0.541266 +0.415373 0.599674 0.541266 +0.432594 0.599674 0.541266 +0.448839 0.599674 0.541266 +0.464192 0.599674 0.541266 +0.478729 0.599674 0.541266 +0.492515 0.599674 0.541266 +0.505612 0.599674 0.541266 +0.518072 0.599674 0.541266 +0.529943 0.599674 0.541266 +0.541266 0.599674 0.541266 +0.552083 0.599674 0.541266 +0.562427 0.599674 0.541266 +0.572331 0.599674 0.541266 +0.581823 0.599674 0.541266 +0.590929 0.599674 0.541266 +0.599674 0.599674 0.541266 +0.608079 0.599674 0.541266 +0.616166 0.599674 0.541266 +0.000001 0.608079 0.541266 +0.037293 0.608079 0.541266 +0.079714 0.608079 0.541266 +0.120832 0.608079 0.541266 +0.159284 0.608079 0.541266 +0.194868 0.608079 0.541266 +0.227530 0.608079 0.541266 +0.257434 0.608079 0.541266 +0.285092 0.608079 0.541266 +0.310738 0.608079 0.541266 +0.334585 0.608079 0.541266 +0.356818 0.608079 0.541266 +0.377602 0.608079 0.541266 +0.397079 0.608079 0.541266 +0.415373 0.608079 0.541266 +0.432594 0.608079 0.541266 +0.448839 0.608079 0.541266 +0.464192 0.608079 0.541266 +0.478729 0.608079 0.541266 +0.492515 0.608079 0.541266 +0.505612 0.608079 0.541266 +0.518072 0.608079 0.541266 +0.529943 0.608079 0.541266 +0.541266 0.608079 0.541266 +0.552083 0.608079 0.541266 +0.562427 0.608079 0.541266 +0.572331 0.608079 0.541266 +0.581823 0.608079 0.541266 +0.590929 0.608079 0.541266 +0.599674 0.608079 0.541266 +0.608079 0.608079 0.541266 +0.616166 0.608079 0.541266 +0.000001 0.616166 0.541266 +0.037293 0.616166 0.541266 +0.079714 0.616166 0.541266 +0.120832 0.616166 0.541266 +0.159284 0.616166 0.541266 +0.194868 0.616166 0.541266 +0.227530 0.616166 0.541266 +0.257434 0.616166 0.541266 +0.285092 0.616166 0.541266 +0.310738 0.616166 0.541266 +0.334585 0.616166 0.541266 +0.356818 0.616166 0.541266 +0.377602 0.616166 0.541266 +0.397079 0.616166 0.541266 +0.415373 0.616166 0.541266 +0.432594 0.616166 0.541266 +0.448839 0.616166 0.541266 +0.464192 0.616166 0.541266 +0.478729 0.616166 0.541266 +0.492515 0.616166 0.541266 +0.505612 0.616166 0.541266 +0.518072 0.616166 0.541266 +0.529943 0.616166 0.541266 +0.541266 0.616166 0.541266 +0.552083 0.616166 0.541266 +0.562427 0.616166 0.541266 +0.572331 0.616166 0.541266 +0.581823 0.616166 0.541266 +0.590929 0.616166 0.541266 +0.599674 0.616166 0.541266 +0.608079 0.616166 0.541266 +0.616166 0.616166 0.541266 +0.000001 0.000001 0.552083 +0.037293 0.000001 0.552083 +0.079714 0.000001 0.552083 +0.120832 0.000001 0.552083 +0.159284 0.000001 0.552083 +0.194868 0.000001 0.552083 +0.227530 0.000001 0.552083 +0.257434 0.000001 0.552083 +0.285092 0.000001 0.552083 +0.310738 0.000001 0.552083 +0.334585 0.000001 0.552083 +0.356818 0.000001 0.552083 +0.377602 0.000001 0.552083 +0.397079 0.000001 0.552083 +0.415373 0.000001 0.552083 +0.432594 0.000001 0.552083 +0.448839 0.000001 0.552083 +0.464192 0.000001 0.552083 +0.478729 0.000001 0.552083 +0.492515 0.000001 0.552083 +0.505612 0.000001 0.552083 +0.518072 0.000001 0.552083 +0.529943 0.000001 0.552083 +0.541266 0.000001 0.552083 +0.552083 0.000001 0.552083 +0.562427 0.000001 0.552083 +0.572331 0.000001 0.552083 +0.581823 0.000001 0.552083 +0.590929 0.000001 0.552083 +0.599674 0.000001 0.552083 +0.608079 0.000001 0.552083 +0.616166 0.000001 0.552083 +0.000001 0.037293 0.552083 +0.037293 0.037293 0.552083 +0.079714 0.037293 0.552083 +0.120832 0.037293 0.552083 +0.159284 0.037293 0.552083 +0.194868 0.037293 0.552083 +0.227530 0.037293 0.552083 +0.257434 0.037293 0.552083 +0.285092 0.037293 0.552083 +0.310738 0.037293 0.552083 +0.334585 0.037293 0.552083 +0.356818 0.037293 0.552083 +0.377602 0.037293 0.552083 +0.397079 0.037293 0.552083 +0.415373 0.037293 0.552083 +0.432594 0.037293 0.552083 +0.448839 0.037293 0.552083 +0.464192 0.037293 0.552083 +0.478729 0.037293 0.552083 +0.492515 0.037293 0.552083 +0.505612 0.037293 0.552083 +0.518072 0.037293 0.552083 +0.529943 0.037293 0.552083 +0.541266 0.037293 0.552083 +0.552083 0.037293 0.552083 +0.562427 0.037293 0.552083 +0.572331 0.037293 0.552083 +0.581823 0.037293 0.552083 +0.590929 0.037293 0.552083 +0.599674 0.037293 0.552083 +0.608079 0.037293 0.552083 +0.616166 0.037293 0.552083 +0.000001 0.079714 0.552083 +0.037293 0.079714 0.552083 +0.079714 0.079714 0.552083 +0.120832 0.079714 0.552083 +0.159284 0.079714 0.552083 +0.194868 0.079714 0.552083 +0.227530 0.079714 0.552083 +0.257434 0.079714 0.552083 +0.285092 0.079714 0.552083 +0.310738 0.079714 0.552083 +0.334585 0.079714 0.552083 +0.356818 0.079714 0.552083 +0.377602 0.079714 0.552083 +0.397079 0.079714 0.552083 +0.415373 0.079714 0.552083 +0.432594 0.079714 0.552083 +0.448839 0.079714 0.552083 +0.464192 0.079714 0.552083 +0.478729 0.079714 0.552083 +0.492515 0.079714 0.552083 +0.505612 0.079714 0.552083 +0.518072 0.079714 0.552083 +0.529943 0.079714 0.552083 +0.541266 0.079714 0.552083 +0.552083 0.079714 0.552083 +0.562427 0.079714 0.552083 +0.572331 0.079714 0.552083 +0.581823 0.079714 0.552083 +0.590929 0.079714 0.552083 +0.599674 0.079714 0.552083 +0.608079 0.079714 0.552083 +0.616166 0.079714 0.552083 +0.000001 0.120832 0.552083 +0.037293 0.120832 0.552083 +0.079714 0.120832 0.552083 +0.120832 0.120832 0.552083 +0.159284 0.120832 0.552083 +0.194868 0.120832 0.552083 +0.227530 0.120832 0.552083 +0.257434 0.120832 0.552083 +0.285092 0.120832 0.552083 +0.310738 0.120832 0.552083 +0.334585 0.120832 0.552083 +0.356818 0.120832 0.552083 +0.377602 0.120832 0.552083 +0.397079 0.120832 0.552083 +0.415373 0.120832 0.552083 +0.432594 0.120832 0.552083 +0.448839 0.120832 0.552083 +0.464192 0.120832 0.552083 +0.478729 0.120832 0.552083 +0.492515 0.120832 0.552083 +0.505612 0.120832 0.552083 +0.518072 0.120832 0.552083 +0.529943 0.120832 0.552083 +0.541266 0.120832 0.552083 +0.552083 0.120832 0.552083 +0.562427 0.120832 0.552083 +0.572331 0.120832 0.552083 +0.581823 0.120832 0.552083 +0.590929 0.120832 0.552083 +0.599674 0.120832 0.552083 +0.608079 0.120832 0.552083 +0.616166 0.120832 0.552083 +0.000001 0.159284 0.552083 +0.037293 0.159284 0.552083 +0.079714 0.159284 0.552083 +0.120832 0.159284 0.552083 +0.159284 0.159284 0.552083 +0.194868 0.159284 0.552083 +0.227530 0.159284 0.552083 +0.257434 0.159284 0.552083 +0.285092 0.159284 0.552083 +0.310738 0.159284 0.552083 +0.334585 0.159284 0.552083 +0.356818 0.159284 0.552083 +0.377602 0.159284 0.552083 +0.397079 0.159284 0.552083 +0.415373 0.159284 0.552083 +0.432594 0.159284 0.552083 +0.448839 0.159284 0.552083 +0.464192 0.159284 0.552083 +0.478729 0.159284 0.552083 +0.492515 0.159284 0.552083 +0.505612 0.159284 0.552083 +0.518072 0.159284 0.552083 +0.529943 0.159284 0.552083 +0.541266 0.159284 0.552083 +0.552083 0.159284 0.552083 +0.562427 0.159284 0.552083 +0.572331 0.159284 0.552083 +0.581823 0.159284 0.552083 +0.590929 0.159284 0.552083 +0.599674 0.159284 0.552083 +0.608079 0.159284 0.552083 +0.616166 0.159284 0.552083 +0.000001 0.194868 0.552083 +0.037293 0.194868 0.552083 +0.079714 0.194868 0.552083 +0.120832 0.194868 0.552083 +0.159284 0.194868 0.552083 +0.194868 0.194868 0.552083 +0.227530 0.194868 0.552083 +0.257434 0.194868 0.552083 +0.285092 0.194868 0.552083 +0.310738 0.194868 0.552083 +0.334585 0.194868 0.552083 +0.356818 0.194868 0.552083 +0.377602 0.194868 0.552083 +0.397079 0.194868 0.552083 +0.415373 0.194868 0.552083 +0.432594 0.194868 0.552083 +0.448839 0.194868 0.552083 +0.464192 0.194868 0.552083 +0.478729 0.194868 0.552083 +0.492515 0.194868 0.552083 +0.505612 0.194868 0.552083 +0.518072 0.194868 0.552083 +0.529943 0.194868 0.552083 +0.541266 0.194868 0.552083 +0.552083 0.194868 0.552083 +0.562427 0.194868 0.552083 +0.572331 0.194868 0.552083 +0.581823 0.194868 0.552083 +0.590929 0.194868 0.552083 +0.599674 0.194868 0.552083 +0.608079 0.194868 0.552083 +0.616166 0.194868 0.552083 +0.000001 0.227530 0.552083 +0.037293 0.227530 0.552083 +0.079714 0.227530 0.552083 +0.120832 0.227530 0.552083 +0.159284 0.227530 0.552083 +0.194868 0.227530 0.552083 +0.227530 0.227530 0.552083 +0.257434 0.227530 0.552083 +0.285092 0.227530 0.552083 +0.310738 0.227530 0.552083 +0.334585 0.227530 0.552083 +0.356818 0.227530 0.552083 +0.377602 0.227530 0.552083 +0.397079 0.227530 0.552083 +0.415373 0.227530 0.552083 +0.432594 0.227530 0.552083 +0.448839 0.227530 0.552083 +0.464192 0.227530 0.552083 +0.478729 0.227530 0.552083 +0.492515 0.227530 0.552083 +0.505612 0.227530 0.552083 +0.518072 0.227530 0.552083 +0.529943 0.227530 0.552083 +0.541266 0.227530 0.552083 +0.552083 0.227530 0.552083 +0.562427 0.227530 0.552083 +0.572331 0.227530 0.552083 +0.581823 0.227530 0.552083 +0.590929 0.227530 0.552083 +0.599674 0.227530 0.552083 +0.608079 0.227530 0.552083 +0.616166 0.227530 0.552083 +0.000001 0.257434 0.552083 +0.037293 0.257434 0.552083 +0.079714 0.257434 0.552083 +0.120832 0.257434 0.552083 +0.159284 0.257434 0.552083 +0.194868 0.257434 0.552083 +0.227530 0.257434 0.552083 +0.257434 0.257434 0.552083 +0.285092 0.257434 0.552083 +0.310738 0.257434 0.552083 +0.334585 0.257434 0.552083 +0.356818 0.257434 0.552083 +0.377602 0.257434 0.552083 +0.397079 0.257434 0.552083 +0.415373 0.257434 0.552083 +0.432594 0.257434 0.552083 +0.448839 0.257434 0.552083 +0.464192 0.257434 0.552083 +0.478729 0.257434 0.552083 +0.492515 0.257434 0.552083 +0.505612 0.257434 0.552083 +0.518072 0.257434 0.552083 +0.529943 0.257434 0.552083 +0.541266 0.257434 0.552083 +0.552083 0.257434 0.552083 +0.562427 0.257434 0.552083 +0.572331 0.257434 0.552083 +0.581823 0.257434 0.552083 +0.590929 0.257434 0.552083 +0.599674 0.257434 0.552083 +0.608079 0.257434 0.552083 +0.616166 0.257434 0.552083 +0.000001 0.285092 0.552083 +0.037293 0.285092 0.552083 +0.079714 0.285092 0.552083 +0.120832 0.285092 0.552083 +0.159284 0.285092 0.552083 +0.194868 0.285092 0.552083 +0.227530 0.285092 0.552083 +0.257434 0.285092 0.552083 +0.285092 0.285092 0.552083 +0.310738 0.285092 0.552083 +0.334585 0.285092 0.552083 +0.356818 0.285092 0.552083 +0.377602 0.285092 0.552083 +0.397079 0.285092 0.552083 +0.415373 0.285092 0.552083 +0.432594 0.285092 0.552083 +0.448839 0.285092 0.552083 +0.464192 0.285092 0.552083 +0.478729 0.285092 0.552083 +0.492515 0.285092 0.552083 +0.505612 0.285092 0.552083 +0.518072 0.285092 0.552083 +0.529943 0.285092 0.552083 +0.541266 0.285092 0.552083 +0.552083 0.285092 0.552083 +0.562427 0.285092 0.552083 +0.572331 0.285092 0.552083 +0.581823 0.285092 0.552083 +0.590929 0.285092 0.552083 +0.599674 0.285092 0.552083 +0.608079 0.285092 0.552083 +0.616166 0.285092 0.552083 +0.000001 0.310738 0.552083 +0.037293 0.310738 0.552083 +0.079714 0.310738 0.552083 +0.120832 0.310738 0.552083 +0.159284 0.310738 0.552083 +0.194868 0.310738 0.552083 +0.227530 0.310738 0.552083 +0.257434 0.310738 0.552083 +0.285092 0.310738 0.552083 +0.310738 0.310738 0.552083 +0.334585 0.310738 0.552083 +0.356818 0.310738 0.552083 +0.377602 0.310738 0.552083 +0.397079 0.310738 0.552083 +0.415373 0.310738 0.552083 +0.432594 0.310738 0.552083 +0.448839 0.310738 0.552083 +0.464192 0.310738 0.552083 +0.478729 0.310738 0.552083 +0.492515 0.310738 0.552083 +0.505612 0.310738 0.552083 +0.518072 0.310738 0.552083 +0.529943 0.310738 0.552083 +0.541266 0.310738 0.552083 +0.552083 0.310738 0.552083 +0.562427 0.310738 0.552083 +0.572331 0.310738 0.552083 +0.581823 0.310738 0.552083 +0.590929 0.310738 0.552083 +0.599674 0.310738 0.552083 +0.608079 0.310738 0.552083 +0.616166 0.310738 0.552083 +0.000001 0.334585 0.552083 +0.037293 0.334585 0.552083 +0.079714 0.334585 0.552083 +0.120832 0.334585 0.552083 +0.159284 0.334585 0.552083 +0.194868 0.334585 0.552083 +0.227530 0.334585 0.552083 +0.257434 0.334585 0.552083 +0.285092 0.334585 0.552083 +0.310738 0.334585 0.552083 +0.334585 0.334585 0.552083 +0.356818 0.334585 0.552083 +0.377602 0.334585 0.552083 +0.397079 0.334585 0.552083 +0.415373 0.334585 0.552083 +0.432594 0.334585 0.552083 +0.448839 0.334585 0.552083 +0.464192 0.334585 0.552083 +0.478729 0.334585 0.552083 +0.492515 0.334585 0.552083 +0.505612 0.334585 0.552083 +0.518072 0.334585 0.552083 +0.529943 0.334585 0.552083 +0.541266 0.334585 0.552083 +0.552083 0.334585 0.552083 +0.562427 0.334585 0.552083 +0.572331 0.334585 0.552083 +0.581823 0.334585 0.552083 +0.590929 0.334585 0.552083 +0.599674 0.334585 0.552083 +0.608079 0.334585 0.552083 +0.616166 0.334585 0.552083 +0.000001 0.356818 0.552083 +0.037293 0.356818 0.552083 +0.079714 0.356818 0.552083 +0.120832 0.356818 0.552083 +0.159284 0.356818 0.552083 +0.194868 0.356818 0.552083 +0.227530 0.356818 0.552083 +0.257434 0.356818 0.552083 +0.285092 0.356818 0.552083 +0.310738 0.356818 0.552083 +0.334585 0.356818 0.552083 +0.356818 0.356818 0.552083 +0.377602 0.356818 0.552083 +0.397079 0.356818 0.552083 +0.415373 0.356818 0.552083 +0.432594 0.356818 0.552083 +0.448839 0.356818 0.552083 +0.464192 0.356818 0.552083 +0.478729 0.356818 0.552083 +0.492515 0.356818 0.552083 +0.505612 0.356818 0.552083 +0.518072 0.356818 0.552083 +0.529943 0.356818 0.552083 +0.541266 0.356818 0.552083 +0.552083 0.356818 0.552083 +0.562427 0.356818 0.552083 +0.572331 0.356818 0.552083 +0.581823 0.356818 0.552083 +0.590929 0.356818 0.552083 +0.599674 0.356818 0.552083 +0.608079 0.356818 0.552083 +0.616166 0.356818 0.552083 +0.000001 0.377602 0.552083 +0.037293 0.377602 0.552083 +0.079714 0.377602 0.552083 +0.120832 0.377602 0.552083 +0.159284 0.377602 0.552083 +0.194868 0.377602 0.552083 +0.227530 0.377602 0.552083 +0.257434 0.377602 0.552083 +0.285092 0.377602 0.552083 +0.310738 0.377602 0.552083 +0.334585 0.377602 0.552083 +0.356818 0.377602 0.552083 +0.377602 0.377602 0.552083 +0.397079 0.377602 0.552083 +0.415373 0.377602 0.552083 +0.432594 0.377602 0.552083 +0.448839 0.377602 0.552083 +0.464192 0.377602 0.552083 +0.478729 0.377602 0.552083 +0.492515 0.377602 0.552083 +0.505612 0.377602 0.552083 +0.518072 0.377602 0.552083 +0.529943 0.377602 0.552083 +0.541266 0.377602 0.552083 +0.552083 0.377602 0.552083 +0.562427 0.377602 0.552083 +0.572331 0.377602 0.552083 +0.581823 0.377602 0.552083 +0.590929 0.377602 0.552083 +0.599674 0.377602 0.552083 +0.608079 0.377602 0.552083 +0.616166 0.377602 0.552083 +0.000001 0.397079 0.552083 +0.037293 0.397079 0.552083 +0.079714 0.397079 0.552083 +0.120832 0.397079 0.552083 +0.159284 0.397079 0.552083 +0.194868 0.397079 0.552083 +0.227530 0.397079 0.552083 +0.257434 0.397079 0.552083 +0.285092 0.397079 0.552083 +0.310738 0.397079 0.552083 +0.334585 0.397079 0.552083 +0.356818 0.397079 0.552083 +0.377602 0.397079 0.552083 +0.397079 0.397079 0.552083 +0.415373 0.397079 0.552083 +0.432594 0.397079 0.552083 +0.448839 0.397079 0.552083 +0.464192 0.397079 0.552083 +0.478729 0.397079 0.552083 +0.492515 0.397079 0.552083 +0.505612 0.397079 0.552083 +0.518072 0.397079 0.552083 +0.529943 0.397079 0.552083 +0.541266 0.397079 0.552083 +0.552083 0.397079 0.552083 +0.562427 0.397079 0.552083 +0.572331 0.397079 0.552083 +0.581823 0.397079 0.552083 +0.590929 0.397079 0.552083 +0.599674 0.397079 0.552083 +0.608079 0.397079 0.552083 +0.616166 0.397079 0.552083 +0.000001 0.415373 0.552083 +0.037293 0.415373 0.552083 +0.079714 0.415373 0.552083 +0.120832 0.415373 0.552083 +0.159284 0.415373 0.552083 +0.194868 0.415373 0.552083 +0.227530 0.415373 0.552083 +0.257434 0.415373 0.552083 +0.285092 0.415373 0.552083 +0.310738 0.415373 0.552083 +0.334585 0.415373 0.552083 +0.356818 0.415373 0.552083 +0.377602 0.415373 0.552083 +0.397079 0.415373 0.552083 +0.415373 0.415373 0.552083 +0.432594 0.415373 0.552083 +0.448839 0.415373 0.552083 +0.464192 0.415373 0.552083 +0.478729 0.415373 0.552083 +0.492515 0.415373 0.552083 +0.505612 0.415373 0.552083 +0.518072 0.415373 0.552083 +0.529943 0.415373 0.552083 +0.541266 0.415373 0.552083 +0.552083 0.415373 0.552083 +0.562427 0.415373 0.552083 +0.572331 0.415373 0.552083 +0.581823 0.415373 0.552083 +0.590929 0.415373 0.552083 +0.599674 0.415373 0.552083 +0.608079 0.415373 0.552083 +0.616166 0.415373 0.552083 +0.000001 0.432594 0.552083 +0.037293 0.432594 0.552083 +0.079714 0.432594 0.552083 +0.120832 0.432594 0.552083 +0.159284 0.432594 0.552083 +0.194868 0.432594 0.552083 +0.227530 0.432594 0.552083 +0.257434 0.432594 0.552083 +0.285092 0.432594 0.552083 +0.310738 0.432594 0.552083 +0.334585 0.432594 0.552083 +0.356818 0.432594 0.552083 +0.377602 0.432594 0.552083 +0.397079 0.432594 0.552083 +0.415373 0.432594 0.552083 +0.432594 0.432594 0.552083 +0.448839 0.432594 0.552083 +0.464192 0.432594 0.552083 +0.478729 0.432594 0.552083 +0.492515 0.432594 0.552083 +0.505612 0.432594 0.552083 +0.518072 0.432594 0.552083 +0.529943 0.432594 0.552083 +0.541266 0.432594 0.552083 +0.552083 0.432594 0.552083 +0.562427 0.432594 0.552083 +0.572331 0.432594 0.552083 +0.581823 0.432594 0.552083 +0.590929 0.432594 0.552083 +0.599674 0.432594 0.552083 +0.608079 0.432594 0.552083 +0.616166 0.432594 0.552083 +0.000001 0.448839 0.552083 +0.037293 0.448839 0.552083 +0.079714 0.448839 0.552083 +0.120832 0.448839 0.552083 +0.159284 0.448839 0.552083 +0.194868 0.448839 0.552083 +0.227530 0.448839 0.552083 +0.257434 0.448839 0.552083 +0.285092 0.448839 0.552083 +0.310738 0.448839 0.552083 +0.334585 0.448839 0.552083 +0.356818 0.448839 0.552083 +0.377602 0.448839 0.552083 +0.397079 0.448839 0.552083 +0.415373 0.448839 0.552083 +0.432594 0.448839 0.552083 +0.448839 0.448839 0.552083 +0.464192 0.448839 0.552083 +0.478729 0.448839 0.552083 +0.492515 0.448839 0.552083 +0.505612 0.448839 0.552083 +0.518072 0.448839 0.552083 +0.529943 0.448839 0.552083 +0.541266 0.448839 0.552083 +0.552083 0.448839 0.552083 +0.562427 0.448839 0.552083 +0.572331 0.448839 0.552083 +0.581823 0.448839 0.552083 +0.590929 0.448839 0.552083 +0.599674 0.448839 0.552083 +0.608079 0.448839 0.552083 +0.616166 0.448839 0.552083 +0.000001 0.464192 0.552083 +0.037293 0.464192 0.552083 +0.079714 0.464192 0.552083 +0.120832 0.464192 0.552083 +0.159284 0.464192 0.552083 +0.194868 0.464192 0.552083 +0.227530 0.464192 0.552083 +0.257434 0.464192 0.552083 +0.285092 0.464192 0.552083 +0.310738 0.464192 0.552083 +0.334585 0.464192 0.552083 +0.356818 0.464192 0.552083 +0.377602 0.464192 0.552083 +0.397079 0.464192 0.552083 +0.415373 0.464192 0.552083 +0.432594 0.464192 0.552083 +0.448839 0.464192 0.552083 +0.464192 0.464192 0.552083 +0.478729 0.464192 0.552083 +0.492515 0.464192 0.552083 +0.505612 0.464192 0.552083 +0.518072 0.464192 0.552083 +0.529943 0.464192 0.552083 +0.541266 0.464192 0.552083 +0.552083 0.464192 0.552083 +0.562427 0.464192 0.552083 +0.572331 0.464192 0.552083 +0.581823 0.464192 0.552083 +0.590929 0.464192 0.552083 +0.599674 0.464192 0.552083 +0.608079 0.464192 0.552083 +0.616166 0.464192 0.552083 +0.000001 0.478729 0.552083 +0.037293 0.478729 0.552083 +0.079714 0.478729 0.552083 +0.120832 0.478729 0.552083 +0.159284 0.478729 0.552083 +0.194868 0.478729 0.552083 +0.227530 0.478729 0.552083 +0.257434 0.478729 0.552083 +0.285092 0.478729 0.552083 +0.310738 0.478729 0.552083 +0.334585 0.478729 0.552083 +0.356818 0.478729 0.552083 +0.377602 0.478729 0.552083 +0.397079 0.478729 0.552083 +0.415373 0.478729 0.552083 +0.432594 0.478729 0.552083 +0.448839 0.478729 0.552083 +0.464192 0.478729 0.552083 +0.478729 0.478729 0.552083 +0.492515 0.478729 0.552083 +0.505612 0.478729 0.552083 +0.518072 0.478729 0.552083 +0.529943 0.478729 0.552083 +0.541266 0.478729 0.552083 +0.552083 0.478729 0.552083 +0.562427 0.478729 0.552083 +0.572331 0.478729 0.552083 +0.581823 0.478729 0.552083 +0.590929 0.478729 0.552083 +0.599674 0.478729 0.552083 +0.608079 0.478729 0.552083 +0.616166 0.478729 0.552083 +0.000001 0.492515 0.552083 +0.037293 0.492515 0.552083 +0.079714 0.492515 0.552083 +0.120832 0.492515 0.552083 +0.159284 0.492515 0.552083 +0.194868 0.492515 0.552083 +0.227530 0.492515 0.552083 +0.257434 0.492515 0.552083 +0.285092 0.492515 0.552083 +0.310738 0.492515 0.552083 +0.334585 0.492515 0.552083 +0.356818 0.492515 0.552083 +0.377602 0.492515 0.552083 +0.397079 0.492515 0.552083 +0.415373 0.492515 0.552083 +0.432594 0.492515 0.552083 +0.448839 0.492515 0.552083 +0.464192 0.492515 0.552083 +0.478729 0.492515 0.552083 +0.492515 0.492515 0.552083 +0.505612 0.492515 0.552083 +0.518072 0.492515 0.552083 +0.529943 0.492515 0.552083 +0.541266 0.492515 0.552083 +0.552083 0.492515 0.552083 +0.562427 0.492515 0.552083 +0.572331 0.492515 0.552083 +0.581823 0.492515 0.552083 +0.590929 0.492515 0.552083 +0.599674 0.492515 0.552083 +0.608079 0.492515 0.552083 +0.616166 0.492515 0.552083 +0.000001 0.505612 0.552083 +0.037293 0.505612 0.552083 +0.079714 0.505612 0.552083 +0.120832 0.505612 0.552083 +0.159284 0.505612 0.552083 +0.194868 0.505612 0.552083 +0.227530 0.505612 0.552083 +0.257434 0.505612 0.552083 +0.285092 0.505612 0.552083 +0.310738 0.505612 0.552083 +0.334585 0.505612 0.552083 +0.356818 0.505612 0.552083 +0.377602 0.505612 0.552083 +0.397079 0.505612 0.552083 +0.415373 0.505612 0.552083 +0.432594 0.505612 0.552083 +0.448839 0.505612 0.552083 +0.464192 0.505612 0.552083 +0.478729 0.505612 0.552083 +0.492515 0.505612 0.552083 +0.505612 0.505612 0.552083 +0.518072 0.505612 0.552083 +0.529943 0.505612 0.552083 +0.541266 0.505612 0.552083 +0.552083 0.505612 0.552083 +0.562427 0.505612 0.552083 +0.572331 0.505612 0.552083 +0.581823 0.505612 0.552083 +0.590929 0.505612 0.552083 +0.599674 0.505612 0.552083 +0.608079 0.505612 0.552083 +0.616166 0.505612 0.552083 +0.000001 0.518072 0.552083 +0.037293 0.518072 0.552083 +0.079714 0.518072 0.552083 +0.120832 0.518072 0.552083 +0.159284 0.518072 0.552083 +0.194868 0.518072 0.552083 +0.227530 0.518072 0.552083 +0.257434 0.518072 0.552083 +0.285092 0.518072 0.552083 +0.310738 0.518072 0.552083 +0.334585 0.518072 0.552083 +0.356818 0.518072 0.552083 +0.377602 0.518072 0.552083 +0.397079 0.518072 0.552083 +0.415373 0.518072 0.552083 +0.432594 0.518072 0.552083 +0.448839 0.518072 0.552083 +0.464192 0.518072 0.552083 +0.478729 0.518072 0.552083 +0.492515 0.518072 0.552083 +0.505612 0.518072 0.552083 +0.518072 0.518072 0.552083 +0.529943 0.518072 0.552083 +0.541266 0.518072 0.552083 +0.552083 0.518072 0.552083 +0.562427 0.518072 0.552083 +0.572331 0.518072 0.552083 +0.581823 0.518072 0.552083 +0.590929 0.518072 0.552083 +0.599674 0.518072 0.552083 +0.608079 0.518072 0.552083 +0.616166 0.518072 0.552083 +0.000001 0.529943 0.552083 +0.037293 0.529943 0.552083 +0.079714 0.529943 0.552083 +0.120832 0.529943 0.552083 +0.159284 0.529943 0.552083 +0.194868 0.529943 0.552083 +0.227530 0.529943 0.552083 +0.257434 0.529943 0.552083 +0.285092 0.529943 0.552083 +0.310738 0.529943 0.552083 +0.334585 0.529943 0.552083 +0.356818 0.529943 0.552083 +0.377602 0.529943 0.552083 +0.397079 0.529943 0.552083 +0.415373 0.529943 0.552083 +0.432594 0.529943 0.552083 +0.448839 0.529943 0.552083 +0.464192 0.529943 0.552083 +0.478729 0.529943 0.552083 +0.492515 0.529943 0.552083 +0.505612 0.529943 0.552083 +0.518072 0.529943 0.552083 +0.529943 0.529943 0.552083 +0.541266 0.529943 0.552083 +0.552083 0.529943 0.552083 +0.562427 0.529943 0.552083 +0.572331 0.529943 0.552083 +0.581823 0.529943 0.552083 +0.590929 0.529943 0.552083 +0.599674 0.529943 0.552083 +0.608079 0.529943 0.552083 +0.616166 0.529943 0.552083 +0.000001 0.541266 0.552083 +0.037293 0.541266 0.552083 +0.079714 0.541266 0.552083 +0.120832 0.541266 0.552083 +0.159284 0.541266 0.552083 +0.194868 0.541266 0.552083 +0.227530 0.541266 0.552083 +0.257434 0.541266 0.552083 +0.285092 0.541266 0.552083 +0.310738 0.541266 0.552083 +0.334585 0.541266 0.552083 +0.356818 0.541266 0.552083 +0.377602 0.541266 0.552083 +0.397079 0.541266 0.552083 +0.415373 0.541266 0.552083 +0.432594 0.541266 0.552083 +0.448839 0.541266 0.552083 +0.464192 0.541266 0.552083 +0.478729 0.541266 0.552083 +0.492515 0.541266 0.552083 +0.505612 0.541266 0.552083 +0.518072 0.541266 0.552083 +0.529943 0.541266 0.552083 +0.541266 0.541266 0.552083 +0.552083 0.541266 0.552083 +0.562427 0.541266 0.552083 +0.572331 0.541266 0.552083 +0.581823 0.541266 0.552083 +0.590929 0.541266 0.552083 +0.599674 0.541266 0.552083 +0.608079 0.541266 0.552083 +0.616166 0.541266 0.552083 +0.000001 0.552083 0.552083 +0.037293 0.552083 0.552083 +0.079714 0.552083 0.552083 +0.120832 0.552083 0.552083 +0.159284 0.552083 0.552083 +0.194868 0.552083 0.552083 +0.227530 0.552083 0.552083 +0.257434 0.552083 0.552083 +0.285092 0.552083 0.552083 +0.310738 0.552083 0.552083 +0.334585 0.552083 0.552083 +0.356818 0.552083 0.552083 +0.377602 0.552083 0.552083 +0.397079 0.552083 0.552083 +0.415373 0.552083 0.552083 +0.432594 0.552083 0.552083 +0.448839 0.552083 0.552083 +0.464192 0.552083 0.552083 +0.478729 0.552083 0.552083 +0.492515 0.552083 0.552083 +0.505612 0.552083 0.552083 +0.518072 0.552083 0.552083 +0.529943 0.552083 0.552083 +0.541266 0.552083 0.552083 +0.552083 0.552083 0.552083 +0.562427 0.552083 0.552083 +0.572331 0.552083 0.552083 +0.581823 0.552083 0.552083 +0.590929 0.552083 0.552083 +0.599674 0.552083 0.552083 +0.608079 0.552083 0.552083 +0.616166 0.552083 0.552083 +0.000001 0.562427 0.552083 +0.037293 0.562427 0.552083 +0.079714 0.562427 0.552083 +0.120832 0.562427 0.552083 +0.159284 0.562427 0.552083 +0.194868 0.562427 0.552083 +0.227530 0.562427 0.552083 +0.257434 0.562427 0.552083 +0.285092 0.562427 0.552083 +0.310738 0.562427 0.552083 +0.334585 0.562427 0.552083 +0.356818 0.562427 0.552083 +0.377602 0.562427 0.552083 +0.397079 0.562427 0.552083 +0.415373 0.562427 0.552083 +0.432594 0.562427 0.552083 +0.448839 0.562427 0.552083 +0.464192 0.562427 0.552083 +0.478729 0.562427 0.552083 +0.492515 0.562427 0.552083 +0.505612 0.562427 0.552083 +0.518072 0.562427 0.552083 +0.529943 0.562427 0.552083 +0.541266 0.562427 0.552083 +0.552083 0.562427 0.552083 +0.562427 0.562427 0.552083 +0.572331 0.562427 0.552083 +0.581823 0.562427 0.552083 +0.590929 0.562427 0.552083 +0.599674 0.562427 0.552083 +0.608079 0.562427 0.552083 +0.616166 0.562427 0.552083 +0.000001 0.572331 0.552083 +0.037293 0.572331 0.552083 +0.079714 0.572331 0.552083 +0.120832 0.572331 0.552083 +0.159284 0.572331 0.552083 +0.194868 0.572331 0.552083 +0.227530 0.572331 0.552083 +0.257434 0.572331 0.552083 +0.285092 0.572331 0.552083 +0.310738 0.572331 0.552083 +0.334585 0.572331 0.552083 +0.356818 0.572331 0.552083 +0.377602 0.572331 0.552083 +0.397079 0.572331 0.552083 +0.415373 0.572331 0.552083 +0.432594 0.572331 0.552083 +0.448839 0.572331 0.552083 +0.464192 0.572331 0.552083 +0.478729 0.572331 0.552083 +0.492515 0.572331 0.552083 +0.505612 0.572331 0.552083 +0.518072 0.572331 0.552083 +0.529943 0.572331 0.552083 +0.541266 0.572331 0.552083 +0.552083 0.572331 0.552083 +0.562427 0.572331 0.552083 +0.572331 0.572331 0.552083 +0.581823 0.572331 0.552083 +0.590929 0.572331 0.552083 +0.599674 0.572331 0.552083 +0.608079 0.572331 0.552083 +0.616166 0.572331 0.552083 +0.000001 0.581823 0.552083 +0.037293 0.581823 0.552083 +0.079714 0.581823 0.552083 +0.120832 0.581823 0.552083 +0.159284 0.581823 0.552083 +0.194868 0.581823 0.552083 +0.227530 0.581823 0.552083 +0.257434 0.581823 0.552083 +0.285092 0.581823 0.552083 +0.310738 0.581823 0.552083 +0.334585 0.581823 0.552083 +0.356818 0.581823 0.552083 +0.377602 0.581823 0.552083 +0.397079 0.581823 0.552083 +0.415373 0.581823 0.552083 +0.432594 0.581823 0.552083 +0.448839 0.581823 0.552083 +0.464192 0.581823 0.552083 +0.478729 0.581823 0.552083 +0.492515 0.581823 0.552083 +0.505612 0.581823 0.552083 +0.518072 0.581823 0.552083 +0.529943 0.581823 0.552083 +0.541266 0.581823 0.552083 +0.552083 0.581823 0.552083 +0.562427 0.581823 0.552083 +0.572331 0.581823 0.552083 +0.581823 0.581823 0.552083 +0.590929 0.581823 0.552083 +0.599674 0.581823 0.552083 +0.608079 0.581823 0.552083 +0.616166 0.581823 0.552083 +0.000001 0.590929 0.552083 +0.037293 0.590929 0.552083 +0.079714 0.590929 0.552083 +0.120832 0.590929 0.552083 +0.159284 0.590929 0.552083 +0.194868 0.590929 0.552083 +0.227530 0.590929 0.552083 +0.257434 0.590929 0.552083 +0.285092 0.590929 0.552083 +0.310738 0.590929 0.552083 +0.334585 0.590929 0.552083 +0.356818 0.590929 0.552083 +0.377602 0.590929 0.552083 +0.397079 0.590929 0.552083 +0.415373 0.590929 0.552083 +0.432594 0.590929 0.552083 +0.448839 0.590929 0.552083 +0.464192 0.590929 0.552083 +0.478729 0.590929 0.552083 +0.492515 0.590929 0.552083 +0.505612 0.590929 0.552083 +0.518072 0.590929 0.552083 +0.529943 0.590929 0.552083 +0.541266 0.590929 0.552083 +0.552083 0.590929 0.552083 +0.562427 0.590929 0.552083 +0.572331 0.590929 0.552083 +0.581823 0.590929 0.552083 +0.590929 0.590929 0.552083 +0.599674 0.590929 0.552083 +0.608079 0.590929 0.552083 +0.616166 0.590929 0.552083 +0.000001 0.599674 0.552083 +0.037293 0.599674 0.552083 +0.079714 0.599674 0.552083 +0.120832 0.599674 0.552083 +0.159284 0.599674 0.552083 +0.194868 0.599674 0.552083 +0.227530 0.599674 0.552083 +0.257434 0.599674 0.552083 +0.285092 0.599674 0.552083 +0.310738 0.599674 0.552083 +0.334585 0.599674 0.552083 +0.356818 0.599674 0.552083 +0.377602 0.599674 0.552083 +0.397079 0.599674 0.552083 +0.415373 0.599674 0.552083 +0.432594 0.599674 0.552083 +0.448839 0.599674 0.552083 +0.464192 0.599674 0.552083 +0.478729 0.599674 0.552083 +0.492515 0.599674 0.552083 +0.505612 0.599674 0.552083 +0.518072 0.599674 0.552083 +0.529943 0.599674 0.552083 +0.541266 0.599674 0.552083 +0.552083 0.599674 0.552083 +0.562427 0.599674 0.552083 +0.572331 0.599674 0.552083 +0.581823 0.599674 0.552083 +0.590929 0.599674 0.552083 +0.599674 0.599674 0.552083 +0.608079 0.599674 0.552083 +0.616166 0.599674 0.552083 +0.000001 0.608079 0.552083 +0.037293 0.608079 0.552083 +0.079714 0.608079 0.552083 +0.120832 0.608079 0.552083 +0.159284 0.608079 0.552083 +0.194868 0.608079 0.552083 +0.227530 0.608079 0.552083 +0.257434 0.608079 0.552083 +0.285092 0.608079 0.552083 +0.310738 0.608079 0.552083 +0.334585 0.608079 0.552083 +0.356818 0.608079 0.552083 +0.377602 0.608079 0.552083 +0.397079 0.608079 0.552083 +0.415373 0.608079 0.552083 +0.432594 0.608079 0.552083 +0.448839 0.608079 0.552083 +0.464192 0.608079 0.552083 +0.478729 0.608079 0.552083 +0.492515 0.608079 0.552083 +0.505612 0.608079 0.552083 +0.518072 0.608079 0.552083 +0.529943 0.608079 0.552083 +0.541266 0.608079 0.552083 +0.552083 0.608079 0.552083 +0.562427 0.608079 0.552083 +0.572331 0.608079 0.552083 +0.581823 0.608079 0.552083 +0.590929 0.608079 0.552083 +0.599674 0.608079 0.552083 +0.608079 0.608079 0.552083 +0.616166 0.608079 0.552083 +0.000001 0.616166 0.552083 +0.037293 0.616166 0.552083 +0.079714 0.616166 0.552083 +0.120832 0.616166 0.552083 +0.159284 0.616166 0.552083 +0.194868 0.616166 0.552083 +0.227530 0.616166 0.552083 +0.257434 0.616166 0.552083 +0.285092 0.616166 0.552083 +0.310738 0.616166 0.552083 +0.334585 0.616166 0.552083 +0.356818 0.616166 0.552083 +0.377602 0.616166 0.552083 +0.397079 0.616166 0.552083 +0.415373 0.616166 0.552083 +0.432594 0.616166 0.552083 +0.448839 0.616166 0.552083 +0.464192 0.616166 0.552083 +0.478729 0.616166 0.552083 +0.492515 0.616166 0.552083 +0.505612 0.616166 0.552083 +0.518072 0.616166 0.552083 +0.529943 0.616166 0.552083 +0.541266 0.616166 0.552083 +0.552083 0.616166 0.552083 +0.562427 0.616166 0.552083 +0.572331 0.616166 0.552083 +0.581823 0.616166 0.552083 +0.590929 0.616166 0.552083 +0.599674 0.616166 0.552083 +0.608079 0.616166 0.552083 +0.616166 0.616166 0.552083 +0.000001 0.000001 0.562427 +0.037293 0.000001 0.562427 +0.079714 0.000001 0.562427 +0.120832 0.000001 0.562427 +0.159284 0.000001 0.562427 +0.194868 0.000001 0.562427 +0.227530 0.000001 0.562427 +0.257434 0.000001 0.562427 +0.285092 0.000001 0.562427 +0.310738 0.000001 0.562427 +0.334585 0.000001 0.562427 +0.356818 0.000001 0.562427 +0.377602 0.000001 0.562427 +0.397079 0.000001 0.562427 +0.415373 0.000001 0.562427 +0.432594 0.000001 0.562427 +0.448839 0.000001 0.562427 +0.464192 0.000001 0.562427 +0.478729 0.000001 0.562427 +0.492515 0.000001 0.562427 +0.505612 0.000001 0.562427 +0.518072 0.000001 0.562427 +0.529943 0.000001 0.562427 +0.541266 0.000001 0.562427 +0.552083 0.000001 0.562427 +0.562427 0.000001 0.562427 +0.572331 0.000001 0.562427 +0.581823 0.000001 0.562427 +0.590929 0.000001 0.562427 +0.599674 0.000001 0.562427 +0.608079 0.000001 0.562427 +0.616166 0.000001 0.562427 +0.000001 0.037293 0.562427 +0.037293 0.037293 0.562427 +0.079714 0.037293 0.562427 +0.120832 0.037293 0.562427 +0.159284 0.037293 0.562427 +0.194868 0.037293 0.562427 +0.227530 0.037293 0.562427 +0.257434 0.037293 0.562427 +0.285092 0.037293 0.562427 +0.310738 0.037293 0.562427 +0.334585 0.037293 0.562427 +0.356818 0.037293 0.562427 +0.377602 0.037293 0.562427 +0.397079 0.037293 0.562427 +0.415373 0.037293 0.562427 +0.432594 0.037293 0.562427 +0.448839 0.037293 0.562427 +0.464192 0.037293 0.562427 +0.478729 0.037293 0.562427 +0.492515 0.037293 0.562427 +0.505612 0.037293 0.562427 +0.518072 0.037293 0.562427 +0.529943 0.037293 0.562427 +0.541266 0.037293 0.562427 +0.552083 0.037293 0.562427 +0.562427 0.037293 0.562427 +0.572331 0.037293 0.562427 +0.581823 0.037293 0.562427 +0.590929 0.037293 0.562427 +0.599674 0.037293 0.562427 +0.608079 0.037293 0.562427 +0.616166 0.037293 0.562427 +0.000001 0.079714 0.562427 +0.037293 0.079714 0.562427 +0.079714 0.079714 0.562427 +0.120832 0.079714 0.562427 +0.159284 0.079714 0.562427 +0.194868 0.079714 0.562427 +0.227530 0.079714 0.562427 +0.257434 0.079714 0.562427 +0.285092 0.079714 0.562427 +0.310738 0.079714 0.562427 +0.334585 0.079714 0.562427 +0.356818 0.079714 0.562427 +0.377602 0.079714 0.562427 +0.397079 0.079714 0.562427 +0.415373 0.079714 0.562427 +0.432594 0.079714 0.562427 +0.448839 0.079714 0.562427 +0.464192 0.079714 0.562427 +0.478729 0.079714 0.562427 +0.492515 0.079714 0.562427 +0.505612 0.079714 0.562427 +0.518072 0.079714 0.562427 +0.529943 0.079714 0.562427 +0.541266 0.079714 0.562427 +0.552083 0.079714 0.562427 +0.562427 0.079714 0.562427 +0.572331 0.079714 0.562427 +0.581823 0.079714 0.562427 +0.590929 0.079714 0.562427 +0.599674 0.079714 0.562427 +0.608079 0.079714 0.562427 +0.616166 0.079714 0.562427 +0.000001 0.120832 0.562427 +0.037293 0.120832 0.562427 +0.079714 0.120832 0.562427 +0.120832 0.120832 0.562427 +0.159284 0.120832 0.562427 +0.194868 0.120832 0.562427 +0.227530 0.120832 0.562427 +0.257434 0.120832 0.562427 +0.285092 0.120832 0.562427 +0.310738 0.120832 0.562427 +0.334585 0.120832 0.562427 +0.356818 0.120832 0.562427 +0.377602 0.120832 0.562427 +0.397079 0.120832 0.562427 +0.415373 0.120832 0.562427 +0.432594 0.120832 0.562427 +0.448839 0.120832 0.562427 +0.464192 0.120832 0.562427 +0.478729 0.120832 0.562427 +0.492515 0.120832 0.562427 +0.505612 0.120832 0.562427 +0.518072 0.120832 0.562427 +0.529943 0.120832 0.562427 +0.541266 0.120832 0.562427 +0.552083 0.120832 0.562427 +0.562427 0.120832 0.562427 +0.572331 0.120832 0.562427 +0.581823 0.120832 0.562427 +0.590929 0.120832 0.562427 +0.599674 0.120832 0.562427 +0.608079 0.120832 0.562427 +0.616166 0.120832 0.562427 +0.000001 0.159284 0.562427 +0.037293 0.159284 0.562427 +0.079714 0.159284 0.562427 +0.120832 0.159284 0.562427 +0.159284 0.159284 0.562427 +0.194868 0.159284 0.562427 +0.227530 0.159284 0.562427 +0.257434 0.159284 0.562427 +0.285092 0.159284 0.562427 +0.310738 0.159284 0.562427 +0.334585 0.159284 0.562427 +0.356818 0.159284 0.562427 +0.377602 0.159284 0.562427 +0.397079 0.159284 0.562427 +0.415373 0.159284 0.562427 +0.432594 0.159284 0.562427 +0.448839 0.159284 0.562427 +0.464192 0.159284 0.562427 +0.478729 0.159284 0.562427 +0.492515 0.159284 0.562427 +0.505612 0.159284 0.562427 +0.518072 0.159284 0.562427 +0.529943 0.159284 0.562427 +0.541266 0.159284 0.562427 +0.552083 0.159284 0.562427 +0.562427 0.159284 0.562427 +0.572331 0.159284 0.562427 +0.581823 0.159284 0.562427 +0.590929 0.159284 0.562427 +0.599674 0.159284 0.562427 +0.608079 0.159284 0.562427 +0.616166 0.159284 0.562427 +0.000001 0.194868 0.562427 +0.037293 0.194868 0.562427 +0.079714 0.194868 0.562427 +0.120832 0.194868 0.562427 +0.159284 0.194868 0.562427 +0.194868 0.194868 0.562427 +0.227530 0.194868 0.562427 +0.257434 0.194868 0.562427 +0.285092 0.194868 0.562427 +0.310738 0.194868 0.562427 +0.334585 0.194868 0.562427 +0.356818 0.194868 0.562427 +0.377602 0.194868 0.562427 +0.397079 0.194868 0.562427 +0.415373 0.194868 0.562427 +0.432594 0.194868 0.562427 +0.448839 0.194868 0.562427 +0.464192 0.194868 0.562427 +0.478729 0.194868 0.562427 +0.492515 0.194868 0.562427 +0.505612 0.194868 0.562427 +0.518072 0.194868 0.562427 +0.529943 0.194868 0.562427 +0.541266 0.194868 0.562427 +0.552083 0.194868 0.562427 +0.562427 0.194868 0.562427 +0.572331 0.194868 0.562427 +0.581823 0.194868 0.562427 +0.590929 0.194868 0.562427 +0.599674 0.194868 0.562427 +0.608079 0.194868 0.562427 +0.616166 0.194868 0.562427 +0.000001 0.227530 0.562427 +0.037293 0.227530 0.562427 +0.079714 0.227530 0.562427 +0.120832 0.227530 0.562427 +0.159284 0.227530 0.562427 +0.194868 0.227530 0.562427 +0.227530 0.227530 0.562427 +0.257434 0.227530 0.562427 +0.285092 0.227530 0.562427 +0.310738 0.227530 0.562427 +0.334585 0.227530 0.562427 +0.356818 0.227530 0.562427 +0.377602 0.227530 0.562427 +0.397079 0.227530 0.562427 +0.415373 0.227530 0.562427 +0.432594 0.227530 0.562427 +0.448839 0.227530 0.562427 +0.464192 0.227530 0.562427 +0.478729 0.227530 0.562427 +0.492515 0.227530 0.562427 +0.505612 0.227530 0.562427 +0.518072 0.227530 0.562427 +0.529943 0.227530 0.562427 +0.541266 0.227530 0.562427 +0.552083 0.227530 0.562427 +0.562427 0.227530 0.562427 +0.572331 0.227530 0.562427 +0.581823 0.227530 0.562427 +0.590929 0.227530 0.562427 +0.599674 0.227530 0.562427 +0.608079 0.227530 0.562427 +0.616166 0.227530 0.562427 +0.000001 0.257434 0.562427 +0.037293 0.257434 0.562427 +0.079714 0.257434 0.562427 +0.120832 0.257434 0.562427 +0.159284 0.257434 0.562427 +0.194868 0.257434 0.562427 +0.227530 0.257434 0.562427 +0.257434 0.257434 0.562427 +0.285092 0.257434 0.562427 +0.310738 0.257434 0.562427 +0.334585 0.257434 0.562427 +0.356818 0.257434 0.562427 +0.377602 0.257434 0.562427 +0.397079 0.257434 0.562427 +0.415373 0.257434 0.562427 +0.432594 0.257434 0.562427 +0.448839 0.257434 0.562427 +0.464192 0.257434 0.562427 +0.478729 0.257434 0.562427 +0.492515 0.257434 0.562427 +0.505612 0.257434 0.562427 +0.518072 0.257434 0.562427 +0.529943 0.257434 0.562427 +0.541266 0.257434 0.562427 +0.552083 0.257434 0.562427 +0.562427 0.257434 0.562427 +0.572331 0.257434 0.562427 +0.581823 0.257434 0.562427 +0.590929 0.257434 0.562427 +0.599674 0.257434 0.562427 +0.608079 0.257434 0.562427 +0.616166 0.257434 0.562427 +0.000001 0.285092 0.562427 +0.037293 0.285092 0.562427 +0.079714 0.285092 0.562427 +0.120832 0.285092 0.562427 +0.159284 0.285092 0.562427 +0.194868 0.285092 0.562427 +0.227530 0.285092 0.562427 +0.257434 0.285092 0.562427 +0.285092 0.285092 0.562427 +0.310738 0.285092 0.562427 +0.334585 0.285092 0.562427 +0.356818 0.285092 0.562427 +0.377602 0.285092 0.562427 +0.397079 0.285092 0.562427 +0.415373 0.285092 0.562427 +0.432594 0.285092 0.562427 +0.448839 0.285092 0.562427 +0.464192 0.285092 0.562427 +0.478729 0.285092 0.562427 +0.492515 0.285092 0.562427 +0.505612 0.285092 0.562427 +0.518072 0.285092 0.562427 +0.529943 0.285092 0.562427 +0.541266 0.285092 0.562427 +0.552083 0.285092 0.562427 +0.562427 0.285092 0.562427 +0.572331 0.285092 0.562427 +0.581823 0.285092 0.562427 +0.590929 0.285092 0.562427 +0.599674 0.285092 0.562427 +0.608079 0.285092 0.562427 +0.616166 0.285092 0.562427 +0.000001 0.310738 0.562427 +0.037293 0.310738 0.562427 +0.079714 0.310738 0.562427 +0.120832 0.310738 0.562427 +0.159284 0.310738 0.562427 +0.194868 0.310738 0.562427 +0.227530 0.310738 0.562427 +0.257434 0.310738 0.562427 +0.285092 0.310738 0.562427 +0.310738 0.310738 0.562427 +0.334585 0.310738 0.562427 +0.356818 0.310738 0.562427 +0.377602 0.310738 0.562427 +0.397079 0.310738 0.562427 +0.415373 0.310738 0.562427 +0.432594 0.310738 0.562427 +0.448839 0.310738 0.562427 +0.464192 0.310738 0.562427 +0.478729 0.310738 0.562427 +0.492515 0.310738 0.562427 +0.505612 0.310738 0.562427 +0.518072 0.310738 0.562427 +0.529943 0.310738 0.562427 +0.541266 0.310738 0.562427 +0.552083 0.310738 0.562427 +0.562427 0.310738 0.562427 +0.572331 0.310738 0.562427 +0.581823 0.310738 0.562427 +0.590929 0.310738 0.562427 +0.599674 0.310738 0.562427 +0.608079 0.310738 0.562427 +0.616166 0.310738 0.562427 +0.000001 0.334585 0.562427 +0.037293 0.334585 0.562427 +0.079714 0.334585 0.562427 +0.120832 0.334585 0.562427 +0.159284 0.334585 0.562427 +0.194868 0.334585 0.562427 +0.227530 0.334585 0.562427 +0.257434 0.334585 0.562427 +0.285092 0.334585 0.562427 +0.310738 0.334585 0.562427 +0.334585 0.334585 0.562427 +0.356818 0.334585 0.562427 +0.377602 0.334585 0.562427 +0.397079 0.334585 0.562427 +0.415373 0.334585 0.562427 +0.432594 0.334585 0.562427 +0.448839 0.334585 0.562427 +0.464192 0.334585 0.562427 +0.478729 0.334585 0.562427 +0.492515 0.334585 0.562427 +0.505612 0.334585 0.562427 +0.518072 0.334585 0.562427 +0.529943 0.334585 0.562427 +0.541266 0.334585 0.562427 +0.552083 0.334585 0.562427 +0.562427 0.334585 0.562427 +0.572331 0.334585 0.562427 +0.581823 0.334585 0.562427 +0.590929 0.334585 0.562427 +0.599674 0.334585 0.562427 +0.608079 0.334585 0.562427 +0.616166 0.334585 0.562427 +0.000001 0.356818 0.562427 +0.037293 0.356818 0.562427 +0.079714 0.356818 0.562427 +0.120832 0.356818 0.562427 +0.159284 0.356818 0.562427 +0.194868 0.356818 0.562427 +0.227530 0.356818 0.562427 +0.257434 0.356818 0.562427 +0.285092 0.356818 0.562427 +0.310738 0.356818 0.562427 +0.334585 0.356818 0.562427 +0.356818 0.356818 0.562427 +0.377602 0.356818 0.562427 +0.397079 0.356818 0.562427 +0.415373 0.356818 0.562427 +0.432594 0.356818 0.562427 +0.448839 0.356818 0.562427 +0.464192 0.356818 0.562427 +0.478729 0.356818 0.562427 +0.492515 0.356818 0.562427 +0.505612 0.356818 0.562427 +0.518072 0.356818 0.562427 +0.529943 0.356818 0.562427 +0.541266 0.356818 0.562427 +0.552083 0.356818 0.562427 +0.562427 0.356818 0.562427 +0.572331 0.356818 0.562427 +0.581823 0.356818 0.562427 +0.590929 0.356818 0.562427 +0.599674 0.356818 0.562427 +0.608079 0.356818 0.562427 +0.616166 0.356818 0.562427 +0.000001 0.377602 0.562427 +0.037293 0.377602 0.562427 +0.079714 0.377602 0.562427 +0.120832 0.377602 0.562427 +0.159284 0.377602 0.562427 +0.194868 0.377602 0.562427 +0.227530 0.377602 0.562427 +0.257434 0.377602 0.562427 +0.285092 0.377602 0.562427 +0.310738 0.377602 0.562427 +0.334585 0.377602 0.562427 +0.356818 0.377602 0.562427 +0.377602 0.377602 0.562427 +0.397079 0.377602 0.562427 +0.415373 0.377602 0.562427 +0.432594 0.377602 0.562427 +0.448839 0.377602 0.562427 +0.464192 0.377602 0.562427 +0.478729 0.377602 0.562427 +0.492515 0.377602 0.562427 +0.505612 0.377602 0.562427 +0.518072 0.377602 0.562427 +0.529943 0.377602 0.562427 +0.541266 0.377602 0.562427 +0.552083 0.377602 0.562427 +0.562427 0.377602 0.562427 +0.572331 0.377602 0.562427 +0.581823 0.377602 0.562427 +0.590929 0.377602 0.562427 +0.599674 0.377602 0.562427 +0.608079 0.377602 0.562427 +0.616166 0.377602 0.562427 +0.000001 0.397079 0.562427 +0.037293 0.397079 0.562427 +0.079714 0.397079 0.562427 +0.120832 0.397079 0.562427 +0.159284 0.397079 0.562427 +0.194868 0.397079 0.562427 +0.227530 0.397079 0.562427 +0.257434 0.397079 0.562427 +0.285092 0.397079 0.562427 +0.310738 0.397079 0.562427 +0.334585 0.397079 0.562427 +0.356818 0.397079 0.562427 +0.377602 0.397079 0.562427 +0.397079 0.397079 0.562427 +0.415373 0.397079 0.562427 +0.432594 0.397079 0.562427 +0.448839 0.397079 0.562427 +0.464192 0.397079 0.562427 +0.478729 0.397079 0.562427 +0.492515 0.397079 0.562427 +0.505612 0.397079 0.562427 +0.518072 0.397079 0.562427 +0.529943 0.397079 0.562427 +0.541266 0.397079 0.562427 +0.552083 0.397079 0.562427 +0.562427 0.397079 0.562427 +0.572331 0.397079 0.562427 +0.581823 0.397079 0.562427 +0.590929 0.397079 0.562427 +0.599674 0.397079 0.562427 +0.608079 0.397079 0.562427 +0.616166 0.397079 0.562427 +0.000001 0.415373 0.562427 +0.037293 0.415373 0.562427 +0.079714 0.415373 0.562427 +0.120832 0.415373 0.562427 +0.159284 0.415373 0.562427 +0.194868 0.415373 0.562427 +0.227530 0.415373 0.562427 +0.257434 0.415373 0.562427 +0.285092 0.415373 0.562427 +0.310738 0.415373 0.562427 +0.334585 0.415373 0.562427 +0.356818 0.415373 0.562427 +0.377602 0.415373 0.562427 +0.397079 0.415373 0.562427 +0.415373 0.415373 0.562427 +0.432594 0.415373 0.562427 +0.448839 0.415373 0.562427 +0.464192 0.415373 0.562427 +0.478729 0.415373 0.562427 +0.492515 0.415373 0.562427 +0.505612 0.415373 0.562427 +0.518072 0.415373 0.562427 +0.529943 0.415373 0.562427 +0.541266 0.415373 0.562427 +0.552083 0.415373 0.562427 +0.562427 0.415373 0.562427 +0.572331 0.415373 0.562427 +0.581823 0.415373 0.562427 +0.590929 0.415373 0.562427 +0.599674 0.415373 0.562427 +0.608079 0.415373 0.562427 +0.616166 0.415373 0.562427 +0.000001 0.432594 0.562427 +0.037293 0.432594 0.562427 +0.079714 0.432594 0.562427 +0.120832 0.432594 0.562427 +0.159284 0.432594 0.562427 +0.194868 0.432594 0.562427 +0.227530 0.432594 0.562427 +0.257434 0.432594 0.562427 +0.285092 0.432594 0.562427 +0.310738 0.432594 0.562427 +0.334585 0.432594 0.562427 +0.356818 0.432594 0.562427 +0.377602 0.432594 0.562427 +0.397079 0.432594 0.562427 +0.415373 0.432594 0.562427 +0.432594 0.432594 0.562427 +0.448839 0.432594 0.562427 +0.464192 0.432594 0.562427 +0.478729 0.432594 0.562427 +0.492515 0.432594 0.562427 +0.505612 0.432594 0.562427 +0.518072 0.432594 0.562427 +0.529943 0.432594 0.562427 +0.541266 0.432594 0.562427 +0.552083 0.432594 0.562427 +0.562427 0.432594 0.562427 +0.572331 0.432594 0.562427 +0.581823 0.432594 0.562427 +0.590929 0.432594 0.562427 +0.599674 0.432594 0.562427 +0.608079 0.432594 0.562427 +0.616166 0.432594 0.562427 +0.000001 0.448839 0.562427 +0.037293 0.448839 0.562427 +0.079714 0.448839 0.562427 +0.120832 0.448839 0.562427 +0.159284 0.448839 0.562427 +0.194868 0.448839 0.562427 +0.227530 0.448839 0.562427 +0.257434 0.448839 0.562427 +0.285092 0.448839 0.562427 +0.310738 0.448839 0.562427 +0.334585 0.448839 0.562427 +0.356818 0.448839 0.562427 +0.377602 0.448839 0.562427 +0.397079 0.448839 0.562427 +0.415373 0.448839 0.562427 +0.432594 0.448839 0.562427 +0.448839 0.448839 0.562427 +0.464192 0.448839 0.562427 +0.478729 0.448839 0.562427 +0.492515 0.448839 0.562427 +0.505612 0.448839 0.562427 +0.518072 0.448839 0.562427 +0.529943 0.448839 0.562427 +0.541266 0.448839 0.562427 +0.552083 0.448839 0.562427 +0.562427 0.448839 0.562427 +0.572331 0.448839 0.562427 +0.581823 0.448839 0.562427 +0.590929 0.448839 0.562427 +0.599674 0.448839 0.562427 +0.608079 0.448839 0.562427 +0.616166 0.448839 0.562427 +0.000001 0.464192 0.562427 +0.037293 0.464192 0.562427 +0.079714 0.464192 0.562427 +0.120832 0.464192 0.562427 +0.159284 0.464192 0.562427 +0.194868 0.464192 0.562427 +0.227530 0.464192 0.562427 +0.257434 0.464192 0.562427 +0.285092 0.464192 0.562427 +0.310738 0.464192 0.562427 +0.334585 0.464192 0.562427 +0.356818 0.464192 0.562427 +0.377602 0.464192 0.562427 +0.397079 0.464192 0.562427 +0.415373 0.464192 0.562427 +0.432594 0.464192 0.562427 +0.448839 0.464192 0.562427 +0.464192 0.464192 0.562427 +0.478729 0.464192 0.562427 +0.492515 0.464192 0.562427 +0.505612 0.464192 0.562427 +0.518072 0.464192 0.562427 +0.529943 0.464192 0.562427 +0.541266 0.464192 0.562427 +0.552083 0.464192 0.562427 +0.562427 0.464192 0.562427 +0.572331 0.464192 0.562427 +0.581823 0.464192 0.562427 +0.590929 0.464192 0.562427 +0.599674 0.464192 0.562427 +0.608079 0.464192 0.562427 +0.616166 0.464192 0.562427 +0.000001 0.478729 0.562427 +0.037293 0.478729 0.562427 +0.079714 0.478729 0.562427 +0.120832 0.478729 0.562427 +0.159284 0.478729 0.562427 +0.194868 0.478729 0.562427 +0.227530 0.478729 0.562427 +0.257434 0.478729 0.562427 +0.285092 0.478729 0.562427 +0.310738 0.478729 0.562427 +0.334585 0.478729 0.562427 +0.356818 0.478729 0.562427 +0.377602 0.478729 0.562427 +0.397079 0.478729 0.562427 +0.415373 0.478729 0.562427 +0.432594 0.478729 0.562427 +0.448839 0.478729 0.562427 +0.464192 0.478729 0.562427 +0.478729 0.478729 0.562427 +0.492515 0.478729 0.562427 +0.505612 0.478729 0.562427 +0.518072 0.478729 0.562427 +0.529943 0.478729 0.562427 +0.541266 0.478729 0.562427 +0.552083 0.478729 0.562427 +0.562427 0.478729 0.562427 +0.572331 0.478729 0.562427 +0.581823 0.478729 0.562427 +0.590929 0.478729 0.562427 +0.599674 0.478729 0.562427 +0.608079 0.478729 0.562427 +0.616166 0.478729 0.562427 +0.000001 0.492515 0.562427 +0.037293 0.492515 0.562427 +0.079714 0.492515 0.562427 +0.120832 0.492515 0.562427 +0.159284 0.492515 0.562427 +0.194868 0.492515 0.562427 +0.227530 0.492515 0.562427 +0.257434 0.492515 0.562427 +0.285092 0.492515 0.562427 +0.310738 0.492515 0.562427 +0.334585 0.492515 0.562427 +0.356818 0.492515 0.562427 +0.377602 0.492515 0.562427 +0.397079 0.492515 0.562427 +0.415373 0.492515 0.562427 +0.432594 0.492515 0.562427 +0.448839 0.492515 0.562427 +0.464192 0.492515 0.562427 +0.478729 0.492515 0.562427 +0.492515 0.492515 0.562427 +0.505612 0.492515 0.562427 +0.518072 0.492515 0.562427 +0.529943 0.492515 0.562427 +0.541266 0.492515 0.562427 +0.552083 0.492515 0.562427 +0.562427 0.492515 0.562427 +0.572331 0.492515 0.562427 +0.581823 0.492515 0.562427 +0.590929 0.492515 0.562427 +0.599674 0.492515 0.562427 +0.608079 0.492515 0.562427 +0.616166 0.492515 0.562427 +0.000001 0.505612 0.562427 +0.037293 0.505612 0.562427 +0.079714 0.505612 0.562427 +0.120832 0.505612 0.562427 +0.159284 0.505612 0.562427 +0.194868 0.505612 0.562427 +0.227530 0.505612 0.562427 +0.257434 0.505612 0.562427 +0.285092 0.505612 0.562427 +0.310738 0.505612 0.562427 +0.334585 0.505612 0.562427 +0.356818 0.505612 0.562427 +0.377602 0.505612 0.562427 +0.397079 0.505612 0.562427 +0.415373 0.505612 0.562427 +0.432594 0.505612 0.562427 +0.448839 0.505612 0.562427 +0.464192 0.505612 0.562427 +0.478729 0.505612 0.562427 +0.492515 0.505612 0.562427 +0.505612 0.505612 0.562427 +0.518072 0.505612 0.562427 +0.529943 0.505612 0.562427 +0.541266 0.505612 0.562427 +0.552083 0.505612 0.562427 +0.562427 0.505612 0.562427 +0.572331 0.505612 0.562427 +0.581823 0.505612 0.562427 +0.590929 0.505612 0.562427 +0.599674 0.505612 0.562427 +0.608079 0.505612 0.562427 +0.616166 0.505612 0.562427 +0.000001 0.518072 0.562427 +0.037293 0.518072 0.562427 +0.079714 0.518072 0.562427 +0.120832 0.518072 0.562427 +0.159284 0.518072 0.562427 +0.194868 0.518072 0.562427 +0.227530 0.518072 0.562427 +0.257434 0.518072 0.562427 +0.285092 0.518072 0.562427 +0.310738 0.518072 0.562427 +0.334585 0.518072 0.562427 +0.356818 0.518072 0.562427 +0.377602 0.518072 0.562427 +0.397079 0.518072 0.562427 +0.415373 0.518072 0.562427 +0.432594 0.518072 0.562427 +0.448839 0.518072 0.562427 +0.464192 0.518072 0.562427 +0.478729 0.518072 0.562427 +0.492515 0.518072 0.562427 +0.505612 0.518072 0.562427 +0.518072 0.518072 0.562427 +0.529943 0.518072 0.562427 +0.541266 0.518072 0.562427 +0.552083 0.518072 0.562427 +0.562427 0.518072 0.562427 +0.572331 0.518072 0.562427 +0.581823 0.518072 0.562427 +0.590929 0.518072 0.562427 +0.599674 0.518072 0.562427 +0.608079 0.518072 0.562427 +0.616166 0.518072 0.562427 +0.000001 0.529943 0.562427 +0.037293 0.529943 0.562427 +0.079714 0.529943 0.562427 +0.120832 0.529943 0.562427 +0.159284 0.529943 0.562427 +0.194868 0.529943 0.562427 +0.227530 0.529943 0.562427 +0.257434 0.529943 0.562427 +0.285092 0.529943 0.562427 +0.310738 0.529943 0.562427 +0.334585 0.529943 0.562427 +0.356818 0.529943 0.562427 +0.377602 0.529943 0.562427 +0.397079 0.529943 0.562427 +0.415373 0.529943 0.562427 +0.432594 0.529943 0.562427 +0.448839 0.529943 0.562427 +0.464192 0.529943 0.562427 +0.478729 0.529943 0.562427 +0.492515 0.529943 0.562427 +0.505612 0.529943 0.562427 +0.518072 0.529943 0.562427 +0.529943 0.529943 0.562427 +0.541266 0.529943 0.562427 +0.552083 0.529943 0.562427 +0.562427 0.529943 0.562427 +0.572331 0.529943 0.562427 +0.581823 0.529943 0.562427 +0.590929 0.529943 0.562427 +0.599674 0.529943 0.562427 +0.608079 0.529943 0.562427 +0.616166 0.529943 0.562427 +0.000001 0.541266 0.562427 +0.037293 0.541266 0.562427 +0.079714 0.541266 0.562427 +0.120832 0.541266 0.562427 +0.159284 0.541266 0.562427 +0.194868 0.541266 0.562427 +0.227530 0.541266 0.562427 +0.257434 0.541266 0.562427 +0.285092 0.541266 0.562427 +0.310738 0.541266 0.562427 +0.334585 0.541266 0.562427 +0.356818 0.541266 0.562427 +0.377602 0.541266 0.562427 +0.397079 0.541266 0.562427 +0.415373 0.541266 0.562427 +0.432594 0.541266 0.562427 +0.448839 0.541266 0.562427 +0.464192 0.541266 0.562427 +0.478729 0.541266 0.562427 +0.492515 0.541266 0.562427 +0.505612 0.541266 0.562427 +0.518072 0.541266 0.562427 +0.529943 0.541266 0.562427 +0.541266 0.541266 0.562427 +0.552083 0.541266 0.562427 +0.562427 0.541266 0.562427 +0.572331 0.541266 0.562427 +0.581823 0.541266 0.562427 +0.590929 0.541266 0.562427 +0.599674 0.541266 0.562427 +0.608079 0.541266 0.562427 +0.616166 0.541266 0.562427 +0.000001 0.552083 0.562427 +0.037293 0.552083 0.562427 +0.079714 0.552083 0.562427 +0.120832 0.552083 0.562427 +0.159284 0.552083 0.562427 +0.194868 0.552083 0.562427 +0.227530 0.552083 0.562427 +0.257434 0.552083 0.562427 +0.285092 0.552083 0.562427 +0.310738 0.552083 0.562427 +0.334585 0.552083 0.562427 +0.356818 0.552083 0.562427 +0.377602 0.552083 0.562427 +0.397079 0.552083 0.562427 +0.415373 0.552083 0.562427 +0.432594 0.552083 0.562427 +0.448839 0.552083 0.562427 +0.464192 0.552083 0.562427 +0.478729 0.552083 0.562427 +0.492515 0.552083 0.562427 +0.505612 0.552083 0.562427 +0.518072 0.552083 0.562427 +0.529943 0.552083 0.562427 +0.541266 0.552083 0.562427 +0.552083 0.552083 0.562427 +0.562427 0.552083 0.562427 +0.572331 0.552083 0.562427 +0.581823 0.552083 0.562427 +0.590929 0.552083 0.562427 +0.599674 0.552083 0.562427 +0.608079 0.552083 0.562427 +0.616166 0.552083 0.562427 +0.000001 0.562427 0.562427 +0.037293 0.562427 0.562427 +0.079714 0.562427 0.562427 +0.120832 0.562427 0.562427 +0.159284 0.562427 0.562427 +0.194868 0.562427 0.562427 +0.227530 0.562427 0.562427 +0.257434 0.562427 0.562427 +0.285092 0.562427 0.562427 +0.310738 0.562427 0.562427 +0.334585 0.562427 0.562427 +0.356818 0.562427 0.562427 +0.377602 0.562427 0.562427 +0.397079 0.562427 0.562427 +0.415373 0.562427 0.562427 +0.432594 0.562427 0.562427 +0.448839 0.562427 0.562427 +0.464192 0.562427 0.562427 +0.478729 0.562427 0.562427 +0.492515 0.562427 0.562427 +0.505612 0.562427 0.562427 +0.518072 0.562427 0.562427 +0.529943 0.562427 0.562427 +0.541266 0.562427 0.562427 +0.552083 0.562427 0.562427 +0.562427 0.562427 0.562427 +0.572331 0.562427 0.562427 +0.581823 0.562427 0.562427 +0.590929 0.562427 0.562427 +0.599674 0.562427 0.562427 +0.608079 0.562427 0.562427 +0.616166 0.562427 0.562427 +0.000001 0.572331 0.562427 +0.037293 0.572331 0.562427 +0.079714 0.572331 0.562427 +0.120832 0.572331 0.562427 +0.159284 0.572331 0.562427 +0.194868 0.572331 0.562427 +0.227530 0.572331 0.562427 +0.257434 0.572331 0.562427 +0.285092 0.572331 0.562427 +0.310738 0.572331 0.562427 +0.334585 0.572331 0.562427 +0.356818 0.572331 0.562427 +0.377602 0.572331 0.562427 +0.397079 0.572331 0.562427 +0.415373 0.572331 0.562427 +0.432594 0.572331 0.562427 +0.448839 0.572331 0.562427 +0.464192 0.572331 0.562427 +0.478729 0.572331 0.562427 +0.492515 0.572331 0.562427 +0.505612 0.572331 0.562427 +0.518072 0.572331 0.562427 +0.529943 0.572331 0.562427 +0.541266 0.572331 0.562427 +0.552083 0.572331 0.562427 +0.562427 0.572331 0.562427 +0.572331 0.572331 0.562427 +0.581823 0.572331 0.562427 +0.590929 0.572331 0.562427 +0.599674 0.572331 0.562427 +0.608079 0.572331 0.562427 +0.616166 0.572331 0.562427 +0.000001 0.581823 0.562427 +0.037293 0.581823 0.562427 +0.079714 0.581823 0.562427 +0.120832 0.581823 0.562427 +0.159284 0.581823 0.562427 +0.194868 0.581823 0.562427 +0.227530 0.581823 0.562427 +0.257434 0.581823 0.562427 +0.285092 0.581823 0.562427 +0.310738 0.581823 0.562427 +0.334585 0.581823 0.562427 +0.356818 0.581823 0.562427 +0.377602 0.581823 0.562427 +0.397079 0.581823 0.562427 +0.415373 0.581823 0.562427 +0.432594 0.581823 0.562427 +0.448839 0.581823 0.562427 +0.464192 0.581823 0.562427 +0.478729 0.581823 0.562427 +0.492515 0.581823 0.562427 +0.505612 0.581823 0.562427 +0.518072 0.581823 0.562427 +0.529943 0.581823 0.562427 +0.541266 0.581823 0.562427 +0.552083 0.581823 0.562427 +0.562427 0.581823 0.562427 +0.572331 0.581823 0.562427 +0.581823 0.581823 0.562427 +0.590929 0.581823 0.562427 +0.599674 0.581823 0.562427 +0.608079 0.581823 0.562427 +0.616166 0.581823 0.562427 +0.000001 0.590929 0.562427 +0.037293 0.590929 0.562427 +0.079714 0.590929 0.562427 +0.120832 0.590929 0.562427 +0.159284 0.590929 0.562427 +0.194868 0.590929 0.562427 +0.227530 0.590929 0.562427 +0.257434 0.590929 0.562427 +0.285092 0.590929 0.562427 +0.310738 0.590929 0.562427 +0.334585 0.590929 0.562427 +0.356818 0.590929 0.562427 +0.377602 0.590929 0.562427 +0.397079 0.590929 0.562427 +0.415373 0.590929 0.562427 +0.432594 0.590929 0.562427 +0.448839 0.590929 0.562427 +0.464192 0.590929 0.562427 +0.478729 0.590929 0.562427 +0.492515 0.590929 0.562427 +0.505612 0.590929 0.562427 +0.518072 0.590929 0.562427 +0.529943 0.590929 0.562427 +0.541266 0.590929 0.562427 +0.552083 0.590929 0.562427 +0.562427 0.590929 0.562427 +0.572331 0.590929 0.562427 +0.581823 0.590929 0.562427 +0.590929 0.590929 0.562427 +0.599674 0.590929 0.562427 +0.608079 0.590929 0.562427 +0.616166 0.590929 0.562427 +0.000001 0.599674 0.562427 +0.037293 0.599674 0.562427 +0.079714 0.599674 0.562427 +0.120832 0.599674 0.562427 +0.159284 0.599674 0.562427 +0.194868 0.599674 0.562427 +0.227530 0.599674 0.562427 +0.257434 0.599674 0.562427 +0.285092 0.599674 0.562427 +0.310738 0.599674 0.562427 +0.334585 0.599674 0.562427 +0.356818 0.599674 0.562427 +0.377602 0.599674 0.562427 +0.397079 0.599674 0.562427 +0.415373 0.599674 0.562427 +0.432594 0.599674 0.562427 +0.448839 0.599674 0.562427 +0.464192 0.599674 0.562427 +0.478729 0.599674 0.562427 +0.492515 0.599674 0.562427 +0.505612 0.599674 0.562427 +0.518072 0.599674 0.562427 +0.529943 0.599674 0.562427 +0.541266 0.599674 0.562427 +0.552083 0.599674 0.562427 +0.562427 0.599674 0.562427 +0.572331 0.599674 0.562427 +0.581823 0.599674 0.562427 +0.590929 0.599674 0.562427 +0.599674 0.599674 0.562427 +0.608079 0.599674 0.562427 +0.616166 0.599674 0.562427 +0.000001 0.608079 0.562427 +0.037293 0.608079 0.562427 +0.079714 0.608079 0.562427 +0.120832 0.608079 0.562427 +0.159284 0.608079 0.562427 +0.194868 0.608079 0.562427 +0.227530 0.608079 0.562427 +0.257434 0.608079 0.562427 +0.285092 0.608079 0.562427 +0.310738 0.608079 0.562427 +0.334585 0.608079 0.562427 +0.356818 0.608079 0.562427 +0.377602 0.608079 0.562427 +0.397079 0.608079 0.562427 +0.415373 0.608079 0.562427 +0.432594 0.608079 0.562427 +0.448839 0.608079 0.562427 +0.464192 0.608079 0.562427 +0.478729 0.608079 0.562427 +0.492515 0.608079 0.562427 +0.505612 0.608079 0.562427 +0.518072 0.608079 0.562427 +0.529943 0.608079 0.562427 +0.541266 0.608079 0.562427 +0.552083 0.608079 0.562427 +0.562427 0.608079 0.562427 +0.572331 0.608079 0.562427 +0.581823 0.608079 0.562427 +0.590929 0.608079 0.562427 +0.599674 0.608079 0.562427 +0.608079 0.608079 0.562427 +0.616166 0.608079 0.562427 +0.000001 0.616166 0.562427 +0.037293 0.616166 0.562427 +0.079714 0.616166 0.562427 +0.120832 0.616166 0.562427 +0.159284 0.616166 0.562427 +0.194868 0.616166 0.562427 +0.227530 0.616166 0.562427 +0.257434 0.616166 0.562427 +0.285092 0.616166 0.562427 +0.310738 0.616166 0.562427 +0.334585 0.616166 0.562427 +0.356818 0.616166 0.562427 +0.377602 0.616166 0.562427 +0.397079 0.616166 0.562427 +0.415373 0.616166 0.562427 +0.432594 0.616166 0.562427 +0.448839 0.616166 0.562427 +0.464192 0.616166 0.562427 +0.478729 0.616166 0.562427 +0.492515 0.616166 0.562427 +0.505612 0.616166 0.562427 +0.518072 0.616166 0.562427 +0.529943 0.616166 0.562427 +0.541266 0.616166 0.562427 +0.552083 0.616166 0.562427 +0.562427 0.616166 0.562427 +0.572331 0.616166 0.562427 +0.581823 0.616166 0.562427 +0.590929 0.616166 0.562427 +0.599674 0.616166 0.562427 +0.608079 0.616166 0.562427 +0.616166 0.616166 0.562427 +0.000001 0.000001 0.572331 +0.037293 0.000001 0.572331 +0.079714 0.000001 0.572331 +0.120832 0.000001 0.572331 +0.159284 0.000001 0.572331 +0.194868 0.000001 0.572331 +0.227530 0.000001 0.572331 +0.257434 0.000001 0.572331 +0.285092 0.000001 0.572331 +0.310738 0.000001 0.572331 +0.334585 0.000001 0.572331 +0.356818 0.000001 0.572331 +0.377602 0.000001 0.572331 +0.397079 0.000001 0.572331 +0.415373 0.000001 0.572331 +0.432594 0.000001 0.572331 +0.448839 0.000001 0.572331 +0.464192 0.000001 0.572331 +0.478729 0.000001 0.572331 +0.492515 0.000001 0.572331 +0.505612 0.000001 0.572331 +0.518072 0.000001 0.572331 +0.529943 0.000001 0.572331 +0.541266 0.000001 0.572331 +0.552083 0.000001 0.572331 +0.562427 0.000001 0.572331 +0.572331 0.000001 0.572331 +0.581823 0.000001 0.572331 +0.590929 0.000001 0.572331 +0.599674 0.000001 0.572331 +0.608079 0.000001 0.572331 +0.616166 0.000001 0.572331 +0.000001 0.037293 0.572331 +0.037293 0.037293 0.572331 +0.079714 0.037293 0.572331 +0.120832 0.037293 0.572331 +0.159284 0.037293 0.572331 +0.194868 0.037293 0.572331 +0.227530 0.037293 0.572331 +0.257434 0.037293 0.572331 +0.285092 0.037293 0.572331 +0.310738 0.037293 0.572331 +0.334585 0.037293 0.572331 +0.356818 0.037293 0.572331 +0.377602 0.037293 0.572331 +0.397079 0.037293 0.572331 +0.415373 0.037293 0.572331 +0.432594 0.037293 0.572331 +0.448839 0.037293 0.572331 +0.464192 0.037293 0.572331 +0.478729 0.037293 0.572331 +0.492515 0.037293 0.572331 +0.505612 0.037293 0.572331 +0.518072 0.037293 0.572331 +0.529943 0.037293 0.572331 +0.541266 0.037293 0.572331 +0.552083 0.037293 0.572331 +0.562427 0.037293 0.572331 +0.572331 0.037293 0.572331 +0.581823 0.037293 0.572331 +0.590929 0.037293 0.572331 +0.599674 0.037293 0.572331 +0.608079 0.037293 0.572331 +0.616166 0.037293 0.572331 +0.000001 0.079714 0.572331 +0.037293 0.079714 0.572331 +0.079714 0.079714 0.572331 +0.120832 0.079714 0.572331 +0.159284 0.079714 0.572331 +0.194868 0.079714 0.572331 +0.227530 0.079714 0.572331 +0.257434 0.079714 0.572331 +0.285092 0.079714 0.572331 +0.310738 0.079714 0.572331 +0.334585 0.079714 0.572331 +0.356818 0.079714 0.572331 +0.377602 0.079714 0.572331 +0.397079 0.079714 0.572331 +0.415373 0.079714 0.572331 +0.432594 0.079714 0.572331 +0.448839 0.079714 0.572331 +0.464192 0.079714 0.572331 +0.478729 0.079714 0.572331 +0.492515 0.079714 0.572331 +0.505612 0.079714 0.572331 +0.518072 0.079714 0.572331 +0.529943 0.079714 0.572331 +0.541266 0.079714 0.572331 +0.552083 0.079714 0.572331 +0.562427 0.079714 0.572331 +0.572331 0.079714 0.572331 +0.581823 0.079714 0.572331 +0.590929 0.079714 0.572331 +0.599674 0.079714 0.572331 +0.608079 0.079714 0.572331 +0.616166 0.079714 0.572331 +0.000001 0.120832 0.572331 +0.037293 0.120832 0.572331 +0.079714 0.120832 0.572331 +0.120832 0.120832 0.572331 +0.159284 0.120832 0.572331 +0.194868 0.120832 0.572331 +0.227530 0.120832 0.572331 +0.257434 0.120832 0.572331 +0.285092 0.120832 0.572331 +0.310738 0.120832 0.572331 +0.334585 0.120832 0.572331 +0.356818 0.120832 0.572331 +0.377602 0.120832 0.572331 +0.397079 0.120832 0.572331 +0.415373 0.120832 0.572331 +0.432594 0.120832 0.572331 +0.448839 0.120832 0.572331 +0.464192 0.120832 0.572331 +0.478729 0.120832 0.572331 +0.492515 0.120832 0.572331 +0.505612 0.120832 0.572331 +0.518072 0.120832 0.572331 +0.529943 0.120832 0.572331 +0.541266 0.120832 0.572331 +0.552083 0.120832 0.572331 +0.562427 0.120832 0.572331 +0.572331 0.120832 0.572331 +0.581823 0.120832 0.572331 +0.590929 0.120832 0.572331 +0.599674 0.120832 0.572331 +0.608079 0.120832 0.572331 +0.616166 0.120832 0.572331 +0.000001 0.159284 0.572331 +0.037293 0.159284 0.572331 +0.079714 0.159284 0.572331 +0.120832 0.159284 0.572331 +0.159284 0.159284 0.572331 +0.194868 0.159284 0.572331 +0.227530 0.159284 0.572331 +0.257434 0.159284 0.572331 +0.285092 0.159284 0.572331 +0.310738 0.159284 0.572331 +0.334585 0.159284 0.572331 +0.356818 0.159284 0.572331 +0.377602 0.159284 0.572331 +0.397079 0.159284 0.572331 +0.415373 0.159284 0.572331 +0.432594 0.159284 0.572331 +0.448839 0.159284 0.572331 +0.464192 0.159284 0.572331 +0.478729 0.159284 0.572331 +0.492515 0.159284 0.572331 +0.505612 0.159284 0.572331 +0.518072 0.159284 0.572331 +0.529943 0.159284 0.572331 +0.541266 0.159284 0.572331 +0.552083 0.159284 0.572331 +0.562427 0.159284 0.572331 +0.572331 0.159284 0.572331 +0.581823 0.159284 0.572331 +0.590929 0.159284 0.572331 +0.599674 0.159284 0.572331 +0.608079 0.159284 0.572331 +0.616166 0.159284 0.572331 +0.000001 0.194868 0.572331 +0.037293 0.194868 0.572331 +0.079714 0.194868 0.572331 +0.120832 0.194868 0.572331 +0.159284 0.194868 0.572331 +0.194868 0.194868 0.572331 +0.227530 0.194868 0.572331 +0.257434 0.194868 0.572331 +0.285092 0.194868 0.572331 +0.310738 0.194868 0.572331 +0.334585 0.194868 0.572331 +0.356818 0.194868 0.572331 +0.377602 0.194868 0.572331 +0.397079 0.194868 0.572331 +0.415373 0.194868 0.572331 +0.432594 0.194868 0.572331 +0.448839 0.194868 0.572331 +0.464192 0.194868 0.572331 +0.478729 0.194868 0.572331 +0.492515 0.194868 0.572331 +0.505612 0.194868 0.572331 +0.518072 0.194868 0.572331 +0.529943 0.194868 0.572331 +0.541266 0.194868 0.572331 +0.552083 0.194868 0.572331 +0.562427 0.194868 0.572331 +0.572331 0.194868 0.572331 +0.581823 0.194868 0.572331 +0.590929 0.194868 0.572331 +0.599674 0.194868 0.572331 +0.608079 0.194868 0.572331 +0.616166 0.194868 0.572331 +0.000001 0.227530 0.572331 +0.037293 0.227530 0.572331 +0.079714 0.227530 0.572331 +0.120832 0.227530 0.572331 +0.159284 0.227530 0.572331 +0.194868 0.227530 0.572331 +0.227530 0.227530 0.572331 +0.257434 0.227530 0.572331 +0.285092 0.227530 0.572331 +0.310738 0.227530 0.572331 +0.334585 0.227530 0.572331 +0.356818 0.227530 0.572331 +0.377602 0.227530 0.572331 +0.397079 0.227530 0.572331 +0.415373 0.227530 0.572331 +0.432594 0.227530 0.572331 +0.448839 0.227530 0.572331 +0.464192 0.227530 0.572331 +0.478729 0.227530 0.572331 +0.492515 0.227530 0.572331 +0.505612 0.227530 0.572331 +0.518072 0.227530 0.572331 +0.529943 0.227530 0.572331 +0.541266 0.227530 0.572331 +0.552083 0.227530 0.572331 +0.562427 0.227530 0.572331 +0.572331 0.227530 0.572331 +0.581823 0.227530 0.572331 +0.590929 0.227530 0.572331 +0.599674 0.227530 0.572331 +0.608079 0.227530 0.572331 +0.616166 0.227530 0.572331 +0.000001 0.257434 0.572331 +0.037293 0.257434 0.572331 +0.079714 0.257434 0.572331 +0.120832 0.257434 0.572331 +0.159284 0.257434 0.572331 +0.194868 0.257434 0.572331 +0.227530 0.257434 0.572331 +0.257434 0.257434 0.572331 +0.285092 0.257434 0.572331 +0.310738 0.257434 0.572331 +0.334585 0.257434 0.572331 +0.356818 0.257434 0.572331 +0.377602 0.257434 0.572331 +0.397079 0.257434 0.572331 +0.415373 0.257434 0.572331 +0.432594 0.257434 0.572331 +0.448839 0.257434 0.572331 +0.464192 0.257434 0.572331 +0.478729 0.257434 0.572331 +0.492515 0.257434 0.572331 +0.505612 0.257434 0.572331 +0.518072 0.257434 0.572331 +0.529943 0.257434 0.572331 +0.541266 0.257434 0.572331 +0.552083 0.257434 0.572331 +0.562427 0.257434 0.572331 +0.572331 0.257434 0.572331 +0.581823 0.257434 0.572331 +0.590929 0.257434 0.572331 +0.599674 0.257434 0.572331 +0.608079 0.257434 0.572331 +0.616166 0.257434 0.572331 +0.000001 0.285092 0.572331 +0.037293 0.285092 0.572331 +0.079714 0.285092 0.572331 +0.120832 0.285092 0.572331 +0.159284 0.285092 0.572331 +0.194868 0.285092 0.572331 +0.227530 0.285092 0.572331 +0.257434 0.285092 0.572331 +0.285092 0.285092 0.572331 +0.310738 0.285092 0.572331 +0.334585 0.285092 0.572331 +0.356818 0.285092 0.572331 +0.377602 0.285092 0.572331 +0.397079 0.285092 0.572331 +0.415373 0.285092 0.572331 +0.432594 0.285092 0.572331 +0.448839 0.285092 0.572331 +0.464192 0.285092 0.572331 +0.478729 0.285092 0.572331 +0.492515 0.285092 0.572331 +0.505612 0.285092 0.572331 +0.518072 0.285092 0.572331 +0.529943 0.285092 0.572331 +0.541266 0.285092 0.572331 +0.552083 0.285092 0.572331 +0.562427 0.285092 0.572331 +0.572331 0.285092 0.572331 +0.581823 0.285092 0.572331 +0.590929 0.285092 0.572331 +0.599674 0.285092 0.572331 +0.608079 0.285092 0.572331 +0.616166 0.285092 0.572331 +0.000001 0.310738 0.572331 +0.037293 0.310738 0.572331 +0.079714 0.310738 0.572331 +0.120832 0.310738 0.572331 +0.159284 0.310738 0.572331 +0.194868 0.310738 0.572331 +0.227530 0.310738 0.572331 +0.257434 0.310738 0.572331 +0.285092 0.310738 0.572331 +0.310738 0.310738 0.572331 +0.334585 0.310738 0.572331 +0.356818 0.310738 0.572331 +0.377602 0.310738 0.572331 +0.397079 0.310738 0.572331 +0.415373 0.310738 0.572331 +0.432594 0.310738 0.572331 +0.448839 0.310738 0.572331 +0.464192 0.310738 0.572331 +0.478729 0.310738 0.572331 +0.492515 0.310738 0.572331 +0.505612 0.310738 0.572331 +0.518072 0.310738 0.572331 +0.529943 0.310738 0.572331 +0.541266 0.310738 0.572331 +0.552083 0.310738 0.572331 +0.562427 0.310738 0.572331 +0.572331 0.310738 0.572331 +0.581823 0.310738 0.572331 +0.590929 0.310738 0.572331 +0.599674 0.310738 0.572331 +0.608079 0.310738 0.572331 +0.616166 0.310738 0.572331 +0.000001 0.334585 0.572331 +0.037293 0.334585 0.572331 +0.079714 0.334585 0.572331 +0.120832 0.334585 0.572331 +0.159284 0.334585 0.572331 +0.194868 0.334585 0.572331 +0.227530 0.334585 0.572331 +0.257434 0.334585 0.572331 +0.285092 0.334585 0.572331 +0.310738 0.334585 0.572331 +0.334585 0.334585 0.572331 +0.356818 0.334585 0.572331 +0.377602 0.334585 0.572331 +0.397079 0.334585 0.572331 +0.415373 0.334585 0.572331 +0.432594 0.334585 0.572331 +0.448839 0.334585 0.572331 +0.464192 0.334585 0.572331 +0.478729 0.334585 0.572331 +0.492515 0.334585 0.572331 +0.505612 0.334585 0.572331 +0.518072 0.334585 0.572331 +0.529943 0.334585 0.572331 +0.541266 0.334585 0.572331 +0.552083 0.334585 0.572331 +0.562427 0.334585 0.572331 +0.572331 0.334585 0.572331 +0.581823 0.334585 0.572331 +0.590929 0.334585 0.572331 +0.599674 0.334585 0.572331 +0.608079 0.334585 0.572331 +0.616166 0.334585 0.572331 +0.000001 0.356818 0.572331 +0.037293 0.356818 0.572331 +0.079714 0.356818 0.572331 +0.120832 0.356818 0.572331 +0.159284 0.356818 0.572331 +0.194868 0.356818 0.572331 +0.227530 0.356818 0.572331 +0.257434 0.356818 0.572331 +0.285092 0.356818 0.572331 +0.310738 0.356818 0.572331 +0.334585 0.356818 0.572331 +0.356818 0.356818 0.572331 +0.377602 0.356818 0.572331 +0.397079 0.356818 0.572331 +0.415373 0.356818 0.572331 +0.432594 0.356818 0.572331 +0.448839 0.356818 0.572331 +0.464192 0.356818 0.572331 +0.478729 0.356818 0.572331 +0.492515 0.356818 0.572331 +0.505612 0.356818 0.572331 +0.518072 0.356818 0.572331 +0.529943 0.356818 0.572331 +0.541266 0.356818 0.572331 +0.552083 0.356818 0.572331 +0.562427 0.356818 0.572331 +0.572331 0.356818 0.572331 +0.581823 0.356818 0.572331 +0.590929 0.356818 0.572331 +0.599674 0.356818 0.572331 +0.608079 0.356818 0.572331 +0.616166 0.356818 0.572331 +0.000001 0.377602 0.572331 +0.037293 0.377602 0.572331 +0.079714 0.377602 0.572331 +0.120832 0.377602 0.572331 +0.159284 0.377602 0.572331 +0.194868 0.377602 0.572331 +0.227530 0.377602 0.572331 +0.257434 0.377602 0.572331 +0.285092 0.377602 0.572331 +0.310738 0.377602 0.572331 +0.334585 0.377602 0.572331 +0.356818 0.377602 0.572331 +0.377602 0.377602 0.572331 +0.397079 0.377602 0.572331 +0.415373 0.377602 0.572331 +0.432594 0.377602 0.572331 +0.448839 0.377602 0.572331 +0.464192 0.377602 0.572331 +0.478729 0.377602 0.572331 +0.492515 0.377602 0.572331 +0.505612 0.377602 0.572331 +0.518072 0.377602 0.572331 +0.529943 0.377602 0.572331 +0.541266 0.377602 0.572331 +0.552083 0.377602 0.572331 +0.562427 0.377602 0.572331 +0.572331 0.377602 0.572331 +0.581823 0.377602 0.572331 +0.590929 0.377602 0.572331 +0.599674 0.377602 0.572331 +0.608079 0.377602 0.572331 +0.616166 0.377602 0.572331 +0.000001 0.397079 0.572331 +0.037293 0.397079 0.572331 +0.079714 0.397079 0.572331 +0.120832 0.397079 0.572331 +0.159284 0.397079 0.572331 +0.194868 0.397079 0.572331 +0.227530 0.397079 0.572331 +0.257434 0.397079 0.572331 +0.285092 0.397079 0.572331 +0.310738 0.397079 0.572331 +0.334585 0.397079 0.572331 +0.356818 0.397079 0.572331 +0.377602 0.397079 0.572331 +0.397079 0.397079 0.572331 +0.415373 0.397079 0.572331 +0.432594 0.397079 0.572331 +0.448839 0.397079 0.572331 +0.464192 0.397079 0.572331 +0.478729 0.397079 0.572331 +0.492515 0.397079 0.572331 +0.505612 0.397079 0.572331 +0.518072 0.397079 0.572331 +0.529943 0.397079 0.572331 +0.541266 0.397079 0.572331 +0.552083 0.397079 0.572331 +0.562427 0.397079 0.572331 +0.572331 0.397079 0.572331 +0.581823 0.397079 0.572331 +0.590929 0.397079 0.572331 +0.599674 0.397079 0.572331 +0.608079 0.397079 0.572331 +0.616166 0.397079 0.572331 +0.000001 0.415373 0.572331 +0.037293 0.415373 0.572331 +0.079714 0.415373 0.572331 +0.120832 0.415373 0.572331 +0.159284 0.415373 0.572331 +0.194868 0.415373 0.572331 +0.227530 0.415373 0.572331 +0.257434 0.415373 0.572331 +0.285092 0.415373 0.572331 +0.310738 0.415373 0.572331 +0.334585 0.415373 0.572331 +0.356818 0.415373 0.572331 +0.377602 0.415373 0.572331 +0.397079 0.415373 0.572331 +0.415373 0.415373 0.572331 +0.432594 0.415373 0.572331 +0.448839 0.415373 0.572331 +0.464192 0.415373 0.572331 +0.478729 0.415373 0.572331 +0.492515 0.415373 0.572331 +0.505612 0.415373 0.572331 +0.518072 0.415373 0.572331 +0.529943 0.415373 0.572331 +0.541266 0.415373 0.572331 +0.552083 0.415373 0.572331 +0.562427 0.415373 0.572331 +0.572331 0.415373 0.572331 +0.581823 0.415373 0.572331 +0.590929 0.415373 0.572331 +0.599674 0.415373 0.572331 +0.608079 0.415373 0.572331 +0.616166 0.415373 0.572331 +0.000001 0.432594 0.572331 +0.037293 0.432594 0.572331 +0.079714 0.432594 0.572331 +0.120832 0.432594 0.572331 +0.159284 0.432594 0.572331 +0.194868 0.432594 0.572331 +0.227530 0.432594 0.572331 +0.257434 0.432594 0.572331 +0.285092 0.432594 0.572331 +0.310738 0.432594 0.572331 +0.334585 0.432594 0.572331 +0.356818 0.432594 0.572331 +0.377602 0.432594 0.572331 +0.397079 0.432594 0.572331 +0.415373 0.432594 0.572331 +0.432594 0.432594 0.572331 +0.448839 0.432594 0.572331 +0.464192 0.432594 0.572331 +0.478729 0.432594 0.572331 +0.492515 0.432594 0.572331 +0.505612 0.432594 0.572331 +0.518072 0.432594 0.572331 +0.529943 0.432594 0.572331 +0.541266 0.432594 0.572331 +0.552083 0.432594 0.572331 +0.562427 0.432594 0.572331 +0.572331 0.432594 0.572331 +0.581823 0.432594 0.572331 +0.590929 0.432594 0.572331 +0.599674 0.432594 0.572331 +0.608079 0.432594 0.572331 +0.616166 0.432594 0.572331 +0.000001 0.448839 0.572331 +0.037293 0.448839 0.572331 +0.079714 0.448839 0.572331 +0.120832 0.448839 0.572331 +0.159284 0.448839 0.572331 +0.194868 0.448839 0.572331 +0.227530 0.448839 0.572331 +0.257434 0.448839 0.572331 +0.285092 0.448839 0.572331 +0.310738 0.448839 0.572331 +0.334585 0.448839 0.572331 +0.356818 0.448839 0.572331 +0.377602 0.448839 0.572331 +0.397079 0.448839 0.572331 +0.415373 0.448839 0.572331 +0.432594 0.448839 0.572331 +0.448839 0.448839 0.572331 +0.464192 0.448839 0.572331 +0.478729 0.448839 0.572331 +0.492515 0.448839 0.572331 +0.505612 0.448839 0.572331 +0.518072 0.448839 0.572331 +0.529943 0.448839 0.572331 +0.541266 0.448839 0.572331 +0.552083 0.448839 0.572331 +0.562427 0.448839 0.572331 +0.572331 0.448839 0.572331 +0.581823 0.448839 0.572331 +0.590929 0.448839 0.572331 +0.599674 0.448839 0.572331 +0.608079 0.448839 0.572331 +0.616166 0.448839 0.572331 +0.000001 0.464192 0.572331 +0.037293 0.464192 0.572331 +0.079714 0.464192 0.572331 +0.120832 0.464192 0.572331 +0.159284 0.464192 0.572331 +0.194868 0.464192 0.572331 +0.227530 0.464192 0.572331 +0.257434 0.464192 0.572331 +0.285092 0.464192 0.572331 +0.310738 0.464192 0.572331 +0.334585 0.464192 0.572331 +0.356818 0.464192 0.572331 +0.377602 0.464192 0.572331 +0.397079 0.464192 0.572331 +0.415373 0.464192 0.572331 +0.432594 0.464192 0.572331 +0.448839 0.464192 0.572331 +0.464192 0.464192 0.572331 +0.478729 0.464192 0.572331 +0.492515 0.464192 0.572331 +0.505612 0.464192 0.572331 +0.518072 0.464192 0.572331 +0.529943 0.464192 0.572331 +0.541266 0.464192 0.572331 +0.552083 0.464192 0.572331 +0.562427 0.464192 0.572331 +0.572331 0.464192 0.572331 +0.581823 0.464192 0.572331 +0.590929 0.464192 0.572331 +0.599674 0.464192 0.572331 +0.608079 0.464192 0.572331 +0.616166 0.464192 0.572331 +0.000001 0.478729 0.572331 +0.037293 0.478729 0.572331 +0.079714 0.478729 0.572331 +0.120832 0.478729 0.572331 +0.159284 0.478729 0.572331 +0.194868 0.478729 0.572331 +0.227530 0.478729 0.572331 +0.257434 0.478729 0.572331 +0.285092 0.478729 0.572331 +0.310738 0.478729 0.572331 +0.334585 0.478729 0.572331 +0.356818 0.478729 0.572331 +0.377602 0.478729 0.572331 +0.397079 0.478729 0.572331 +0.415373 0.478729 0.572331 +0.432594 0.478729 0.572331 +0.448839 0.478729 0.572331 +0.464192 0.478729 0.572331 +0.478729 0.478729 0.572331 +0.492515 0.478729 0.572331 +0.505612 0.478729 0.572331 +0.518072 0.478729 0.572331 +0.529943 0.478729 0.572331 +0.541266 0.478729 0.572331 +0.552083 0.478729 0.572331 +0.562427 0.478729 0.572331 +0.572331 0.478729 0.572331 +0.581823 0.478729 0.572331 +0.590929 0.478729 0.572331 +0.599674 0.478729 0.572331 +0.608079 0.478729 0.572331 +0.616166 0.478729 0.572331 +0.000001 0.492515 0.572331 +0.037293 0.492515 0.572331 +0.079714 0.492515 0.572331 +0.120832 0.492515 0.572331 +0.159284 0.492515 0.572331 +0.194868 0.492515 0.572331 +0.227530 0.492515 0.572331 +0.257434 0.492515 0.572331 +0.285092 0.492515 0.572331 +0.310738 0.492515 0.572331 +0.334585 0.492515 0.572331 +0.356818 0.492515 0.572331 +0.377602 0.492515 0.572331 +0.397079 0.492515 0.572331 +0.415373 0.492515 0.572331 +0.432594 0.492515 0.572331 +0.448839 0.492515 0.572331 +0.464192 0.492515 0.572331 +0.478729 0.492515 0.572331 +0.492515 0.492515 0.572331 +0.505612 0.492515 0.572331 +0.518072 0.492515 0.572331 +0.529943 0.492515 0.572331 +0.541266 0.492515 0.572331 +0.552083 0.492515 0.572331 +0.562427 0.492515 0.572331 +0.572331 0.492515 0.572331 +0.581823 0.492515 0.572331 +0.590929 0.492515 0.572331 +0.599674 0.492515 0.572331 +0.608079 0.492515 0.572331 +0.616166 0.492515 0.572331 +0.000001 0.505612 0.572331 +0.037293 0.505612 0.572331 +0.079714 0.505612 0.572331 +0.120832 0.505612 0.572331 +0.159284 0.505612 0.572331 +0.194868 0.505612 0.572331 +0.227530 0.505612 0.572331 +0.257434 0.505612 0.572331 +0.285092 0.505612 0.572331 +0.310738 0.505612 0.572331 +0.334585 0.505612 0.572331 +0.356818 0.505612 0.572331 +0.377602 0.505612 0.572331 +0.397079 0.505612 0.572331 +0.415373 0.505612 0.572331 +0.432594 0.505612 0.572331 +0.448839 0.505612 0.572331 +0.464192 0.505612 0.572331 +0.478729 0.505612 0.572331 +0.492515 0.505612 0.572331 +0.505612 0.505612 0.572331 +0.518072 0.505612 0.572331 +0.529943 0.505612 0.572331 +0.541266 0.505612 0.572331 +0.552083 0.505612 0.572331 +0.562427 0.505612 0.572331 +0.572331 0.505612 0.572331 +0.581823 0.505612 0.572331 +0.590929 0.505612 0.572331 +0.599674 0.505612 0.572331 +0.608079 0.505612 0.572331 +0.616166 0.505612 0.572331 +0.000001 0.518072 0.572331 +0.037293 0.518072 0.572331 +0.079714 0.518072 0.572331 +0.120832 0.518072 0.572331 +0.159284 0.518072 0.572331 +0.194868 0.518072 0.572331 +0.227530 0.518072 0.572331 +0.257434 0.518072 0.572331 +0.285092 0.518072 0.572331 +0.310738 0.518072 0.572331 +0.334585 0.518072 0.572331 +0.356818 0.518072 0.572331 +0.377602 0.518072 0.572331 +0.397079 0.518072 0.572331 +0.415373 0.518072 0.572331 +0.432594 0.518072 0.572331 +0.448839 0.518072 0.572331 +0.464192 0.518072 0.572331 +0.478729 0.518072 0.572331 +0.492515 0.518072 0.572331 +0.505612 0.518072 0.572331 +0.518072 0.518072 0.572331 +0.529943 0.518072 0.572331 +0.541266 0.518072 0.572331 +0.552083 0.518072 0.572331 +0.562427 0.518072 0.572331 +0.572331 0.518072 0.572331 +0.581823 0.518072 0.572331 +0.590929 0.518072 0.572331 +0.599674 0.518072 0.572331 +0.608079 0.518072 0.572331 +0.616166 0.518072 0.572331 +0.000001 0.529943 0.572331 +0.037293 0.529943 0.572331 +0.079714 0.529943 0.572331 +0.120832 0.529943 0.572331 +0.159284 0.529943 0.572331 +0.194868 0.529943 0.572331 +0.227530 0.529943 0.572331 +0.257434 0.529943 0.572331 +0.285092 0.529943 0.572331 +0.310738 0.529943 0.572331 +0.334585 0.529943 0.572331 +0.356818 0.529943 0.572331 +0.377602 0.529943 0.572331 +0.397079 0.529943 0.572331 +0.415373 0.529943 0.572331 +0.432594 0.529943 0.572331 +0.448839 0.529943 0.572331 +0.464192 0.529943 0.572331 +0.478729 0.529943 0.572331 +0.492515 0.529943 0.572331 +0.505612 0.529943 0.572331 +0.518072 0.529943 0.572331 +0.529943 0.529943 0.572331 +0.541266 0.529943 0.572331 +0.552083 0.529943 0.572331 +0.562427 0.529943 0.572331 +0.572331 0.529943 0.572331 +0.581823 0.529943 0.572331 +0.590929 0.529943 0.572331 +0.599674 0.529943 0.572331 +0.608079 0.529943 0.572331 +0.616166 0.529943 0.572331 +0.000001 0.541266 0.572331 +0.037293 0.541266 0.572331 +0.079714 0.541266 0.572331 +0.120832 0.541266 0.572331 +0.159284 0.541266 0.572331 +0.194868 0.541266 0.572331 +0.227530 0.541266 0.572331 +0.257434 0.541266 0.572331 +0.285092 0.541266 0.572331 +0.310738 0.541266 0.572331 +0.334585 0.541266 0.572331 +0.356818 0.541266 0.572331 +0.377602 0.541266 0.572331 +0.397079 0.541266 0.572331 +0.415373 0.541266 0.572331 +0.432594 0.541266 0.572331 +0.448839 0.541266 0.572331 +0.464192 0.541266 0.572331 +0.478729 0.541266 0.572331 +0.492515 0.541266 0.572331 +0.505612 0.541266 0.572331 +0.518072 0.541266 0.572331 +0.529943 0.541266 0.572331 +0.541266 0.541266 0.572331 +0.552083 0.541266 0.572331 +0.562427 0.541266 0.572331 +0.572331 0.541266 0.572331 +0.581823 0.541266 0.572331 +0.590929 0.541266 0.572331 +0.599674 0.541266 0.572331 +0.608079 0.541266 0.572331 +0.616166 0.541266 0.572331 +0.000001 0.552083 0.572331 +0.037293 0.552083 0.572331 +0.079714 0.552083 0.572331 +0.120832 0.552083 0.572331 +0.159284 0.552083 0.572331 +0.194868 0.552083 0.572331 +0.227530 0.552083 0.572331 +0.257434 0.552083 0.572331 +0.285092 0.552083 0.572331 +0.310738 0.552083 0.572331 +0.334585 0.552083 0.572331 +0.356818 0.552083 0.572331 +0.377602 0.552083 0.572331 +0.397079 0.552083 0.572331 +0.415373 0.552083 0.572331 +0.432594 0.552083 0.572331 +0.448839 0.552083 0.572331 +0.464192 0.552083 0.572331 +0.478729 0.552083 0.572331 +0.492515 0.552083 0.572331 +0.505612 0.552083 0.572331 +0.518072 0.552083 0.572331 +0.529943 0.552083 0.572331 +0.541266 0.552083 0.572331 +0.552083 0.552083 0.572331 +0.562427 0.552083 0.572331 +0.572331 0.552083 0.572331 +0.581823 0.552083 0.572331 +0.590929 0.552083 0.572331 +0.599674 0.552083 0.572331 +0.608079 0.552083 0.572331 +0.616166 0.552083 0.572331 +0.000001 0.562427 0.572331 +0.037293 0.562427 0.572331 +0.079714 0.562427 0.572331 +0.120832 0.562427 0.572331 +0.159284 0.562427 0.572331 +0.194868 0.562427 0.572331 +0.227530 0.562427 0.572331 +0.257434 0.562427 0.572331 +0.285092 0.562427 0.572331 +0.310738 0.562427 0.572331 +0.334585 0.562427 0.572331 +0.356818 0.562427 0.572331 +0.377602 0.562427 0.572331 +0.397079 0.562427 0.572331 +0.415373 0.562427 0.572331 +0.432594 0.562427 0.572331 +0.448839 0.562427 0.572331 +0.464192 0.562427 0.572331 +0.478729 0.562427 0.572331 +0.492515 0.562427 0.572331 +0.505612 0.562427 0.572331 +0.518072 0.562427 0.572331 +0.529943 0.562427 0.572331 +0.541266 0.562427 0.572331 +0.552083 0.562427 0.572331 +0.562427 0.562427 0.572331 +0.572331 0.562427 0.572331 +0.581823 0.562427 0.572331 +0.590929 0.562427 0.572331 +0.599674 0.562427 0.572331 +0.608079 0.562427 0.572331 +0.616166 0.562427 0.572331 +0.000001 0.572331 0.572331 +0.037293 0.572331 0.572331 +0.079714 0.572331 0.572331 +0.120832 0.572331 0.572331 +0.159284 0.572331 0.572331 +0.194868 0.572331 0.572331 +0.227530 0.572331 0.572331 +0.257434 0.572331 0.572331 +0.285092 0.572331 0.572331 +0.310738 0.572331 0.572331 +0.334585 0.572331 0.572331 +0.356818 0.572331 0.572331 +0.377602 0.572331 0.572331 +0.397079 0.572331 0.572331 +0.415373 0.572331 0.572331 +0.432594 0.572331 0.572331 +0.448839 0.572331 0.572331 +0.464192 0.572331 0.572331 +0.478729 0.572331 0.572331 +0.492515 0.572331 0.572331 +0.505612 0.572331 0.572331 +0.518072 0.572331 0.572331 +0.529943 0.572331 0.572331 +0.541266 0.572331 0.572331 +0.552083 0.572331 0.572331 +0.562427 0.572331 0.572331 +0.572331 0.572331 0.572331 +0.581823 0.572331 0.572331 +0.590929 0.572331 0.572331 +0.599674 0.572331 0.572331 +0.608079 0.572331 0.572331 +0.616166 0.572331 0.572331 +0.000001 0.581823 0.572331 +0.037293 0.581823 0.572331 +0.079714 0.581823 0.572331 +0.120832 0.581823 0.572331 +0.159284 0.581823 0.572331 +0.194868 0.581823 0.572331 +0.227530 0.581823 0.572331 +0.257434 0.581823 0.572331 +0.285092 0.581823 0.572331 +0.310738 0.581823 0.572331 +0.334585 0.581823 0.572331 +0.356818 0.581823 0.572331 +0.377602 0.581823 0.572331 +0.397079 0.581823 0.572331 +0.415373 0.581823 0.572331 +0.432594 0.581823 0.572331 +0.448839 0.581823 0.572331 +0.464192 0.581823 0.572331 +0.478729 0.581823 0.572331 +0.492515 0.581823 0.572331 +0.505612 0.581823 0.572331 +0.518072 0.581823 0.572331 +0.529943 0.581823 0.572331 +0.541266 0.581823 0.572331 +0.552083 0.581823 0.572331 +0.562427 0.581823 0.572331 +0.572331 0.581823 0.572331 +0.581823 0.581823 0.572331 +0.590929 0.581823 0.572331 +0.599674 0.581823 0.572331 +0.608079 0.581823 0.572331 +0.616166 0.581823 0.572331 +0.000001 0.590929 0.572331 +0.037293 0.590929 0.572331 +0.079714 0.590929 0.572331 +0.120832 0.590929 0.572331 +0.159284 0.590929 0.572331 +0.194868 0.590929 0.572331 +0.227530 0.590929 0.572331 +0.257434 0.590929 0.572331 +0.285092 0.590929 0.572331 +0.310738 0.590929 0.572331 +0.334585 0.590929 0.572331 +0.356818 0.590929 0.572331 +0.377602 0.590929 0.572331 +0.397079 0.590929 0.572331 +0.415373 0.590929 0.572331 +0.432594 0.590929 0.572331 +0.448839 0.590929 0.572331 +0.464192 0.590929 0.572331 +0.478729 0.590929 0.572331 +0.492515 0.590929 0.572331 +0.505612 0.590929 0.572331 +0.518072 0.590929 0.572331 +0.529943 0.590929 0.572331 +0.541266 0.590929 0.572331 +0.552083 0.590929 0.572331 +0.562427 0.590929 0.572331 +0.572331 0.590929 0.572331 +0.581823 0.590929 0.572331 +0.590929 0.590929 0.572331 +0.599674 0.590929 0.572331 +0.608079 0.590929 0.572331 +0.616166 0.590929 0.572331 +0.000001 0.599674 0.572331 +0.037293 0.599674 0.572331 +0.079714 0.599674 0.572331 +0.120832 0.599674 0.572331 +0.159284 0.599674 0.572331 +0.194868 0.599674 0.572331 +0.227530 0.599674 0.572331 +0.257434 0.599674 0.572331 +0.285092 0.599674 0.572331 +0.310738 0.599674 0.572331 +0.334585 0.599674 0.572331 +0.356818 0.599674 0.572331 +0.377602 0.599674 0.572331 +0.397079 0.599674 0.572331 +0.415373 0.599674 0.572331 +0.432594 0.599674 0.572331 +0.448839 0.599674 0.572331 +0.464192 0.599674 0.572331 +0.478729 0.599674 0.572331 +0.492515 0.599674 0.572331 +0.505612 0.599674 0.572331 +0.518072 0.599674 0.572331 +0.529943 0.599674 0.572331 +0.541266 0.599674 0.572331 +0.552083 0.599674 0.572331 +0.562427 0.599674 0.572331 +0.572331 0.599674 0.572331 +0.581823 0.599674 0.572331 +0.590929 0.599674 0.572331 +0.599674 0.599674 0.572331 +0.608079 0.599674 0.572331 +0.616166 0.599674 0.572331 +0.000001 0.608079 0.572331 +0.037293 0.608079 0.572331 +0.079714 0.608079 0.572331 +0.120832 0.608079 0.572331 +0.159284 0.608079 0.572331 +0.194868 0.608079 0.572331 +0.227530 0.608079 0.572331 +0.257434 0.608079 0.572331 +0.285092 0.608079 0.572331 +0.310738 0.608079 0.572331 +0.334585 0.608079 0.572331 +0.356818 0.608079 0.572331 +0.377602 0.608079 0.572331 +0.397079 0.608079 0.572331 +0.415373 0.608079 0.572331 +0.432594 0.608079 0.572331 +0.448839 0.608079 0.572331 +0.464192 0.608079 0.572331 +0.478729 0.608079 0.572331 +0.492515 0.608079 0.572331 +0.505612 0.608079 0.572331 +0.518072 0.608079 0.572331 +0.529943 0.608079 0.572331 +0.541266 0.608079 0.572331 +0.552083 0.608079 0.572331 +0.562427 0.608079 0.572331 +0.572331 0.608079 0.572331 +0.581823 0.608079 0.572331 +0.590929 0.608079 0.572331 +0.599674 0.608079 0.572331 +0.608079 0.608079 0.572331 +0.616166 0.608079 0.572331 +0.000001 0.616166 0.572331 +0.037293 0.616166 0.572331 +0.079714 0.616166 0.572331 +0.120832 0.616166 0.572331 +0.159284 0.616166 0.572331 +0.194868 0.616166 0.572331 +0.227530 0.616166 0.572331 +0.257434 0.616166 0.572331 +0.285092 0.616166 0.572331 +0.310738 0.616166 0.572331 +0.334585 0.616166 0.572331 +0.356818 0.616166 0.572331 +0.377602 0.616166 0.572331 +0.397079 0.616166 0.572331 +0.415373 0.616166 0.572331 +0.432594 0.616166 0.572331 +0.448839 0.616166 0.572331 +0.464192 0.616166 0.572331 +0.478729 0.616166 0.572331 +0.492515 0.616166 0.572331 +0.505612 0.616166 0.572331 +0.518072 0.616166 0.572331 +0.529943 0.616166 0.572331 +0.541266 0.616166 0.572331 +0.552083 0.616166 0.572331 +0.562427 0.616166 0.572331 +0.572331 0.616166 0.572331 +0.581823 0.616166 0.572331 +0.590929 0.616166 0.572331 +0.599674 0.616166 0.572331 +0.608079 0.616166 0.572331 +0.616166 0.616166 0.572331 +0.000001 0.000001 0.581823 +0.037293 0.000001 0.581823 +0.079714 0.000001 0.581823 +0.120832 0.000001 0.581823 +0.159284 0.000001 0.581823 +0.194868 0.000001 0.581823 +0.227530 0.000001 0.581823 +0.257434 0.000001 0.581823 +0.285092 0.000001 0.581823 +0.310738 0.000001 0.581823 +0.334585 0.000001 0.581823 +0.356818 0.000001 0.581823 +0.377602 0.000001 0.581823 +0.397079 0.000001 0.581823 +0.415373 0.000001 0.581823 +0.432594 0.000001 0.581823 +0.448839 0.000001 0.581823 +0.464192 0.000001 0.581823 +0.478729 0.000001 0.581823 +0.492515 0.000001 0.581823 +0.505612 0.000001 0.581823 +0.518072 0.000001 0.581823 +0.529943 0.000001 0.581823 +0.541266 0.000001 0.581823 +0.552083 0.000001 0.581823 +0.562427 0.000001 0.581823 +0.572331 0.000001 0.581823 +0.581823 0.000001 0.581823 +0.590929 0.000001 0.581823 +0.599674 0.000001 0.581823 +0.608079 0.000001 0.581823 +0.616166 0.000001 0.581823 +0.000001 0.037293 0.581823 +0.037293 0.037293 0.581823 +0.079714 0.037293 0.581823 +0.120832 0.037293 0.581823 +0.159284 0.037293 0.581823 +0.194868 0.037293 0.581823 +0.227530 0.037293 0.581823 +0.257434 0.037293 0.581823 +0.285092 0.037293 0.581823 +0.310738 0.037293 0.581823 +0.334585 0.037293 0.581823 +0.356818 0.037293 0.581823 +0.377602 0.037293 0.581823 +0.397079 0.037293 0.581823 +0.415373 0.037293 0.581823 +0.432594 0.037293 0.581823 +0.448839 0.037293 0.581823 +0.464192 0.037293 0.581823 +0.478729 0.037293 0.581823 +0.492515 0.037293 0.581823 +0.505612 0.037293 0.581823 +0.518072 0.037293 0.581823 +0.529943 0.037293 0.581823 +0.541266 0.037293 0.581823 +0.552083 0.037293 0.581823 +0.562427 0.037293 0.581823 +0.572331 0.037293 0.581823 +0.581823 0.037293 0.581823 +0.590929 0.037293 0.581823 +0.599674 0.037293 0.581823 +0.608079 0.037293 0.581823 +0.616166 0.037293 0.581823 +0.000001 0.079714 0.581823 +0.037293 0.079714 0.581823 +0.079714 0.079714 0.581823 +0.120832 0.079714 0.581823 +0.159284 0.079714 0.581823 +0.194868 0.079714 0.581823 +0.227530 0.079714 0.581823 +0.257434 0.079714 0.581823 +0.285092 0.079714 0.581823 +0.310738 0.079714 0.581823 +0.334585 0.079714 0.581823 +0.356818 0.079714 0.581823 +0.377602 0.079714 0.581823 +0.397079 0.079714 0.581823 +0.415373 0.079714 0.581823 +0.432594 0.079714 0.581823 +0.448839 0.079714 0.581823 +0.464192 0.079714 0.581823 +0.478729 0.079714 0.581823 +0.492515 0.079714 0.581823 +0.505612 0.079714 0.581823 +0.518072 0.079714 0.581823 +0.529943 0.079714 0.581823 +0.541266 0.079714 0.581823 +0.552083 0.079714 0.581823 +0.562427 0.079714 0.581823 +0.572331 0.079714 0.581823 +0.581823 0.079714 0.581823 +0.590929 0.079714 0.581823 +0.599674 0.079714 0.581823 +0.608079 0.079714 0.581823 +0.616166 0.079714 0.581823 +0.000001 0.120832 0.581823 +0.037293 0.120832 0.581823 +0.079714 0.120832 0.581823 +0.120832 0.120832 0.581823 +0.159284 0.120832 0.581823 +0.194868 0.120832 0.581823 +0.227530 0.120832 0.581823 +0.257434 0.120832 0.581823 +0.285092 0.120832 0.581823 +0.310738 0.120832 0.581823 +0.334585 0.120832 0.581823 +0.356818 0.120832 0.581823 +0.377602 0.120832 0.581823 +0.397079 0.120832 0.581823 +0.415373 0.120832 0.581823 +0.432594 0.120832 0.581823 +0.448839 0.120832 0.581823 +0.464192 0.120832 0.581823 +0.478729 0.120832 0.581823 +0.492515 0.120832 0.581823 +0.505612 0.120832 0.581823 +0.518072 0.120832 0.581823 +0.529943 0.120832 0.581823 +0.541266 0.120832 0.581823 +0.552083 0.120832 0.581823 +0.562427 0.120832 0.581823 +0.572331 0.120832 0.581823 +0.581823 0.120832 0.581823 +0.590929 0.120832 0.581823 +0.599674 0.120832 0.581823 +0.608079 0.120832 0.581823 +0.616166 0.120832 0.581823 +0.000001 0.159284 0.581823 +0.037293 0.159284 0.581823 +0.079714 0.159284 0.581823 +0.120832 0.159284 0.581823 +0.159284 0.159284 0.581823 +0.194868 0.159284 0.581823 +0.227530 0.159284 0.581823 +0.257434 0.159284 0.581823 +0.285092 0.159284 0.581823 +0.310738 0.159284 0.581823 +0.334585 0.159284 0.581823 +0.356818 0.159284 0.581823 +0.377602 0.159284 0.581823 +0.397079 0.159284 0.581823 +0.415373 0.159284 0.581823 +0.432594 0.159284 0.581823 +0.448839 0.159284 0.581823 +0.464192 0.159284 0.581823 +0.478729 0.159284 0.581823 +0.492515 0.159284 0.581823 +0.505612 0.159284 0.581823 +0.518072 0.159284 0.581823 +0.529943 0.159284 0.581823 +0.541266 0.159284 0.581823 +0.552083 0.159284 0.581823 +0.562427 0.159284 0.581823 +0.572331 0.159284 0.581823 +0.581823 0.159284 0.581823 +0.590929 0.159284 0.581823 +0.599674 0.159284 0.581823 +0.608079 0.159284 0.581823 +0.616166 0.159284 0.581823 +0.000001 0.194868 0.581823 +0.037293 0.194868 0.581823 +0.079714 0.194868 0.581823 +0.120832 0.194868 0.581823 +0.159284 0.194868 0.581823 +0.194868 0.194868 0.581823 +0.227530 0.194868 0.581823 +0.257434 0.194868 0.581823 +0.285092 0.194868 0.581823 +0.310738 0.194868 0.581823 +0.334585 0.194868 0.581823 +0.356818 0.194868 0.581823 +0.377602 0.194868 0.581823 +0.397079 0.194868 0.581823 +0.415373 0.194868 0.581823 +0.432594 0.194868 0.581823 +0.448839 0.194868 0.581823 +0.464192 0.194868 0.581823 +0.478729 0.194868 0.581823 +0.492515 0.194868 0.581823 +0.505612 0.194868 0.581823 +0.518072 0.194868 0.581823 +0.529943 0.194868 0.581823 +0.541266 0.194868 0.581823 +0.552083 0.194868 0.581823 +0.562427 0.194868 0.581823 +0.572331 0.194868 0.581823 +0.581823 0.194868 0.581823 +0.590929 0.194868 0.581823 +0.599674 0.194868 0.581823 +0.608079 0.194868 0.581823 +0.616166 0.194868 0.581823 +0.000001 0.227530 0.581823 +0.037293 0.227530 0.581823 +0.079714 0.227530 0.581823 +0.120832 0.227530 0.581823 +0.159284 0.227530 0.581823 +0.194868 0.227530 0.581823 +0.227530 0.227530 0.581823 +0.257434 0.227530 0.581823 +0.285092 0.227530 0.581823 +0.310738 0.227530 0.581823 +0.334585 0.227530 0.581823 +0.356818 0.227530 0.581823 +0.377602 0.227530 0.581823 +0.397079 0.227530 0.581823 +0.415373 0.227530 0.581823 +0.432594 0.227530 0.581823 +0.448839 0.227530 0.581823 +0.464192 0.227530 0.581823 +0.478729 0.227530 0.581823 +0.492515 0.227530 0.581823 +0.505612 0.227530 0.581823 +0.518072 0.227530 0.581823 +0.529943 0.227530 0.581823 +0.541266 0.227530 0.581823 +0.552083 0.227530 0.581823 +0.562427 0.227530 0.581823 +0.572331 0.227530 0.581823 +0.581823 0.227530 0.581823 +0.590929 0.227530 0.581823 +0.599674 0.227530 0.581823 +0.608079 0.227530 0.581823 +0.616166 0.227530 0.581823 +0.000001 0.257434 0.581823 +0.037293 0.257434 0.581823 +0.079714 0.257434 0.581823 +0.120832 0.257434 0.581823 +0.159284 0.257434 0.581823 +0.194868 0.257434 0.581823 +0.227530 0.257434 0.581823 +0.257434 0.257434 0.581823 +0.285092 0.257434 0.581823 +0.310738 0.257434 0.581823 +0.334585 0.257434 0.581823 +0.356818 0.257434 0.581823 +0.377602 0.257434 0.581823 +0.397079 0.257434 0.581823 +0.415373 0.257434 0.581823 +0.432594 0.257434 0.581823 +0.448839 0.257434 0.581823 +0.464192 0.257434 0.581823 +0.478729 0.257434 0.581823 +0.492515 0.257434 0.581823 +0.505612 0.257434 0.581823 +0.518072 0.257434 0.581823 +0.529943 0.257434 0.581823 +0.541266 0.257434 0.581823 +0.552083 0.257434 0.581823 +0.562427 0.257434 0.581823 +0.572331 0.257434 0.581823 +0.581823 0.257434 0.581823 +0.590929 0.257434 0.581823 +0.599674 0.257434 0.581823 +0.608079 0.257434 0.581823 +0.616166 0.257434 0.581823 +0.000001 0.285092 0.581823 +0.037293 0.285092 0.581823 +0.079714 0.285092 0.581823 +0.120832 0.285092 0.581823 +0.159284 0.285092 0.581823 +0.194868 0.285092 0.581823 +0.227530 0.285092 0.581823 +0.257434 0.285092 0.581823 +0.285092 0.285092 0.581823 +0.310738 0.285092 0.581823 +0.334585 0.285092 0.581823 +0.356818 0.285092 0.581823 +0.377602 0.285092 0.581823 +0.397079 0.285092 0.581823 +0.415373 0.285092 0.581823 +0.432594 0.285092 0.581823 +0.448839 0.285092 0.581823 +0.464192 0.285092 0.581823 +0.478729 0.285092 0.581823 +0.492515 0.285092 0.581823 +0.505612 0.285092 0.581823 +0.518072 0.285092 0.581823 +0.529943 0.285092 0.581823 +0.541266 0.285092 0.581823 +0.552083 0.285092 0.581823 +0.562427 0.285092 0.581823 +0.572331 0.285092 0.581823 +0.581823 0.285092 0.581823 +0.590929 0.285092 0.581823 +0.599674 0.285092 0.581823 +0.608079 0.285092 0.581823 +0.616166 0.285092 0.581823 +0.000001 0.310738 0.581823 +0.037293 0.310738 0.581823 +0.079714 0.310738 0.581823 +0.120832 0.310738 0.581823 +0.159284 0.310738 0.581823 +0.194868 0.310738 0.581823 +0.227530 0.310738 0.581823 +0.257434 0.310738 0.581823 +0.285092 0.310738 0.581823 +0.310738 0.310738 0.581823 +0.334585 0.310738 0.581823 +0.356818 0.310738 0.581823 +0.377602 0.310738 0.581823 +0.397079 0.310738 0.581823 +0.415373 0.310738 0.581823 +0.432594 0.310738 0.581823 +0.448839 0.310738 0.581823 +0.464192 0.310738 0.581823 +0.478729 0.310738 0.581823 +0.492515 0.310738 0.581823 +0.505612 0.310738 0.581823 +0.518072 0.310738 0.581823 +0.529943 0.310738 0.581823 +0.541266 0.310738 0.581823 +0.552083 0.310738 0.581823 +0.562427 0.310738 0.581823 +0.572331 0.310738 0.581823 +0.581823 0.310738 0.581823 +0.590929 0.310738 0.581823 +0.599674 0.310738 0.581823 +0.608079 0.310738 0.581823 +0.616166 0.310738 0.581823 +0.000001 0.334585 0.581823 +0.037293 0.334585 0.581823 +0.079714 0.334585 0.581823 +0.120832 0.334585 0.581823 +0.159284 0.334585 0.581823 +0.194868 0.334585 0.581823 +0.227530 0.334585 0.581823 +0.257434 0.334585 0.581823 +0.285092 0.334585 0.581823 +0.310738 0.334585 0.581823 +0.334585 0.334585 0.581823 +0.356818 0.334585 0.581823 +0.377602 0.334585 0.581823 +0.397079 0.334585 0.581823 +0.415373 0.334585 0.581823 +0.432594 0.334585 0.581823 +0.448839 0.334585 0.581823 +0.464192 0.334585 0.581823 +0.478729 0.334585 0.581823 +0.492515 0.334585 0.581823 +0.505612 0.334585 0.581823 +0.518072 0.334585 0.581823 +0.529943 0.334585 0.581823 +0.541266 0.334585 0.581823 +0.552083 0.334585 0.581823 +0.562427 0.334585 0.581823 +0.572331 0.334585 0.581823 +0.581823 0.334585 0.581823 +0.590929 0.334585 0.581823 +0.599674 0.334585 0.581823 +0.608079 0.334585 0.581823 +0.616166 0.334585 0.581823 +0.000001 0.356818 0.581823 +0.037293 0.356818 0.581823 +0.079714 0.356818 0.581823 +0.120832 0.356818 0.581823 +0.159284 0.356818 0.581823 +0.194868 0.356818 0.581823 +0.227530 0.356818 0.581823 +0.257434 0.356818 0.581823 +0.285092 0.356818 0.581823 +0.310738 0.356818 0.581823 +0.334585 0.356818 0.581823 +0.356818 0.356818 0.581823 +0.377602 0.356818 0.581823 +0.397079 0.356818 0.581823 +0.415373 0.356818 0.581823 +0.432594 0.356818 0.581823 +0.448839 0.356818 0.581823 +0.464192 0.356818 0.581823 +0.478729 0.356818 0.581823 +0.492515 0.356818 0.581823 +0.505612 0.356818 0.581823 +0.518072 0.356818 0.581823 +0.529943 0.356818 0.581823 +0.541266 0.356818 0.581823 +0.552083 0.356818 0.581823 +0.562427 0.356818 0.581823 +0.572331 0.356818 0.581823 +0.581823 0.356818 0.581823 +0.590929 0.356818 0.581823 +0.599674 0.356818 0.581823 +0.608079 0.356818 0.581823 +0.616166 0.356818 0.581823 +0.000001 0.377602 0.581823 +0.037293 0.377602 0.581823 +0.079714 0.377602 0.581823 +0.120832 0.377602 0.581823 +0.159284 0.377602 0.581823 +0.194868 0.377602 0.581823 +0.227530 0.377602 0.581823 +0.257434 0.377602 0.581823 +0.285092 0.377602 0.581823 +0.310738 0.377602 0.581823 +0.334585 0.377602 0.581823 +0.356818 0.377602 0.581823 +0.377602 0.377602 0.581823 +0.397079 0.377602 0.581823 +0.415373 0.377602 0.581823 +0.432594 0.377602 0.581823 +0.448839 0.377602 0.581823 +0.464192 0.377602 0.581823 +0.478729 0.377602 0.581823 +0.492515 0.377602 0.581823 +0.505612 0.377602 0.581823 +0.518072 0.377602 0.581823 +0.529943 0.377602 0.581823 +0.541266 0.377602 0.581823 +0.552083 0.377602 0.581823 +0.562427 0.377602 0.581823 +0.572331 0.377602 0.581823 +0.581823 0.377602 0.581823 +0.590929 0.377602 0.581823 +0.599674 0.377602 0.581823 +0.608079 0.377602 0.581823 +0.616166 0.377602 0.581823 +0.000001 0.397079 0.581823 +0.037293 0.397079 0.581823 +0.079714 0.397079 0.581823 +0.120832 0.397079 0.581823 +0.159284 0.397079 0.581823 +0.194868 0.397079 0.581823 +0.227530 0.397079 0.581823 +0.257434 0.397079 0.581823 +0.285092 0.397079 0.581823 +0.310738 0.397079 0.581823 +0.334585 0.397079 0.581823 +0.356818 0.397079 0.581823 +0.377602 0.397079 0.581823 +0.397079 0.397079 0.581823 +0.415373 0.397079 0.581823 +0.432594 0.397079 0.581823 +0.448839 0.397079 0.581823 +0.464192 0.397079 0.581823 +0.478729 0.397079 0.581823 +0.492515 0.397079 0.581823 +0.505612 0.397079 0.581823 +0.518072 0.397079 0.581823 +0.529943 0.397079 0.581823 +0.541266 0.397079 0.581823 +0.552083 0.397079 0.581823 +0.562427 0.397079 0.581823 +0.572331 0.397079 0.581823 +0.581823 0.397079 0.581823 +0.590929 0.397079 0.581823 +0.599674 0.397079 0.581823 +0.608079 0.397079 0.581823 +0.616166 0.397079 0.581823 +0.000001 0.415373 0.581823 +0.037293 0.415373 0.581823 +0.079714 0.415373 0.581823 +0.120832 0.415373 0.581823 +0.159284 0.415373 0.581823 +0.194868 0.415373 0.581823 +0.227530 0.415373 0.581823 +0.257434 0.415373 0.581823 +0.285092 0.415373 0.581823 +0.310738 0.415373 0.581823 +0.334585 0.415373 0.581823 +0.356818 0.415373 0.581823 +0.377602 0.415373 0.581823 +0.397079 0.415373 0.581823 +0.415373 0.415373 0.581823 +0.432594 0.415373 0.581823 +0.448839 0.415373 0.581823 +0.464192 0.415373 0.581823 +0.478729 0.415373 0.581823 +0.492515 0.415373 0.581823 +0.505612 0.415373 0.581823 +0.518072 0.415373 0.581823 +0.529943 0.415373 0.581823 +0.541266 0.415373 0.581823 +0.552083 0.415373 0.581823 +0.562427 0.415373 0.581823 +0.572331 0.415373 0.581823 +0.581823 0.415373 0.581823 +0.590929 0.415373 0.581823 +0.599674 0.415373 0.581823 +0.608079 0.415373 0.581823 +0.616166 0.415373 0.581823 +0.000001 0.432594 0.581823 +0.037293 0.432594 0.581823 +0.079714 0.432594 0.581823 +0.120832 0.432594 0.581823 +0.159284 0.432594 0.581823 +0.194868 0.432594 0.581823 +0.227530 0.432594 0.581823 +0.257434 0.432594 0.581823 +0.285092 0.432594 0.581823 +0.310738 0.432594 0.581823 +0.334585 0.432594 0.581823 +0.356818 0.432594 0.581823 +0.377602 0.432594 0.581823 +0.397079 0.432594 0.581823 +0.415373 0.432594 0.581823 +0.432594 0.432594 0.581823 +0.448839 0.432594 0.581823 +0.464192 0.432594 0.581823 +0.478729 0.432594 0.581823 +0.492515 0.432594 0.581823 +0.505612 0.432594 0.581823 +0.518072 0.432594 0.581823 +0.529943 0.432594 0.581823 +0.541266 0.432594 0.581823 +0.552083 0.432594 0.581823 +0.562427 0.432594 0.581823 +0.572331 0.432594 0.581823 +0.581823 0.432594 0.581823 +0.590929 0.432594 0.581823 +0.599674 0.432594 0.581823 +0.608079 0.432594 0.581823 +0.616166 0.432594 0.581823 +0.000001 0.448839 0.581823 +0.037293 0.448839 0.581823 +0.079714 0.448839 0.581823 +0.120832 0.448839 0.581823 +0.159284 0.448839 0.581823 +0.194868 0.448839 0.581823 +0.227530 0.448839 0.581823 +0.257434 0.448839 0.581823 +0.285092 0.448839 0.581823 +0.310738 0.448839 0.581823 +0.334585 0.448839 0.581823 +0.356818 0.448839 0.581823 +0.377602 0.448839 0.581823 +0.397079 0.448839 0.581823 +0.415373 0.448839 0.581823 +0.432594 0.448839 0.581823 +0.448839 0.448839 0.581823 +0.464192 0.448839 0.581823 +0.478729 0.448839 0.581823 +0.492515 0.448839 0.581823 +0.505612 0.448839 0.581823 +0.518072 0.448839 0.581823 +0.529943 0.448839 0.581823 +0.541266 0.448839 0.581823 +0.552083 0.448839 0.581823 +0.562427 0.448839 0.581823 +0.572331 0.448839 0.581823 +0.581823 0.448839 0.581823 +0.590929 0.448839 0.581823 +0.599674 0.448839 0.581823 +0.608079 0.448839 0.581823 +0.616166 0.448839 0.581823 +0.000001 0.464192 0.581823 +0.037293 0.464192 0.581823 +0.079714 0.464192 0.581823 +0.120832 0.464192 0.581823 +0.159284 0.464192 0.581823 +0.194868 0.464192 0.581823 +0.227530 0.464192 0.581823 +0.257434 0.464192 0.581823 +0.285092 0.464192 0.581823 +0.310738 0.464192 0.581823 +0.334585 0.464192 0.581823 +0.356818 0.464192 0.581823 +0.377602 0.464192 0.581823 +0.397079 0.464192 0.581823 +0.415373 0.464192 0.581823 +0.432594 0.464192 0.581823 +0.448839 0.464192 0.581823 +0.464192 0.464192 0.581823 +0.478729 0.464192 0.581823 +0.492515 0.464192 0.581823 +0.505612 0.464192 0.581823 +0.518072 0.464192 0.581823 +0.529943 0.464192 0.581823 +0.541266 0.464192 0.581823 +0.552083 0.464192 0.581823 +0.562427 0.464192 0.581823 +0.572331 0.464192 0.581823 +0.581823 0.464192 0.581823 +0.590929 0.464192 0.581823 +0.599674 0.464192 0.581823 +0.608079 0.464192 0.581823 +0.616166 0.464192 0.581823 +0.000001 0.478729 0.581823 +0.037293 0.478729 0.581823 +0.079714 0.478729 0.581823 +0.120832 0.478729 0.581823 +0.159284 0.478729 0.581823 +0.194868 0.478729 0.581823 +0.227530 0.478729 0.581823 +0.257434 0.478729 0.581823 +0.285092 0.478729 0.581823 +0.310738 0.478729 0.581823 +0.334585 0.478729 0.581823 +0.356818 0.478729 0.581823 +0.377602 0.478729 0.581823 +0.397079 0.478729 0.581823 +0.415373 0.478729 0.581823 +0.432594 0.478729 0.581823 +0.448839 0.478729 0.581823 +0.464192 0.478729 0.581823 +0.478729 0.478729 0.581823 +0.492515 0.478729 0.581823 +0.505612 0.478729 0.581823 +0.518072 0.478729 0.581823 +0.529943 0.478729 0.581823 +0.541266 0.478729 0.581823 +0.552083 0.478729 0.581823 +0.562427 0.478729 0.581823 +0.572331 0.478729 0.581823 +0.581823 0.478729 0.581823 +0.590929 0.478729 0.581823 +0.599674 0.478729 0.581823 +0.608079 0.478729 0.581823 +0.616166 0.478729 0.581823 +0.000001 0.492515 0.581823 +0.037293 0.492515 0.581823 +0.079714 0.492515 0.581823 +0.120832 0.492515 0.581823 +0.159284 0.492515 0.581823 +0.194868 0.492515 0.581823 +0.227530 0.492515 0.581823 +0.257434 0.492515 0.581823 +0.285092 0.492515 0.581823 +0.310738 0.492515 0.581823 +0.334585 0.492515 0.581823 +0.356818 0.492515 0.581823 +0.377602 0.492515 0.581823 +0.397079 0.492515 0.581823 +0.415373 0.492515 0.581823 +0.432594 0.492515 0.581823 +0.448839 0.492515 0.581823 +0.464192 0.492515 0.581823 +0.478729 0.492515 0.581823 +0.492515 0.492515 0.581823 +0.505612 0.492515 0.581823 +0.518072 0.492515 0.581823 +0.529943 0.492515 0.581823 +0.541266 0.492515 0.581823 +0.552083 0.492515 0.581823 +0.562427 0.492515 0.581823 +0.572331 0.492515 0.581823 +0.581823 0.492515 0.581823 +0.590929 0.492515 0.581823 +0.599674 0.492515 0.581823 +0.608079 0.492515 0.581823 +0.616166 0.492515 0.581823 +0.000001 0.505612 0.581823 +0.037293 0.505612 0.581823 +0.079714 0.505612 0.581823 +0.120832 0.505612 0.581823 +0.159284 0.505612 0.581823 +0.194868 0.505612 0.581823 +0.227530 0.505612 0.581823 +0.257434 0.505612 0.581823 +0.285092 0.505612 0.581823 +0.310738 0.505612 0.581823 +0.334585 0.505612 0.581823 +0.356818 0.505612 0.581823 +0.377602 0.505612 0.581823 +0.397079 0.505612 0.581823 +0.415373 0.505612 0.581823 +0.432594 0.505612 0.581823 +0.448839 0.505612 0.581823 +0.464192 0.505612 0.581823 +0.478729 0.505612 0.581823 +0.492515 0.505612 0.581823 +0.505612 0.505612 0.581823 +0.518072 0.505612 0.581823 +0.529943 0.505612 0.581823 +0.541266 0.505612 0.581823 +0.552083 0.505612 0.581823 +0.562427 0.505612 0.581823 +0.572331 0.505612 0.581823 +0.581823 0.505612 0.581823 +0.590929 0.505612 0.581823 +0.599674 0.505612 0.581823 +0.608079 0.505612 0.581823 +0.616166 0.505612 0.581823 +0.000001 0.518072 0.581823 +0.037293 0.518072 0.581823 +0.079714 0.518072 0.581823 +0.120832 0.518072 0.581823 +0.159284 0.518072 0.581823 +0.194868 0.518072 0.581823 +0.227530 0.518072 0.581823 +0.257434 0.518072 0.581823 +0.285092 0.518072 0.581823 +0.310738 0.518072 0.581823 +0.334585 0.518072 0.581823 +0.356818 0.518072 0.581823 +0.377602 0.518072 0.581823 +0.397079 0.518072 0.581823 +0.415373 0.518072 0.581823 +0.432594 0.518072 0.581823 +0.448839 0.518072 0.581823 +0.464192 0.518072 0.581823 +0.478729 0.518072 0.581823 +0.492515 0.518072 0.581823 +0.505612 0.518072 0.581823 +0.518072 0.518072 0.581823 +0.529943 0.518072 0.581823 +0.541266 0.518072 0.581823 +0.552083 0.518072 0.581823 +0.562427 0.518072 0.581823 +0.572331 0.518072 0.581823 +0.581823 0.518072 0.581823 +0.590929 0.518072 0.581823 +0.599674 0.518072 0.581823 +0.608079 0.518072 0.581823 +0.616166 0.518072 0.581823 +0.000001 0.529943 0.581823 +0.037293 0.529943 0.581823 +0.079714 0.529943 0.581823 +0.120832 0.529943 0.581823 +0.159284 0.529943 0.581823 +0.194868 0.529943 0.581823 +0.227530 0.529943 0.581823 +0.257434 0.529943 0.581823 +0.285092 0.529943 0.581823 +0.310738 0.529943 0.581823 +0.334585 0.529943 0.581823 +0.356818 0.529943 0.581823 +0.377602 0.529943 0.581823 +0.397079 0.529943 0.581823 +0.415373 0.529943 0.581823 +0.432594 0.529943 0.581823 +0.448839 0.529943 0.581823 +0.464192 0.529943 0.581823 +0.478729 0.529943 0.581823 +0.492515 0.529943 0.581823 +0.505612 0.529943 0.581823 +0.518072 0.529943 0.581823 +0.529943 0.529943 0.581823 +0.541266 0.529943 0.581823 +0.552083 0.529943 0.581823 +0.562427 0.529943 0.581823 +0.572331 0.529943 0.581823 +0.581823 0.529943 0.581823 +0.590929 0.529943 0.581823 +0.599674 0.529943 0.581823 +0.608079 0.529943 0.581823 +0.616166 0.529943 0.581823 +0.000001 0.541266 0.581823 +0.037293 0.541266 0.581823 +0.079714 0.541266 0.581823 +0.120832 0.541266 0.581823 +0.159284 0.541266 0.581823 +0.194868 0.541266 0.581823 +0.227530 0.541266 0.581823 +0.257434 0.541266 0.581823 +0.285092 0.541266 0.581823 +0.310738 0.541266 0.581823 +0.334585 0.541266 0.581823 +0.356818 0.541266 0.581823 +0.377602 0.541266 0.581823 +0.397079 0.541266 0.581823 +0.415373 0.541266 0.581823 +0.432594 0.541266 0.581823 +0.448839 0.541266 0.581823 +0.464192 0.541266 0.581823 +0.478729 0.541266 0.581823 +0.492515 0.541266 0.581823 +0.505612 0.541266 0.581823 +0.518072 0.541266 0.581823 +0.529943 0.541266 0.581823 +0.541266 0.541266 0.581823 +0.552083 0.541266 0.581823 +0.562427 0.541266 0.581823 +0.572331 0.541266 0.581823 +0.581823 0.541266 0.581823 +0.590929 0.541266 0.581823 +0.599674 0.541266 0.581823 +0.608079 0.541266 0.581823 +0.616166 0.541266 0.581823 +0.000001 0.552083 0.581823 +0.037293 0.552083 0.581823 +0.079714 0.552083 0.581823 +0.120832 0.552083 0.581823 +0.159284 0.552083 0.581823 +0.194868 0.552083 0.581823 +0.227530 0.552083 0.581823 +0.257434 0.552083 0.581823 +0.285092 0.552083 0.581823 +0.310738 0.552083 0.581823 +0.334585 0.552083 0.581823 +0.356818 0.552083 0.581823 +0.377602 0.552083 0.581823 +0.397079 0.552083 0.581823 +0.415373 0.552083 0.581823 +0.432594 0.552083 0.581823 +0.448839 0.552083 0.581823 +0.464192 0.552083 0.581823 +0.478729 0.552083 0.581823 +0.492515 0.552083 0.581823 +0.505612 0.552083 0.581823 +0.518072 0.552083 0.581823 +0.529943 0.552083 0.581823 +0.541266 0.552083 0.581823 +0.552083 0.552083 0.581823 +0.562427 0.552083 0.581823 +0.572331 0.552083 0.581823 +0.581823 0.552083 0.581823 +0.590929 0.552083 0.581823 +0.599674 0.552083 0.581823 +0.608079 0.552083 0.581823 +0.616166 0.552083 0.581823 +0.000001 0.562427 0.581823 +0.037293 0.562427 0.581823 +0.079714 0.562427 0.581823 +0.120832 0.562427 0.581823 +0.159284 0.562427 0.581823 +0.194868 0.562427 0.581823 +0.227530 0.562427 0.581823 +0.257434 0.562427 0.581823 +0.285092 0.562427 0.581823 +0.310738 0.562427 0.581823 +0.334585 0.562427 0.581823 +0.356818 0.562427 0.581823 +0.377602 0.562427 0.581823 +0.397079 0.562427 0.581823 +0.415373 0.562427 0.581823 +0.432594 0.562427 0.581823 +0.448839 0.562427 0.581823 +0.464192 0.562427 0.581823 +0.478729 0.562427 0.581823 +0.492515 0.562427 0.581823 +0.505612 0.562427 0.581823 +0.518072 0.562427 0.581823 +0.529943 0.562427 0.581823 +0.541266 0.562427 0.581823 +0.552083 0.562427 0.581823 +0.562427 0.562427 0.581823 +0.572331 0.562427 0.581823 +0.581823 0.562427 0.581823 +0.590929 0.562427 0.581823 +0.599674 0.562427 0.581823 +0.608079 0.562427 0.581823 +0.616166 0.562427 0.581823 +0.000001 0.572331 0.581823 +0.037293 0.572331 0.581823 +0.079714 0.572331 0.581823 +0.120832 0.572331 0.581823 +0.159284 0.572331 0.581823 +0.194868 0.572331 0.581823 +0.227530 0.572331 0.581823 +0.257434 0.572331 0.581823 +0.285092 0.572331 0.581823 +0.310738 0.572331 0.581823 +0.334585 0.572331 0.581823 +0.356818 0.572331 0.581823 +0.377602 0.572331 0.581823 +0.397079 0.572331 0.581823 +0.415373 0.572331 0.581823 +0.432594 0.572331 0.581823 +0.448839 0.572331 0.581823 +0.464192 0.572331 0.581823 +0.478729 0.572331 0.581823 +0.492515 0.572331 0.581823 +0.505612 0.572331 0.581823 +0.518072 0.572331 0.581823 +0.529943 0.572331 0.581823 +0.541266 0.572331 0.581823 +0.552083 0.572331 0.581823 +0.562427 0.572331 0.581823 +0.572331 0.572331 0.581823 +0.581823 0.572331 0.581823 +0.590929 0.572331 0.581823 +0.599674 0.572331 0.581823 +0.608079 0.572331 0.581823 +0.616166 0.572331 0.581823 +0.000001 0.581823 0.581823 +0.037293 0.581823 0.581823 +0.079714 0.581823 0.581823 +0.120832 0.581823 0.581823 +0.159284 0.581823 0.581823 +0.194868 0.581823 0.581823 +0.227530 0.581823 0.581823 +0.257434 0.581823 0.581823 +0.285092 0.581823 0.581823 +0.310738 0.581823 0.581823 +0.334585 0.581823 0.581823 +0.356818 0.581823 0.581823 +0.377602 0.581823 0.581823 +0.397079 0.581823 0.581823 +0.415373 0.581823 0.581823 +0.432594 0.581823 0.581823 +0.448839 0.581823 0.581823 +0.464192 0.581823 0.581823 +0.478729 0.581823 0.581823 +0.492515 0.581823 0.581823 +0.505612 0.581823 0.581823 +0.518072 0.581823 0.581823 +0.529943 0.581823 0.581823 +0.541266 0.581823 0.581823 +0.552083 0.581823 0.581823 +0.562427 0.581823 0.581823 +0.572331 0.581823 0.581823 +0.581823 0.581823 0.581823 +0.590929 0.581823 0.581823 +0.599674 0.581823 0.581823 +0.608079 0.581823 0.581823 +0.616166 0.581823 0.581823 +0.000001 0.590929 0.581823 +0.037293 0.590929 0.581823 +0.079714 0.590929 0.581823 +0.120832 0.590929 0.581823 +0.159284 0.590929 0.581823 +0.194868 0.590929 0.581823 +0.227530 0.590929 0.581823 +0.257434 0.590929 0.581823 +0.285092 0.590929 0.581823 +0.310738 0.590929 0.581823 +0.334585 0.590929 0.581823 +0.356818 0.590929 0.581823 +0.377602 0.590929 0.581823 +0.397079 0.590929 0.581823 +0.415373 0.590929 0.581823 +0.432594 0.590929 0.581823 +0.448839 0.590929 0.581823 +0.464192 0.590929 0.581823 +0.478729 0.590929 0.581823 +0.492515 0.590929 0.581823 +0.505612 0.590929 0.581823 +0.518072 0.590929 0.581823 +0.529943 0.590929 0.581823 +0.541266 0.590929 0.581823 +0.552083 0.590929 0.581823 +0.562427 0.590929 0.581823 +0.572331 0.590929 0.581823 +0.581823 0.590929 0.581823 +0.590929 0.590929 0.581823 +0.599674 0.590929 0.581823 +0.608079 0.590929 0.581823 +0.616166 0.590929 0.581823 +0.000001 0.599674 0.581823 +0.037293 0.599674 0.581823 +0.079714 0.599674 0.581823 +0.120832 0.599674 0.581823 +0.159284 0.599674 0.581823 +0.194868 0.599674 0.581823 +0.227530 0.599674 0.581823 +0.257434 0.599674 0.581823 +0.285092 0.599674 0.581823 +0.310738 0.599674 0.581823 +0.334585 0.599674 0.581823 +0.356818 0.599674 0.581823 +0.377602 0.599674 0.581823 +0.397079 0.599674 0.581823 +0.415373 0.599674 0.581823 +0.432594 0.599674 0.581823 +0.448839 0.599674 0.581823 +0.464192 0.599674 0.581823 +0.478729 0.599674 0.581823 +0.492515 0.599674 0.581823 +0.505612 0.599674 0.581823 +0.518072 0.599674 0.581823 +0.529943 0.599674 0.581823 +0.541266 0.599674 0.581823 +0.552083 0.599674 0.581823 +0.562427 0.599674 0.581823 +0.572331 0.599674 0.581823 +0.581823 0.599674 0.581823 +0.590929 0.599674 0.581823 +0.599674 0.599674 0.581823 +0.608079 0.599674 0.581823 +0.616166 0.599674 0.581823 +0.000001 0.608079 0.581823 +0.037293 0.608079 0.581823 +0.079714 0.608079 0.581823 +0.120832 0.608079 0.581823 +0.159284 0.608079 0.581823 +0.194868 0.608079 0.581823 +0.227530 0.608079 0.581823 +0.257434 0.608079 0.581823 +0.285092 0.608079 0.581823 +0.310738 0.608079 0.581823 +0.334585 0.608079 0.581823 +0.356818 0.608079 0.581823 +0.377602 0.608079 0.581823 +0.397079 0.608079 0.581823 +0.415373 0.608079 0.581823 +0.432594 0.608079 0.581823 +0.448839 0.608079 0.581823 +0.464192 0.608079 0.581823 +0.478729 0.608079 0.581823 +0.492515 0.608079 0.581823 +0.505612 0.608079 0.581823 +0.518072 0.608079 0.581823 +0.529943 0.608079 0.581823 +0.541266 0.608079 0.581823 +0.552083 0.608079 0.581823 +0.562427 0.608079 0.581823 +0.572331 0.608079 0.581823 +0.581823 0.608079 0.581823 +0.590929 0.608079 0.581823 +0.599674 0.608079 0.581823 +0.608079 0.608079 0.581823 +0.616166 0.608079 0.581823 +0.000001 0.616166 0.581823 +0.037293 0.616166 0.581823 +0.079714 0.616166 0.581823 +0.120832 0.616166 0.581823 +0.159284 0.616166 0.581823 +0.194868 0.616166 0.581823 +0.227530 0.616166 0.581823 +0.257434 0.616166 0.581823 +0.285092 0.616166 0.581823 +0.310738 0.616166 0.581823 +0.334585 0.616166 0.581823 +0.356818 0.616166 0.581823 +0.377602 0.616166 0.581823 +0.397079 0.616166 0.581823 +0.415373 0.616166 0.581823 +0.432594 0.616166 0.581823 +0.448839 0.616166 0.581823 +0.464192 0.616166 0.581823 +0.478729 0.616166 0.581823 +0.492515 0.616166 0.581823 +0.505612 0.616166 0.581823 +0.518072 0.616166 0.581823 +0.529943 0.616166 0.581823 +0.541266 0.616166 0.581823 +0.552083 0.616166 0.581823 +0.562427 0.616166 0.581823 +0.572331 0.616166 0.581823 +0.581823 0.616166 0.581823 +0.590929 0.616166 0.581823 +0.599674 0.616166 0.581823 +0.608079 0.616166 0.581823 +0.616166 0.616166 0.581823 +0.000001 0.000001 0.590929 +0.037293 0.000001 0.590929 +0.079714 0.000001 0.590929 +0.120832 0.000001 0.590929 +0.159284 0.000001 0.590929 +0.194868 0.000001 0.590929 +0.227530 0.000001 0.590929 +0.257434 0.000001 0.590929 +0.285092 0.000001 0.590929 +0.310738 0.000001 0.590929 +0.334585 0.000001 0.590929 +0.356818 0.000001 0.590929 +0.377602 0.000001 0.590929 +0.397079 0.000001 0.590929 +0.415373 0.000001 0.590929 +0.432594 0.000001 0.590929 +0.448839 0.000001 0.590929 +0.464192 0.000001 0.590929 +0.478729 0.000001 0.590929 +0.492515 0.000001 0.590929 +0.505612 0.000001 0.590929 +0.518072 0.000001 0.590929 +0.529943 0.000001 0.590929 +0.541266 0.000001 0.590929 +0.552083 0.000001 0.590929 +0.562427 0.000001 0.590929 +0.572331 0.000001 0.590929 +0.581823 0.000001 0.590929 +0.590929 0.000001 0.590929 +0.599674 0.000001 0.590929 +0.608079 0.000001 0.590929 +0.616166 0.000001 0.590929 +0.000001 0.037293 0.590929 +0.037293 0.037293 0.590929 +0.079714 0.037293 0.590929 +0.120832 0.037293 0.590929 +0.159284 0.037293 0.590929 +0.194868 0.037293 0.590929 +0.227530 0.037293 0.590929 +0.257434 0.037293 0.590929 +0.285092 0.037293 0.590929 +0.310738 0.037293 0.590929 +0.334585 0.037293 0.590929 +0.356818 0.037293 0.590929 +0.377602 0.037293 0.590929 +0.397079 0.037293 0.590929 +0.415373 0.037293 0.590929 +0.432594 0.037293 0.590929 +0.448839 0.037293 0.590929 +0.464192 0.037293 0.590929 +0.478729 0.037293 0.590929 +0.492515 0.037293 0.590929 +0.505612 0.037293 0.590929 +0.518072 0.037293 0.590929 +0.529943 0.037293 0.590929 +0.541266 0.037293 0.590929 +0.552083 0.037293 0.590929 +0.562427 0.037293 0.590929 +0.572331 0.037293 0.590929 +0.581823 0.037293 0.590929 +0.590929 0.037293 0.590929 +0.599674 0.037293 0.590929 +0.608079 0.037293 0.590929 +0.616166 0.037293 0.590929 +0.000001 0.079714 0.590929 +0.037293 0.079714 0.590929 +0.079714 0.079714 0.590929 +0.120832 0.079714 0.590929 +0.159284 0.079714 0.590929 +0.194868 0.079714 0.590929 +0.227530 0.079714 0.590929 +0.257434 0.079714 0.590929 +0.285092 0.079714 0.590929 +0.310738 0.079714 0.590929 +0.334585 0.079714 0.590929 +0.356818 0.079714 0.590929 +0.377602 0.079714 0.590929 +0.397079 0.079714 0.590929 +0.415373 0.079714 0.590929 +0.432594 0.079714 0.590929 +0.448839 0.079714 0.590929 +0.464192 0.079714 0.590929 +0.478729 0.079714 0.590929 +0.492515 0.079714 0.590929 +0.505612 0.079714 0.590929 +0.518072 0.079714 0.590929 +0.529943 0.079714 0.590929 +0.541266 0.079714 0.590929 +0.552083 0.079714 0.590929 +0.562427 0.079714 0.590929 +0.572331 0.079714 0.590929 +0.581823 0.079714 0.590929 +0.590929 0.079714 0.590929 +0.599674 0.079714 0.590929 +0.608079 0.079714 0.590929 +0.616166 0.079714 0.590929 +0.000001 0.120832 0.590929 +0.037293 0.120832 0.590929 +0.079714 0.120832 0.590929 +0.120832 0.120832 0.590929 +0.159284 0.120832 0.590929 +0.194868 0.120832 0.590929 +0.227530 0.120832 0.590929 +0.257434 0.120832 0.590929 +0.285092 0.120832 0.590929 +0.310738 0.120832 0.590929 +0.334585 0.120832 0.590929 +0.356818 0.120832 0.590929 +0.377602 0.120832 0.590929 +0.397079 0.120832 0.590929 +0.415373 0.120832 0.590929 +0.432594 0.120832 0.590929 +0.448839 0.120832 0.590929 +0.464192 0.120832 0.590929 +0.478729 0.120832 0.590929 +0.492515 0.120832 0.590929 +0.505612 0.120832 0.590929 +0.518072 0.120832 0.590929 +0.529943 0.120832 0.590929 +0.541266 0.120832 0.590929 +0.552083 0.120832 0.590929 +0.562427 0.120832 0.590929 +0.572331 0.120832 0.590929 +0.581823 0.120832 0.590929 +0.590929 0.120832 0.590929 +0.599674 0.120832 0.590929 +0.608079 0.120832 0.590929 +0.616166 0.120832 0.590929 +0.000001 0.159284 0.590929 +0.037293 0.159284 0.590929 +0.079714 0.159284 0.590929 +0.120832 0.159284 0.590929 +0.159284 0.159284 0.590929 +0.194868 0.159284 0.590929 +0.227530 0.159284 0.590929 +0.257434 0.159284 0.590929 +0.285092 0.159284 0.590929 +0.310738 0.159284 0.590929 +0.334585 0.159284 0.590929 +0.356818 0.159284 0.590929 +0.377602 0.159284 0.590929 +0.397079 0.159284 0.590929 +0.415373 0.159284 0.590929 +0.432594 0.159284 0.590929 +0.448839 0.159284 0.590929 +0.464192 0.159284 0.590929 +0.478729 0.159284 0.590929 +0.492515 0.159284 0.590929 +0.505612 0.159284 0.590929 +0.518072 0.159284 0.590929 +0.529943 0.159284 0.590929 +0.541266 0.159284 0.590929 +0.552083 0.159284 0.590929 +0.562427 0.159284 0.590929 +0.572331 0.159284 0.590929 +0.581823 0.159284 0.590929 +0.590929 0.159284 0.590929 +0.599674 0.159284 0.590929 +0.608079 0.159284 0.590929 +0.616166 0.159284 0.590929 +0.000001 0.194868 0.590929 +0.037293 0.194868 0.590929 +0.079714 0.194868 0.590929 +0.120832 0.194868 0.590929 +0.159284 0.194868 0.590929 +0.194868 0.194868 0.590929 +0.227530 0.194868 0.590929 +0.257434 0.194868 0.590929 +0.285092 0.194868 0.590929 +0.310738 0.194868 0.590929 +0.334585 0.194868 0.590929 +0.356818 0.194868 0.590929 +0.377602 0.194868 0.590929 +0.397079 0.194868 0.590929 +0.415373 0.194868 0.590929 +0.432594 0.194868 0.590929 +0.448839 0.194868 0.590929 +0.464192 0.194868 0.590929 +0.478729 0.194868 0.590929 +0.492515 0.194868 0.590929 +0.505612 0.194868 0.590929 +0.518072 0.194868 0.590929 +0.529943 0.194868 0.590929 +0.541266 0.194868 0.590929 +0.552083 0.194868 0.590929 +0.562427 0.194868 0.590929 +0.572331 0.194868 0.590929 +0.581823 0.194868 0.590929 +0.590929 0.194868 0.590929 +0.599674 0.194868 0.590929 +0.608079 0.194868 0.590929 +0.616166 0.194868 0.590929 +0.000001 0.227530 0.590929 +0.037293 0.227530 0.590929 +0.079714 0.227530 0.590929 +0.120832 0.227530 0.590929 +0.159284 0.227530 0.590929 +0.194868 0.227530 0.590929 +0.227530 0.227530 0.590929 +0.257434 0.227530 0.590929 +0.285092 0.227530 0.590929 +0.310738 0.227530 0.590929 +0.334585 0.227530 0.590929 +0.356818 0.227530 0.590929 +0.377602 0.227530 0.590929 +0.397079 0.227530 0.590929 +0.415373 0.227530 0.590929 +0.432594 0.227530 0.590929 +0.448839 0.227530 0.590929 +0.464192 0.227530 0.590929 +0.478729 0.227530 0.590929 +0.492515 0.227530 0.590929 +0.505612 0.227530 0.590929 +0.518072 0.227530 0.590929 +0.529943 0.227530 0.590929 +0.541266 0.227530 0.590929 +0.552083 0.227530 0.590929 +0.562427 0.227530 0.590929 +0.572331 0.227530 0.590929 +0.581823 0.227530 0.590929 +0.590929 0.227530 0.590929 +0.599674 0.227530 0.590929 +0.608079 0.227530 0.590929 +0.616166 0.227530 0.590929 +0.000001 0.257434 0.590929 +0.037293 0.257434 0.590929 +0.079714 0.257434 0.590929 +0.120832 0.257434 0.590929 +0.159284 0.257434 0.590929 +0.194868 0.257434 0.590929 +0.227530 0.257434 0.590929 +0.257434 0.257434 0.590929 +0.285092 0.257434 0.590929 +0.310738 0.257434 0.590929 +0.334585 0.257434 0.590929 +0.356818 0.257434 0.590929 +0.377602 0.257434 0.590929 +0.397079 0.257434 0.590929 +0.415373 0.257434 0.590929 +0.432594 0.257434 0.590929 +0.448839 0.257434 0.590929 +0.464192 0.257434 0.590929 +0.478729 0.257434 0.590929 +0.492515 0.257434 0.590929 +0.505612 0.257434 0.590929 +0.518072 0.257434 0.590929 +0.529943 0.257434 0.590929 +0.541266 0.257434 0.590929 +0.552083 0.257434 0.590929 +0.562427 0.257434 0.590929 +0.572331 0.257434 0.590929 +0.581823 0.257434 0.590929 +0.590929 0.257434 0.590929 +0.599674 0.257434 0.590929 +0.608079 0.257434 0.590929 +0.616166 0.257434 0.590929 +0.000001 0.285092 0.590929 +0.037293 0.285092 0.590929 +0.079714 0.285092 0.590929 +0.120832 0.285092 0.590929 +0.159284 0.285092 0.590929 +0.194868 0.285092 0.590929 +0.227530 0.285092 0.590929 +0.257434 0.285092 0.590929 +0.285092 0.285092 0.590929 +0.310738 0.285092 0.590929 +0.334585 0.285092 0.590929 +0.356818 0.285092 0.590929 +0.377602 0.285092 0.590929 +0.397079 0.285092 0.590929 +0.415373 0.285092 0.590929 +0.432594 0.285092 0.590929 +0.448839 0.285092 0.590929 +0.464192 0.285092 0.590929 +0.478729 0.285092 0.590929 +0.492515 0.285092 0.590929 +0.505612 0.285092 0.590929 +0.518072 0.285092 0.590929 +0.529943 0.285092 0.590929 +0.541266 0.285092 0.590929 +0.552083 0.285092 0.590929 +0.562427 0.285092 0.590929 +0.572331 0.285092 0.590929 +0.581823 0.285092 0.590929 +0.590929 0.285092 0.590929 +0.599674 0.285092 0.590929 +0.608079 0.285092 0.590929 +0.616166 0.285092 0.590929 +0.000001 0.310738 0.590929 +0.037293 0.310738 0.590929 +0.079714 0.310738 0.590929 +0.120832 0.310738 0.590929 +0.159284 0.310738 0.590929 +0.194868 0.310738 0.590929 +0.227530 0.310738 0.590929 +0.257434 0.310738 0.590929 +0.285092 0.310738 0.590929 +0.310738 0.310738 0.590929 +0.334585 0.310738 0.590929 +0.356818 0.310738 0.590929 +0.377602 0.310738 0.590929 +0.397079 0.310738 0.590929 +0.415373 0.310738 0.590929 +0.432594 0.310738 0.590929 +0.448839 0.310738 0.590929 +0.464192 0.310738 0.590929 +0.478729 0.310738 0.590929 +0.492515 0.310738 0.590929 +0.505612 0.310738 0.590929 +0.518072 0.310738 0.590929 +0.529943 0.310738 0.590929 +0.541266 0.310738 0.590929 +0.552083 0.310738 0.590929 +0.562427 0.310738 0.590929 +0.572331 0.310738 0.590929 +0.581823 0.310738 0.590929 +0.590929 0.310738 0.590929 +0.599674 0.310738 0.590929 +0.608079 0.310738 0.590929 +0.616166 0.310738 0.590929 +0.000001 0.334585 0.590929 +0.037293 0.334585 0.590929 +0.079714 0.334585 0.590929 +0.120832 0.334585 0.590929 +0.159284 0.334585 0.590929 +0.194868 0.334585 0.590929 +0.227530 0.334585 0.590929 +0.257434 0.334585 0.590929 +0.285092 0.334585 0.590929 +0.310738 0.334585 0.590929 +0.334585 0.334585 0.590929 +0.356818 0.334585 0.590929 +0.377602 0.334585 0.590929 +0.397079 0.334585 0.590929 +0.415373 0.334585 0.590929 +0.432594 0.334585 0.590929 +0.448839 0.334585 0.590929 +0.464192 0.334585 0.590929 +0.478729 0.334585 0.590929 +0.492515 0.334585 0.590929 +0.505612 0.334585 0.590929 +0.518072 0.334585 0.590929 +0.529943 0.334585 0.590929 +0.541266 0.334585 0.590929 +0.552083 0.334585 0.590929 +0.562427 0.334585 0.590929 +0.572331 0.334585 0.590929 +0.581823 0.334585 0.590929 +0.590929 0.334585 0.590929 +0.599674 0.334585 0.590929 +0.608079 0.334585 0.590929 +0.616166 0.334585 0.590929 +0.000001 0.356818 0.590929 +0.037293 0.356818 0.590929 +0.079714 0.356818 0.590929 +0.120832 0.356818 0.590929 +0.159284 0.356818 0.590929 +0.194868 0.356818 0.590929 +0.227530 0.356818 0.590929 +0.257434 0.356818 0.590929 +0.285092 0.356818 0.590929 +0.310738 0.356818 0.590929 +0.334585 0.356818 0.590929 +0.356818 0.356818 0.590929 +0.377602 0.356818 0.590929 +0.397079 0.356818 0.590929 +0.415373 0.356818 0.590929 +0.432594 0.356818 0.590929 +0.448839 0.356818 0.590929 +0.464192 0.356818 0.590929 +0.478729 0.356818 0.590929 +0.492515 0.356818 0.590929 +0.505612 0.356818 0.590929 +0.518072 0.356818 0.590929 +0.529943 0.356818 0.590929 +0.541266 0.356818 0.590929 +0.552083 0.356818 0.590929 +0.562427 0.356818 0.590929 +0.572331 0.356818 0.590929 +0.581823 0.356818 0.590929 +0.590929 0.356818 0.590929 +0.599674 0.356818 0.590929 +0.608079 0.356818 0.590929 +0.616166 0.356818 0.590929 +0.000001 0.377602 0.590929 +0.037293 0.377602 0.590929 +0.079714 0.377602 0.590929 +0.120832 0.377602 0.590929 +0.159284 0.377602 0.590929 +0.194868 0.377602 0.590929 +0.227530 0.377602 0.590929 +0.257434 0.377602 0.590929 +0.285092 0.377602 0.590929 +0.310738 0.377602 0.590929 +0.334585 0.377602 0.590929 +0.356818 0.377602 0.590929 +0.377602 0.377602 0.590929 +0.397079 0.377602 0.590929 +0.415373 0.377602 0.590929 +0.432594 0.377602 0.590929 +0.448839 0.377602 0.590929 +0.464192 0.377602 0.590929 +0.478729 0.377602 0.590929 +0.492515 0.377602 0.590929 +0.505612 0.377602 0.590929 +0.518072 0.377602 0.590929 +0.529943 0.377602 0.590929 +0.541266 0.377602 0.590929 +0.552083 0.377602 0.590929 +0.562427 0.377602 0.590929 +0.572331 0.377602 0.590929 +0.581823 0.377602 0.590929 +0.590929 0.377602 0.590929 +0.599674 0.377602 0.590929 +0.608079 0.377602 0.590929 +0.616166 0.377602 0.590929 +0.000001 0.397079 0.590929 +0.037293 0.397079 0.590929 +0.079714 0.397079 0.590929 +0.120832 0.397079 0.590929 +0.159284 0.397079 0.590929 +0.194868 0.397079 0.590929 +0.227530 0.397079 0.590929 +0.257434 0.397079 0.590929 +0.285092 0.397079 0.590929 +0.310738 0.397079 0.590929 +0.334585 0.397079 0.590929 +0.356818 0.397079 0.590929 +0.377602 0.397079 0.590929 +0.397079 0.397079 0.590929 +0.415373 0.397079 0.590929 +0.432594 0.397079 0.590929 +0.448839 0.397079 0.590929 +0.464192 0.397079 0.590929 +0.478729 0.397079 0.590929 +0.492515 0.397079 0.590929 +0.505612 0.397079 0.590929 +0.518072 0.397079 0.590929 +0.529943 0.397079 0.590929 +0.541266 0.397079 0.590929 +0.552083 0.397079 0.590929 +0.562427 0.397079 0.590929 +0.572331 0.397079 0.590929 +0.581823 0.397079 0.590929 +0.590929 0.397079 0.590929 +0.599674 0.397079 0.590929 +0.608079 0.397079 0.590929 +0.616166 0.397079 0.590929 +0.000001 0.415373 0.590929 +0.037293 0.415373 0.590929 +0.079714 0.415373 0.590929 +0.120832 0.415373 0.590929 +0.159284 0.415373 0.590929 +0.194868 0.415373 0.590929 +0.227530 0.415373 0.590929 +0.257434 0.415373 0.590929 +0.285092 0.415373 0.590929 +0.310738 0.415373 0.590929 +0.334585 0.415373 0.590929 +0.356818 0.415373 0.590929 +0.377602 0.415373 0.590929 +0.397079 0.415373 0.590929 +0.415373 0.415373 0.590929 +0.432594 0.415373 0.590929 +0.448839 0.415373 0.590929 +0.464192 0.415373 0.590929 +0.478729 0.415373 0.590929 +0.492515 0.415373 0.590929 +0.505612 0.415373 0.590929 +0.518072 0.415373 0.590929 +0.529943 0.415373 0.590929 +0.541266 0.415373 0.590929 +0.552083 0.415373 0.590929 +0.562427 0.415373 0.590929 +0.572331 0.415373 0.590929 +0.581823 0.415373 0.590929 +0.590929 0.415373 0.590929 +0.599674 0.415373 0.590929 +0.608079 0.415373 0.590929 +0.616166 0.415373 0.590929 +0.000001 0.432594 0.590929 +0.037293 0.432594 0.590929 +0.079714 0.432594 0.590929 +0.120832 0.432594 0.590929 +0.159284 0.432594 0.590929 +0.194868 0.432594 0.590929 +0.227530 0.432594 0.590929 +0.257434 0.432594 0.590929 +0.285092 0.432594 0.590929 +0.310738 0.432594 0.590929 +0.334585 0.432594 0.590929 +0.356818 0.432594 0.590929 +0.377602 0.432594 0.590929 +0.397079 0.432594 0.590929 +0.415373 0.432594 0.590929 +0.432594 0.432594 0.590929 +0.448839 0.432594 0.590929 +0.464192 0.432594 0.590929 +0.478729 0.432594 0.590929 +0.492515 0.432594 0.590929 +0.505612 0.432594 0.590929 +0.518072 0.432594 0.590929 +0.529943 0.432594 0.590929 +0.541266 0.432594 0.590929 +0.552083 0.432594 0.590929 +0.562427 0.432594 0.590929 +0.572331 0.432594 0.590929 +0.581823 0.432594 0.590929 +0.590929 0.432594 0.590929 +0.599674 0.432594 0.590929 +0.608079 0.432594 0.590929 +0.616166 0.432594 0.590929 +0.000001 0.448839 0.590929 +0.037293 0.448839 0.590929 +0.079714 0.448839 0.590929 +0.120832 0.448839 0.590929 +0.159284 0.448839 0.590929 +0.194868 0.448839 0.590929 +0.227530 0.448839 0.590929 +0.257434 0.448839 0.590929 +0.285092 0.448839 0.590929 +0.310738 0.448839 0.590929 +0.334585 0.448839 0.590929 +0.356818 0.448839 0.590929 +0.377602 0.448839 0.590929 +0.397079 0.448839 0.590929 +0.415373 0.448839 0.590929 +0.432594 0.448839 0.590929 +0.448839 0.448839 0.590929 +0.464192 0.448839 0.590929 +0.478729 0.448839 0.590929 +0.492515 0.448839 0.590929 +0.505612 0.448839 0.590929 +0.518072 0.448839 0.590929 +0.529943 0.448839 0.590929 +0.541266 0.448839 0.590929 +0.552083 0.448839 0.590929 +0.562427 0.448839 0.590929 +0.572331 0.448839 0.590929 +0.581823 0.448839 0.590929 +0.590929 0.448839 0.590929 +0.599674 0.448839 0.590929 +0.608079 0.448839 0.590929 +0.616166 0.448839 0.590929 +0.000001 0.464192 0.590929 +0.037293 0.464192 0.590929 +0.079714 0.464192 0.590929 +0.120832 0.464192 0.590929 +0.159284 0.464192 0.590929 +0.194868 0.464192 0.590929 +0.227530 0.464192 0.590929 +0.257434 0.464192 0.590929 +0.285092 0.464192 0.590929 +0.310738 0.464192 0.590929 +0.334585 0.464192 0.590929 +0.356818 0.464192 0.590929 +0.377602 0.464192 0.590929 +0.397079 0.464192 0.590929 +0.415373 0.464192 0.590929 +0.432594 0.464192 0.590929 +0.448839 0.464192 0.590929 +0.464192 0.464192 0.590929 +0.478729 0.464192 0.590929 +0.492515 0.464192 0.590929 +0.505612 0.464192 0.590929 +0.518072 0.464192 0.590929 +0.529943 0.464192 0.590929 +0.541266 0.464192 0.590929 +0.552083 0.464192 0.590929 +0.562427 0.464192 0.590929 +0.572331 0.464192 0.590929 +0.581823 0.464192 0.590929 +0.590929 0.464192 0.590929 +0.599674 0.464192 0.590929 +0.608079 0.464192 0.590929 +0.616166 0.464192 0.590929 +0.000001 0.478729 0.590929 +0.037293 0.478729 0.590929 +0.079714 0.478729 0.590929 +0.120832 0.478729 0.590929 +0.159284 0.478729 0.590929 +0.194868 0.478729 0.590929 +0.227530 0.478729 0.590929 +0.257434 0.478729 0.590929 +0.285092 0.478729 0.590929 +0.310738 0.478729 0.590929 +0.334585 0.478729 0.590929 +0.356818 0.478729 0.590929 +0.377602 0.478729 0.590929 +0.397079 0.478729 0.590929 +0.415373 0.478729 0.590929 +0.432594 0.478729 0.590929 +0.448839 0.478729 0.590929 +0.464192 0.478729 0.590929 +0.478729 0.478729 0.590929 +0.492515 0.478729 0.590929 +0.505612 0.478729 0.590929 +0.518072 0.478729 0.590929 +0.529943 0.478729 0.590929 +0.541266 0.478729 0.590929 +0.552083 0.478729 0.590929 +0.562427 0.478729 0.590929 +0.572331 0.478729 0.590929 +0.581823 0.478729 0.590929 +0.590929 0.478729 0.590929 +0.599674 0.478729 0.590929 +0.608079 0.478729 0.590929 +0.616166 0.478729 0.590929 +0.000001 0.492515 0.590929 +0.037293 0.492515 0.590929 +0.079714 0.492515 0.590929 +0.120832 0.492515 0.590929 +0.159284 0.492515 0.590929 +0.194868 0.492515 0.590929 +0.227530 0.492515 0.590929 +0.257434 0.492515 0.590929 +0.285092 0.492515 0.590929 +0.310738 0.492515 0.590929 +0.334585 0.492515 0.590929 +0.356818 0.492515 0.590929 +0.377602 0.492515 0.590929 +0.397079 0.492515 0.590929 +0.415373 0.492515 0.590929 +0.432594 0.492515 0.590929 +0.448839 0.492515 0.590929 +0.464192 0.492515 0.590929 +0.478729 0.492515 0.590929 +0.492515 0.492515 0.590929 +0.505612 0.492515 0.590929 +0.518072 0.492515 0.590929 +0.529943 0.492515 0.590929 +0.541266 0.492515 0.590929 +0.552083 0.492515 0.590929 +0.562427 0.492515 0.590929 +0.572331 0.492515 0.590929 +0.581823 0.492515 0.590929 +0.590929 0.492515 0.590929 +0.599674 0.492515 0.590929 +0.608079 0.492515 0.590929 +0.616166 0.492515 0.590929 +0.000001 0.505612 0.590929 +0.037293 0.505612 0.590929 +0.079714 0.505612 0.590929 +0.120832 0.505612 0.590929 +0.159284 0.505612 0.590929 +0.194868 0.505612 0.590929 +0.227530 0.505612 0.590929 +0.257434 0.505612 0.590929 +0.285092 0.505612 0.590929 +0.310738 0.505612 0.590929 +0.334585 0.505612 0.590929 +0.356818 0.505612 0.590929 +0.377602 0.505612 0.590929 +0.397079 0.505612 0.590929 +0.415373 0.505612 0.590929 +0.432594 0.505612 0.590929 +0.448839 0.505612 0.590929 +0.464192 0.505612 0.590929 +0.478729 0.505612 0.590929 +0.492515 0.505612 0.590929 +0.505612 0.505612 0.590929 +0.518072 0.505612 0.590929 +0.529943 0.505612 0.590929 +0.541266 0.505612 0.590929 +0.552083 0.505612 0.590929 +0.562427 0.505612 0.590929 +0.572331 0.505612 0.590929 +0.581823 0.505612 0.590929 +0.590929 0.505612 0.590929 +0.599674 0.505612 0.590929 +0.608079 0.505612 0.590929 +0.616166 0.505612 0.590929 +0.000001 0.518072 0.590929 +0.037293 0.518072 0.590929 +0.079714 0.518072 0.590929 +0.120832 0.518072 0.590929 +0.159284 0.518072 0.590929 +0.194868 0.518072 0.590929 +0.227530 0.518072 0.590929 +0.257434 0.518072 0.590929 +0.285092 0.518072 0.590929 +0.310738 0.518072 0.590929 +0.334585 0.518072 0.590929 +0.356818 0.518072 0.590929 +0.377602 0.518072 0.590929 +0.397079 0.518072 0.590929 +0.415373 0.518072 0.590929 +0.432594 0.518072 0.590929 +0.448839 0.518072 0.590929 +0.464192 0.518072 0.590929 +0.478729 0.518072 0.590929 +0.492515 0.518072 0.590929 +0.505612 0.518072 0.590929 +0.518072 0.518072 0.590929 +0.529943 0.518072 0.590929 +0.541266 0.518072 0.590929 +0.552083 0.518072 0.590929 +0.562427 0.518072 0.590929 +0.572331 0.518072 0.590929 +0.581823 0.518072 0.590929 +0.590929 0.518072 0.590929 +0.599674 0.518072 0.590929 +0.608079 0.518072 0.590929 +0.616166 0.518072 0.590929 +0.000001 0.529943 0.590929 +0.037293 0.529943 0.590929 +0.079714 0.529943 0.590929 +0.120832 0.529943 0.590929 +0.159284 0.529943 0.590929 +0.194868 0.529943 0.590929 +0.227530 0.529943 0.590929 +0.257434 0.529943 0.590929 +0.285092 0.529943 0.590929 +0.310738 0.529943 0.590929 +0.334585 0.529943 0.590929 +0.356818 0.529943 0.590929 +0.377602 0.529943 0.590929 +0.397079 0.529943 0.590929 +0.415373 0.529943 0.590929 +0.432594 0.529943 0.590929 +0.448839 0.529943 0.590929 +0.464192 0.529943 0.590929 +0.478729 0.529943 0.590929 +0.492515 0.529943 0.590929 +0.505612 0.529943 0.590929 +0.518072 0.529943 0.590929 +0.529943 0.529943 0.590929 +0.541266 0.529943 0.590929 +0.552083 0.529943 0.590929 +0.562427 0.529943 0.590929 +0.572331 0.529943 0.590929 +0.581823 0.529943 0.590929 +0.590929 0.529943 0.590929 +0.599674 0.529943 0.590929 +0.608079 0.529943 0.590929 +0.616166 0.529943 0.590929 +0.000001 0.541266 0.590929 +0.037293 0.541266 0.590929 +0.079714 0.541266 0.590929 +0.120832 0.541266 0.590929 +0.159284 0.541266 0.590929 +0.194868 0.541266 0.590929 +0.227530 0.541266 0.590929 +0.257434 0.541266 0.590929 +0.285092 0.541266 0.590929 +0.310738 0.541266 0.590929 +0.334585 0.541266 0.590929 +0.356818 0.541266 0.590929 +0.377602 0.541266 0.590929 +0.397079 0.541266 0.590929 +0.415373 0.541266 0.590929 +0.432594 0.541266 0.590929 +0.448839 0.541266 0.590929 +0.464192 0.541266 0.590929 +0.478729 0.541266 0.590929 +0.492515 0.541266 0.590929 +0.505612 0.541266 0.590929 +0.518072 0.541266 0.590929 +0.529943 0.541266 0.590929 +0.541266 0.541266 0.590929 +0.552083 0.541266 0.590929 +0.562427 0.541266 0.590929 +0.572331 0.541266 0.590929 +0.581823 0.541266 0.590929 +0.590929 0.541266 0.590929 +0.599674 0.541266 0.590929 +0.608079 0.541266 0.590929 +0.616166 0.541266 0.590929 +0.000001 0.552083 0.590929 +0.037293 0.552083 0.590929 +0.079714 0.552083 0.590929 +0.120832 0.552083 0.590929 +0.159284 0.552083 0.590929 +0.194868 0.552083 0.590929 +0.227530 0.552083 0.590929 +0.257434 0.552083 0.590929 +0.285092 0.552083 0.590929 +0.310738 0.552083 0.590929 +0.334585 0.552083 0.590929 +0.356818 0.552083 0.590929 +0.377602 0.552083 0.590929 +0.397079 0.552083 0.590929 +0.415373 0.552083 0.590929 +0.432594 0.552083 0.590929 +0.448839 0.552083 0.590929 +0.464192 0.552083 0.590929 +0.478729 0.552083 0.590929 +0.492515 0.552083 0.590929 +0.505612 0.552083 0.590929 +0.518072 0.552083 0.590929 +0.529943 0.552083 0.590929 +0.541266 0.552083 0.590929 +0.552083 0.552083 0.590929 +0.562427 0.552083 0.590929 +0.572331 0.552083 0.590929 +0.581823 0.552083 0.590929 +0.590929 0.552083 0.590929 +0.599674 0.552083 0.590929 +0.608079 0.552083 0.590929 +0.616166 0.552083 0.590929 +0.000001 0.562427 0.590929 +0.037293 0.562427 0.590929 +0.079714 0.562427 0.590929 +0.120832 0.562427 0.590929 +0.159284 0.562427 0.590929 +0.194868 0.562427 0.590929 +0.227530 0.562427 0.590929 +0.257434 0.562427 0.590929 +0.285092 0.562427 0.590929 +0.310738 0.562427 0.590929 +0.334585 0.562427 0.590929 +0.356818 0.562427 0.590929 +0.377602 0.562427 0.590929 +0.397079 0.562427 0.590929 +0.415373 0.562427 0.590929 +0.432594 0.562427 0.590929 +0.448839 0.562427 0.590929 +0.464192 0.562427 0.590929 +0.478729 0.562427 0.590929 +0.492515 0.562427 0.590929 +0.505612 0.562427 0.590929 +0.518072 0.562427 0.590929 +0.529943 0.562427 0.590929 +0.541266 0.562427 0.590929 +0.552083 0.562427 0.590929 +0.562427 0.562427 0.590929 +0.572331 0.562427 0.590929 +0.581823 0.562427 0.590929 +0.590929 0.562427 0.590929 +0.599674 0.562427 0.590929 +0.608079 0.562427 0.590929 +0.616166 0.562427 0.590929 +0.000001 0.572331 0.590929 +0.037293 0.572331 0.590929 +0.079714 0.572331 0.590929 +0.120832 0.572331 0.590929 +0.159284 0.572331 0.590929 +0.194868 0.572331 0.590929 +0.227530 0.572331 0.590929 +0.257434 0.572331 0.590929 +0.285092 0.572331 0.590929 +0.310738 0.572331 0.590929 +0.334585 0.572331 0.590929 +0.356818 0.572331 0.590929 +0.377602 0.572331 0.590929 +0.397079 0.572331 0.590929 +0.415373 0.572331 0.590929 +0.432594 0.572331 0.590929 +0.448839 0.572331 0.590929 +0.464192 0.572331 0.590929 +0.478729 0.572331 0.590929 +0.492515 0.572331 0.590929 +0.505612 0.572331 0.590929 +0.518072 0.572331 0.590929 +0.529943 0.572331 0.590929 +0.541266 0.572331 0.590929 +0.552083 0.572331 0.590929 +0.562427 0.572331 0.590929 +0.572331 0.572331 0.590929 +0.581823 0.572331 0.590929 +0.590929 0.572331 0.590929 +0.599674 0.572331 0.590929 +0.608079 0.572331 0.590929 +0.616166 0.572331 0.590929 +0.000001 0.581823 0.590929 +0.037293 0.581823 0.590929 +0.079714 0.581823 0.590929 +0.120832 0.581823 0.590929 +0.159284 0.581823 0.590929 +0.194868 0.581823 0.590929 +0.227530 0.581823 0.590929 +0.257434 0.581823 0.590929 +0.285092 0.581823 0.590929 +0.310738 0.581823 0.590929 +0.334585 0.581823 0.590929 +0.356818 0.581823 0.590929 +0.377602 0.581823 0.590929 +0.397079 0.581823 0.590929 +0.415373 0.581823 0.590929 +0.432594 0.581823 0.590929 +0.448839 0.581823 0.590929 +0.464192 0.581823 0.590929 +0.478729 0.581823 0.590929 +0.492515 0.581823 0.590929 +0.505612 0.581823 0.590929 +0.518072 0.581823 0.590929 +0.529943 0.581823 0.590929 +0.541266 0.581823 0.590929 +0.552083 0.581823 0.590929 +0.562427 0.581823 0.590929 +0.572331 0.581823 0.590929 +0.581823 0.581823 0.590929 +0.590929 0.581823 0.590929 +0.599674 0.581823 0.590929 +0.608079 0.581823 0.590929 +0.616166 0.581823 0.590929 +0.000001 0.590929 0.590929 +0.037293 0.590929 0.590929 +0.079714 0.590929 0.590929 +0.120832 0.590929 0.590929 +0.159284 0.590929 0.590929 +0.194868 0.590929 0.590929 +0.227530 0.590929 0.590929 +0.257434 0.590929 0.590929 +0.285092 0.590929 0.590929 +0.310738 0.590929 0.590929 +0.334585 0.590929 0.590929 +0.356818 0.590929 0.590929 +0.377602 0.590929 0.590929 +0.397079 0.590929 0.590929 +0.415373 0.590929 0.590929 +0.432594 0.590929 0.590929 +0.448839 0.590929 0.590929 +0.464192 0.590929 0.590929 +0.478729 0.590929 0.590929 +0.492515 0.590929 0.590929 +0.505612 0.590929 0.590929 +0.518072 0.590929 0.590929 +0.529943 0.590929 0.590929 +0.541266 0.590929 0.590929 +0.552083 0.590929 0.590929 +0.562427 0.590929 0.590929 +0.572331 0.590929 0.590929 +0.581823 0.590929 0.590929 +0.590929 0.590929 0.590929 +0.599674 0.590929 0.590929 +0.608079 0.590929 0.590929 +0.616166 0.590929 0.590929 +0.000001 0.599674 0.590929 +0.037293 0.599674 0.590929 +0.079714 0.599674 0.590929 +0.120832 0.599674 0.590929 +0.159284 0.599674 0.590929 +0.194868 0.599674 0.590929 +0.227530 0.599674 0.590929 +0.257434 0.599674 0.590929 +0.285092 0.599674 0.590929 +0.310738 0.599674 0.590929 +0.334585 0.599674 0.590929 +0.356818 0.599674 0.590929 +0.377602 0.599674 0.590929 +0.397079 0.599674 0.590929 +0.415373 0.599674 0.590929 +0.432594 0.599674 0.590929 +0.448839 0.599674 0.590929 +0.464192 0.599674 0.590929 +0.478729 0.599674 0.590929 +0.492515 0.599674 0.590929 +0.505612 0.599674 0.590929 +0.518072 0.599674 0.590929 +0.529943 0.599674 0.590929 +0.541266 0.599674 0.590929 +0.552083 0.599674 0.590929 +0.562427 0.599674 0.590929 +0.572331 0.599674 0.590929 +0.581823 0.599674 0.590929 +0.590929 0.599674 0.590929 +0.599674 0.599674 0.590929 +0.608079 0.599674 0.590929 +0.616166 0.599674 0.590929 +0.000001 0.608079 0.590929 +0.037293 0.608079 0.590929 +0.079714 0.608079 0.590929 +0.120832 0.608079 0.590929 +0.159284 0.608079 0.590929 +0.194868 0.608079 0.590929 +0.227530 0.608079 0.590929 +0.257434 0.608079 0.590929 +0.285092 0.608079 0.590929 +0.310738 0.608079 0.590929 +0.334585 0.608079 0.590929 +0.356818 0.608079 0.590929 +0.377602 0.608079 0.590929 +0.397079 0.608079 0.590929 +0.415373 0.608079 0.590929 +0.432594 0.608079 0.590929 +0.448839 0.608079 0.590929 +0.464192 0.608079 0.590929 +0.478729 0.608079 0.590929 +0.492515 0.608079 0.590929 +0.505612 0.608079 0.590929 +0.518072 0.608079 0.590929 +0.529943 0.608079 0.590929 +0.541266 0.608079 0.590929 +0.552083 0.608079 0.590929 +0.562427 0.608079 0.590929 +0.572331 0.608079 0.590929 +0.581823 0.608079 0.590929 +0.590929 0.608079 0.590929 +0.599674 0.608079 0.590929 +0.608079 0.608079 0.590929 +0.616166 0.608079 0.590929 +0.000001 0.616166 0.590929 +0.037293 0.616166 0.590929 +0.079714 0.616166 0.590929 +0.120832 0.616166 0.590929 +0.159284 0.616166 0.590929 +0.194868 0.616166 0.590929 +0.227530 0.616166 0.590929 +0.257434 0.616166 0.590929 +0.285092 0.616166 0.590929 +0.310738 0.616166 0.590929 +0.334585 0.616166 0.590929 +0.356818 0.616166 0.590929 +0.377602 0.616166 0.590929 +0.397079 0.616166 0.590929 +0.415373 0.616166 0.590929 +0.432594 0.616166 0.590929 +0.448839 0.616166 0.590929 +0.464192 0.616166 0.590929 +0.478729 0.616166 0.590929 +0.492515 0.616166 0.590929 +0.505612 0.616166 0.590929 +0.518072 0.616166 0.590929 +0.529943 0.616166 0.590929 +0.541266 0.616166 0.590929 +0.552083 0.616166 0.590929 +0.562427 0.616166 0.590929 +0.572331 0.616166 0.590929 +0.581823 0.616166 0.590929 +0.590929 0.616166 0.590929 +0.599674 0.616166 0.590929 +0.608079 0.616166 0.590929 +0.616166 0.616166 0.590929 +0.000001 0.000001 0.599674 +0.037293 0.000001 0.599674 +0.079714 0.000001 0.599674 +0.120832 0.000001 0.599674 +0.159284 0.000001 0.599674 +0.194868 0.000001 0.599674 +0.227530 0.000001 0.599674 +0.257434 0.000001 0.599674 +0.285092 0.000001 0.599674 +0.310738 0.000001 0.599674 +0.334585 0.000001 0.599674 +0.356818 0.000001 0.599674 +0.377602 0.000001 0.599674 +0.397079 0.000001 0.599674 +0.415373 0.000001 0.599674 +0.432594 0.000001 0.599674 +0.448839 0.000001 0.599674 +0.464192 0.000001 0.599674 +0.478729 0.000001 0.599674 +0.492515 0.000001 0.599674 +0.505612 0.000001 0.599674 +0.518072 0.000001 0.599674 +0.529943 0.000001 0.599674 +0.541266 0.000001 0.599674 +0.552083 0.000001 0.599674 +0.562427 0.000001 0.599674 +0.572331 0.000001 0.599674 +0.581823 0.000001 0.599674 +0.590929 0.000001 0.599674 +0.599674 0.000001 0.599674 +0.608079 0.000001 0.599674 +0.616166 0.000001 0.599674 +0.000001 0.037293 0.599674 +0.037293 0.037293 0.599674 +0.079714 0.037293 0.599674 +0.120832 0.037293 0.599674 +0.159284 0.037293 0.599674 +0.194868 0.037293 0.599674 +0.227530 0.037293 0.599674 +0.257434 0.037293 0.599674 +0.285092 0.037293 0.599674 +0.310738 0.037293 0.599674 +0.334585 0.037293 0.599674 +0.356818 0.037293 0.599674 +0.377602 0.037293 0.599674 +0.397079 0.037293 0.599674 +0.415373 0.037293 0.599674 +0.432594 0.037293 0.599674 +0.448839 0.037293 0.599674 +0.464192 0.037293 0.599674 +0.478729 0.037293 0.599674 +0.492515 0.037293 0.599674 +0.505612 0.037293 0.599674 +0.518072 0.037293 0.599674 +0.529943 0.037293 0.599674 +0.541266 0.037293 0.599674 +0.552083 0.037293 0.599674 +0.562427 0.037293 0.599674 +0.572331 0.037293 0.599674 +0.581823 0.037293 0.599674 +0.590929 0.037293 0.599674 +0.599674 0.037293 0.599674 +0.608079 0.037293 0.599674 +0.616166 0.037293 0.599674 +0.000001 0.079714 0.599674 +0.037293 0.079714 0.599674 +0.079714 0.079714 0.599674 +0.120832 0.079714 0.599674 +0.159284 0.079714 0.599674 +0.194868 0.079714 0.599674 +0.227530 0.079714 0.599674 +0.257434 0.079714 0.599674 +0.285092 0.079714 0.599674 +0.310738 0.079714 0.599674 +0.334585 0.079714 0.599674 +0.356818 0.079714 0.599674 +0.377602 0.079714 0.599674 +0.397079 0.079714 0.599674 +0.415373 0.079714 0.599674 +0.432594 0.079714 0.599674 +0.448839 0.079714 0.599674 +0.464192 0.079714 0.599674 +0.478729 0.079714 0.599674 +0.492515 0.079714 0.599674 +0.505612 0.079714 0.599674 +0.518072 0.079714 0.599674 +0.529943 0.079714 0.599674 +0.541266 0.079714 0.599674 +0.552083 0.079714 0.599674 +0.562427 0.079714 0.599674 +0.572331 0.079714 0.599674 +0.581823 0.079714 0.599674 +0.590929 0.079714 0.599674 +0.599674 0.079714 0.599674 +0.608079 0.079714 0.599674 +0.616166 0.079714 0.599674 +0.000001 0.120832 0.599674 +0.037293 0.120832 0.599674 +0.079714 0.120832 0.599674 +0.120832 0.120832 0.599674 +0.159284 0.120832 0.599674 +0.194868 0.120832 0.599674 +0.227530 0.120832 0.599674 +0.257434 0.120832 0.599674 +0.285092 0.120832 0.599674 +0.310738 0.120832 0.599674 +0.334585 0.120832 0.599674 +0.356818 0.120832 0.599674 +0.377602 0.120832 0.599674 +0.397079 0.120832 0.599674 +0.415373 0.120832 0.599674 +0.432594 0.120832 0.599674 +0.448839 0.120832 0.599674 +0.464192 0.120832 0.599674 +0.478729 0.120832 0.599674 +0.492515 0.120832 0.599674 +0.505612 0.120832 0.599674 +0.518072 0.120832 0.599674 +0.529943 0.120832 0.599674 +0.541266 0.120832 0.599674 +0.552083 0.120832 0.599674 +0.562427 0.120832 0.599674 +0.572331 0.120832 0.599674 +0.581823 0.120832 0.599674 +0.590929 0.120832 0.599674 +0.599674 0.120832 0.599674 +0.608079 0.120832 0.599674 +0.616166 0.120832 0.599674 +0.000001 0.159284 0.599674 +0.037293 0.159284 0.599674 +0.079714 0.159284 0.599674 +0.120832 0.159284 0.599674 +0.159284 0.159284 0.599674 +0.194868 0.159284 0.599674 +0.227530 0.159284 0.599674 +0.257434 0.159284 0.599674 +0.285092 0.159284 0.599674 +0.310738 0.159284 0.599674 +0.334585 0.159284 0.599674 +0.356818 0.159284 0.599674 +0.377602 0.159284 0.599674 +0.397079 0.159284 0.599674 +0.415373 0.159284 0.599674 +0.432594 0.159284 0.599674 +0.448839 0.159284 0.599674 +0.464192 0.159284 0.599674 +0.478729 0.159284 0.599674 +0.492515 0.159284 0.599674 +0.505612 0.159284 0.599674 +0.518072 0.159284 0.599674 +0.529943 0.159284 0.599674 +0.541266 0.159284 0.599674 +0.552083 0.159284 0.599674 +0.562427 0.159284 0.599674 +0.572331 0.159284 0.599674 +0.581823 0.159284 0.599674 +0.590929 0.159284 0.599674 +0.599674 0.159284 0.599674 +0.608079 0.159284 0.599674 +0.616166 0.159284 0.599674 +0.000001 0.194868 0.599674 +0.037293 0.194868 0.599674 +0.079714 0.194868 0.599674 +0.120832 0.194868 0.599674 +0.159284 0.194868 0.599674 +0.194868 0.194868 0.599674 +0.227530 0.194868 0.599674 +0.257434 0.194868 0.599674 +0.285092 0.194868 0.599674 +0.310738 0.194868 0.599674 +0.334585 0.194868 0.599674 +0.356818 0.194868 0.599674 +0.377602 0.194868 0.599674 +0.397079 0.194868 0.599674 +0.415373 0.194868 0.599674 +0.432594 0.194868 0.599674 +0.448839 0.194868 0.599674 +0.464192 0.194868 0.599674 +0.478729 0.194868 0.599674 +0.492515 0.194868 0.599674 +0.505612 0.194868 0.599674 +0.518072 0.194868 0.599674 +0.529943 0.194868 0.599674 +0.541266 0.194868 0.599674 +0.552083 0.194868 0.599674 +0.562427 0.194868 0.599674 +0.572331 0.194868 0.599674 +0.581823 0.194868 0.599674 +0.590929 0.194868 0.599674 +0.599674 0.194868 0.599674 +0.608079 0.194868 0.599674 +0.616166 0.194868 0.599674 +0.000001 0.227530 0.599674 +0.037293 0.227530 0.599674 +0.079714 0.227530 0.599674 +0.120832 0.227530 0.599674 +0.159284 0.227530 0.599674 +0.194868 0.227530 0.599674 +0.227530 0.227530 0.599674 +0.257434 0.227530 0.599674 +0.285092 0.227530 0.599674 +0.310738 0.227530 0.599674 +0.334585 0.227530 0.599674 +0.356818 0.227530 0.599674 +0.377602 0.227530 0.599674 +0.397079 0.227530 0.599674 +0.415373 0.227530 0.599674 +0.432594 0.227530 0.599674 +0.448839 0.227530 0.599674 +0.464192 0.227530 0.599674 +0.478729 0.227530 0.599674 +0.492515 0.227530 0.599674 +0.505612 0.227530 0.599674 +0.518072 0.227530 0.599674 +0.529943 0.227530 0.599674 +0.541266 0.227530 0.599674 +0.552083 0.227530 0.599674 +0.562427 0.227530 0.599674 +0.572331 0.227530 0.599674 +0.581823 0.227530 0.599674 +0.590929 0.227530 0.599674 +0.599674 0.227530 0.599674 +0.608079 0.227530 0.599674 +0.616166 0.227530 0.599674 +0.000001 0.257434 0.599674 +0.037293 0.257434 0.599674 +0.079714 0.257434 0.599674 +0.120832 0.257434 0.599674 +0.159284 0.257434 0.599674 +0.194868 0.257434 0.599674 +0.227530 0.257434 0.599674 +0.257434 0.257434 0.599674 +0.285092 0.257434 0.599674 +0.310738 0.257434 0.599674 +0.334585 0.257434 0.599674 +0.356818 0.257434 0.599674 +0.377602 0.257434 0.599674 +0.397079 0.257434 0.599674 +0.415373 0.257434 0.599674 +0.432594 0.257434 0.599674 +0.448839 0.257434 0.599674 +0.464192 0.257434 0.599674 +0.478729 0.257434 0.599674 +0.492515 0.257434 0.599674 +0.505612 0.257434 0.599674 +0.518072 0.257434 0.599674 +0.529943 0.257434 0.599674 +0.541266 0.257434 0.599674 +0.552083 0.257434 0.599674 +0.562427 0.257434 0.599674 +0.572331 0.257434 0.599674 +0.581823 0.257434 0.599674 +0.590929 0.257434 0.599674 +0.599674 0.257434 0.599674 +0.608079 0.257434 0.599674 +0.616166 0.257434 0.599674 +0.000001 0.285092 0.599674 +0.037293 0.285092 0.599674 +0.079714 0.285092 0.599674 +0.120832 0.285092 0.599674 +0.159284 0.285092 0.599674 +0.194868 0.285092 0.599674 +0.227530 0.285092 0.599674 +0.257434 0.285092 0.599674 +0.285092 0.285092 0.599674 +0.310738 0.285092 0.599674 +0.334585 0.285092 0.599674 +0.356818 0.285092 0.599674 +0.377602 0.285092 0.599674 +0.397079 0.285092 0.599674 +0.415373 0.285092 0.599674 +0.432594 0.285092 0.599674 +0.448839 0.285092 0.599674 +0.464192 0.285092 0.599674 +0.478729 0.285092 0.599674 +0.492515 0.285092 0.599674 +0.505612 0.285092 0.599674 +0.518072 0.285092 0.599674 +0.529943 0.285092 0.599674 +0.541266 0.285092 0.599674 +0.552083 0.285092 0.599674 +0.562427 0.285092 0.599674 +0.572331 0.285092 0.599674 +0.581823 0.285092 0.599674 +0.590929 0.285092 0.599674 +0.599674 0.285092 0.599674 +0.608079 0.285092 0.599674 +0.616166 0.285092 0.599674 +0.000001 0.310738 0.599674 +0.037293 0.310738 0.599674 +0.079714 0.310738 0.599674 +0.120832 0.310738 0.599674 +0.159284 0.310738 0.599674 +0.194868 0.310738 0.599674 +0.227530 0.310738 0.599674 +0.257434 0.310738 0.599674 +0.285092 0.310738 0.599674 +0.310738 0.310738 0.599674 +0.334585 0.310738 0.599674 +0.356818 0.310738 0.599674 +0.377602 0.310738 0.599674 +0.397079 0.310738 0.599674 +0.415373 0.310738 0.599674 +0.432594 0.310738 0.599674 +0.448839 0.310738 0.599674 +0.464192 0.310738 0.599674 +0.478729 0.310738 0.599674 +0.492515 0.310738 0.599674 +0.505612 0.310738 0.599674 +0.518072 0.310738 0.599674 +0.529943 0.310738 0.599674 +0.541266 0.310738 0.599674 +0.552083 0.310738 0.599674 +0.562427 0.310738 0.599674 +0.572331 0.310738 0.599674 +0.581823 0.310738 0.599674 +0.590929 0.310738 0.599674 +0.599674 0.310738 0.599674 +0.608079 0.310738 0.599674 +0.616166 0.310738 0.599674 +0.000001 0.334585 0.599674 +0.037293 0.334585 0.599674 +0.079714 0.334585 0.599674 +0.120832 0.334585 0.599674 +0.159284 0.334585 0.599674 +0.194868 0.334585 0.599674 +0.227530 0.334585 0.599674 +0.257434 0.334585 0.599674 +0.285092 0.334585 0.599674 +0.310738 0.334585 0.599674 +0.334585 0.334585 0.599674 +0.356818 0.334585 0.599674 +0.377602 0.334585 0.599674 +0.397079 0.334585 0.599674 +0.415373 0.334585 0.599674 +0.432594 0.334585 0.599674 +0.448839 0.334585 0.599674 +0.464192 0.334585 0.599674 +0.478729 0.334585 0.599674 +0.492515 0.334585 0.599674 +0.505612 0.334585 0.599674 +0.518072 0.334585 0.599674 +0.529943 0.334585 0.599674 +0.541266 0.334585 0.599674 +0.552083 0.334585 0.599674 +0.562427 0.334585 0.599674 +0.572331 0.334585 0.599674 +0.581823 0.334585 0.599674 +0.590929 0.334585 0.599674 +0.599674 0.334585 0.599674 +0.608079 0.334585 0.599674 +0.616166 0.334585 0.599674 +0.000001 0.356818 0.599674 +0.037293 0.356818 0.599674 +0.079714 0.356818 0.599674 +0.120832 0.356818 0.599674 +0.159284 0.356818 0.599674 +0.194868 0.356818 0.599674 +0.227530 0.356818 0.599674 +0.257434 0.356818 0.599674 +0.285092 0.356818 0.599674 +0.310738 0.356818 0.599674 +0.334585 0.356818 0.599674 +0.356818 0.356818 0.599674 +0.377602 0.356818 0.599674 +0.397079 0.356818 0.599674 +0.415373 0.356818 0.599674 +0.432594 0.356818 0.599674 +0.448839 0.356818 0.599674 +0.464192 0.356818 0.599674 +0.478729 0.356818 0.599674 +0.492515 0.356818 0.599674 +0.505612 0.356818 0.599674 +0.518072 0.356818 0.599674 +0.529943 0.356818 0.599674 +0.541266 0.356818 0.599674 +0.552083 0.356818 0.599674 +0.562427 0.356818 0.599674 +0.572331 0.356818 0.599674 +0.581823 0.356818 0.599674 +0.590929 0.356818 0.599674 +0.599674 0.356818 0.599674 +0.608079 0.356818 0.599674 +0.616166 0.356818 0.599674 +0.000001 0.377602 0.599674 +0.037293 0.377602 0.599674 +0.079714 0.377602 0.599674 +0.120832 0.377602 0.599674 +0.159284 0.377602 0.599674 +0.194868 0.377602 0.599674 +0.227530 0.377602 0.599674 +0.257434 0.377602 0.599674 +0.285092 0.377602 0.599674 +0.310738 0.377602 0.599674 +0.334585 0.377602 0.599674 +0.356818 0.377602 0.599674 +0.377602 0.377602 0.599674 +0.397079 0.377602 0.599674 +0.415373 0.377602 0.599674 +0.432594 0.377602 0.599674 +0.448839 0.377602 0.599674 +0.464192 0.377602 0.599674 +0.478729 0.377602 0.599674 +0.492515 0.377602 0.599674 +0.505612 0.377602 0.599674 +0.518072 0.377602 0.599674 +0.529943 0.377602 0.599674 +0.541266 0.377602 0.599674 +0.552083 0.377602 0.599674 +0.562427 0.377602 0.599674 +0.572331 0.377602 0.599674 +0.581823 0.377602 0.599674 +0.590929 0.377602 0.599674 +0.599674 0.377602 0.599674 +0.608079 0.377602 0.599674 +0.616166 0.377602 0.599674 +0.000001 0.397079 0.599674 +0.037293 0.397079 0.599674 +0.079714 0.397079 0.599674 +0.120832 0.397079 0.599674 +0.159284 0.397079 0.599674 +0.194868 0.397079 0.599674 +0.227530 0.397079 0.599674 +0.257434 0.397079 0.599674 +0.285092 0.397079 0.599674 +0.310738 0.397079 0.599674 +0.334585 0.397079 0.599674 +0.356818 0.397079 0.599674 +0.377602 0.397079 0.599674 +0.397079 0.397079 0.599674 +0.415373 0.397079 0.599674 +0.432594 0.397079 0.599674 +0.448839 0.397079 0.599674 +0.464192 0.397079 0.599674 +0.478729 0.397079 0.599674 +0.492515 0.397079 0.599674 +0.505612 0.397079 0.599674 +0.518072 0.397079 0.599674 +0.529943 0.397079 0.599674 +0.541266 0.397079 0.599674 +0.552083 0.397079 0.599674 +0.562427 0.397079 0.599674 +0.572331 0.397079 0.599674 +0.581823 0.397079 0.599674 +0.590929 0.397079 0.599674 +0.599674 0.397079 0.599674 +0.608079 0.397079 0.599674 +0.616166 0.397079 0.599674 +0.000001 0.415373 0.599674 +0.037293 0.415373 0.599674 +0.079714 0.415373 0.599674 +0.120832 0.415373 0.599674 +0.159284 0.415373 0.599674 +0.194868 0.415373 0.599674 +0.227530 0.415373 0.599674 +0.257434 0.415373 0.599674 +0.285092 0.415373 0.599674 +0.310738 0.415373 0.599674 +0.334585 0.415373 0.599674 +0.356818 0.415373 0.599674 +0.377602 0.415373 0.599674 +0.397079 0.415373 0.599674 +0.415373 0.415373 0.599674 +0.432594 0.415373 0.599674 +0.448839 0.415373 0.599674 +0.464192 0.415373 0.599674 +0.478729 0.415373 0.599674 +0.492515 0.415373 0.599674 +0.505612 0.415373 0.599674 +0.518072 0.415373 0.599674 +0.529943 0.415373 0.599674 +0.541266 0.415373 0.599674 +0.552083 0.415373 0.599674 +0.562427 0.415373 0.599674 +0.572331 0.415373 0.599674 +0.581823 0.415373 0.599674 +0.590929 0.415373 0.599674 +0.599674 0.415373 0.599674 +0.608079 0.415373 0.599674 +0.616166 0.415373 0.599674 +0.000001 0.432594 0.599674 +0.037293 0.432594 0.599674 +0.079714 0.432594 0.599674 +0.120832 0.432594 0.599674 +0.159284 0.432594 0.599674 +0.194868 0.432594 0.599674 +0.227530 0.432594 0.599674 +0.257434 0.432594 0.599674 +0.285092 0.432594 0.599674 +0.310738 0.432594 0.599674 +0.334585 0.432594 0.599674 +0.356818 0.432594 0.599674 +0.377602 0.432594 0.599674 +0.397079 0.432594 0.599674 +0.415373 0.432594 0.599674 +0.432594 0.432594 0.599674 +0.448839 0.432594 0.599674 +0.464192 0.432594 0.599674 +0.478729 0.432594 0.599674 +0.492515 0.432594 0.599674 +0.505612 0.432594 0.599674 +0.518072 0.432594 0.599674 +0.529943 0.432594 0.599674 +0.541266 0.432594 0.599674 +0.552083 0.432594 0.599674 +0.562427 0.432594 0.599674 +0.572331 0.432594 0.599674 +0.581823 0.432594 0.599674 +0.590929 0.432594 0.599674 +0.599674 0.432594 0.599674 +0.608079 0.432594 0.599674 +0.616166 0.432594 0.599674 +0.000001 0.448839 0.599674 +0.037293 0.448839 0.599674 +0.079714 0.448839 0.599674 +0.120832 0.448839 0.599674 +0.159284 0.448839 0.599674 +0.194868 0.448839 0.599674 +0.227530 0.448839 0.599674 +0.257434 0.448839 0.599674 +0.285092 0.448839 0.599674 +0.310738 0.448839 0.599674 +0.334585 0.448839 0.599674 +0.356818 0.448839 0.599674 +0.377602 0.448839 0.599674 +0.397079 0.448839 0.599674 +0.415373 0.448839 0.599674 +0.432594 0.448839 0.599674 +0.448839 0.448839 0.599674 +0.464192 0.448839 0.599674 +0.478729 0.448839 0.599674 +0.492515 0.448839 0.599674 +0.505612 0.448839 0.599674 +0.518072 0.448839 0.599674 +0.529943 0.448839 0.599674 +0.541266 0.448839 0.599674 +0.552083 0.448839 0.599674 +0.562427 0.448839 0.599674 +0.572331 0.448839 0.599674 +0.581823 0.448839 0.599674 +0.590929 0.448839 0.599674 +0.599674 0.448839 0.599674 +0.608079 0.448839 0.599674 +0.616166 0.448839 0.599674 +0.000001 0.464192 0.599674 +0.037293 0.464192 0.599674 +0.079714 0.464192 0.599674 +0.120832 0.464192 0.599674 +0.159284 0.464192 0.599674 +0.194868 0.464192 0.599674 +0.227530 0.464192 0.599674 +0.257434 0.464192 0.599674 +0.285092 0.464192 0.599674 +0.310738 0.464192 0.599674 +0.334585 0.464192 0.599674 +0.356818 0.464192 0.599674 +0.377602 0.464192 0.599674 +0.397079 0.464192 0.599674 +0.415373 0.464192 0.599674 +0.432594 0.464192 0.599674 +0.448839 0.464192 0.599674 +0.464192 0.464192 0.599674 +0.478729 0.464192 0.599674 +0.492515 0.464192 0.599674 +0.505612 0.464192 0.599674 +0.518072 0.464192 0.599674 +0.529943 0.464192 0.599674 +0.541266 0.464192 0.599674 +0.552083 0.464192 0.599674 +0.562427 0.464192 0.599674 +0.572331 0.464192 0.599674 +0.581823 0.464192 0.599674 +0.590929 0.464192 0.599674 +0.599674 0.464192 0.599674 +0.608079 0.464192 0.599674 +0.616166 0.464192 0.599674 +0.000001 0.478729 0.599674 +0.037293 0.478729 0.599674 +0.079714 0.478729 0.599674 +0.120832 0.478729 0.599674 +0.159284 0.478729 0.599674 +0.194868 0.478729 0.599674 +0.227530 0.478729 0.599674 +0.257434 0.478729 0.599674 +0.285092 0.478729 0.599674 +0.310738 0.478729 0.599674 +0.334585 0.478729 0.599674 +0.356818 0.478729 0.599674 +0.377602 0.478729 0.599674 +0.397079 0.478729 0.599674 +0.415373 0.478729 0.599674 +0.432594 0.478729 0.599674 +0.448839 0.478729 0.599674 +0.464192 0.478729 0.599674 +0.478729 0.478729 0.599674 +0.492515 0.478729 0.599674 +0.505612 0.478729 0.599674 +0.518072 0.478729 0.599674 +0.529943 0.478729 0.599674 +0.541266 0.478729 0.599674 +0.552083 0.478729 0.599674 +0.562427 0.478729 0.599674 +0.572331 0.478729 0.599674 +0.581823 0.478729 0.599674 +0.590929 0.478729 0.599674 +0.599674 0.478729 0.599674 +0.608079 0.478729 0.599674 +0.616166 0.478729 0.599674 +0.000001 0.492515 0.599674 +0.037293 0.492515 0.599674 +0.079714 0.492515 0.599674 +0.120832 0.492515 0.599674 +0.159284 0.492515 0.599674 +0.194868 0.492515 0.599674 +0.227530 0.492515 0.599674 +0.257434 0.492515 0.599674 +0.285092 0.492515 0.599674 +0.310738 0.492515 0.599674 +0.334585 0.492515 0.599674 +0.356818 0.492515 0.599674 +0.377602 0.492515 0.599674 +0.397079 0.492515 0.599674 +0.415373 0.492515 0.599674 +0.432594 0.492515 0.599674 +0.448839 0.492515 0.599674 +0.464192 0.492515 0.599674 +0.478729 0.492515 0.599674 +0.492515 0.492515 0.599674 +0.505612 0.492515 0.599674 +0.518072 0.492515 0.599674 +0.529943 0.492515 0.599674 +0.541266 0.492515 0.599674 +0.552083 0.492515 0.599674 +0.562427 0.492515 0.599674 +0.572331 0.492515 0.599674 +0.581823 0.492515 0.599674 +0.590929 0.492515 0.599674 +0.599674 0.492515 0.599674 +0.608079 0.492515 0.599674 +0.616166 0.492515 0.599674 +0.000001 0.505612 0.599674 +0.037293 0.505612 0.599674 +0.079714 0.505612 0.599674 +0.120832 0.505612 0.599674 +0.159284 0.505612 0.599674 +0.194868 0.505612 0.599674 +0.227530 0.505612 0.599674 +0.257434 0.505612 0.599674 +0.285092 0.505612 0.599674 +0.310738 0.505612 0.599674 +0.334585 0.505612 0.599674 +0.356818 0.505612 0.599674 +0.377602 0.505612 0.599674 +0.397079 0.505612 0.599674 +0.415373 0.505612 0.599674 +0.432594 0.505612 0.599674 +0.448839 0.505612 0.599674 +0.464192 0.505612 0.599674 +0.478729 0.505612 0.599674 +0.492515 0.505612 0.599674 +0.505612 0.505612 0.599674 +0.518072 0.505612 0.599674 +0.529943 0.505612 0.599674 +0.541266 0.505612 0.599674 +0.552083 0.505612 0.599674 +0.562427 0.505612 0.599674 +0.572331 0.505612 0.599674 +0.581823 0.505612 0.599674 +0.590929 0.505612 0.599674 +0.599674 0.505612 0.599674 +0.608079 0.505612 0.599674 +0.616166 0.505612 0.599674 +0.000001 0.518072 0.599674 +0.037293 0.518072 0.599674 +0.079714 0.518072 0.599674 +0.120832 0.518072 0.599674 +0.159284 0.518072 0.599674 +0.194868 0.518072 0.599674 +0.227530 0.518072 0.599674 +0.257434 0.518072 0.599674 +0.285092 0.518072 0.599674 +0.310738 0.518072 0.599674 +0.334585 0.518072 0.599674 +0.356818 0.518072 0.599674 +0.377602 0.518072 0.599674 +0.397079 0.518072 0.599674 +0.415373 0.518072 0.599674 +0.432594 0.518072 0.599674 +0.448839 0.518072 0.599674 +0.464192 0.518072 0.599674 +0.478729 0.518072 0.599674 +0.492515 0.518072 0.599674 +0.505612 0.518072 0.599674 +0.518072 0.518072 0.599674 +0.529943 0.518072 0.599674 +0.541266 0.518072 0.599674 +0.552083 0.518072 0.599674 +0.562427 0.518072 0.599674 +0.572331 0.518072 0.599674 +0.581823 0.518072 0.599674 +0.590929 0.518072 0.599674 +0.599674 0.518072 0.599674 +0.608079 0.518072 0.599674 +0.616166 0.518072 0.599674 +0.000001 0.529943 0.599674 +0.037293 0.529943 0.599674 +0.079714 0.529943 0.599674 +0.120832 0.529943 0.599674 +0.159284 0.529943 0.599674 +0.194868 0.529943 0.599674 +0.227530 0.529943 0.599674 +0.257434 0.529943 0.599674 +0.285092 0.529943 0.599674 +0.310738 0.529943 0.599674 +0.334585 0.529943 0.599674 +0.356818 0.529943 0.599674 +0.377602 0.529943 0.599674 +0.397079 0.529943 0.599674 +0.415373 0.529943 0.599674 +0.432594 0.529943 0.599674 +0.448839 0.529943 0.599674 +0.464192 0.529943 0.599674 +0.478729 0.529943 0.599674 +0.492515 0.529943 0.599674 +0.505612 0.529943 0.599674 +0.518072 0.529943 0.599674 +0.529943 0.529943 0.599674 +0.541266 0.529943 0.599674 +0.552083 0.529943 0.599674 +0.562427 0.529943 0.599674 +0.572331 0.529943 0.599674 +0.581823 0.529943 0.599674 +0.590929 0.529943 0.599674 +0.599674 0.529943 0.599674 +0.608079 0.529943 0.599674 +0.616166 0.529943 0.599674 +0.000001 0.541266 0.599674 +0.037293 0.541266 0.599674 +0.079714 0.541266 0.599674 +0.120832 0.541266 0.599674 +0.159284 0.541266 0.599674 +0.194868 0.541266 0.599674 +0.227530 0.541266 0.599674 +0.257434 0.541266 0.599674 +0.285092 0.541266 0.599674 +0.310738 0.541266 0.599674 +0.334585 0.541266 0.599674 +0.356818 0.541266 0.599674 +0.377602 0.541266 0.599674 +0.397079 0.541266 0.599674 +0.415373 0.541266 0.599674 +0.432594 0.541266 0.599674 +0.448839 0.541266 0.599674 +0.464192 0.541266 0.599674 +0.478729 0.541266 0.599674 +0.492515 0.541266 0.599674 +0.505612 0.541266 0.599674 +0.518072 0.541266 0.599674 +0.529943 0.541266 0.599674 +0.541266 0.541266 0.599674 +0.552083 0.541266 0.599674 +0.562427 0.541266 0.599674 +0.572331 0.541266 0.599674 +0.581823 0.541266 0.599674 +0.590929 0.541266 0.599674 +0.599674 0.541266 0.599674 +0.608079 0.541266 0.599674 +0.616166 0.541266 0.599674 +0.000001 0.552083 0.599674 +0.037293 0.552083 0.599674 +0.079714 0.552083 0.599674 +0.120832 0.552083 0.599674 +0.159284 0.552083 0.599674 +0.194868 0.552083 0.599674 +0.227530 0.552083 0.599674 +0.257434 0.552083 0.599674 +0.285092 0.552083 0.599674 +0.310738 0.552083 0.599674 +0.334585 0.552083 0.599674 +0.356818 0.552083 0.599674 +0.377602 0.552083 0.599674 +0.397079 0.552083 0.599674 +0.415373 0.552083 0.599674 +0.432594 0.552083 0.599674 +0.448839 0.552083 0.599674 +0.464192 0.552083 0.599674 +0.478729 0.552083 0.599674 +0.492515 0.552083 0.599674 +0.505612 0.552083 0.599674 +0.518072 0.552083 0.599674 +0.529943 0.552083 0.599674 +0.541266 0.552083 0.599674 +0.552083 0.552083 0.599674 +0.562427 0.552083 0.599674 +0.572331 0.552083 0.599674 +0.581823 0.552083 0.599674 +0.590929 0.552083 0.599674 +0.599674 0.552083 0.599674 +0.608079 0.552083 0.599674 +0.616166 0.552083 0.599674 +0.000001 0.562427 0.599674 +0.037293 0.562427 0.599674 +0.079714 0.562427 0.599674 +0.120832 0.562427 0.599674 +0.159284 0.562427 0.599674 +0.194868 0.562427 0.599674 +0.227530 0.562427 0.599674 +0.257434 0.562427 0.599674 +0.285092 0.562427 0.599674 +0.310738 0.562427 0.599674 +0.334585 0.562427 0.599674 +0.356818 0.562427 0.599674 +0.377602 0.562427 0.599674 +0.397079 0.562427 0.599674 +0.415373 0.562427 0.599674 +0.432594 0.562427 0.599674 +0.448839 0.562427 0.599674 +0.464192 0.562427 0.599674 +0.478729 0.562427 0.599674 +0.492515 0.562427 0.599674 +0.505612 0.562427 0.599674 +0.518072 0.562427 0.599674 +0.529943 0.562427 0.599674 +0.541266 0.562427 0.599674 +0.552083 0.562427 0.599674 +0.562427 0.562427 0.599674 +0.572331 0.562427 0.599674 +0.581823 0.562427 0.599674 +0.590929 0.562427 0.599674 +0.599674 0.562427 0.599674 +0.608079 0.562427 0.599674 +0.616166 0.562427 0.599674 +0.000001 0.572331 0.599674 +0.037293 0.572331 0.599674 +0.079714 0.572331 0.599674 +0.120832 0.572331 0.599674 +0.159284 0.572331 0.599674 +0.194868 0.572331 0.599674 +0.227530 0.572331 0.599674 +0.257434 0.572331 0.599674 +0.285092 0.572331 0.599674 +0.310738 0.572331 0.599674 +0.334585 0.572331 0.599674 +0.356818 0.572331 0.599674 +0.377602 0.572331 0.599674 +0.397079 0.572331 0.599674 +0.415373 0.572331 0.599674 +0.432594 0.572331 0.599674 +0.448839 0.572331 0.599674 +0.464192 0.572331 0.599674 +0.478729 0.572331 0.599674 +0.492515 0.572331 0.599674 +0.505612 0.572331 0.599674 +0.518072 0.572331 0.599674 +0.529943 0.572331 0.599674 +0.541266 0.572331 0.599674 +0.552083 0.572331 0.599674 +0.562427 0.572331 0.599674 +0.572331 0.572331 0.599674 +0.581823 0.572331 0.599674 +0.590929 0.572331 0.599674 +0.599674 0.572331 0.599674 +0.608079 0.572331 0.599674 +0.616166 0.572331 0.599674 +0.000001 0.581823 0.599674 +0.037293 0.581823 0.599674 +0.079714 0.581823 0.599674 +0.120832 0.581823 0.599674 +0.159284 0.581823 0.599674 +0.194868 0.581823 0.599674 +0.227530 0.581823 0.599674 +0.257434 0.581823 0.599674 +0.285092 0.581823 0.599674 +0.310738 0.581823 0.599674 +0.334585 0.581823 0.599674 +0.356818 0.581823 0.599674 +0.377602 0.581823 0.599674 +0.397079 0.581823 0.599674 +0.415373 0.581823 0.599674 +0.432594 0.581823 0.599674 +0.448839 0.581823 0.599674 +0.464192 0.581823 0.599674 +0.478729 0.581823 0.599674 +0.492515 0.581823 0.599674 +0.505612 0.581823 0.599674 +0.518072 0.581823 0.599674 +0.529943 0.581823 0.599674 +0.541266 0.581823 0.599674 +0.552083 0.581823 0.599674 +0.562427 0.581823 0.599674 +0.572331 0.581823 0.599674 +0.581823 0.581823 0.599674 +0.590929 0.581823 0.599674 +0.599674 0.581823 0.599674 +0.608079 0.581823 0.599674 +0.616166 0.581823 0.599674 +0.000001 0.590929 0.599674 +0.037293 0.590929 0.599674 +0.079714 0.590929 0.599674 +0.120832 0.590929 0.599674 +0.159284 0.590929 0.599674 +0.194868 0.590929 0.599674 +0.227530 0.590929 0.599674 +0.257434 0.590929 0.599674 +0.285092 0.590929 0.599674 +0.310738 0.590929 0.599674 +0.334585 0.590929 0.599674 +0.356818 0.590929 0.599674 +0.377602 0.590929 0.599674 +0.397079 0.590929 0.599674 +0.415373 0.590929 0.599674 +0.432594 0.590929 0.599674 +0.448839 0.590929 0.599674 +0.464192 0.590929 0.599674 +0.478729 0.590929 0.599674 +0.492515 0.590929 0.599674 +0.505612 0.590929 0.599674 +0.518072 0.590929 0.599674 +0.529943 0.590929 0.599674 +0.541266 0.590929 0.599674 +0.552083 0.590929 0.599674 +0.562427 0.590929 0.599674 +0.572331 0.590929 0.599674 +0.581823 0.590929 0.599674 +0.590929 0.590929 0.599674 +0.599674 0.590929 0.599674 +0.608079 0.590929 0.599674 +0.616166 0.590929 0.599674 +0.000001 0.599674 0.599674 +0.037293 0.599674 0.599674 +0.079714 0.599674 0.599674 +0.120832 0.599674 0.599674 +0.159284 0.599674 0.599674 +0.194868 0.599674 0.599674 +0.227530 0.599674 0.599674 +0.257434 0.599674 0.599674 +0.285092 0.599674 0.599674 +0.310738 0.599674 0.599674 +0.334585 0.599674 0.599674 +0.356818 0.599674 0.599674 +0.377602 0.599674 0.599674 +0.397079 0.599674 0.599674 +0.415373 0.599674 0.599674 +0.432594 0.599674 0.599674 +0.448839 0.599674 0.599674 +0.464192 0.599674 0.599674 +0.478729 0.599674 0.599674 +0.492515 0.599674 0.599674 +0.505612 0.599674 0.599674 +0.518072 0.599674 0.599674 +0.529943 0.599674 0.599674 +0.541266 0.599674 0.599674 +0.552083 0.599674 0.599674 +0.562427 0.599674 0.599674 +0.572331 0.599674 0.599674 +0.581823 0.599674 0.599674 +0.590929 0.599674 0.599674 +0.599674 0.599674 0.599674 +0.608079 0.599674 0.599674 +0.616166 0.599674 0.599674 +0.000001 0.608079 0.599674 +0.037293 0.608079 0.599674 +0.079714 0.608079 0.599674 +0.120832 0.608079 0.599674 +0.159284 0.608079 0.599674 +0.194868 0.608079 0.599674 +0.227530 0.608079 0.599674 +0.257434 0.608079 0.599674 +0.285092 0.608079 0.599674 +0.310738 0.608079 0.599674 +0.334585 0.608079 0.599674 +0.356818 0.608079 0.599674 +0.377602 0.608079 0.599674 +0.397079 0.608079 0.599674 +0.415373 0.608079 0.599674 +0.432594 0.608079 0.599674 +0.448839 0.608079 0.599674 +0.464192 0.608079 0.599674 +0.478729 0.608079 0.599674 +0.492515 0.608079 0.599674 +0.505612 0.608079 0.599674 +0.518072 0.608079 0.599674 +0.529943 0.608079 0.599674 +0.541266 0.608079 0.599674 +0.552083 0.608079 0.599674 +0.562427 0.608079 0.599674 +0.572331 0.608079 0.599674 +0.581823 0.608079 0.599674 +0.590929 0.608079 0.599674 +0.599674 0.608079 0.599674 +0.608079 0.608079 0.599674 +0.616166 0.608079 0.599674 +0.000001 0.616166 0.599674 +0.037293 0.616166 0.599674 +0.079714 0.616166 0.599674 +0.120832 0.616166 0.599674 +0.159284 0.616166 0.599674 +0.194868 0.616166 0.599674 +0.227530 0.616166 0.599674 +0.257434 0.616166 0.599674 +0.285092 0.616166 0.599674 +0.310738 0.616166 0.599674 +0.334585 0.616166 0.599674 +0.356818 0.616166 0.599674 +0.377602 0.616166 0.599674 +0.397079 0.616166 0.599674 +0.415373 0.616166 0.599674 +0.432594 0.616166 0.599674 +0.448839 0.616166 0.599674 +0.464192 0.616166 0.599674 +0.478729 0.616166 0.599674 +0.492515 0.616166 0.599674 +0.505612 0.616166 0.599674 +0.518072 0.616166 0.599674 +0.529943 0.616166 0.599674 +0.541266 0.616166 0.599674 +0.552083 0.616166 0.599674 +0.562427 0.616166 0.599674 +0.572331 0.616166 0.599674 +0.581823 0.616166 0.599674 +0.590929 0.616166 0.599674 +0.599674 0.616166 0.599674 +0.608079 0.616166 0.599674 +0.616166 0.616166 0.599674 +0.000001 0.000001 0.608079 +0.037293 0.000001 0.608079 +0.079714 0.000001 0.608079 +0.120832 0.000001 0.608079 +0.159284 0.000001 0.608079 +0.194868 0.000001 0.608079 +0.227530 0.000001 0.608079 +0.257434 0.000001 0.608079 +0.285092 0.000001 0.608079 +0.310738 0.000001 0.608079 +0.334585 0.000001 0.608079 +0.356818 0.000001 0.608079 +0.377602 0.000001 0.608079 +0.397079 0.000001 0.608079 +0.415373 0.000001 0.608079 +0.432594 0.000001 0.608079 +0.448839 0.000001 0.608079 +0.464192 0.000001 0.608079 +0.478729 0.000001 0.608079 +0.492515 0.000001 0.608079 +0.505612 0.000001 0.608079 +0.518072 0.000001 0.608079 +0.529943 0.000001 0.608079 +0.541266 0.000001 0.608079 +0.552083 0.000001 0.608079 +0.562427 0.000001 0.608079 +0.572331 0.000001 0.608079 +0.581823 0.000001 0.608079 +0.590929 0.000001 0.608079 +0.599674 0.000001 0.608079 +0.608079 0.000001 0.608079 +0.616166 0.000001 0.608079 +0.000001 0.037293 0.608079 +0.037293 0.037293 0.608079 +0.079714 0.037293 0.608079 +0.120832 0.037293 0.608079 +0.159284 0.037293 0.608079 +0.194868 0.037293 0.608079 +0.227530 0.037293 0.608079 +0.257434 0.037293 0.608079 +0.285092 0.037293 0.608079 +0.310738 0.037293 0.608079 +0.334585 0.037293 0.608079 +0.356818 0.037293 0.608079 +0.377602 0.037293 0.608079 +0.397079 0.037293 0.608079 +0.415373 0.037293 0.608079 +0.432594 0.037293 0.608079 +0.448839 0.037293 0.608079 +0.464192 0.037293 0.608079 +0.478729 0.037293 0.608079 +0.492515 0.037293 0.608079 +0.505612 0.037293 0.608079 +0.518072 0.037293 0.608079 +0.529943 0.037293 0.608079 +0.541266 0.037293 0.608079 +0.552083 0.037293 0.608079 +0.562427 0.037293 0.608079 +0.572331 0.037293 0.608079 +0.581823 0.037293 0.608079 +0.590929 0.037293 0.608079 +0.599674 0.037293 0.608079 +0.608079 0.037293 0.608079 +0.616166 0.037293 0.608079 +0.000001 0.079714 0.608079 +0.037293 0.079714 0.608079 +0.079714 0.079714 0.608079 +0.120832 0.079714 0.608079 +0.159284 0.079714 0.608079 +0.194868 0.079714 0.608079 +0.227530 0.079714 0.608079 +0.257434 0.079714 0.608079 +0.285092 0.079714 0.608079 +0.310738 0.079714 0.608079 +0.334585 0.079714 0.608079 +0.356818 0.079714 0.608079 +0.377602 0.079714 0.608079 +0.397079 0.079714 0.608079 +0.415373 0.079714 0.608079 +0.432594 0.079714 0.608079 +0.448839 0.079714 0.608079 +0.464192 0.079714 0.608079 +0.478729 0.079714 0.608079 +0.492515 0.079714 0.608079 +0.505612 0.079714 0.608079 +0.518072 0.079714 0.608079 +0.529943 0.079714 0.608079 +0.541266 0.079714 0.608079 +0.552083 0.079714 0.608079 +0.562427 0.079714 0.608079 +0.572331 0.079714 0.608079 +0.581823 0.079714 0.608079 +0.590929 0.079714 0.608079 +0.599674 0.079714 0.608079 +0.608079 0.079714 0.608079 +0.616166 0.079714 0.608079 +0.000001 0.120832 0.608079 +0.037293 0.120832 0.608079 +0.079714 0.120832 0.608079 +0.120832 0.120832 0.608079 +0.159284 0.120832 0.608079 +0.194868 0.120832 0.608079 +0.227530 0.120832 0.608079 +0.257434 0.120832 0.608079 +0.285092 0.120832 0.608079 +0.310738 0.120832 0.608079 +0.334585 0.120832 0.608079 +0.356818 0.120832 0.608079 +0.377602 0.120832 0.608079 +0.397079 0.120832 0.608079 +0.415373 0.120832 0.608079 +0.432594 0.120832 0.608079 +0.448839 0.120832 0.608079 +0.464192 0.120832 0.608079 +0.478729 0.120832 0.608079 +0.492515 0.120832 0.608079 +0.505612 0.120832 0.608079 +0.518072 0.120832 0.608079 +0.529943 0.120832 0.608079 +0.541266 0.120832 0.608079 +0.552083 0.120832 0.608079 +0.562427 0.120832 0.608079 +0.572331 0.120832 0.608079 +0.581823 0.120832 0.608079 +0.590929 0.120832 0.608079 +0.599674 0.120832 0.608079 +0.608079 0.120832 0.608079 +0.616166 0.120832 0.608079 +0.000001 0.159284 0.608079 +0.037293 0.159284 0.608079 +0.079714 0.159284 0.608079 +0.120832 0.159284 0.608079 +0.159284 0.159284 0.608079 +0.194868 0.159284 0.608079 +0.227530 0.159284 0.608079 +0.257434 0.159284 0.608079 +0.285092 0.159284 0.608079 +0.310738 0.159284 0.608079 +0.334585 0.159284 0.608079 +0.356818 0.159284 0.608079 +0.377602 0.159284 0.608079 +0.397079 0.159284 0.608079 +0.415373 0.159284 0.608079 +0.432594 0.159284 0.608079 +0.448839 0.159284 0.608079 +0.464192 0.159284 0.608079 +0.478729 0.159284 0.608079 +0.492515 0.159284 0.608079 +0.505612 0.159284 0.608079 +0.518072 0.159284 0.608079 +0.529943 0.159284 0.608079 +0.541266 0.159284 0.608079 +0.552083 0.159284 0.608079 +0.562427 0.159284 0.608079 +0.572331 0.159284 0.608079 +0.581823 0.159284 0.608079 +0.590929 0.159284 0.608079 +0.599674 0.159284 0.608079 +0.608079 0.159284 0.608079 +0.616166 0.159284 0.608079 +0.000001 0.194868 0.608079 +0.037293 0.194868 0.608079 +0.079714 0.194868 0.608079 +0.120832 0.194868 0.608079 +0.159284 0.194868 0.608079 +0.194868 0.194868 0.608079 +0.227530 0.194868 0.608079 +0.257434 0.194868 0.608079 +0.285092 0.194868 0.608079 +0.310738 0.194868 0.608079 +0.334585 0.194868 0.608079 +0.356818 0.194868 0.608079 +0.377602 0.194868 0.608079 +0.397079 0.194868 0.608079 +0.415373 0.194868 0.608079 +0.432594 0.194868 0.608079 +0.448839 0.194868 0.608079 +0.464192 0.194868 0.608079 +0.478729 0.194868 0.608079 +0.492515 0.194868 0.608079 +0.505612 0.194868 0.608079 +0.518072 0.194868 0.608079 +0.529943 0.194868 0.608079 +0.541266 0.194868 0.608079 +0.552083 0.194868 0.608079 +0.562427 0.194868 0.608079 +0.572331 0.194868 0.608079 +0.581823 0.194868 0.608079 +0.590929 0.194868 0.608079 +0.599674 0.194868 0.608079 +0.608079 0.194868 0.608079 +0.616166 0.194868 0.608079 +0.000001 0.227530 0.608079 +0.037293 0.227530 0.608079 +0.079714 0.227530 0.608079 +0.120832 0.227530 0.608079 +0.159284 0.227530 0.608079 +0.194868 0.227530 0.608079 +0.227530 0.227530 0.608079 +0.257434 0.227530 0.608079 +0.285092 0.227530 0.608079 +0.310738 0.227530 0.608079 +0.334585 0.227530 0.608079 +0.356818 0.227530 0.608079 +0.377602 0.227530 0.608079 +0.397079 0.227530 0.608079 +0.415373 0.227530 0.608079 +0.432594 0.227530 0.608079 +0.448839 0.227530 0.608079 +0.464192 0.227530 0.608079 +0.478729 0.227530 0.608079 +0.492515 0.227530 0.608079 +0.505612 0.227530 0.608079 +0.518072 0.227530 0.608079 +0.529943 0.227530 0.608079 +0.541266 0.227530 0.608079 +0.552083 0.227530 0.608079 +0.562427 0.227530 0.608079 +0.572331 0.227530 0.608079 +0.581823 0.227530 0.608079 +0.590929 0.227530 0.608079 +0.599674 0.227530 0.608079 +0.608079 0.227530 0.608079 +0.616166 0.227530 0.608079 +0.000001 0.257434 0.608079 +0.037293 0.257434 0.608079 +0.079714 0.257434 0.608079 +0.120832 0.257434 0.608079 +0.159284 0.257434 0.608079 +0.194868 0.257434 0.608079 +0.227530 0.257434 0.608079 +0.257434 0.257434 0.608079 +0.285092 0.257434 0.608079 +0.310738 0.257434 0.608079 +0.334585 0.257434 0.608079 +0.356818 0.257434 0.608079 +0.377602 0.257434 0.608079 +0.397079 0.257434 0.608079 +0.415373 0.257434 0.608079 +0.432594 0.257434 0.608079 +0.448839 0.257434 0.608079 +0.464192 0.257434 0.608079 +0.478729 0.257434 0.608079 +0.492515 0.257434 0.608079 +0.505612 0.257434 0.608079 +0.518072 0.257434 0.608079 +0.529943 0.257434 0.608079 +0.541266 0.257434 0.608079 +0.552083 0.257434 0.608079 +0.562427 0.257434 0.608079 +0.572331 0.257434 0.608079 +0.581823 0.257434 0.608079 +0.590929 0.257434 0.608079 +0.599674 0.257434 0.608079 +0.608079 0.257434 0.608079 +0.616166 0.257434 0.608079 +0.000001 0.285092 0.608079 +0.037293 0.285092 0.608079 +0.079714 0.285092 0.608079 +0.120832 0.285092 0.608079 +0.159284 0.285092 0.608079 +0.194868 0.285092 0.608079 +0.227530 0.285092 0.608079 +0.257434 0.285092 0.608079 +0.285092 0.285092 0.608079 +0.310738 0.285092 0.608079 +0.334585 0.285092 0.608079 +0.356818 0.285092 0.608079 +0.377602 0.285092 0.608079 +0.397079 0.285092 0.608079 +0.415373 0.285092 0.608079 +0.432594 0.285092 0.608079 +0.448839 0.285092 0.608079 +0.464192 0.285092 0.608079 +0.478729 0.285092 0.608079 +0.492515 0.285092 0.608079 +0.505612 0.285092 0.608079 +0.518072 0.285092 0.608079 +0.529943 0.285092 0.608079 +0.541266 0.285092 0.608079 +0.552083 0.285092 0.608079 +0.562427 0.285092 0.608079 +0.572331 0.285092 0.608079 +0.581823 0.285092 0.608079 +0.590929 0.285092 0.608079 +0.599674 0.285092 0.608079 +0.608079 0.285092 0.608079 +0.616166 0.285092 0.608079 +0.000001 0.310738 0.608079 +0.037293 0.310738 0.608079 +0.079714 0.310738 0.608079 +0.120832 0.310738 0.608079 +0.159284 0.310738 0.608079 +0.194868 0.310738 0.608079 +0.227530 0.310738 0.608079 +0.257434 0.310738 0.608079 +0.285092 0.310738 0.608079 +0.310738 0.310738 0.608079 +0.334585 0.310738 0.608079 +0.356818 0.310738 0.608079 +0.377602 0.310738 0.608079 +0.397079 0.310738 0.608079 +0.415373 0.310738 0.608079 +0.432594 0.310738 0.608079 +0.448839 0.310738 0.608079 +0.464192 0.310738 0.608079 +0.478729 0.310738 0.608079 +0.492515 0.310738 0.608079 +0.505612 0.310738 0.608079 +0.518072 0.310738 0.608079 +0.529943 0.310738 0.608079 +0.541266 0.310738 0.608079 +0.552083 0.310738 0.608079 +0.562427 0.310738 0.608079 +0.572331 0.310738 0.608079 +0.581823 0.310738 0.608079 +0.590929 0.310738 0.608079 +0.599674 0.310738 0.608079 +0.608079 0.310738 0.608079 +0.616166 0.310738 0.608079 +0.000001 0.334585 0.608079 +0.037293 0.334585 0.608079 +0.079714 0.334585 0.608079 +0.120832 0.334585 0.608079 +0.159284 0.334585 0.608079 +0.194868 0.334585 0.608079 +0.227530 0.334585 0.608079 +0.257434 0.334585 0.608079 +0.285092 0.334585 0.608079 +0.310738 0.334585 0.608079 +0.334585 0.334585 0.608079 +0.356818 0.334585 0.608079 +0.377602 0.334585 0.608079 +0.397079 0.334585 0.608079 +0.415373 0.334585 0.608079 +0.432594 0.334585 0.608079 +0.448839 0.334585 0.608079 +0.464192 0.334585 0.608079 +0.478729 0.334585 0.608079 +0.492515 0.334585 0.608079 +0.505612 0.334585 0.608079 +0.518072 0.334585 0.608079 +0.529943 0.334585 0.608079 +0.541266 0.334585 0.608079 +0.552083 0.334585 0.608079 +0.562427 0.334585 0.608079 +0.572331 0.334585 0.608079 +0.581823 0.334585 0.608079 +0.590929 0.334585 0.608079 +0.599674 0.334585 0.608079 +0.608079 0.334585 0.608079 +0.616166 0.334585 0.608079 +0.000001 0.356818 0.608079 +0.037293 0.356818 0.608079 +0.079714 0.356818 0.608079 +0.120832 0.356818 0.608079 +0.159284 0.356818 0.608079 +0.194868 0.356818 0.608079 +0.227530 0.356818 0.608079 +0.257434 0.356818 0.608079 +0.285092 0.356818 0.608079 +0.310738 0.356818 0.608079 +0.334585 0.356818 0.608079 +0.356818 0.356818 0.608079 +0.377602 0.356818 0.608079 +0.397079 0.356818 0.608079 +0.415373 0.356818 0.608079 +0.432594 0.356818 0.608079 +0.448839 0.356818 0.608079 +0.464192 0.356818 0.608079 +0.478729 0.356818 0.608079 +0.492515 0.356818 0.608079 +0.505612 0.356818 0.608079 +0.518072 0.356818 0.608079 +0.529943 0.356818 0.608079 +0.541266 0.356818 0.608079 +0.552083 0.356818 0.608079 +0.562427 0.356818 0.608079 +0.572331 0.356818 0.608079 +0.581823 0.356818 0.608079 +0.590929 0.356818 0.608079 +0.599674 0.356818 0.608079 +0.608079 0.356818 0.608079 +0.616166 0.356818 0.608079 +0.000001 0.377602 0.608079 +0.037293 0.377602 0.608079 +0.079714 0.377602 0.608079 +0.120832 0.377602 0.608079 +0.159284 0.377602 0.608079 +0.194868 0.377602 0.608079 +0.227530 0.377602 0.608079 +0.257434 0.377602 0.608079 +0.285092 0.377602 0.608079 +0.310738 0.377602 0.608079 +0.334585 0.377602 0.608079 +0.356818 0.377602 0.608079 +0.377602 0.377602 0.608079 +0.397079 0.377602 0.608079 +0.415373 0.377602 0.608079 +0.432594 0.377602 0.608079 +0.448839 0.377602 0.608079 +0.464192 0.377602 0.608079 +0.478729 0.377602 0.608079 +0.492515 0.377602 0.608079 +0.505612 0.377602 0.608079 +0.518072 0.377602 0.608079 +0.529943 0.377602 0.608079 +0.541266 0.377602 0.608079 +0.552083 0.377602 0.608079 +0.562427 0.377602 0.608079 +0.572331 0.377602 0.608079 +0.581823 0.377602 0.608079 +0.590929 0.377602 0.608079 +0.599674 0.377602 0.608079 +0.608079 0.377602 0.608079 +0.616166 0.377602 0.608079 +0.000001 0.397079 0.608079 +0.037293 0.397079 0.608079 +0.079714 0.397079 0.608079 +0.120832 0.397079 0.608079 +0.159284 0.397079 0.608079 +0.194868 0.397079 0.608079 +0.227530 0.397079 0.608079 +0.257434 0.397079 0.608079 +0.285092 0.397079 0.608079 +0.310738 0.397079 0.608079 +0.334585 0.397079 0.608079 +0.356818 0.397079 0.608079 +0.377602 0.397079 0.608079 +0.397079 0.397079 0.608079 +0.415373 0.397079 0.608079 +0.432594 0.397079 0.608079 +0.448839 0.397079 0.608079 +0.464192 0.397079 0.608079 +0.478729 0.397079 0.608079 +0.492515 0.397079 0.608079 +0.505612 0.397079 0.608079 +0.518072 0.397079 0.608079 +0.529943 0.397079 0.608079 +0.541266 0.397079 0.608079 +0.552083 0.397079 0.608079 +0.562427 0.397079 0.608079 +0.572331 0.397079 0.608079 +0.581823 0.397079 0.608079 +0.590929 0.397079 0.608079 +0.599674 0.397079 0.608079 +0.608079 0.397079 0.608079 +0.616166 0.397079 0.608079 +0.000001 0.415373 0.608079 +0.037293 0.415373 0.608079 +0.079714 0.415373 0.608079 +0.120832 0.415373 0.608079 +0.159284 0.415373 0.608079 +0.194868 0.415373 0.608079 +0.227530 0.415373 0.608079 +0.257434 0.415373 0.608079 +0.285092 0.415373 0.608079 +0.310738 0.415373 0.608079 +0.334585 0.415373 0.608079 +0.356818 0.415373 0.608079 +0.377602 0.415373 0.608079 +0.397079 0.415373 0.608079 +0.415373 0.415373 0.608079 +0.432594 0.415373 0.608079 +0.448839 0.415373 0.608079 +0.464192 0.415373 0.608079 +0.478729 0.415373 0.608079 +0.492515 0.415373 0.608079 +0.505612 0.415373 0.608079 +0.518072 0.415373 0.608079 +0.529943 0.415373 0.608079 +0.541266 0.415373 0.608079 +0.552083 0.415373 0.608079 +0.562427 0.415373 0.608079 +0.572331 0.415373 0.608079 +0.581823 0.415373 0.608079 +0.590929 0.415373 0.608079 +0.599674 0.415373 0.608079 +0.608079 0.415373 0.608079 +0.616166 0.415373 0.608079 +0.000001 0.432594 0.608079 +0.037293 0.432594 0.608079 +0.079714 0.432594 0.608079 +0.120832 0.432594 0.608079 +0.159284 0.432594 0.608079 +0.194868 0.432594 0.608079 +0.227530 0.432594 0.608079 +0.257434 0.432594 0.608079 +0.285092 0.432594 0.608079 +0.310738 0.432594 0.608079 +0.334585 0.432594 0.608079 +0.356818 0.432594 0.608079 +0.377602 0.432594 0.608079 +0.397079 0.432594 0.608079 +0.415373 0.432594 0.608079 +0.432594 0.432594 0.608079 +0.448839 0.432594 0.608079 +0.464192 0.432594 0.608079 +0.478729 0.432594 0.608079 +0.492515 0.432594 0.608079 +0.505612 0.432594 0.608079 +0.518072 0.432594 0.608079 +0.529943 0.432594 0.608079 +0.541266 0.432594 0.608079 +0.552083 0.432594 0.608079 +0.562427 0.432594 0.608079 +0.572331 0.432594 0.608079 +0.581823 0.432594 0.608079 +0.590929 0.432594 0.608079 +0.599674 0.432594 0.608079 +0.608079 0.432594 0.608079 +0.616166 0.432594 0.608079 +0.000001 0.448839 0.608079 +0.037293 0.448839 0.608079 +0.079714 0.448839 0.608079 +0.120832 0.448839 0.608079 +0.159284 0.448839 0.608079 +0.194868 0.448839 0.608079 +0.227530 0.448839 0.608079 +0.257434 0.448839 0.608079 +0.285092 0.448839 0.608079 +0.310738 0.448839 0.608079 +0.334585 0.448839 0.608079 +0.356818 0.448839 0.608079 +0.377602 0.448839 0.608079 +0.397079 0.448839 0.608079 +0.415373 0.448839 0.608079 +0.432594 0.448839 0.608079 +0.448839 0.448839 0.608079 +0.464192 0.448839 0.608079 +0.478729 0.448839 0.608079 +0.492515 0.448839 0.608079 +0.505612 0.448839 0.608079 +0.518072 0.448839 0.608079 +0.529943 0.448839 0.608079 +0.541266 0.448839 0.608079 +0.552083 0.448839 0.608079 +0.562427 0.448839 0.608079 +0.572331 0.448839 0.608079 +0.581823 0.448839 0.608079 +0.590929 0.448839 0.608079 +0.599674 0.448839 0.608079 +0.608079 0.448839 0.608079 +0.616166 0.448839 0.608079 +0.000001 0.464192 0.608079 +0.037293 0.464192 0.608079 +0.079714 0.464192 0.608079 +0.120832 0.464192 0.608079 +0.159284 0.464192 0.608079 +0.194868 0.464192 0.608079 +0.227530 0.464192 0.608079 +0.257434 0.464192 0.608079 +0.285092 0.464192 0.608079 +0.310738 0.464192 0.608079 +0.334585 0.464192 0.608079 +0.356818 0.464192 0.608079 +0.377602 0.464192 0.608079 +0.397079 0.464192 0.608079 +0.415373 0.464192 0.608079 +0.432594 0.464192 0.608079 +0.448839 0.464192 0.608079 +0.464192 0.464192 0.608079 +0.478729 0.464192 0.608079 +0.492515 0.464192 0.608079 +0.505612 0.464192 0.608079 +0.518072 0.464192 0.608079 +0.529943 0.464192 0.608079 +0.541266 0.464192 0.608079 +0.552083 0.464192 0.608079 +0.562427 0.464192 0.608079 +0.572331 0.464192 0.608079 +0.581823 0.464192 0.608079 +0.590929 0.464192 0.608079 +0.599674 0.464192 0.608079 +0.608079 0.464192 0.608079 +0.616166 0.464192 0.608079 +0.000001 0.478729 0.608079 +0.037293 0.478729 0.608079 +0.079714 0.478729 0.608079 +0.120832 0.478729 0.608079 +0.159284 0.478729 0.608079 +0.194868 0.478729 0.608079 +0.227530 0.478729 0.608079 +0.257434 0.478729 0.608079 +0.285092 0.478729 0.608079 +0.310738 0.478729 0.608079 +0.334585 0.478729 0.608079 +0.356818 0.478729 0.608079 +0.377602 0.478729 0.608079 +0.397079 0.478729 0.608079 +0.415373 0.478729 0.608079 +0.432594 0.478729 0.608079 +0.448839 0.478729 0.608079 +0.464192 0.478729 0.608079 +0.478729 0.478729 0.608079 +0.492515 0.478729 0.608079 +0.505612 0.478729 0.608079 +0.518072 0.478729 0.608079 +0.529943 0.478729 0.608079 +0.541266 0.478729 0.608079 +0.552083 0.478729 0.608079 +0.562427 0.478729 0.608079 +0.572331 0.478729 0.608079 +0.581823 0.478729 0.608079 +0.590929 0.478729 0.608079 +0.599674 0.478729 0.608079 +0.608079 0.478729 0.608079 +0.616166 0.478729 0.608079 +0.000001 0.492515 0.608079 +0.037293 0.492515 0.608079 +0.079714 0.492515 0.608079 +0.120832 0.492515 0.608079 +0.159284 0.492515 0.608079 +0.194868 0.492515 0.608079 +0.227530 0.492515 0.608079 +0.257434 0.492515 0.608079 +0.285092 0.492515 0.608079 +0.310738 0.492515 0.608079 +0.334585 0.492515 0.608079 +0.356818 0.492515 0.608079 +0.377602 0.492515 0.608079 +0.397079 0.492515 0.608079 +0.415373 0.492515 0.608079 +0.432594 0.492515 0.608079 +0.448839 0.492515 0.608079 +0.464192 0.492515 0.608079 +0.478729 0.492515 0.608079 +0.492515 0.492515 0.608079 +0.505612 0.492515 0.608079 +0.518072 0.492515 0.608079 +0.529943 0.492515 0.608079 +0.541266 0.492515 0.608079 +0.552083 0.492515 0.608079 +0.562427 0.492515 0.608079 +0.572331 0.492515 0.608079 +0.581823 0.492515 0.608079 +0.590929 0.492515 0.608079 +0.599674 0.492515 0.608079 +0.608079 0.492515 0.608079 +0.616166 0.492515 0.608079 +0.000001 0.505612 0.608079 +0.037293 0.505612 0.608079 +0.079714 0.505612 0.608079 +0.120832 0.505612 0.608079 +0.159284 0.505612 0.608079 +0.194868 0.505612 0.608079 +0.227530 0.505612 0.608079 +0.257434 0.505612 0.608079 +0.285092 0.505612 0.608079 +0.310738 0.505612 0.608079 +0.334585 0.505612 0.608079 +0.356818 0.505612 0.608079 +0.377602 0.505612 0.608079 +0.397079 0.505612 0.608079 +0.415373 0.505612 0.608079 +0.432594 0.505612 0.608079 +0.448839 0.505612 0.608079 +0.464192 0.505612 0.608079 +0.478729 0.505612 0.608079 +0.492515 0.505612 0.608079 +0.505612 0.505612 0.608079 +0.518072 0.505612 0.608079 +0.529943 0.505612 0.608079 +0.541266 0.505612 0.608079 +0.552083 0.505612 0.608079 +0.562427 0.505612 0.608079 +0.572331 0.505612 0.608079 +0.581823 0.505612 0.608079 +0.590929 0.505612 0.608079 +0.599674 0.505612 0.608079 +0.608079 0.505612 0.608079 +0.616166 0.505612 0.608079 +0.000001 0.518072 0.608079 +0.037293 0.518072 0.608079 +0.079714 0.518072 0.608079 +0.120832 0.518072 0.608079 +0.159284 0.518072 0.608079 +0.194868 0.518072 0.608079 +0.227530 0.518072 0.608079 +0.257434 0.518072 0.608079 +0.285092 0.518072 0.608079 +0.310738 0.518072 0.608079 +0.334585 0.518072 0.608079 +0.356818 0.518072 0.608079 +0.377602 0.518072 0.608079 +0.397079 0.518072 0.608079 +0.415373 0.518072 0.608079 +0.432594 0.518072 0.608079 +0.448839 0.518072 0.608079 +0.464192 0.518072 0.608079 +0.478729 0.518072 0.608079 +0.492515 0.518072 0.608079 +0.505612 0.518072 0.608079 +0.518072 0.518072 0.608079 +0.529943 0.518072 0.608079 +0.541266 0.518072 0.608079 +0.552083 0.518072 0.608079 +0.562427 0.518072 0.608079 +0.572331 0.518072 0.608079 +0.581823 0.518072 0.608079 +0.590929 0.518072 0.608079 +0.599674 0.518072 0.608079 +0.608079 0.518072 0.608079 +0.616166 0.518072 0.608079 +0.000001 0.529943 0.608079 +0.037293 0.529943 0.608079 +0.079714 0.529943 0.608079 +0.120832 0.529943 0.608079 +0.159284 0.529943 0.608079 +0.194868 0.529943 0.608079 +0.227530 0.529943 0.608079 +0.257434 0.529943 0.608079 +0.285092 0.529943 0.608079 +0.310738 0.529943 0.608079 +0.334585 0.529943 0.608079 +0.356818 0.529943 0.608079 +0.377602 0.529943 0.608079 +0.397079 0.529943 0.608079 +0.415373 0.529943 0.608079 +0.432594 0.529943 0.608079 +0.448839 0.529943 0.608079 +0.464192 0.529943 0.608079 +0.478729 0.529943 0.608079 +0.492515 0.529943 0.608079 +0.505612 0.529943 0.608079 +0.518072 0.529943 0.608079 +0.529943 0.529943 0.608079 +0.541266 0.529943 0.608079 +0.552083 0.529943 0.608079 +0.562427 0.529943 0.608079 +0.572331 0.529943 0.608079 +0.581823 0.529943 0.608079 +0.590929 0.529943 0.608079 +0.599674 0.529943 0.608079 +0.608079 0.529943 0.608079 +0.616166 0.529943 0.608079 +0.000001 0.541266 0.608079 +0.037293 0.541266 0.608079 +0.079714 0.541266 0.608079 +0.120832 0.541266 0.608079 +0.159284 0.541266 0.608079 +0.194868 0.541266 0.608079 +0.227530 0.541266 0.608079 +0.257434 0.541266 0.608079 +0.285092 0.541266 0.608079 +0.310738 0.541266 0.608079 +0.334585 0.541266 0.608079 +0.356818 0.541266 0.608079 +0.377602 0.541266 0.608079 +0.397079 0.541266 0.608079 +0.415373 0.541266 0.608079 +0.432594 0.541266 0.608079 +0.448839 0.541266 0.608079 +0.464192 0.541266 0.608079 +0.478729 0.541266 0.608079 +0.492515 0.541266 0.608079 +0.505612 0.541266 0.608079 +0.518072 0.541266 0.608079 +0.529943 0.541266 0.608079 +0.541266 0.541266 0.608079 +0.552083 0.541266 0.608079 +0.562427 0.541266 0.608079 +0.572331 0.541266 0.608079 +0.581823 0.541266 0.608079 +0.590929 0.541266 0.608079 +0.599674 0.541266 0.608079 +0.608079 0.541266 0.608079 +0.616166 0.541266 0.608079 +0.000001 0.552083 0.608079 +0.037293 0.552083 0.608079 +0.079714 0.552083 0.608079 +0.120832 0.552083 0.608079 +0.159284 0.552083 0.608079 +0.194868 0.552083 0.608079 +0.227530 0.552083 0.608079 +0.257434 0.552083 0.608079 +0.285092 0.552083 0.608079 +0.310738 0.552083 0.608079 +0.334585 0.552083 0.608079 +0.356818 0.552083 0.608079 +0.377602 0.552083 0.608079 +0.397079 0.552083 0.608079 +0.415373 0.552083 0.608079 +0.432594 0.552083 0.608079 +0.448839 0.552083 0.608079 +0.464192 0.552083 0.608079 +0.478729 0.552083 0.608079 +0.492515 0.552083 0.608079 +0.505612 0.552083 0.608079 +0.518072 0.552083 0.608079 +0.529943 0.552083 0.608079 +0.541266 0.552083 0.608079 +0.552083 0.552083 0.608079 +0.562427 0.552083 0.608079 +0.572331 0.552083 0.608079 +0.581823 0.552083 0.608079 +0.590929 0.552083 0.608079 +0.599674 0.552083 0.608079 +0.608079 0.552083 0.608079 +0.616166 0.552083 0.608079 +0.000001 0.562427 0.608079 +0.037293 0.562427 0.608079 +0.079714 0.562427 0.608079 +0.120832 0.562427 0.608079 +0.159284 0.562427 0.608079 +0.194868 0.562427 0.608079 +0.227530 0.562427 0.608079 +0.257434 0.562427 0.608079 +0.285092 0.562427 0.608079 +0.310738 0.562427 0.608079 +0.334585 0.562427 0.608079 +0.356818 0.562427 0.608079 +0.377602 0.562427 0.608079 +0.397079 0.562427 0.608079 +0.415373 0.562427 0.608079 +0.432594 0.562427 0.608079 +0.448839 0.562427 0.608079 +0.464192 0.562427 0.608079 +0.478729 0.562427 0.608079 +0.492515 0.562427 0.608079 +0.505612 0.562427 0.608079 +0.518072 0.562427 0.608079 +0.529943 0.562427 0.608079 +0.541266 0.562427 0.608079 +0.552083 0.562427 0.608079 +0.562427 0.562427 0.608079 +0.572331 0.562427 0.608079 +0.581823 0.562427 0.608079 +0.590929 0.562427 0.608079 +0.599674 0.562427 0.608079 +0.608079 0.562427 0.608079 +0.616166 0.562427 0.608079 +0.000001 0.572331 0.608079 +0.037293 0.572331 0.608079 +0.079714 0.572331 0.608079 +0.120832 0.572331 0.608079 +0.159284 0.572331 0.608079 +0.194868 0.572331 0.608079 +0.227530 0.572331 0.608079 +0.257434 0.572331 0.608079 +0.285092 0.572331 0.608079 +0.310738 0.572331 0.608079 +0.334585 0.572331 0.608079 +0.356818 0.572331 0.608079 +0.377602 0.572331 0.608079 +0.397079 0.572331 0.608079 +0.415373 0.572331 0.608079 +0.432594 0.572331 0.608079 +0.448839 0.572331 0.608079 +0.464192 0.572331 0.608079 +0.478729 0.572331 0.608079 +0.492515 0.572331 0.608079 +0.505612 0.572331 0.608079 +0.518072 0.572331 0.608079 +0.529943 0.572331 0.608079 +0.541266 0.572331 0.608079 +0.552083 0.572331 0.608079 +0.562427 0.572331 0.608079 +0.572331 0.572331 0.608079 +0.581823 0.572331 0.608079 +0.590929 0.572331 0.608079 +0.599674 0.572331 0.608079 +0.608079 0.572331 0.608079 +0.616166 0.572331 0.608079 +0.000001 0.581823 0.608079 +0.037293 0.581823 0.608079 +0.079714 0.581823 0.608079 +0.120832 0.581823 0.608079 +0.159284 0.581823 0.608079 +0.194868 0.581823 0.608079 +0.227530 0.581823 0.608079 +0.257434 0.581823 0.608079 +0.285092 0.581823 0.608079 +0.310738 0.581823 0.608079 +0.334585 0.581823 0.608079 +0.356818 0.581823 0.608079 +0.377602 0.581823 0.608079 +0.397079 0.581823 0.608079 +0.415373 0.581823 0.608079 +0.432594 0.581823 0.608079 +0.448839 0.581823 0.608079 +0.464192 0.581823 0.608079 +0.478729 0.581823 0.608079 +0.492515 0.581823 0.608079 +0.505612 0.581823 0.608079 +0.518072 0.581823 0.608079 +0.529943 0.581823 0.608079 +0.541266 0.581823 0.608079 +0.552083 0.581823 0.608079 +0.562427 0.581823 0.608079 +0.572331 0.581823 0.608079 +0.581823 0.581823 0.608079 +0.590929 0.581823 0.608079 +0.599674 0.581823 0.608079 +0.608079 0.581823 0.608079 +0.616166 0.581823 0.608079 +0.000001 0.590929 0.608079 +0.037293 0.590929 0.608079 +0.079714 0.590929 0.608079 +0.120832 0.590929 0.608079 +0.159284 0.590929 0.608079 +0.194868 0.590929 0.608079 +0.227530 0.590929 0.608079 +0.257434 0.590929 0.608079 +0.285092 0.590929 0.608079 +0.310738 0.590929 0.608079 +0.334585 0.590929 0.608079 +0.356818 0.590929 0.608079 +0.377602 0.590929 0.608079 +0.397079 0.590929 0.608079 +0.415373 0.590929 0.608079 +0.432594 0.590929 0.608079 +0.448839 0.590929 0.608079 +0.464192 0.590929 0.608079 +0.478729 0.590929 0.608079 +0.492515 0.590929 0.608079 +0.505612 0.590929 0.608079 +0.518072 0.590929 0.608079 +0.529943 0.590929 0.608079 +0.541266 0.590929 0.608079 +0.552083 0.590929 0.608079 +0.562427 0.590929 0.608079 +0.572331 0.590929 0.608079 +0.581823 0.590929 0.608079 +0.590929 0.590929 0.608079 +0.599674 0.590929 0.608079 +0.608079 0.590929 0.608079 +0.616166 0.590929 0.608079 +0.000001 0.599674 0.608079 +0.037293 0.599674 0.608079 +0.079714 0.599674 0.608079 +0.120832 0.599674 0.608079 +0.159284 0.599674 0.608079 +0.194868 0.599674 0.608079 +0.227530 0.599674 0.608079 +0.257434 0.599674 0.608079 +0.285092 0.599674 0.608079 +0.310738 0.599674 0.608079 +0.334585 0.599674 0.608079 +0.356818 0.599674 0.608079 +0.377602 0.599674 0.608079 +0.397079 0.599674 0.608079 +0.415373 0.599674 0.608079 +0.432594 0.599674 0.608079 +0.448839 0.599674 0.608079 +0.464192 0.599674 0.608079 +0.478729 0.599674 0.608079 +0.492515 0.599674 0.608079 +0.505612 0.599674 0.608079 +0.518072 0.599674 0.608079 +0.529943 0.599674 0.608079 +0.541266 0.599674 0.608079 +0.552083 0.599674 0.608079 +0.562427 0.599674 0.608079 +0.572331 0.599674 0.608079 +0.581823 0.599674 0.608079 +0.590929 0.599674 0.608079 +0.599674 0.599674 0.608079 +0.608079 0.599674 0.608079 +0.616166 0.599674 0.608079 +0.000001 0.608079 0.608079 +0.037293 0.608079 0.608079 +0.079714 0.608079 0.608079 +0.120832 0.608079 0.608079 +0.159284 0.608079 0.608079 +0.194868 0.608079 0.608079 +0.227530 0.608079 0.608079 +0.257434 0.608079 0.608079 +0.285092 0.608079 0.608079 +0.310738 0.608079 0.608079 +0.334585 0.608079 0.608079 +0.356818 0.608079 0.608079 +0.377602 0.608079 0.608079 +0.397079 0.608079 0.608079 +0.415373 0.608079 0.608079 +0.432594 0.608079 0.608079 +0.448839 0.608079 0.608079 +0.464192 0.608079 0.608079 +0.478729 0.608079 0.608079 +0.492515 0.608079 0.608079 +0.505612 0.608079 0.608079 +0.518072 0.608079 0.608079 +0.529943 0.608079 0.608079 +0.541266 0.608079 0.608079 +0.552083 0.608079 0.608079 +0.562427 0.608079 0.608079 +0.572331 0.608079 0.608079 +0.581823 0.608079 0.608079 +0.590929 0.608079 0.608079 +0.599674 0.608079 0.608079 +0.608079 0.608079 0.608079 +0.616166 0.608079 0.608079 +0.000001 0.616166 0.608079 +0.037293 0.616166 0.608079 +0.079714 0.616166 0.608079 +0.120832 0.616166 0.608079 +0.159284 0.616166 0.608079 +0.194868 0.616166 0.608079 +0.227530 0.616166 0.608079 +0.257434 0.616166 0.608079 +0.285092 0.616166 0.608079 +0.310738 0.616166 0.608079 +0.334585 0.616166 0.608079 +0.356818 0.616166 0.608079 +0.377602 0.616166 0.608079 +0.397079 0.616166 0.608079 +0.415373 0.616166 0.608079 +0.432594 0.616166 0.608079 +0.448839 0.616166 0.608079 +0.464192 0.616166 0.608079 +0.478729 0.616166 0.608079 +0.492515 0.616166 0.608079 +0.505612 0.616166 0.608079 +0.518072 0.616166 0.608079 +0.529943 0.616166 0.608079 +0.541266 0.616166 0.608079 +0.552083 0.616166 0.608079 +0.562427 0.616166 0.608079 +0.572331 0.616166 0.608079 +0.581823 0.616166 0.608079 +0.590929 0.616166 0.608079 +0.599674 0.616166 0.608079 +0.608079 0.616166 0.608079 +0.616166 0.616166 0.608079 +0.000001 0.000001 0.616166 +0.037293 0.000001 0.616166 +0.079714 0.000001 0.616166 +0.120832 0.000001 0.616166 +0.159284 0.000001 0.616166 +0.194868 0.000001 0.616166 +0.227530 0.000001 0.616166 +0.257434 0.000001 0.616166 +0.285092 0.000001 0.616166 +0.310738 0.000001 0.616166 +0.334585 0.000001 0.616166 +0.356818 0.000001 0.616166 +0.377602 0.000001 0.616166 +0.397079 0.000001 0.616166 +0.415373 0.000001 0.616166 +0.432594 0.000001 0.616166 +0.448839 0.000001 0.616166 +0.464192 0.000001 0.616166 +0.478729 0.000001 0.616166 +0.492515 0.000001 0.616166 +0.505612 0.000001 0.616166 +0.518072 0.000001 0.616166 +0.529943 0.000001 0.616166 +0.541266 0.000001 0.616166 +0.552083 0.000001 0.616166 +0.562427 0.000001 0.616166 +0.572331 0.000001 0.616166 +0.581823 0.000001 0.616166 +0.590929 0.000001 0.616166 +0.599674 0.000001 0.616166 +0.608079 0.000001 0.616166 +0.616166 0.000001 0.616166 +0.000001 0.037293 0.616166 +0.037293 0.037293 0.616166 +0.079714 0.037293 0.616166 +0.120832 0.037293 0.616166 +0.159284 0.037293 0.616166 +0.194868 0.037293 0.616166 +0.227530 0.037293 0.616166 +0.257434 0.037293 0.616166 +0.285092 0.037293 0.616166 +0.310738 0.037293 0.616166 +0.334585 0.037293 0.616166 +0.356818 0.037293 0.616166 +0.377602 0.037293 0.616166 +0.397079 0.037293 0.616166 +0.415373 0.037293 0.616166 +0.432594 0.037293 0.616166 +0.448839 0.037293 0.616166 +0.464192 0.037293 0.616166 +0.478729 0.037293 0.616166 +0.492515 0.037293 0.616166 +0.505612 0.037293 0.616166 +0.518072 0.037293 0.616166 +0.529943 0.037293 0.616166 +0.541266 0.037293 0.616166 +0.552083 0.037293 0.616166 +0.562427 0.037293 0.616166 +0.572331 0.037293 0.616166 +0.581823 0.037293 0.616166 +0.590929 0.037293 0.616166 +0.599674 0.037293 0.616166 +0.608079 0.037293 0.616166 +0.616166 0.037293 0.616166 +0.000001 0.079714 0.616166 +0.037293 0.079714 0.616166 +0.079714 0.079714 0.616166 +0.120832 0.079714 0.616166 +0.159284 0.079714 0.616166 +0.194868 0.079714 0.616166 +0.227530 0.079714 0.616166 +0.257434 0.079714 0.616166 +0.285092 0.079714 0.616166 +0.310738 0.079714 0.616166 +0.334585 0.079714 0.616166 +0.356818 0.079714 0.616166 +0.377602 0.079714 0.616166 +0.397079 0.079714 0.616166 +0.415373 0.079714 0.616166 +0.432594 0.079714 0.616166 +0.448839 0.079714 0.616166 +0.464192 0.079714 0.616166 +0.478729 0.079714 0.616166 +0.492515 0.079714 0.616166 +0.505612 0.079714 0.616166 +0.518072 0.079714 0.616166 +0.529943 0.079714 0.616166 +0.541266 0.079714 0.616166 +0.552083 0.079714 0.616166 +0.562427 0.079714 0.616166 +0.572331 0.079714 0.616166 +0.581823 0.079714 0.616166 +0.590929 0.079714 0.616166 +0.599674 0.079714 0.616166 +0.608079 0.079714 0.616166 +0.616166 0.079714 0.616166 +0.000001 0.120832 0.616166 +0.037293 0.120832 0.616166 +0.079714 0.120832 0.616166 +0.120832 0.120832 0.616166 +0.159284 0.120832 0.616166 +0.194868 0.120832 0.616166 +0.227530 0.120832 0.616166 +0.257434 0.120832 0.616166 +0.285092 0.120832 0.616166 +0.310738 0.120832 0.616166 +0.334585 0.120832 0.616166 +0.356818 0.120832 0.616166 +0.377602 0.120832 0.616166 +0.397079 0.120832 0.616166 +0.415373 0.120832 0.616166 +0.432594 0.120832 0.616166 +0.448839 0.120832 0.616166 +0.464192 0.120832 0.616166 +0.478729 0.120832 0.616166 +0.492515 0.120832 0.616166 +0.505612 0.120832 0.616166 +0.518072 0.120832 0.616166 +0.529943 0.120832 0.616166 +0.541266 0.120832 0.616166 +0.552083 0.120832 0.616166 +0.562427 0.120832 0.616166 +0.572331 0.120832 0.616166 +0.581823 0.120832 0.616166 +0.590929 0.120832 0.616166 +0.599674 0.120832 0.616166 +0.608079 0.120832 0.616166 +0.616166 0.120832 0.616166 +0.000001 0.159284 0.616166 +0.037293 0.159284 0.616166 +0.079714 0.159284 0.616166 +0.120832 0.159284 0.616166 +0.159284 0.159284 0.616166 +0.194868 0.159284 0.616166 +0.227530 0.159284 0.616166 +0.257434 0.159284 0.616166 +0.285092 0.159284 0.616166 +0.310738 0.159284 0.616166 +0.334585 0.159284 0.616166 +0.356818 0.159284 0.616166 +0.377602 0.159284 0.616166 +0.397079 0.159284 0.616166 +0.415373 0.159284 0.616166 +0.432594 0.159284 0.616166 +0.448839 0.159284 0.616166 +0.464192 0.159284 0.616166 +0.478729 0.159284 0.616166 +0.492515 0.159284 0.616166 +0.505612 0.159284 0.616166 +0.518072 0.159284 0.616166 +0.529943 0.159284 0.616166 +0.541266 0.159284 0.616166 +0.552083 0.159284 0.616166 +0.562427 0.159284 0.616166 +0.572331 0.159284 0.616166 +0.581823 0.159284 0.616166 +0.590929 0.159284 0.616166 +0.599674 0.159284 0.616166 +0.608079 0.159284 0.616166 +0.616166 0.159284 0.616166 +0.000001 0.194868 0.616166 +0.037293 0.194868 0.616166 +0.079714 0.194868 0.616166 +0.120832 0.194868 0.616166 +0.159284 0.194868 0.616166 +0.194868 0.194868 0.616166 +0.227530 0.194868 0.616166 +0.257434 0.194868 0.616166 +0.285092 0.194868 0.616166 +0.310738 0.194868 0.616166 +0.334585 0.194868 0.616166 +0.356818 0.194868 0.616166 +0.377602 0.194868 0.616166 +0.397079 0.194868 0.616166 +0.415373 0.194868 0.616166 +0.432594 0.194868 0.616166 +0.448839 0.194868 0.616166 +0.464192 0.194868 0.616166 +0.478729 0.194868 0.616166 +0.492515 0.194868 0.616166 +0.505612 0.194868 0.616166 +0.518072 0.194868 0.616166 +0.529943 0.194868 0.616166 +0.541266 0.194868 0.616166 +0.552083 0.194868 0.616166 +0.562427 0.194868 0.616166 +0.572331 0.194868 0.616166 +0.581823 0.194868 0.616166 +0.590929 0.194868 0.616166 +0.599674 0.194868 0.616166 +0.608079 0.194868 0.616166 +0.616166 0.194868 0.616166 +0.000001 0.227530 0.616166 +0.037293 0.227530 0.616166 +0.079714 0.227530 0.616166 +0.120832 0.227530 0.616166 +0.159284 0.227530 0.616166 +0.194868 0.227530 0.616166 +0.227530 0.227530 0.616166 +0.257434 0.227530 0.616166 +0.285092 0.227530 0.616166 +0.310738 0.227530 0.616166 +0.334585 0.227530 0.616166 +0.356818 0.227530 0.616166 +0.377602 0.227530 0.616166 +0.397079 0.227530 0.616166 +0.415373 0.227530 0.616166 +0.432594 0.227530 0.616166 +0.448839 0.227530 0.616166 +0.464192 0.227530 0.616166 +0.478729 0.227530 0.616166 +0.492515 0.227530 0.616166 +0.505612 0.227530 0.616166 +0.518072 0.227530 0.616166 +0.529943 0.227530 0.616166 +0.541266 0.227530 0.616166 +0.552083 0.227530 0.616166 +0.562427 0.227530 0.616166 +0.572331 0.227530 0.616166 +0.581823 0.227530 0.616166 +0.590929 0.227530 0.616166 +0.599674 0.227530 0.616166 +0.608079 0.227530 0.616166 +0.616166 0.227530 0.616166 +0.000001 0.257434 0.616166 +0.037293 0.257434 0.616166 +0.079714 0.257434 0.616166 +0.120832 0.257434 0.616166 +0.159284 0.257434 0.616166 +0.194868 0.257434 0.616166 +0.227530 0.257434 0.616166 +0.257434 0.257434 0.616166 +0.285092 0.257434 0.616166 +0.310738 0.257434 0.616166 +0.334585 0.257434 0.616166 +0.356818 0.257434 0.616166 +0.377602 0.257434 0.616166 +0.397079 0.257434 0.616166 +0.415373 0.257434 0.616166 +0.432594 0.257434 0.616166 +0.448839 0.257434 0.616166 +0.464192 0.257434 0.616166 +0.478729 0.257434 0.616166 +0.492515 0.257434 0.616166 +0.505612 0.257434 0.616166 +0.518072 0.257434 0.616166 +0.529943 0.257434 0.616166 +0.541266 0.257434 0.616166 +0.552083 0.257434 0.616166 +0.562427 0.257434 0.616166 +0.572331 0.257434 0.616166 +0.581823 0.257434 0.616166 +0.590929 0.257434 0.616166 +0.599674 0.257434 0.616166 +0.608079 0.257434 0.616166 +0.616166 0.257434 0.616166 +0.000001 0.285092 0.616166 +0.037293 0.285092 0.616166 +0.079714 0.285092 0.616166 +0.120832 0.285092 0.616166 +0.159284 0.285092 0.616166 +0.194868 0.285092 0.616166 +0.227530 0.285092 0.616166 +0.257434 0.285092 0.616166 +0.285092 0.285092 0.616166 +0.310738 0.285092 0.616166 +0.334585 0.285092 0.616166 +0.356818 0.285092 0.616166 +0.377602 0.285092 0.616166 +0.397079 0.285092 0.616166 +0.415373 0.285092 0.616166 +0.432594 0.285092 0.616166 +0.448839 0.285092 0.616166 +0.464192 0.285092 0.616166 +0.478729 0.285092 0.616166 +0.492515 0.285092 0.616166 +0.505612 0.285092 0.616166 +0.518072 0.285092 0.616166 +0.529943 0.285092 0.616166 +0.541266 0.285092 0.616166 +0.552083 0.285092 0.616166 +0.562427 0.285092 0.616166 +0.572331 0.285092 0.616166 +0.581823 0.285092 0.616166 +0.590929 0.285092 0.616166 +0.599674 0.285092 0.616166 +0.608079 0.285092 0.616166 +0.616166 0.285092 0.616166 +0.000001 0.310738 0.616166 +0.037293 0.310738 0.616166 +0.079714 0.310738 0.616166 +0.120832 0.310738 0.616166 +0.159284 0.310738 0.616166 +0.194868 0.310738 0.616166 +0.227530 0.310738 0.616166 +0.257434 0.310738 0.616166 +0.285092 0.310738 0.616166 +0.310738 0.310738 0.616166 +0.334585 0.310738 0.616166 +0.356818 0.310738 0.616166 +0.377602 0.310738 0.616166 +0.397079 0.310738 0.616166 +0.415373 0.310738 0.616166 +0.432594 0.310738 0.616166 +0.448839 0.310738 0.616166 +0.464192 0.310738 0.616166 +0.478729 0.310738 0.616166 +0.492515 0.310738 0.616166 +0.505612 0.310738 0.616166 +0.518072 0.310738 0.616166 +0.529943 0.310738 0.616166 +0.541266 0.310738 0.616166 +0.552083 0.310738 0.616166 +0.562427 0.310738 0.616166 +0.572331 0.310738 0.616166 +0.581823 0.310738 0.616166 +0.590929 0.310738 0.616166 +0.599674 0.310738 0.616166 +0.608079 0.310738 0.616166 +0.616166 0.310738 0.616166 +0.000001 0.334585 0.616166 +0.037293 0.334585 0.616166 +0.079714 0.334585 0.616166 +0.120832 0.334585 0.616166 +0.159284 0.334585 0.616166 +0.194868 0.334585 0.616166 +0.227530 0.334585 0.616166 +0.257434 0.334585 0.616166 +0.285092 0.334585 0.616166 +0.310738 0.334585 0.616166 +0.334585 0.334585 0.616166 +0.356818 0.334585 0.616166 +0.377602 0.334585 0.616166 +0.397079 0.334585 0.616166 +0.415373 0.334585 0.616166 +0.432594 0.334585 0.616166 +0.448839 0.334585 0.616166 +0.464192 0.334585 0.616166 +0.478729 0.334585 0.616166 +0.492515 0.334585 0.616166 +0.505612 0.334585 0.616166 +0.518072 0.334585 0.616166 +0.529943 0.334585 0.616166 +0.541266 0.334585 0.616166 +0.552083 0.334585 0.616166 +0.562427 0.334585 0.616166 +0.572331 0.334585 0.616166 +0.581823 0.334585 0.616166 +0.590929 0.334585 0.616166 +0.599674 0.334585 0.616166 +0.608079 0.334585 0.616166 +0.616166 0.334585 0.616166 +0.000001 0.356818 0.616166 +0.037293 0.356818 0.616166 +0.079714 0.356818 0.616166 +0.120832 0.356818 0.616166 +0.159284 0.356818 0.616166 +0.194868 0.356818 0.616166 +0.227530 0.356818 0.616166 +0.257434 0.356818 0.616166 +0.285092 0.356818 0.616166 +0.310738 0.356818 0.616166 +0.334585 0.356818 0.616166 +0.356818 0.356818 0.616166 +0.377602 0.356818 0.616166 +0.397079 0.356818 0.616166 +0.415373 0.356818 0.616166 +0.432594 0.356818 0.616166 +0.448839 0.356818 0.616166 +0.464192 0.356818 0.616166 +0.478729 0.356818 0.616166 +0.492515 0.356818 0.616166 +0.505612 0.356818 0.616166 +0.518072 0.356818 0.616166 +0.529943 0.356818 0.616166 +0.541266 0.356818 0.616166 +0.552083 0.356818 0.616166 +0.562427 0.356818 0.616166 +0.572331 0.356818 0.616166 +0.581823 0.356818 0.616166 +0.590929 0.356818 0.616166 +0.599674 0.356818 0.616166 +0.608079 0.356818 0.616166 +0.616166 0.356818 0.616166 +0.000001 0.377602 0.616166 +0.037293 0.377602 0.616166 +0.079714 0.377602 0.616166 +0.120832 0.377602 0.616166 +0.159284 0.377602 0.616166 +0.194868 0.377602 0.616166 +0.227530 0.377602 0.616166 +0.257434 0.377602 0.616166 +0.285092 0.377602 0.616166 +0.310738 0.377602 0.616166 +0.334585 0.377602 0.616166 +0.356818 0.377602 0.616166 +0.377602 0.377602 0.616166 +0.397079 0.377602 0.616166 +0.415373 0.377602 0.616166 +0.432594 0.377602 0.616166 +0.448839 0.377602 0.616166 +0.464192 0.377602 0.616166 +0.478729 0.377602 0.616166 +0.492515 0.377602 0.616166 +0.505612 0.377602 0.616166 +0.518072 0.377602 0.616166 +0.529943 0.377602 0.616166 +0.541266 0.377602 0.616166 +0.552083 0.377602 0.616166 +0.562427 0.377602 0.616166 +0.572331 0.377602 0.616166 +0.581823 0.377602 0.616166 +0.590929 0.377602 0.616166 +0.599674 0.377602 0.616166 +0.608079 0.377602 0.616166 +0.616166 0.377602 0.616166 +0.000001 0.397079 0.616166 +0.037293 0.397079 0.616166 +0.079714 0.397079 0.616166 +0.120832 0.397079 0.616166 +0.159284 0.397079 0.616166 +0.194868 0.397079 0.616166 +0.227530 0.397079 0.616166 +0.257434 0.397079 0.616166 +0.285092 0.397079 0.616166 +0.310738 0.397079 0.616166 +0.334585 0.397079 0.616166 +0.356818 0.397079 0.616166 +0.377602 0.397079 0.616166 +0.397079 0.397079 0.616166 +0.415373 0.397079 0.616166 +0.432594 0.397079 0.616166 +0.448839 0.397079 0.616166 +0.464192 0.397079 0.616166 +0.478729 0.397079 0.616166 +0.492515 0.397079 0.616166 +0.505612 0.397079 0.616166 +0.518072 0.397079 0.616166 +0.529943 0.397079 0.616166 +0.541266 0.397079 0.616166 +0.552083 0.397079 0.616166 +0.562427 0.397079 0.616166 +0.572331 0.397079 0.616166 +0.581823 0.397079 0.616166 +0.590929 0.397079 0.616166 +0.599674 0.397079 0.616166 +0.608079 0.397079 0.616166 +0.616166 0.397079 0.616166 +0.000001 0.415373 0.616166 +0.037293 0.415373 0.616166 +0.079714 0.415373 0.616166 +0.120832 0.415373 0.616166 +0.159284 0.415373 0.616166 +0.194868 0.415373 0.616166 +0.227530 0.415373 0.616166 +0.257434 0.415373 0.616166 +0.285092 0.415373 0.616166 +0.310738 0.415373 0.616166 +0.334585 0.415373 0.616166 +0.356818 0.415373 0.616166 +0.377602 0.415373 0.616166 +0.397079 0.415373 0.616166 +0.415373 0.415373 0.616166 +0.432594 0.415373 0.616166 +0.448839 0.415373 0.616166 +0.464192 0.415373 0.616166 +0.478729 0.415373 0.616166 +0.492515 0.415373 0.616166 +0.505612 0.415373 0.616166 +0.518072 0.415373 0.616166 +0.529943 0.415373 0.616166 +0.541266 0.415373 0.616166 +0.552083 0.415373 0.616166 +0.562427 0.415373 0.616166 +0.572331 0.415373 0.616166 +0.581823 0.415373 0.616166 +0.590929 0.415373 0.616166 +0.599674 0.415373 0.616166 +0.608079 0.415373 0.616166 +0.616166 0.415373 0.616166 +0.000001 0.432594 0.616166 +0.037293 0.432594 0.616166 +0.079714 0.432594 0.616166 +0.120832 0.432594 0.616166 +0.159284 0.432594 0.616166 +0.194868 0.432594 0.616166 +0.227530 0.432594 0.616166 +0.257434 0.432594 0.616166 +0.285092 0.432594 0.616166 +0.310738 0.432594 0.616166 +0.334585 0.432594 0.616166 +0.356818 0.432594 0.616166 +0.377602 0.432594 0.616166 +0.397079 0.432594 0.616166 +0.415373 0.432594 0.616166 +0.432594 0.432594 0.616166 +0.448839 0.432594 0.616166 +0.464192 0.432594 0.616166 +0.478729 0.432594 0.616166 +0.492515 0.432594 0.616166 +0.505612 0.432594 0.616166 +0.518072 0.432594 0.616166 +0.529943 0.432594 0.616166 +0.541266 0.432594 0.616166 +0.552083 0.432594 0.616166 +0.562427 0.432594 0.616166 +0.572331 0.432594 0.616166 +0.581823 0.432594 0.616166 +0.590929 0.432594 0.616166 +0.599674 0.432594 0.616166 +0.608079 0.432594 0.616166 +0.616166 0.432594 0.616166 +0.000001 0.448839 0.616166 +0.037293 0.448839 0.616166 +0.079714 0.448839 0.616166 +0.120832 0.448839 0.616166 +0.159284 0.448839 0.616166 +0.194868 0.448839 0.616166 +0.227530 0.448839 0.616166 +0.257434 0.448839 0.616166 +0.285092 0.448839 0.616166 +0.310738 0.448839 0.616166 +0.334585 0.448839 0.616166 +0.356818 0.448839 0.616166 +0.377602 0.448839 0.616166 +0.397079 0.448839 0.616166 +0.415373 0.448839 0.616166 +0.432594 0.448839 0.616166 +0.448839 0.448839 0.616166 +0.464192 0.448839 0.616166 +0.478729 0.448839 0.616166 +0.492515 0.448839 0.616166 +0.505612 0.448839 0.616166 +0.518072 0.448839 0.616166 +0.529943 0.448839 0.616166 +0.541266 0.448839 0.616166 +0.552083 0.448839 0.616166 +0.562427 0.448839 0.616166 +0.572331 0.448839 0.616166 +0.581823 0.448839 0.616166 +0.590929 0.448839 0.616166 +0.599674 0.448839 0.616166 +0.608079 0.448839 0.616166 +0.616166 0.448839 0.616166 +0.000001 0.464192 0.616166 +0.037293 0.464192 0.616166 +0.079714 0.464192 0.616166 +0.120832 0.464192 0.616166 +0.159284 0.464192 0.616166 +0.194868 0.464192 0.616166 +0.227530 0.464192 0.616166 +0.257434 0.464192 0.616166 +0.285092 0.464192 0.616166 +0.310738 0.464192 0.616166 +0.334585 0.464192 0.616166 +0.356818 0.464192 0.616166 +0.377602 0.464192 0.616166 +0.397079 0.464192 0.616166 +0.415373 0.464192 0.616166 +0.432594 0.464192 0.616166 +0.448839 0.464192 0.616166 +0.464192 0.464192 0.616166 +0.478729 0.464192 0.616166 +0.492515 0.464192 0.616166 +0.505612 0.464192 0.616166 +0.518072 0.464192 0.616166 +0.529943 0.464192 0.616166 +0.541266 0.464192 0.616166 +0.552083 0.464192 0.616166 +0.562427 0.464192 0.616166 +0.572331 0.464192 0.616166 +0.581823 0.464192 0.616166 +0.590929 0.464192 0.616166 +0.599674 0.464192 0.616166 +0.608079 0.464192 0.616166 +0.616166 0.464192 0.616166 +0.000001 0.478729 0.616166 +0.037293 0.478729 0.616166 +0.079714 0.478729 0.616166 +0.120832 0.478729 0.616166 +0.159284 0.478729 0.616166 +0.194868 0.478729 0.616166 +0.227530 0.478729 0.616166 +0.257434 0.478729 0.616166 +0.285092 0.478729 0.616166 +0.310738 0.478729 0.616166 +0.334585 0.478729 0.616166 +0.356818 0.478729 0.616166 +0.377602 0.478729 0.616166 +0.397079 0.478729 0.616166 +0.415373 0.478729 0.616166 +0.432594 0.478729 0.616166 +0.448839 0.478729 0.616166 +0.464192 0.478729 0.616166 +0.478729 0.478729 0.616166 +0.492515 0.478729 0.616166 +0.505612 0.478729 0.616166 +0.518072 0.478729 0.616166 +0.529943 0.478729 0.616166 +0.541266 0.478729 0.616166 +0.552083 0.478729 0.616166 +0.562427 0.478729 0.616166 +0.572331 0.478729 0.616166 +0.581823 0.478729 0.616166 +0.590929 0.478729 0.616166 +0.599674 0.478729 0.616166 +0.608079 0.478729 0.616166 +0.616166 0.478729 0.616166 +0.000001 0.492515 0.616166 +0.037293 0.492515 0.616166 +0.079714 0.492515 0.616166 +0.120832 0.492515 0.616166 +0.159284 0.492515 0.616166 +0.194868 0.492515 0.616166 +0.227530 0.492515 0.616166 +0.257434 0.492515 0.616166 +0.285092 0.492515 0.616166 +0.310738 0.492515 0.616166 +0.334585 0.492515 0.616166 +0.356818 0.492515 0.616166 +0.377602 0.492515 0.616166 +0.397079 0.492515 0.616166 +0.415373 0.492515 0.616166 +0.432594 0.492515 0.616166 +0.448839 0.492515 0.616166 +0.464192 0.492515 0.616166 +0.478729 0.492515 0.616166 +0.492515 0.492515 0.616166 +0.505612 0.492515 0.616166 +0.518072 0.492515 0.616166 +0.529943 0.492515 0.616166 +0.541266 0.492515 0.616166 +0.552083 0.492515 0.616166 +0.562427 0.492515 0.616166 +0.572331 0.492515 0.616166 +0.581823 0.492515 0.616166 +0.590929 0.492515 0.616166 +0.599674 0.492515 0.616166 +0.608079 0.492515 0.616166 +0.616166 0.492515 0.616166 +0.000001 0.505612 0.616166 +0.037293 0.505612 0.616166 +0.079714 0.505612 0.616166 +0.120832 0.505612 0.616166 +0.159284 0.505612 0.616166 +0.194868 0.505612 0.616166 +0.227530 0.505612 0.616166 +0.257434 0.505612 0.616166 +0.285092 0.505612 0.616166 +0.310738 0.505612 0.616166 +0.334585 0.505612 0.616166 +0.356818 0.505612 0.616166 +0.377602 0.505612 0.616166 +0.397079 0.505612 0.616166 +0.415373 0.505612 0.616166 +0.432594 0.505612 0.616166 +0.448839 0.505612 0.616166 +0.464192 0.505612 0.616166 +0.478729 0.505612 0.616166 +0.492515 0.505612 0.616166 +0.505612 0.505612 0.616166 +0.518072 0.505612 0.616166 +0.529943 0.505612 0.616166 +0.541266 0.505612 0.616166 +0.552083 0.505612 0.616166 +0.562427 0.505612 0.616166 +0.572331 0.505612 0.616166 +0.581823 0.505612 0.616166 +0.590929 0.505612 0.616166 +0.599674 0.505612 0.616166 +0.608079 0.505612 0.616166 +0.616166 0.505612 0.616166 +0.000001 0.518072 0.616166 +0.037293 0.518072 0.616166 +0.079714 0.518072 0.616166 +0.120832 0.518072 0.616166 +0.159284 0.518072 0.616166 +0.194868 0.518072 0.616166 +0.227530 0.518072 0.616166 +0.257434 0.518072 0.616166 +0.285092 0.518072 0.616166 +0.310738 0.518072 0.616166 +0.334585 0.518072 0.616166 +0.356818 0.518072 0.616166 +0.377602 0.518072 0.616166 +0.397079 0.518072 0.616166 +0.415373 0.518072 0.616166 +0.432594 0.518072 0.616166 +0.448839 0.518072 0.616166 +0.464192 0.518072 0.616166 +0.478729 0.518072 0.616166 +0.492515 0.518072 0.616166 +0.505612 0.518072 0.616166 +0.518072 0.518072 0.616166 +0.529943 0.518072 0.616166 +0.541266 0.518072 0.616166 +0.552083 0.518072 0.616166 +0.562427 0.518072 0.616166 +0.572331 0.518072 0.616166 +0.581823 0.518072 0.616166 +0.590929 0.518072 0.616166 +0.599674 0.518072 0.616166 +0.608079 0.518072 0.616166 +0.616166 0.518072 0.616166 +0.000001 0.529943 0.616166 +0.037293 0.529943 0.616166 +0.079714 0.529943 0.616166 +0.120832 0.529943 0.616166 +0.159284 0.529943 0.616166 +0.194868 0.529943 0.616166 +0.227530 0.529943 0.616166 +0.257434 0.529943 0.616166 +0.285092 0.529943 0.616166 +0.310738 0.529943 0.616166 +0.334585 0.529943 0.616166 +0.356818 0.529943 0.616166 +0.377602 0.529943 0.616166 +0.397079 0.529943 0.616166 +0.415373 0.529943 0.616166 +0.432594 0.529943 0.616166 +0.448839 0.529943 0.616166 +0.464192 0.529943 0.616166 +0.478729 0.529943 0.616166 +0.492515 0.529943 0.616166 +0.505612 0.529943 0.616166 +0.518072 0.529943 0.616166 +0.529943 0.529943 0.616166 +0.541266 0.529943 0.616166 +0.552083 0.529943 0.616166 +0.562427 0.529943 0.616166 +0.572331 0.529943 0.616166 +0.581823 0.529943 0.616166 +0.590929 0.529943 0.616166 +0.599674 0.529943 0.616166 +0.608079 0.529943 0.616166 +0.616166 0.529943 0.616166 +0.000001 0.541266 0.616166 +0.037293 0.541266 0.616166 +0.079714 0.541266 0.616166 +0.120832 0.541266 0.616166 +0.159284 0.541266 0.616166 +0.194868 0.541266 0.616166 +0.227530 0.541266 0.616166 +0.257434 0.541266 0.616166 +0.285092 0.541266 0.616166 +0.310738 0.541266 0.616166 +0.334585 0.541266 0.616166 +0.356818 0.541266 0.616166 +0.377602 0.541266 0.616166 +0.397079 0.541266 0.616166 +0.415373 0.541266 0.616166 +0.432594 0.541266 0.616166 +0.448839 0.541266 0.616166 +0.464192 0.541266 0.616166 +0.478729 0.541266 0.616166 +0.492515 0.541266 0.616166 +0.505612 0.541266 0.616166 +0.518072 0.541266 0.616166 +0.529943 0.541266 0.616166 +0.541266 0.541266 0.616166 +0.552083 0.541266 0.616166 +0.562427 0.541266 0.616166 +0.572331 0.541266 0.616166 +0.581823 0.541266 0.616166 +0.590929 0.541266 0.616166 +0.599674 0.541266 0.616166 +0.608079 0.541266 0.616166 +0.616166 0.541266 0.616166 +0.000001 0.552083 0.616166 +0.037293 0.552083 0.616166 +0.079714 0.552083 0.616166 +0.120832 0.552083 0.616166 +0.159284 0.552083 0.616166 +0.194868 0.552083 0.616166 +0.227530 0.552083 0.616166 +0.257434 0.552083 0.616166 +0.285092 0.552083 0.616166 +0.310738 0.552083 0.616166 +0.334585 0.552083 0.616166 +0.356818 0.552083 0.616166 +0.377602 0.552083 0.616166 +0.397079 0.552083 0.616166 +0.415373 0.552083 0.616166 +0.432594 0.552083 0.616166 +0.448839 0.552083 0.616166 +0.464192 0.552083 0.616166 +0.478729 0.552083 0.616166 +0.492515 0.552083 0.616166 +0.505612 0.552083 0.616166 +0.518072 0.552083 0.616166 +0.529943 0.552083 0.616166 +0.541266 0.552083 0.616166 +0.552083 0.552083 0.616166 +0.562427 0.552083 0.616166 +0.572331 0.552083 0.616166 +0.581823 0.552083 0.616166 +0.590929 0.552083 0.616166 +0.599674 0.552083 0.616166 +0.608079 0.552083 0.616166 +0.616166 0.552083 0.616166 +0.000001 0.562427 0.616166 +0.037293 0.562427 0.616166 +0.079714 0.562427 0.616166 +0.120832 0.562427 0.616166 +0.159284 0.562427 0.616166 +0.194868 0.562427 0.616166 +0.227530 0.562427 0.616166 +0.257434 0.562427 0.616166 +0.285092 0.562427 0.616166 +0.310738 0.562427 0.616166 +0.334585 0.562427 0.616166 +0.356818 0.562427 0.616166 +0.377602 0.562427 0.616166 +0.397079 0.562427 0.616166 +0.415373 0.562427 0.616166 +0.432594 0.562427 0.616166 +0.448839 0.562427 0.616166 +0.464192 0.562427 0.616166 +0.478729 0.562427 0.616166 +0.492515 0.562427 0.616166 +0.505612 0.562427 0.616166 +0.518072 0.562427 0.616166 +0.529943 0.562427 0.616166 +0.541266 0.562427 0.616166 +0.552083 0.562427 0.616166 +0.562427 0.562427 0.616166 +0.572331 0.562427 0.616166 +0.581823 0.562427 0.616166 +0.590929 0.562427 0.616166 +0.599674 0.562427 0.616166 +0.608079 0.562427 0.616166 +0.616166 0.562427 0.616166 +0.000001 0.572331 0.616166 +0.037293 0.572331 0.616166 +0.079714 0.572331 0.616166 +0.120832 0.572331 0.616166 +0.159284 0.572331 0.616166 +0.194868 0.572331 0.616166 +0.227530 0.572331 0.616166 +0.257434 0.572331 0.616166 +0.285092 0.572331 0.616166 +0.310738 0.572331 0.616166 +0.334585 0.572331 0.616166 +0.356818 0.572331 0.616166 +0.377602 0.572331 0.616166 +0.397079 0.572331 0.616166 +0.415373 0.572331 0.616166 +0.432594 0.572331 0.616166 +0.448839 0.572331 0.616166 +0.464192 0.572331 0.616166 +0.478729 0.572331 0.616166 +0.492515 0.572331 0.616166 +0.505612 0.572331 0.616166 +0.518072 0.572331 0.616166 +0.529943 0.572331 0.616166 +0.541266 0.572331 0.616166 +0.552083 0.572331 0.616166 +0.562427 0.572331 0.616166 +0.572331 0.572331 0.616166 +0.581823 0.572331 0.616166 +0.590929 0.572331 0.616166 +0.599674 0.572331 0.616166 +0.608079 0.572331 0.616166 +0.616166 0.572331 0.616166 +0.000001 0.581823 0.616166 +0.037293 0.581823 0.616166 +0.079714 0.581823 0.616166 +0.120832 0.581823 0.616166 +0.159284 0.581823 0.616166 +0.194868 0.581823 0.616166 +0.227530 0.581823 0.616166 +0.257434 0.581823 0.616166 +0.285092 0.581823 0.616166 +0.310738 0.581823 0.616166 +0.334585 0.581823 0.616166 +0.356818 0.581823 0.616166 +0.377602 0.581823 0.616166 +0.397079 0.581823 0.616166 +0.415373 0.581823 0.616166 +0.432594 0.581823 0.616166 +0.448839 0.581823 0.616166 +0.464192 0.581823 0.616166 +0.478729 0.581823 0.616166 +0.492515 0.581823 0.616166 +0.505612 0.581823 0.616166 +0.518072 0.581823 0.616166 +0.529943 0.581823 0.616166 +0.541266 0.581823 0.616166 +0.552083 0.581823 0.616166 +0.562427 0.581823 0.616166 +0.572331 0.581823 0.616166 +0.581823 0.581823 0.616166 +0.590929 0.581823 0.616166 +0.599674 0.581823 0.616166 +0.608079 0.581823 0.616166 +0.616166 0.581823 0.616166 +0.000001 0.590929 0.616166 +0.037293 0.590929 0.616166 +0.079714 0.590929 0.616166 +0.120832 0.590929 0.616166 +0.159284 0.590929 0.616166 +0.194868 0.590929 0.616166 +0.227530 0.590929 0.616166 +0.257434 0.590929 0.616166 +0.285092 0.590929 0.616166 +0.310738 0.590929 0.616166 +0.334585 0.590929 0.616166 +0.356818 0.590929 0.616166 +0.377602 0.590929 0.616166 +0.397079 0.590929 0.616166 +0.415373 0.590929 0.616166 +0.432594 0.590929 0.616166 +0.448839 0.590929 0.616166 +0.464192 0.590929 0.616166 +0.478729 0.590929 0.616166 +0.492515 0.590929 0.616166 +0.505612 0.590929 0.616166 +0.518072 0.590929 0.616166 +0.529943 0.590929 0.616166 +0.541266 0.590929 0.616166 +0.552083 0.590929 0.616166 +0.562427 0.590929 0.616166 +0.572331 0.590929 0.616166 +0.581823 0.590929 0.616166 +0.590929 0.590929 0.616166 +0.599674 0.590929 0.616166 +0.608079 0.590929 0.616166 +0.616166 0.590929 0.616166 +0.000001 0.599674 0.616166 +0.037293 0.599674 0.616166 +0.079714 0.599674 0.616166 +0.120832 0.599674 0.616166 +0.159284 0.599674 0.616166 +0.194868 0.599674 0.616166 +0.227530 0.599674 0.616166 +0.257434 0.599674 0.616166 +0.285092 0.599674 0.616166 +0.310738 0.599674 0.616166 +0.334585 0.599674 0.616166 +0.356818 0.599674 0.616166 +0.377602 0.599674 0.616166 +0.397079 0.599674 0.616166 +0.415373 0.599674 0.616166 +0.432594 0.599674 0.616166 +0.448839 0.599674 0.616166 +0.464192 0.599674 0.616166 +0.478729 0.599674 0.616166 +0.492515 0.599674 0.616166 +0.505612 0.599674 0.616166 +0.518072 0.599674 0.616166 +0.529943 0.599674 0.616166 +0.541266 0.599674 0.616166 +0.552083 0.599674 0.616166 +0.562427 0.599674 0.616166 +0.572331 0.599674 0.616166 +0.581823 0.599674 0.616166 +0.590929 0.599674 0.616166 +0.599674 0.599674 0.616166 +0.608079 0.599674 0.616166 +0.616166 0.599674 0.616166 +0.000001 0.608079 0.616166 +0.037293 0.608079 0.616166 +0.079714 0.608079 0.616166 +0.120832 0.608079 0.616166 +0.159284 0.608079 0.616166 +0.194868 0.608079 0.616166 +0.227530 0.608079 0.616166 +0.257434 0.608079 0.616166 +0.285092 0.608079 0.616166 +0.310738 0.608079 0.616166 +0.334585 0.608079 0.616166 +0.356818 0.608079 0.616166 +0.377602 0.608079 0.616166 +0.397079 0.608079 0.616166 +0.415373 0.608079 0.616166 +0.432594 0.608079 0.616166 +0.448839 0.608079 0.616166 +0.464192 0.608079 0.616166 +0.478729 0.608079 0.616166 +0.492515 0.608079 0.616166 +0.505612 0.608079 0.616166 +0.518072 0.608079 0.616166 +0.529943 0.608079 0.616166 +0.541266 0.608079 0.616166 +0.552083 0.608079 0.616166 +0.562427 0.608079 0.616166 +0.572331 0.608079 0.616166 +0.581823 0.608079 0.616166 +0.590929 0.608079 0.616166 +0.599674 0.608079 0.616166 +0.608079 0.608079 0.616166 +0.616166 0.608079 0.616166 +0.000001 0.616166 0.616166 +0.037293 0.616166 0.616166 +0.079714 0.616166 0.616166 +0.120832 0.616166 0.616166 +0.159284 0.616166 0.616166 +0.194868 0.616166 0.616166 +0.227530 0.616166 0.616166 +0.257434 0.616166 0.616166 +0.285092 0.616166 0.616166 +0.310738 0.616166 0.616166 +0.334585 0.616166 0.616166 +0.356818 0.616166 0.616166 +0.377602 0.616166 0.616166 +0.397079 0.616166 0.616166 +0.415373 0.616166 0.616166 +0.432594 0.616166 0.616166 +0.448839 0.616166 0.616166 +0.464192 0.616166 0.616166 +0.478729 0.616166 0.616166 +0.492515 0.616166 0.616166 +0.505612 0.616166 0.616166 +0.518072 0.616166 0.616166 +0.529943 0.616166 0.616166 +0.541266 0.616166 0.616166 +0.552083 0.616166 0.616166 +0.562427 0.616166 0.616166 +0.572331 0.616166 0.616166 +0.581823 0.616166 0.616166 +0.590929 0.616166 0.616166 +0.599674 0.616166 0.616166 +0.608079 0.616166 0.616166 +0.616166 0.616166 0.616166 diff --git a/src/assets/images/app-logo-dark.png b/src/assets/images/app-logo-dark.png new file mode 100644 index 0000000000..3f04a2e1f3 Binary files /dev/null and b/src/assets/images/app-logo-dark.png differ diff --git a/src/assets/images/discord-logo-small.png b/src/assets/images/discord-logo-small.png index db0e70d5d4..59868ac2b0 100644 Binary files a/src/assets/images/discord-logo-small.png and b/src/assets/images/discord-logo-small.png differ diff --git a/src/assets/images/hmc-logo.png b/src/assets/images/hmc-logo.png new file mode 100644 index 0000000000..6070345298 Binary files /dev/null and b/src/assets/images/hmc-logo.png differ diff --git a/src/assets/models/LoadingObject_Atom.glb b/src/assets/models/LoadingObject_Atom.glb index d00834ee7d..3676a3038d 100755 Binary files a/src/assets/models/LoadingObject_Atom.glb and b/src/assets/models/LoadingObject_Atom.glb differ diff --git a/src/assets/stylesheets/hub.scss b/src/assets/stylesheets/hub.scss index d55c3c79b2..3b508f448f 100644 --- a/src/assets/stylesheets/hub.scss +++ b/src/assets/stylesheets/hub.scss @@ -52,3 +52,11 @@ a-entity { vertical-align: -0.125em; height: 1em; } + +// Dat GUI +.dg select { + color: black; +} +.dg input { + line-height: normal; +} diff --git a/src/assets/stylesheets/scene-ui.scss b/src/assets/stylesheets/scene-ui.scss index a9dab8f3fb..c2b3e6d845 100644 --- a/src/assets/stylesheets/scene-ui.scss +++ b/src/assets/stylesheets/scene-ui.scss @@ -72,10 +72,15 @@ width: 100%; display: block; filter: drop-shadow(0 0 4px #888); + padding-bottom: 1em; img { width: 100%; } + svg { + width: 100%; + min-height: 210px; + } } :local(.info) { diff --git a/src/avatar.js b/src/avatar.js index 594e917ff2..f7dfeb8717 100644 --- a/src/avatar.js +++ b/src/avatar.js @@ -1,4 +1,3 @@ -import "./webxr-bypass-hacks"; // We should technically be able to just include three here, but our dependancies are tangled such that not having aframe is a bit difficult import "./utils/theme"; console.log(`Hubs version: ${process.env.BUILD_VERSION || "?"}`); diff --git a/src/change-hub.js b/src/change-hub.js new file mode 100644 index 0000000000..161db10d11 --- /dev/null +++ b/src/change-hub.js @@ -0,0 +1,121 @@ +/* global APP*/ +import { getReticulumFetchUrl, hubUrl } from "./utils/phoenix-utils"; +import { updateEnvironmentForHub, getSceneUrlForHub, updateUIForHub, remountUI } from "./hub"; + +function unloadRoomObjects() { + document.querySelectorAll("[pinnable]").forEach(el => { + if (el.components.pinnable.data.pinned) { + el.parentNode.removeChild(el); + } + }); + + // Clean up empty object.gltf nodes + document.querySelectorAll("#objects-scene .Room_Objects").forEach(el => { + if (!el.children.length) { + el.parentNode.parentNode.removeChild(el.parentNode); + } + }); +} + +function loadRoomObjects(hubId) { + const objectsScene = document.querySelector("#objects-scene"); + const objectsUrl = getReticulumFetchUrl(`/${hubId}/objects.gltf`); + const objectsEl = document.createElement("a-entity"); + objectsEl.setAttribute("gltf-model-plus", { src: objectsUrl, useCache: false, inflate: true }); + objectsScene.appendChild(objectsEl); +} + +export async function changeHub(hubId, addToHistory = true) { + if (hubId === APP.hub.hub_id) { + console.log("Change hub called with the current hub id. This is a noop."); + return; + } + // Suppress on-screen join and leave messages until we receive a sync. + APP.hideHubPresenceEvents = true; + const scene = AFRAME.scenes[0]; + + let data; + try { + data = await APP.hubChannel.migrateToHub(hubId); + } catch (e) { + console.warn(`Failed to join hub ${hubId}: ${e.reason}|${e.message}`); + APP.messageDispatch.log("joinFailed", { message: e.message }); + return; + } + + const hub = data.hubs[0]; + + if (addToHistory) { + window.history.pushState(null, null, hubUrl(hubId, {}, hub.slug)); + } + + APP.hub = hub; + updateUIForHub(hub, APP.hubChannel); + scene.emit("hub_updated", { hub }); + + APP.subscriptions.setSubscribed(data.subscriptions.web_push); + + remountUI({ + hubIsBound: data.hub_requires_oauth, + initialIsFavorited: data.subscriptions.favorites + }); + + NAF.entities.removeRemoteEntities(); + await NAF.connection.adapter.disconnect(); + await APP.dialog.disconnect(); + unloadRoomObjects(); + NAF.connection.connectedClients = {}; + NAF.connection.activeDataChannels = {}; + + NAF.room = hub.hub_id; + + if ( + document.querySelector("#environment-scene").childNodes[0].components["gltf-model-plus"].data.src !== + (await getSceneUrlForHub(hub)) + ) { + const fader = document.getElementById("viewing-camera").components["fader"]; + fader.fadeOut().then(() => { + scene.emit("reset_scene"); + updateEnvironmentForHub(hub, APP.entryManager); + }); + } + + APP.retChannel.push("change_hub", { hub_id: hub.hub_id }); + + await Promise.all([ + APP.dialog.connect({ + serverUrl: `wss://${hub.host}:${hub.port}`, + roomId: hub.hub_id, + joinToken: data.perms_token, + serverParams: { host: hub.host, port: hub.port, turn: hub.turn }, + scene, + clientId: APP.dialog._clientId, + forceTcp: APP.dialog._forceTcp, + forceTurn: APP.dialog._forceTurn, + iceTransportPolicy: APP.dialog._iceTransportPolicy + }), + + NAF.connection.adapter.connect() + ]); + + loadRoomObjects(hubId); + + APP.hubChannel.sendEnteredEvent(); + + APP.messageDispatch.receive({ + type: "hub_changed", + hubName: hub.name, + showLineBreak: true + }); +} +window.changeHub = changeHub; + +// TODO see if there is a better way to do this with react router +window.addEventListener("popstate", function() { + if (!APP.store.state.preferences.fastRoomSwitching) return; + const qs = new URLSearchParams(location.search); + const newHubId = qs.get("hub_id") || document.location.pathname.substring(1).split("/")[0]; + if (newHubId !== APP.hub.hub_id) { + changeHub(newHubId, false); + } +}); diff --git a/src/components/audio-feedback.js b/src/components/audio-feedback.js index 22674b2ac4..c79c8ba403 100644 --- a/src/components/audio-feedback.js +++ b/src/components/audio-feedback.js @@ -315,7 +315,7 @@ AFRAME.registerComponent("mic-button", { const active = this.data.active; const hovering = this.hovering; const spriteNames = - SPRITE_NAMES[!active ? (hovering ? "MIC_HOVER" : "MIC") : hovering ? "MIC_OFF_HOVER" : "MIC_OFF"]; + SPRITE_NAMES[active ? (hovering ? "MIC_HOVER" : "MIC") : hovering ? "MIC_OFF_HOVER" : "MIC_OFF"]; const level = micLevelForVolume(audioAnalyser.volume); const spriteName = spriteNames[level]; if (spriteName !== this.prevSpriteName) { diff --git a/src/components/audio-params.js b/src/components/audio-params.js new file mode 100644 index 0000000000..07f05baee5 --- /dev/null +++ b/src/components/audio-params.js @@ -0,0 +1,61 @@ +// TODO: Reintroduce audio normalization +// import { AudioNormalizer } from "../utils/audio-normalizer"; + +export const DISTANCE_MODEL_OPTIONS = ["linear", "inverse", "exponential"]; + +export const SourceType = Object.freeze({ + MEDIA_VIDEO: 0, + AVATAR_AUDIO_SOURCE: 1, + // TODO: Fill in missing value (2) + AUDIO_TARGET: 3, + AUDIO_ZONE: 4 +}); + +export const AudioType = { + Stereo: "stereo", + PannerNode: "pannernode" +}; + +export const DistanceModelType = { + Linear: "linear", + Inverse: "inverse", + Exponential: "exponential" +}; + +export const AvatarAudioDefaults = Object.freeze({ + audioType: AudioType.PannerNode, + distanceModel: DistanceModelType.Inverse, + rolloffFactor: 5, + refDistance: 5, + maxDistance: 10000, + coneInnerAngle: 180, + coneOuterAngle: 360, + coneOuterGain: 0.9, + gain: 1.0 +}); + +export const MediaAudioDefaults = Object.freeze({ + audioType: AudioType.PannerNode, + distanceModel: DistanceModelType.Inverse, + rolloffFactor: 5, + refDistance: 5, + maxDistance: 10000, + coneInnerAngle: 360, + coneOuterAngle: 0, + coneOuterGain: 0.9, + gain: 0.5 +}); + +export const TargetAudioDefaults = Object.freeze({ + audioType: AudioType.PannerNode, + distanceModel: DistanceModelType.Inverse, + rolloffFactor: 5, + refDistance: 8, + maxDistance: 10000, + coneInnerAngle: 170, + coneOuterAngle: 300, + coneOuterGain: 0.3, + gain: 1.0 +}); + +export const GAIN_TIME_CONST = 0.2; diff --git a/src/components/audio-zone-source.js b/src/components/audio-zone-source.js new file mode 100644 index 0000000000..96c86b4380 --- /dev/null +++ b/src/components/audio-zone-source.js @@ -0,0 +1,43 @@ +import { THREE } from "aframe"; +import { updateAudioSettings } from "../update-audio-settings"; + +AFRAME.registerComponent("audio-zone-source", { + init() { + this.originalAudioParamsData = null; + this.el.sceneEl.systems["hubs-systems"]?.audioZonesSystem.registerSource(this); + }, + + remove() { + APP.zoneOverrides.delete(this.el); + this.el.sceneEl.systems["hubs-systems"]?.audioZonesSystem.unregisterSource(this); + }, + + getPosition: (() => { + const sourcePos = new THREE.Vector3(); + return function() { + const audio = APP.audios.get(this.el); + if (audio) { + audio.getWorldPosition(sourcePos); + } else { + sourcePos.set(0, 0, 0); + } + return sourcePos; + }; + })(), + + apply(params) { + APP.zoneOverrides.set(this.el, params); + const audio = APP.audios.get(this.el); + if (audio) { + updateAudioSettings(this.el, audio); + } + }, + + restore() { + APP.zoneOverrides.delete(this.el); + const audio = APP.audios.get(this.el); + if (audio) { + updateAudioSettings(this.el, audio); + } + } +}); diff --git a/src/components/audio-zone.js b/src/components/audio-zone.js new file mode 100644 index 0000000000..3ea7931c33 --- /dev/null +++ b/src/components/audio-zone.js @@ -0,0 +1,68 @@ +const DEBUG_BBAA_COLOR = 0x49ef4; + +const debugMaterial = new THREE.MeshBasicMaterial({ + color: DEBUG_BBAA_COLOR, + transparent: true, + opacity: 0.25, + side: THREE.DoubleSide +}); + +AFRAME.registerComponent("audio-zone", { + schema: { + enabled: { default: true }, + inOut: { default: true }, + outIn: { default: true }, + debuggable: { default: true } + }, + + init() { + const debugGeometry = new THREE.BoxGeometry(); + this.debugMesh = new THREE.Mesh(debugGeometry, debugMaterial); + this.debugMesh.el = this.el.object3D.el; + const debugBBAA = new THREE.BoxHelper(this.debugMesh, DEBUG_BBAA_COLOR); + this.el.object3D.add(debugBBAA); + this.el.object3D.updateMatrixWorld(true); + + // In some cases (ie. the scene page) these systems might not exist + // so we need to check if the do before registering. + this.el.sceneEl.systems["audio-debug"]?.registerZone(this); + this.el.sceneEl.systems["hubs-systems"]?.audioZonesSystem.registerZone(this); + + this.enableDebug(window.APP.store.state.preferences.showAudioDebugPanel); + }, + + remove() { + // In some cases (ie. the scene page) these systems might not exist + // so we need to check if the do before unregistering. + this.el.sceneEl.systems["audio-debug"]?.unregisterZone(this); + this.el.sceneEl.systems["hubs-systems"]?.audioZonesSystem.unregisterZone(this); + }, + + update() { + this.enableDebug(this.data.debuggable && window.APP.store.state.preferences.showAudioDebugPanel); + }, + + isEnabled() { + return this.data.enabled; + }, + + getBoundingBox: (function() { + const bbaa = new THREE.Box3(); + return function() { + return bbaa.copy(this.debugMesh.geometry.boundingBox).applyMatrix4(this.el.object3D.matrixWorld); + }; + })(), + + enableDebug(debuggable) { + this.data.debuggable = debuggable; + this.el.object3D.visible = debuggable; + }, + + getAudioParams() { + return APP.audioOverrides.get(this.el); + }, + + contains(position) { + return this.getBoundingBox().containsPoint(position); + } +}); diff --git a/src/components/avatar-audio-source.js b/src/components/avatar-audio-source.js index a074b1dce8..dcec1a8bbe 100644 --- a/src/components/avatar-audio-source.js +++ b/src/components/avatar-audio-source.js @@ -1,3 +1,5 @@ +import { SourceType, AudioType } from "./audio-params"; +import { getCurrentAudioSettings, updateAudioSettings } from "../update-audio-settings"; const INFO_INIT_FAILED = "Failed to initialize avatar-audio-source."; const INFO_NO_NETWORKED_EL = "Could not find networked el."; const INFO_NO_OWNER = "Networked component has no owner."; @@ -31,7 +33,7 @@ async function getMediaStream(el) { console.error(INFO_INIT_FAILED, INFO_NO_OWNER); return null; } - const stream = await NAF.connection.adapter.getMediaStream(peerId).catch(e => { + const stream = await APP.dialog.getMediaStream(peerId).catch(e => { console.error(INFO_INIT_FAILED, `Error getting media stream for ${peerId}`, e); }); if (!stream) { @@ -40,43 +42,29 @@ async function getMediaStream(el) { return stream; } -function setPositionalAudioProperties(audio, settings) { - audio.setDistanceModel(settings.distanceModel); - audio.setMaxDistance(settings.maxDistance); - audio.setRefDistance(settings.refDistance); - audio.setRolloffFactor(settings.rolloffFactor); - audio.setDirectionalCone(settings.innerAngle, settings.outerAngle, settings.outerGain); -} - AFRAME.registerComponent("avatar-audio-source", { - schema: { - positional: { default: true }, - distanceModel: { - default: "inverse", - oneOf: ["linear", "inverse", "exponential"] - }, - maxDistance: { default: 10000 }, - refDistance: { default: 1 }, - rolloffFactor: { default: 1 }, - - innerAngle: { default: 360 }, - outerAngle: { default: 0 }, - outerGain: { default: 0 } - }, - createAudio: async function() { + APP.supplementaryAttenuation.delete(this.el); + this.isCreatingAudio = true; const stream = await getMediaStream(this.el); this.isCreatingAudio = false; const isRemoved = !this.el.parentNode; if (!stream || isRemoved) return; + APP.sourceType.set(this.el, SourceType.AVATAR_AUDIO_SOURCE); + const { audioType } = getCurrentAudioSettings(this.el); const audioListener = this.el.sceneEl.audioListener; - const audio = this.data.positional ? new THREE.PositionalAudio(audioListener) : new THREE.Audio(audioListener); - if (this.data.positional) { - setPositionalAudioProperties(audio, this.data); + let audio; + if (audioType === AudioType.PannerNode) { + audio = new THREE.PositionalAudio(audioListener); + } else { + audio = new THREE.Audio(audioListener); } + this.audioSystem.removeAudio(audio); + this.audioSystem.addAudio(SourceType.AVATAR_AUDIO_SOURCE, audio); + if (SHOULD_CREATE_SILENT_AUDIO_ELS) { createSilentAudioEl(stream); // TODO: Do the audio els need to get cleaned up? } @@ -88,22 +76,40 @@ AFRAME.registerComponent("avatar-audio-source", { audio.setNodeSource(destinationSource); this.el.setObject3D(this.attrName, audio); this.el.emit("sound-source-set", { soundSource: destinationSource }); + + APP.audios.set(this.el, audio); + updateAudioSettings(this.el, audio); }, destroyAudio() { const audio = this.el.getObject3D(this.attrName); if (!audio) return; - audio.disconnect(); + this.audioSystem.removeAudio(audio); this.el.removeObject3D(this.attrName); + + APP.audios.delete(this.el); + APP.sourceType.delete(this.el); + APP.supplementaryAttenuation.delete(this.el); }, init() { - this.el.sceneEl.systems["hubs-systems"].audioSettingsSystem.registerAvatarAudioSource(this); + this.audioSystem = this.el.sceneEl.systems["hubs-systems"].audioSystem; // We subscribe to audio stream notifications for this peer to update the audio source // This could happen in case there is an ICE failure that requires a transport recreation. - NAF.connection.adapter.on("stream_updated", this._onStreamUpdated, this); + APP.dialog.on("stream_updated", this._onStreamUpdated, this); this.createAudio(); + + let audioOutputModePref = APP.store.state.preferences.audioOutputMode; + this.onPreferenceChanged = () => { + const newPref = APP.store.state.preferences.audioOutputMode; + const shouldRecreateAudio = audioOutputModePref !== newPref && !this.isCreatingAudio; + audioOutputModePref = newPref; + if (shouldRecreateAudio) { + this.createAudio(); + } + }; + APP.store.addEventListener("statechanged", this.onPreferenceChanged); }, async _onStreamUpdated(peerId, kind) { @@ -115,7 +121,7 @@ AFRAME.registerComponent("avatar-audio-source", { getOwnerId(this.el).then(async ownerId => { if (ownerId === peerId && kind === "audio") { // The audio stream for this peer has been updated - const newStream = await NAF.connection.adapter.getMediaStream(peerId, "audio").catch(e => { + const newStream = await APP.dialog.getMediaStream(peerId, "audio").catch(e => { console.error(INFO_INIT_FAILED, `Error getting media stream for ${peerId}`, e); }); @@ -128,24 +134,8 @@ AFRAME.registerComponent("avatar-audio-source", { }); }, - update(oldData) { - if (this.isCreatingAudio) return; - - const audio = this.el.getObject3D(this.attrName); - if (!audio) return; - - const shouldRecreateAudio = oldData.positional !== this.data.positional; - if (shouldRecreateAudio) { - this.destroyAudio(); - this.createAudio(); - } else if (this.data.positional) { - setPositionalAudioProperties(audio, this.data); - } - }, - remove: function() { - this.el.sceneEl.systems["hubs-systems"].audioSettingsSystem.unregisterAvatarAudioSource(this); - NAF.connection.adapter.off("stream_updated", this._onStreamUpdated); + APP.dialog.off("stream_updated", this._onStreamUpdated); this.destroyAudio(); } }); @@ -153,9 +143,9 @@ AFRAME.registerComponent("avatar-audio-source", { function createWhiteNoise(audioContext, gain) { const bufferSize = 2 * audioContext.sampleRate, noiseBuffer = audioContext.createBuffer(1, bufferSize, audioContext.sampleRate), - output = noiseBuffer.getChannelData(0); + gainFilter = noiseBuffer.getChannelData(0); for (let i = 0; i < bufferSize; i++) { - output[i] = (Math.random() * 2 - 1) * gain; + gainFilter[i] = (Math.random() * 2 - 1) * gain; } const whiteNoise = audioContext.createBufferSource(); @@ -185,7 +175,7 @@ AFRAME.registerComponent("zone-audio-source", { init() { const audioListener = this.el.sceneEl.audioListener; const ctx = audioListener.context; - this.output = ctx.createGain(); + this.gainFilter = ctx.createGain(); if (this.data.debug) { this.whiteNoise = createWhiteNoise(ctx, 0.01); this.setInput(this.whiteNoise); @@ -207,18 +197,18 @@ AFRAME.registerComponent("zone-audio-source", { setInput(newInput) { if (this.input) { - this.input.disconnect(this.output); + this.input.disconnect(this.gainFilter); this.input = null; } if (newInput) { - newInput.connect(this.output); + newInput.connect(this.gainFilter); this.input = newInput; } }, - getAudioOutput() { - return this.output; + getGainFilter() { + return this.gainFilter; }, tick() { @@ -266,54 +256,40 @@ AFRAME.registerComponent("zone-audio-source", { */ AFRAME.registerComponent("audio-target", { schema: { - positional: { default: true }, - - distanceModel: { - default: "inverse", - oneOf: ["linear", "inverse", "exponential"] - }, - maxDistance: { default: 10000 }, - refDistance: { default: 8 }, - rolloffFactor: { default: 5 }, - - innerAngle: { default: 170 }, - outerAngle: { default: 300 }, - outerGain: { default: 0.3 }, - minDelay: { default: 0.01 }, maxDelay: { default: 0.13 }, - gain: { default: 1.0 }, - srcEl: { type: "selector" }, - debug: { default: false } }, init() { + this.audioSystem = this.el.sceneEl.systems["hubs-systems"].audioSystem; this.createAudio(); // TODO this is to ensure targets and sources loaded at the same time don't have // an order depndancy but this should be done in a more robust way setTimeout(() => { this.connectAudio(); }, 0); + this.el.setAttribute("audio-zone-source"); }, remove: function() { this.destroyAudio(); + this.el.removeAttribute("audio-zone-source"); }, createAudio: function() { + APP.supplementaryAttenuation.delete(this.el); + APP.sourceType.set(this.el, SourceType.AUDIO_TARGET); const audioListener = this.el.sceneEl.audioListener; - const audio = this.data.positional ? new THREE.PositionalAudio(audioListener) : new THREE.Audio(audioListener); - - if (this.data.debug && this.data.positional) { - setPositionalAudioProperties(audio, this.data); - const helper = new THREE.PositionalAudioHelper(audio, this.data.refDistance, 16, 16); - audio.add(helper); + let audio = null; + const { audioType } = getCurrentAudioSettings(this.el); + if (audioType === AudioType.PannerNode) { + audio = new THREE.PositionalAudio(audioListener); + } else { + audio = new THREE.Audio(audioListener); } - audio.setVolume(this.data.gain); - if (this.data.maxDelay > 0) { const delayNode = audio.context.createDelay(this.data.maxDelay); delayNode.delayTime.value = THREE.Math.randFloat(this.data.minDelay, this.data.maxDelay); @@ -324,12 +300,19 @@ AFRAME.registerComponent("audio-target", { audio.matrixNeedsUpdate = true; audio.updateMatrixWorld(); this.audio = audio; + + this.audioSystem.removeAudio(this.audio); + this.audioSystem.addAudio(SourceType.AVATAR_AUDIO_SOURCE, this.audio); + + this.audio.updateMatrixWorld(); + APP.audios.set(this.el, audio); + updateAudioSettings(this.el, audio); }, connectAudio() { const srcEl = this.data.srcEl; const srcZone = srcEl && srcEl.components["zone-audio-source"]; - const node = srcZone && srcZone.getAudioOutput(); + const node = srcZone && srcZone.getGainFilter(); if (node) { this.audio.setNodeSource(node); } else { @@ -341,7 +324,11 @@ AFRAME.registerComponent("audio-target", { const audio = this.el.getObject3D(this.attrName); if (!audio) return; - audio.disconnect(); + this.audioSystem.removeAudio(this.audio); this.el.removeObject3D(this.attrName); + + APP.supplementaryAttenuation.delete(this.el); + APP.audios.delete(this.el); + APP.sourceType.delete(this.el); } }); diff --git a/src/components/avatar-volume-controls.js b/src/components/avatar-volume-controls.js index 7170874506..2dbb979e87 100644 --- a/src/components/avatar-volume-controls.js +++ b/src/components/avatar-volume-controls.js @@ -1,103 +1,11 @@ -import { VOLUME_LABELS } from "./media-views"; -const MAX_VOLUME = 8; +import { updateAudioSettings } from "../update-audio-settings"; +import { VOLUME_LABELS } from "./media-video"; +const MAX_MULTIPLIER = 8; const SMALL_STEP = 1 / (VOLUME_LABELS.length / 2); -const BIG_STEP = (MAX_VOLUME - 1) / (VOLUME_LABELS.length / 2); - -// Inserts analyser and gain nodes after audio source. -// Analyses audio source volume and adjusts gain value -// to make it in a certain range. -class AudioNormalizer { - constructor(audio) { - this.audio = audio; - this.analyser = audio.context.createAnalyser(); - this.connected = false; - - // To analyse volume, 32 fftsize may be good enough - this.analyser.fftSize = 32; - this.gain = audio.context.createGain(); - this.timeData = new Uint8Array(this.analyser.frequencyBinCount); - this.volumes = []; - this.volumeSum = 0; - } - - apply() { - if (window.APP.store.state.preferences.audioNormalization) { - if (!this.connected) { - this.connect(); - } - } else { - if (this.connected) { - this.disconnect(); - } - return; - } - - // Adjusts volume in "a rule of the thumb" way - // Any better algorithm? - - // Regards the RMS of time-domain data as volume. - // Is this a right approach? - // Using the RMS of frequency-domain data would be another option. - this.analyser.getByteTimeDomainData(this.timeData); - const squareSum = this.timeData.reduce((sum, num) => sum + Math.pow(num - 128, 2), 0); - const volume = Math.sqrt(squareSum / this.analyser.frequencyBinCount); - const baseVolume = window.APP.store.state.preferences.audioNormalization; - - // Regards volume under certain threshold as "not speaking" and skips. - // I'm not sure if 0.4 is an appropriate threshold. - if (volume >= Math.min(0.4, baseVolume)) { - this.volumeSum += volume; - this.volumes.push(volume); - // Sees only recent volume history because there is a chance - // that a speaker changes their master input volume. - // I'm not sure if 600 is an appropriate number. - while (this.volumes.length > 600) { - this.volumeSum -= this.volumes.shift(); - } - // Adjusts volume after getting many enough volume history. - // I'm not sure if 60 is an appropriate number. - if (this.volumes.length >= 60) { - const averageVolume = this.volumeSum / this.volumes.length; - this.gain.gain.setTargetAtTime(baseVolume / averageVolume, this.audio.context.currentTime, 0.01); - } - } - } - - connect() { - // Hacks. THREE.Audio connects audio nodes when source is set. - // If audio is not played yet, THREE.Audio.setFilters() doesn't - // reset connections. Then manually caling .connect()/disconnect() here. - // This might be a bug of Three.js and should be fixed in Three.js side? - if (this.audio.source && !this.audio.isPlaying) { - this.audio.disconnect(); - } - const filters = this.audio.getFilters(); - filters.unshift(this.analyser, this.gain); - this.audio.setFilters(filters); - if (this.audio.source && !this.audio.isPlaying) { - this.audio.connect(); - } - this.connected = true; - } - - disconnect() { - if (this.audio.source && !this.audio.isPlaying) { - this.audio.disconnect(); - } - const filters = [this.analyser, this.gain]; - this.audio.setFilters(this.audio.getFilters().filter(filter => !filters.includes(filter))); - if (this.audio.source && !this.audio.isPlaying) { - this.audio.connect(); - } - this.connected = false; - } -} +const BIG_STEP = (MAX_MULTIPLIER - 1) / (VOLUME_LABELS.length / 2); +const DEFAULT_VOLUME_BAR_MULTIPLIER = 1.0; AFRAME.registerComponent("avatar-volume-controls", { - schema: { - volume: { type: "number", default: 1.0 } - }, - init() { this.volumeUp = this.volumeUp.bind(this); this.volumeDown = this.volumeDown.bind(this); @@ -110,86 +18,46 @@ AFRAME.registerComponent("avatar-volume-controls", { this.update = this.update.bind(this); this.normalizer = null; window.APP.store.addEventListener("statechanged", this.update); - + this.audioEl = this.el.parentEl.parentEl.querySelector("[avatar-audio-source]"); + APP.gainMultipliers.set(this.audioEl, DEFAULT_VOLUME_BAR_MULTIPLIER); this.updateVolumeLabel(); }, remove() { + APP.gainMultipliers.delete(this.audioEl); window.APP.store.removeEventListener("statechanged", this.update); }, changeVolumeBy(v) { - this.el.setAttribute("avatar-volume-controls", "volume", THREE.Math.clamp(this.data.volume + v, 0, MAX_VOLUME)); + let gainMultiplier = APP.gainMultipliers.get(this.audioEl); + gainMultiplier = THREE.Math.clamp(gainMultiplier + v, 0, MAX_MULTIPLIER); + APP.gainMultipliers.set(this.audioEl, gainMultiplier); this.updateVolumeLabel(); + const audio = APP.audios.get(this.audioEl); + if (audio) { + updateAudioSettings(this.audioEl, audio); + } }, volumeUp() { - const step = this.data.volume > 1 - SMALL_STEP ? BIG_STEP : SMALL_STEP; + const gainMultiplier = APP.gainMultipliers.get(this.audioEl); + const step = gainMultiplier > 1 - SMALL_STEP ? BIG_STEP : SMALL_STEP; this.changeVolumeBy(step); }, volumeDown() { - const step = this.data.volume > 1 + SMALL_STEP ? BIG_STEP : SMALL_STEP; + const gainMultiplier = APP.gainMultipliers.get(this.audioEl); + const step = gainMultiplier > 1 + SMALL_STEP ? BIG_STEP : SMALL_STEP; this.changeVolumeBy(-1 * step); }, - update: (function() { - const positionA = new THREE.Vector3(); - const positionB = new THREE.Vector3(); - return function update() { - const audio = this.avatarAudioSource && this.avatarAudioSource.el.getObject3D(this.avatarAudioSource.attrName); - if (!audio) { - return; - } - - if (!this.normalizer) { - this.normalizer = new AudioNormalizer(audio); - this.avatarAudioSource.el.addEventListener("sound-source-set", () => { - const audio = - this.avatarAudioSource && this.avatarAudioSource.el.getObject3D(this.avatarAudioSource.attrName); - if (audio) { - this.normalizer = new AudioNormalizer(audio); - this.normalizer.apply(); - } - }); - } - - this.normalizer.apply(); - - const { audioOutputMode, globalVoiceVolume } = window.APP.store.state.preferences; - const volumeModifier = (globalVoiceVolume !== undefined ? globalVoiceVolume : 100) / 100; - let gain = volumeModifier * this.data.volume; - if (audioOutputMode === "audio") { - this.avatarAudioSource.el.object3D.getWorldPosition(positionA); - this.el.sceneEl.audioListener.getWorldPosition(positionB); - const squaredDistance = positionA.distanceToSquared(positionB); - gain = gain * Math.min(1, 10 / Math.max(1, squaredDistance)); - } - - audio.gain.gain.value = gain; - }; - })(), - updateVolumeLabel() { + const gainMultiplier = APP.gainMultipliers.get(this.audioEl); const numBars = Math.min( VOLUME_LABELS.length - 1, - this.data.volume <= 1.001 - ? Math.floor(this.data.volume / SMALL_STEP) - : Math.floor(VOLUME_LABELS.length / 2 + (this.data.volume - 1) / BIG_STEP) + gainMultiplier <= 1.001 + ? Math.floor(gainMultiplier / SMALL_STEP) + : Math.floor(VOLUME_LABELS.length / 2 + (gainMultiplier - 1) / BIG_STEP) ); - this.volumeLabel.setAttribute("text", "value", this.data.volume === 0 ? "Muted" : VOLUME_LABELS[numBars]); - }, - - tick() { - if (!this.avatarAudioSource && !this.searchFailed) { - // Walk up to Spine and then search down. - const sourceEl = this.el.parentNode.parentNode.querySelector("[avatar-audio-source]"); - if (!sourceEl || !sourceEl.components["avatar-audio-source"]) { - this.searchFailed = true; - return; - } - this.avatarAudioSource = sourceEl.components["avatar-audio-source"]; - } - - this.update(); + this.volumeLabel.setAttribute("text", "value", gainMultiplier === 0 ? "Muted" : VOLUME_LABELS[numBars]); } }); diff --git a/src/components/billboard.js b/src/components/billboard.js index 9b11c9dbcb..7b41d0d2ef 100644 --- a/src/components/billboard.js +++ b/src/components/billboard.js @@ -6,7 +6,6 @@ AFRAME.registerComponent("billboard", { onlyY: { type: "boolean" } }, init: function() { - this.target = new THREE.Vector3(); this._updateBillboard = this._updateBillboard.bind(this); this._updateIsInView = this._updateIsInView.bind(this); @@ -80,22 +79,27 @@ AFRAME.registerComponent("billboard", { }; })(), - _updateBillboard: function() { - if (!this.el.object3D.visible) return; + _updateBillboard: (function() { + const targetPos = new THREE.Vector3(); + const worldPos = new THREE.Vector3(); + return function() { + if (!this.el.object3D.visible) return; - const camera = this.el.sceneEl.camera; - const object3D = this.el.object3D; + const camera = this.el.sceneEl.camera; + const object3D = this.el.object3D; - if (camera) { - // Set the camera world position as the target. - this.target.setFromMatrixPosition(camera.matrixWorld); - object3D.lookAt(this.target); + if (camera) { + // Set the camera world position as the target. + targetPos.setFromMatrixPosition(camera.matrixWorld); - if (this.data.onlyY) { - object3D.rotation.x = 0; - } + if (this.data.onlyY) { + object3D.getWorldPosition(worldPos); + targetPos.y = worldPos.y; + } + object3D.lookAt(targetPos); - object3D.matrixNeedsUpdate = true; - } - } + object3D.matrixNeedsUpdate = true; + } + }; + })() }); diff --git a/src/components/bone-mute-state-indicator.js b/src/components/bone-mute-state-indicator.js index 2b88b9fe20..c1d8604f43 100644 --- a/src/components/bone-mute-state-indicator.js +++ b/src/components/bone-mute-state-indicator.js @@ -3,6 +3,7 @@ * @namespace avatar * @component bone-mute-state-indicator */ +// TODO: Remove this AFRAME.registerComponent("bone-mute-state-indicator", { schema: { unmutedBoneName: { default: "Watch_Joint_MicON" }, @@ -20,26 +21,23 @@ AFRAME.registerComponent("bone-mute-state-indicator", { this.updateMuteState(); }); + + this.onMicStateChanged = () => { + this.updateMuteState(); + }; }, play() { - this.el.sceneEl.addEventListener("stateadded", this.onStateToggled); - this.el.sceneEl.addEventListener("stateremoved", this.onStateToggled); + APP.dialog.on("mic-state-changed", this.onMicStateChanged); }, pause() { - this.el.sceneEl.removeEventListener("stateadded", this.onStateToggled); - this.el.sceneEl.removeEventListener("stateremoved", this.onStateToggled); - }, - - onStateToggled(e) { - if (!e.detail.state === "muted") return; - this.updateMuteState(); + APP.dialog.off("mic-state-changed", this.onMicStateChanged); }, updateMuteState() { if (!this.modelLoaded) return; - const muted = this.el.sceneEl.is("muted"); + const muted = !APP.dialog.isMicEnabled; this.mutedBone.position.y = muted ? this.data.onPos : this.data.offPos; this.unmutedBone.position.y = !muted ? this.data.onPos : this.data.offPos; this.mutedBone.matrixNeedsUpdate = true; diff --git a/src/components/camera-tool.js b/src/components/camera-tool.js index f6c6fc4f75..43c6f1a67e 100644 --- a/src/components/camera-tool.js +++ b/src/components/camera-tool.js @@ -9,6 +9,7 @@ import { loadModel } from "./gltf-model-plus"; import { waitForDOMContentLoaded } from "../utils/async-utils"; import cameraModelSrc from "../assets/camera_tool.glb"; import anime from "animejs"; +import { Layers } from "./layers"; const cameraModelPromise = waitForDOMContentLoaded().then(() => loadModel(cameraModelSrc)); @@ -110,6 +111,7 @@ AFRAME.registerComponent("camera-tool", { }); this.camera = new THREE.PerspectiveCamera(50, RENDER_WIDTH / RENDER_HEIGHT, 0.1, 30000); + this.camera.layers.enable(Layers.CAMERA_LAYER_VIDEO_TEXTURE_TARGET); this.camera.rotation.set(0, Math.PI, 0); this.camera.position.set(0, 0, 0.05); this.camera.matrixNeedsUpdate = true; @@ -184,11 +186,6 @@ AFRAME.registerComponent("camera-tool", { const width = 0.28; const geometry = new THREE.PlaneBufferGeometry(width, width / this.camera.aspect); - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - if (environmentMapComponent) { - environmentMapComponent.applyEnvironmentMap(this.el.object3D); - } - this.screen = new THREE.Mesh(geometry, material); this.screen.rotation.set(0, Math.PI, 0); this.screen.position.set(0, 0, -0.042); @@ -389,7 +386,7 @@ AFRAME.registerComponent("camera-tool", { }; if (this.data.captureAudio) { - const selfAudio = await NAF.connection.adapter.getMediaStream(NAF.clientId, "audio"); + const selfAudio = await APP.dialog.getMediaStream(NAF.clientId, "audio"); // NOTE: if we don't have a self audio track, we can end up generating an empty video (browser bug?) // if no audio comes through on the listener source. (Eg the room is otherwise silent.) @@ -490,6 +487,7 @@ AFRAME.registerComponent("camera-tool", { if (cancel) { this.videoRecorder.onstop = () => {}; this.videoRecorder._free(); + this.el.sceneEl.emit("action_camera_recording_ended"); } this.videoRecorder.stop(); @@ -502,8 +500,8 @@ AFRAME.registerComponent("camera-tool", { clearInterval(this.videoCountdownInterval); this.videoCountdownInterval = null; - this.el.setAttribute("camera-tool", "label", ""); - this.el.setAttribute("camera-tool", { isRecording: false, isSnapping: false }); + + this.el.setAttribute("camera-tool", { label: " ", isRecording: false, isSnapping: false }); }, tick() { @@ -635,10 +633,10 @@ AFRAME.registerComponent("camera-tool", { boneVisibilitySystem.tick(); } - const tmpVRFlag = renderer.vr.enabled; + const tmpVRFlag = renderer.xr.enabled; const tmpOnAfterRender = sceneEl.object3D.onAfterRender; delete sceneEl.object3D.onAfterRender; - renderer.vr.enabled = false; + renderer.xr.enabled = false; if (allowVideo && this.videoRecorder && !this.videoRenderTarget) { // Create a separate render target for video becuase we need to flip and (sometimes) downscale it before @@ -660,7 +658,7 @@ AFRAME.registerComponent("camera-tool", { renderer.render(sceneEl.object3D, this.camera); renderer.setRenderTarget(null); - renderer.vr.enabled = tmpVRFlag; + renderer.xr.enabled = tmpVRFlag; sceneEl.object3D.onAfterRender = tmpOnAfterRender; if (playerHead) { playerHead.visible = false; diff --git a/src/components/environment-map.js b/src/components/environment-map.js index 739c1f0b61..6d14271d08 100644 --- a/src/components/environment-map.js +++ b/src/components/environment-map.js @@ -1,4 +1,3 @@ -import { forEachMaterial } from "../utils/material-utils"; import cubeMapPosX from "../assets/images/cubemap/posx.jpg"; import cubeMapNegX from "../assets/images/cubemap/negx.jpg"; import cubeMapPosY from "../assets/images/cubemap/posy.jpg"; @@ -14,27 +13,3 @@ export async function createDefaultEnvironmentMap() { texture.format = THREE.RGBFormat; return texture; } - -AFRAME.registerComponent("environment-map", { - init() { - this.environmentMap = null; - - this.updateEnvironmentMap = this.updateEnvironmentMap.bind(this); - }, - - updateEnvironmentMap(environmentMap) { - this.environmentMap = environmentMap; - this.applyEnvironmentMap(this.el.object3D); - }, - - applyEnvironmentMap(object3D) { - object3D.traverse(object => { - forEachMaterial(object, material => { - if (material.isMeshStandardMaterial) { - material.envMap = this.environmentMap; - material.needsUpdate = true; - } - }); - }); - } -}); diff --git a/src/components/gltf-model-plus.js b/src/components/gltf-model-plus.js index 86a410b802..caa3d58509 100644 --- a/src/components/gltf-model-plus.js +++ b/src/components/gltf-model-plus.js @@ -1,5 +1,5 @@ import nextTick from "../utils/next-tick"; -import { mapMaterials, convertStandardMaterial } from "../utils/material-utils"; +import { updateMaterials, mapMaterials, convertStandardMaterial } from "../utils/material-utils"; import SketchfabZipWorker from "../workers/sketchfab-zip.worker.js"; import { getCustomGLTFParserURLResolver } from "../utils/media-url-utils"; import { promisifyWorker } from "../utils/promisify-worker.js"; @@ -7,6 +7,8 @@ import { MeshBVH, acceleratedRaycast } from "three-mesh-bvh"; import { disposeNode, cloneObject3D } from "../utils/three-utils"; import HubsTextureLoader from "../loaders/HubsTextureLoader"; import { KTX2Loader } from "three/examples/jsm/loaders/KTX2Loader"; +import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"; +import { BasisTextureLoader } from "three/examples/jsm/loaders/BasisTextureLoader"; THREE.Mesh.prototype.raycast = acceleratedRaycast; @@ -57,7 +59,8 @@ const extractZipFile = promisifyWorker(new SketchfabZipWorker()); function defaultInflator(el, componentName, componentData) { if (!AFRAME.components[componentName]) { - throw new Error(`Inflator failed. "${componentName}" component does not exist.`); + console.warn(`Inflator failed. "${componentName}" component does not exist.`); + return; } if (AFRAME.components[componentName].multiple && Array.isArray(componentData)) { for (let i = 0; i < componentData.length; i++) { @@ -245,11 +248,33 @@ async function inflateComponents(inflatedEntity, indexToEntityMap) { const entityComponents = getHubsComponents(object3D); const el = object3D.el; + function resolveNodeRefs(componentData) { + for (const propName in componentData) { + const value = componentData[propName]; + const type = value?.__mhc_link_type; + if (type === "node" && value.index !== undefined) { + if (indexToEntityMap[value.index]) { + componentData[propName] = indexToEntityMap[value.index].object3D; + } else { + console.warn("inflateComponents: invalid node reference", propName); + componentData[propName] = null; + } + } + } + return componentData; + } + if (entityComponents && el) { for (const prop in entityComponents) { if (entityComponents.hasOwnProperty(prop) && AFRAME.GLTFModelPlus.components.hasOwnProperty(prop)) { const { componentName, inflator } = AFRAME.GLTFModelPlus.components[prop]; - await inflator(el, componentName, entityComponents[prop], entityComponents, indexToEntityMap); + await inflator( + el, + componentName, + resolveNodeRefs(entityComponents[prop]), + entityComponents, + indexToEntityMap + ); } } } @@ -260,7 +285,13 @@ async function inflateComponents(inflatedEntity, indexToEntityMap) { for (const prop in materialComponents) { if (materialComponents.hasOwnProperty(prop) && AFRAME.GLTFModelPlus.components.hasOwnProperty(prop)) { const { componentName, inflator } = AFRAME.GLTFModelPlus.components[prop]; - await inflator(el, componentName, materialComponents[prop], materialComponents, indexToEntityMap); + await inflator( + el, + componentName, + resolveNodeRefs(materialComponents[prop]), + materialComponents, + indexToEntityMap + ); } } } @@ -406,7 +437,7 @@ class GLTFHubsPlugin { // @TODO: Should this be fixed in the gltf loader? object.matrixAutoUpdate = THREE.Object3D.DefaultMatrixAutoUpdate; const materialQuality = window.APP.store.materialQualitySetting; - object.material = mapMaterials(object, material => convertStandardMaterial(material, materialQuality)); + updateMaterials(object, material => convertStandardMaterial(material, materialQuality)); }); // Replace animation target node name with the node uuid. @@ -431,6 +462,69 @@ class GLTFHubsPlugin { } } +class GLTFHubsComponentsExtension { + constructor(parser) { + this.parser = parser; + this.name = "MOZ_hubs_components"; + } + + afterRoot({ scenes, parser }) { + const deps = []; + + const resolveComponents = (gltfRootType, obj) => { + const idx = parser.associations.get(obj)?.[gltfRootType]; + if (idx === undefined) return; + const ext = parser.json[gltfRootType][idx].extensions?.[this.name]; + if (!ext) return; + + // TODO putting this into userData is a bit silly, we should just inflate here, but entities need to be inflated first... + obj.userData.gltfExtensions = Object.assign(obj.userData.gltfExtensions || {}, { + MOZ_hubs_components: ext + }); + + for (const componentName in ext) { + const props = ext[componentName]; + for (const propName in props) { + const value = props[propName]; + const type = value?.__mhc_link_type; + if (type && value.index !== undefined) { + deps.push( + parser.getDependency(type, value.index).then(loadedDep => { + // TODO similar to above, this logic being spread out in multiple places is not great... + // Node refences are assumed to always be in the scene graph. These referneces are late-resolved in inflateComponents + // otherwise they will need to be updated when cloning (which happens as part of caching). + if (type === "node") return; + + if (type === "texture" && !parser.json.textures[value.index].extensions?.MOZ_texture_rgbe) { + // For now assume all non HDR textures linked in hubs components are sRGB. + // We can allow this to be overriden later if needed + loadedDep.encoding = THREE.sRGBEncoding; + } + + props[propName] = loadedDep; + + return loadedDep; + }) + ); + } + } + } + }; + + for (let i = 0; i < scenes.length; i++) { + // TODO this should be done by GLTLoader + parser.associations.set(scenes[i], { scenes: i }); + scenes[i].traverse(obj => { + resolveComponents("scenes", obj); + resolveComponents("nodes", obj); + mapMaterials(obj, resolveComponents.bind(this, "materials")); + }); + } + + return Promise.all(deps); + } +} + class GLTFHubsLightMapExtension { constructor(parser) { this.parser = parser; @@ -475,6 +569,7 @@ class GLTFHubsTextureBasisExtension { constructor(parser) { this.parser = parser; this.name = "MOZ_HUBS_texture_basis"; + this.basisLoader = null; } loadTexture(textureIndex) { @@ -486,7 +581,11 @@ class GLTFHubsTextureBasisExtension { return null; } - if (!parser.options.ktx2Loader) { + if (this.basisLoader === null) { + this.basisLoader = new BasisTextureLoader(parser.options.manager).detectSupport(AFRAME.scenes[0].renderer); + } + + if (!this.basisLoader) { // @TODO: Display warning (only if the extension is in extensionsRequired)? return null; } @@ -495,9 +594,38 @@ class GLTFHubsTextureBasisExtension { const extensionDef = textureDef.extensions[this.name]; const source = json.images[extensionDef.source]; - const loader = parser.options.ktx2Loader.basisLoader; - return parser.loadTextureImage(textureIndex, source, loader); + return parser.loadTextureImage(textureIndex, source, this.basisLoader); + } +} + +class GLTFMozTextureRGBE { + constructor(parser, loader) { + this.parser = parser; + this.loader = loader; + this.name = "MOZ_texture_rgbe"; + } + + loadTexture(textureIndex) { + const parser = this.parser; + const json = parser.json; + const textureDef = json.textures[textureIndex]; + + if (!textureDef.extensions || !textureDef.extensions[this.name]) { + return null; + } + + const extensionDef = textureDef.extensions[this.name]; + const source = json.images[extensionDef.source]; + return parser.loadTextureImage(textureIndex, source, this.loader).then(t => { + // TODO pretty severe artifacting when using mipmaps, disable for now + if (t.minFilter == THREE.NearestMipmapNearestFilter || t.minFilter == THREE.NearestMipmapLinearFilter) { + t.minFilter = THREE.NearestFilter; + } else if (t.minFilter == THREE.LinearMipmapNearestFilter || t.minFilter == THREE.LinearMipmapLinearFilter) { + t.minFilter = THREE.LinearFilter; + } + return t; + }); } } @@ -514,9 +642,11 @@ export async function loadGLTF(src, contentType, onProgress, jsonPreprocessor) { loadingManager.setURLModifier(getCustomGLTFParserURLResolver(gltfUrl)); const gltfLoader = new THREE.GLTFLoader(loadingManager); gltfLoader + .register(parser => new GLTFHubsComponentsExtension(parser)) .register(parser => new GLTFHubsPlugin(parser, jsonPreprocessor)) .register(parser => new GLTFHubsLightMapExtension(parser)) - .register(parser => new GLTFHubsTextureBasisExtension(parser)); + .register(parser => new GLTFHubsTextureBasisExtension(parser)) + .register(parser => new GLTFMozTextureRGBE(parser, new RGBELoader().setDataType(THREE.HalfFloatType))); // TODO some models are loaded before the renderer exists. This is likely things like the camera tool and loading cube. // They don't currently use KTX textures but if they did this would be an issue. Fixing this is hard but is part of @@ -540,6 +670,7 @@ export async function loadGLTF(src, contentType, onProgress, jsonPreprocessor) { } export async function loadModel(src, contentType = null, useCache = false, jsonPreprocessor = null) { + console.log(`Loading model ${src}`); if (useCache) { if (gltfCache.has(src)) { gltfCache.retain(src); @@ -597,6 +728,10 @@ AFRAME.registerComponent("gltf-model-plus", { this.loadTemplates(); }, + play() { + this.el.components["listed-media"] && this.el.sceneEl.emit("listed_media_changed"); + }, + update() { this.applySrc(resolveAsset(this.data.src), this.data.contentType); }, @@ -701,12 +836,6 @@ AFRAME.registerComponent("gltf-model-plus", { if (el) rewires.push(() => (o.el = el)); }); - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - - if (environmentMapComponent) { - environmentMapComponent.applyEnvironmentMap(object3DToSet); - } - if (lastSrc) { gltfCache.release(lastSrc); } diff --git a/src/components/ik-controller.js b/src/components/ik-controller.js index 2abbecb8a1..13d1c49900 100644 --- a/src/components/ik-controller.js +++ b/src/components/ik-controller.js @@ -160,7 +160,7 @@ AFRAME.registerComponent("ik-controller", { this.middleEyePosition.addVectors(this.leftEye.position, this.rightEye.position); this.middleEyePosition.divideScalar(2); this.middleEyeMatrix.makeTranslation(this.middleEyePosition.x, this.middleEyePosition.y, this.middleEyePosition.z); - this.invMiddleEyeToHead = this.middleEyeMatrix.getInverse(this.middleEyeMatrix); + this.invMiddleEyeToHead = this.middleEyeMatrix.copy(this.middleEyeMatrix).invert(); this.invHipsToHeadVector .addVectors(this.chest.position, this.neck.position) @@ -242,10 +242,9 @@ AFRAME.registerComponent("ik-controller", { if (yDelta > this.data.maxLerpAngle) { avatar.quaternion.copy(cameraYQuaternion); } else { - Quaternion.slerp( + avatar.quaternion.slerpQuaternions( avatar.quaternion, cameraYQuaternion, - avatar.quaternion, (this.data.rotationSpeed * dt) / 1000 ); } @@ -257,12 +256,12 @@ AFRAME.registerComponent("ik-controller", { // Take the head orientation computed from the hmd, remove the Y rotation already applied to it by the hips, // and apply it to the head - invHipsQuaternion.copy(avatar.quaternion).inverse(); + invHipsQuaternion.copy(avatar.quaternion).invert(); head.quaternion.setFromRotationMatrix(headTransform).premultiply(invHipsQuaternion); avatar.updateMatrix(); rootToChest.multiplyMatrices(avatar.matrix, chest.matrix); - invRootToChest.getInverse(rootToChest); + invRootToChest.copy(rootToChest).invert(); root.matrixNeedsUpdate = true; neck.matrixNeedsUpdate = true; @@ -324,7 +323,7 @@ AFRAME.registerComponent("ik-controller", { const cameraWorld = new THREE.Vector3(); const isInViewOfCamera = (screenCamera, pos) => { frustumMatrix.multiplyMatrices(screenCamera.projectionMatrix, screenCamera.matrixWorldInverse); - frustum.setFromMatrix(frustumMatrix); + frustum.setFromProjectionMatrix(frustumMatrix); return frustum.containsPoint(pos); }; diff --git a/src/components/in-world-hud.js b/src/components/in-world-hud.js index 84c2e1a4f2..fcfef277ed 100644 --- a/src/components/in-world-hud.js +++ b/src/components/in-world-hud.js @@ -15,8 +15,13 @@ AFRAME.registerComponent("in-world-hud", { this.background = this.el.querySelector(".bg"); this.notificationText = this.el.querySelector("#hud-presence-notification"); + this.onMicStateChanged = () => { + this.mic.setAttribute("mic-button", "active", APP.dialog.isMicEnabled); + }; + APP.dialog.on("mic-state-changed", this.onMicStateChanged); + this.updateButtonStates = () => { - this.mic.setAttribute("mic-button", "active", this.el.sceneEl.is("muted")); + this.mic.setAttribute("mic-button", "active", APP.dialog.isMicEnabled); this.pen.setAttribute("icon-button", "active", this.el.sceneEl.is("pen")); this.cameraBtn.setAttribute("icon-button", "active", this.el.sceneEl.is("camera")); this.notificationText.setAttribute("text", "value", this.el.sceneEl.is("notification") ? "*" : ""); @@ -29,13 +34,12 @@ AFRAME.registerComponent("in-world-hud", { }; this.onStateChange = evt => { - if (!(evt.detail === "muted" || evt.detail === "frozen" || evt.detail === "pen" || evt.detail === "camera" || evt.detail === 'notification')) - return; + if (!(evt.detail === "frozen" || evt.detail === "pen" || evt.detail === "camera" || evt.detail === 'notification')) return; this.updateButtonStates(); }; this.onMicClick = () => { - this.el.emit("action_mute"); + APP.dialog.toggleMicrophone(); }; this.onSpawnClick = () => { diff --git a/src/components/layers.js b/src/components/layers.js index 839e388cba..5073d8e554 100644 --- a/src/components/layers.js +++ b/src/components/layers.js @@ -1,6 +1,9 @@ export const Layers = { // Layers 0 - 2 reserverd by ThreeJS and AFrame. - reflection: 3 + CAMERA_LAYER_REFLECTION: 3, + CAMERA_LAYER_INSPECT: 4, + CAMERA_LAYER_BATCH_INSPECT: 5, + CAMERA_LAYER_VIDEO_TEXTURE_TARGET: 6 }; /** diff --git a/src/components/media-image.js b/src/components/media-image.js new file mode 100644 index 0000000000..dcbd189075 --- /dev/null +++ b/src/components/media-image.js @@ -0,0 +1,184 @@ +import { createImageTexture } from "../utils/media-utils"; +import { createBasisTexture, createKTX2Texture } from "../utils/create-basis-texture"; +import { TextureCache } from "../utils/texture-cache"; +import { errorTexture } from "../utils/error-texture"; +import { createPlaneBufferGeometry } from "../utils/three-utils"; +import { scaleToAspectRatio } from "../utils/scale-to-aspect-ratio"; +import { createGIFTexture } from "../utils/gif-texture"; + +const textureCache = new TextureCache(); +const inflightTextures = new Map(); + +const errorCacheItem = { texture: errorTexture, ratio: 1400 / 1200 }; + +AFRAME.registerComponent("media-image", { + schema: { + src: { type: "string" }, + version: { type: "number" }, + projection: { type: "string", default: "flat" }, + contentType: { type: "string" }, + batch: { default: false }, + alphaMode: { type: "string", default: undefined }, + alphaCutoff: { type: "number" } + }, + + play() { + this.el.components["listed-media"] && this.el.sceneEl.emit("listed_media_changed"); + }, + + remove() { + if (this.data.batch && this.mesh) { + this.el.sceneEl.systems["hubs-systems"].batchManagerSystem.removeObject(this.mesh); + } + if (this.currentSrcIsRetained) { + textureCache.release(this.data.src, this.data.version); + this.currentSrcIsRetained = false; + } + }, + + async update(oldData) { + let texture; + let ratio = 1; + + const batchManagerSystem = this.el.sceneEl.systems["hubs-systems"].batchManagerSystem; + + try { + const { src, version, contentType } = this.data; + if (!src) return; + + this.el.emit("image-loading"); + + if (this.mesh && this.mesh.material.map && (src !== oldData.src || version !== oldData.version)) { + this.mesh.material.map = null; + this.mesh.material.needsUpdate = true; + if (this.mesh.material.map !== errorTexture) { + textureCache.release(oldData.src, oldData.version); + this.currentSrcIsRetained = false; + } + } + + let cacheItem; + if (textureCache.has(src, version)) { + if (this.currentSrcIsRetained) { + cacheItem = textureCache.get(src, version); + } else { + cacheItem = textureCache.retain(src, version); + } + } else { + const inflightKey = textureCache.key(src, version); + + if (src === "error") { + cacheItem = errorCacheItem; + } else if (inflightTextures.has(inflightKey)) { + await inflightTextures.get(inflightKey); + cacheItem = textureCache.retain(src, version); + } else { + let promise; + if (contentType.includes("image/gif")) { + promise = createGIFTexture(src); + } else if (contentType.includes("image/basis")) { + promise = createBasisTexture(src); + } else if (contentType.includes("image/ktx2")) { + promise = createKTX2Texture(src); + } else if (contentType.startsWith("image/")) { + promise = createImageTexture(src); + } else { + throw new Error(`Unknown image content type: ${contentType}`); + } + inflightTextures.set(inflightKey, promise); + texture = await promise; + inflightTextures.delete(inflightKey); + cacheItem = textureCache.set(src, version, texture); + } + + // No way to cancel promises, so if src has changed or this entity was removed while we were creating the texture just throw it away. + if (this.data.src !== src || this.data.version !== version || !this.el.parentNode) { + textureCache.release(src, version); + return; + } + } + + texture = cacheItem.texture; + ratio = cacheItem.ratio; + + this.currentSrcIsRetained = true; + } catch (e) { + console.error("Error loading image", this.data.src, e); + texture = errorTexture; + this.currentSrcIsRetained = false; + } + + const projection = this.data.projection; + + if (this.mesh && this.data.batch) { + // This is a no-op if the mesh was just created. + // Otherwise we want to ensure the texture gets updated. + batchManagerSystem.removeObject(this.mesh); + } + + if (!this.mesh || projection !== oldData.projection) { + const material = new THREE.MeshBasicMaterial(); + + let geometry; + + if (projection === "360-equirectangular") { + geometry = new THREE.SphereBufferGeometry(1, 64, 32); + // invert the geometry on the x-axis so that all of the faces point inward + geometry.scale(-1, 1, 1); + + // Flip uvs on the geometry + if (!texture.flipY) { + const uvs = geometry.attributes.uv.array; + + for (let i = 1; i < uvs.length; i += 2) { + uvs[i] = 1 - uvs[i]; + } + } + } else { + geometry = createPlaneBufferGeometry(1, 1, 1, 1, texture.flipY); + material.side = THREE.DoubleSide; + } + + this.mesh = new THREE.Mesh(geometry, material); + this.el.setObject3D("mesh", this.mesh); + } + + if (texture == errorTexture) { + this.mesh.material.transparent = true; + } else { + // if transparency setting isnt explicitly defined, default to on for all non batched things, gifs, and basis textures with alpha + switch (this.data.alphaMode) { + case "opaque": + this.mesh.material.transparent = false; + break; + case "blend": + this.mesh.material.transparent = true; + this.mesh.material.alphaTest = 0; + break; + case "mask": + this.mesh.material.transparent = false; + this.mesh.material.alphaTest = this.data.alphaCutoff; + break; + default: + this.mesh.material.transparent = + !this.data.batch || + this.data.contentType.includes("image/gif") || + !!(texture.image && texture.image.hasAlpha); + this.mesh.material.alphaTest = 0; + } + } + + this.mesh.material.map = texture; + this.mesh.material.needsUpdate = true; + + if (projection === "flat") { + scaleToAspectRatio(this.el, ratio); + } + + if (texture !== errorTexture && this.data.batch && !texture.isCompressedTexture) { + batchManagerSystem.addObject(this.mesh); + } + + this.el.emit("image-loaded", { src: this.data.src, projection: projection }); + } +}); diff --git a/src/components/media-loader.js b/src/components/media-loader.js index 04b187841d..b1b9420a25 100644 --- a/src/components/media-loader.js +++ b/src/components/media-loader.js @@ -25,7 +25,6 @@ import { waitForDOMContentLoaded } from "../utils/async-utils"; import { SHAPE } from "three-ammo/constants"; -let loadingObjectEnvMap; let loadingObject; waitForDOMContentLoaded().then(() => { @@ -171,6 +170,7 @@ AFRAME.registerComponent("media-loader", { this.el.removeAttribute("gltf-model-plus"); this.el.removeAttribute("media-pager"); this.el.removeAttribute("media-video"); + this.el.removeAttribute("audio-zone-source"); this.el.removeAttribute("media-pdf"); this.el.setAttribute("media-image", { src: "error" }); this.clearLoadingTimeout(); @@ -191,15 +191,6 @@ AFRAME.registerComponent("media-loader", { this.updateScale(true, false); if (useFancyLoader) { - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - if (environmentMapComponent) { - const currentEnivronmentMap = environmentMapComponent.environmentMap; - if (loadingObjectEnvMap !== currentEnivronmentMap) { - environmentMapComponent.applyEnvironmentMap(mesh); - loadingObjectEnvMap = currentEnivronmentMap; - } - } - this.loaderMixer = new THREE.AnimationMixer(mesh); this.loadingClip = this.loaderMixer.clipAction(mesh.animations[0]); @@ -348,6 +339,7 @@ AFRAME.registerComponent("media-loader", { this.el.removeAttribute("gltf-model-plus"); this.el.removeAttribute("media-pager"); this.el.removeAttribute("media-video"); + this.el.removeAttribute("audio-zone-source"); this.el.removeAttribute("media-pdf"); this.el.removeAttribute("media-image"); } @@ -363,7 +355,7 @@ AFRAME.registerComponent("media-loader", { } let canonicalUrl = src; - let canonicalAudioUrl = src; + let canonicalAudioUrl = null; // set non-null only if audio track is separated from video track (eg. 360 video) let accessibleUrl = src; let contentType = this.data.contentType; let thumbnail; @@ -460,6 +452,7 @@ AFRAME.registerComponent("media-loader", { linkedMediaElementAudioSource }) ); + this.el.setAttribute("audio-zone-source", {}); if (this.el.components["position-at-border__freeze"]) { this.el.setAttribute("position-at-border__freeze", { isFlat: true }); } @@ -469,6 +462,7 @@ AFRAME.registerComponent("media-loader", { } else if (contentType.startsWith("image/")) { this.el.removeAttribute("gltf-model-plus"); this.el.removeAttribute("media-video"); + this.el.removeAttribute("audio-zone-source"); this.el.removeAttribute("media-pdf"); this.el.removeAttribute("media-pager"); this.el.addEventListener( @@ -511,6 +505,7 @@ AFRAME.registerComponent("media-loader", { } else if (contentType.startsWith("application/pdf")) { this.el.removeAttribute("gltf-model-plus"); this.el.removeAttribute("media-video"); + this.el.removeAttribute("audio-zone-source"); this.el.removeAttribute("media-image"); this.el.setAttribute( "media-pdf", @@ -544,6 +539,7 @@ AFRAME.registerComponent("media-loader", { ) { this.el.removeAttribute("media-image"); this.el.removeAttribute("media-video"); + this.el.removeAttribute("audio-zone-source"); this.el.removeAttribute("media-pdf"); this.el.removeAttribute("media-pager"); this.el.addEventListener( @@ -577,6 +573,7 @@ AFRAME.registerComponent("media-loader", { } else if (contentType.startsWith("text/html")) { this.el.removeAttribute("gltf-model-plus"); this.el.removeAttribute("media-video"); + this.el.removeAttribute("audio-zone-source"); this.el.removeAttribute("media-pdf"); this.el.removeAttribute("media-pager"); this.el.addEventListener( diff --git a/src/components/media-pdf.js b/src/components/media-pdf.js new file mode 100644 index 0000000000..1769d3a736 --- /dev/null +++ b/src/components/media-pdf.js @@ -0,0 +1,144 @@ +import pdfjs from "pdfjs-dist"; +import { SOUND_CAMERA_TOOL_TOOK_SNAPSHOT } from "../systems/sound-effects-system"; +import { scaleToAspectRatio } from "../utils/scale-to-aspect-ratio"; +import { errorTexture } from "../utils/error-texture"; +import { createPlaneBufferGeometry } from "../utils/three-utils"; +import { addAndArrangeMedia } from "../utils/media-utils"; +const ONCE_TRUE = { once: true }; +const TYPE_IMG_PNG = { type: "image/png" }; + +/** + * Warning! This require statement is fragile! + * + * How it works: + * require -> require the file after all import statements have been called, particularly the configs.js import which modifies __webpack_public_path__ + * !! -> don't run any other loaders + * file-loader -> make webpack move the file into the dist directory and return the file path + * outputPath -> where to put the file + * name -> how to name the file + * Then the path to the worker script + */ +pdfjs.GlobalWorkerOptions.workerSrc = require("!!file-loader?outputPath=assets/js&name=[name]-[hash].js!pdfjs-dist/build/pdf.worker.min.js"); + +AFRAME.registerComponent("media-pdf", { + schema: { + src: { type: "string" }, + projection: { type: "string", default: "flat" }, + contentType: { type: "string" }, + index: { default: 0 }, + batch: { default: false } + }, + + init() { + this.snap = this.snap.bind(this); + this.canvas = document.createElement("canvas"); + this.canvasContext = this.canvas.getContext("2d"); + this.localSnapCount = 0; + this.isSnapping = false; + this.onSnapImageLoaded = () => (this.isSnapping = false); + this.texture = new THREE.CanvasTexture(this.canvas); + + this.texture.encoding = THREE.sRGBEncoding; + this.texture.minFilter = THREE.LinearFilter; + + this.el.addEventListener("pager-snap-clicked", () => this.snap()); + }, + + play() { + this.el.components["listed-media"] && this.el.sceneEl.emit("listed_media_changed"); + }, + + async snap() { + if (this.isSnapping) return; + this.isSnapping = true; + this.el.sceneEl.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_CAMERA_TOOL_TOOK_SNAPSHOT); + + const blob = await new Promise(resolve => this.canvas.toBlob(resolve)); + const file = new File([blob], "snap.png", TYPE_IMG_PNG); + + this.localSnapCount++; + const { entity } = addAndArrangeMedia(this.el, file, "photo-snapshot", this.localSnapCount, false, 1); + entity.addEventListener("image-loaded", this.onSnapImageLoaded, ONCE_TRUE); + }, + + remove() { + if (this.data.batch && this.mesh) { + this.el.sceneEl.systems["hubs-systems"].batchManagerSystem.removeObject(this.mesh); + } + }, + + async update(oldData) { + let texture; + let ratio = 1; + + try { + const { src, index } = this.data; + if (!src) return; + + if (this.renderTask) { + await this.renderTask.promise; + if (src !== this.data.src || index !== this.data.index) return; + } + + this.el.emit("pdf-loading"); + + if (src !== oldData.src) { + const loadingSrc = this.data.src; + const pdf = await pdfjs.getDocument(src); + if (loadingSrc !== this.data.src) return; + + this.pdf = pdf; + this.el.setAttribute("media-pager", { maxIndex: this.pdf.numPages - 1 }); + } + + const page = await this.pdf.getPage(index + 1); + if (src !== this.data.src || index !== this.data.index) return; + + const viewport = page.getViewport({ scale: 3 }); + const pw = viewport.width; + const ph = viewport.height; + texture = this.texture; + ratio = ph / pw; + + this.canvas.width = pw; + this.canvas.height = ph; + + this.renderTask = page.render({ canvasContext: this.canvasContext, viewport }); + + await this.renderTask.promise; + + this.renderTask = null; + + if (src !== this.data.src || index !== this.data.index) return; + } catch (e) { + console.error("Error loading PDF", this.data.src, e); + texture = errorTexture; + } + + if (!this.mesh) { + const material = new THREE.MeshBasicMaterial(); + const geometry = createPlaneBufferGeometry(1, 1, 1, 1, texture.flipY); + material.side = THREE.DoubleSide; + + this.mesh = new THREE.Mesh(geometry, material); + this.el.setObject3D("mesh", this.mesh); + } + + this.mesh.material.transparent = texture == errorTexture; + this.mesh.material.map = texture; + this.mesh.material.map.needsUpdate = true; + this.mesh.material.needsUpdate = true; + + scaleToAspectRatio(this.el, ratio); + + if (texture !== errorTexture && this.data.batch) { + this.el.sceneEl.systems["hubs-systems"].batchManagerSystem.addObject(this.mesh); + } + + if (this.el.components["media-pager"] && this.el.components["media-pager"].data.index !== this.data.index) { + this.el.setAttribute("media-pager", { index: this.data.index }); + } + + this.el.emit("pdf-loaded", { src: this.data.src }); + } +}); diff --git a/src/components/media-views.js b/src/components/media-video.js similarity index 57% rename from src/components/media-views.js rename to src/components/media-video.js index c016971723..67f2d11041 100644 --- a/src/components/media-views.js +++ b/src/components/media-video.js @@ -1,44 +1,34 @@ /* global performance THREE AFRAME NAF MediaStream setTimeout */ import configs from "../utils/configs"; -import GIFWorker from "../workers/gifparsing.worker.js"; -import errorImageSrc from "!!url-loader!../assets/images/media-error.png"; import audioIcon from "../assets/images/audio.png"; import { paths } from "../systems/userinput/paths"; import HLS from "hls.js"; import { MediaPlayer } from "dashjs"; -import { addAndArrangeMedia, createImageTexture, createVideoOrAudioEl } from "../utils/media-utils"; +import { addAndArrangeMedia, createVideoOrAudioEl, hasAudioTracks } from "../utils/media-utils"; import { disposeTexture } from "../utils/material-utils"; import { proxiedUrlFor } from "../utils/media-url-utils"; import { buildAbsoluteURL } from "url-toolkit"; import { SOUND_CAMERA_TOOL_TOOK_SNAPSHOT } from "../systems/sound-effects-system"; -import { promisifyWorker } from "../utils/promisify-worker.js"; -import pdfjs from "pdfjs-dist"; import { applyPersistentSync } from "../utils/permissions-utils"; import { refreshMediaMirror, getCurrentMirroredMedia } from "../utils/mirror-utils"; import { detect } from "detect-browser"; import semver from "semver"; +import { createPlaneBufferGeometry } from "../utils/three-utils"; +import HubsTextureLoader from "../loaders/HubsTextureLoader"; +import { getCurrentAudioSettings, updateAudioSettings } from "../update-audio-settings"; +import { SourceType, AudioType } from "./audio-params"; +import { errorTexture } from "../utils/error-texture"; +import { scaleToAspectRatio } from "../utils/scale-to-aspect-ratio"; +import { isSafari } from "../utils/detect-safari"; +import { isIOS as detectIOS } from "../utils/is-mobile"; import qsTruthy from "../utils/qs_truthy"; -/** - * Warning! This require statement is fragile! - * - * How it works: - * require -> require the file after all import statements have been called, particularly the configs.js import which modifies __webpack_public_path__ - * !! -> don't run any other loaders - * file-loader -> make webpack move the file into the dist directory and return the file path - * outputPath -> where to put the file - * name -> how to name the file - * Then the path to the worker script - */ -pdfjs.GlobalWorkerOptions.workerSrc = require("!!file-loader?outputPath=assets/js&name=[name]-[hash].js!pdfjs-dist/build/pdf.worker.min.js"); - const ONCE_TRUE = { once: true }; const TYPE_IMG_PNG = { type: "image/png" }; -const parseGIF = promisifyWorker(new GIFWorker()); -const isIOS = AFRAME.utils.device.isIOS(); -const audioIconTexture = new THREE.TextureLoader().load(audioIcon); +const isIOS = detectIOS(); +const audioIconTexture = new HubsTextureLoader().load(audioIcon); export const VOLUME_LABELS = []; for (let i = 0; i <= 20; i++) { @@ -50,194 +40,6 @@ for (let i = 0; i <= 20; i++) { VOLUME_LABELS[i] = s; } -import { KTX2Loader } from "three/examples/jsm/loaders/KTX2Loader"; -import { rewriteBasisTranscoderUrls } from "../utils/media-url-utils"; -const loadingManager = new THREE.LoadingManager(); -loadingManager.setURLModifier(rewriteBasisTranscoderUrls); - -let ktxLoader; - -export function createBasisTexture(url) { - if (!ktxLoader) { - ktxLoader = new KTX2Loader(loadingManager).detectSupport(AFRAME.scenes[0].renderer); - } - return new Promise((resolve, reject) => { - ktxLoader.basisLoader.load( - url, - function(texture) { - texture.encoding = THREE.sRGBEncoding; - texture.onUpdate = function() { - // Delete texture data once it has been uploaded to the GPU - texture.mipmaps.length = 0; - }; - // texture.anisotropy = 4; - resolve(texture); - }, - undefined, - function(error) { - console.error(error); - reject(new Error(`'${url}' could not be fetched (Error: ${error}`)); - } - ); - }); -} - -export function createKTX2Texture(url) { - if (!ktxLoader) { - ktxLoader = new KTX2Loader(loadingManager).detectSupport(AFRAME.scenes[0].renderer); - } - return new Promise((resolve, reject) => { - ktxLoader.load( - url, - function(texture) { - texture.encoding = THREE.sRGBEncoding; - texture.onUpdate = function() { - // Delete texture data once it has been uploaded to the GPU - texture.mipmaps.length = 0; - }; - texture.anisotropy = 4; - resolve(texture); - }, - undefined, - function(error) { - console.error(error); - reject(new Error(`'${url}' could not be fetched (Error: ${error}`)); - } - ); - }); -} - -class GIFTexture extends THREE.Texture { - constructor(frames, delays, disposals) { - super(document.createElement("canvas")); - this.image.width = frames[0].width; - this.image.height = frames[0].height; - - this._ctx = this.image.getContext("2d"); - - this.generateMipmaps = false; - this.isVideoTexture = true; - this.minFilter = THREE.NearestFilter; - - this.frames = frames; - this.delays = delays; - this.disposals = disposals; - - this.frame = 0; - this.frameStartTime = Date.now(); - } - - update() { - if (!this.frames || !this.delays || !this.disposals) return; - const now = Date.now(); - if (now - this.frameStartTime > this.delays[this.frame]) { - if (this.disposals[this.frame] === 2) { - this._ctx.clearRect(0, 0, this.image.width, this.image.width); - } - this.frame = (this.frame + 1) % this.frames.length; - this.frameStartTime = now; - this._ctx.drawImage(this.frames[this.frame], 0, 0, this.image.width, this.image.height); - this.needsUpdate = true; - } - } -} - -async function createGIFTexture(url) { - return new Promise((resolve, reject) => { - fetch(url, { mode: "cors" }) - .then(r => r.arrayBuffer()) - .then(rawImageData => parseGIF(rawImageData, [rawImageData])) - .then(result => { - const { frames, delayTimes, disposals } = result; - let loadCnt = 0; - for (let i = 0; i < frames.length; i++) { - const img = new Image(); - img.onload = e => { - loadCnt++; - frames[i] = e.target; - if (loadCnt === frames.length) { - const texture = new GIFTexture(frames, delayTimes, disposals); - texture.image.src = url; - texture.encoding = THREE.sRGBEncoding; - texture.minFilter = THREE.LinearFilter; - resolve(texture); - } - }; - img.src = frames[i]; - } - }) - .catch(reject); - }); -} - -function scaleToAspectRatio(el, ratio) { - const width = Math.min(1.0, 1.0 / ratio); - const height = Math.min(1.0, ratio); - el.object3DMap.mesh.scale.set(width, height, 1); - el.object3DMap.mesh.matrixNeedsUpdate = true; -} - -class TextureCache { - cache = new Map(); - - key(src, version) { - return `${src}_${version}`; - } - - set(src, version, texture) { - const image = texture.image; - this.cache.set(this.key(src, version), { - texture, - ratio: (image.videoHeight || image.height) / (image.videoWidth || image.width), - count: 0 - }); - return this.retain(src, version); - } - - has(src, version) { - return this.cache.has(this.key(src, version)); - } - - get(src, version) { - return this.cache.get(this.key(src, version)); - } - - retain(src, version) { - const cacheItem = this.cache.get(this.key(src, version)); - cacheItem.count++; - // console.log("retain", src, cacheItem.count); - return cacheItem; - } - - release(src, version) { - const cacheItem = this.cache.get(this.key(src, version)); - - if (!cacheItem) { - console.error(`Releasing uncached texture src ${src}`); - return; - } - - cacheItem.count--; - // console.log("release", src, cacheItem.count); - if (cacheItem.count <= 0) { - // Unload the video element to prevent it from continuing to play in the background - disposeTexture(cacheItem.texture); - this.cache.delete(this.key(src, version)); - } - } -} - -const textureCache = new TextureCache(); -const inflightTextures = new Map(); - -const errorImage = new Image(); -errorImage.src = errorImageSrc; -const errorTexture = new THREE.Texture(errorImage); -errorImage.onload = () => { - errorTexture.needsUpdate = true; -}; -const errorCacheItem = { texture: errorTexture, ratio: 1400 / 1200 }; - function timeFmt(t) { let s = Math.floor(t), h = Math.floor(s / 3600); @@ -250,30 +52,27 @@ function timeFmt(t) { return h === "00" ? `${m}:${s}` : `${h}:${m}:${s}`; } +const MAX_MULTIPLIER = 2; + AFRAME.registerComponent("media-video", { schema: { src: { type: "string" }, - audioSrc: { type: "string" }, + audioSrc: { type: "string" }, // set only if audio track is separated from video track (eg. 360 video) contentType: { type: "string" }, - volume: { type: "number", default: 0.5 }, loop: { type: "boolean", default: true }, - audioType: { type: "string", default: "pannernode" }, hidePlaybackControls: { type: "boolean", default: false }, - distanceModel: { type: "string", default: "inverse" }, - rolloffFactor: { type: "number", default: 1 }, - refDistance: { type: "number", default: 1 }, - maxDistance: { type: "number", default: 10000 }, - coneInnerAngle: { type: "number", default: 360 }, - coneOuterAngle: { type: "number", default: 0 }, - coneOuterGain: { type: "number", default: 0 }, videoPaused: { type: "boolean" }, projection: { type: "string", default: "flat" }, time: { type: "number" }, tickRate: { default: 1000 }, // ms interval to send time interval updates - syncTolerance: { default: 2 } + syncTolerance: { default: 2 }, + linkedVideoTexture: { default: null }, + linkedAudioSource: { default: null }, + linkedMediaElementAudioSource: { default: null } }, init() { + APP.gainMultipliers.set(this.el, 1); this.onPauseStateChange = this.onPauseStateChange.bind(this); this.updateHoverMenu = this.updateHoverMenu.bind(this); this.tryUpdateVideoPlaybackState = this.tryUpdateVideoPlaybackState.bind(this); @@ -289,7 +88,7 @@ AFRAME.registerComponent("media-video", { this.changeVolumeBy = this.changeVolumeBy.bind(this); this.togglePlaying = this.togglePlaying.bind(this); - this.distanceBasedAttenuation = 1; + this.audioSystem = this.el.sceneEl.systems["hubs-systems"].audioSystem; this.lastUpdate = 0; this.videoMutedAt = 0; @@ -297,6 +96,7 @@ AFRAME.registerComponent("media-video", { this.isSnapping = false; this.videoIsLive = null; // value null until we've determined if the video is live or not. this.onSnapImageLoaded = () => (this.isSnapping = false); + this.hasAudioTracks = false; this.el.setAttribute("hover-menu__video", { template: "#video-hover-menu", isFlat: true }); this.el.components["hover-menu__video"].getHoverMenu().then(menu => { @@ -366,16 +166,20 @@ AFRAME.registerComponent("media-video", { evt.detail.cameraEl.getObject3D("camera").add(sceneEl.audioListener); }); - this.audioOutputModePref = window.APP.store.state.preferences.audioOutputMode; + let audioOutputModePref = APP.store.state.preferences.audioOutputMode; this.onPreferenceChanged = () => { - const newPref = window.APP.store.state.preferences.audioOutputMode; - const shouldRecreateAudio = this.audioOutputModePref !== newPref && this.audio && this.mediaElementAudioSource; - this.audioOutputModePref = newPref; + const newPref = APP.store.state.preferences.audioOutputMode; + const shouldRecreateAudio = audioOutputModePref !== newPref && this.audio && this.mediaElementAudioSource; + audioOutputModePref = newPref; if (shouldRecreateAudio) { this.setupAudio(); } }; - window.APP.store.addEventListener("statechanged", this.onPreferenceChanged); + APP.store.addEventListener("statechanged", this.onPreferenceChanged); + }, + + play() { + this.el.components["listed-media"] && this.el.sceneEl.emit("listed_media_changed"); }, isMineOrLocal() { @@ -404,16 +208,22 @@ AFRAME.registerComponent("media-video", { }, changeVolumeBy(v) { - this.el.setAttribute("media-video", "volume", THREE.Math.clamp(this.data.volume + v, 0, 1)); + let gainMultiplier = APP.gainMultipliers.get(this.el); + gainMultiplier = THREE.Math.clamp(gainMultiplier + v, 0, MAX_MULTIPLIER); + APP.gainMultipliers.set(this.el, gainMultiplier); this.updateVolumeLabel(); + const audio = APP.audios.get(this.el); + if (audio) { + updateAudioSettings(this.el, audio); + } }, volumeUp() { - this.changeVolumeBy(0.1); + this.changeVolumeBy(0.2); }, volumeDown() { - this.changeVolumeBy(-0.1); + this.changeVolumeBy(-0.2); }, async snap() { @@ -465,6 +275,11 @@ AFRAME.registerComponent("media-video", { if (this._ignorePauseStateChanges) return; this.el.setAttribute("media-video", "videoPaused", this.video.paused); + if (this.video.paused) { + APP.isAudioPaused.add(this.el); + } else { + APP.isAudioPaused.delete(this.el); + } if (this.networkedEl && NAF.utils.isMine(this.networkedEl)) { this.el.emit("owned-video-state-changed"); @@ -482,15 +297,6 @@ AFRAME.registerComponent("media-video", { this.tryUpdateVideoPlaybackState(this.data.videoPaused); } } - - // Volume is local, always update it - if (this.audio && window.APP.store.state.preferences.audioOutputMode !== "audio") { - const globalMediaVolume = - window.APP.store.state.preferences.globalMediaVolume !== undefined - ? window.APP.store.state.preferences.globalMediaVolume - : 100; - this.audio.gain.gain.value = (globalMediaVolume / 100) * this.data.volume; - } }, tryUpdateVideoPlaybackState(pause, currentTime) { @@ -528,20 +334,6 @@ AFRAME.registerComponent("media-video", { this.updateSrc(oldData); return; } - const shouldRecreateAudio = - !shouldUpdateSrc && this.mediaElementAudioSource && oldData.audioType !== this.data.audioType; - if (shouldRecreateAudio) { - this.setupAudio(); - return; - } - - const disablePositionalAudio = window.APP.store.state.preferences.audioOutputMode === "audio"; - const shouldSetPositionalAudioProperties = - this.audio && this.data.audioType === "pannernode" && !disablePositionalAudio; - if (shouldSetPositionalAudioProperties) { - this.setPositionalAudioProperties(); - return; - } }, setupAudio() { @@ -549,16 +341,25 @@ AFRAME.registerComponent("media-video", { this.audio.disconnect(); this.el.removeObject3D("sound"); } + APP.sourceType.set(this.el, SourceType.MEDIA_VIDEO); - const disablePositionalAudio = window.APP.store.state.preferences.audioOutputMode === "audio"; - if (!disablePositionalAudio && this.data.audioType === "pannernode") { - this.audio = new THREE.PositionalAudio(this.el.sceneEl.audioListener); - this.setPositionalAudioProperties(); - this.distanceBasedAttenuation = 1; + if (this.data.videoPaused) { + APP.isAudioPaused.add(this.el); } else { - this.audio = new THREE.Audio(this.el.sceneEl.audioListener); + APP.isAudioPaused.delete(this.el); } + const { audioType } = getCurrentAudioSettings(this.el); + const audioListener = this.el.sceneEl.audioListener; + if (audioType === AudioType.PannerNode) { + this.audio = new THREE.PositionalAudio(audioListener); + } else { + this.audio = new THREE.Audio(audioListener); + } + + this.audioSystem.removeAudio(this.audio); + this.audioSystem.addAudio(SourceType.MEDIA_VIDEO, this.audio); + this.audio.setNodeSource(this.mediaElementAudioSource); this.el.setObject3D("sound", this.audio); @@ -566,16 +367,9 @@ AFRAME.registerComponent("media-video", { // Its matrix may not update if this element is not visible. // See https://github.com/mozilla/hubs/issues/2855 this.audio.updateMatrixWorld(); - }, - setPositionalAudioProperties() { - this.audio.setDistanceModel(this.data.distanceModel); - this.audio.setRolloffFactor(this.data.rolloffFactor); - this.audio.setRefDistance(this.data.refDistance); - this.audio.setMaxDistance(this.data.maxDistance); - this.audio.panner.coneInnerAngle = this.data.coneInnerAngle; - this.audio.panner.coneOuterAngle = this.data.coneOuterAngle; - this.audio.panner.coneOuterGain = this.data.coneOuterGain; + APP.audios.set(this.el, this.audio); + updateAudioSettings(this.el, this.audio); }, async updateSrc(oldData) { @@ -593,12 +387,15 @@ AFRAME.registerComponent("media-video", { texture = linkedVideoTexture; audioSourceEl = linkedAudioSource; } else { + this.el.emit("video-loading"); ({ texture, audioSourceEl } = await this.createVideoTextureAudioSourceEl()); if (getCurrentMirroredMedia() === this.el) { await refreshMediaMirror(); } } + this.hasAudioTracks = hasAudioTracks(audioSourceEl); + // No way to cancel promises, so if src has changed while we were creating the texture just throw it away. if (this.data.src !== src) { disposeTexture(texture); @@ -614,7 +411,7 @@ AFRAME.registerComponent("media-video", { linkedMediaElementAudioSource || this.el.sceneEl.audioListener.context.createMediaElementSource(audioSourceEl); - this.setupAudio(); + this.hasAudioTracks && this.setupAudio(); } } @@ -669,7 +466,8 @@ AFRAME.registerComponent("media-video", { // invert the geometry on the x-axis so that all of the faces point inward geometry.scale(-1, 1, 1); } else { - geometry = new THREE.PlaneBufferGeometry(); + const flipY = texture.isVideoTexture ? texture.flipY : audioIconTexture.flipY; + geometry = createPlaneBufferGeometry(undefined, undefined, undefined, undefined, flipY); material.side = THREE.DoubleSide; } @@ -725,7 +523,7 @@ AFRAME.registerComponent("media-video", { // We want to treat audio almost exactly like video, so we mock a video texture with an image property. texture = new THREE.Texture(); texture.image = videoEl; - isReady = () => true; + isReady = () => videoEl.readyState > 0; } else { texture = new THREE.VideoTexture(videoEl); texture.minFilter = THREE.LinearFilter; @@ -760,16 +558,16 @@ AFRAME.registerComponent("media-video", { // Set src on video to begin loading. if (url.startsWith("hubs://")) { const streamClientId = url.substring(7).split("/")[1]; // /clients/<client id>/video is only URL for now - const stream = await NAF.connection.adapter.getMediaStream(streamClientId, "video"); + const stream = await APP.dialog.getMediaStream(streamClientId, "video"); // We subscribe to video stream notifications for this peer to update the video element // This could happen in case there is an ICE failure that requires a transport recreation. if (this._onStreamUpdated) { - NAF.connection.adapter.off("stream_updated", this._onStreamUpdated); + APP.dialog.off("stream_updated", this._onStreamUpdated); } this._onStreamUpdated = async (peerId, kind) => { if (peerId === streamClientId && kind === "video") { // The video stream for this peer has been updated - const stream = await NAF.connection.adapter.getMediaStream(peerId, "video").catch(e => { + const stream = await APP.dialog.getMediaStream(peerId, "video").catch(e => { console.error(`Error getting video stream for ${peerId}`, e); }); if (stream) { @@ -777,7 +575,7 @@ AFRAME.registerComponent("media-video", { } } }; - NAF.connection.adapter.on("stream_updated", this._onStreamUpdated, this); + APP.dialog.on("stream_updated", this._onStreamUpdated, this); videoEl.srcObject = new MediaStream(stream.getVideoTracks()); // If hls.js is supported we always use it as it gives us better events } else if (contentType.startsWith("application/dash")) { @@ -859,9 +657,34 @@ AFRAME.registerComponent("media-video", { } } else { videoEl.src = url; - videoEl.onerror = failLoad; + // Workaround for Safari. + // Safari seems to have a bug that it doesn't transfer range property in HTTP request header + // for redirects if crossOrigin is set (while other major browsers do). + // So Safari can fail to load video if the server responds redirect because + // it expects 206 HTTP status code but gets 200. + // If we fail to load video on Safari we retry with fetch() and videoEl.srcObject + // which may avoid the problem. + // Refer to #4516 for the details. + if (isSafari()) { + // There seems no way to detect whether the error is caused by the problem mentioned above. + // So always retrying. + videoEl.onerror = async () => { + videoEl.onerror = failLoad; + try { + const res = await fetch(url); + videoEl.srcObject = await res.blob(); + } catch (e) { + failLoad(e); + } + }; + } else { + videoEl.onerror = failLoad; + } + + // audioSrc is non-empty only if audio track is separated from video track (eg. 360 video) if (this.data.audioSrc) { + // Mute video track just in case videoEl.muted = true; // If there's an audio src, create an audio element to play it that we keep in sync @@ -908,6 +731,8 @@ AFRAME.registerComponent("media-video", { const isPinned = pinnableElement.components.pinnable && pinnableElement.components.pinnable.data.pinned; this.playbackControls.object3D.visible = !this.data.hidePlaybackControls && !!this.video; this.timeLabel.object3D.visible = !this.data.hidePlaybackControls; + this.volumeLabel.object3D.visible = this.volumeUpButton.object3D.visible = this.volumeDownButton.object3D.visible = + this.hasAudioTracks && !this.data.hidePlaybackControls && !!this.video; this.snapButton.object3D.visible = !!this.video && !this.data.contentType.startsWith("audio/") && window.APP.hubChannel.can("spawn_and_move_media"); @@ -926,16 +751,15 @@ AFRAME.registerComponent("media-video", { }, updateVolumeLabel() { + const gainMultiplier = APP.gainMultipliers.get(this.el); this.volumeLabel.setAttribute( "text", "value", - this.data.volume === 0 ? "MUTE" : VOLUME_LABELS[Math.floor(this.data.volume / 0.05)] + gainMultiplier === 0 ? "MUTE" : VOLUME_LABELS[Math.floor(gainMultiplier / (MAX_MULTIPLIER / 20))] ); }, tick: (() => { - const positionA = new THREE.Vector3(); - const positionB = new THREE.Vector3(); return function() { if (!this.video) return; @@ -979,20 +803,6 @@ AFRAME.registerComponent("media-video", { this.lastUpdate = now; } } - - if (this.audio) { - if (window.APP.store.state.preferences.audioOutputMode === "audio") { - this.el.object3D.getWorldPosition(positionA); - this.el.sceneEl.audioListener.getWorldPosition(positionB); - const distance = positionA.distanceTo(positionB); - this.distanceBasedAttenuation = Math.min(1, 10 / Math.max(1, distance * distance)); - const globalMediaVolume = - window.APP.store.state.preferences.globalMediaVolume !== undefined - ? window.APP.store.state.preferences.globalMediaVolume - : 100; - this.audio.gain.gain.value = (globalMediaVolume / 100) * this.data.volume * this.distanceBasedAttenuation; - } - } }; })(), @@ -1005,6 +815,8 @@ AFRAME.registerComponent("media-video", { remove() { this.cleanUp(); + APP.isAudioPaused.delete(this.el); + if (this.mesh) { this.el.removeObject3D("mesh"); } @@ -1014,9 +826,14 @@ AFRAME.registerComponent("media-video", { this._audioSyncInterval = null; } + APP.gainMultipliers.delete(this.el); + APP.audios.delete(this.el); + APP.sourceType.delete(this.el); + APP.supplementaryAttenuation.delete(this.el); + if (this.audio) { this.el.removeObject3D("sound"); - this.audio.disconnect(); + this.audioSystem.removeAudio(this.audio); delete this.audio; } @@ -1030,7 +847,7 @@ AFRAME.registerComponent("media-video", { if (this.video) { this.video.removeEventListener("pause", this.onPauseStateChange); this.video.removeEventListener("play", this.onPauseStateChange); - NAF.connection.adapter.off("stream_updated", this._onStreamUpdated); + APP.dialog.off("stream_updated", this._onStreamUpdated); } if (this.hoverMenu) { @@ -1039,295 +856,9 @@ AFRAME.registerComponent("media-video", { this.volumeDownButton.object3D.removeEventListener("interact", this.volumeDown); this.seekForwardButton.object3D.removeEventListener("interact", this.seekForward); this.seekBackButton.object3D.removeEventListener("interact", this.seekBack); + this.snapButton.object3D.removeEventListener("interact", this.snap); } window.APP.store.removeEventListener("statechanged", this.onPreferenceChanged); } }); - -AFRAME.registerComponent("media-image", { - schema: { - src: { type: "string" }, - version: { type: "number" }, - projection: { type: "string", default: "flat" }, - contentType: { type: "string" }, - batch: { default: false }, - alphaMode: { type: "string", default: undefined }, - alphaCutoff: { type: "number" } - }, - - remove() { - if (this.data.batch && this.mesh) { - this.el.sceneEl.systems["hubs-systems"].batchManagerSystem.removeObject(this.mesh); - } - if (this.currentSrcIsRetained) { - textureCache.release(this.data.src, this.data.version); - this.currentSrcIsRetained = false; - } - }, - - async update(oldData) { - let texture; - let ratio = 1; - - const batchManagerSystem = this.el.sceneEl.systems["hubs-systems"].batchManagerSystem; - - try { - const { src, version, contentType } = this.data; - if (!src) return; - - this.el.emit("image-loading"); - - if (this.mesh && this.mesh.material.map && (src !== oldData.src || version !== oldData.version)) { - this.mesh.material.map = null; - this.mesh.material.needsUpdate = true; - if (this.mesh.material.map !== errorTexture) { - textureCache.release(oldData.src, oldData.version); - this.currentSrcIsRetained = false; - } - } - - let cacheItem; - if (textureCache.has(src, version)) { - if (this.currentSrcIsRetained) { - cacheItem = textureCache.get(src, version); - } else { - cacheItem = textureCache.retain(src, version); - } - } else { - const inflightKey = textureCache.key(src, version); - - if (src === "error") { - cacheItem = errorCacheItem; - } else if (inflightTextures.has(inflightKey)) { - await inflightTextures.get(inflightKey); - cacheItem = textureCache.retain(src, version); - } else { - let promise; - if (contentType.includes("image/gif")) { - promise = createGIFTexture(src); - } else if (contentType.includes("image/basis")) { - promise = createBasisTexture(src); - } else if (contentType.includes("image/ktx2")) { - promise = createKTX2Texture(src); - } else if (contentType.startsWith("image/")) { - promise = createImageTexture(src); - } else { - throw new Error(`Unknown image content type: ${contentType}`); - } - inflightTextures.set(inflightKey, promise); - texture = await promise; - inflightTextures.delete(inflightKey); - cacheItem = textureCache.set(src, version, texture); - } - - // No way to cancel promises, so if src has changed or this entity was removed while we were creating the texture just throw it away. - if (this.data.src !== src || this.data.version !== version || !this.el.parentNode) { - textureCache.release(src, version); - return; - } - } - - texture = cacheItem.texture; - ratio = cacheItem.ratio; - - this.currentSrcIsRetained = true; - } catch (e) { - console.error("Error loading image", this.data.src, e); - texture = errorTexture; - this.currentSrcIsRetained = false; - } - - const projection = this.data.projection; - - if (this.mesh && this.data.batch) { - // This is a no-op if the mesh was just created. - // Otherwise we want to ensure the texture gets updated. - batchManagerSystem.removeObject(this.mesh); - } - - if (!this.mesh || projection !== oldData.projection) { - const material = new THREE.MeshBasicMaterial(); - - let geometry; - - if (projection === "360-equirectangular") { - geometry = new THREE.SphereBufferGeometry(1, 64, 32); - // invert the geometry on the x-axis so that all of the faces point inward - geometry.scale(-1, 1, 1); - - // Flip uvs on the geometry - if (!texture.flipY) { - const uvs = geometry.attributes.uv.array; - - for (let i = 1; i < uvs.length; i += 2) { - uvs[i] = 1 - uvs[i]; - } - } - } else { - geometry = new THREE.PlaneBufferGeometry(1, 1, 1, 1, texture.flipY); - material.side = THREE.DoubleSide; - } - - this.mesh = new THREE.Mesh(geometry, material); - this.el.setObject3D("mesh", this.mesh); - } - - if (texture == errorTexture) { - this.mesh.material.transparent = true; - } else { - // if transparency setting isnt explicitly defined, default to on for all non batched things, gifs, and basis textures with alpha - switch (this.data.alphaMode) { - case "opaque": - this.mesh.material.transparent = false; - break; - case "blend": - this.mesh.material.transparent = true; - this.mesh.material.alphaTest = 0; - break; - case "mask": - this.mesh.material.transparent = false; - this.mesh.material.alphaTest = this.data.alphaCutoff; - break; - default: - this.mesh.material.transparent = - !this.data.batch || - this.data.contentType.includes("image/gif") || - !!(texture.image && texture.image.hasAlpha); - this.mesh.material.alphaTest = 0; - } - } - - this.mesh.material.map = texture; - this.mesh.material.needsUpdate = true; - - if (projection === "flat") { - scaleToAspectRatio(this.el, ratio); - } - - if (texture !== errorTexture && this.data.batch && !texture.isCompressedTexture) { - batchManagerSystem.addObject(this.mesh); - } - - this.el.emit("image-loaded", { src: this.data.src, projection: projection }); - } -}); - -AFRAME.registerComponent("media-pdf", { - schema: { - src: { type: "string" }, - projection: { type: "string", default: "flat" }, - contentType: { type: "string" }, - index: { default: 0 }, - batch: { default: false } - }, - - init() { - this.snap = this.snap.bind(this); - this.canvas = document.createElement("canvas"); - this.canvasContext = this.canvas.getContext("2d"); - this.localSnapCount = 0; - this.isSnapping = false; - this.onSnapImageLoaded = () => (this.isSnapping = false); - this.texture = new THREE.CanvasTexture(this.canvas); - - this.texture.encoding = THREE.sRGBEncoding; - this.texture.minFilter = THREE.LinearFilter; - - this.el.addEventListener("pager-snap-clicked", () => this.snap()); - }, - - async snap() { - if (this.isSnapping) return; - this.isSnapping = true; - this.el.sceneEl.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_CAMERA_TOOL_TOOK_SNAPSHOT); - - const blob = await new Promise(resolve => this.canvas.toBlob(resolve)); - const file = new File([blob], "snap.png", TYPE_IMG_PNG); - - this.localSnapCount++; - const { entity } = addAndArrangeMedia(this.el, file, "photo-snapshot", this.localSnapCount, false, 1); - entity.addEventListener("image-loaded", this.onSnapImageLoaded, ONCE_TRUE); - }, - - remove() { - if (this.data.batch && this.mesh) { - this.el.sceneEl.systems["hubs-systems"].batchManagerSystem.removeObject(this.mesh); - } - }, - - async update(oldData) { - let texture; - let ratio = 1; - - try { - const { src, index } = this.data; - if (!src) return; - - if (this.renderTask) { - await this.renderTask.promise; - if (src !== this.data.src || index !== this.data.index) return; - } - - this.el.emit("pdf-loading"); - - if (src !== oldData.src) { - const loadingSrc = this.data.src; - const pdf = await pdfjs.getDocument(src); - if (loadingSrc !== this.data.src) return; - - this.pdf = pdf; - this.el.setAttribute("media-pager", { maxIndex: this.pdf.numPages - 1 }); - } - - const page = await this.pdf.getPage(index + 1); - if (src !== this.data.src || index !== this.data.index) return; - - const viewport = page.getViewport({ scale: 3 }); - const pw = viewport.width; - const ph = viewport.height; - texture = this.texture; - ratio = ph / pw; - - this.canvas.width = pw; - this.canvas.height = ph; - - this.renderTask = page.render({ canvasContext: this.canvasContext, viewport }); - - await this.renderTask.promise; - - this.renderTask = null; - - if (src !== this.data.src || index !== this.data.index) return; - } catch (e) { - console.error("Error loading PDF", this.data.src, e); - texture = errorTexture; - } - - if (!this.mesh) { - const material = new THREE.MeshBasicMaterial(); - const geometry = new THREE.PlaneBufferGeometry(1, 1, 1, 1, texture.flipY); - material.side = THREE.DoubleSide; - - this.mesh = new THREE.Mesh(geometry, material); - this.el.setObject3D("mesh", this.mesh); - } - - this.mesh.material.transparent = texture == errorTexture; - this.mesh.material.map = texture; - this.mesh.material.map.needsUpdate = true; - this.mesh.material.needsUpdate = true; - - scaleToAspectRatio(this.el, ratio); - - if (texture !== errorTexture && this.data.batch) { - this.el.sceneEl.systems["hubs-systems"].batchManagerSystem.addObject(this.mesh); - } - - if (this.el.components["media-pager"] && this.el.components["media-pager"].data.index !== this.data.index) { - this.el.setAttribute("media-pager", { index: this.data.index }); - } - - this.el.emit("pdf-loaded", { src: this.data.src }); - } -}); diff --git a/src/components/mute-mic.js b/src/components/mute-mic.js index ba8af0bc17..d880bc1b86 100644 --- a/src/components/mute-mic.js +++ b/src/components/mute-mic.js @@ -35,8 +35,6 @@ AFRAME.registerComponent("mute-mic", { this.onToggle = this.onToggle.bind(this); this.onMute = this.onMute.bind(this); this.onUnmute = this.onUnmute.bind(this); - this.store = window.APP.store; - this.store.addEventListener("statechanged", this.onStoreUpdated.bind(this)); }, play: function() { @@ -54,43 +52,16 @@ AFRAME.registerComponent("mute-mic", { }, onToggle: function() { - if (!NAF.connection.adapter) return; + APP.dialog.toggleMicrophone(); if (!this.el.sceneEl.is("entered")) return; - this.el.sceneEl.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_TOGGLE_MIC); - if (this.el.is("muted")) { - NAF.connection.adapter.enableMicrophone(true); - } else { - NAF.connection.adapter.enableMicrophone(false); - } }, onMute: function() { - if (!NAF.connection.adapter) return; - if (!this.el.is("muted")) { - NAF.connection.adapter.enableMicrophone(false); - } + APP.dialog.enableMicrophone(false); }, onUnmute: function() { - if (this.el.is("muted")) { - NAF.connection.adapter.enableMicrophone(true); - } - }, - - onStoreUpdated: function() { - const micMuted = this.store.state.settings["micMuted"]; - const isMicShared = window.APP.mediaDevicesManager?.isMicShared; - if (micMuted !== undefined) { - if (isMicShared) { - if (micMuted) { - this.el.addState("muted"); - } else { - this.el.removeState("muted"); - } - } else { - this.el.addState("muted"); - } - } + APP.dialog.enableMicrophone(true); } }); diff --git a/src/components/open-media-button.js b/src/components/open-media-button.js index fd07d5e438..0ce307d843 100644 --- a/src/components/open-media-button.js +++ b/src/components/open-media-button.js @@ -1,6 +1,7 @@ -import { isLocalHubsSceneUrl, isHubsRoomUrl, isLocalHubsAvatarUrl } from "../utils/media-url-utils"; +import { isLocalHubsUrl, isLocalHubsSceneUrl, isHubsRoomUrl, isLocalHubsAvatarUrl } from "../utils/media-url-utils"; import { guessContentType } from "../utils/media-url-utils"; import { handleExitTo2DInterstitial } from "../utils/vr-interstitial"; +import { changeHub } from "../change-hub"; AFRAME.registerComponent("open-media-button", { schema: { @@ -28,7 +29,7 @@ AFRAME.registerComponent("open-media-button", { label = "use scene"; } else if ((hubId = await isHubsRoomUrl(src))) { const url = new URL(src); - if (url.hash && APP.hub.hub_id === hubId) { + if (url.hash && window.APP.hub.hub_id === hubId) { label = "go to"; } else { label = "visit room"; @@ -56,9 +57,12 @@ AFRAME.registerComponent("open-media-button", { this.el.sceneEl.emit("scene_media_selected", this.src); } else if ((hubId = await isHubsRoomUrl(this.src))) { const url = new URL(this.src); - if (url.hash && APP.hub.hub_id === hubId) { + if (url.hash && window.APP.hub.hub_id === hubId) { // move to waypoint w/o writing to history window.history.replaceState(null, null, window.location.href.split("#")[0] + url.hash); + } else if (APP.store.state.preferences.fastRoomSwitching && isLocalHubsUrl(this.src)) { + // move to new room without page load or entry flow + changeHub(hubId); } else { await exitImmersive(); location.href = this.src; diff --git a/src/components/particle-emitter.js b/src/components/particle-emitter.js index 03218e594d..c39603bc33 100644 --- a/src/components/particle-emitter.js +++ b/src/components/particle-emitter.js @@ -57,9 +57,7 @@ AFRAME.registerComponent("particle-emitter", { accessibleUrl = proxiedUrlFor(canonicalUrl); } - const texture = new THREE.Texture(); - - await textureLoader.loadTextureAsync(texture, accessibleUrl); + const texture = await textureLoader.loadAsync(accessibleUrl); // Guard against src changing while request was in flight if (this.data.src !== src) { diff --git a/src/components/pin-networked-object-button.js b/src/components/pin-networked-object-button.js index 1dbe6ece49..a82404b886 100644 --- a/src/components/pin-networked-object-button.js +++ b/src/components/pin-networked-object-button.js @@ -42,11 +42,13 @@ AFRAME.registerComponent("pin-networked-object-button", { if (!NAF.utils.isMine(this.targetEl) && !NAF.utils.takeOwnership(this.targetEl)) return; const wasPinned = this.targetEl.components.pinnable && this.targetEl.components.pinnable.data.pinned; - this.targetEl.setAttribute("pinnable", "pinned", !wasPinned); + window.APP.pinningHelper.setPinned(this.targetEl, !wasPinned); if (!wasPinned) { this.el.sceneEl.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_PIN); } }; + + APP.store.addEventListener("themechanged", this._updateUI); }, play() { diff --git a/src/components/pinnable.js b/src/components/pinnable.js index b6fdd41481..ded6194643 100644 --- a/src/components/pinnable.js +++ b/src/components/pinnable.js @@ -4,91 +4,84 @@ AFRAME.registerComponent("pinnable", { }, init() { - this._fireEventsAndAnimate = this._fireEventsAndAnimate.bind(this); + this._persist = this._persist.bind(this); + this._persistAndAnimate = this._persistAndAnimate.bind(this); - // Fire pinned events when media is refreshed since the version will be bumped. - this.el.addEventListener("media_refreshed", this._fireEventsAndAnimate); + // Persist when media is refreshed since the version will be bumped. + this.el.addEventListener("media_refreshed", this._persistAndAnimate); - // Fire pinned events when page changes so we can persist the page. - this.el.addEventListener("owned-pager-page-changed", this._fireEventsAndAnimate); + this.el.addEventListener("owned-pager-page-changed", this._persist); - // Fire pinned events when video state changes so we can persist the page. - this.el.addEventListener("owned-video-state-changed", this._fireEventsAndAnimate); + this.el.addEventListener("owned-video-state-changed", this._persistAndAnimate); }, - update(oldData) { - this._fireEventsAndAnimate(oldData); + update() { + this._animate(); }, - _fireEventsAndAnimate(oldData, force) { - // We need to guard against _fireEventsAndAnimate being called during entity initialization, - // when the networked component isn't initialized yet. - if (!this.el.components.networked || !this.el.components.networked.data) return; - - const isMine = NAF.utils.isMine(this.el); + _persistAndAnimate() { + this._persist(); + this._animate(); + }, - // Avoid firing events during initialization by checking if the pin state has changed before doing so. - const pinStateChanged = !!oldData.pinned !== this.data.pinned; + _persist() { + // Re-pin or unpin entity to reflect state changes. + window.APP.pinningHelper.setPinned(this.el, this.data.pinned); + }, - if (this.data.pinned) { - if (pinStateChanged || force) { - this.el.emit("pinned", { el: this.el }); - } + _isMine() { + return this.el.components.networked?.data && NAF.utils.isMine(this.el); + }, - if (isMine) { - this.el.removeAttribute("animation__pin-start"); - this.el.removeAttribute("animation__pin-end"); - const currentScale = this.el.object3D.scale; - - this.el.setAttribute("animation__pin-start", { - property: "scale", - dur: 200, - from: { x: currentScale.x, y: currentScale.y, z: currentScale.z }, - to: { x: currentScale.x * 1.1, y: currentScale.y * 1.1, z: currentScale.z * 1.1 }, - easing: "easeOutElastic" - }); - - this.el.setAttribute("animation__pin-end", { - property: "scale", - delay: 200, - dur: 200, - from: { x: currentScale.x * 1.1, y: currentScale.y * 1.1, z: currentScale.z * 1.1 }, - to: { x: currentScale.x, y: currentScale.y, z: currentScale.z }, - easing: "easeOutElastic" - }); - - if (this.el.components["body-helper"] && !this.el.sceneEl.systems.interaction.isHeld(this.el)) { - this.el.setAttribute("body-helper", { type: "kinematic" }); - } - } - } else { - if (pinStateChanged || force) { - this.el.emit("unpinned", { el: this.el }); + _animate() { + const isAnimationRunning = + this.el.components["animation__pin-start"]?.animationIsPlaying || + this.el.components["animation__pin-end"]?.animationIsPlaying; + + if (this._isMine() && this.data.pinned && !isAnimationRunning) { + this.el.removeAttribute("animation__pin-start"); + this.el.removeAttribute("animation__pin-end"); + const currentScale = this.el.object3D.scale; + + this.el.setAttribute("animation__pin-start", { + property: "scale", + dur: 200, + from: { x: currentScale.x, y: currentScale.y, z: currentScale.z }, + to: { x: currentScale.x * 1.1, y: currentScale.y * 1.1, z: currentScale.z * 1.1 }, + easing: "easeOutElastic" + }); + + this.el.setAttribute("animation__pin-end", { + property: "scale", + delay: 200, + dur: 200, + from: { x: currentScale.x * 1.1, y: currentScale.y * 1.1, z: currentScale.z * 1.1 }, + to: { x: currentScale.x, y: currentScale.y, z: currentScale.z }, + easing: "easeOutElastic" + }); + + if (this.el.components["body-helper"] && !this.el.sceneEl.systems.interaction.isHeld(this.el)) { + this.el.setAttribute("body-helper", { type: "kinematic" }); } } }, - isHeld(el) { - const { leftHand, rightHand, rightRemote } = el.sceneEl.systems.interaction.state; - return leftHand.held === el || rightHand.held === el || rightRemote.held === el; - }, - tick() { - const held = this.isHeld(this.el); - const isMine = this.el.components.networked && this.el.components.networked.data && NAF.utils.isMine(this.el); + const isHeld = this.el.sceneEl.systems.interaction.isHeld(this.el); + const isMine = this._isMine(); let didFireThisFrame = false; - if (!held && this.wasHeld && isMine) { + if (!isHeld && this.wasHeld && isMine) { didFireThisFrame = true; - this._fireEventsAndAnimate(this.data, true); + this._persistAndAnimate(); } - this.wasHeld = held; + this.wasHeld = isHeld; this.transformObjectSystem = this.transformObjectSystem || AFRAME.scenes[0].systems["transform-selected-object"]; const transforming = this.transformObjectSystem.transforming && this.transformObjectSystem.target.el === this.el; if (!didFireThisFrame && !transforming && this.wasTransforming && isMine) { - this._fireEventsAndAnimate(this.data, true); + this._persistAndAnimate(); } this.wasTransforming = transforming; } diff --git a/src/components/pitch-yaw-rotator.js b/src/components/pitch-yaw-rotator.js index 5ecf5f72a7..fa7b4e2883 100644 --- a/src/components/pitch-yaw-rotator.js +++ b/src/components/pitch-yaw-rotator.js @@ -28,7 +28,7 @@ const rotatePitchAndYaw = (function() { q.copy(owq) .premultiply(pq) .premultiply(yq) - .premultiply(opq.inverse()); + .premultiply(opq.invert()); v.set(0, 1, 0).applyQuaternion(q); const newUpDot = v.dot(UP); v.set(0, 0, 1).applyQuaternion(q); diff --git a/src/components/player-info.js b/src/components/player-info.js index 2637568129..fe9aa1a5ad 100644 --- a/src/components/player-info.js +++ b/src/components/player-info.js @@ -53,8 +53,7 @@ AFRAME.registerComponent("player-info", { this.handleModelError = this.handleModelError.bind(this); this.handleRemoteModelError = this.handleRemoteModelError.bind(this); this.update = this.update.bind(this); - this.localStateAdded = this.localStateAdded.bind(this); - this.localStateRemoved = this.localStateRemoved.bind(this); + this.onMicStateChanged = this.onMicStateChanged.bind(this); this.isLocalPlayerInfo = this.el.id === "avatar-rig"; this.playerSessionId = null; @@ -75,6 +74,8 @@ AFRAME.registerComponent("player-info", { monetized: false, immersId: this.data.immersId }); + const avatarEl = this.el.querySelector("[avatar-audio-source]"); + APP.isAudioPaused.delete(avatarEl); deregisterComponentInstance(this, "player-info"); }, play() { @@ -91,8 +92,7 @@ AFRAME.registerComponent("player-info", { this.el.sceneEl.addEventListener("stateremoved", this.update); if (this.isLocalPlayerInfo) { - this.el.sceneEl.addEventListener("stateadded", this.localStateAdded); - this.el.sceneEl.addEventListener("stateremoved", this.localStateRemoved); + APP.dialog.on("mic-state-changed", this.onMicStateChanged); } }, pause() { @@ -108,8 +108,7 @@ AFRAME.registerComponent("player-info", { window.APP.store.removeEventListener("statechanged", this.update); if (this.isLocalPlayerInfo) { - this.el.sceneEl.removeEventListener("stateadded", this.localStateAdded); - this.el.sceneEl.removeEventListener("stateremoved", this.localStateRemoved); + APP.dialog.off("mic-state-changed", this.onMicStateChanged); } }, @@ -210,6 +209,13 @@ AFRAME.registerComponent("player-info", { el.setAttribute("emit-scene-event-on-remove", "event:action_end_video_sharing"); } } + + const avatarEl = this.el.querySelector("[avatar-audio-source]"); + if (this.data.muted) { + APP.isAudioPaused.add(avatarEl); + } else { + APP.isAudioPaused.delete(avatarEl); + } }, handleModelError() { window.APP.store.resetToRandomDefaultAvatar(); @@ -218,14 +224,7 @@ AFRAME.registerComponent("player-info", { this.data.avatarSrc = defaultAvatar; this.applyProperties(); }, - localStateAdded(e) { - if (e.detail === "muted") { - this.el.setAttribute("player-info", { muted: true }); - } - }, - localStateRemoved(e) { - if (e.detail === "muted") { - this.el.setAttribute("player-info", { muted: false }); - } + onMicStateChanged({ enabled }) { + this.el.setAttribute("player-info", { muted: !enabled }); } }); diff --git a/src/components/scene-components.js b/src/components/scene-components.js index caa8b9de33..f2c81b7557 100644 --- a/src/components/scene-components.js +++ b/src/components/scene-components.js @@ -24,7 +24,8 @@ import "./floaty-object"; import "./super-spawner"; import "./water"; import "./simple-water"; -import "./environment-map"; import "./trigger-volume"; import "./video-pause-state"; import "./particle-emitter"; +import "./audio-zone"; +import "./audio-zone-source"; diff --git a/src/components/scene-preview-camera.js b/src/components/scene-preview-camera.js index daf84daac0..2953b31bee 100644 --- a/src/components/scene-preview-camera.js +++ b/src/components/scene-preview-camera.js @@ -80,7 +80,7 @@ AFRAME.registerComponent("scene-preview-camera", { const fromRot = this.backwards ? this.targetRotation : this.startRotation; const toRot = this.backwards ? this.startRotation : this.targetRotation; - THREE.Quaternion.slerp(fromRot, toRot, newRot, t); + newRot.slerpQuaternions(fromRot, toRot, t); this.el.object3D.position.set(lerp(from.x, to.x, t), lerp(from.y, to.y, t), lerp(from.z, to.z, t)); diff --git a/src/components/simple-water.js b/src/components/simple-water.js index 00c16db766..0c24410a65 100644 --- a/src/components/simple-water.js +++ b/src/components/simple-water.js @@ -1,15 +1,8 @@ import { SimplexNoise } from "three/examples/jsm/math/SimplexNoise"; import waterNormalsUrl from "../assets/waternormals.jpg"; +import HubsTextureLoader from "../loaders/HubsTextureLoader"; -const { - Mesh, - PlaneBufferGeometry, - MeshStandardMaterial, - MeshPhongMaterial, - Vector2, - TextureLoader, - RepeatWrapping -} = THREE; +const { Mesh, PlaneBufferGeometry, MeshStandardMaterial, MeshPhongMaterial, Vector2, RepeatWrapping } = THREE; /** * SimpleWater @@ -43,7 +36,7 @@ export default class SimpleWater extends Mesh { normalMap.wrapS = normalMap.wrapT = RepeatWrapping; - const material = new materialClass({ color: 0x0054df, normalMap }); + const material = new materialClass({ color: 0x0054df, normalMap, roughness: 0.5, metalness: 0.5 }); material.name = "SimpleWaterMaterial"; material.onBeforeCompile = shader => { @@ -287,7 +280,7 @@ AFRAME.registerComponent("simple-water", { init() { if (!waterNormalMap) { - waterNormalMap = new TextureLoader().load(waterNormalsUrl); + waterNormalMap = new HubsTextureLoader().load(waterNormalsUrl); } const usePhongShader = window.APP.store.materialQualitySetting !== "high"; diff --git a/src/components/skybox.js b/src/components/skybox.js index cdc9ef92dd..7c5c085820 100644 --- a/src/components/skybox.js +++ b/src/components/skybox.js @@ -1,22 +1,26 @@ -import "three/examples/js/pmrem/PMREMGenerator"; -import "three/examples/js/pmrem/PMREMCubeUVPacker"; -import "three/examples/js/lights/LightProbeGenerator"; -import qsTruthy from "../utils/qs_truthy"; -const isBotMode = qsTruthy("bot"); +// It seems we need to use require to import modules +// under the three/examples/js to avoid tree shaking +// in webpack production mode. +require("three/examples/js/lights/LightProbeGenerator"); const { - Scene, + AmbientLight, + BackSide, + BoxBufferGeometry, CubeCamera, + LightProbeGenerator, + LinearFilter, + Mesh, Object3D, - Vector3, - BoxBufferGeometry, + PMREMGenerator, + RGBAFormat, + Scene, ShaderMaterial, - UniformsUtils, - BackSide, - Mesh, + sRGBEncoding, UniformsLib, - PMREMGenerator, - PMREMCubeUVPacker + UniformsUtils, + Vector3, + WebGLCubeRenderTarget } = THREE; /** @@ -342,39 +346,40 @@ export default class Sky extends Object3D { generateEnvironmentMap(renderer) { const skyScene = new Scene(); - const cubeCamera = new CubeCamera(1, 100000, 512); + const cubeCamera = new CubeCamera(1, 100000, new WebGLCubeRenderTarget(512)); skyScene.add(cubeCamera); skyScene.add(this.sky); cubeCamera.update(renderer, skyScene); this.add(this.sky); - const vrEnabled = renderer.vr.enabled; - renderer.vr.enabled = false; - const pmremGenerator = new PMREMGenerator(cubeCamera.renderTarget.texture); - pmremGenerator.update(renderer); - const pmremCubeUVPacker = new PMREMCubeUVPacker(pmremGenerator.cubeLods); - pmremCubeUVPacker.update(renderer); - renderer.vr.enabled = vrEnabled; + const vrEnabled = renderer.xr.enabled; + renderer.xr.enabled = false; + const pmremGenerator = new PMREMGenerator(renderer); + const envMap = pmremGenerator.fromCubemap(cubeCamera.renderTarget.texture).texture; + renderer.xr.enabled = vrEnabled; pmremGenerator.dispose(); - pmremCubeUVPacker.dispose(); cubeCamera.renderTarget.dispose(); - return pmremCubeUVPacker.CubeUVRenderTarget.texture; + return envMap; } generateLightProbe(renderer) { const skyScene = new Scene(); skyScene.add(this.sky); - const cubeCamera = new THREE.CubeCamera(1, 100000, 512, { - format: THREE.RGBAFormat, - magFilter: THREE.LinearFilter, - minFilter: THREE.LinearFilter - }); - cubeCamera.renderTarget.texture.encoding = THREE.sRGBEncoding; + const cubeCamera = new CubeCamera( + 1, + 100000, + new WebGLCubeRenderTarget(512, { + format: RGBAFormat, + magFilter: LinearFilter, + minFilter: LinearFilter, + encoding: sRGBEncoding + }) + ); skyScene.add(cubeCamera); skyScene.add(this.sky); cubeCamera.update(renderer, skyScene); this.add(this.sky); - const lightProbe = THREE.LightProbeGenerator.fromRenderTargetCube(renderer, cubeCamera.renderTarget); + const lightProbe = LightProbeGenerator.fromCubeRenderTarget(renderer, cubeCamera.renderTarget); cubeCamera.renderTarget.dispose(); return lightProbe; } @@ -422,12 +427,6 @@ AFRAME.registerComponent("skybox", { init() { this.sky = new Sky(); this.el.setObject3D("mesh", this.sky); - - this.updateEnvironmentMap = this.updateEnvironmentMap.bind(this); - // HACK: Render environment map on next frame to avoid bug where the render target texture is black. - // This is likely due to the custom elements attached callback being synchronous on Chrome but not Firefox. - // Added timeout due to additional case where texture is black in Firefox. - requestAnimationFrame(() => setTimeout(this.updateEnvironmentMap)); }, update(oldData) { @@ -470,26 +469,18 @@ AFRAME.registerComponent("skybox", { this.sky.matrixNeedsUpdate = true; } - this.updateEnvironmentMap(); - }, - - updateEnvironmentMap() { - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - const renderer = this.el.sceneEl.renderer; - - const quality = window.APP.store.materialQualitySetting; - - if (environmentMapComponent && !isBotMode && quality === "high") { - const envMap = this.sky.generateEnvironmentMap(renderer); - environmentMapComponent.updateEnvironmentMap(envMap); - } else if (quality === "medium") { + // TODO Remove or rework medium quality mode + if (window.APP.store.materialQualitySetting === "medium") { // This extra ambient light is here to normalize lighting with the MeshStandardMaterial. // Without it, objects are significantly darker in brighter environments. // It's kept to a low value to not wash out objects in very dark environments. // This is a hack, but the results are much better than they are without it. - this.el.setObject3D("ambient-light", new THREE.AmbientLight(0xffffff, 0.3)); - this.el.setObject3D("light-probe", this.sky.generateLightProbe(renderer)); + this.el.setObject3D("ambient-light", new AmbientLight(0xffffff, 0.3)); + this.el.setObject3D("light-probe", this.sky.generateLightProbe(this.el.sceneEl.renderer)); } + + // TODO if we care about dynamic skybox changes we should also update the enviornment map here + // }, remove() { diff --git a/src/components/teleporter.js b/src/components/teleporter.js index 863d87ae67..cb8bc13417 100644 --- a/src/components/teleporter.js +++ b/src/components/teleporter.js @@ -1,5 +1,6 @@ import { CYLINDER_TEXTURE } from "./cylinder-texture"; import { SOUND_TELEPORT_START, SOUND_TELEPORT_END } from "../systems/sound-effects-system"; +import { getMeshes } from "../utils/aframe-utils"; function easeIn(t) { return t * t; @@ -12,8 +13,7 @@ function easeOutIn(t) { const RayCurve = function(numPoints, width) { this.geometry = new THREE.BufferGeometry(); - this.vertices = new Float32Array(numPoints * 3 * 2); - this.uvs = new Float32Array(numPoints * 2 * 2); + this.vertices = new Float32Array(numPoints * 3 * 6); this.width = width; this.geometry.setAttribute("position", new THREE.BufferAttribute(this.vertices, 3).setUsage(THREE.DynamicDrawUsage)); @@ -24,7 +24,6 @@ const RayCurve = function(numPoints, width) { }); this.mesh = new THREE.Mesh(this.geometry, this.material); - this.mesh.drawMode = THREE.TriangleStripDrawMode; this.mesh.frustumCulled = false; this.mesh.vertices = this.vertices; @@ -33,9 +32,9 @@ const RayCurve = function(numPoints, width) { this.numPoints = numPoints; }; +const UP = new THREE.Vector3(0, 1, 0); RayCurve.prototype = { setDirection: function(direction) { - const UP = new THREE.Vector3(0, 1, 0); this.direction .copy(direction) .cross(UP) @@ -48,21 +47,63 @@ RayCurve.prototype = { }, setPoint: (function() { - const posA = new THREE.Vector3(); - const posB = new THREE.Vector3(); - - return function(i, point) { - posA.copy(point).add(this.direction); - posB.copy(point).sub(this.direction); - - let idx = 2 * 3 * i; - this.vertices[idx++] = posA.x; - this.vertices[idx++] = posA.y; - this.vertices[idx++] = posA.z; - - this.vertices[idx++] = posB.x; - this.vertices[idx++] = posB.y; - this.vertices[idx++] = posB.z; + const A = new THREE.Vector3(); + const B = new THREE.Vector3(); + const C = new THREE.Vector3(); + const D = new THREE.Vector3(); + + return function(i, P) { + let idx = 3 * 6 * i; + + A.copy(P).add(this.direction); + B.copy(P).sub(this.direction); + C.set( + // Previous A + i === 0 ? A.x : this.vertices[idx - 3], + i === 0 ? A.y : this.vertices[idx - 2], + i === 0 ? A.z : this.vertices[idx - 1] + ); + D.set( + // Previous B + i === 0 ? B.x : this.vertices[idx - 6], + i === 0 ? B.y : this.vertices[idx - 5], + i === 0 ? B.z : this.vertices[idx - 4] + ); + + // A---P---B + // | \ | + // | \ | + // | \ | + // | \ | + // | \ | + // | \| + // C-------D + // A'--P'--B' Previous P + // | \ | + + this.vertices[idx++] = A.x; + this.vertices[idx++] = A.y; + this.vertices[idx++] = A.z; + + this.vertices[idx++] = C.x; + this.vertices[idx++] = C.y; + this.vertices[idx++] = C.z; + + this.vertices[idx++] = D.x; + this.vertices[idx++] = D.y; + this.vertices[idx++] = D.z; + + this.vertices[idx++] = D.x; + this.vertices[idx++] = D.y; + this.vertices[idx++] = D.z; + + this.vertices[idx++] = B.x; + this.vertices[idx++] = B.y; + this.vertices[idx++] = B.z; + + this.vertices[idx++] = A.x; + this.vertices[idx++] = A.y; + this.vertices[idx++] = A.z; this.geometry.attributes.position.needsUpdate = true; }; @@ -97,16 +138,6 @@ const checkLineIntersection = (function() { }; })(); -function getMeshes(collisionEntities) { - return collisionEntities - .map(function(entity) { - return entity.getObject3D("mesh"); - }) - .filter(function(n) { - return n; - }); -} - const MISS_OPACITY = 0.1; const HIT_OPACITY = 0.3; const MISS_COLOR = 0xff0000; diff --git a/src/components/tools/networked-drawing.js b/src/components/tools/networked-drawing.js index 462dd59dfe..4439e81368 100644 --- a/src/components/tools/networked-drawing.js +++ b/src/components/tools/networked-drawing.js @@ -90,11 +90,6 @@ AFRAME.registerComponent("networked-drawing", { this.el.setObject3D("mesh", this.drawing); - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - if (environmentMapComponent) { - environmentMapComponent.applyEnvironmentMap(this.drawing); - } - this.prevIdx = Object.assign({}, this.sharedBuffer.idx); this.idx = Object.assign({}, this.sharedBuffer.idx); this.vertexCount = 0; //number of vertices added for current line (used for line deletion). @@ -769,7 +764,7 @@ AFRAME.registerComponent("deserialize-drawing-button", { addMeshScaleAnimation(drawingManager.drawing.el.object3DMap.mesh, { x: 0.001, y: 0.001, z: 0.001 }); if (this.targetEl.components.pinnable && this.targetEl.components.pinnable.data.pinned) { - this.targetEl.setAttribute("pinnable", "pinned", false); + window.APP.pinningHelper.setPinned(this.targetEl, false); } this.targetEl.parentEl.removeChild(this.targetEl); this.el.sceneEl.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_PEN_START_DRAW); diff --git a/src/components/tools/pen-laser.js b/src/components/tools/pen-laser.js index 0d1b7eb35b..c6f5371e6a 100644 --- a/src/components/tools/pen-laser.js +++ b/src/components/tools/pen-laser.js @@ -30,12 +30,6 @@ AFRAME.registerComponent("pen-laser", { this.laserTip.scale.setScalar(0.01); this.laserTip.matrixNeedsUpdate = true; - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - if (environmentMapComponent) { - environmentMapComponent.applyEnvironmentMap(this.laser); - environmentMapComponent.applyEnvironmentMap(this.laserTip); - } - //prevents the line from being a raycast target for the cursor this.laser.raycast = function() {}; diff --git a/src/components/tools/pen.js b/src/components/tools/pen.js index 9e6e1aa760..67908f8e95 100644 --- a/src/components/tools/pen.js +++ b/src/components/tools/pen.js @@ -140,11 +140,6 @@ AFRAME.registerComponent("pen", { this.el.setObject3D("mesh", this.penTip); - const environmentMapComponent = this.el.sceneEl.components["environment-map"]; - if (environmentMapComponent) { - environmentMapComponent.applyEnvironmentMap(this.el.parentEl.object3D); - } - this.penLaserAttributesUpdated = false; this.penLaserAttributes = { color: "#FF0033", diff --git a/src/components/transform-object-button.js b/src/components/transform-object-button.js index 6b1c26133b..320c740f98 100644 --- a/src/components/transform-object-button.js +++ b/src/components/transform-object-button.js @@ -142,7 +142,7 @@ AFRAME.registerSystem("transform-selected-object", { if (qAlmostEquals(q, this.startQ)) { q.multiply(PI_AROUND_Y); this.target.parent.getWorldQuaternion(pInv); - pInv.inverse(); + pInv.invert(); this.target.quaternion.copy(pInv).multiply(q); this.target.matrixNeedsUpdate = true; } @@ -216,7 +216,7 @@ AFRAME.registerSystem("transform-selected-object", { if (this.mode === TRANSFORM_MODE.PUPPET) { this.target.getWorldQuaternion(this.puppet.initialObjectOrientation); this.hand.getWorldQuaternion(this.puppet.initialControllerOrientation); - this.puppet.initialControllerOrientation_inverse.copy(this.puppet.initialControllerOrientation).inverse(); + this.puppet.initialControllerOrientation_inverse.copy(this.puppet.initialControllerOrientation).invert(); return; } @@ -276,7 +276,7 @@ AFRAME.registerSystem("transform-selected-object", { finalProjectedVec .copy(deltaOnPlane) .projectOnPlane(normal) - .applyQuaternion(q.copy(plane.quaternion).inverse()) + .applyQuaternion(q.copy(plane.quaternion).invert()) .multiplyScalar(SENSITIVITY / cameraToPlaneDistance); if (this.mode === TRANSFORM_MODE.CURSOR) { const modify = AFRAME.scenes[0].systems.userinput.get(paths.actions.transformModifier); diff --git a/src/components/tweet-media-button.js b/src/components/tweet-media-button.js index 791dcb3e29..6ece8df89b 100644 --- a/src/components/tweet-media-button.js +++ b/src/components/tweet-media-button.js @@ -13,12 +13,7 @@ AFRAME.registerComponent("tweet-media-button", { }); this.onClick = () => { - const hasDiscordBridges = window.APP.hubChannel && window.APP.hubChannel.discordBridges().length > 0; - - const initialTweet = !hasDiscordBridges - ? `Taken in ${location.hostname} - ` + - `join me now at ${configs.SHORTLINK_DOMAIN}/${window.APP.hubChannel.hubId}! ` - : `Taken in ${location.hostname} `; + const initialTweet = `Taken in ${location.hostname} `; const { src, contentSubtype } = this.targetEl.components["media-loader"].data; this.el.sceneEl.emit("action_media_tweet", { mediaUrl: src, contentSubtype, initialTweet }); diff --git a/src/components/video-texture-target.js b/src/components/video-texture-target.js index 9fe2c0a533..b872bd544e 100644 --- a/src/components/video-texture-target.js +++ b/src/components/video-texture-target.js @@ -1,6 +1,7 @@ import { disposeTexture } from "../utils/material-utils"; import { createVideoOrAudioEl } from "../utils/media-utils"; import { findNode } from "../utils/three-utils"; +import { Layers } from "./layers"; /** * @component video-texture-source @@ -64,16 +65,16 @@ AFRAME.registerComponent("video-texture-source", { const sceneEl = this.el.sceneEl; const renderer = this.renderer || sceneEl.renderer; - const tmpVRFlag = renderer.vr.enabled; + const tmpXRFlag = renderer.xr.enabled; const tmpOnAfterRender = sceneEl.object3D.onAfterRender; delete sceneEl.object3D.onAfterRender; - renderer.vr.enabled = false; + renderer.xr.enabled = false; renderer.setRenderTarget(this.renderTarget); renderer.render(sceneEl.object3D, this.camera); renderer.setRenderTarget(null); - renderer.vr.enabled = tmpVRFlag; + renderer.xr.enabled = tmpXRFlag; sceneEl.object3D.onAfterRender = tmpOnAfterRender; this.lastRenderTime = time; @@ -106,6 +107,15 @@ AFRAME.registerComponent("video-texture-target", { }, init() { + // Make video-texture-target objects inivisible before rendering to the frame buffer + // Chromium checks for loops when drawing to a framebuffer so if we don't exclude the objects + // that are using that rendertarget's texture we get an error. Firefox does not check. + // https://chromium.googlesource.com/chromium/src/+/460cac969e2e9ac38a2611be1a32db0361d88bfb/gpu/command_buffer/service/gles2_cmd_decoder.cc#9516 + this.el.object3D.traverse(o => { + o.layers.mask1 = o.layers.mask; + o.layers.set(Layers.CAMERA_LAYER_VIDEO_TEXTURE_TARGET); + }); + const material = this.getMaterial(); if (!material) { @@ -152,7 +162,7 @@ AFRAME.registerComponent("video-texture-target", { const streamClientId = src.substring(7).split("/")[1]; // /clients/<client id>/video is only URL for now - NAF.connection.adapter.getMediaStream(streamClientId, "video").then(stream => { + APP.dialog.getMediaStream(streamClientId, "video").then(stream => { if (src !== this.data.src) { // Prevent creating and loading video texture if the src changed while we were fetching the video stream. return; @@ -208,6 +218,13 @@ AFRAME.registerComponent("video-texture-target", { }, remove() { + this.el.object3D.traverse(o => { + if (o.layers.mask1) { + o.layers.mask = o.layers.mask1; + delete o.layers.mask1; + } + }); + // element sources can be shared and are expected to manage their own resources if (this.data.src === "el") return; diff --git a/src/components/virtual-gamepad-controls.js b/src/components/virtual-gamepad-controls.js index 6953f491eb..e359ce0aa6 100644 --- a/src/components/virtual-gamepad-controls.js +++ b/src/components/virtual-gamepad-controls.js @@ -160,7 +160,7 @@ AFRAME.registerComponent("virtual-gamepad-controls", { if (window.APP.preferenceScreenIsVisible) return; const angle = joystick.angle.radian; const force = joystick.force < 1 ? joystick.force : 1; - this.displacement.set(Math.cos(angle), 0, Math.sin(angle)).multiplyScalar(force * 1.85); + this.displacement.set(Math.cos(angle), 0, -Math.sin(angle)).multiplyScalar(force * 1.85); this.moving = true; }, diff --git a/src/components/water.js b/src/components/water.js index 7859554ba3..0933c4f4dc 100644 --- a/src/components/water.js +++ b/src/components/water.js @@ -1,6 +1,7 @@ import { Layers } from "./layers"; import "../vendor/Water"; import waterNormalMap from "../assets/waternormals.jpg"; +import HubsTextureLoader from "../loaders/HubsTextureLoader"; /** * @author jbouny / https://github.com/jbouny @@ -140,9 +141,7 @@ MobileWater.prototype = Object.create(THREE.Mesh.prototype); MobileWater.prototype.constructor = THREE.Water; async function loadWaterNormals(url) { - const texture = await new Promise((resolve, reject) => - new THREE.TextureLoader().load(url, resolve, undefined, reject) - ); + const texture = await new Promise((resolve, reject) => new HubsTextureLoader().load(url, resolve, undefined, reject)); texture.wrapS = texture.wrapT = THREE.RepeatWrapping; texture.needsUpdate = true; return texture; @@ -182,7 +181,7 @@ AFRAME.registerComponent("water", { this.water = new MobileWater(waterGeometry, waterConfig); } else { this.water = new THREE.Water(waterGeometry, waterConfig); - this.water.mirrorCamera.layers.set(Layers.reflection); + this.water.mirrorCamera.layers.set(Layers.CAMERA_LAYER_REFLECTION); } this.el.setObject3D("water", this.water); diff --git a/src/emitter.js b/src/emitter.js new file mode 100644 index 0000000000..414edfeb01 --- /dev/null +++ b/src/emitter.js @@ -0,0 +1,28 @@ +export function emitter() { + let bindings = []; + let bindingRef = 0; + const on = (event, callback) => { + const ref = bindingRef++; + bindings.push({ event, ref, callback }); + return ref; + }; + const off = (event, ref) => { + bindings = bindings.filter(bind => { + return !(bind.event === event && (typeof ref === "undefined" || ref === bind.ref)); + }); + }; + const trigger = (event, payload) => { + bindings.filter(bind => bind.event === event).forEach(bind => { + bind.callback(payload); + }); + }; + const getBindings = () => { + return bindings; + }; + return { + on, + off, + trigger, + getBindings + }; +} diff --git a/src/freeze.js b/src/freeze.js new file mode 100644 index 0000000000..f7e2835ceb --- /dev/null +++ b/src/freeze.js @@ -0,0 +1,3 @@ +export function freeze(a) { + return JSON.parse(JSON.stringify(a || "undefined")); +} diff --git a/src/gltf-component-mappings.js b/src/gltf-component-mappings.js index 375205fe39..159187100a 100644 --- a/src/gltf-component-mappings.js +++ b/src/gltf-component-mappings.js @@ -3,6 +3,8 @@ import "./components/gltf-model-plus"; import { getSanitizedComponentMapping } from "./utils/component-mappings"; import { TYPE, SHAPE, FIT } from "three-ammo/constants"; const COLLISION_LAYERS = require("./constants").COLLISION_LAYERS; +import { AudioType, DistanceModelType, SourceType } from "./components/audio-params"; +import { updateAudioSettings } from "./update-audio-settings"; function registerRootSceneComponent(componentName) { AFRAME.GLTFModelPlus.registerComponent(componentName, componentName, (el, componentName, componentData) => { @@ -21,7 +23,6 @@ function registerRootSceneComponent(componentName) { } registerRootSceneComponent("fog"); -registerRootSceneComponent("background"); AFRAME.GLTFModelPlus.registerComponent("duck", "duck", el => { el.setAttribute("duck", ""); @@ -118,7 +119,6 @@ AFRAME.GLTFModelPlus.registerComponent("spawn-point", "spawn-point", el => { willMaintainWorldUp: true }); }); -AFRAME.GLTFModelPlus.registerComponent("sticky-zone", "sticky-zone"); AFRAME.GLTFModelPlus.registerComponent("nav-mesh", "nav-mesh", (el, _componentName, componentData) => { const nav = AFRAME.scenes[0].systems.nav; const zone = componentData.zone || "character"; @@ -240,19 +240,43 @@ async function mediaInflator(el, componentName, componentData, components) { if (componentName === "video" || componentName === "audio") { mediaOptions.videoPaused = !componentData.autoPlay; - mediaOptions.volume = componentData.volume; mediaOptions.loop = componentData.loop; - mediaOptions.audioType = componentData.audioType; mediaOptions.hidePlaybackControls = !isControlled; - if (componentData.audioType === "pannernode") { - mediaOptions.distanceModel = componentData.distanceModel; - mediaOptions.rolloffFactor = componentData.rolloffFactor; - mediaOptions.refDistance = componentData.refDistance; - mediaOptions.maxDistance = componentData.maxDistance; - mediaOptions.coneInnerAngle = componentData.coneInnerAngle; - mediaOptions.coneOuterAngle = componentData.coneOuterAngle; - mediaOptions.coneOuterGain = componentData.coneOuterGain; + if (componentData.audioType) { + // This is an old version of this component, which had built-in audio parameters. + // The way we are handling it is wrong. If a user created a scene with this old version + // of the component, all of these parameters will be present whether the user explicitly set + // the values for them or not. But really, they should only count as "overrides" if the user + // meant for them to take precendence over the app and scene defaults. + // TODO: Fix this issue. One option is to just ignore this component data, which might break old scenes + // but simplifying the handling. Another option is to compare the component data here with + // the "defaults" and only save the values that are different from the defaults. However, + // this loses information if the user changed the scene settings but wanted this specific + // node to use the "defaults". + // I don't see a perfect solution here and would prefer not to handle the "legacy" components. + // + // For legacy components we don't want artificial distance based attenuation to be applied to stereo audios + // so we set the distanceModel and rolloffFactor so the attenuation is always 1. The artificial distance based + // attenuation is calculated in the gain system for stereo audios. + APP.audioOverrides.set(el, { + audioType: componentData.audioType, + distanceModel: + componentData.audioType === AudioType.Stereo ? DistanceModelType.Linear : componentData.distanceModel, + rolloffFactor: componentData.audioType === AudioType.Stereo ? 0 : componentData.rolloffFactor, + refDistance: componentData.refDistance, + maxDistance: componentData.maxDistance, + coneInnerAngle: componentData.coneInnerAngle, + coneOuterAngle: componentData.coneOuterAngle, + coneOuterGain: componentData.coneOuterGain, + gain: componentData.volume + }); + APP.sourceType.set(el, SourceType.MEDIA_VIDEO); + + const audio = APP.audios.get(el); + if (audio) { + updateAudioSettings(el, audio); + } } el.setAttribute("video-pause-state", { paused: mediaOptions.videoPaused }); @@ -370,7 +394,12 @@ AFRAME.GLTFModelPlus.registerComponent( enterComponentMapping = getSanitizedComponentMapping(enterComponent, enterProperty, publicComponents); leaveComponentMapping = getSanitizedComponentMapping(leaveComponent, leaveProperty, publicComponents); - targetEntity = indexToEntityMap[target]; + // indexToEntityMap should be considered depredcated. These references are now resovled by the GLTFHubsComponentExtension + if (typeof target === "number") { + targetEntity = indexToEntityMap[target]; + } else { + targetEntity = target?.el; + } if (!targetEntity) { throw new Error(`Couldn't find target entity with index: ${target}.`); @@ -420,7 +449,46 @@ AFRAME.GLTFModelPlus.registerComponent("particle-emitter", "particle-emitter"); AFRAME.GLTFModelPlus.registerComponent("networked-drawing-buffer", "networked-drawing-buffer"); AFRAME.GLTFModelPlus.registerComponent("audio-settings", "audio-settings", (el, _componentName, componentData) => { - el.sceneEl.systems["hubs-systems"].audioSettingsSystem.updateAudioSettings(componentData); + const removeUndefined = obj => { + return Object.entries(obj).reduce((result, [key, value]) => { + if (value !== undefined) { + result[key] = value; + } + return result; + }, {}); + }; + // TODO: This component should only overwrite the scene audio defaults if this + // component is on the scene node. If this component is on some other node + // we don't care about it and should ignore it. + APP.sceneAudioDefaults.set( + SourceType.MEDIA_VIDEO, + removeUndefined({ + distanceModel: componentData.mediaDistanceModel, + rolloffFactor: componentData.mediaRolloffFactor, + refDistance: componentData.mediaRefDistance, + maxDistance: componentData.mediaMaxDistance, + coneInnerAngle: componentData.mediaConeInnerAngle, + coneOuterAngle: componentData.mediaConeOuterAngle, + coneOuterGain: componentData.mediaConeOuterGain, + gain: componentData.mediaVolume + }) + ); + APP.sceneAudioDefaults.set( + SourceType.AVATAR_AUDIO_SOURCE, + removeUndefined({ + distanceModel: componentData.avatarDistanceModel, + rolloffFactor: componentData.avatarRolloffFactor, + refDistance: componentData.avatarRefDistance, + maxDistance: componentData.avatarMaxDistance, + coneInnerAngle: componentData.avatarConeInnerAngle, + coneOuterAngle: componentData.avatarConeOuterAngle, + coneOuterGain: componentData.avatarConeOuterGain, + gain: componentData.avatarVolume + }) + ); + for (const [el, audio] of APP.audios.entries()) { + updateAudioSettings(el, audio); + } }); AFRAME.GLTFModelPlus.registerComponent( @@ -431,7 +499,12 @@ AFRAME.GLTFModelPlus.registerComponent( let srcEl; if (srcNode !== undefined) { - srcEl = indexToEntityMap[srcNode]; + // indexToEntityMap should be considered depredcated. These references are now resovled by the GLTFHubsComponentExtension + if (typeof srcNode === "number") { + srcEl = indexToEntityMap[srcNode]; + } else { + srcEl = srcNode?.el; + } if (!srcEl) { console.warn( `Error inflating gltf component "video-texture-srcEl": Couldn't find srcEl entity with index ${srcNode}` @@ -459,7 +532,12 @@ AFRAME.GLTFModelPlus.registerComponent( let srcEl; if (srcNode !== undefined) { - srcEl = indexToEntityMap[srcNode]; + // indexToEntityMap should be considered depredcated. These references are now resovled by the GLTFHubsComponentExtension + if (typeof srcNode === "number") { + srcEl = indexToEntityMap[srcNode]; + } else { + srcEl = srcNode?.el; + } if (!srcEl) { console.warn( `Error inflating gltf component ${componentName}: Couldn't find srcEl entity with index ${srcNode}` @@ -467,7 +545,75 @@ AFRAME.GLTFModelPlus.registerComponent( } } - el.setAttribute(componentName, { ...componentData, srcEl }); + if (componentData.positional !== undefined) { + // This is an old version of the audio-target component, which had built-in audio parameters. + // The way we are handling it is wrong. If a user created a scene in spoke with this old version + // of this component, all of these parameters will be present whether the user explicitly set + // the values for them or not. But really, they should only count as "overrides" if the user + // meant for them to take precendence over the app and scene defaults. + // TODO: Fix this issue. One option is to just ignore this component data, which might break old scenes + // but simplifying the handling. Another option is to compare the component data here with + // the "defaults" and only save the values that are different from the defaults. However, + // this loses information if the user changed the scene settings but wanted this specific + // node to use the "defaults". + // I don't see a perfect solution here and would prefer not to handle the "legacy" components. + APP.audioOverrides.set(el, { + audioType: componentData.positional ? AudioType.PannerNode : AudioType.Stereo, + distanceModel: componentData.distanceModel, + rolloffFactor: componentData.rolloffFactor, + refDistance: componentData.refDistance, + maxDistance: componentData.maxDistance, + coneInnerAngle: componentData.coneInnerAngle, + coneOuterAngle: componentData.coneOuterAngle, + coneOuterGain: componentData.coneOuterGain, + gain: componentData.gain + }); + APP.sourceType.set(el, SourceType.AUDIO_TARGET); + + const audio = APP.audios.get(el); + if (audio) { + updateAudioSettings(el, audio); + } + } + + el.setAttribute(componentName, { + minDelay: componentData.minDelay, + maxDelay: componentData.maxDelay, + debug: componentData.debug, + srcEl + }); } ); AFRAME.GLTFModelPlus.registerComponent("zone-audio-source", "zone-audio-source"); + +AFRAME.GLTFModelPlus.registerComponent("audio-params", "audio-params", (el, componentName, componentData) => { + APP.audioOverrides.set(el, componentData); + const audio = APP.audios.get(el); + if (audio) { + updateAudioSettings(el, audio); + } +}); + +AFRAME.GLTFModelPlus.registerComponent("audio-zone", "audio-zone", (el, componentName, componentData) => { + el.setAttribute(componentName, { ...componentData }); +}); + +AFRAME.GLTFModelPlus.registerComponent("background", "background", (el, _componentName, componentData) => { + console.warn( + "The `background` component is deprecated, use `backgroundColor` on the `environment-settings` component instead." + ); + // This assumes the background component is on the root entity, which it is for spoke, the only thing using this component + el.setAttribute("environment-settings", { backgroundColor: new THREE.Color(componentData.color) }); +}); + +AFRAME.GLTFModelPlus.registerComponent( + "environment-settings", + "environment-settings", + (el, componentName, componentData) => { + // TODO a bit silly to be storing this as an aframe component. Use a glboal store of some sort + el.setAttribute(componentName, { + ...componentData, + backgroundColor: new THREE.Color(componentData.backgroundColor) + }); + } +); diff --git a/src/hub.html b/src/hub.html index 549f60cd5f..29a4550e75 100644 --- a/src/hub.html +++ b/src/hub.html @@ -79,7 +79,6 @@ freeze-controller personal-space-bubble="debug: false;" rotate-selected-object - environment-map light="defaultLightsEnabled: false" > <a-assets> @@ -225,7 +224,8 @@ <template data-name="Head"> <a-entity - avatar-audio-source="rolloffFactor: 2.0;" + avatar-audio-source + audio-zone-source personal-space-invader="radius: 0.15; useMaterial: true;" bone-visibility body-helper="type: kinematic; collisionFilterGroup: 4; collisionFilterMask: 1;" @@ -323,7 +323,6 @@ position-at-border__freeze="target:.freeze-menu" position-at-border__freeze-unprivileged="target:.freeze-unprivileged-menu" listed-media - use-audio-system-settings > <a-entity class="ui interactable-ui"> <a-entity class="freeze-menu" visibility-while-frozen="withinDistance: 100; withPermission: spawn_and_move_media"> @@ -1010,7 +1009,8 @@ top: 64; right: 66; bottom: 66; - opacity: 1.0; + transparent: false; + alphaTest: 0.1; src: #button" ></a-mixin> @@ -1022,7 +1022,8 @@ top: 64; right: 66; bottom: 66; - opacity: 1.0; + transparent: false; + alphaTest: 0.1; src: #button" ></a-mixin> @@ -1034,7 +1035,8 @@ top: 64; right: 66; bottom: 66; - opacity: 1.0; + transparent: false; + alphaTest: 0.1; src: #action-button" ></a-mixin> @@ -1046,7 +1048,8 @@ top: 64; right: 66; bottom: 66; - opacity: 1.0; + transparent: false; + alphaTest: 0.1; src: #action-button" ></a-mixin> @@ -1064,7 +1067,8 @@ top: 64; right: 66; bottom: 66; - opacity: 1.0; + transparent: false; + alphaTest: 0.1; src: #button" ></a-mixin> <a-mixin id="rounded-share-text-action-button" diff --git a/src/hub.js b/src/hub.js index 4aa6e4c204..ab48b6ae07 100644 --- a/src/hub.js +++ b/src/hub.js @@ -1,10 +1,21 @@ +import { + getCurrentHubId, + updateVRHudPresenceCount, + updateSceneCopresentState, + createHubChannelParams +} from "./utils/hub-utils"; import "./utils/debug-log"; -import "./webxr-bypass-hacks"; import configs from "./utils/configs"; import "./utils/theme"; import "@babel/polyfill"; -console.log(`App version: ${process.env.BUILD_VERSION || "?"}`); +console.log( + `App version: ${ + configs.IS_LOCAL_OR_CUSTOM_CLIENT + ? `Custom client or local client (undeploy custom client to run build ${process.env.BUILD_VERSION})` + : process.env.BUILD_VERSION || "?" + }` +); import "./react-components/styles/global.scss"; import "./assets/stylesheets/globals.scss"; @@ -13,31 +24,46 @@ import initialBatchImage from "./assets/images/warning_icon.png"; import loadingEnvironment from "./assets/models/LoadingEnvironment.glb"; import "aframe"; +import "./utils/aframe-overrides"; + +// A-Frame hardcodes THREE.Cache.enabled = true +// But we don't want to use THREE.Cache because +// web browser cache should work well. +// So we disable it here. +THREE.Cache.enabled = false; + import "./utils/logging"; import { patchWebGLRenderingContext } from "./utils/webgl"; patchWebGLRenderingContext(); -import "three/examples/js/loaders/GLTFLoader"; +// It seems we need to use require to import modules +// under the three/examples/js to avoid tree shaking +// in webpack production mode. +require("three/examples/js/loaders/GLTFLoader"); + import "networked-aframe/src/index"; import "aframe-rounded"; import "webrtc-adapter"; import "aframe-slice9-component"; -import "./utils/threejs-positional-audio-updatematrixworld"; -import "./utils/threejs-world-update"; -import patchThreeAllocations from "./utils/threejs-allocation-patches"; -import { isSafari } from "./utils/detect-safari"; +import { detectOS, detect } from "detect-browser"; import { getReticulumFetchUrl, getReticulumMeta, - invalidateReticulumMeta, - migrateChannelToSocket + migrateChannelToSocket, + connectToReticulum, + denoisePresence, + presenceEventsForHub, + tryGetMatchingMeta } from "./utils/phoenix-utils"; +import { Presence } from "phoenix"; +import { emitter } from "./emitter"; +import "./phoenix-adapter"; import nextTick from "./utils/next-tick"; import { addAnimationComponents } from "./utils/animation"; -import { authorizeOrSanitizeMessage } from "./utils/permissions-utils"; import Cookies from "js-cookie"; -import "./naf-dialog-adapter"; +import { DialogAdapter, DIALOG_CONNECTION_ERROR_FATAL, DIALOG_CONNECTION_CONNECTED } from "./naf-dialog-adapter"; +import "./change-hub"; import "./components/scene-components"; import "./components/scale-in-screen-space"; @@ -72,7 +98,9 @@ import "./components/hide-when-pinned-and-forbidden"; import "./components/visibility-while-frozen"; import "./components/stats-plus"; import "./components/networked-avatar"; -import "./components/media-views"; +import "./components/media-video"; +import "./components/media-pdf"; +import "./components/media-image"; import "./components/avatar-volume-controls"; import "./components/pinch-to-move"; import "./components/pitch-yaw-rotator"; @@ -129,7 +157,6 @@ import { ExitedRoomScreenContainer } from "./react-components/room/ExitedRoomScr import AuthChannel from "./utils/auth-channel"; import HubChannel from "./utils/hub-channel"; import LinkChannel from "./utils/link-channel"; -import { connectToReticulum } from "./utils/phoenix-utils"; import { disableiOSZoom } from "./utils/disable-ios-zoom"; import { proxiedUrlFor } from "./utils/media-url-utils"; import { traverseMeshesAndAddShapes } from "./utils/physics-utils"; @@ -159,22 +186,26 @@ import "./systems/hubs-systems"; import "./systems/capture-system"; import "./systems/listed-media"; import "./systems/linked-media"; -import { SOUND_CHAT_MESSAGE } from "./systems/sound-effects-system"; +import "./systems/audio-debug-system"; +import "./systems/audio-gain-system"; import "./gltf-component-mappings"; import { App } from "./App"; import MediaDevicesManager from "./utils/media-devices-manager"; +import PinningHelper from "./utils/pinning-helper"; import { sleep } from "./utils/async-utils"; import { platformUnsupported } from "./support"; import * as immers from "./utils/immers"; window.APP = new App(); +window.APP.dialog = new DialogAdapter(); window.APP.RENDER_ORDER = { HUD_BACKGROUND: 1, HUD_ICONS: 2, CURSOR: 3 }; + const store = window.APP.store; store.update({ preferences: { shouldPromptForRefresh: undefined } }); // Clear flag that prompts for refresh from preference screen const mediaSearchStore = window.APP.mediaSearchStore; @@ -224,6 +255,7 @@ import { ExitReason } from "./react-components/room/ExitedRoomScreen"; import { OAuthScreenContainer } from "./react-components/auth/OAuthScreenContainer"; import { SignInMessages } from "./react-components/auth/SignInModal"; import { ThemeProvider } from "./react-components/styles/theme"; +import { LogMessageType } from "./react-components/room/ChatSidebar"; import "./components/immers/index"; @@ -238,6 +270,7 @@ let isOAuthModal = false; if (window.opener && window.opener.doingTwitterOAuth) { window.opener.postMessage("oauth-successful"); isOAuthModal = true; + window.close(); } const isBotMode = qsTruthy("bot"); @@ -255,6 +288,7 @@ if (!isOAuthModal) { } function setupLobbyCamera() { + console.log("Setting up lobby camera"); const camera = document.getElementById("scene-preview-node"); const previewCamera = document.getElementById("environment-scene").object3D.getObjectByName("scene-preview-camera"); @@ -274,7 +308,6 @@ function setupLobbyCamera() { } let uiProps = {}; -let connectionErrorTimeout = null; // Hub ID and slug are the basename let routerBaseName = document.location.pathname @@ -331,29 +364,14 @@ function mountUI(props = {}) { ); } -function remountUI(props) { +export function remountUI(props) { uiProps = { ...uiProps, ...props }; mountUI(uiProps); } -function setupPeerConnectionConfig(adapter) { - const forceTurn = qs.get("force_turn"); - const forceTcp = qs.get("force_tcp"); - adapter.setTurnConfig(forceTcp, forceTurn); -} - -async function updateEnvironmentForHub(hub, entryManager) { +export async function getSceneUrlForHub(hub) { let sceneUrl; let isLegacyBundle; // Deprecated - - const sceneErrorHandler = () => { - remountUI({ roomUnavailableReason: ExitReason.sceneError }); - entryManager.exitScene(); - }; - - const environmentScene = document.querySelector("#environment-scene"); - const sceneEl = document.querySelector("a-scene"); - if (hub.scene) { isLegacyBundle = false; sceneUrl = hub.scene.model_url; @@ -378,8 +396,25 @@ async function updateEnvironmentForHub(hub, entryManager) { } else { sceneUrl = proxiedUrlFor(sceneUrl); } + return sceneUrl; +} + +export async function updateEnvironmentForHub(hub, entryManager) { + console.log("Updating environment for hub"); + const sceneUrl = await getSceneUrlForHub(hub); + + const sceneErrorHandler = () => { + remountUI({ roomUnavailableReason: ExitReason.sceneError }); + entryManager.exitScene(); + }; + + const environmentScene = document.querySelector("#environment-scene"); + const sceneEl = document.querySelector("a-scene"); + + const envSystem = sceneEl.systems["hubs-systems"].environmentSystem; console.log(`Scene URL: ${sceneUrl}`); + const loadStart = performance.now(); let environmentEl = null; @@ -391,11 +426,15 @@ async function updateEnvironmentForHub(hub, entryManager) { () => { environmentEl.removeEventListener("model-error", sceneErrorHandler); + console.log(`Scene file inital load took ${Math.round(performance.now() - loadStart)}ms`); + // Show the canvas once the model has loaded document.querySelector(".a-canvas").classList.remove("a-hidden"); sceneEl.addState("visible"); + envSystem.updateEnvironment(environmentEl); + //TODO: check if the environment was made with spoke to determine if a shape should be added traverseMeshesAndAddShapes(environmentEl); }, @@ -422,6 +461,11 @@ async function updateEnvironmentForHub(hub, entryManager) { "model-loaded", () => { environmentEl.removeEventListener("model-error", sceneErrorHandler); + + envSystem.updateEnvironment(environmentEl); + + console.log(`Scene file update load took ${Math.round(performance.now() - loadStart)}ms`); + traverseMeshesAndAddShapes(environmentEl); // We've already entered, so move to new spawn point once new environment is loaded @@ -459,7 +503,7 @@ async function updateEnvironmentForHub(hub, entryManager) { } } -async function updateUIForHub(hub, hubChannel) { +export async function updateUIForHub(hub, hubChannel) { remountUI({ hub, entryDisallowed: !hubChannel.canEnterRoom(hub) }); } @@ -471,7 +515,10 @@ function onConnectionError(entryManager, connectError) { entryManager.exitScene(); } -function handleHubChannelJoined(entryManager, hubChannel, messageDispatch, data) { +// TODO: Find a home for this +// TODO: Naming. Is this an "event bus"? +const events = emitter(); +function handleHubChannelJoined(entryManager, hubChannel, messageDispatch, data, permsToken) { const scene = document.querySelector("a-scene"); const isRejoin = NAF.connection.isConnected(); @@ -484,6 +531,8 @@ function handleHubChannelJoined(entryManager, hubChannel, messageDispatch, data) } // Send complete sync on phoenix re-join. + // TODO: We should be able to safely remove this completeSync now that + // NAF occupancy is driven from phoenix presence state. NAF.connection.entities.completeSync(null, true); return; } @@ -537,122 +586,93 @@ function handleHubChannelJoined(entryManager, hubChannel, messageDispatch, data) }); }); - const objectsScene = document.querySelector("#objects-scene"); - const objectsUrl = getReticulumFetchUrl(`/${hub.hub_id}/objects.gltf`); - const objectsEl = document.createElement("a-entity"); - - scene.addEventListener("adapter-ready", () => { - // Append objects once adapter is ready since ownership may be taken. - objectsEl.setAttribute("gltf-model-plus", { src: objectsUrl, useCache: false, inflate: true }); + scene.addEventListener( + "didConnectToNetworkedScene", + () => { + // Append objects once we are in the NAF room since ownership may be taken. + const objectsScene = document.querySelector("#objects-scene"); + const objectsUrl = getReticulumFetchUrl(`/${hub.hub_id}/objects.gltf`); + const objectsEl = document.createElement("a-entity"); - if (!isBotMode) { - objectsScene.appendChild(objectsEl); - } - }); + objectsEl.setAttribute("gltf-model-plus", { src: objectsUrl, useCache: false, inflate: true }); - // TODO Remove this once transition completed. - // Wait for scene objects to load before connecting, so there is no race condition on network state. - const connectToScene = async () => { - const adapter = "dialog"; + if (!isBotMode) { + objectsScene.appendChild(objectsEl); + } + }, + { once: true } + ); - scene.setAttribute("networked-scene", { - room: hub.hub_id, - serverURL: `wss://${hub.host}:${hub.port}`, - debug: !!isDebug, - adapter - }); + scene.setAttribute("networked-scene", { + room: hub.hub_id, + serverURL: `wss://${hub.host}:${hub.port}`, // TODO: This is confusing because this is the dialog host and port. + debug: !!isDebug, + adapter: "phoenix" + }); + (async () => { while (!scene.components["networked-scene"] || !scene.components["networked-scene"].data) await nextTick(); - scene.addEventListener("adapter-ready", ({ detail: adapter }) => { - const sendViaPhoenix = reliable => (clientId, dataType, data) => { - const payload = { dataType, data }; - - if (clientId) { - payload.clientId = clientId; - } - - const isOpen = hubChannel.channel.socket.connectionState() === "open"; - - if (isOpen || reliable) { - const hasFirstSync = - payload.dataType === "um" ? payload.data.d.find(r => r.isFirstSync) : payload.data.isFirstSync; - - if (hasFirstSync) { - if (isOpen) { - hubChannel.channel.push("naf", payload); - } else { - // Memory is re-used, so make a copy - hubChannel.channel.push("naf", AFRAME.utils.clone(payload)); - } - } else { - // Optimization: Strip isFirstSync and send payload as a string to reduce server parsing. - // The server will not parse messages without isFirstSync keys when sent to the nafr event. - // - // The client must assume any payload that does not have a isFirstSync key is not a first sync. - const nafrPayload = AFRAME.utils.clone(payload); - if (nafrPayload.dataType === "um") { - for (let i = 0; i < nafrPayload.data.d.length; i++) { - delete nafrPayload.data.d[i].isFirstSync; - } - } else { - delete nafrPayload.data.isFirstSync; - } - - hubChannel.channel.push("nafr", { naf: JSON.stringify(nafrPayload) }); - } - } - }; + const loadEnvironmentAndConnect = () => { + console.log("Loading environment and connecting to dialog servers"); - adapter.reliableTransport = sendViaPhoenix(true); - adapter.unreliableTransport = sendViaPhoenix(false); - }); + updateEnvironmentForHub(hub, entryManager); - const connect = () => { - // Safety guard just in case Protoo doens't fail in some case so we don't get stuck in the loading screen forever. - connectionErrorTimeout = setTimeout(onConnectionError, 30000, entryManager, "Timeout connecting to the room"); + // Disconnect in case this is a re-entry + APP.dialog.disconnect(); + APP.dialog.connect({ + serverUrl: `wss://${hub.host}:${hub.port}`, + roomId: hub.hub_id, + joinToken: permsToken, + serverParams: { host: hub.host, port: hub.port, turn: hub.turn }, + scene, + clientId: data.session_id, + forceTcp: qs.get("force_tcp"), + forceTurn: qs.get("force_turn"), + iceTransportPolicy: qs.get("force_tcp") || qs.get("force_turn") ? "relay" : "all" + }); + scene.addEventListener( + "adapter-ready", + ({ detail: adapter }) => { + adapter.hubChannel = hubChannel; + adapter.events = events; + adapter.session_id = data.session_id; + }, + { once: true } + ); scene.components["networked-scene"] .connect() .then(() => { - clearTimeout(connectionErrorTimeout); - connectionErrorTimeout = null; - console.log("Successfully connected to the networked scene."); scene.emit("didConnectToNetworkedScene"); }) .catch(connectError => { - clearTimeout(connectionErrorTimeout); - connectionErrorTimeout = null; - adapter.disconnect(); onConnectionError(entryManager, connectError); }); }; - const loadEnvironmentAndConnect = () => { - updateEnvironmentForHub(hub, entryManager); - connect(); - }; - window.APP.hub = hub; updateUIForHub(hub, hubChannel); scene.emit("hub_updated", { hub }); if (!isEmbed) { + console.log("Page is not embedded so environment initialization will start immediately"); loadEnvironmentAndConnect(); } else { + console.log("Page is embedded so environment initialization will be deferred"); remountUI({ onPreloadLoadClicked: () => { + console.log("Preload has been activated"); hubChannel.allowNAFTraffic(true); remountUI({ showPreload: false }); loadEnvironmentAndConnect(); } }); } - }; - - connectToScene(); + })(); } async function runBotMode(scene, entryManager) { + console.log("Running in bot mode..."); const noop = () => {}; const alwaysFalse = () => false; scene.renderer = { @@ -667,15 +687,6 @@ async function runBotMode(scene, entryManager) { entryManager.enterSceneWhenLoaded(false); } -function checkForAccountRequired() { - // If the app requires an account to join a room, redirect to the sign in page. - if (!configs.feature("require_account_for_join")) return; - if (store.state.credentials && store.state.credentials.token) return; - document.location = `/?sign_in&sign_in_destination=hub&sign_in_destination_url=${encodeURIComponent( - document.location.toString() - )}`; -} - document.addEventListener("DOMContentLoaded", async () => { if (isOAuthModal) { return; @@ -690,9 +701,11 @@ document.addEventListener("DOMContentLoaded", async () => { return; } + const detectedOS = detectOS(navigator.userAgent); + const browser = detect(); // HACK - it seems if we don't initialize the mic track up-front, voices can drop out on iOS // safari when initializing it later. - if (isSafari()) { + if (["iOS", "Mac OS"].includes(detectedOS) && ["safari", "ios"].includes(browser.name)) { try { await navigator.mediaDevices.getUserMedia({ audio: true }); } catch (e) { @@ -701,40 +714,26 @@ document.addEventListener("DOMContentLoaded", async () => { } } - const defaultRoomId = configs.feature("default_room_id"); - - const hubId = - qs.get("hub_id") || - (document.location.pathname === "/" && defaultRoomId - ? defaultRoomId - : document.location.pathname.substring(1).split("/")[0]); + const hubId = getCurrentHubId(); console.log(`Hub ID: ${hubId}`); - if (!defaultRoomId) { + const shouldRedirectToSignInPage = // Default room won't work if account is required to access - checkForAccountRequired(); + !configs.feature("default_room_id") && + configs.feature("require_account_for_join") && + !(store.state.credentials && store.state.credentials.token); + if (shouldRedirectToSignInPage) { + document.location = `/?sign_in&sign_in_destination=hub&sign_in_destination_url=${encodeURIComponent( + document.location.toString() + )}`; } const subscriptions = new Subscriptions(hubId); - - if (navigator.serviceWorker) { - try { - navigator.serviceWorker - .register("/hub.service.js") - .then(() => { - navigator.serviceWorker.ready - .then(registration => subscriptions.setRegistration(registration)) - .catch(() => subscriptions.setRegistrationFailed()); - }) - .catch(() => subscriptions.setRegistrationFailed()); - } catch (e) { - subscriptions.setRegistrationFailed(); - } - } else { - subscriptions.setRegistrationFailed(); - } + APP.subscriptions = subscriptions; + subscriptions.register(); const scene = document.querySelector("a-scene"); + window.APP.scene = scene; scene.renderer.debug.checkShaderErrors = false; // HACK - Trigger initial batch preparation with an invisible object @@ -745,9 +744,7 @@ document.addEventListener("DOMContentLoaded", async () => { const onSceneLoaded = () => { const physicsSystem = scene.systems["hubs-systems"].physicsSystem; physicsSystem.setDebug(isDebug || physicsSystem.debug); - patchThreeAllocations(); }; - if (scene.hasLoaded) { onSceneLoaded(); } else { @@ -762,12 +759,23 @@ document.addEventListener("DOMContentLoaded", async () => { const authChannel = new AuthChannel(store); const hubChannel = new HubChannel(store, hubId); + window.APP.hubChannel = hubChannel; + const entryManager = new SceneEntryManager(hubChannel, authChannel, history); + window.APP.entryManager = entryManager; + + APP.dialog.on(DIALOG_CONNECTION_CONNECTED, () => { + scene.emit("didConnectToDialog"); + }); + APP.dialog.on(DIALOG_CONNECTION_ERROR_FATAL, () => { + // TODO: Change the wording of the connect error to match dialog connection error + // TODO: Tell the user that dialog is broken, but don't completely end the experience + remountUI({ roomUnavailableReason: ExitReason.connectError }); + APP.entryManager.exitScene(); + }); - window.APP.scene = scene; const audioSystem = scene.systems["hubs-systems"].audioSystem; window.APP.mediaDevicesManager = new MediaDevicesManager(scene, store, audioSystem); - window.APP.hubChannel = hubChannel; const performConditionalSignIn = async (predicate, action, signInMessage, onFailure) => { if (predicate()) return action(); @@ -792,10 +800,19 @@ document.addEventListener("DOMContentLoaded", async () => { if (actionError && onFailure) onFailure(actionError); exit2DInterstitialAndEnterVR(); + }, + onSignInDialogVisibilityChanged: visible => { + if (visible) { + remountUI({ showSignInDialog: true }); + } else { + remountUI({ showSignInDialog: false, onContinueAfterSignIn: null }); + } } }); }; + window.APP.pinningHelper = new PinningHelper(hubChannel, authChannel, store, performConditionalSignIn); + window.addEventListener("action_create_avatar", () => { performConditionalSignIn( () => hubChannel.signedIn, @@ -838,7 +855,6 @@ document.addEventListener("DOMContentLoaded", async () => { return false; }; - remountUI({ availableVREntryTypes: ONLY_SCREEN_AVAILABLE, checkingForDeviceAvailability: true }); const availableVREntryTypesPromise = getAvailableVREntryTypes(); scene.addEventListener("enter-vr", () => { @@ -858,7 +874,6 @@ document.addEventListener("DOMContentLoaded", async () => { } }); }); - handleEarlyVRMode(); // HACK A-Frame 0.9.0 seems to fail to wire up vrdisplaypresentchange early enough @@ -920,13 +935,7 @@ document.addEventListener("DOMContentLoaded", async () => { exitScene: reason => { entryManager.exitScene(); remountUI({ roomUnavailableReason: reason || ExitReason.exited }); - }, - initialIsSubscribed: subscriptions.isSubscribed() - }); - - scene.addEventListener("action_focus_chat", () => { - const chatFocusTarget = document.querySelector(".chat-focus-target"); - chatFocusTarget && chatFocusTarget.focus(); + } }); scene.addEventListener("leave_room_requested", () => { @@ -999,19 +1008,20 @@ document.addEventListener("DOMContentLoaded", async () => { }); const environmentScene = document.querySelector("#environment-scene"); - - const onFirstEnvironmentLoad = () => { - // Replace renderer with a noop renderer to reduce bot resource usage. - if (isBotMode) { - runBotMode(scene, entryManager); - } - - environmentScene.removeEventListener("model-loaded", onFirstEnvironmentLoad); - }; - - environmentScene.addEventListener("model-loaded", onFirstEnvironmentLoad); + environmentScene.addEventListener( + "model-loaded", + () => { + // Replace renderer with a noop renderer to reduce bot resource usage. + if (isBotMode) { + runBotMode(scene, entryManager); + } + }, + { once: true } + ); environmentScene.addEventListener("model-loaded", ({ detail: { model } }) => { + console.log("Environment scene has loaded"); + if (!scene.is("entered")) { setupLobbyCamera(); } @@ -1047,10 +1057,12 @@ document.addEventListener("DOMContentLoaded", async () => { }); // Reticulum global channel - let retPhxChannel = socket.channel(`ret`, { hub_id: hubId }); - retPhxChannel + APP.retChannel = socket.channel(`ret`, { hub_id: hubId }); + APP.retChannel .join() - .receive("ok", async data => subscriptions.setVapidPublicKey(data.vapid_public_key)) + .receive("ok", data => { + subscriptions.setVapidPublicKey(data.vapid_public_key); + }) .receive("error", res => { subscriptions.setVapidPublicKey(null); console.error(res); @@ -1058,71 +1070,17 @@ document.addEventListener("DOMContentLoaded", async () => { const pushSubscriptionEndpoint = await subscriptions.getCurrentEndpoint(); - const oauthFlowPermsToken = Cookies.get(OAUTH_FLOW_PERMS_TOKEN_KEY); - - if (oauthFlowPermsToken) { - Cookies.remove(OAUTH_FLOW_PERMS_TOKEN_KEY); - } - - const createHubChannelParams = permsToken => { - const params = { + APP.hubChannelParamsForPermsToken = permsToken => { + return createHubChannelParams({ profile: store.state.profile, - push_subscription_endpoint: pushSubscriptionEndpoint, - auth_token: null, - perms_token: null, - context: { - mobile: isMobile || isMobileVR, - embed: isEmbed - }, - hub_invite_id: qs.get("hub_invite_id") - }; - - if (isMobileVR) { - params.context.hmd = true; - } - - if (permsToken) { - params.perms_token = permsToken; - } - - const { token } = store.state.credentials; - if (token) { - console.log(`Logged into account ${store.credentialsAccountId}`); - params.auth_token = token; - } - - return params; - }; - - const tryGetMatchingMeta = async ({ ret_pool, ret_version }, shouldAbandonMigration) => { - const backoffMS = 5000; - const randomMS = 15000; - const maxAttempts = 10; - let didMatchMeta = false; - let attempt = 0; - while (!didMatchMeta && attempt < maxAttempts && !shouldAbandonMigration()) { - try { - // Add randomness to the first request avoid flooding reticulum. - const delayMS = attempt * backoffMS + (attempt === 0 ? Math.random() * randomMS : 0); - console.log( - `[reconnect] Getting reticulum meta in ${Math.ceil(delayMS / 1000)} seconds.${ - attempt ? ` (Attempt ${attempt + 1} of ${maxAttempts})` : "" - }` - ); - await sleep(delayMS); - invalidateReticulumMeta(); - console.log( - `[reconnect] Getting reticulum meta.${attempt ? ` (Attempt ${attempt + 1} of ${maxAttempts})` : ""}` - ); - const { pool, version } = await getReticulumMeta(); - didMatchMeta = ret_pool === pool && ret_version === version; - } catch { - didMatchMeta = false; - } - - attempt = attempt + 1; - } - return didMatchMeta; + pushSubscriptionEndpoint, + permsToken, + isMobile, + isMobileVR, + isEmbed, + hubInviteId: qs.get("hub_invite_id"), + authToken: store.state.credentials && store.state.credentials.token + }); }; const migrateToNewReticulumServer = async ({ ret_version, ret_pool }, shouldAbandonMigration) => { @@ -1135,10 +1093,10 @@ document.addEventListener("DOMContentLoaded", async () => { } console.log("[reconnect] Reconnect in progress. Updated reticulum meta."); - const oldSocket = retPhxChannel.socket; + const oldSocket = APP.retChannel.socket; const socket = await connectToReticulum(isDebug, oldSocket.params()); - retPhxChannel = await migrateChannelToSocket(retPhxChannel, socket); - await hubChannel.migrateToSocket(socket, createHubChannelParams()); + APP.retChannel = await migrateChannelToSocket(APP.retChannel, socket); + await hubChannel.migrateToSocket(socket, APP.hubChannelParamsForPermsToken()); authChannel.setSocket(socket); linkChannel.setSocket(socket); @@ -1181,47 +1139,107 @@ document.addEventListener("DOMContentLoaded", async () => { }; })(); - retPhxChannel.on("notice", data => { + APP.retChannel.on("notice", data => { if (data.event === "ret-deploy") { onRetDeploy(data); } }); - const hubPhxChannel = socket.channel(`hub:${hubId}`, createHubChannelParams(oauthFlowPermsToken)); + const messageDispatch = new MessageDispatch(scene, entryManager, hubChannel, remountUI, mediaSearchStore); + APP.messageDispatch = messageDispatch; + document.getElementById("avatar-rig").messageDispatch = messageDispatch; - const presenceLogEntries = []; - const addToPresenceLog = entry => { - entry.key = Date.now().toString(); + const oauthFlowPermsToken = Cookies.get(OAUTH_FLOW_PERMS_TOKEN_KEY); + if (oauthFlowPermsToken) { + Cookies.remove(OAUTH_FLOW_PERMS_TOKEN_KEY); + } + const hubPhxChannel = socket.channel(`hub:${hubId}`, APP.hubChannelParamsForPermsToken(oauthFlowPermsToken)); + hubChannel.channel = hubPhxChannel; + hubChannel.presence = new Presence(hubPhxChannel); + const { rawOnJoin, rawOnLeave } = denoisePresence(presenceEventsForHub(events)); + hubChannel.presence.onJoin(rawOnJoin); + hubChannel.presence.onLeave(rawOnLeave); + hubChannel.presence.onSync(() => { + events.trigger(`hub:sync`, { presence: hubChannel.presence }); + }); - presenceLogEntries.push(entry); - remountUI({ presenceLogEntries }); - if (entry.type === "chat" && scene.is("loaded")) { - scene.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_CHAT_MESSAGE); + events.on(`hub:join`, ({ key, meta }) => { + scene.emit("presence_updated", { + sessionId: key, + profile: meta.profile, + roles: meta.roles, + permissions: meta.permissions, + streaming: meta.streaming, + recording: meta.recording + }); + }); + events.on(`hub:join`, ({ key, meta }) => { + if ( + APP.hideHubPresenceEvents || + key === hubChannel.channel.socket.params().session_id || + hubChannel.presence.list().length > NOISY_OCCUPANT_COUNT + ) { + return; } + messageDispatch.receive({ + type: "join", + presence: meta.presence, + name: meta.profile.displayName + }); + }); - // Fade out and then remove - setTimeout(() => { - entry.expired = true; - remountUI({ presenceLogEntries }); - - setTimeout(() => { - presenceLogEntries.splice(presenceLogEntries.indexOf(entry), 1); - remountUI({ presenceLogEntries }); - }, 5000); - }, 20000); - }; + events.on(`hub:leave`, ({ meta }) => { + if (APP.hideHubPresenceEvents || hubChannel.presence.list().length > NOISY_OCCUPANT_COUNT) { + return; + } + messageDispatch.receive({ + type: "leave", + name: meta.profile.displayName + }); + }); - const messageDispatch = new MessageDispatch( - scene, - entryManager, - hubChannel, - addToPresenceLog, - remountUI, - mediaSearchStore - ); - document.getElementById("avatar-rig").messageDispatch = messageDispatch; + events.on(`hub:change`, ({ key, previous, current }) => { + if ( + previous.presence === current.presence || + current.presence !== "room" || + key === hubChannel.channel.socket.params().session_id + ) { + return; + } - let isInitialJoin = true; + messageDispatch.receive({ + type: "entered", + presence: current.presence, + name: current.profile.displayName + }); + }); + events.on(`hub:change`, ({ previous, current }) => { + if (previous.profile.displayName !== current.profile.displayName) { + messageDispatch.receive({ + type: "display_name_changed", + oldName: previous.profile.displayName, + newName: current.profile.displayName + }); + } + }); + events.on(`hub:change`, ({ key, previous, current }) => { + if ( + key === hubChannel.channel.socket.params().session_id && + previous.profile.avatarId !== current.profile.avatarId + ) { + messageDispatch.log(LogMessageType.avatarChanged); + } + }); + events.on(`hub:change`, ({ key, current }) => { + scene.emit("presence_updated", { + sessionId: key, + profile: current.profile, + roles: current.roles, + permissions: current.permissions, + streaming: current.streaming, + recording: current.recording + }); + }); // We need to be able to wait for initial presence syncs across reconnects and socket migrations, // so we create this object in the outer scope and assign it a new promise on channel join. @@ -1229,202 +1247,48 @@ document.addEventListener("DOMContentLoaded", async () => { promise: null, resolve: null }; - - hubChannel.setPhoenixChannel(hubPhxChannel); + events.on("hub:sync", () => { + presenceSync.resolve(); + }); + events.on(`hub:sync`, () => { + APP.hideHubPresenceEvents = false; + }); + events.on(`hub:sync`, updateVRHudPresenceCount); + events.on(`hub:sync`, ({ presence }) => { + updateSceneCopresentState(presence, scene); + }); + events.on(`hub:sync`, ({ presence }) => { + remountUI({ + sessionId: socket.params().session_id, + presences: presence.state, + entryDisallowed: !hubChannel.canEnterRoom(uiProps.hub) + }); + }); hubPhxChannel .join() .receive("ok", async data => { - socket.params().session_id = data.session_id; - socket.params().session_token = data.session_token; - - const vrHudPresenceCount = document.querySelector("#hud-presence-count"); - + APP.hideHubPresenceEvents = true; presenceSync.promise = new Promise(resolve => { presenceSync.resolve = resolve; }); - if (isInitialJoin) { - store.addEventListener("profilechanged", hubChannel.sendProfileUpdate.bind(hubChannel)); - - const requestedOccupants = []; - - const requestOccupants = async (sessionIds, state) => { - requestedOccupants.length = 0; - for (let i = 0; i < sessionIds.length; i++) { - const sessionId = sessionIds[i]; - if (sessionId !== NAF.clientId && state[sessionId].metas[0].presence === "room") { - requestedOccupants.push(sessionId); - } - } - - while (!NAF.connection.isConnected()) await nextTick(); - NAF.connection.adapter.syncOccupants(requestedOccupants); - }; - - hubChannel.presence.onSync(() => { - const presence = hubChannel.presence; - - remountUI({ - sessionId: socket.params().session_id, - presences: presence.state, - entryDisallowed: !hubChannel.canEnterRoom(uiProps.hub) - }); - - const sessionIds = Object.getOwnPropertyNames(presence.state); - const occupantCount = sessionIds.length; - vrHudPresenceCount.setAttribute("text", "value", occupantCount.toString()); - - if (occupantCount > 1) { - scene.addState("copresent"); - } else { - scene.removeState("copresent"); - } - - requestOccupants(sessionIds, presence.state); - - // HACK - Set a flag on the presence object indicating if the initial sync has completed, - // which is used to determine if we should fire join/leave messages into the presence log. - // This flag is required since we reuse these onJoin and onLeave handler functions on - // socket migrations. - presence.__hadInitialSync = true; - - presenceSync.resolve(); - - presence.onJoin((sessionId, current, info) => { - // Ignore presence join/leaves if this Presence has not yet had its initial sync (o/w the user - // will see join messages for every user.) - if (!hubChannel.presence.__hadInitialSync) return; - - const meta = info.metas[info.metas.length - 1]; - const occupantCount = Object.entries(hubChannel.presence.state).length; - - if (occupantCount <= NOISY_OCCUPANT_COUNT) { - if (current) { - // Change to existing presence - const isSelf = sessionId === socket.params().session_id; - const currentMeta = current.metas[0]; - - if ( - !isSelf && - currentMeta.presence !== meta.presence && - meta.presence === "room" && - meta.profile.displayName - ) { - messageDispatch.receive({ - type: "entered", - presence: meta.presence, - name: meta.profile.displayName - }); - } - - if ( - currentMeta.profile && - meta.profile && - currentMeta.profile.displayName !== meta.profile.displayName - ) { - messageDispatch.receive({ - type: "display_name_changed", - oldName: currentMeta.profile.displayName, - newName: meta.profile.displayName - }); - } - } else if (info.metas.length === 1) { - // New presence - const meta = info.metas[0]; - - if (meta.presence && meta.profile.displayName) { - messageDispatch.receive({ - type: "join", - presence: meta.presence, - name: meta.profile.displayName - }); - } - } - } - - scene.emit("presence_updated", { - sessionId, - profile: meta.profile, - roles: meta.roles, - permissions: meta.permissions, - streaming: meta.streaming, - recording: meta.recording - }); - }); - - presence.onLeave((sessionId, current, info) => { - // Ignore presence join/leaves if this Presence has not yet had its initial sync - if (!hubChannel.presence.__hadInitialSync) return; - - if (current && current.metas.length > 0) return; - const occupantCount = Object.entries(hubChannel.presence.state).length; - if (occupantCount > NOISY_OCCUPANT_COUNT) return; - - const meta = info.metas[0]; - - if (meta.profile.displayName) { - messageDispatch.receive({ - type: "leave", - name: meta.profile.displayName - }); - } - }); - }); - } - - isInitialJoin = false; + socket.params().session_id = data.session_id; + socket.params().session_token = data.session_token; const permsToken = oauthFlowPermsToken || data.perms_token; hubChannel.setPermissionsFromToken(permsToken); - scene.addEventListener("adapter-ready", async ({ detail: adapter }) => { - adapter.setClientId(socket.params().session_id); - adapter.setJoinToken(data.perms_token); - adapter.setServerParams(await window.APP.hubChannel.getHost()); - adapter.setReconnectionListeners( - async () => { - const { host, port } = await hubChannel.getHost(); - const newServerURL = `wss://${host}:${port}`; - // If the Dialog server url has changed, the server has rolled over and we need to reconnect using an updated server URL. - if (adapter.serverUrl !== newServerURL) { - console.error(`The Dialog server has changed to ${newServerURL}, reconnecting with the new server...`); - scene.setAttribute("networked-scene", { serverURL: newServerURL }); - adapter.setServerUrl(newServerURL); - adapter.setServerParams(await window.APP.hubChannel.getHost()); - adapter.reconnect(); - } - // Safety guard to show the connection error screen in case we can't reconnect after 30 seconds - if (!connectionErrorTimeout) { - connectionErrorTimeout = setTimeout(() => { - adapter.disconnect(); - onConnectionError(entryManager, "Timeout trying to reconnect to the room"); - }, 30000); - } - }, - () => { - clearTimeout(connectionErrorTimeout); - connectionErrorTimeout = null; - } - ); - - setupPeerConnectionConfig(adapter); - - hubChannel.addEventListener("permissions-refreshed", e => adapter.setJoinToken(e.detail.permsToken)); - }); - subscriptions.setHubChannel(hubChannel); subscriptions.setSubscribed(data.subscriptions.web_push); remountUI({ hubIsBound: data.hub_requires_oauth, - initialIsFavorited: data.subscriptions.favorites, - initialIsSubscribed: subscriptions.isSubscribed() + initialIsFavorited: data.subscriptions.favorites }); await presenceSync.promise; - - handleHubChannelJoined(entryManager, hubChannel, messageDispatch, data); + handleHubChannelJoined(entryManager, hubChannel, messageDispatch, data, permsToken, hubChannel, events); }) .receive("error", res => { if (res.reason === "closed") { @@ -1441,20 +1305,6 @@ document.addEventListener("DOMContentLoaded", async () => { console.error(res); }); - const handleIncomingNAF = data => { - if (!NAF.connection.adapter) return; - - NAF.connection.adapter.onData(authorizeOrSanitizeMessage(data), PHOENIX_RELIABLE_NAF); - }; - - hubPhxChannel.on("naf", data => handleIncomingNAF(data)); - hubPhxChannel.on("nafr", ({ from_session_id, naf: unparsedData }) => { - // Server optimization: server passes through unparsed NAF message, we must now parse it. - const data = JSON.parse(unparsedData); - data.from_session_id = from_session_id; - handleIncomingNAF(data); - }); - hubPhxChannel.on("message", ({ session_id, type, body, from }) => { const getAuthor = () => { const userInfo = hubChannel.presence.state[session_id]; @@ -1547,8 +1397,8 @@ document.addEventListener("DOMContentLoaded", async () => { hubPhxChannel.on("permissions_updated", () => hubChannel.fetchPermissions()); hubPhxChannel.on("mute", ({ session_id }) => { - if (session_id === NAF.clientId && !scene.is("muted")) { - scene.emit("action_mute"); + if (session_id === NAF.clientId) { + APP.dialog.enableMicrophone(false); } }); diff --git a/src/link.js b/src/link.js index efe88f010f..6e4eb009c4 100644 --- a/src/link.js +++ b/src/link.js @@ -1,4 +1,3 @@ -import "./webxr-bypass-hacks"; import "./utils/theme"; import "./utils/configs"; import "./react-components/styles/global.scss"; diff --git a/src/loaders/HubsTextureLoader.js b/src/loaders/HubsTextureLoader.js index f293f6e636..b94c7460d2 100644 --- a/src/loaders/HubsTextureLoader.js +++ b/src/loaders/HubsTextureLoader.js @@ -1,47 +1,20 @@ -function loadAsync(loader, url, onProgress) { - return new Promise((resolve, reject) => loader.load(url, resolve, onProgress, reject)); -} - -const HAS_IMAGE_BITMAP = window.createImageBitmap !== undefined; +// Disable ImageBitmap for Firefox so far because +// createImageBitmap() with option fails on Firefox due to the bug. +// Three.js ImageBitmapLoader passes {colorSpaceConversion: 'none'} option. +// Without the option, the rendering result can be wrong if image file has ICC profiles. +// See https://github.com/mrdoob/three.js/pull/21336 +const HAS_IMAGE_BITMAP = window.createImageBitmap !== undefined && /Firefox/.test(navigator.userAgent) === false; export const TEXTURES_FLIP_Y = !HAS_IMAGE_BITMAP; -export default class HubsTextureLoader { - constructor(manager = THREE.DefaultLoadingManager) { - this.manager = manager; - this.crossOrigin = "anonymous"; +export default class HubsTextureLoader extends THREE.TextureLoader { + constructor(manager) { + super(manager); } load(url, onLoad, onProgress, onError) { - const texture = new THREE.Texture(); - - this.loadTextureAsync(texture, url, onProgress) - .then(onLoad) - .catch(onError); - - return texture; - } - - async loadTextureAsync(texture, src, onProgress) { - let imageLoader; - - if (HAS_IMAGE_BITMAP) { - imageLoader = new THREE.ImageBitmapLoader(this.manager); - texture.flipY = false; - } else { - imageLoader = new THREE.ImageLoader(this.manager); - } - - imageLoader.setCrossOrigin(this.crossOrigin); - imageLoader.setPath(this.path); - - const resolvedUrl = this.manager.resolveURL(src); - - texture.image = await loadAsync(imageLoader, resolvedUrl, onProgress); - - // Image was just added to cache before this function gets called, disable caching by immediatly removing it - THREE.Cache.remove(resolvedUrl); - - texture.needsUpdate = true; + const texture = HAS_IMAGE_BITMAP + ? this.loadImageBitmapTexture(url, onLoad, onProgress, onError) + : super.load(url, onLoad, onProgress, onError); texture.onUpdate = function() { // Delete texture data once it has been uploaded to the GPU @@ -52,13 +25,39 @@ export default class HubsTextureLoader { return texture; } - setCrossOrigin(value) { - this.crossOrigin = value; - return this; + async loadAsync(url, onProgress) { + return new Promise((resolve, reject) => { + this.load(url, resolve, onProgress, reject); + }); } - setPath(value) { - this.path = value; - return this; + loadImageBitmapTexture(url, onLoad, onProgress, onError) { + const texture = new THREE.Texture(); + const loader = new THREE.ImageBitmapLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + loader.setPath(this.path); + + loader.load( + url, + bitmap => { + texture.image = bitmap; + texture.needsUpdate = true; + + // We close the image bitmap when it's uploaded to texture. + // Closed image bitmap can't be reused so we remove the cache + // added in ImageBitmapLoader. + // You can remove this line once we entirely disable THREE.Cache. + THREE.Cache.remove(this.manager.resolveURL(url)); + + if (onLoad !== undefined) { + onLoad(texture); + } + }, + onProgress, + onError + ); + + texture.flipY = false; + return texture; } } diff --git a/src/message-dispatch.js b/src/message-dispatch.js index 1da3bc008e..68ae5fa558 100644 --- a/src/message-dispatch.js +++ b/src/message-dispatch.js @@ -2,7 +2,7 @@ import "./utils/configs"; import { getAbsoluteHref } from "./utils/media-url-utils"; import { isValidSceneUrl } from "./utils/scene-url-utils"; import { spawnChatMessage } from "./react-components/chat-message"; -import { SOUND_QUACK, SOUND_SPECIAL_QUACK } from "./systems/sound-effects-system"; +import { SOUND_CHAT_MESSAGE, SOUND_QUACK, SOUND_SPECIAL_QUACK } from "./systems/sound-effects-system"; import ducky from "./assets/models/DuckyMesh.glb"; import { EventTarget } from "event-target-shim"; import { ExitReason } from "./react-components/room/ExitedRoomScreen"; @@ -11,14 +11,35 @@ import { LogMessageType } from "./react-components/room/ChatSidebar"; let uiRoot; // Handles user-entered messages export default class MessageDispatch extends EventTarget { - constructor(scene, entryManager, hubChannel, addToPresenceLog, remountUI, mediaSearchStore) { + constructor(scene, entryManager, hubChannel, remountUI, mediaSearchStore) { super(); this.scene = scene; this.entryManager = entryManager; this.hubChannel = hubChannel; - this.addToPresenceLog = addToPresenceLog; this.remountUI = remountUI; this.mediaSearchStore = mediaSearchStore; + this.presenceLogEntries = []; + } + + addToPresenceLog(entry) { + entry.key = Date.now().toString(); + + this.presenceLogEntries.push(entry); + this.remountUI({ presenceLogEntries: this.presenceLogEntries }); + if (entry.type === "chat" && this.scene.is("loaded")) { + this.scene.systems["hubs-systems"].soundEffectsSystem.playSoundOneShot(SOUND_CHAT_MESSAGE); + } + + // Fade out and then remove + setTimeout(() => { + entry.expired = true; + this.remountUI({ presenceLogEntries: this.presenceLogEntries }); + + setTimeout(() => { + this.presenceLogEntries.splice(this.presenceLogEntries.indexOf(entry), 1); + this.remountUI({ presenceLogEntries: this.presenceLogEntries }); + }, 5000); + }, 20000); } receive(message) { @@ -45,6 +66,8 @@ export default class MessageDispatch extends EventTarget { uiRoot = uiRoot || document.getElementById("ui-root"); const isGhost = !entered && uiRoot && uiRoot.firstChild && uiRoot.firstChild.classList.contains("isGhost"); + // TODO: Some of the commands below should be available without requiring + // room entry. For example, audiomode should not require room entry. if (!entered && (!isGhost || command === "duck")) { this.log(LogMessageType.roomEntryRequired); return; @@ -153,8 +176,15 @@ export default class MessageDispatch extends EventTarget { { const shouldEnablePositionalAudio = window.APP.store.state.preferences.audioOutputMode === "audio"; window.APP.store.update({ + // TODO: This should probably just be a boolean to disable panner node settings + // and even if it's not, "audio" is a weird name for the "audioOutputMode" that means + // "stereo" / "not panner". preferences: { audioOutputMode: shouldEnablePositionalAudio ? "panner" : "audio" } }); + // TODO: The user message here is a little suspicious. We might be ignoring the + // user preference (e.g. if panner nodes are broken in safari, then we never create + // panner nodes, regardless of user preference.) + // Warning: This comment may be out of date when you read it. this.log( shouldEnablePositionalAudio ? LogMessageType.positionalAudioEnabled : LogMessageType.positionalAudioDisabled ); diff --git a/src/naf-dialog-adapter.js b/src/naf-dialog-adapter.js index ddb01a7b3b..cb4a610ad0 100644 --- a/src/naf-dialog-adapter.js +++ b/src/naf-dialog-adapter.js @@ -3,10 +3,6 @@ import protooClient from "protoo-client"; import { debug as newDebug } from "debug"; import EventEmitter from "eventemitter3"; -// NOTE this adapter does not properly fire the onOccupantsReceived events since those are only needed for -// data channels, which are not yet supported. To fire that event, this class would need to keep a list of -// occupants around and manage it. -// // Used for VP9 webcam video. //const VIDEO_KSVC_ENCODINGS = [{ scalabilityMode: "S3T3_KEY" }]; @@ -40,36 +36,27 @@ const WEBCAM_SIMULCAST_ENCODINGS = [ // Used for simulcast screen sharing. const SCREEN_SHARING_SIMULCAST_ENCODINGS = [{ dtx: true, maxBitrate: 1500000 }, { dtx: true, maxBitrate: 6000000 }]; -export default class DialogAdapter extends EventEmitter { +export const DIALOG_CONNECTION_CONNECTED = "dialog-connection-connected"; +export const DIALOG_CONNECTION_ERROR_FATAL = "dialog-connection-error-fatal"; + +export class DialogAdapter extends EventEmitter { constructor() { super(); - this._timeOffsets = []; - this._occupants = {}; + this._micShouldBeEnabled = false; this._micProducer = null; this._cameraProducer = null; this._shareProducer = null; - this._mediaStreams = {}; this._localMediaStream = null; this._consumers = new Map(); - this._frozenUpdates = new Map(); this._pendingMediaRequests = new Map(); - this._micEnabled = true; - this._initialAudioConsumerPromise = null; - this._initialAudioConsumerResolvers = new Map(); - this._serverTimeRequests = 0; - this._avgTimeOffset = 0; this._blockedClients = new Map(); - this.type = "dialog"; - this.occupants = {}; // This is a public field this._forceTcp = false; this._forceTurn = false; - this._iceTransportPolicy = "all"; - this._closed = true; - this.scene = document.querySelector("a-scene"); + this._iceTransportPolicy = null; + this.scene = null; this._serverParams = {}; this._consumerStats = {}; - this._isReconnect = false; } get consumerStats() { @@ -80,31 +67,6 @@ export default class DialogAdapter extends EventEmitter { return this._downlinkBwe; } - get serverUrl() { - return this._serverUrl; - } - - setServerUrl(url) { - this._serverUrl = url; - } - - setJoinToken(joinToken) { - this._joinToken = joinToken; - } - - setTurnConfig(forceTcp, forceTurn) { - this._forceTcp = forceTcp; - this._forceTurn = forceTurn; - - if (this._forceTurn || this._forceTcp) { - this._iceTransportPolicy = "relay"; - } - } - - setServerParams(params) { - this._serverParams = params; - } - getIceServers(host, port, turn) { const iceServers = []; @@ -135,36 +97,11 @@ export default class DialogAdapter extends EventEmitter { return iceServers; } - setApp() {} - - setRoom(roomId) { - this._roomId = roomId; - } - - setClientId(clientId) { - this._clientId = clientId; - } - - setServerConnectListeners(successListener, failureListener) { - this._connectSuccess = successListener; - this._connectFailure = failureListener; - } - - setRoomOccupantListener(occupantListener) { - this._onOccupantsChanged = occupantListener; - } - - setDataChannelListeners(openListener, closedListener, messageListener) { - this._onOccupantConnected = openListener; - this._onOccupantDisconnected = closedListener; - this._onOccupantMessage = messageListener; - } - /** * Gets transport/consumer/producer stats on the server side. */ async getServerStats() { - if (this.getConnectStatus() === NAF.adapters.NOT_CONNECTED) { + if (!this._protoo.connected) { // Signaling channel not connected, no reason to get remote RTC stats. return; } @@ -227,8 +164,8 @@ export default class DialogAdapter extends EventEmitter { * Restart ICE in the underlying send peerconnection. */ async restartSendICE() { - // Do not restart ICE if Signaling is disconnected. We are not in the meeting room if that's the case. - if (this._closed) { + // Do not restart ICE if Signaling is disconnected. + if (!this._protoo || !this._protoo.connected) { return; } @@ -262,7 +199,7 @@ export default class DialogAdapter extends EventEmitter { this.emitRTCEvent("log", "RTC", () => `Recreating receive transport ICE`); await this.closeRecvTransport(); await this.createRecvTransport(iceServers); - await this.createMissingConsumers(); + await this._protoo.request("refreshConsumers"); } /** @@ -270,8 +207,7 @@ export default class DialogAdapter extends EventEmitter { * @param {boolean} force Forces the execution of the reconnect. */ async restartRecvICE() { - // Do not restart ICE if Signaling is disconnected. We are not in the meeting room if that's the case. - if (this._closed) { + if (!this._protoo || !this._protoo.connected) { return; } @@ -301,52 +237,52 @@ export default class DialogAdapter extends EventEmitter { } } - async connect() { + async connect({ + serverUrl, + roomId, + joinToken, + serverParams, + scene, + clientId, + forceTcp, + forceTurn, + iceTransportPolicy + }) { + this._serverUrl = serverUrl; + this._roomId = roomId; + this._joinToken = joinToken; + this._serverParams = serverParams; + this._clientId = clientId; + this.scene = scene; + this._forceTcp = forceTcp; + this._forceTurn = forceTurn; + this._iceTransportPolicy = iceTransportPolicy; + const urlWithParams = new URL(this._serverUrl); urlWithParams.searchParams.append("roomId", this._roomId); urlWithParams.searchParams.append("peerId", this._clientId); - const protooTransport = new protooClient.WebSocketTransport(urlWithParams.toString()); + // TODO: Establishing connection could take a very long time. + // Inform the user if we are stuck here. + const protooTransport = new protooClient.WebSocketTransport(urlWithParams.toString(), { + retry: { retries: 2 } + }); this._protoo = new protooClient.Peer(protooTransport); this._protoo.on("disconnected", () => { this.emitRTCEvent("info", "Signaling", () => `Disconnected`); - this.disconnect(); + this.cleanUpLocalState(); }); this._protoo.on("failed", attempt => { this.emitRTCEvent("error", "Signaling", () => `Failed: ${attempt}, retrying...`); - - if (this._isReconnect) { - this._reconnectingListener && this._reconnectingListener(); - } }); - this._protoo.on("close", () => { + this._protoo.on("close", async () => { + // We explicitly disconnect event handlers when closing the socket ourselves, + // so if we get into here, we were not the ones closing the connection. this.emitRTCEvent("error", "Signaling", () => `Closed`); - this.disconnect(); - }); - - await new Promise((resolve, reject) => { - this._protoo.on("open", async () => { - this.emitRTCEvent("info", "Signaling", () => `Open`); - this._closed = false; - - // We only need to call the reconnect callbacks if it's a reconnection. - if (this._isReconnect) { - this._reconnectedListener && this._reconnectedListener(); - } else { - this._isReconnect = true; - } - - try { - await this._joinRoom(); - resolve(); - } catch (err) { - this.emitRTCEvent("warn", "Adapter", () => `Error during connect: ${error}`); - reject(err); - } - }); + this._retryConnectWithNewHost(); }); // eslint-disable-next-line no-unused-vars @@ -398,15 +334,6 @@ export default class DialogAdapter extends EventEmitter { this.resolvePendingMediaRequestForTrack(peerId, consumer.track); - if (kind === "audio") { - const initialAudioResolver = this._initialAudioConsumerResolvers.get(peerId); - - if (initialAudioResolver) { - initialAudioResolver(); - this._initialAudioConsumerResolvers.delete(peerId); - } - } - // Notify of an stream update event this.emit("stream_updated", peerId, kind); } catch (err) { @@ -426,9 +353,6 @@ export default class DialogAdapter extends EventEmitter { switch (notification.method) { case "newPeer": { - const peer = notification.data; - this.newPeer(peer); - break; } @@ -510,21 +434,49 @@ export default class DialogAdapter extends EventEmitter { } }); - await Promise.all([this.updateTimeOffset(), this._initialAudioConsumerPromise]); - } + return new Promise((resolve, reject) => { + this._protoo.on("open", async () => { + this.emitRTCEvent("info", "Signaling", () => `Open`); - newPeer(peer) { - this._onOccupantConnected(peer.id); - this.occupants[peer.id] = peer; + try { + await this._joinRoom(); + resolve(); + this.emit(DIALOG_CONNECTION_CONNECTED); + } catch (err) { + this.emitRTCEvent("warn", "Adapter", () => `Error during connect: ${error}`); + reject(err); + this.emit(DIALOG_CONNECTION_ERROR_FATAL); + } + }); + }); + } - if (this._onOccupantsChanged) { - this._onOccupantsChanged(this.occupants); + async _retryConnectWithNewHost() { + this.cleanUpLocalState(); + this._protoo.removeAllListeners(); + const serverParams = await APP.hubChannel.getHost(); + const { host, port } = serverParams; + const newServerUrl = `wss://${host}:${port}`; + if (this._serverUrl === newServerUrl) { + console.error("Reconnect to dialog failed."); + this.emit(DIALOG_CONNECTION_ERROR_FATAL); + return; } + console.log(`The Dialog server has changed to ${newServerUrl}, reconnecting with the new server...`); + await this.connect({ + serverUrl: newServerUrl, + roomId: this._roomId, + joinToken: APP.hubChannel.token, + serverParams, + scene: this.scene, + clientId: this._clientId, + forceTcp: this._forceTcp, + forceTurn: this._forceTurn, + iceTransportPolicy: this._iceTransportPolicy + }); } closePeer(peerId) { - this._onOccupantDisconnected(peerId); - const pendingMediaRequests = this._pendingMediaRequests.get(peerId); if (pendingMediaRequests) { @@ -541,31 +493,8 @@ export default class DialogAdapter extends EventEmitter { this._pendingMediaRequests.delete(peerId); } - - // Resolve initial audio resolver since this person left. - const initialAudioResolver = this._initialAudioConsumerResolvers.get(peerId); - - if (initialAudioResolver) { - initialAudioResolver(); - - this._initialAudioConsumerResolvers.delete(peerId); - } - - delete this.occupants[peerId]; - - if (this._onOccupantsChanged) { - this._onOccupantsChanged(this.occupants); - } } - shouldStartConnectionTo() { - return true; - } - - startStreamConnection() {} - - closeStreamConnection() {} - resolvePendingMediaRequestForTrack(clientId, track) { const requests = this._pendingMediaRequests.get(clientId); @@ -585,10 +514,6 @@ export default class DialogAdapter extends EventEmitter { this._consumers.delete(consumerId); } - getConnectStatus(/*clientId*/) { - return this._protoo.connected ? NAF.adapters.IS_CONNECTED : NAF.adapters.NOT_CONNECTED; - } - getMediaStream(clientId, kind = "audio") { let track; @@ -630,32 +555,6 @@ export default class DialogAdapter extends EventEmitter { } } - getServerTime() { - return Date.now() + this._avgTimeOffset; - } - - sendData(clientId, dataType, data) { - this.unreliableTransport(clientId, dataType, data); - } - sendDataGuaranteed(clientId, dataType, data) { - this.reliableTransport(clientId, dataType, data); - } - broadcastData(dataType, data) { - this.unreliableTransport(undefined, dataType, data); - } - broadcastDataGuaranteed(dataType, data) { - this.reliableTransport(undefined, dataType, data); - } - - setReconnectionListeners(reconnectingListener, reconnectedListener) { - this._reconnectingListener = reconnectingListener; - this._reconnectedListener = reconnectedListener; - } - - syncOccupants() { - // Not implemented - } - async createSendTransport(iceServers) { // Create mediasoup Transport for sending (unless we don't want to produce). const sendTransportInfo = await this._protoo.request("createWebRtcTransport", { @@ -683,7 +582,6 @@ export default class DialogAdapter extends EventEmitter { this.emitRTCEvent("info", "RTC", () => `Send transport [connect]`); this._sendTransport.observer.on("close", () => { this.emitRTCEvent("info", "RTC", () => `Send transport [close]`); - !this._sendTransport?._closed && this._sendTransport.close(); }); this._sendTransport.observer.on("newproducer", producer => { this.emitRTCEvent("info", "RTC", () => `Send transport [newproducer]: ${producer.id}`); @@ -728,10 +626,6 @@ export default class DialogAdapter extends EventEmitter { errback(error); } }); - - if (this._localMediaStream) { - this.createMissingProducers(this._localMediaStream); - } } async closeSendTransport() { @@ -747,13 +641,16 @@ export default class DialogAdapter extends EventEmitter { this._videoProducer = null; } + // TODO: If _sendTransport is falsey then return + const transportId = this._sendTransport?.id; if (this._sendTransport && !this._sendTransport._closed) { this._sendTransport.close(); + this._sendTransport = null; } if (this._protoo?.connected) { try { - await this._protoo.request("closeWebRtcTransport", { transportId: this._sendTransport?.id }); + await this._protoo.request("closeWebRtcTransport", { transportId }); } catch (err) { error(err); } @@ -786,7 +683,6 @@ export default class DialogAdapter extends EventEmitter { this.emitRTCEvent("info", "RTC", () => `Receive transport [connect]`); this._recvTransport.observer.on("close", () => { this.emitRTCEvent("info", "RTC", () => `Receive transport [close]`); - !this._recvTransport?._closed && this._recvTransport.close(); }); this._recvTransport.observer.on("newproducer", producer => { this.emitRTCEvent("info", "RTC", () => `Receive transport [newproducer]: ${producer.id}`); @@ -816,22 +712,20 @@ export default class DialogAdapter extends EventEmitter { } async closeRecvTransport() { + const transportId = this._recvTransport?.id; if (this._recvTransport && !this._recvTransport._closed) { this._recvTransport.close(); + this._recvTransport = null; } if (this._protoo?.connected) { try { - await this._protoo.request("closeWebRtcTransport", { transportId: this._recvTransport?.id }); + await this._protoo.request("closeWebRtcTransport", { transportId }); } catch (err) { error(err); } } } - async createMissingConsumers() { - await this._protoo.request("refreshConsumers"); - } - async _joinRoom() { debug("_joinRoom()"); @@ -847,7 +741,7 @@ export default class DialogAdapter extends EventEmitter { await this.createSendTransport(iceServers); await this.createRecvTransport(iceServers); - const { peers } = await this._protoo.request("join", { + await this._protoo.request("join", { displayName: this._clientId, device: this._device, rtpCapabilities: this._mediasoupDevice.rtpCapabilities, @@ -855,105 +749,76 @@ export default class DialogAdapter extends EventEmitter { token: this._joinToken }); - const audioConsumerPromises = []; - this.occupants = {}; - - // Create a promise that will be resolved once we attach to all the initial consumers. - // This will gate the connection flow until all voices will be heard. - for (let i = 0; i < peers.length; i++) { - const peerId = peers[i].id; - this._onOccupantConnected(peerId); - this.occupants[peerId] = peers[i]; - if (!peers[i].hasProducers) continue; - audioConsumerPromises.push(new Promise(res => this._initialAudioConsumerResolvers.set(peerId, res))); - } - - this._connectSuccess(this._clientId); - this._initialAudioConsumerPromise = Promise.all(audioConsumerPromises); - - if (this._onOccupantsChanged) { - this._onOccupantsChanged(this.occupants); + if (this._localMediaStream) { + // TODO: Refactor to be "Create producers" + await this.setLocalMediaStream(this._localMediaStream); } } - setLocalMediaStream(stream) { - this.createMissingProducers(stream); - } - - createMissingProducers(stream) { + async setLocalMediaStream(stream) { + if (!this._sendTransport) { + console.error("Tried to setLocalMediaStream before a _sendTransport existed"); + return; + } this.emitRTCEvent("info", "RTC", () => `Creating missing producers`); - - if (!this._sendTransport) return; let sawAudio = false; let sawVideo = false; - stream.getTracks().forEach(async track => { - if (track.kind === "audio") { - sawAudio = true; + await Promise.all( + stream.getTracks().map(async track => { + if (track.kind === "audio") { + sawAudio = true; - // TODO multiple audio tracks? - if (this._micProducer) { - if (this._micProducer.track !== track) { - this._micProducer.track.stop(); - this._micProducer.replaceTrack(track); + // TODO multiple audio tracks? + if (this._micProducer) { + if (this._micProducer.track !== track) { + this._micProducer.track.stop(); + this._micProducer.replaceTrack(track); + } + } else { + // stopTracks = false because otherwise the track will end during a temporary disconnect + this._micProducer = await this._sendTransport.produce({ + paused: !this._micShouldBeEnabled, + track, + stopTracks: false, + codecOptions: { opusStereo: false, opusDtx: true }, + zeroRtpOnPause: true, + disableTrackOnPause: true + }); + + this._micProducer.on("transportclose", () => { + this.emitRTCEvent("info", "RTC", () => `Mic transport closed`); + this._micProducer = null; + }); } } else { - if (!this._micEnabled) { - track.enabled = false; + sawVideo = true; + + if (track._hubs_contentHint === "share") { + await this.disableCamera(); + await this.enableShare(track); + } else if (track._hubs_contentHint === "camera") { + await this.disableShare(); + await this.enableCamera(track); } - - await this.enabledMic(track); - - if (!this._micEnabled) { - this._micProducer.pause(); - this._protoo.request("pauseProducer", { producerId: this._micProducer.id }); - } - } - } else { - sawVideo = true; - - if (track._hubs_contentHint === "share") { - await this.disableCamera(); - await this.enableShare(track); - } else if (track._hubs_contentHint === "camera") { - await this.disableShare(); - await this.enableCamera(track); } - } - this.resolvePendingMediaRequestForTrack(this._clientId, track); - }); + this.resolvePendingMediaRequestForTrack(this._clientId, track); + }) + ); if (!sawAudio && this._micProducer) { - this._micProducer.close(); this._protoo.request("closeProducer", { producerId: this._micProducer.id }); + this._micProducer.close(); this._micProducer = null; } - if (!sawVideo) { this.disableCamera(); this.disableShare(); } - this._localMediaStream = stream; } - async enabledMic(track) { - // stopTracks = false because otherwise the track will end during a temporary disconnect - this._micProducer = await this._sendTransport.produce({ - track, - stopTracks: false, - codecOptions: { opusStereo: false, opusDtx: true }, - zeroRtpOnPause: true, - disableTrackOnPause: true - }); - - this._micProducer.on("transportclose", () => { - this.emitRTCEvent("info", "RTC", () => `Mic transport closed`); - this._micProducer = null; - }); - } - async enableCamera(track) { // stopTracks = false because otherwise the track will end during a temporary disconnect this._cameraProducer = await this._sendTransport.produce({ @@ -1031,82 +896,63 @@ export default class DialogAdapter extends EventEmitter { this._shareProducer = null; } - enableMicrophone(enabled) { - if (this._micProducer) { - if (enabled) { - this._micProducer.resume(); - this._protoo.request("resumeProducer", { producerId: this._micProducer.id }); - } else { - this._micProducer.pause(); - this._protoo.request("pauseProducer", { producerId: this._micProducer.id }); - } + toggleMicrophone() { + if (this.isMicEnabled) { + this.enableMicrophone(false); + } else { + this.enableMicrophone(true); } + } - this._micEnabled = enabled; + enableMicrophone(enabled) { + if (!this._micProducer) { + console.error("Tried to toggle mic but there's no producer."); + return; + } - window.APP.store.update({ - settings: { micMuted: !this._micEnabled } - }); + if (enabled && !this.isMicEnabled) { + this._micProducer.resume(); + this._protoo.request("resumeProducer", { producerId: this._micProducer.id }); + } else if (!enabled && this.isMicEnabled) { + this._micProducer.pause(); + this._protoo.request("pauseProducer", { producerId: this._micProducer.id }); + } + this._micShouldBeEnabled = enabled; + this.emit("mic-state-changed", { enabled: this.isMicEnabled }); } - setWebRtcOptions() { - // Not implemented + get isMicEnabled() { + return this._micProducer && !this._micProducer.paused; } - isDisconnected() { - return !this._protoo.connected; + cleanUpLocalState() { + this._sendTransport && this._sendTransport.close(); + this._sendTransport = null; + this._recvTransport && this._recvTransport.close(); + this._recvTransport = null; + this._micProducer = null; + this._shareProducer = null; + this._cameraProducer = null; } disconnect() { - if (this._closed) return; - - this._closed = true; - - const occupantIds = Object.keys(this.occupants); - for (let i = 0; i < occupantIds.length; i++) { - const peerId = occupantIds[i]; - if (peerId === this._clientId) continue; - this._onOccupantDisconnected(peerId); - } - - this.occupants = {}; - - if (this._onOccupantsChanged) { - this._onOccupantsChanged(this.occupants); - } - debug("disconnect()"); - - // Close mediasoup Transports. - this.closeSendTransport(); - this.closeRecvTransport(); - - // Close protoo Peer, though may already be closed if this is happening due to websocket breakdown - if (this._protoo && this._protoo.connected) { - this._protoo.close(); - this.emitRTCEvent("info", "Signaling", () => `[close]`); - } - } - - reconnect(timeout = 2000) { - // The Protoo WebSocketTransport server url cannot be updated after it's been created so we need to orce a diconnect/connect - // to make sure we are using the updated server url for the WSS if it has changed. - this.disconnect(); + this.cleanUpLocalState(); if (this._protoo) { this._protoo.removeAllListeners(); - this._protoo.close(); + if (this._protoo.connected) { + this._protoo.close(); + this.emitRTCEvent("info", "Signaling", () => `[close]`); + } } - setTimeout(() => { - this.connect(); - }, timeout); } - kick(clientId, permsToken) { + kick(clientId) { return this._protoo .request("kick", { room_id: this.room, user_id: clientId, - token: permsToken + token: this._joinToken }) .then(() => { document.body.dispatchEvent(new CustomEvent("kicked", { detail: { clientId: clientId } })); @@ -1127,171 +973,6 @@ export default class DialogAdapter extends EventEmitter { }); } - async updateTimeOffset() { - if (this.isDisconnected()) return; - - const clientSentTime = Date.now(); - - const res = await fetch(document.location.href, { - method: "HEAD", - cache: "no-cache" - }); - - const precision = 1000; - const serverReceivedTime = new Date(res.headers.get("Date")).getTime() + precision / 2; - const clientReceivedTime = Date.now(); - const serverTime = serverReceivedTime + (clientReceivedTime - clientSentTime) / 2; - const timeOffset = serverTime - clientReceivedTime; - - this._serverTimeRequests++; - - if (this._serverTimeRequests <= 10) { - this._timeOffsets.push(timeOffset); - } else { - this._timeOffsets[this._serverTimeRequests % 10] = timeOffset; - } - - this._avgTimeOffset = this._timeOffsets.reduce((acc, offset) => (acc += offset), 0) / this._timeOffsets.length; - - if (this._serverTimeRequests > 10) { - debug(`new server time offset: ${this._avgTimeOffset}ms`); - setTimeout(() => this.updateTimeOffset(), 5 * 60 * 1000); // Sync clock every 5 minutes. - } else { - this.updateTimeOffset(); - } - } - - toggleFreeze() { - if (this.frozen) { - this.unfreeze(); - } else { - this.freeze(); - } - } - - freeze() { - this.frozen = true; - } - - unfreeze() { - this.frozen = false; - this.flushPendingUpdates(); - } - - storeMessage(message) { - if (message.dataType === "um") { - // UpdateMulti - for (let i = 0, l = message.data.d.length; i < l; i++) { - this.storeSingleMessage(message, i); - } - } else { - this.storeSingleMessage(message); - } - } - - storeSingleMessage(message, index) { - const data = index !== undefined ? message.data.d[index] : message.data; - const dataType = message.dataType; - - const networkId = data.networkId; - - if (!this._frozenUpdates.has(networkId)) { - this._frozenUpdates.set(networkId, message); - } else { - const storedMessage = this._frozenUpdates.get(networkId); - const storedData = - storedMessage.dataType === "um" ? this.dataForUpdateMultiMessage(networkId, storedMessage) : storedMessage.data; - - // Avoid updating components if the entity data received did not come from the current owner. - const isOutdatedMessage = data.lastOwnerTime < storedData.lastOwnerTime; - const isContemporaneousMessage = data.lastOwnerTime === storedData.lastOwnerTime; - if (isOutdatedMessage || (isContemporaneousMessage && storedData.owner > data.owner)) { - return; - } - - if (dataType === "r") { - const createdWhileFrozen = storedData && storedData.isFirstSync; - if (createdWhileFrozen) { - // If the entity was created and deleted while frozen, don't bother conveying anything to the consumer. - this._frozenUpdates.delete(networkId); - } else { - // Delete messages override any other messages for this entity - this._frozenUpdates.set(networkId, message); - } - } else { - // merge in component updates - if (storedData.components && data.components) { - Object.assign(storedData.components, data.components); - } - } - } - } - - onDataChannelMessage(e, source) { - this.onData(JSON.parse(e.data), source); - } - - onData(message, source) { - if (debug.enabled) { - debug(`DC in: ${message}`); - } - - if (!message.dataType) return; - - message.source = source; - - if (this.frozen) { - this.storeMessage(message); - } else { - this._onOccupantMessage(null, message.dataType, message.data, message.source); - } - } - - getPendingData(networkId, message) { - if (!message) return null; - - const data = message.dataType === "um" ? this.dataForUpdateMultiMessage(networkId, message) : message.data; - - // Ignore messages from users that we may have blocked while frozen. - if (data.owner && this._blockedClients.has(data.owner)) return null; - - return data; - } - - // Used externally - getPendingDataForNetworkId(networkId) { - return this.getPendingData(networkId, this._frozenUpdates.get(networkId)); - } - - flushPendingUpdates() { - for (const [networkId, message] of this._frozenUpdates) { - const data = this.getPendingData(networkId, message); - if (!data) continue; - - // Override the data type on "um" messages types, since we extract entity updates from "um" messages into - // individual frozenUpdates in storeSingleMessage. - const dataType = message.dataType === "um" ? "u" : message.dataType; - - this._onOccupantMessage(null, dataType, data, message.source); - } - this._frozenUpdates.clear(); - } - - dataForUpdateMultiMessage(networkId, message) { - // "d" is an array of entity datas, where each item in the array represents a unique entity and contains - // metadata for the entity, and an array of components that have been updated on the entity. - // This method finds the data corresponding to the given networkId. - for (let i = 0, l = message.data.d.length; i < l; i++) { - const data = message.data.d[i]; - - if (data.networkId === networkId) { - return data; - } - } - - return null; - } - emitRTCEvent(level, tag, msgFunc) { if (!window.APP.store.state.preferences.showRtcDebugPanel) return; const time = new Date().toLocaleTimeString("en-US", { @@ -1303,5 +984,3 @@ export default class DialogAdapter extends EventEmitter { this.scene.emit("rtc_event", { level, tag, time, msg: msgFunc() }); } } - -NAF.adapters.register("dialog", DialogAdapter); diff --git a/src/phoenix-adapter.js b/src/phoenix-adapter.js new file mode 100644 index 0000000000..e655335d7f --- /dev/null +++ b/src/phoenix-adapter.js @@ -0,0 +1,257 @@ +import { transportForChannel } from "./transport-for-channel"; +import { authorizeOrSanitizeMessage } from "./utils/permissions-utils"; + +// TODO: Use the websocket connection, not HEAD requests +const getTimeOffsetToServer = async () => { + const precision = 1000; + const clientSentTime = Date.now(); + const serverReceivedTime = + new Date( + (await fetch(document.location.href, { + method: "HEAD", + cache: "no-cache" + })).headers.get("Date") + ).getTime() + + precision / 2; + const clientReceivedTime = Date.now(); + const serverTime = serverReceivedTime + (clientReceivedTime - clientSentTime) / 2; + const offset = serverTime - clientReceivedTime; + return offset; +}; + +const getAverageTimeOffset = (() => { + let average = 0; + const numOffsetsToGather = 10; + const offsets = []; + let n = 0; + + const update = async () => { + offsets[n % numOffsetsToGather] = await getTimeOffsetToServer(); + n = n + 1; + average = offsets.reduce((acc, offset) => (acc += offset), 0) / offsets.length; + if (offsets.length == numOffsetsToGather) { + setTimeout(update, 5 * 60 * 1000); + } else { + update(); + } + }; + + update(); + + return () => { + return average; + }; +})(); + +export default class PhoenixAdapter { + constructor() { + this.refs = new Map(); + // TODO: Frozen messages can be handled outside this class. + this.frozenUpdates = new Map(); + this._blockedClients = new Map(); + } + setServerUrl() {} + setApp() {} + setRoom() {} + setWebRtcOptions() {} + setServerConnectListeners(nafConnectSuccess, nafConnectFailed) { + this.nafConnectSuccess = nafConnectSuccess; + this.nafConnectFailed = nafConnectFailed; + } + setRoomOccupantListener() {} + setDataChannelListeners(nafOccupantJoined, nafOccupantLeave, nafMessageReceived) { + this.nafOccupantJoined = nafOccupantJoined; + this.nafOccupantLeave = nafOccupantLeave; + this.nafMessageReceived = nafMessageReceived; + } + async connect() { + this.refs.set("naf", this.hubChannel.channel.on("naf", this.handleIncomingNAF)); + this.refs.set("nafr", this.hubChannel.channel.on("nafr", this.handleIncomingNAFR)); + + this.nafConnectSuccess(this.session_id); + this.reliableTransport = transportForChannel(this.hubChannel.channel, true); + this.unreliableTransport = transportForChannel(this.hubChannel.channel, false); + + this.hubChannel.presence.list(key => key).forEach(this.nafOccupantJoined); + this.refs.set("hub:join", this.events.on(`hub:join`, ({ key }) => this.nafOccupantJoined(key))); + this.refs.set("hub:leave", this.events.on(`hub:leave`, ({ key }) => this.nafOccupantLeave(key))); + } + shouldStartConnectionTo() {} + startStreamConnection() {} + closeStreamConnection() {} + getConnectStatus() {} + + getMediaStream() { + return Promise.reject("getMediaStream not implemented in phoenix-adapter"); + } + + getServerTime() { + return Date.now() + getAverageTimeOffset(); + } + + sendData(clientId, dataType, data) { + this.unreliableTransport(clientId, dataType, data); + } + sendDataGuaranteed(clientId, dataType, data) { + this.reliableTransport(clientId, dataType, data); + } + broadcastData(dataType, data) { + this.unreliableTransport(undefined, dataType, data); + } + broadcastDataGuaranteed(dataType, data) { + this.reliableTransport(undefined, dataType, data); + } + + disconnect() { + this.hubChannel.presence.list(key => key).forEach(this.nafOccupantLeave); + this.hubChannel.channel.off("naf", this.refs.get("naf")); + this.hubChannel.channel.off("nafr", this.refs.get("nafr")); + this.events.off("hub:join", this.refs.get("hub:join")); + this.events.off("hub:leave", this.refs.get("hub:leave")); + this.refs.delete("naf"); + this.refs.delete("nafr"); + this.refs.delete("hub:join"); + this.refs.delete("hub:leave"); + } + + toggleFreeze() { + if (this.frozen) { + this.unfreeze(); + } else { + this.freeze(); + } + } + + freeze() { + this.frozen = true; + } + + unfreeze() { + this.frozen = false; + this.flushPendingUpdates(); + } + + flushPendingUpdates() { + for (const [networkId, message] of this.frozenUpdates) { + const data = this.getPendingData(networkId, message); + if (!data) continue; + + // Override the data type on "um" messages types, since we extract entity updates from "um" messages into + // individual frozenUpdates in storeSingleMessage. + const dataType = message.dataType === "um" ? "u" : message.dataType; + + this.nafMessageReceived(null, dataType, data, message.source); + } + this.frozenUpdates.clear(); + } + + getPendingData(networkId, message) { + if (!message) return null; + + const data = message.dataType === "um" ? this.dataForUpdateMultiMessage(networkId, message) : message.data; + + // Ignore messages from users that we may have blocked while frozen. + if (data.owner && this._blockedClients.has(data.owner)) return null; + + return data; + } + + // Used externally + getPendingDataForNetworkId(networkId) { + return this.getPendingData(networkId, this.frozenUpdates.get(networkId)); + } + + handleIncomingNAF = data => { + const message = authorizeOrSanitizeMessage(data); + const source = "phx-reliable"; + if (!message.dataType) return; + + message.source = source; + + //TODO: Handle frozen + if (this.frozen) { + this.storeMessage(message); + } else { + this.nafMessageReceived(null, message.dataType, message.data, message.source); + } + }; + handleIncomingNAFR = ({ from_session_id, naf: unparsedData }) => { + // Server optimization: server passes through unparsed NAF message, we must now parse it. + const data = JSON.parse(unparsedData); + data.from_session_id = from_session_id; + this.handleIncomingNAF(data); + }; + + storeMessage(message) { + if (message.dataType === "um") { + // UpdateMulti + for (let i = 0, l = message.data.d.length; i < l; i++) { + this.storeSingleMessage(message, i); + } + } else { + this.storeSingleMessage(message); + } + } + + storeSingleMessage(message, index) { + const data = index !== undefined ? message.data.d[index] : message.data; + const dataType = message.dataType; + + const networkId = data.networkId; + + if (!this.frozenUpdates.has(networkId)) { + this.frozenUpdates.set(networkId, message); + } else { + const storedMessage = this.frozenUpdates.get(networkId); + const storedData = + storedMessage.dataType === "um" ? this.dataForUpdateMultiMessage(networkId, storedMessage) : storedMessage.data; + + // Avoid updating components if the entity data received did not come from the current owner. + const isOutdatedMessage = data.lastOwnerTime < storedData.lastOwnerTime; + const isContemporaneousMessage = data.lastOwnerTime === storedData.lastOwnerTime; + if (isOutdatedMessage || (isContemporaneousMessage && storedData.owner > data.owner)) { + return; + } + + if (dataType === "r") { + const createdWhileFrozen = storedData && storedData.isFirstSync; + if (createdWhileFrozen) { + // If the entity was created and deleted while frozen, don't bother conveying anything to the consumer. + this.frozenUpdates.delete(networkId); + } else { + // Delete messages override any other messages for this entity + this.frozenUpdates.set(networkId, message); + } + } else { + // merge in component updates + if (storedData.components && data.components) { + Object.assign(storedData.components, data.components); + } + } + } + } + dataForUpdateMultiMessage(networkId, message) { + // "d" is an array of entity datas, where each item in the array represents a unique entity and contains + // metadata for the entity, and an array of components that have been updated on the entity. + // This method finds the data corresponding to the given networkId. + for (let i = 0, l = message.data.d.length; i < l; i++) { + const data = message.data.d[i]; + + if (data.networkId === networkId) { + return data; + } + } + + return null; + } + + block(clientId) { + this._blockedClients.set(clientId, true); + } + + unblock(clientId) { + this._blockedClients.delete(clientId); + } +} + +NAF.adapters.register("phoenix", PhoenixAdapter); diff --git a/src/react-components/auth/AuthContext.js b/src/react-components/auth/AuthContext.js index e5344e785f..8129536ace 100644 --- a/src/react-components/auth/AuthContext.js +++ b/src/react-components/auth/AuthContext.js @@ -46,6 +46,28 @@ async function checkIsAdmin(socket, store) { return isAdmin; } +const noop = () => {}; + +export function StorybookAuthContextProvider({ children }) { + const [context] = useState({ + initialized: true, + isSignedIn: true, + isAdmin: true, + token: "abc123", + email: "foo@bar.baz", + userId: "00000000", + signIn: noop, + verify: noop, + signOut: noop + }); + return <AuthContext.Provider value={context}>{children}</AuthContext.Provider>; +} + +StorybookAuthContextProvider.propTypes = { + children: PropTypes.node, + store: PropTypes.object.isRequired +}; + export function AuthContextProvider({ children, store }) { const signIn = useCallback( async email => { @@ -80,7 +102,7 @@ export function AuthContextProvider({ children, store }) { const [context, setContext] = useState({ initialized: false, - isSignedIn: !!store.state.credentials && store.state.credentials.token, + isSignedIn: !!store.state.credentials && !!store.state.credentials.token, isAdmin: configs.isAdmin(), email: store.state.credentials && store.state.credentials.email, userId: store.credentialsAccountId, @@ -95,7 +117,7 @@ export function AuthContextProvider({ children, store }) { const onStoreChanged = () => { setContext(state => ({ ...state, - isSignedIn: !!store.state.credentials && store.state.credentials.token, + isSignedIn: !!store.state.credentials && !!store.state.credentials.token, isAdmin: configs.isAdmin(), email: store.state.credentials && store.state.credentials.email, userId: store.credentialsAccountId diff --git a/src/react-components/avatar-preview.js b/src/react-components/avatar-preview.js index 4adcc712cb..70be505760 100644 --- a/src/react-components/avatar-preview.js +++ b/src/react-components/avatar-preview.js @@ -1,8 +1,13 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import { injectIntl, FormattedMessage } from "react-intl"; +import { getColorSchemePref } from "../utils/get-color-scheme-pref"; import classNames from "classnames"; -import "three/examples/js/controls/OrbitControls"; + +// It seems we need to use require to import modules +// under the three/examples/js to avoid tree shaking +// in webpack production mode. +require("three/examples/js/controls/OrbitControls"); import { createDefaultEnvironmentMap } from "../components/environment-map"; import { loadGLTF } from "../components/gltf-model-plus"; @@ -34,8 +39,7 @@ function createRenderer(canvas, alpha = false, useDevicePixelRatio = true) { }); const renderer = new THREE.WebGLRenderer({ alpha, canvas, context, forceWebVR: true }); - renderer.gammaOutput = true; - renderer.gammaFactor = 2.2; + renderer.outputEncoding = THREE.sRGBEncoding; renderer.physicallyCorrectLights = true; if (useDevicePixelRatio) { renderer.setPixelRatio(window.devicePixelRatio); @@ -60,6 +64,14 @@ function fitBoxInFrustum(camera, box, center, margin = DEFAULT_MARGIN) { camera.lookAt(center); } +function getThemeBackground() { + const currentTheme = APP?.store?.state?.preferences?.theme; + const themes = window.APP_CONFIG?.theme?.themes; + const currentThemeObject = themes?.find(t => t.id === currentTheme) || getColorSchemePref(); + const previewBackgroundColor = new THREE.Color(currentThemeObject?.variables["background3-color"] || 0xeaeaea); + return previewBackgroundColor; +} + class AvatarPreview extends Component { static propTypes = { avatarGltfUrl: PropTypes.string, @@ -109,7 +121,7 @@ class AvatarPreview extends Component { this.snapshotRenderer.setClearAlpha(0); this.previewRenderer = createRenderer(this.canvas); - this.previewRenderer.setClearColor(0xeaeaea); + this.previewRenderer.setClearColor(getThemeBackground()); this.previewRenderer.setAnimationLoop(() => { const dt = clock.getDelta(); this.mixer && this.mixer.update(dt); diff --git a/src/react-components/chat-message.js b/src/react-components/chat-message.js index d483b0d94b..e9de62640e 100644 --- a/src/react-components/chat-message.js +++ b/src/react-components/chat-message.js @@ -6,8 +6,10 @@ import classNames from "classnames"; import html2canvas from "html2canvas"; import { coerceToUrl } from "../utils/media-utils"; import { formatMessageBody } from "../utils/chat-message"; +import { createPlaneBufferGeometry } from "../utils/three-utils"; +import HubsTextureLoader from "../loaders/HubsTextureLoader"; -const textureLoader = new THREE.TextureLoader(); +const textureLoader = new HubsTextureLoader(); const CHAT_MESSAGE_TEXTURE_SIZE = 1024; @@ -130,7 +132,7 @@ export async function createInWorldLogMessage({ name, type, body }) { material.generateMipmaps = false; material.needsUpdate = true; - const geometry = new THREE.PlaneBufferGeometry(1, 1, 1, 1, texture.flipY); + const geometry = createPlaneBufferGeometry(1, 1, 1, 1, texture.flipY); const mesh = new THREE.Mesh(geometry, material); meshEntity.setObject3D("mesh", mesh); meshEntity.meshMaterial = material; diff --git a/src/react-components/debug-panel/AudioDebugPanel.js b/src/react-components/debug-panel/AudioDebugPanel.js new file mode 100644 index 0000000000..efce302da1 --- /dev/null +++ b/src/react-components/debug-panel/AudioDebugPanel.js @@ -0,0 +1,444 @@ +import React, { useCallback, useState, useEffect } from "react"; +import PropTypes from "prop-types"; +import { FormattedMessage } from "react-intl"; +import styles from "./AudioDebugPanel.scss"; +import { CollapsiblePanel } from ".//CollapsiblePanel"; +import classNames from "classnames"; +import { + CLIPPING_THRESHOLD_ENABLED, + CLIPPING_THRESHOLD_MIN, + CLIPPING_THRESHOLD_MAX, + CLIPPING_THRESHOLD_STEP, + CLIPPING_THRESHOLD_DEFAULT, + GLOBAL_VOLUME_MIN, + GLOBAL_VOLUME_MAX, + GLOBAL_VOLUME_STEP, + GLOBAL_VOLUME_DEFAULT +} from "../../react-components/preferences-screen"; +import { SelectInputField } from "../input/SelectInputField"; +import { DISTANCE_MODEL_OPTIONS, DistanceModelType, SourceType } from "../../components/audio-params"; +import { getCurrentAudioSettingsForSourceType, updateAudioSettings } from "../../update-audio-settings"; + +const ROLLOFF_MIN = 0.0; +const ROLLOFF_MAX = 20.0; +const ROLLOFF_STEP = 0.5; +const ROLLOFF_LIN_MIN = 0.0; +const ROLLOFF_LIN_MAX = 1.0; +const ROLLOFF_LIN_STEP = 0.01; +const DISTANCE_MIN = 1.0; +const DISTANCE_MAX = 100.0; +const DISTANCE_STEP = 1.0; +const ANGLE_MIN = 0.0; +const ANGLE_MAX = 360.0; +const ANGLE_STEP = 1.0; +const GAIN_MIN = 0.0; +const GAIN_MAX = 1.0; +const GAIN_STEP = 0.1; + +function SelectProperty({ defaultValue, options, onChange, children }) { + const [value, setValue] = useState(defaultValue); + return ( + <div className={classNames(styles.audioDebugRow)}> + <span style={{ flex: "none", padEnd: "10px" }}>{children}</span> + <SelectInputField + value={value} + options={options} + onChange={newValue => { + setValue(newValue); + onChange(newValue); + }} + /> + </div> + ); +} + +SelectProperty.propTypes = { + defaultValue: PropTypes.string, + options: PropTypes.array, + onChange: PropTypes.func, + children: PropTypes.node +}; + +function SliderProperty({ defaultValue, step, min, max, onChange, children }) { + return ( + <div className={classNames(styles.audioDebugRow)}> + <span style={{ flex: "none", padEnd: "10px" }}>{children}</span> + <input + type="range" + step={step} + min={min} + max={max} + value={defaultValue} + onChange={e => { + const parsedValue = parseFloat(e.target.value); + onChange(parsedValue); + }} + /> + <span className={classNames(styles.valueText)}>{defaultValue}</span> + </div> + ); +} + +SliderProperty.propTypes = { + defaultValue: PropTypes.number, + step: PropTypes.number, + min: PropTypes.number, + max: PropTypes.number, + onChange: PropTypes.func, + children: PropTypes.node +}; + +function getPrefs() { + const prefs = { + enableAudioClipping: APP.store.state.preferences.enableAudioClipping, + audioClippingThreshold: APP.store.state.preferences.audioClippingThreshold, + globalVoiceVolume: APP.store.state.preferences.globalVoiceVolume, + globalMediaVolume: APP.store.state.preferences.globalMediaVolume + }; + if (prefs.enableAudioClipping === undefined) prefs.enableAudioClipping = CLIPPING_THRESHOLD_ENABLED; + if (prefs.audioClippingThreshold === undefined) prefs.audioClippingThreshol = CLIPPING_THRESHOLD_DEFAULT; + if (prefs.globalVoiceVolume === undefined) prefs.globalVoiceVolume = GLOBAL_VOLUME_DEFAULT; + if (prefs.globalMediaVolume === undefined) prefs.globalMediaVolume = GLOBAL_VOLUME_DEFAULT; + return prefs; +} + +export function AudioDebugPanel({ isNarrow, collapsed, onCollapsed }) { + const [mediaSettings, setMediaSettings] = useState(getCurrentAudioSettingsForSourceType(SourceType.MEDIA_VIDEO)); + const [avatarSettings, setAvatarSettings] = useState( + getCurrentAudioSettingsForSourceType(SourceType.AVATAR_AUDIO_SOURCE) + ); + + const onSettingChange = (sourceType, newSetting) => { + const settings = Object.assign({}, APP.audioDebugPanelOverrides.get(sourceType), newSetting); + APP.audioDebugPanelOverrides.set(sourceType, settings); + if (sourceType === SourceType.MEDIA_VIDEO) { + setMediaSettings(getCurrentAudioSettingsForSourceType(SourceType.MEDIA_VIDEO)); + } else { + setAvatarSettings(getCurrentAudioSettingsForSourceType(SourceType.AVATAR_AUDIO_SOURCE)); + } + for (const [el, audio] of APP.audios.entries()) { + updateAudioSettings(el, audio); + } + }; + + const [preferences, setPreferences] = useState(getPrefs()); + const onPreferencesUpdated = useCallback( + () => { + setPreferences(getPrefs()); + }, + [setPreferences] + ); + useEffect( + () => { + onPreferencesUpdated(); + APP.store.addEventListener("statechanged", onPreferencesUpdated); + return () => { + APP.store.removeEventListener("statechanged", onPreferencesUpdated); + APP.audioDebugPanelOverrides.delete(SourceType.MEDIA_VIDEO); + APP.audioDebugPanelOverrides.delete(SourceType.AVATAR_AUDIO_SOURCE); + for (const [el, audio] of APP.audios.entries()) { + updateAudioSettings(el, audio); + } + }; + }, + [onPreferencesUpdated] + ); + + return ( + <div + className={classNames(styles.audioDebugContainer)} + style={{ + height: isNarrow && !collapsed && "80%", + maxHeight: isNarrow && !collapsed && "80%" + }} + > + <CollapsiblePanel + title={<FormattedMessage id="audio-debug-panel.audio-debug-title" defaultMessage="Audio Debug" />} + isRoot + border + collapsed={collapsed} + onCollapse={onCollapsed} + > + <CollapsiblePanel + title={<FormattedMessage id="audio-debug-panel.audio-debug-global-title" defaultMessage="Globals" />} + border + grow + > + <div style={{ display: "flex", alignItems: "center" }}> + <input + tabIndex="0" + type="checkbox" + checked={preferences.enableAudioClipping} + onChange={() => { + APP.store.update({ + preferences: { + enableAudioClipping: !preferences.enableAudioClipping + } + }); + }} + style={{ marginLeft: "10px" }} + /> + <SliderProperty + defaultValue={preferences.audioClippingThreshold} + step={CLIPPING_THRESHOLD_STEP} + min={CLIPPING_THRESHOLD_MIN} + max={CLIPPING_THRESHOLD_MAX} + onChange={value => { + APP.store.update({ + preferences: { + audioClippingThreshold: value + } + }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.global.clippingThreshold" defaultMessage="Clipping" /> + </p> + </SliderProperty> + </div> + <SliderProperty + defaultValue={preferences.globalVoiceVolume} + step={GLOBAL_VOLUME_STEP} + min={GLOBAL_VOLUME_MIN} + max={GLOBAL_VOLUME_MAX} + onChange={value => { + APP.store.update({ + preferences: { + globalVoiceVolume: value + } + }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.global.voiceVolume" defaultMessage="Voice Volume" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={preferences.globalMediaVolume} + step={GLOBAL_VOLUME_STEP} + min={GLOBAL_VOLUME_MIN} + max={GLOBAL_VOLUME_MAX} + onChange={value => { + APP.store.update({ + preferences: { + globalMediaVolume: value + } + }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.global.mediaVolume" defaultMessage="Media Volume" /> + </p> + </SliderProperty> + </CollapsiblePanel> + <div style={{ display: "flex" }}> + <CollapsiblePanel + title={<FormattedMessage id="audio-debug-panel.audio-debug-avatar-title" defaultMessage="Avatar" />} + border + grow + > + <SelectProperty + defaultValue={avatarSettings.distanceModel} + options={DISTANCE_MODEL_OPTIONS} + onChange={value => { + const newSetting = { distanceModel: value }; + if (value === DistanceModelType.Linear && avatarSettings.rolloffFactor > 1.0) { + newSetting.rolloffFactor = 1.0; + } + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, newSetting); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.distanceModel" defaultMessage="Distance Model" /> + </p> + </SelectProperty> + <SliderProperty + defaultValue={avatarSettings.rolloffFactor} + step={avatarSettings.distanceModel === DistanceModelType.Linear ? ROLLOFF_LIN_STEP : ROLLOFF_STEP} + min={avatarSettings.distanceModel === DistanceModelType.Linear ? ROLLOFF_LIN_MIN : ROLLOFF_MIN} + max={avatarSettings.distanceModel === DistanceModelType.Linear ? ROLLOFF_LIN_MAX : ROLLOFF_MAX} + onChange={value => { + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, { rolloffFactor: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.rolloffFactor" defaultMessage="Rolloff" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={avatarSettings.refDistance} + step={DISTANCE_STEP} + min={DISTANCE_MIN} + max={DISTANCE_MAX} + onChange={value => { + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, { refDistance: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.refDistance" defaultMessage="Ref Distance" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={avatarSettings.maxDistance} + step={DISTANCE_STEP} + min={DISTANCE_MIN} + max={DISTANCE_MAX} + onChange={value => { + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, { maxDistance: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.maxDistance" defaultMessage="Max Distance" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={avatarSettings.coneInnerAngle} + step={ANGLE_STEP} + min={ANGLE_MIN} + max={ANGLE_MAX} + onChange={value => { + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, { coneInnerAngle: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.innerAngle" defaultMessage="Inner Angle" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={avatarSettings.coneOuterAngle} + step={ANGLE_STEP} + min={ANGLE_MIN} + max={ANGLE_MAX} + onChange={value => { + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, { coneOuterAngle: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.outerAngle" defaultMessage="Outer Angle" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={avatarSettings.coneOuterGain} + step={GAIN_STEP} + min={GAIN_MIN} + max={GAIN_MAX} + onChange={value => { + onSettingChange(SourceType.AVATAR_AUDIO_SOURCE, { coneOuterGain: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.avatar.outerGain" defaultMessage="Outer Gain" /> + </p> + </SliderProperty> + </CollapsiblePanel> + <CollapsiblePanel + title={<FormattedMessage id="audio-debug-panel.audio-debug-media-title" defaultMessage="Media" />} + border + grow + > + <SelectProperty + defaultValue={mediaSettings.distanceModel} + options={DISTANCE_MODEL_OPTIONS} + onChange={value => { + const newSetting = { distanceModel: value }; + if (value === DistanceModelType.Linear && mediaSettings.rolloffFactor > 1.0) { + newSetting.rolloffFactor = 1.0; + } + onSettingChange(SourceType.MEDIA_VIDEO, newSetting); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.distanceModel" defaultMessage="Distance Model" /> + </p> + </SelectProperty> + <SliderProperty + defaultValue={mediaSettings.rolloffFactor} + step={mediaSettings.distanceModel === DistanceModelType.Linear ? ROLLOFF_LIN_STEP : ROLLOFF_STEP} + min={mediaSettings.distanceModel === DistanceModelType.Linear ? ROLLOFF_LIN_MIN : ROLLOFF_MIN} + max={mediaSettings.distanceModel === DistanceModelType.Linear ? ROLLOFF_LIN_MAX : ROLLOFF_MAX} + onChange={value => { + onSettingChange(SourceType.MEDIA_VIDEO, { rolloffFactor: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.rolloffFactor" defaultMessage="Rolloff" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={mediaSettings.refDistance} + step={DISTANCE_STEP} + min={DISTANCE_MIN} + max={DISTANCE_MAX} + onChange={value => { + onSettingChange(SourceType.MEDIA_VIDEO, { refDistance: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.refDistance" defaultMessage="Ref Distance" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={mediaSettings.maxDistance} + step={DISTANCE_STEP} + min={DISTANCE_MIN} + max={DISTANCE_MAX} + onChange={value => { + onSettingChange(SourceType.MEDIA_VIDEO, { maxDistance: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.maxDistance" defaultMessage="Max Distance" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={mediaSettings.coneInnerAngle} + step={ANGLE_STEP} + min={ANGLE_MIN} + max={ANGLE_MAX} + onChange={value => { + onSettingChange(SourceType.MEDIA_VIDEO, { coneInnerAngle: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.innerAngle" defaultMessage="Inner Angle" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={mediaSettings.coneOuterAngle} + step={ANGLE_STEP} + min={ANGLE_MIN} + max={ANGLE_MAX} + onChange={value => { + onSettingChange(SourceType.MEDIA_VIDEO, { coneOuterAngle: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.outerAngle" defaultMessage="Outer Angle" /> + </p> + </SliderProperty> + <SliderProperty + defaultValue={mediaSettings.coneOuterGain} + step={GAIN_STEP} + min={GAIN_MIN} + max={GAIN_MAX} + onChange={value => { + onSettingChange(SourceType.MEDIA_VIDEO, { coneOuterGain: value }); + }} + > + <p className={classNames(styles.propText)}> + <FormattedMessage id="audio-debug-view.media.outerGain" defaultMessage="Outer Gain" /> + </p> + </SliderProperty> + </CollapsiblePanel> + </div> + </CollapsiblePanel> + </div> + ); +} + +AudioDebugPanel.propTypes = { + isNarrow: PropTypes.bool, + collapsed: PropTypes.bool, + onCollapsed: PropTypes.func, + children: PropTypes.node +}; diff --git a/src/react-components/debug-panel/AudioDebugPanel.scss b/src/react-components/debug-panel/AudioDebugPanel.scss new file mode 100644 index 0000000000..3cc7fcd7f1 --- /dev/null +++ b/src/react-components/debug-panel/AudioDebugPanel.scss @@ -0,0 +1,46 @@ + +@use "../styles/theme.scss"; + +:local(.audio-debug-container) { + pointer-events: none; + width: 100%; + overflow-y: auto; + align-self: flex-start; + flex: 0 1 auto; + justify-content: center; + + @media(max-width: 500px) { + width: 100%; + align-self: baseline; + flex: 0 1 auto; + justify-content: left; + } +} + +:local(.audio-debug-row) { + display: flex; + align-items: center; + &>*{ + margin-right: 12px; + } + &>*:last-child { + margin-right: 0px; + } +} + +:local(.prop-text) { + color: theme.$white; + font-size: theme.$font-size-xs; + display: block; + margin: 0; + text-align: center; + overflow-wrap: break-word; + width: 80px +} + +:local(.value-text) { + font-size: theme.$font-size-xs; + margin: 0; + color: theme.$yellow; + width: 40px; +} \ No newline at end of file diff --git a/src/react-components/debug-panel/CollapsiblePanel.scss b/src/react-components/debug-panel/CollapsiblePanel.scss index 218ffe3957..7fa4ceccae 100644 --- a/src/react-components/debug-panel/CollapsiblePanel.scss +++ b/src/react-components/debug-panel/CollapsiblePanel.scss @@ -42,13 +42,14 @@ display: flex; align-items: stretch; justify-content: center; + pointer-events: auto; } :local(.collapsible-content-root) { @extend :local(.collapsible-content); flex-flow: column nowrap; overflow-y: auto; - justify-content: flex-start; + justify-content: space-evenly; } :local(.collapsible-content).collapsed { diff --git a/src/react-components/debug-panel/RtcDebugPanel.js b/src/react-components/debug-panel/RtcDebugPanel.js index a48a508d01..cb1c6fb9f9 100644 --- a/src/react-components/debug-panel/RtcDebugPanel.js +++ b/src/react-components/debug-panel/RtcDebugPanel.js @@ -6,6 +6,7 @@ import { CollapsiblePanel } from "./CollapsiblePanel.js"; import { Button } from "../input/Button.js"; import styles from "./RtcDebugPanel.scss"; import { FormattedMessage } from "react-intl"; +import { AudioDebugPanel } from "./AudioDebugPanel"; const isMobile = AFRAME.utils.device.isMobile(); @@ -220,7 +221,9 @@ export default class RtcDebugPanel extends Component { intl: PropTypes.object, presences: PropTypes.object, history: PropTypes.object, - sessionId: PropTypes.string + sessionId: PropTypes.string, + showRtcDebug: PropTypes.bool, + showAudioDebug: PropTypes.bool }; constructor() { @@ -228,7 +231,7 @@ export default class RtcDebugPanel extends Component { this.state = { log: [], - collapsed: { Local: false, Log: isMobile, Remote: true } + collapsed: { Local: false, Log: isMobile, Remote: true, Audio: true } }; } @@ -259,7 +262,7 @@ export default class RtcDebugPanel extends Component { getDeviceData() { let result = {}; - const device = NAF.connection.adapter._mediasoupDevice; + const device = APP.dialog._mediasoupDevice; if (device) { result["loaded"] = !device._closed ? true : false; result["codecs"] = device._recvRtpCapabilities?.codecs.map( @@ -267,7 +270,7 @@ export default class RtcDebugPanel extends Component { ); result = { ...result, - ...NAF.connection.adapter.downlinkBwe + ...APP.dialog.downlinkBwe }; } return result; @@ -311,9 +314,9 @@ export default class RtcDebugPanel extends Component { const result = {}; let transport; if (type === TransportType.SEND) { - transport = NAF.connection.adapter._sendTransport; + transport = APP.dialog._sendTransport; } else if (type === TransportType.RECEIVE) { - transport = NAF.connection.adapter._recvTransport; + transport = APP.dialog._recvTransport; } const opened = (transport && !transport._closed && true) || false; result["opened"] = opened; @@ -361,7 +364,7 @@ export default class RtcDebugPanel extends Component { result["name"] = profile ? profile.displayName : "N/A"; result["peerId"] = peer._appData.peerId; - const stats = NAF.connection.adapter.consumerStats[peer._id]; + const stats = APP.dialog.consumerStats[peer._id]; if (result["kind"] === "video" && stats) { result["spatialLayer"] = stats["spatialLayer"]; result["temporalLayer"] = stats["temporalLayer"]; @@ -382,11 +385,11 @@ export default class RtcDebugPanel extends Component { } getSignalingData() { - return { connected: !NAF.connection.adapter._closed }; + return { connected: APP.dialog._protoo && APP.dialog._protoo.connected }; } async getServerData() { - return await NAF.connection.adapter.getServerStats(); + return await APP.dialog.getServerStats(); } async getRtpStatsData(peer, type) { @@ -483,9 +486,9 @@ export default class RtcDebugPanel extends Component { // Populate graph, speed and stats data const statsData = {}; - if (NAF.connection.adapter._micProducer) { - const id = NAF.connection.adapter._micProducer.id; - const peer = NAF.connection.adapter._micProducer; + if (APP.dialog._micProducer) { + const id = APP.dialog._micProducer.id; + const peer = APP.dialog._micProducer; const speedData = this.getPeerSpeed(id, "bytesSent"); const rtpStatsData = await this.getRtpStatsData(peer, StatsType.OUTBOUND_RTP); const { lastStats, graphData } = this.getGraphData(id, rtpStatsData); @@ -495,9 +498,9 @@ export default class RtcDebugPanel extends Component { statsData[id]["last"] = lastStats; statsData[id]["rtpStats"] = rtpStatsData; } - if (NAF.connection.adapter._cameraProducer) { - const id = NAF.connection.adapter._cameraProducer.id; - const peer = NAF.connection.adapter._cameraProducer; + if (APP.dialog._cameraProducer) { + const id = APP.dialog._cameraProducer.id; + const peer = APP.dialog._cameraProducer; const speedData = this.getPeerSpeed(id, "bytesSent"); const rtpStatsData = await this.getRtpStatsData(peer, StatsType.OUTBOUND_RTP); const { lastStats, graphData } = this.getGraphData(id, rtpStatsData); @@ -507,9 +510,9 @@ export default class RtcDebugPanel extends Component { statsData[id]["last"] = lastStats; statsData[id]["rtpStats"] = rtpStatsData; } - if (NAF.connection.adapter._shareProducer) { - const id = NAF.connection.adapter._shareProducer.id; - const peer = NAF.connection.adapter._shareProducer; + if (APP.dialog._shareProducer) { + const id = APP.dialog._shareProducer.id; + const peer = APP.dialog._shareProducer; const speedData = this.getPeerSpeed(id, "bytesSent"); const rtpStatsData = await this.getRtpStatsData(peer, StatsType.OUTBOUND_RTP); const { lastStats, graphData } = this.getGraphData(id, rtpStatsData); @@ -519,7 +522,7 @@ export default class RtcDebugPanel extends Component { statsData[id]["last"] = lastStats; statsData[id]["rtpStats"] = rtpStatsData; } - for (const consumer of NAF.connection.adapter._consumers) { + for (const consumer of APP.dialog._consumers) { const id = consumer[0]; const peer = consumer[1]; const speedData = this.getPeerSpeed(id, "bytesReceived"); @@ -552,19 +555,29 @@ export default class RtcDebugPanel extends Component { } restartSendICE = () => { - NAF.connection.adapter.restartSendICE(); + APP.dialog.restartSendICE(); }; restartRecvICE = () => { - NAF.connection.adapter.restartRecvICE(); + APP.dialog.restartRecvICE(); }; connectSignaling = () => { - NAF.connection.adapter.connect(); + APP.dialog.connect({ + serverUrl: APP.dialog._serverUrl, + roomId: APP.dialog._roomId, + joinToken: APP.hubChannel.token, + serverParams: APP.dialog._serverParams, + scene: APP.dialog.scene, + clientId: APP.dialog._clientId, + forceTcp: APP.dialog._forceTcp, + forceTurn: APP.dialog._forceTurn, + iceTransportPolicy: APP.dialog._iceTransportPolicy + }); }; disconnectSignaling = () => { - NAF.connection.adapter.disconnect(); + APP.dialog.disconnect(); }; colorForLevel = level => { @@ -844,91 +857,103 @@ export default class RtcDebugPanel extends Component { maxHeight: isNarrow && !collapsed.Local && "80%" }} > - <CollapsiblePanel - title={<FormattedMessage id="rtc-debug-panel.local-panel-title" defaultMessage="Local" />} - isRoot - border - grow - collapsed={collapsed.Local} - onCollapse={this.onCollapse} - > - {deviceData && ( + {this.props.showRtcDebug && ( + <CollapsiblePanel + title={<FormattedMessage id="rtc-debug-panel.local-panel-title" defaultMessage="Local" />} + isRoot + border + grow + collapsed={collapsed.Local} + onCollapse={this.onCollapse} + > + {deviceData && ( + <CollapsiblePanel + title={<FormattedMessage id="rtc-debug-panel.device-panel-title" defaultMessage="Device" />} + border + url={`${MEDIASOUP_DOC_BASE_URL}#Device`} + data={deviceData} + /> + )} + {signalingData && ( + <SignalingPanel + data={signalingData} + onConnect={this.connectSignaling} + onDisconnect={this.disconnectSignaling} + /> + )} + <div style={{ display: "flex", flexFlow: "column" }}> + <TransportPanel + title={ + <FormattedMessage + id="rtc-debug-panel.send-transport-panel-title" + defaultMessage="Send Transport" + /> + } + data={{ + id: transportsData?.[TransportType.SEND]?.id, + opened: transportsData?.[TransportType.SEND]?.opened, + state: transportsData?.[TransportType.SEND]?.state + }} + candidates={this.createCandidates(transportsData?.[TransportType.SEND]?.candidates)} + producers={this.createProducers(transportsData?.[TransportType.SEND]?.producers, statsData)} + onRestart={this.restartSendICE} + isButtonEnabled={transportsData?.[TransportType.SEND]?.opened} + /> + </div> + <div style={{ display: "flex", flexFlow: "column" }}> + <TransportPanel + title={ + <FormattedMessage + id="rtc-debug-panel.receive-transport-panel-title" + defaultMessage="Receive Transport" + /> + } + data={{ + id: transportsData?.[TransportType.RECEIVE]?.id, + opened: transportsData?.[TransportType.RECEIVE]?.opened, + state: transportsData?.[TransportType.RECEIVE]?.state + }} + candidates={this.createCandidates(transportsData?.[TransportType.RECEIVE]?.candidates)} + consumers={this.createConsumers(transportsData?.[TransportType.RECEIVE]?.consumers, statsData)} + onRestart={this.restartRecvICE} + isButtonEnabled={transportsData?.[TransportType.RECEIVE]?.opened} + /> + </div> + </CollapsiblePanel> + )} + </div> + <div className={classNames(styles.statusContainerMiddle)}> + {this.props.showAudioDebug && ( + <AudioDebugPanel isNarrow collapsed={collapsed.Audio} onCollapsed={this.onCollapse} /> + )} + {this.props.showRtcDebug && ( + <div + className={classNames(styles.rtcLogContainer)} + style={{ + height: isNarrow && !collapsed.Log && "80%", + maxHeight: isNarrow && !collapsed.Log && "80%" + }} + > <CollapsiblePanel - title={<FormattedMessage id="rtc-debug-panel.device-panel-title" defaultMessage="Device" />} + title={<FormattedMessage id="rtc-debug-panel.log-panel-title" defaultMessage="Log" />} + isRoot border - url={`${MEDIASOUP_DOC_BASE_URL}#Device`} - data={deviceData} - /> - )} - {signalingData && ( - <SignalingPanel - data={signalingData} - onConnect={this.connectSignaling} - onDisconnect={this.disconnectSignaling} - /> - )} - <div style={{ display: "flex", flexFlow: "column" }}> - <TransportPanel - title={ - <FormattedMessage id="rtc-debug-panel.send-transport-panel-title" defaultMessage="Send Transport" /> - } - data={{ - id: transportsData?.[TransportType.SEND]?.id, - opened: transportsData?.[TransportType.SEND]?.opened, - state: transportsData?.[TransportType.SEND]?.state + grow + collapsed={collapsed.Log} + onCollapse={this.onCollapse} + clear={() => { + this.setState({ + log: [] + }); }} - candidates={this.createCandidates(transportsData?.[TransportType.SEND]?.candidates)} - producers={this.createProducers(transportsData?.[TransportType.SEND]?.producers, statsData)} - onRestart={this.restartSendICE} - isButtonEnabled={transportsData?.[TransportType.SEND]?.opened} - /> - </div> - <div style={{ display: "flex", flexFlow: "column" }}> - <TransportPanel - title={ - <FormattedMessage - id="rtc-debug-panel.receive-transport-panel-title" - defaultMessage="Receive Transport" - /> - } - data={{ - id: transportsData?.[TransportType.RECEIVE]?.id, - opened: transportsData?.[TransportType.RECEIVE]?.opened, - state: transportsData?.[TransportType.RECEIVE]?.state + download={() => { + download("rtc_log.txt", this.createLog()); }} - candidates={this.createCandidates(transportsData?.[TransportType.RECEIVE]?.candidates)} - consumers={this.createConsumers(transportsData?.[TransportType.RECEIVE]?.consumers, statsData)} - onRestart={this.restartRecvICE} - isButtonEnabled={transportsData?.[TransportType.RECEIVE]?.opened} - /> + > + <p className={classNames(styles.rtcLogMsgContainer)}>{this.createLogMsgs()}</p> + </CollapsiblePanel> </div> - </CollapsiblePanel> - </div> - <div - className={classNames(styles.rtcLogContainer)} - style={{ - height: isNarrow && !collapsed.Log && "80%", - maxHeight: isNarrow && !collapsed.Log && "80%" - }} - > - <CollapsiblePanel - title={<FormattedMessage id="rtc-debug-panel.log-panel-title" defaultMessage="Log" />} - isRoot - border - grow - collapsed={collapsed.Log} - onCollapse={this.onCollapse} - clear={() => { - this.setState({ - log: [] - }); - }} - download={() => { - download("rtc_log.txt", this.createLog()); - }} - > - <p className={classNames(styles.rtcLogMsgContainer)}>{this.createLogMsgs()}</p> - </CollapsiblePanel> + )} </div> <div className={classNames(styles.rtcStatusContainerRight)} @@ -937,16 +962,18 @@ export default class RtcDebugPanel extends Component { maxHeight: isNarrow && !collapsed.Remote && "80%" }} > - <CollapsiblePanel - title={<FormattedMessage id="rtc-debug-panel.remote-panel-title" defaultMessage="Remote" />} - isRoot - border - grow - collapsed={collapsed.Remote} - onCollapse={this.onCollapse} - > - {this.createRemoteTransports(serverData)} - </CollapsiblePanel> + {this.props.showRtcDebug && ( + <CollapsiblePanel + title={<FormattedMessage id="rtc-debug-panel.remote-panel-title" defaultMessage="Remote" />} + isRoot + border + grow + collapsed={collapsed.Remote} + onCollapse={this.onCollapse} + > + {this.createRemoteTransports(serverData)} + </CollapsiblePanel> + )} </div> </div> </div> diff --git a/src/react-components/debug-panel/RtcDebugPanel.scss b/src/react-components/debug-panel/RtcDebugPanel.scss index 8ddebef269..f673229a30 100644 --- a/src/react-components/debug-panel/RtcDebugPanel.scss +++ b/src/react-components/debug-panel/RtcDebugPanel.scss @@ -12,6 +12,7 @@ flex-flow: column; flex: 0 1 auto; background-color: theme.$overlay-bg-color; + pointer-events: auto; @media not all and (min-resolution:.001dpcm){ @supports (-webkit-appearance:none) { height: 100%; }} } @@ -78,14 +79,29 @@ } } +:local(.status-container-middle) { + @extend :local(.rtc-status-container); + width: 50%; + height: 100%; + flex: 1 0 auto; + flex-flow: column; + overflow-y: hidden; + pointer-events: none; + + @media(max-width: 500px) { + justify-content: start; + width: 100%; + } +} + :local(.rtc-log-container) { pointer-events: auto; - width: 50%; + width: 100%; overflow-y: auto; display: flex; align-self: flex-end; max-height: 33%; - flex: 1 0 auto; + flex: 0 1 auto; justify-content: center; @media(max-width: 500px) { diff --git a/src/react-components/home/Button.scss b/src/react-components/home/Button.scss index ea08dc4541..1a54cbcb7e 100644 --- a/src/react-components/home/Button.scss +++ b/src/react-components/home/Button.scss @@ -27,3 +27,7 @@ margin-right: 16px; } } + +:local(.thin) { + padding: 0 4px +} diff --git a/src/react-components/home/CreateRoomButton.js b/src/react-components/home/CreateRoomButton.js index 8e8c719f26..6a7a489354 100644 --- a/src/react-components/home/CreateRoomButton.js +++ b/src/react-components/home/CreateRoomButton.js @@ -9,9 +9,9 @@ export function CreateRoomButton() { return ( <Button - lg={breakpoint === "sm" || breakpoint === "md"} + thick={breakpoint === "sm" || breakpoint === "md"} xl={breakpoint !== "sm" && breakpoint !== "md"} - preset="primary" + preset="landing" onClick={e => { e.preventDefault(); createAndRedirectToNewHub(null, null, false); diff --git a/src/react-components/home/HomePage.js b/src/react-components/home/HomePage.js index 62efc9f9d0..3924cdcba2 100644 --- a/src/react-components/home/HomePage.js +++ b/src/react-components/home/HomePage.js @@ -3,6 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl"; import classNames from "classnames"; import "web-monetization-polyfill"; import configs from "../../utils/configs"; +import { getAppLogo } from "../../utils/get-app-logo"; import { CreateRoomButton } from "./CreateRoomButton"; import { PWAButton } from "./PWAButton"; import { useFavoriteRooms } from "./useFavoriteRooms"; @@ -19,6 +20,10 @@ import { Column } from "../layout/Column"; import { Button } from "../input/Button"; import { Container } from "../layout/Container"; import { ReactComponent as WMIcon } from "../icons/wm-icon.svg"; +import { SocialBar } from "../home/SocialBar"; +import { SignInButton } from "./SignInButton"; +import maskEmail from "../../utils/mask-email"; +import { ReactComponent as HmcLogo } from "../icons/HmcLogo.svg"; export function HomePage() { const auth = useContext(AuthContext); @@ -31,7 +36,8 @@ export function HomePage() { const sortedFavoriteRooms = Array.from(favoriteRooms).sort((a, b) => b.member_count - a.member_count); const sortedPublicRooms = Array.from(publicRooms).sort((a, b) => b.member_count - a.member_count); - + const wrapInBold = chunk => <b>{chunk}</b>; + const isHmc = configs.feature("show_cloud"); useEffect(() => { const qs = new URLSearchParams(location.search); @@ -65,13 +71,33 @@ export function HomePage() { }); const canCreateRooms = !configs.feature("disable_room_creation") || auth.isAdmin; - + const email = auth.email; return ( <PageContainer className={styles.homePage}> <Container> <div className={styles.hero}> + {auth.isSignedIn ? ( + <div className={styles.signInContainer}> + <span> + <FormattedMessage + id="header.signed-in-as" + defaultMessage="Signed in as {email}" + values={{ email: maskEmail(email) }} + /> + </span> + <a href="#" onClick={auth.signOut} className={styles.mobileSignOut}> + <FormattedMessage id="header.sign-out" defaultMessage="Sign Out" /> + </a> + </div> + ) : ( + <SignInButton mobile /> + )} <div className={styles.logoContainer}> - <img alt={configs.translation("app-name")} src={configs.image("logo")} /> + {isHmc ? ( + <HmcLogo className="hmc-logo" /> + ) : ( + <img alt={configs.translation("app-name")} src={getAppLogo()} /> + )} </div> <div className={styles.appInfo}> <div className={styles.appDescription}>{configs.translation("app-description")}</div> @@ -142,14 +168,15 @@ export function HomePage() { <p> <FormattedMessage id="home-page.rooms-blurb" - defaultMessage="Share virtual spaces with your friends, co-workers, and communities. When you create a room with Hubs, you’ll have a private virtual meeting space that you can instantly share - no downloads or VR headset necessary." + defaultMessage="Share virtual spaces with your friends, co-workers, and communities. When you create a room with Hubs, you’ll have a private virtual meeting space that you can instantly share <b>- no downloads or VR headset necessary.</b>" + values={{ b: wrapInBold }} /> </p> </Column> <Column padding gap="xl" className={styles.card}> <img src={configs.image("landing_communicate_thumb")} /> <h3> - <FormattedMessage id="home-page.communicate-title" defaultMessage="Communicate naturally" /> + <FormattedMessage id="home-page.communicate-title" defaultMessage="Communicate and Collaborate" /> </h3> <p> <FormattedMessage @@ -217,12 +244,17 @@ export function HomePage() { </Container> )} <Container> - <Column padding center grow> - <Button lg preset="primary" as="a" href="/link"> + <Column center grow> + <Button thin preset="landing" as="a" href="/link"> <FormattedMessage id="home-page.have-code" defaultMessage="Have a room code?" /> </Button> </Column> </Container> + {isHmc ? ( + <Column center> + <SocialBar /> + </Column> + ) : null} </PageContainer> ); } diff --git a/src/react-components/home/HomePage.scss b/src/react-components/home/HomePage.scss index 915ae3d61a..58d422fa95 100644 --- a/src/react-components/home/HomePage.scss +++ b/src/react-components/home/HomePage.scss @@ -3,7 +3,7 @@ :local(.home-page) { flex: 1; background-size: cover; - padding: 1.5em; + padding: 0; flex-direction: column; align-items: center; @@ -21,8 +21,8 @@ display: flex; justify-content: center; padding: 20px; - width: 250px; - + width: 150px; + img { width: 100%; align-self: flex-start; @@ -33,6 +33,20 @@ } } +:local(.sign-in-container) { + display: flex; + flex-direction: column; + align-items: center; + flex: 1; + @media(min-width: theme.$breakpoint-lg) { + display: none; + } +} + +:local(.mobile-sign-out) { + padding: 0.5rem; +} + :local(.hero) { display: flex; flex-direction: column; @@ -45,8 +59,11 @@ } :local(.hero-image-container) { + img { - border-radius: 16px; + @media (min-width: theme.$breakpoint-lg) { + border-radius: 16px; + } } } @@ -79,7 +96,7 @@ font-size: theme.$font-size-lg; font-weight: theme.$font-weight-medium; text-align: center; - margin: 0 48px 20px 48px; + margin: 0 24px 20px 24px; line-height: 1.25; @media (min-width: theme.$breakpoint-lg) { diff --git a/src/react-components/home/SignInButton.js b/src/react-components/home/SignInButton.js new file mode 100644 index 0000000000..e6d2304dcd --- /dev/null +++ b/src/react-components/home/SignInButton.js @@ -0,0 +1,16 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { FormattedMessage } from "react-intl"; +import styles from "./SignInButton.scss"; +import { Button } from "../input/Button"; + +export function SignInButton({ mobile }) { + return ( + <Button className={mobile ? styles.mobileSignIn : styles.SignInButton} thick preset="signin" as="a" href="/signin"> + <FormattedMessage id="sign-in-button" defaultMessage="Sign in/Sign up" /> + </Button> + ); +} +SignInButton.propTypes = { + mobile: PropTypes.bool +}; diff --git a/src/react-components/home/SignInButton.scss b/src/react-components/home/SignInButton.scss new file mode 100644 index 0000000000..748e67d36e --- /dev/null +++ b/src/react-components/home/SignInButton.scss @@ -0,0 +1,15 @@ +@use "../styles/theme.scss"; + +:local(.sign-in-button) { + display: none; + @media(min-width: theme.$breakpoint-lg) { + display: flex; + } +} + +:local(.mobile-sign-in) { + display: flex; + @media(min-width: theme.$breakpoint-lg) { + display: none; + } +} \ No newline at end of file diff --git a/src/react-components/home/SocialBar.js b/src/react-components/home/SocialBar.js new file mode 100644 index 0000000000..c902a1da1e --- /dev/null +++ b/src/react-components/home/SocialBar.js @@ -0,0 +1,34 @@ +import React from "react"; +import PropTypes from "prop-types"; +import styles from "./SocialBar.scss"; +import { Container } from "../layout/Container"; +import { ReactComponent as Discord } from "../icons/SocialDiscord.svg"; +import { ReactComponent as Twitch } from "../icons/SocialTwitch.svg"; +import { ReactComponent as Twitter } from "../icons/SocialTwitter.svg"; +import { ReactComponent as Vimeo } from "../icons/SocialVimeo.svg"; +import { ReactComponent as Youtube } from "../icons/SocialYoutube.svg"; + +export function SocialBar({ mobile }) { + return ( + <Container className={mobile ? styles.mobileSocialBar : styles.socialBarContainer}> + <a target="_blank" rel="noopener noreferrer" href="https://discord.com/invite/dFJncWwHun"> + <Discord /> + </a> + <a target="_blank" rel="noopener noreferrer" href="https://twitter.com/MozillaHubs"> + <Twitter /> + </a> + <a target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/c/MozillaHubs"> + <Youtube /> + </a> + <a target="_blank" rel="noopener noreferrer" href="https://www.twitch.tv/mozillahubs"> + <Twitch /> + </a> + <a target="_blank" rel="noopener noreferrer" href="https://vimeo.com/mozillahubs"> + <Vimeo /> + </a> + </Container> + ); +} +SocialBar.propTypes = { + mobile: PropTypes.bool +}; diff --git a/src/react-components/home/SocialBar.scss b/src/react-components/home/SocialBar.scss new file mode 100644 index 0000000000..ab2c78305a --- /dev/null +++ b/src/react-components/home/SocialBar.scss @@ -0,0 +1,26 @@ +@use "../styles/theme.scss"; + +:local(.social-bar-container) { + display: none; + + @media(min-width: theme.$breakpoint-lg) { + display: flex; + justify-content: space-around; + width: 169px; + align-items: center; + margin-bottom: 1em !important; + } +} + +:local(.mobile-social-bar) { + display: flex; + padding-top: 2rem; + padding-bottom: 2rem; + width: 250px; + justify-content: space-between; + align-items: center; + + @media(min-width: theme.$breakpoint-lg) { + display: none; + } + } \ No newline at end of file diff --git a/src/react-components/home/SocialBar.stories.js b/src/react-components/home/SocialBar.stories.js new file mode 100644 index 0000000000..490ee85413 --- /dev/null +++ b/src/react-components/home/SocialBar.stories.js @@ -0,0 +1,32 @@ +import React from "react"; +import { Column } from "../layout/Column"; +import { SocialBar } from "../home/SocialBar.js"; +import { INITIAL_VIEWPORTS } from "@storybook/addon-viewport"; + +export default { + title: "SocialBar", + parameters: { + viewport: { + viewports: INITIAL_VIEWPORTS + } + } +}; + +export const All = () => ( + <Column padding> + <SocialBar /> + <SocialBar mobile /> + </Column> +); + +export const Mobile = () => ( + <Column padding> + <SocialBar mobile /> + </Column> +); + +Mobile.parameters = { + viewport: { + defaultViewport: "iphone6" + } +}; diff --git a/src/react-components/icons/Hamburger.svg b/src/react-components/icons/Hamburger.svg new file mode 100644 index 0000000000..e14ac3d1fc --- /dev/null +++ b/src/react-components/icons/Hamburger.svg @@ -0,0 +1,5 @@ +<svg width="25" height="25" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M19.5085 8.7959H1.93143C1.13313 8.7959 0.47998 9.44905 0.47998 10.2474C0.47998 11.0457 1.13313 11.6988 1.93143 11.6988H19.5085C20.3068 11.6988 20.96 11.0457 20.96 10.2474C20.96 9.44905 20.3213 8.7959 19.5085 8.7959Z" fill="black"/> +<path d="M1.93143 2.90291H19.5085C20.3068 2.90291 20.96 2.24975 20.96 1.45145C20.96 0.653154 20.3068 0 19.5085 0H1.93143C1.13313 0 0.47998 0.653154 0.47998 1.45145C0.47998 2.24975 1.13313 2.90291 1.93143 2.90291Z" fill="black"/> +<path d="M19.5085 17.5771H1.93143C1.13313 17.5771 0.47998 18.2303 0.47998 19.0286C0.47998 19.8269 1.13313 20.4801 1.93143 20.4801H19.5085C20.3068 20.4801 20.96 19.8269 20.96 19.0286C20.96 18.2303 20.3213 17.5771 19.5085 17.5771Z" fill="black"/> +</svg> \ No newline at end of file diff --git a/src/react-components/icons/HmcLogo.svg b/src/react-components/icons/HmcLogo.svg new file mode 100644 index 0000000000..0ab5b39bdd --- /dev/null +++ b/src/react-components/icons/HmcLogo.svg @@ -0,0 +1,5 @@ +<svg width="144" height="100" viewBox="0 0 144 100" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M144 99.7409H0V58.1143H144V99.7409ZM41.8791 87.2435H39.5592V78.9506C39.5592 74.6221 36.5992 72.6399 33.3592 72.6399C30.5192 72.6399 28.4793 74.1366 27.4791 76.5638C26.5992 73.8939 24.1992 72.6399 21.5992 72.6399C19.0792 72.6399 17.1992 73.8129 16.1192 75.7547V73.0039H8.5592V76.9683H10.9592V87.2844H8.5592V91.2484H19.5192V87.2844H16.0792V80.9328C16.0792 78.3843 17.0792 76.6043 19.5591 76.6043C21.5992 76.6043 22.6392 77.8178 22.6392 80.9733V91.2484H30.1992V87.2844H27.7992V80.9328C27.7992 78.3843 28.7992 76.6043 31.2792 76.6043C33.3192 76.6043 34.3592 77.8178 34.3592 80.9733V91.2079H41.8791V87.2435ZM53.8017 72.6399C47.3217 72.6399 44.1216 77.0493 44.1216 82.3891C44.1216 88.2144 47.9616 91.653 53.5217 91.653C59.2817 91.653 63.4416 87.9716 63.4416 82.1464C63.4416 77.0493 60.2817 72.6399 53.8017 72.6399ZM49.4411 82.0222C49.4411 85.1771 50.8811 87.6044 53.6811 87.6044C56.3611 87.6044 58.1211 85.4607 58.1211 81.9409C58.1211 78.2596 56.161 76.601 53.7211 76.601C51.0811 76.601 49.4411 78.5832 49.4411 82.0222ZM79.5983 84.4519L83.6783 84.8564L82.5583 91.2477H66.8383L66.3183 88.4972L76.2379 76.9676H70.5983L69.7983 79.7997L66.0783 79.3952L66.7183 73.0032H82.5183L82.9183 75.754L72.9183 87.2837H78.7584L79.5983 84.4519ZM92.8807 91.2494H87.4807V84.6959H92.8807V91.2494ZM87.4807 79.5566H92.8807V73.0032H87.4807V79.5566ZM101.279 91.2066L109.079 63.4152H103.999L96.1993 91.2066H101.279ZM119.561 63.4152L111.76 91.2066H106.68L114.48 63.4152H119.561ZM136.761 88.1335C137.001 88.1335 137.24 88.0934 137.521 88.0121L137.641 90.8034C136.68 91.3297 135.521 91.653 134.401 91.653C132 91.653 130.681 90.2371 130.441 88.0121C129.401 89.8729 127.561 91.653 124.64 91.653C122.04 91.653 119.081 90.2371 119.081 86.4345C119.081 81.9441 123.36 80.8924 127.481 80.8924C128.481 80.8924 129.521 80.9328 130.441 81.0541V80.4474C130.441 78.5865 130.401 76.3615 127.481 76.3615C126.401 76.3615 125.561 76.4425 124.721 76.8875L124.121 78.9506L120.001 78.5056L120.641 74.2984C123.801 73.0039 125.401 72.6399 128.361 72.6399C132.241 72.6399 135.521 74.6625 135.521 78.8293V86.7176C135.521 87.7694 135.921 88.1335 136.761 88.1335Z" fill="black"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M126.48 87.8914C124.92 87.8914 124.36 86.9606 124.36 85.7874C124.36 83.8053 125.96 83.2793 127.8 83.2793C128.64 83.2793 129.56 83.4007 130.4 83.522C130.28 86.5561 128.32 87.8914 126.48 87.8914Z" fill="black"/> +<path d="M43.8091 46.7906H30.1816V41.3486H33.4654V32.5401C33.4654 30.3708 33.0822 28.8186 32.316 27.8834C31.5863 26.9484 30.5282 26.4809 29.1418 26.4809C27.5364 26.4809 26.2777 26.9858 25.3655 27.9957C24.4899 29.0056 24.0155 30.3333 23.9425 31.9792V41.3486H27.2263V46.7906H13.5988V41.3486H16.8825V13.6892H13.5988V8.19092H23.9425V25.3588C25.5844 22.4414 28.2297 20.9827 31.8782 20.9827C34.2133 20.9827 36.2383 21.6933 37.953 23.1146C39.6679 24.5359 40.5253 26.7427 40.5253 29.735V41.3486H43.8091V46.7906ZM75.7736 46.7906H65.1563V42.9194C63.5144 45.8369 60.8691 47.2956 57.2206 47.2956C54.8855 47.2956 52.8605 46.5849 51.1458 45.1636C49.4309 43.7422 48.5735 41.5355 48.5735 38.5433V26.9298H45.2897V21.4876H55.6335V35.7381C55.6335 37.9449 55.9801 39.5158 56.6733 40.4508C57.403 41.3486 58.4611 41.7974 59.8476 41.7974C61.526 41.7974 62.8212 41.2363 63.7333 40.1142C64.682 38.9921 65.1563 37.5521 65.1563 35.7942V26.9298H61.1611V21.4876H72.2163V41.3486H75.7736V46.7906ZM105.544 33.55C105.544 37.2903 104.577 40.5256 102.643 43.2561C100.746 45.9864 97.9367 47.3517 94.2151 47.3517C90.4571 47.3517 87.8119 45.893 86.2795 42.9755C86.2065 43.6114 86.1152 44.2472 86.0058 44.8831C85.9328 45.5189 85.8416 46.1547 85.7321 46.7906H78.6722C78.9275 45.4815 79.1465 44.1724 79.3289 42.8633C79.5113 41.5543 79.6025 40.2638 79.6025 38.9921V13.6892H76.3188V8.19092H86.6626V26.3126C87.3193 24.8539 88.3044 23.6008 89.6179 22.5536C90.9678 21.5063 92.7556 20.9827 94.9813 20.9827C98.0826 20.9827 100.618 22.0861 102.589 24.2928C104.559 26.4996 105.544 29.5853 105.544 33.55ZM98.2103 34.1671C98.2103 31.7359 97.6995 29.8845 96.6779 28.6128C95.6563 27.3412 94.3063 26.7053 92.628 26.7053C90.7307 26.7053 89.253 27.4159 88.195 28.8372C87.1733 30.2586 86.6626 31.9043 86.6626 33.7744V34.3915C86.6626 36.4487 87.1551 38.188 88.1402 39.6093C89.1618 40.9932 90.603 41.6851 92.4638 41.6851C94.0691 41.6851 95.4192 41.0867 96.5137 39.8897C97.6448 38.6555 98.2103 36.748 98.2103 34.1671ZM130.488 39.0482C130.488 41.8534 129.393 43.948 127.204 45.3319C125.052 46.6784 122.242 47.3517 118.777 47.3517C116.988 47.3517 115.182 47.1646 113.358 46.7906C111.57 46.3792 109.855 45.7433 108.214 44.8831L109.199 37.8139L114.672 38.4311V41.573C115.328 41.7974 116.022 41.9469 116.751 42.0218C117.481 42.0592 118.029 42.0778 118.394 42.0778C119.743 42.0778 120.911 41.8534 121.896 41.4046C122.881 40.9558 123.373 40.2825 123.373 39.3849C123.373 38.3002 122.625 37.5895 121.13 37.2528C119.634 36.9163 117.901 36.5796 115.93 36.243C113.96 35.9064 112.227 35.2144 110.731 34.1671C109.235 33.1199 108.487 31.3432 108.487 28.8372C108.487 25.7328 109.655 23.657 111.99 22.6098C114.362 21.525 116.806 20.9827 119.324 20.9827C122.608 20.9827 125.69 21.7494 128.572 23.283L129.175 29.735L123.702 30.3521L123.264 26.8175C122.06 26.4061 120.765 26.2003 119.378 26.2003C118.467 26.2003 117.682 26.4061 117.026 26.8175C116.404 27.1915 116.095 27.79 116.095 28.6128C116.095 29.6975 116.806 30.4269 118.229 30.8009C119.688 31.1375 121.366 31.4742 123.264 31.8108C125.198 32.1474 126.877 32.8394 128.299 33.8867C129.759 34.8965 130.488 36.617 130.488 39.0482Z" fill="black"/> +</svg> diff --git a/src/react-components/icons/Icon.stories.js b/src/react-components/icons/Icon.stories.js index c7d232f2e5..2c82142e70 100644 --- a/src/react-components/icons/Icon.stories.js +++ b/src/react-components/icons/Icon.stories.js @@ -43,6 +43,7 @@ import { ReactComponent as VolumeMutedIcon } from "./VolumeMuted.svg"; import { ReactComponent as VolumeOffIcon } from "./VolumeOff.svg"; import { ReactComponent as VRIcon } from "./VR.svg"; import { ReactComponent as WandIcon } from "./Wand.svg"; +import { ReactComponent as HmcLogo } from "./HmcLogo.svg"; export default { title: "Icon", @@ -70,6 +71,7 @@ export const AllIcons = args => ( <GoToIcon {...args} /> <HelpIcon {...args} /> <HideIcon {...args} /> + <HmcLogo {...args} /> <ImageIcon {...args} /> <InviteIcon {...args} /> <LeaveIcon {...args} /> diff --git a/src/react-components/icons/SocialDiscord.svg b/src/react-components/icons/SocialDiscord.svg new file mode 100644 index 0000000000..28ddbaecb0 --- /dev/null +++ b/src/react-components/icons/SocialDiscord.svg @@ -0,0 +1,5 @@ +<svg width="18" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M3 4H16V14H3V4Z" fill="white"/> +<path d="M8.24613 8.5509C7.73314 8.5509 7.32812 9.0009 7.32812 9.5499C7.32812 10.0989 7.74214 10.5489 8.24613 10.5489C8.75913 10.5489 9.16412 10.0989 9.16412 9.5499C9.17312 9.0009 8.75913 8.5509 8.24613 8.5509ZM11.5311 8.5509C11.0181 8.5509 10.6131 9.0009 10.6131 9.5499C10.6131 10.0989 11.0271 10.5489 11.5311 10.5489C12.0441 10.5489 12.4491 10.0989 12.4491 9.5499C12.4491 9.0009 12.0441 8.5509 11.5311 8.5509Z" fill="#7289DA"/> +<path d="M15.905 1H3.845C2.828 1 2 1.828 2 2.854V15.022C2 16.048 2.828 16.876 3.845 16.876H14.051L13.574 15.211L14.726 16.282L15.815 17.29L17.75 19V2.854C17.75 1.828 16.922 1 15.905 1ZM12.431 12.754C12.431 12.754 12.107 12.367 11.837 12.025C13.016 11.692 13.466 10.954 13.466 10.954C13.097 11.197 12.746 11.368 12.431 11.485C11.981 11.674 11.549 11.8 11.126 11.872C10.262 12.034 9.47 11.989 8.795 11.863C8.282 11.764 7.841 11.62 7.472 11.476C7.265 11.395 7.04 11.296 6.815 11.17C6.788 11.152 6.761 11.143 6.734 11.125C6.716 11.116 6.707 11.107 6.698 11.098C6.536 11.008 6.446 10.945 6.446 10.945C6.446 10.945 6.878 11.665 8.021 12.007C7.751 12.349 7.418 12.754 7.418 12.754C5.429 12.691 4.673 11.386 4.673 11.386C4.673 8.488 5.969 6.139 5.969 6.139C7.265 5.167 8.498 5.194 8.498 5.194L8.588 5.302C6.968 5.77 6.221 6.481 6.221 6.481C6.221 6.481 6.419 6.373 6.752 6.22C7.715 5.797 8.48 5.68 8.795 5.653C8.849 5.644 8.894 5.635 8.948 5.635C9.497 5.563 10.118 5.545 10.766 5.617C11.621 5.716 12.539 5.968 13.475 6.481C13.475 6.481 12.764 5.806 11.234 5.338L11.36 5.194C11.36 5.194 12.593 5.167 13.889 6.139C13.889 6.139 15.185 8.488 15.185 11.386C15.185 11.386 14.42 12.691 12.431 12.754Z" fill="#7289DA"/> +</svg> diff --git a/src/react-components/icons/SocialTwitch.svg b/src/react-components/icons/SocialTwitch.svg new file mode 100644 index 0000000000..a2a576c9d6 --- /dev/null +++ b/src/react-components/icons/SocialTwitch.svg @@ -0,0 +1,13 @@ +<svg width="17" height="20" viewBox="0 0 17 20" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0)"> +<path d="M15.4956 9.18663L12.7332 11.9399H9.97071L7.55356 14.349V11.9399H4.4458V1.61511H15.4956V9.18663Z" fill="white"/> +<path d="M3.75483 0.23877L0.301758 3.68037V16.0701H4.44544V19.5117L7.89851 16.0701H10.661L16.8765 9.87524V0.23877H3.75483ZM15.4953 9.18692L12.7328 11.9402H9.97035L7.5532 14.3493V11.9402H4.44544V1.61541H15.4953V9.18692Z" fill="#9146FF"/> +<path d="M13.4242 4.02429H12.043V8.15421H13.4242V4.02429Z" fill="#9146FF"/> +<path d="M9.62586 4.02429H8.24463V8.15421H9.62586V4.02429Z" fill="#9146FF"/> +</g> +<defs> +<clipPath id="clip0"> +<rect width="16.5747" height="19.2729" fill="white" transform="translate(0.301758 0.23877)"/> +</clipPath> +</defs> +</svg> \ No newline at end of file diff --git a/src/react-components/icons/SocialTwitter.svg b/src/react-components/icons/SocialTwitter.svg new file mode 100644 index 0000000000..b4946561f8 --- /dev/null +++ b/src/react-components/icons/SocialTwitter.svg @@ -0,0 +1,4 @@ +<svg width="17" height="17" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M17.5 20H2.5C1.12 20 0 18.88 0 17.5V2.5C0 1.12 1.12 0 2.5 0H17.5C18.88 0 20 1.12 20 2.5V17.5C20 18.88 18.88 20 17.5 20Z" fill="#1D9BF0"/> +<path d="M7.68013 15.0799C12.3951 15.0799 14.9751 11.1699 14.9751 7.78492C14.9751 7.67492 14.9751 7.56492 14.9701 7.45492C15.4701 7.09492 15.9051 6.63992 16.2501 6.12492C15.7901 6.32992 15.2951 6.46492 14.7751 6.52992C15.3051 6.21492 15.7101 5.70992 15.9051 5.10992C15.4101 5.40492 14.8601 5.61492 14.2751 5.72992C13.8051 5.22992 13.1401 4.91992 12.4051 4.91992C10.9901 4.91992 9.84013 6.06992 9.84013 7.48492C9.84013 7.68492 9.86513 7.87992 9.90513 8.06992C7.77513 7.96492 5.88513 6.93992 4.62013 5.38992C4.40013 5.76992 4.27513 6.20992 4.27513 6.67992C4.27513 7.56992 4.73013 8.35492 5.41513 8.81492C4.99513 8.79992 4.60013 8.68492 4.25513 8.49492C4.25513 8.50492 4.25513 8.51492 4.25513 8.52992C4.25513 9.76992 5.14013 10.8099 6.31013 11.0449C6.09513 11.1049 5.87013 11.1349 5.63513 11.1349C5.47013 11.1349 5.31013 11.1199 5.15513 11.0899C5.48013 12.1099 6.43013 12.8499 7.55013 12.8699C6.67013 13.5599 5.56513 13.9699 4.36513 13.9699C4.16013 13.9699 3.95513 13.9599 3.75513 13.9349C4.88513 14.6549 6.23513 15.0799 7.68013 15.0799Z" fill="white"/> +</svg> \ No newline at end of file diff --git a/src/react-components/icons/SocialVimeo.svg b/src/react-components/icons/SocialVimeo.svg new file mode 100644 index 0000000000..448e49d257 --- /dev/null +++ b/src/react-components/icons/SocialVimeo.svg @@ -0,0 +1,11 @@ +<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0)"> +<path d="M17.4512 15.5051C17.4512 16.4168 16.7053 17.1626 15.7937 17.1626H2.53394C1.62233 17.1626 0.876465 16.4168 0.876465 15.5051V2.24536C0.876465 1.33375 1.62233 0.587891 2.53394 0.587891H15.7937C16.7053 0.587891 17.4512 1.33375 17.4512 2.24536V15.5051Z" fill="#1AB7EA"/> +<path d="M14.8268 6.09901C14.7716 7.25924 13.9566 8.86147 12.382 10.8919C10.7522 13.0052 9.37095 14.0687 8.25216 14.0687C7.54773 14.0687 6.96762 13.4195 6.48419 12.135C6.16651 10.9471 5.83501 9.77308 5.51733 8.58522C5.15821 7.30068 4.77147 6.6515 4.3571 6.6515C4.27423 6.6515 3.95654 6.84487 3.41787 7.21781L2.85156 6.48576C3.44549 5.96089 4.02561 5.44983 4.60572 4.92497C5.39302 4.24817 5.98695 3.88905 6.3875 3.84761C7.31293 3.76474 7.89304 4.4001 8.11404 5.7537C8.34885 7.23162 8.51459 8.14323 8.59747 8.50235C8.8599 9.71783 9.16377 10.3394 9.48145 10.3394C9.73007 10.3394 10.103 9.93883 10.6141 9.15153C11.1113 8.36423 11.3875 7.75649 11.4152 7.34212C11.4842 6.66532 11.2218 6.32001 10.6141 6.32001C10.324 6.32001 10.0339 6.38907 9.73007 6.51338C10.324 4.57966 11.4428 3.65424 13.1003 3.70949C14.3157 3.73711 14.8959 4.53822 14.8268 6.09901Z" fill="white"/> +</g> +<defs> +<clipPath id="clip0"> +<rect width="16.5747" height="16.5747" fill="white" transform="translate(0.876465 0.587891)"/> +</clipPath> +</defs> +</svg> \ No newline at end of file diff --git a/src/react-components/icons/SocialYoutube.svg b/src/react-components/icons/SocialYoutube.svg new file mode 100644 index 0000000000..d35706fd41 --- /dev/null +++ b/src/react-components/icons/SocialYoutube.svg @@ -0,0 +1,4 @@ +<svg width="20" height="14" viewBox="0 0 20 14" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M18.9217 2.40873C18.7088 1.61354 18.0855 0.986564 17.2949 0.772474C15.8505 0.374878 10.073 0.374878 10.073 0.374878C10.073 0.374878 4.29552 0.374878 2.85115 0.757182C2.07575 0.971272 1.43719 1.61354 1.22434 2.40873C0.844238 3.86149 0.844238 6.87404 0.844238 6.87404C0.844238 6.87404 0.844238 9.90188 1.22434 11.3393C1.43719 12.1345 2.06055 12.7615 2.85115 12.9756C4.31073 13.3732 10.073 13.3732 10.073 13.3732C10.073 13.3732 15.8505 13.3732 17.2949 12.9909C18.0855 12.7768 18.7088 12.1498 18.9217 11.3546C19.3018 9.90188 19.3018 6.88933 19.3018 6.88933C19.3018 6.88933 19.317 3.86149 18.9217 2.40873Z" fill="#FF0000"/> +<path d="M13.0373 6.87533L8.23291 4.09216V9.6585L13.0373 6.87533Z" fill="white"/> +</svg> \ No newline at end of file diff --git a/src/react-components/icons/footer-duck.svg b/src/react-components/icons/footer-duck.svg new file mode 100644 index 0000000000..2a122012fb --- /dev/null +++ b/src/react-components/icons/footer-duck.svg @@ -0,0 +1,22 @@ +<svg width="114" height="86" viewBox="0 0 114 86" fill="none" xmlns="http://www.w3.org/2000/svg"> +<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="114" height="86"> +<rect width="114" height="86" fill="#C4C4C4"/> +</mask> +<g mask="url(#mask0)"> +<path d="M92.8376 47.12C90.0375 45.0101 90.5277 56.704 75.073 58.5005C67.9841 59.3244 61.9725 58.0457 56.8898 56.3492C62.451 52.7103 66.1255 46.4599 66.1255 39.3495C66.1255 28.1113 56.9587 19 45.6488 19C35.777 19 27.5427 25.9402 25.6053 35.1766C18.2417 33.6385 12.2773 32.268 12.2773 38.5463C12.2773 44.3824 21.0237 50.1952 30.3246 53.7017C20.6422 57.998 13.8894 67.6442 13.8894 78.8626C13.8894 94.0766 26.3855 104.829 41.6118 106.411C63.2321 108.657 88.8803 104.977 98.5654 85.6497C105.493 71.8261 102.381 54.3078 92.8376 47.12Z" fill="url(#paint0_linear)"/> +<ellipse rx="5.49021" ry="5.49956" transform="matrix(0.998739 0.0501978 -0.0492734 0.998785 37.3715 37.5108)" fill="black"/> +<mask id="mask1" mask-type="alpha" maskUnits="userSpaceOnUse" x="1" y="28" width="30" height="69"> +<path d="M9.2036 52.0284C7.91851 54.5183 7.04113 57.0672 6.4894 59.6229L14.0377 95.1443C14.6855 96.3657 14.8732 96.7484 14.2318 96.0577L14.0377 95.1443C11.6712 90.6825 3.16349 75.029 6.4894 59.6229L1 33.7904L20.7962 28.3207C31.1555 36.2836 31.2347 40.0044 30.3094 53.6989C18.302 56.7956 13.49 43.7235 9.2036 52.0284Z" fill="#C4C4C4"/> +</mask> +<g mask="url(#mask1)"> +<path d="M92.8448 47.1248C90.0448 45.0149 90.535 56.7088 75.0803 58.5053C67.9913 59.3293 61.9798 58.0506 56.8971 56.354C62.4583 52.7151 66.1328 46.4647 66.1328 39.3544C66.1328 28.1161 56.966 19.0048 45.6561 19.0048C35.7843 19.0048 27.5499 25.945 25.6125 35.1814C18.249 33.6434 12.2846 32.2728 12.2846 38.5511C12.2846 44.3873 21.0309 50.2 30.3319 53.7066C20.6495 58.0029 13.8967 67.649 13.8967 78.8675C13.8967 94.0814 26.3928 104.834 41.6191 106.416C63.2394 108.661 88.8876 104.982 98.5727 85.6545C105.5 71.8309 102.389 54.3126 92.8448 47.1248Z" fill="#FF8A00"/> +</g> +<circle cx="39.1419" cy="36.1205" r="1.55668" fill="white"/> +</g> +<defs> +<linearGradient id="paint0_linear" x1="57.296" y1="19" x2="57.296" y2="106.995" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FFC000"/> +<stop offset="1" stop-color="#FFD600"/> +</linearGradient> +</defs> +</svg> diff --git a/src/react-components/input/Button.js b/src/react-components/input/Button.js index cd28fd5b7b..76a1f72e3d 100644 --- a/src/react-components/input/Button.js +++ b/src/react-components/input/Button.js @@ -15,11 +15,14 @@ export const presets = [ "accent2", "accent3", "accent4", - "accent5" + "accent5", + "accent6", + "landing", + "signin" ]; export const Button = memo( - forwardRef(({ as, sm, lg, xl, preset, className, children, ...rest }, ref) => { + forwardRef(({ as, sm, lg, xl, thin, thick, preset, className, children, ...rest }, ref) => { const ButtonComponent = as; const buttonProps = ButtonComponent === "button" ? { type: "button" } : {}; @@ -29,7 +32,13 @@ export const Button = memo( styles.button, textInputStyles.button, styles[preset], - { [styles.sm]: sm, [styles.lg]: lg, [styles.xl]: xl }, + { + [styles.sm]: sm, + [styles.lg]: lg, + [styles.xl]: xl, + [styles.thin]: thin, + [styles.thick]: thick + }, className )} {...buttonProps} diff --git a/src/react-components/input/Button.scss b/src/react-components/input/Button.scss index c04054e810..fccc50c50a 100644 --- a/src/react-components/input/Button.scss +++ b/src/react-components/input/Button.scss @@ -25,7 +25,7 @@ :local(.basic), :local(.transparent) { color: theme.$text4-color; - border: 1px solid theme.$basic-border-color; + border: 2px solid theme.$basic-border-color; background-color: theme.$basic-color; svg { @@ -82,7 +82,8 @@ :local(.accept) { color: theme.$text5-color; background-color: theme.$accept-color; - + border: 2px solid theme.$accept-border-color; + svg { *[stroke=\#000] { stroke: theme.$text5-color; @@ -96,6 +97,7 @@ &:hover { color: theme.$text5-color-hover; background-color: theme.$accept-color-hover; + border: 2px solid theme.$accept-border-color; } &:active { @@ -157,6 +159,7 @@ :local(.accent2) { color: theme.$text5-color; background-color: theme.$accent2-color; + border: 2px solid theme.$accent2-border-color; svg { *[stroke=\#000] { @@ -171,6 +174,7 @@ &:hover { color: theme.$text5-color-hover; background-color: theme.$accent2-color-hover; + border: 2px solid theme.$accent2-border-color } &:active { @@ -207,6 +211,7 @@ :local(.accent4) { color: theme.$text5-color; background-color: theme.$accent4-color; + border: 2px solid theme.$accent4-border-color; svg { *[stroke=\#000] { @@ -221,6 +226,7 @@ &:hover { color: theme.$text5-color-hover; background-color: theme.$accent4-color-hover; + border: 2px solid theme.$accent4-border-color; } &:active { @@ -232,6 +238,7 @@ :local(.accent5) { color: theme.$text5-color; background-color: theme.$accent5-color; + border: 2px solid theme.$accent5-border-color; svg { *[stroke=\#000] { @@ -246,6 +253,7 @@ &:hover { color: theme.$text5-color-hover; background-color: theme.$accent5-color-hover; + border: 2px solid theme.$accent5-border-color; } &:active { @@ -254,6 +262,32 @@ } } + +:local(.accent6) { + color: theme.$text5-color; + background-color: theme.$accent6-color; + + svg { + *[stroke=\#000] { + stroke: theme.$text5-color; + } + + *[fill=\#000] { + fill: theme.$text5-color; + } + } + + &:hover { + color: theme.$text5-color-hover; + background-color: theme.$accent6-color-hover; + } + + &:active { + color: theme.$text5-color-pressed; + background-color: theme.$accent6-color-pressed; + } +} + :local(.button):disabled { border-color: transparent; cursor: not-allowed; @@ -285,4 +319,38 @@ :local(.xl) { height: 64px; +} + +:local(.thin) { + min-height: 41px; + height: 41px; + &:hover { + color: theme.$text5-color-hover; + } +} + +:local(.thick) { + height: 53px; +} + +:local(.signin) { + border: 2px solid #007AB8; + background-color: transparent; + color: #007AB8; + box-sizing: border-box; + border-radius: 13px; +} + +:local(.landing) { + border: 2px solid #007AB8; + background-color: #007AB8; + color: theme.$text5-color; + box-sizing: border-box; + border-radius: 13px; + &:hover { + background-color: #008bd1; + } + &:active { + background-color: #00699E; + } } \ No newline at end of file diff --git a/src/react-components/input/Button.stories.js b/src/react-components/input/Button.stories.js index 2d419a89f7..53f3190c0a 100644 --- a/src/react-components/input/Button.stories.js +++ b/src/react-components/input/Button.stories.js @@ -18,3 +18,46 @@ export const All = () => ( <Button>Really Really Long Button Name</Button> </Column> ); + +export const Sizes = () => ( + <Column padding> + <Button preset="primary" sm> + Small + </Button> + <Button preset="primary" lg> + Large? (lg) + </Button> + <Button preset="primary" xl> + xlarge + </Button> + <Button preset="primary" thin> + thin + </Button> + <Button disabled>Disabled</Button> + </Column> +); + +export const Tokens = () => ( + <Column padding> + <Button preset="primary" sm thin> + Create Token + </Button> + <Button disabled sm thin> + Revoke all + </Button> + </Column> +); + +export const Landing = () => ( + <Column padding> + <Button preset="signin" thick> + Sign in/Sign up + </Button> + <Button preset="landing" thick> + Get Started + </Button> + <Button preset="landing" thin> + Have a room code? + </Button> + </Column> +); diff --git a/src/react-components/input/CheckboxInput.js b/src/react-components/input/CheckboxInput.js new file mode 100644 index 0000000000..4a23b3e5d9 --- /dev/null +++ b/src/react-components/input/CheckboxInput.js @@ -0,0 +1,30 @@ +import React, { forwardRef, memo } from "react"; +import PropTypes from "prop-types"; +import classNames from "classnames"; +import styles from "./CheckboxInput.scss"; + +export const CheckboxInput = memo( + forwardRef(({ className, labelClassName, label, description, disabled, checked, ...rest }, ref) => { + return ( + <label className={classNames(styles.checkboxInput, { [styles.disabled]: disabled }, className)}> + <input type="checkbox" disabled={disabled} checked={checked} ref={ref} {...rest} /> + <div className={classNames(styles.checkmark)} /> + {label && ( + <div className={classNames(styles.labelContainer, labelClassName)}> + <p className={styles.label}>{label}</p> + {description && <p className={styles.description}>{description}</p>} + </div> + )} + </label> + ); + }) +); + +CheckboxInput.propTypes = { + label: PropTypes.node, + description: PropTypes.node, + checked: PropTypes.bool, + disabled: PropTypes.bool, + className: PropTypes.string, + labelClassName: PropTypes.string +}; diff --git a/src/react-components/input/CheckboxInput.scss b/src/react-components/input/CheckboxInput.scss new file mode 100644 index 0000000000..c92c5a1011 --- /dev/null +++ b/src/react-components/input/CheckboxInput.scss @@ -0,0 +1,89 @@ +@use "../styles/theme.scss"; + +$checkbox-size: 20px; + +:local(.checkbox-input) { + display: flex; + height: $checkbox-size; + align-items: center; + position: relative; + padding-left: 35px; + cursor: pointer; + font-size: 22px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +:local(.checkbox-input) input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; +} + +:local(.checkmark) { + // custom checkbox + position: absolute; + top: 0px; + left: 0px; + height: $checkbox-size; + width: $checkbox-size; + border-radius: 5px; + border: 2px solid theme.$lightgrey; + &:after { + content: ""; + position: absolute; + display: none; + } +} + +:local(.disabled) { + opacity: 0.5; + cursor: not-allowed; +} + +:local(.checkbox-input) input:checked ~ :local(.checkmark):after { + display: block; +} + +:local(.checkbox-input):hover input ~ :local(.checkmark) { + background-color: #ccc; +} + +:local(.checkbox-input) input:checked ~ :local(.checkmark) { + background-color: #2196F3; + border: 2px solid #2196F3; +} + +:local(.checkbox-input) :local(.checkmark):after { + left: 6px; + top: 1px; + width: 5px; + height: 12px; + border: solid black; + border-width: 0 3px 3px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + +:local(.label-container) { + margin-left: 16px; + display: flex; + flex-direction: column; + color: theme.$text2-color; +} + + +:local(.label) { + font-size: theme.$font-size-sm; +} + +:local(.description) { + margin-top: 8px; + font-size: theme.$font-size-xs; + font-weight: theme.$font-weight-regular; +} diff --git a/src/react-components/input/CheckboxInput.stories.js b/src/react-components/input/CheckboxInput.stories.js new file mode 100644 index 0000000000..86056f4561 --- /dev/null +++ b/src/react-components/input/CheckboxInput.stories.js @@ -0,0 +1,21 @@ +/* eslint-disable @calm/react-intl/missing-formatted-message */ +import React from "react"; +import { Column } from "../layout/Column"; +import { CheckboxInput } from "./CheckboxInput"; + +export default { + title: "Input/CheckboxInput", + argTypes: { onChange: { action: "onChange" } } +}; + +export const All = args => ( + <Column padding="sm" gap="sm"> + <CheckboxInput {...args} /> + <CheckboxInput label="Checkbox input" {...args} /> + <CheckboxInput label="Checkbox input" checked={false} {...args} /> + <CheckboxInput label="Checkbox input" checked={true} {...args} /> + <CheckboxInput label="Checkbox input" checked={false} disabled {...args} /> + <CheckboxInput label="Checkbox input" checked={true} disabled {...args} /> + <CheckboxInput label="Checkbox input" description="With description" {...args} /> + </Column> +); diff --git a/src/react-components/input/InputField.scss b/src/react-components/input/InputField.scss index c287a8a940..2d373653ea 100644 --- a/src/react-components/input/InputField.scss +++ b/src/react-components/input/InputField.scss @@ -11,6 +11,7 @@ flex-direction: column; width: 100%; max-width: 300px; + white-space: break-spaces; } :local(.fullWidth) { diff --git a/src/react-components/input/RadioInput.js b/src/react-components/input/RadioInput.js index 323bc063c2..1cec005419 100644 --- a/src/react-components/input/RadioInput.js +++ b/src/react-components/input/RadioInput.js @@ -16,10 +16,10 @@ RadioInputContainer.propTypes = { children: PropTypes.node }; -export const RadioInputOption = forwardRef(({ label, description, className, ...rest }, ref) => ( +export const RadioInputOption = forwardRef(({ label, description, className, labelClassName, ...rest }, ref) => ( <label className={classNames(styles.option, className)}> <input className={styles.input} type="radio" ref={ref} {...rest} /> - <div className={styles.content}> + <div className={classNames(styles.content, labelClassName)}> <span className={styles.label}>{label}</span> {description && <span className={styles.description}>{description}</span>} </div> @@ -29,5 +29,6 @@ export const RadioInputOption = forwardRef(({ label, description, className, ... RadioInputOption.propTypes = { className: PropTypes.string, label: PropTypes.node.isRequired, - description: PropTypes.node + description: PropTypes.node, + labelClassName: PropTypes.string }; diff --git a/src/react-components/input/SelectInputField.js b/src/react-components/input/SelectInputField.js index 0592a77245..90452d4ae4 100644 --- a/src/react-components/input/SelectInputField.js +++ b/src/react-components/input/SelectInputField.js @@ -110,7 +110,7 @@ SelectInputField.propTypes = { PropTypes.string, PropTypes.number, PropTypes.shape({ - id: PropTypes.string.isRequired, + // id: PropTypes.string.isRequired, label: PropTypes.string, value: PropTypes.any.isRequired }) diff --git a/src/react-components/input/TextInput.js b/src/react-components/input/TextInput.js index 56bef2861f..215ddab731 100644 --- a/src/react-components/input/TextInput.js +++ b/src/react-components/input/TextInput.js @@ -10,7 +10,19 @@ import { handleTextFieldFocus, handleTextFieldBlur } from "../../utils/focus-uti export const TextInput = memo( forwardRef( ( - { id, disabled, invalid, className, beforeInput, afterInput, onFocus, onBlur, as: InputElement, ...rest }, + { + id, + disabled, + invalid, + className, + beforeInput, + afterInput, + onFocus, + onBlur, + textInputStyles, + as: InputElement, + ...rest + }, ref ) => { // TODO: This is REALLY bad. We're overriding default behavior of text inputs to get a fullscreen behavior to work on Firefox. @@ -45,7 +57,7 @@ export const TextInput = memo( <div className={styles.inputWrapper}> <InputElement id={id} - className={styles.textInput} + className={classNames(styles.textInput, textInputStyles)} disabled={disabled} onFocus={handleFocus} onBlur={handleBlur} @@ -73,6 +85,7 @@ TextInput.propTypes = { afterInput: PropTypes.node, onFocus: PropTypes.func, onBlur: PropTypes.func, + textInputStyles: PropTypes.string, as: PropTypes.elementType }; diff --git a/src/react-components/input/TextInput.scss b/src/react-components/input/TextInput.scss index faac690c01..a14039118f 100644 --- a/src/react-components/input/TextInput.scss +++ b/src/react-components/input/TextInput.scss @@ -34,6 +34,12 @@ $input-height: 40px; padding: 0 16px; border-width: 0; min-height: auto; + border: none; + + &:hover { + border:none; + } + :global(.keyboard-user) &:focus { border-width: 0; @@ -52,6 +58,7 @@ $input-height: 40px; border-bottom-right-radius: theme.$border-radius-regular; } } + } :local(.icon-button), & > svg { diff --git a/src/react-components/input/ToolbarButton.scss b/src/react-components/input/ToolbarButton.scss index 2af3f32583..e91de8e104 100644 --- a/src/react-components/input/ToolbarButton.scss +++ b/src/react-components/input/ToolbarButton.scss @@ -57,8 +57,8 @@ :local(.basic), :local(.transparent) { :local(.icon-container) { - border-color: theme.$lightgrey; - + border-color: theme.$toolbar-basic-border-color; + background-color: transparent; svg { *[stroke=\#000] { stroke: theme.$toolbar-basic-icon-color; @@ -71,7 +71,7 @@ } &:hover :local(.icon-container) { - border-color: theme.$basic-color-hover; + border: 1px solid theme.$toolbar-basic-border-color; background-color: theme.$basic-color-hover; } @@ -83,7 +83,16 @@ &:local(.selected) { :local(.icon-container) { border-color: transparent; - background-color: theme.$toolbar-basic-color; + background-color: theme.$toolbar-icon-selected-bg; + } + svg { + *[stroke=\#000] { + stroke: theme.$toolbar-basic-selected-icon-color; + } + + *[fill=\#000] { + fill: theme.$toolbar-basic-selected-icon-color; + } } label { @@ -124,15 +133,15 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$primary-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { - stroke: theme.$primary-color; + stroke: theme.$toolbar-basic-icon-color; } *[fill=\#000] { - fill: theme.$primary-color; + fill: theme.$toolbar-basic-icon-color; } } } @@ -144,6 +153,7 @@ &:hover { :local(.icon-container) { border-color: theme.$primary-color-hover; + background-color: theme.$toolbar-basic-color-hover; svg { *[stroke=\#000] { @@ -192,7 +202,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$accept-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -259,7 +269,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$cancel-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -313,6 +323,7 @@ :local(.accent1) { :local(.icon-container) { background-color: theme.$accent1-color; + border-color: theme.$accent1-border-color; } &:hover :local(.icon-container) { @@ -326,7 +337,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$accent1-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -340,7 +351,7 @@ } label { - color: theme.$accent1-color; + color: theme.$toolbar-label-accent1; } &:hover { @@ -380,6 +391,7 @@ :local(.accent2) { :local(.icon-container) { background-color: theme.$accent2-color; + border-color: theme.$accent2-border-color; } &:hover :local(.icon-container) { @@ -393,7 +405,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$accent2-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -407,7 +419,7 @@ } label { - color: theme.$accent2-color; + color: theme.$toolbar-label-accent2; } &:hover { @@ -447,6 +459,7 @@ :local(.accent3) { :local(.icon-container) { background-color: theme.$accent3-color; + border-color: theme.$accent3-border-color; } &:hover :local(.icon-container) { @@ -460,7 +473,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$accent3-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -474,7 +487,7 @@ } label { - color: theme.$accent3-color; + color: theme.$toolbar-label-accent3; } &:hover { @@ -514,7 +527,8 @@ :local(.accent4) { :local(.icon-container) { background-color: theme.$accent4-color; - } + border-color: theme.$accent4-border-color; + } &:hover :local(.icon-container) { background-color: theme.$accent4-color-hover; @@ -527,7 +541,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$accent4-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -541,7 +555,7 @@ } label { - color: theme.$accent4-color; + color: theme.$toolbar-label-accent4; } &:hover { @@ -581,6 +595,7 @@ :local(.accent5) { :local(.icon-container) { background-color: theme.$accent5-color; + border-color: theme.$accent5-border-color; } &:hover :local(.icon-container) { @@ -594,7 +609,7 @@ &:local(.selected) { :local(.icon-container) { border-color: theme.$accent5-color; - background-color: transparent; + background-color: theme.$toolbar-icon-selected-bg; svg { *[stroke=\#000] { @@ -608,7 +623,7 @@ } label { - color: theme.$accent5-color; + color: theme.$toolbar-label-accent5; } &:hover { @@ -630,7 +645,6 @@ &:active { :local(.icon-container) { border-color: theme.$accent5-color-pressed; - svg { *[stroke=\#000] { stroke: theme.$accent5-color-pressed; diff --git a/src/react-components/layout/CenteredModalWrapper.js b/src/react-components/layout/CenteredModalWrapper.js new file mode 100644 index 0000000000..0a74fcb8ed --- /dev/null +++ b/src/react-components/layout/CenteredModalWrapper.js @@ -0,0 +1,15 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Center } from "./Center"; +import classNames from "classnames"; +import styles from "./CenteredModalWrapper.scss"; + +export const CenteredModalWrapper = ({ children }) => ( + <div className={classNames(styles.fullscreen, styles.darken)}> + <Center>{children}</Center> + </div> +); + +CenteredModalWrapper.propTypes = { + children: PropTypes.node +}; diff --git a/src/react-components/layout/CenteredModalWrapper.scss b/src/react-components/layout/CenteredModalWrapper.scss new file mode 100644 index 0000000000..8667bb2296 --- /dev/null +++ b/src/react-components/layout/CenteredModalWrapper.scss @@ -0,0 +1,13 @@ +@use "../styles/theme.scss"; + +:local(.fullscreen) { + position: absolute; + width: 100%; + height: 100%; + top: 0px; + left: 0px; +} + +:local(.darken) { + background-color: rgba(0, 0, 0, 0.2); +} diff --git a/src/react-components/layout/Column.js b/src/react-components/layout/Column.js index 745caf844d..f74df5dc08 100644 --- a/src/react-components/layout/Column.js +++ b/src/react-components/layout/Column.js @@ -4,7 +4,10 @@ import classNames from "classnames"; import styles from "./Column.scss"; export const Column = forwardRef( - ({ as: Component, className, gap, padding, center, centerMd, grow, overflow, children, ...rest }, ref) => { + ( + { as: Component, lastChildMargin, className, gap, padding, center, centerMd, grow, overflow, children, ...rest }, + ref + ) => { const gapClass = gap === true ? styles.mdGap : styles[`${gap}Gap`]; const paddingClass = padding === true ? styles.lgPadding : styles[`${padding}Padding`]; @@ -22,7 +25,8 @@ export const Column = forwardRef( [styles.centerMd]: centerMd === true || centerMd === "horizontal" || centerMd === "both", [styles.centerVerticalMd]: centerMd === "vertical" || centerMd === "both", [styles.grow]: grow, - [styles.overflow]: overflow + [styles.overflow]: overflow, + [styles.margin0LastChild]: lastChildMargin }, className )} @@ -42,6 +46,7 @@ Column.propTypes = { centerMd: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), center: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), grow: PropTypes.bool, + lastChildMargin: PropTypes.bool, overflow: PropTypes.bool }; @@ -52,5 +57,6 @@ Column.defaultProps = { centerMd: false, padding: false, grow: false, - overflow: false + overflow: false, + lastChildMargin: true }; diff --git a/src/react-components/layout/Column.scss b/src/react-components/layout/Column.scss index 58056b7b3d..9a51a74261 100644 --- a/src/react-components/layout/Column.scss +++ b/src/react-components/layout/Column.scss @@ -77,6 +77,6 @@ overflow-y: auto; } -:local(.column) > :last-child { +:local(.margin-0-last-child) > :last-child { margin-bottom: 0; -} \ No newline at end of file +} diff --git a/src/react-components/layout/Divider.js b/src/react-components/layout/Divider.js new file mode 100644 index 0000000000..3fd4541244 --- /dev/null +++ b/src/react-components/layout/Divider.js @@ -0,0 +1,14 @@ +import React from "react"; +import PropTypes from "prop-types"; +import styles from "./Divider.scss"; +import styleUtils from "../styles/style-utils.scss"; +import classNames from "classnames"; + +export const Divider = ({ margin = false }) => { + const marginClass = margin === false ? "" : styleUtils[`${margin}MarginY`]; + return <div className={classNames(styles.divider, marginClass)} />; +}; + +Divider.propTypes = { + margin: PropTypes.oneOf(["xs", "sm", "md", "lg", "xl"]) +}; diff --git a/src/react-components/layout/Divider.scss b/src/react-components/layout/Divider.scss new file mode 100644 index 0000000000..6e4ae79b3b --- /dev/null +++ b/src/react-components/layout/Divider.scss @@ -0,0 +1,6 @@ +@use "../styles/theme.scss"; + +:local(.divider) { + border-top: 1px solid theme.$lightgrey; + width: 100%; +} diff --git a/src/react-components/layout/Footer.js b/src/react-components/layout/Footer.js index 6dbbb0f684..ccb4e5310e 100644 --- a/src/react-components/layout/Footer.js +++ b/src/react-components/layout/Footer.js @@ -15,7 +15,8 @@ export function Footer({ showCompanyLogo, companyLogoUrl, showDiscordBotLink, - appName + appName, + isHmc }) { return ( <footer> @@ -59,6 +60,20 @@ export function Footer({ </a> </li> )} + {isHmc && ( + <li> + <a target="_blank" rel="noopener noreferrer" href={"https://shop.spreadshirt.com/mozillaMR/"}> + <FormattedMessage id="footer.hubs-merch" defaultMessage="Hubs Merch" /> + </a> + </li> + )} + {isHmc && ( + <li> + <a target="_blank" rel="noopener noreferrer" href={"https://hubs.mozilla.com/docs/hubs-faq.html"}> + <FormattedMessage id="footer.FAQ" defaultMessage="FAQ" /> + </a> + </li> + )} {showTerms && ( <li> <a target="_blank" rel="noopener noreferrer" href={termsUrl}> @@ -99,5 +114,6 @@ Footer.propTypes = { showCompanyLogo: PropTypes.bool, companyLogoUrl: PropTypes.string, showDiscordBotLink: PropTypes.bool, - appName: PropTypes.string + appName: PropTypes.string, + isHmc: PropTypes.bool }; diff --git a/src/react-components/layout/Footer.scss b/src/react-components/layout/Footer.scss index e0338d14f7..c09979027b 100644 --- a/src/react-components/layout/Footer.scss +++ b/src/react-components/layout/Footer.scss @@ -8,6 +8,7 @@ footer { @media(min-width: theme.$breakpoint-lg) { padding: 0; + display: flex; } nav { @@ -78,6 +79,7 @@ footer { @media(min-width: theme.$breakpoint-lg) { margin-left: 18px; + height: 41px; } } diff --git a/src/react-components/layout/Header.js b/src/react-components/layout/Header.js index d9a4df4c5d..dac1d2979a 100644 --- a/src/react-components/layout/Header.js +++ b/src/react-components/layout/Header.js @@ -6,6 +6,8 @@ import { faCog } from "@fortawesome/free-solid-svg-icons/faCog"; import maskEmail from "../../utils/mask-email"; import styles from "./Header.scss"; import { Container } from "./Container"; +import { SocialBar } from "../home/SocialBar"; +import { SignInButton } from "../home/SignInButton"; export function Header({ appName, @@ -21,7 +23,8 @@ export function Header({ isAdmin, isSignedIn, email, - onSignOut + onSignOut, + isHmc }) { return ( <header> @@ -33,29 +36,24 @@ export function Header({ <img alt={appName} src={appLogo} /> </a> </li> - {showCloud && ( - <li> - <a href="/cloud"> - <FormattedMessage id="header.cloud" defaultMessage="Hubs Cloud" /> - </a> - </li> - )} {enableSpoke && ( <li> - <a href="/spoke">{editorName}</a> + <a href="/spoke"> + {isHmc ? <FormattedMessage id="header.spoke" defaultMessage="Spoke" /> : editorName} + </a> </li> )} {showDocsLink && ( <li> <a href={docsUrl}> - <FormattedMessage id="header.docs" defaultMessage="Docs" /> + <FormattedMessage id="header.docs" defaultMessage="Guides" /> </a> </li> )} {showSourceLink && ( <li> <a href="https://github.com/mozilla/hubs"> - <FormattedMessage id="header.source" defaultMessage="Source" /> + <FormattedMessage id="header.source" defaultMessage="Developers" /> </a> </li> )} @@ -66,6 +64,13 @@ export function Header({ </a> </li> )} + {showCloud && ( + <li> + <a href="/cloud"> + <FormattedMessage id="header.cloud" defaultMessage="Hubs Cloud" /> + </a> + </li> + )} {isAdmin && ( <li> <a href="/admin" rel="noreferrer noopener"> @@ -88,17 +93,16 @@ export function Header({ defaultMessage="Signed in as {email}" values={{ email: maskEmail(email) }} /> - </span>{" "} + </span> <a href="#" onClick={onSignOut}> <FormattedMessage id="header.sign-out" defaultMessage="Sign Out" /> </a> </div> ) : ( - <a href="/signin" rel="noreferrer noopener"> - <FormattedMessage id="header.sign-in" defaultMessage="Sign In" /> - </a> + <SignInButton /> )} </div> + {isHmc ? <SocialBar mobile /> : null} </Container> </header> ); @@ -118,5 +122,6 @@ Header.propTypes = { isAdmin: PropTypes.bool, isSignedIn: PropTypes.bool, email: PropTypes.string, - onSignOut: PropTypes.func + onSignOut: PropTypes.func, + isHmc: PropTypes.bool }; diff --git a/src/react-components/layout/Header.scss b/src/react-components/layout/Header.scss index 0d75c33f58..ecbaac12ee 100644 --- a/src/react-components/layout/Header.scss +++ b/src/react-components/layout/Header.scss @@ -2,7 +2,7 @@ header { display: block; - padding: 20px; + @media(min-width: theme.$breakpoint-lg) { padding: 0; @@ -24,6 +24,15 @@ header { } li { + &:first-child { + padding-top: 20px; + @media(min-width: theme.$breakpoint-lg) { + img { + width: 100%; + height: 100%; + } + } + } padding-top: 20px; @media(min-width: theme.$breakpoint-lg) { @@ -44,6 +53,7 @@ header { list-style: none; flex-direction: column; align-items: center; + justify-content: space-between; @media(min-width: theme.$breakpoint-lg) { justify-content: flex-end; @@ -66,14 +76,16 @@ header { :local(.home-link) { display: inline-block; - - img { + width: 124px; + height: 83px; + @media(min-width: theme.$breakpoint-lg) { + img { height: 32px; + } } } - :local(.sign-in) { - display: flex; + display: none; flex-direction: column; align-items: center; padding-top: 20px; @@ -86,9 +98,80 @@ header { } @media(min-width: theme.$breakpoint-lg) { + display: flex; flex-direction: row; justify-content: flex-end; flex: 1; padding-top: 0; } } + +:local(.nav-container) { + position: relative; + margin-bottom: -56px; + margin-top: 1rem; + z-index: 1; + display: flex; + align-content: center; + flex-direction: row; + justify-content: flex-start; + width: 100vw; + @media(min-width: theme.$breakpoint-lg) { + display: none; + } +} + +:local(.mobile-nav-wrapper) { + display: flex; + align-content: center; + flex-direction: row; + justify-content: space-around; + margin: auto; + max-width: 100%; + + header { + width: 100vw; + height: 220px; + margin-right: 42px; + padding: 0; + } + svg { + margin-left: 21px; + cursor: pointer; + *[fill]{ + fill: theme.$text1-color; + } + } + li:first-child { + padding-top: 0; + } + a { + font-size: 1.2rem; + } + + header { + visibility: hidden; + opacity: 0; + height: 0px; + transition: height .3s; + overflow: hidden; + } + + header.is-active { + opacity: 1; + height:280px; + visibility: visible; + transition: opacity .4s, visibility .4s, height .6s; + ul { + height:230px; + justify-content: space-between; + } + } + header.cloud { + height:230px; + ul { + height:200px; + justify-content: center; + } + } +} \ No newline at end of file diff --git a/src/react-components/layout/LoadingScreenLayout.js b/src/react-components/layout/LoadingScreenLayout.js index 32e77414e5..3298035900 100644 --- a/src/react-components/layout/LoadingScreenLayout.js +++ b/src/react-components/layout/LoadingScreenLayout.js @@ -2,12 +2,15 @@ import React from "react"; import PropTypes from "prop-types"; import styles from "./LoadingScreenLayout.scss"; import { Column } from "../layout/Column"; +import { ReactComponent as HmcLogo } from "../icons/HmcLogo.svg"; +import configs from "../../utils/configs"; export function LoadingScreenLayout({ center, bottom, logoSrc }) { + const isHmc = configs.feature("show_cloud"); return ( <div className={styles.loadingScreenLayout}> <Column center padding gap="lg" className={styles.center}> - <img className={styles.logo} src={logoSrc} /> + {isHmc ? <HmcLogo className="hmc-logo" /> : <img className={styles.logo} src={logoSrc} />} {center} </Column> {bottom && ( diff --git a/src/react-components/layout/MobileNav.js b/src/react-components/layout/MobileNav.js new file mode 100644 index 0000000000..9aeb5fc003 --- /dev/null +++ b/src/react-components/layout/MobileNav.js @@ -0,0 +1,94 @@ +import React, { useState } from "react"; +import PropTypes from "prop-types"; +import { FormattedMessage } from "react-intl"; +import styles from "./Header.scss"; +import { ReactComponent as Hamburger } from "../icons/Hamburger.svg"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faCog } from "@fortawesome/free-solid-svg-icons/faCog"; +export function MobileNav({ isHmc, showDocsLink, docsUrl, showSourceLink, showCommunityLink, communityUrl, isAdmin }) { + const [navOpen, setNav] = useState(false); + const toggleNav = () => { + setNav(!navOpen); + }; + const cloud = isHmc ? null : "cloud"; + + return ( + <> + <div className={styles.navContainer}> + <div className={styles.mobileNavWrapper}> + <Hamburger onClick={toggleNav} /> + <header className={`${navOpen ? `is-active ${cloud}` : "hide"}`}> + <nav role="navigation"> + <ul> + {isHmc && ( + <li> + <a href="/spoke"> + <FormattedMessage id="header.spoke" defaultMessage="Spoke" /> + </a> + </li> + )} + {showDocsLink && ( + <li> + <a href={docsUrl}> + <FormattedMessage id="header.docs" defaultMessage="Guides" /> + </a> + </li> + )} + {showSourceLink && ( + <li> + <a href="https://github.com/mozilla/hubs"> + <FormattedMessage id="header.source" defaultMessage="Developers" /> + </a> + </li> + )} + {showCommunityLink && ( + <li> + <a href={communityUrl}> + <FormattedMessage id="header.community" defaultMessage="Community" /> + </a> + </li> + )} + {isHmc && ( + <li> + <a href="/cloud"> + <FormattedMessage id="header.cloud" defaultMessage="Hubs Cloud" /> + </a> + </li> + )} + {isAdmin && ( + <li> + <a style={{ marginLeft: 0 }} href="/admin" rel="noreferrer noopener"> + <i> + <FontAwesomeIcon icon={faCog} /> + </i> +   + <FormattedMessage id="header.admin" defaultMessage="Admin" /> + </a> + </li> + )} + </ul> + </nav> + </header> + </div> + </div> + </> + ); +} + +MobileNav.propTypes = { + appName: PropTypes.string, + appLogo: PropTypes.string, + showCloud: PropTypes.bool, + enableSpoke: PropTypes.bool, + editorName: PropTypes.string, + showDocsLink: PropTypes.bool, + docsUrl: PropTypes.string, + showSourceLink: PropTypes.bool, + showCommunityLink: PropTypes.bool, + communityUrl: PropTypes.string, + isAdmin: PropTypes.bool, + isSignedIn: PropTypes.bool, + email: PropTypes.string, + onSignOut: PropTypes.func, + isHmc: PropTypes.bool +}; diff --git a/src/react-components/layout/Page.js b/src/react-components/layout/Page.js index f5876afdf1..6ef3e8cd01 100644 --- a/src/react-components/layout/Page.js +++ b/src/react-components/layout/Page.js @@ -3,6 +3,7 @@ import PropTypes from "prop-types"; import "./Page.scss"; import { Header } from "./Header"; import { Footer } from "./Footer"; +import { MobileNav } from "./MobileNav"; export function Page({ appLogo, @@ -28,6 +29,7 @@ export function Page({ companyLogoUrl, showDiscordBotLink, appName, + isHmc, children, ...rest }) { @@ -48,8 +50,21 @@ export function Page({ isSignedIn={isSignedIn} email={email} onSignOut={onSignOut} + isHmc={isHmc} /> - <main {...rest}>{children}</main> + <main {...rest}> + <MobileNav + enableSpoke={enableSpoke} + showDocsLink={showDocsLink} + showSourceLink={showSourceLink} + showCommunityLink={showCommunityLink} + isHmc={isHmc} + isAdmin={isAdmin} + docsUrl={docsUrl} + communityUrl={communityUrl} + /> + {children} + </main> <Footer hidePoweredBy={hidePoweredBy} showWhatsNewLink={showWhatsNewLink} @@ -61,6 +76,8 @@ export function Page({ companyLogoUrl={companyLogoUrl} showDiscordBotLink={showDiscordBotLink} appName={appName} + showCloud={showCloud} + isHmc={isHmc} /> </> ); @@ -90,5 +107,6 @@ Page.propTypes = { companyLogoUrl: PropTypes.string, showDiscordBotLink: PropTypes.bool, appName: PropTypes.string, + isHmc: PropTypes.bool, children: PropTypes.node }; diff --git a/src/react-components/layout/PageContainer.js b/src/react-components/layout/PageContainer.js index 2cbfdecc10..a06144811e 100644 --- a/src/react-components/layout/PageContainer.js +++ b/src/react-components/layout/PageContainer.js @@ -3,15 +3,17 @@ import PropTypes from "prop-types"; import { Page } from "./Page"; import { AuthContext } from "../auth/AuthContext"; import configs from "../../utils/configs"; +import { getAppLogo } from "../../utils/get-app-logo"; import { useAccessibleOutlineStyle } from "../input/useAccessibleOutlineStyle"; export function PageContainer({ children, ...rest }) { const auth = useContext(AuthContext); useAccessibleOutlineStyle(); - + //using show cloud as a proxy for if we are on hmc + const isHmc = configs.feature("show_cloud"); return ( <Page - appLogo={configs.image("logo")} + appLogo={getAppLogo()} showCloud={configs.feature("show_cloud")} enableSpoke={configs.feature("enable_spoke")} editorName={configs.translation("editor-name")} @@ -34,6 +36,7 @@ export function PageContainer({ children, ...rest }) { companyLogoUrl={configs.image("company_logo")} showDiscordBotLink={configs.feature("show_discord_bot_link")} appName={configs.translation("app-name")} + isHmc={isHmc} {...rest} > {children} diff --git a/src/react-components/layout/Row.js b/src/react-components/layout/Row.js new file mode 100644 index 0000000000..8075382f73 --- /dev/null +++ b/src/react-components/layout/Row.js @@ -0,0 +1,61 @@ +import React from "react"; +import PropTypes from "prop-types"; +import styles from "./Row.scss"; +import styleUtils from "../styles/style-utils.scss"; +import classNames from "classnames"; + +export const Row = ({ + children, + padding, + gap, + spaceBetween, + breakpointColumn, + topMargin, + flexClassName, + flexBasis, + noWrap = false, + childrenMarginR, + className +}) => { + const paddingClass = padding === true ? styleUtils.lgPadding : styleUtils[`${padding}Padding`]; + const gapClass = gap === true ? styleUtils.mdGap : styleUtils[`${gap}Gap`]; + const breakpointColumnClass = breakpointColumn === true ? "" : styles[`${breakpointColumn}BreakpointColumn`]; + const topMarginClass = topMargin ? styleUtils[`${topMargin}WrapMargin`] : ""; + const flexBasisClass = flexBasis ? styleUtils[`flexBasis${flexBasis}`] : ""; + const childrenMarginRClass = childrenMarginR ? styles[`${childrenMarginR}ChildrenMarginR`] : ""; + + return ( + <div className={classNames(paddingClass, gapClass, className)}> + <div + className={classNames( + styles.flexRow, + breakpointColumnClass, + topMarginClass, + childrenMarginRClass, + { + [styles.spaceBetween]: spaceBetween, + [styles.noFlexWrap]: noWrap + }, + flexClassName, + flexBasisClass + )} + > + {children} + </div> + </div> + ); +}; + +Row.propTypes = { + children: PropTypes.node, + padding: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), + gap: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), + topMargin: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), + breakpointColumn: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), + childrenMarginR: PropTypes.string, + spaceBetween: PropTypes.bool, + className: PropTypes.string, + flexClassName: PropTypes.string, + flexBasis: PropTypes.oneOf([10, 20, 30, 40, 50, 60, 70, 80, 90]), + noWrap: PropTypes.bool +}; diff --git a/src/react-components/layout/Row.scss b/src/react-components/layout/Row.scss new file mode 100644 index 0000000000..1fec43c820 --- /dev/null +++ b/src/react-components/layout/Row.scss @@ -0,0 +1,49 @@ +@use "../styles/theme.scss"; + +:local(.flex-row) { + flex-direction: row; + display: flex; + width: 100%; + align-items: center; + flex-wrap: wrap; +} + +:local(.space-between) { + justify-content: space-between; +} + +$breakpoints: ( + "sm": theme.$breakpoint-sm, + "md": theme.$breakpoint-md, +); + +@each $size, $breakpoint in $breakpoints { + // .sm-breakpoint-column + :local(.#{$size}-breakpoint-column) { + @media(max-width: $breakpoint) { + display: block; + } + } +} + +:local(.no-flex-wrap) { + flex-wrap: nowrap; +} + +$spacing: ( + "2xs": theme.$spacing-2xs, + "xs": theme.$spacing-xs, + "sm": theme.$spacing-sm, + "md": theme.$spacing-md, + "lg": theme.$spacing-lg, + "xl": theme.$spacing-xl +); + +@each $size, $theme-spacing in $spacing { + :local(.#{$size}-children-margin-r) > * { + margin-right: $theme-spacing; + } + :local(.#{$size}-children-margin-r) > :last-child { + margin-right: 0 + } +} diff --git a/src/react-components/layout/SpinWhileTrue.js b/src/react-components/layout/SpinWhileTrue.js new file mode 100644 index 0000000000..2721a117de --- /dev/null +++ b/src/react-components/layout/SpinWhileTrue.js @@ -0,0 +1,22 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Spinner } from "../misc/Spinner"; +import { Center } from "./Center"; + +export function SpinWhileTrue({ isSpinning, children }) { + return ( + <> + {isSpinning ? ( + <Center> + <Spinner /> + </Center> + ) : ( + <>{children}</> + )} + </> + ); +} + +SpinWhileTrue.propTypes = { + isSpinning: PropTypes.bool.isRequired +}; diff --git a/src/react-components/modal/Modal.js b/src/react-components/modal/Modal.js index fb44f6e228..0dc4bdcd25 100644 --- a/src/react-components/modal/Modal.js +++ b/src/react-components/modal/Modal.js @@ -3,13 +3,22 @@ import PropTypes from "prop-types"; import classNames from "classnames"; import styles from "./Modal.scss"; -export function Modal({ title, beforeTitle, afterTitle, children, contentClassName, className, disableFullscreen }) { +export function Modal({ + title, + titleNode, + beforeTitle, + afterTitle, + children, + contentClassName, + className, + disableFullscreen +}) { return ( <div className={classNames(styles.modal, { [styles.smFullscreen]: !disableFullscreen }, className)}> {(title || beforeTitle || afterTitle) && ( <div className={styles.header}> <div className={styles.beforeTitle}>{beforeTitle}</div> - <h5>{title}</h5> + {titleNode ? titleNode : <h5>{title}</h5>} <div className={styles.afterTitle}>{afterTitle}</div> </div> )} @@ -20,6 +29,7 @@ export function Modal({ title, beforeTitle, afterTitle, children, contentClassNa Modal.propTypes = { title: PropTypes.node, + titleNode: PropTypes.node, beforeTitle: PropTypes.node, afterTitle: PropTypes.node, children: PropTypes.node, diff --git a/src/react-components/photo-message.js b/src/react-components/photo-message.js index aafbeca847..a94bbbb15d 100644 --- a/src/react-components/photo-message.js +++ b/src/react-components/photo-message.js @@ -19,7 +19,7 @@ export default function PhotoMessage({ name, body: { src: url }, className, mayS title: intl.formatMessage( { id: "photo-message.default-tweet", - defaultMessage: "Taken in {shareHashtag}, join me at {url}" + defaultMessage: "Taken in {shareHashtag}" }, { shareHashtag: configs.translation("share-hashtag"), diff --git a/src/react-components/popover/ImageGridPopover.js b/src/react-components/popover/ImageGridPopover.js index 3ea9b48391..df127175ee 100644 --- a/src/react-components/popover/ImageGridPopover.js +++ b/src/react-components/popover/ImageGridPopover.js @@ -19,6 +19,8 @@ export function ImageGridPopover({ fullscreen, items, closePopover }) { closePopover(); }} + // crossOrigin: "anonymous" is a workaround for CORS error on Chrome. See #4400 + crossOrigin="anonymous" /> ); })} diff --git a/src/react-components/preferences-screen.js b/src/react-components/preferences-screen.js index 2afd4ab170..db62cbf262 100644 --- a/src/react-components/preferences-screen.js +++ b/src/react-components/preferences-screen.js @@ -11,6 +11,16 @@ import { defaultMaterialQualitySetting } from "../storage/store"; import { AVAILABLE_LOCALES } from "../assets/locales/locale_config"; import { themes } from "./styles/theme"; +export const CLIPPING_THRESHOLD_ENABLED = false; +export const CLIPPING_THRESHOLD_MIN = 0.0; +export const CLIPPING_THRESHOLD_MAX = 0.1; +export const CLIPPING_THRESHOLD_STEP = 0.001; +export const CLIPPING_THRESHOLD_DEFAULT = 0.015; +export const GLOBAL_VOLUME_MIN = 0; +export const GLOBAL_VOLUME_MAX = 200; +export const GLOBAL_VOLUME_STEP = 5; +export const GLOBAL_VOLUME_DEFAULT = 100; + function round(step, n) { return Math.round(n / step) * step; } @@ -480,9 +490,29 @@ const preferenceLabels = defineMessages({ id: "preferences-screen.preference.show-rtc-debug-panel", defaultMessage: "Show RTC Panel" }, + showAudioDebugPanel: { + id: "preferences-screen.preference.show-audio-debug-panel", + defaultMessage: "Show Audio Debug Panel" + }, + enableAudioClipping: { + id: "preferences-screen.preference.enable-audio-clipping", + defaultMessage: "Enable Audio Clipping" + }, + audioClippingThreshold: { + id: "preferences-screen.preference.audio-clipping-threshold", + defaultMessage: "Audio Clipping Threshold" + }, theme: { id: "preferences-screen.preference.theme", defaultMessage: "Theme" + }, + fastRoomSwitching: { + id: "preferences-screen.preference.fast-room-switching", + defaultMessage: "Enable Fast Room Switching" + }, + lazyLoadSceneMedia: { + id: "preferences-screen.preference.lazy-load-scene-media", + defaultMessage: "Enable Scene Media Lazy Loading" } }); @@ -954,11 +984,11 @@ class PreferencesScreen extends Component { { key: "globalVoiceVolume", prefType: PREFERENCE_LIST_ITEM_TYPE.NUMBER_WITH_RANGE, - min: 0, - max: 200, - step: 5, + min: GLOBAL_VOLUME_MIN, + max: GLOBAL_VOLUME_MAX, + step: GLOBAL_VOLUME_STEP, digits: 0, - defaultNumber: 100 + defaultNumber: GLOBAL_VOLUME_DEFAULT }, { key: "globalMediaVolume", @@ -987,7 +1017,23 @@ class PreferencesScreen extends Component { prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false, promptForRefresh: true - } + }, + { + key: "enableAudioClipping", + prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, + defaultBool: CLIPPING_THRESHOLD_ENABLED, + promptForRefresh: false + }, + { + key: "audioClippingThreshold", + prefType: PREFERENCE_LIST_ITEM_TYPE.NUMBER_WITH_RANGE, + min: CLIPPING_THRESHOLD_MIN, + max: CLIPPING_THRESHOLD_MAX, + step: CLIPPING_THRESHOLD_STEP, + digits: 3, + defaultNumber: 0.015 + }, + { key: "showAudioDebugPanel", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false } ] ], [ @@ -1046,6 +1092,8 @@ class PreferencesScreen extends Component { { key: "disableAutoPixelRatio", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, { key: "allowMultipleHubsInstances", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, { key: "disableIdleDetection", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, + { key: "fastRoomSwitching", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, + { key: "lazyLoadSceneMedia", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, { key: "preferMobileObjectInfoPanel", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, { key: "animateWaypointTransitions", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: true }, { key: "showFPSCounter", prefType: PREFERENCE_LIST_ITEM_TYPE.CHECK_BOX, defaultBool: false }, diff --git a/src/react-components/room/ChatSidebar.js b/src/react-components/room/ChatSidebar.js index a366d6bf2a..f1809c6a0d 100644 --- a/src/react-components/room/ChatSidebar.js +++ b/src/react-components/room/ChatSidebar.js @@ -74,21 +74,44 @@ export function MessageAttachmentButton(props) { ); } -export function ChatInput(props) { +export function ChatLengthWarning({ messageLength, maxLength }) { + return ( + <p + className={classNames(styles.chatInputWarning, { + [styles.warningTextColor]: messageLength > maxLength + })} + > + <FormattedMessage id="chat-message-input.warning-max-characters" defaultMessage="Max characters" /> + {` (${messageLength}/${maxLength})`} + </p> + ); +} + +ChatLengthWarning.propTypes = { + messageLength: PropTypes.number, + maxLength: PropTypes.number +}; + +export function ChatInput({ warning, isOverMaxLength, ...props }) { const intl = useIntl(); return ( <div className={styles.chatInputContainer}> <TextAreaInput + textInputStyles={styles.chatInputTextAreaStyles} + className={classNames({ [styles.warningBorder]: isOverMaxLength })} placeholder={intl.formatMessage({ id: "chat-sidebar.input.placeholder", defaultMessage: "Message..." })} {...props} /> + {warning} </div> ); } ChatInput.propTypes = { - onSpawn: PropTypes.func + onSpawn: PropTypes.func, + warning: PropTypes.node, + isOverMaxLength: PropTypes.bool }; const enteredMessages = defineMessages({ @@ -120,7 +143,9 @@ export const LogMessageType = { audioNormalizationNaN: "audioNormalizationNaN", invalidAudioNormalizationRange: "invalidAudioNormalizationRange", audioSuspended: "audioSuspended", - audioResumed: "audioResumed" + audioResumed: "audioResumed", + joinFailed: "joinFailed", + avatarChanged: "avatarChanged" }; const logMessages = defineMessages({ @@ -200,6 +225,14 @@ const logMessages = defineMessages({ [LogMessageType.audioResumed]: { id: "chat-sidebar.log-message.audio-resumed", defaultMessage: "Audio has been resumed." + }, + [LogMessageType.joinFailed]: { + id: "chat-sidebar.log-message.join-failed", + defaultMessage: "Failed to join room: {message}" + }, + [LogMessageType.avatarChanged]: { + id: "chat-sidebar.log-message.avatar-changed", + defaultMessage: "Your avatar has been changed." } }); @@ -242,6 +275,14 @@ export function formatSystemMessage(entry, intl) { values={{ name: <b>{entry.name}</b>, hubName: <b>{entry.hubName}</b> }} /> ); + case "hub_changed": + return ( + <FormattedMessage + id="chat-sidebar.system-message.hub-change" + defaultMessage="You are now in {hubName}" + values={{ hubName: <b>{entry.hubName}</b> }} + /> + ); case "log": return intl.formatMessage(logMessages[entry.messageType], entry.props); default: @@ -254,6 +295,7 @@ export function SystemMessage(props) { return ( <li className={classNames(styles.messageGroup, styles.systemMessage)}> + {props.showLineBreak && <hr />} <p className={styles.messageGroupLabel}> <i>{formatSystemMessage(props, intl)}</i> <span> @@ -265,7 +307,8 @@ export function SystemMessage(props) { } SystemMessage.propTypes = { - timestamp: PropTypes.any + timestamp: PropTypes.any, + showLineBreak: PropTypes.bool }; function MessageBubble({ media, monospace, emoji, children }) { @@ -351,6 +394,7 @@ export function ChatSidebar({ onClose, title, children, ...rest }) { title={title || <FormattedMessage id="chat-sidebar.title" defaultMessage="Chat" />} beforeTitle={<CloseButton onClick={onClose} />} contentClassName={styles.content} + disableOverflowScroll {...rest} > {children} diff --git a/src/react-components/room/ChatSidebar.scss b/src/react-components/room/ChatSidebar.scss index d2f2eae51f..528eb515e5 100644 --- a/src/react-components/room/ChatSidebar.scss +++ b/src/react-components/room/ChatSidebar.scss @@ -1,8 +1,9 @@ @use "../styles/theme.scss"; :local(.chat-input-container) { - padding: 0 16px 8px 16px; + padding: 8px 16px; background-color: theme.$input-bg-color; + flex-basis: max-content; } :local(.message-list) { @@ -23,7 +24,7 @@ padding-top: 16px; &:last-child { - padding-bottom: 16px; + padding-bottom: 8px; } } @@ -121,4 +122,20 @@ fill: theme.$input-icon-color; } } -} \ No newline at end of file +} + +:local(.chat-input-warning) { + padding-top: theme.$spacing-2xs; +} + +:local(.warning-border) { + border: 2px solid theme.$red !important; +} + +:local(.warning-text-color) { + color: theme.$red; +} + +:local(.chat-input-text-area-styles) { + max-height: 50vh; +} diff --git a/src/react-components/room/ChatSidebarContainer.js b/src/react-components/room/ChatSidebarContainer.js index 4b4871d48c..4cc356974e 100644 --- a/src/react-components/room/ChatSidebarContainer.js +++ b/src/react-components/room/ChatSidebarContainer.js @@ -10,12 +10,14 @@ import { SpawnMessageButton, ChatToolbarButton, SendMessageButton, - EmojiPickerPopoverButton + EmojiPickerPopoverButton, + ChatLengthWarning } from "./ChatSidebar"; import { useMaintainScrollPosition } from "../misc/useMaintainScrollPosition"; import { spawnChatMessage } from "../chat-message"; import { discordBridgesForPresences } from "../../utils/phoenix-utils"; import { useIntl } from "react-intl"; +import { MAX_MESSAGE_LENGTH } from "../../utils/chat-message"; const ChatContext = createContext({ messageGroups: [], sendMessage: () => {} }); @@ -76,6 +78,7 @@ function updateMessageGroups(messageGroups, newMessage) { case "display_name_changed": case "scene_changed": case "hub_name_changed": + case "hub_changed": case "log": return [ ...messageGroups, @@ -168,8 +171,10 @@ export function ChatSidebarContainer({ scene, canSpawnMessages, presences, occup e => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); - sendMessage(e.target.value); - setMessage(""); + if (e.target.value.length <= MAX_MESSAGE_LENGTH) { + sendMessage(e.target.value); + setMessage(""); + } } }, [sendMessage, setMessage] @@ -177,7 +182,7 @@ export function ChatSidebarContainer({ scene, canSpawnMessages, presences, occup const onSendMessage = useCallback( () => { - sendMessage(message); + sendMessage(message.substring(0, MAX_MESSAGE_LENGTH)); setMessage(""); }, [message, sendMessage, setMessage] @@ -251,6 +256,7 @@ export function ChatSidebarContainer({ scene, canSpawnMessages, presences, occup } const isMobile = AFRAME.utils.device.isMobile(); + const isOverMaxLength = message.length > MAX_MESSAGE_LENGTH; return ( <ChatSidebar onClose={onClose}> <ChatMessageList ref={listRef} onScroll={onScrollList}> @@ -268,6 +274,14 @@ export function ChatSidebarContainer({ scene, canSpawnMessages, presences, occup onChange={e => setMessage(e.target.value)} placeholder={placeholder} value={message} + isOverMaxLength={isOverMaxLength} + warning={ + <> + {message.length + 50 > MAX_MESSAGE_LENGTH && ( + <ChatLengthWarning messageLength={message.length} maxLength={MAX_MESSAGE_LENGTH} /> + )} + </> + } afterInput={ <> {!isMobile && ( @@ -276,9 +290,11 @@ export function ChatSidebarContainer({ scene, canSpawnMessages, presences, occup {message.length === 0 && canSpawnMessages ? ( <MessageAttachmentButton onChange={onUploadAttachments} /> ) : ( - <SendMessageButton onClick={onSendMessage} disabled={message.length === 0} /> + <SendMessageButton onClick={onSendMessage} disabled={message.length === 0 || isOverMaxLength} /> + )} + {canSpawnMessages && ( + <SpawnMessageButton disabled={message.length === 0 || isOverMaxLength} onClick={onSpawnMessage} /> )} - {canSpawnMessages && <SpawnMessageButton disabled={message.length === 0} onClick={onSpawnMessage} />} </> } /> diff --git a/src/react-components/room/ContentMenu.js b/src/react-components/room/ContentMenu.js index 5fd1aff822..d00623fb2a 100644 --- a/src/react-components/room/ContentMenu.js +++ b/src/react-components/room/ContentMenu.js @@ -38,13 +38,17 @@ export function PeopleMenuButton(props) { <ContentMenuButton {...props}> <PeopleIcon /> <span> - <FormattedMessage id="content-menu.people-menu-button" defaultMessage="People" />({props.presenceCount}) + <FormattedMessage + id="content-menu.people-menu-button" + defaultMessage="People ({presenceCount})" + values={{ presenceCount: props.presencecount }} + /> </span> </ContentMenuButton> ); } PeopleMenuButton.propTypes = { - presenceCount: PropTypes.number + presencecount: PropTypes.number }; export function ContentMenu({ children }) { diff --git a/src/react-components/room/EmojiPicker.scss b/src/react-components/room/EmojiPicker.scss index 8d40da0434..ccc0819904 100644 --- a/src/react-components/room/EmojiPicker.scss +++ b/src/react-components/room/EmojiPicker.scss @@ -10,7 +10,7 @@ .emoji-mart { font-size: 16px; display: inline-block; - color: #222427; + color: theme.$text1-color; --tab-highlight-color: #{theme.$blue}; @media (max-width: theme.$breakpoint-md) { width: 95% !important; /* leave room for scrollbar */ @@ -112,8 +112,13 @@ width: 100%; padding: 5px 25px 6px 10px; border-radius: 5px; - border: 1px solid #d9d9d9; + border: 1px solid theme.$input-border-color; outline: 0; + background-color: theme.$background1-color; + :focus { + border-color: theme.$input-outline-color; + box-shadow: 0 0 0 2px theme.$input-outline-color; + } } .emoji-mart-search input, @@ -168,8 +173,8 @@ width: 100%; font-weight: 500; padding: 5px 6px; - background-color: #fff; - background-color: rgba(255, 255, 255, 0.95); + background-color: theme.$background1-color; + } .emoji-mart-category-list { diff --git a/src/react-components/room/LoadingScreen.js b/src/react-components/room/LoadingScreen.js index 02a99342ae..756fa25331 100644 --- a/src/react-components/room/LoadingScreen.js +++ b/src/react-components/room/LoadingScreen.js @@ -3,10 +3,8 @@ import PropTypes from "prop-types"; import { LoadingScreenLayout } from "../layout/LoadingScreenLayout"; import { Spinner } from "../misc/Spinner"; import { useRandomMessageTransition } from "./useRandomMessageTransition"; - export function LoadingScreen({ logoSrc, message, infoMessages }) { const infoMessage = useRandomMessageTransition(infoMessages); - return ( <LoadingScreenLayout logoSrc={logoSrc} diff --git a/src/react-components/room/MoreMenuPopover.scss b/src/react-components/room/MoreMenuPopover.scss index b3a3fa582e..0a6a716d75 100644 --- a/src/react-components/room/MoreMenuPopover.scss +++ b/src/react-components/room/MoreMenuPopover.scss @@ -117,6 +117,16 @@ button:local(.more-menu-item-target) { background-color: theme.$button-bg-color-pressed; } + svg { + *[stroke=\#000] { + stroke: theme.$text1-color; + } + + *[fill=\#000] { + fill: theme.$text1-color; + } + } + @media(min-width: theme.$breakpoint-lg) { display: none; } diff --git a/src/react-components/room/RoomEntryModal.js b/src/react-components/room/RoomEntryModal.js index da70d4ee77..2c45f84ebf 100644 --- a/src/react-components/room/RoomEntryModal.js +++ b/src/react-components/room/RoomEntryModal.js @@ -8,12 +8,14 @@ import { ReactComponent as VRIcon } from "../icons/VR.svg"; import { ReactComponent as ShowIcon } from "../icons/Show.svg"; import { ReactComponent as SettingsIcon } from "../icons/Settings.svg"; import { ReactComponent as WMIcon } from "../icons/wm-icon.svg"; +import { ReactComponent as HmcLogo } from "../icons/HmcLogo.svg"; import styles from "./RoomEntryModal.scss"; import styleUtils from "../styles/style-utils.scss"; import { useCssBreakpoints } from "react-use-css-breakpoints"; import { Column } from "../layout/Column"; import { FormattedMessage } from "react-intl"; import { ImmersIcon } from "./ImmersReact"; +import configs from "../../utils/configs"; export function RoomEntryModal({ appName, @@ -38,13 +40,14 @@ export function RoomEntryModal({ ...rest }) { const breakpoint = useCssBreakpoints(); + const isHmc = configs.feature("show_cloud"); return ( <Modal className={classNames(styles.roomEntryModal, className)} disableFullscreen {...rest}> <Column center className={styles.content}> {breakpoint !== "sm" && breakpoint !== "md" && ( <div className={styles.logoContainer}> - <img src={logoSrc} alt={appName} /> + {isHmc ? <HmcLogo className="hmc-logo" /> : <img src={logoSrc} alt={appName} />} </div> )} <div className={styles.roomName}> diff --git a/src/react-components/room/RoomSidebar.js b/src/react-components/room/RoomSidebar.js index 5f78781427..a1da270a06 100644 --- a/src/react-components/room/RoomSidebar.js +++ b/src/react-components/room/RoomSidebar.js @@ -18,9 +18,7 @@ function SceneAttribution({ attribution }) { const author = attribution.author || unknown; if (attribution.url) { - const source = attribution.url.includes("sketchfab.com") - ? "Sketchfab" - : null; + const source = attribution.url.includes("sketchfab.com") ? "Sketchfab" : null; return ( <li className={styles.attribution}> @@ -82,7 +80,7 @@ export function SceneInfo({ accountId, scene, showAttributions, canChangeScene, <Button preset="primary" onClick={onChangeScene}> <FormattedMessage id="room-sidebar.scene-info.change-scene-button" defaultMessage="Change Scene" /> </Button> - ) + ); if (!scene) return changeSceneButton; const showSceneLink = allowDisplayOfSceneLink(accountId, scene); const attributions = (scene.attributions && scene.attributions.content) || []; diff --git a/src/react-components/room/TipContainer.js b/src/react-components/room/TipContainer.js index cc1dbda79a..d7f7ca6def 100644 --- a/src/react-components/room/TipContainer.js +++ b/src/react-components/room/TipContainer.js @@ -14,12 +14,18 @@ let turnRightKey = "E"; // TODO The API to map from physical key to character is experimental. Depending on prospects of this getting wider // implimentation we may want to cook up our own polyfill based on observing key inputs if (window.navigator.keyboard !== undefined && window.navigator.keyboard.getLayoutMap) { - window.navigator.keyboard.getLayoutMap().then(function(map) { - moveKeys = `${map.get("KeyW") || "W"} ${map.get("KeyA") || "A"} ${map.get("KeyS") || "S"} ${map.get("KeyD") || - "D"}`.toUpperCase(); - turnLeftKey = map.get("KeyQ")?.toUpperCase(); - turnRightKey = map.get("KeyE")?.toUpperCase(); - }); + window.navigator.keyboard + .getLayoutMap() + .then(function(map) { + moveKeys = `${map.get("KeyW") || "W"} ${map.get("KeyA") || "A"} ${map.get("KeyS") || "S"} ${map.get("KeyD") || + "D"}`.toUpperCase(); + turnLeftKey = map.get("KeyQ")?.toUpperCase(); + turnRightKey = map.get("KeyE")?.toUpperCase(); + }) + .catch(function(e) { + // This occurs on Chrome 93 when the Hubs page is in an iframe + console.warn(`Unable to remap keyboard: ${e}`); + }); } const onboardingMessages = defineMessages({ diff --git a/src/react-components/room/TweetModalContainer.js b/src/react-components/room/TweetModalContainer.js index 0b866b3dae..e3d1341649 100644 --- a/src/react-components/room/TweetModalContainer.js +++ b/src/react-components/room/TweetModalContainer.js @@ -4,7 +4,7 @@ import { TweetEditorModalContainer } from "./TweetEditorModalContainer"; import { TwitterOAuthModalContainer } from "./TwitterOAuthModalContainer"; import configs from "../../utils/configs"; -export function TweetModalContainer({ hubChannel, initialTweet, mediaUrl, contentSubtype, onClose }) { +export function TweetModalContainer({ hubChannel, initialTweet, mediaUrl, contentSubtype, onClose, isAdmin }) { const [canTweet, setCanTweet] = useState(hubChannel.can("tweet")); const onConnected = useCallback(() => { @@ -27,6 +27,7 @@ export function TweetModalContainer({ hubChannel, initialTweet, mediaUrl, conten hubChannel={hubChannel} onConnected={onConnected} onClose={onClose} + isAdmin={isAdmin} /> ); } @@ -37,5 +38,6 @@ TweetModalContainer.propTypes = { initialTweet: PropTypes.string, mediaUrl: PropTypes.string, contentSubtype: PropTypes.string, - onClose: PropTypes.func + onClose: PropTypes.func, + isAdmin: PropTypes.bool }; diff --git a/src/react-components/room/TwitterOAuthModalContainer.js b/src/react-components/room/TwitterOAuthModalContainer.js index a7d07f1f92..754bf3f663 100644 --- a/src/react-components/room/TwitterOAuthModalContainer.js +++ b/src/react-components/room/TwitterOAuthModalContainer.js @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import { TwitterOAuthModal } from "./TwitterOAuthModal"; import configs from "../../utils/configs"; -export function TwitterOAuthModalContainer({ hubChannel, onConnected, onClose }) { +export function TwitterOAuthModalContainer({ hubChannel, onConnected, onClose, isAdmin }) { const popupRef = useRef(); const onConnect = useCallback( @@ -31,9 +31,15 @@ export function TwitterOAuthModalContainer({ hubChannel, onConnected, onClose }) popupRef.current = popup; } catch (error) { console.error(error); + if (error.message === "twitter_api_error" && isAdmin) { + console.warn( + "Twitter might be misconfigured for Hubs Cloud. Check the docs here: https://hubs.mozilla.com/docs/hubs-cloud-third-party-integrations.html#twitter" + ); + } + onClose(); } }, - [hubChannel] + [hubChannel, isAdmin, onClose] ); useEffect( @@ -41,7 +47,6 @@ export function TwitterOAuthModalContainer({ hubChannel, onConnected, onClose }) function onMessage({ data }) { if (data === "oauth-successful") { onConnected(); - popupRef.current.close(); popupRef.current = null; delete window.doingTwitterOAuth; window.removeEventListener("message", onMessage); @@ -68,5 +73,6 @@ export function TwitterOAuthModalContainer({ hubChannel, onConnected, onClose }) TwitterOAuthModalContainer.propTypes = { hubChannel: PropTypes.object.isRequired, onConnected: PropTypes.func.isRequired, - onClose: PropTypes.func + onClose: PropTypes.func, + isAdmin: PropTypes.bool }; diff --git a/src/react-components/room/object-hooks.js b/src/react-components/room/object-hooks.js index ea8c0a6b61..7f95dc304a 100644 --- a/src/react-components/room/object-hooks.js +++ b/src/react-components/room/object-hooks.js @@ -39,8 +39,7 @@ export function usePinObject(hubChannel, scene, object) { () => { const el = object.el; if (!NAF.utils.isMine(el) && !NAF.utils.takeOwnership(el)) return; - el.setAttribute("pinnable", "pinned", true); - el.emit("pinned", { el }); + window.APP.pinningHelper.setPinned(el, true); }, [object] ); @@ -49,8 +48,7 @@ export function usePinObject(hubChannel, scene, object) { () => { const el = object.el; if (!NAF.utils.isMine(el) && !NAF.utils.takeOwnership(el)) return; - el.setAttribute("pinnable", "pinned", false); - el.emit("unpinned", { el }); + window.APP.pinningHelper.setPinned(el, false); }, [object] ); @@ -73,10 +71,9 @@ export function usePinObject(hubChannel, scene, object) { function onPinStateChanged() { setIsPinned(getPinnedState(el)); } - el.addEventListener("pinned", onPinStateChanged); el.addEventListener("unpinned", onPinStateChanged); - + setIsPinned(getPinnedState(el)); return () => { el.removeEventListener("pinned", onPinStateChanged); el.removeEventListener("unpinned", onPinStateChanged); diff --git a/src/react-components/room/useMicrophone.js b/src/react-components/room/useMicrophone.js index 014ec234c9..6e2d08a912 100644 --- a/src/react-components/room/useMicrophone.js +++ b/src/react-components/room/useMicrophone.js @@ -3,7 +3,7 @@ import MovingAverage from "moving-average"; export function useMicrophone(scene, updateRate = 50) { const movingAvgRef = useRef(); - const [isMuted, setIsMuted] = useState(scene.is("muted")); + const [isMuted, setIsMuted] = useState(!APP.dialog.isMicEnabled); const [volume, setVolume] = useState(0); useEffect( @@ -29,30 +29,23 @@ export function useMicrophone(scene, updateRate = 50) { updateMicVolume(); - function onSceneStateChange(event) { - if (event.detail === "muted") { - setIsMuted(scene.is("muted")); - } - } + const onMicStateChanged = ({ enabled }) => { + setIsMuted(!enabled); + }; - scene.addEventListener("stateadded", onSceneStateChange); - scene.addEventListener("stateremoved", onSceneStateChange); + APP.dialog.on("mic-state-changed", onMicStateChanged); return () => { clearTimeout(timeout); - scene.removeEventListener("stateadded", onSceneStateChange); - scene.removeEventListener("stateremoved", onSceneStateChange); + APP.dialog.off("mic-state-changed", onMicStateChanged); }; }, [setVolume, scene, updateRate] ); - const toggleMute = useCallback( - () => { - scene.emit("action_mute"); - }, - [scene] - ); + const toggleMute = useCallback(() => { + APP.dialog.toggleMicrophone(); + }, []); return { isMuted, volume, toggleMute }; } diff --git a/src/react-components/room/useObjectList.js b/src/react-components/room/useObjectList.js index f2ed06e7e0..81e3fd3d41 100644 --- a/src/react-components/room/useObjectList.js +++ b/src/react-components/room/useObjectList.js @@ -26,11 +26,7 @@ function getDisplayString(el) { } const firstPart = - url.indexOf("sketchfab.com") !== -1 - ? "Sketchfab" - : url.indexOf("youtube.com") !== -1 - ? "YouTube" - : lessHost; + url.indexOf("sketchfab.com") !== -1 ? "Sketchfab" : url.indexOf("youtube.com") !== -1 ? "YouTube" : lessHost; return `${firstPart} ... ${resourceName.substr(0, 4)}`; } diff --git a/src/react-components/room/useResizeViewport.js b/src/react-components/room/useResizeViewport.js index b836e97108..e4256482ac 100644 --- a/src/react-components/room/useResizeViewport.js +++ b/src/react-components/room/useResizeViewport.js @@ -66,8 +66,8 @@ export function useResizeViewport(viewportRef, store, scene) { useEffect( () => { const observer = new ResizeObserver(entries => { - const isPresenting = scene.renderer.vr.isPresenting(); - const isVRPresenting = scene.renderer.vr.enabled && isPresenting; + const isPresenting = scene.renderer.xr.isPresenting; + const isVRPresenting = scene.renderer.xr.enabled && isPresenting; // Do not update renderer, if a camera or a canvas have not been injected. // In VR mode, three handles canvas resize based on the dimensions returned by diff --git a/src/react-components/room/useRoomLoadingState.js b/src/react-components/room/useRoomLoadingState.js index 92d79167a5..ee20a6cf98 100644 --- a/src/react-components/room/useRoomLoadingState.js +++ b/src/react-components/room/useRoomLoadingState.js @@ -14,18 +14,38 @@ function reducer(state, action) { loading: !(state.environmentLoaded && state.networkConnected), messageKey: state.environmentLoaded ? "enteringRoom" : "loadingObjects" }; - case "environment-loaded": + case "environment-loaded": { + const loaded = state.lazyLoadMedia + ? state.networkConnected && state.dialogConnected + : state.allObjectsLoaded && state.networkConnected && state.dialogConnected; return { ...state, environmentLoaded: true, - loading: !(state.allObjectsLoaded && state.networkConnected), - messageKey: state.allObjectsLoaded ? "enteringRoom" : "loadingObjects" + loading: !loaded, + messageKey: state.lazyLoadMedia + ? loaded + ? "enteringRoom" + : "connectingScene" + : loaded + ? "enteringRoom" + : "loadingObjects" }; + } case "network-connected": return { ...state, networkConnected: true, - loading: !(state.environmentLoaded && state.allObjectsLoaded) + loading: state.lazyLoadMedia + ? !(state.environmentLoaded && state.dialogConnected) + : !(state.environmentLoaded && state.allObjectsLoaded && state.dialogConnected) + }; + case "dialog-connected": + return { + ...state, + dialogConnected: true, + loading: state.lazyLoadMedia + ? !(state.environmentLoaded && state.networkConnected) + : !(state.environmentLoaded && state.allObjectsLoaded && state.networkConnected) }; } } @@ -42,6 +62,11 @@ const messages = defineMessages({ description: "The loading progress. How many objects have finished loading?", defaultMessage: "Loading objects {loadedCount}/{objectCount}" }, + connectingScene: { + id: "loading-screen.connecting", + description: "The scene is loaded, we are waiting for the networked scene to be connected to enter.", + defaultMessage: "Connecting to the scene..." + }, enteringRoom: { id: "loading-screen.entering-room", description: @@ -53,6 +78,7 @@ const messages = defineMessages({ export function useRoomLoadingState(sceneEl) { // Holds the id of the current const loadingTimeoutRef = useRef(); + const lazyLoadMedia = APP.store.state.preferences.lazyLoadSceneMedia; const [{ loading, messageKey, objectCount, loadedCount }, dispatch] = useReducer(reducer, { loading: !sceneEl.is("loaded"), @@ -61,7 +87,9 @@ export function useRoomLoadingState(sceneEl) { loadedCount: 0, allObjectsLoaded: false, environmentLoaded: false, - networkConnected: false + networkConnected: false, + dialogConnected: false, + lazyLoadMedia }); const onObjectLoading = useCallback( @@ -103,35 +131,61 @@ export function useRoomLoadingState(sceneEl) { [dispatch] ); + const onDialogConnected = useCallback( + () => { + dispatch({ type: "dialog-connected" }); + }, + [dispatch] + ); + useEffect( () => { // Once the scene has loaded the dependencies to this hook will change, // the event listeners will be removed, and we can prevent adding them again. if (loading) { - sceneEl.addEventListener("model-loading", onObjectLoading); - sceneEl.addEventListener("image-loading", onObjectLoading); - sceneEl.addEventListener("pdf-loading", onObjectLoading); - sceneEl.addEventListener("model-loaded", onObjectLoaded); - sceneEl.addEventListener("image-loaded", onObjectLoaded); - sceneEl.addEventListener("pdf-loaded", onObjectLoaded); - sceneEl.addEventListener("model-error", onObjectLoaded); + if (!lazyLoadMedia) { + sceneEl.addEventListener("model-loading", onObjectLoading); + sceneEl.addEventListener("image-loading", onObjectLoading); + sceneEl.addEventListener("pdf-loading", onObjectLoading); + sceneEl.addEventListener("video-loading", onObjectLoading); + sceneEl.addEventListener("model-loaded", onObjectLoaded); + sceneEl.addEventListener("image-loaded", onObjectLoaded); + sceneEl.addEventListener("pdf-loaded", onObjectLoaded); + sceneEl.addEventListener("video-loaded", onObjectLoaded); + sceneEl.addEventListener("model-error", onObjectLoaded); + } sceneEl.addEventListener("environment-scene-loaded", onEnvironmentLoaded); sceneEl.addEventListener("didConnectToNetworkedScene", onNetworkConnected); + sceneEl.addEventListener("didConnectToDialog", onDialogConnected); } return () => { - sceneEl.removeEventListener("model-loading", onObjectLoading); - sceneEl.removeEventListener("image-loading", onObjectLoading); - sceneEl.removeEventListener("pdf-loading", onObjectLoading); - sceneEl.removeEventListener("model-loaded", onObjectLoaded); - sceneEl.removeEventListener("image-loaded", onObjectLoaded); - sceneEl.removeEventListener("pdf-loaded", onObjectLoaded); - sceneEl.removeEventListener("model-error", onObjectLoaded); + if (!lazyLoadMedia) { + sceneEl.removeEventListener("model-loading", onObjectLoading); + sceneEl.removeEventListener("image-loading", onObjectLoading); + sceneEl.removeEventListener("pdf-loading", onObjectLoading); + sceneEl.removeEventListener("video-loading", onObjectLoading); + sceneEl.removeEventListener("model-loaded", onObjectLoaded); + sceneEl.removeEventListener("image-loaded", onObjectLoaded); + sceneEl.removeEventListener("pdf-loaded", onObjectLoaded); + sceneEl.removeEventListener("video-loaded", onObjectLoaded); + sceneEl.removeEventListener("model-error", onObjectLoaded); + } sceneEl.removeEventListener("environment-scene-loaded", onEnvironmentLoaded); sceneEl.removeEventListener("didConnectToNetworkedScene", onNetworkConnected); + sceneEl.removeEventListener("didConnectToDialog", onDialogConnected); }; }, - [sceneEl, loading, onObjectLoaded, onObjectLoading, onEnvironmentLoaded, onNetworkConnected] + [ + sceneEl, + loading, + onObjectLoaded, + onObjectLoading, + onEnvironmentLoaded, + onNetworkConnected, + onDialogConnected, + lazyLoadMedia + ] ); const intl = useIntl(); diff --git a/src/react-components/scene-ui.js b/src/react-components/scene-ui.js index f408d252ab..1f73cc7851 100644 --- a/src/react-components/scene-ui.js +++ b/src/react-components/scene-ui.js @@ -9,6 +9,7 @@ import { createAndRedirectToNewHub, getReticulumFetchUrl } from "../utils/phoeni import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCodeBranch } from "@fortawesome/free-solid-svg-icons/faCodeBranch"; import { faPencilAlt } from "@fortawesome/free-solid-svg-icons/faPencilAlt"; +import { ReactComponent as HmcLogo } from "./icons/HmcLogo.svg"; class SceneUI extends Component { static propTypes = { @@ -69,7 +70,7 @@ class SceneUI extends Component { } const { sceneAllowRemixing, isOwner, sceneProjectId, parentScene, sceneId, intl } = this.props; - + const isHmc = configs.feature("show_cloud"); const sceneUrl = [location.protocol, "//", location.host, location.pathname].join(""); const tweetText = intl.formatMessage( { @@ -111,7 +112,8 @@ class SceneUI extends Component { author: _author, a: chunks => url ? ( - <a href={url} target="_blank" rel="noopener noreferrer"> {chunks} + <a href={url} target="_blank" rel="noopener noreferrer"> + {chunks} </a> ) : ( <>{chunks}</> @@ -200,7 +202,6 @@ class SceneUI extends Component { attributions = <span>{this.props.sceneAttributions.extras}</span>; } } - return ( <div className={styles.ui}> <div @@ -215,10 +216,14 @@ class SceneUI extends Component { <div className={styles.grid}> <div className={styles.mainPanel}> <a href="/" className={styles.logo}> - <img - src={configs.image("logo")} - alt={<FormattedMessage id="scene-page.logo-alt" defaultMessage="Logo" />} - /> + {isHmc ? ( + <HmcLogo className="hmc-logo" /> + ) : ( + <img + src={configs.image("logo")} + alt={<FormattedMessage id="scene-page.logo-alt" defaultMessage="Logo" />} + /> + )} </a> <div className={styles.logoTagline}>{configs.translation("app-tagline")}</div> {this.props.showCreateRoom && ( diff --git a/src/react-components/sidebar/Sidebar.js b/src/react-components/sidebar/Sidebar.js index f345101893..d1f3f84084 100644 --- a/src/react-components/sidebar/Sidebar.js +++ b/src/react-components/sidebar/Sidebar.js @@ -3,7 +3,15 @@ import PropTypes from "prop-types"; import classNames from "classnames"; import styles from "./Sidebar.scss"; -export function Sidebar({ title, beforeTitle, afterTitle, children, contentClassName, className }) { +export function Sidebar({ + title, + beforeTitle, + afterTitle, + children, + contentClassName, + className, + disableOverflowScroll +}) { return ( <div className={classNames(styles.sidebar, className)}> {(title || beforeTitle || afterTitle) && ( @@ -13,7 +21,9 @@ export function Sidebar({ title, beforeTitle, afterTitle, children, contentClass <div className={styles.afterTitle}>{afterTitle}</div> </div> )} - <div className={classNames(styles.content, contentClassName)}>{children}</div> + <div className={classNames(styles.content, disableOverflowScroll ? "" : styles.overflowY, contentClassName)}> + {children} + </div> </div> ); } @@ -25,5 +35,9 @@ Sidebar.propTypes = { children: PropTypes.node, className: PropTypes.string, contentClassName: PropTypes.string, - disableFullscreen: PropTypes.bool + disableOverflowScroll: PropTypes.bool +}; + +Sidebar.defaultProps = { + disableOverflowScroll: false }; diff --git a/src/react-components/sidebar/Sidebar.scss b/src/react-components/sidebar/Sidebar.scss index 4b9ca5b170..8ca842dd85 100644 --- a/src/react-components/sidebar/Sidebar.scss +++ b/src/react-components/sidebar/Sidebar.scss @@ -7,7 +7,8 @@ height: 100%; background-color: theme.$background1-color; pointer-events: auto; - + overflow-wrap: break-word; + @media(min-width: theme.$breakpoint-lg) and (min-height: theme.$breakpoint-vr) { border-left: 1px solid theme.$border1-color; } @@ -43,5 +44,8 @@ display: flex; flex: 1; flex-direction: column; +} + +:local(.overflow-y) { overflow-y: auto; } diff --git a/src/react-components/styles/global.scss b/src/react-components/styles/global.scss index 6a919435aa..8f658d50a1 100644 --- a/src/react-components/styles/global.scss +++ b/src/react-components/styles/global.scss @@ -32,6 +32,7 @@ --link-color-pressed: #{theme.$blue-pressed}; --accept-color: #{theme.$green}; + --accept-border-color: #{theme.$green}; --accept-color-hover: #{theme.$green-hover}; --accept-color-pressed: #{theme.$green-pressed}; @@ -40,25 +41,34 @@ --cancel-color-pressed: #{theme.$red-pressed}; --accent1-color: #{theme.$red}; + --accent1-border-color: var(--accent1-color); --accent1-color-hover: #{theme.$red-hover}; --accent1-color-pressed: #{theme.$red-pressed}; --accent2-color: #{theme.$orange}; + --accent2-border-color: var(--accent2-color); --accent2-color-hover: #{theme.$orange-hover}; --accent2-color-pressed: #{theme.$orange-pressed}; --accent3-color: #{theme.$green}; + --accent3-border-color: var(--accent3-color); --accent3-color-hover: #{theme.$green-hover}; --accent3-color-pressed: #{theme.$green-pressed}; --accent4-color: #{theme.$blue}; + --accent4-border-color: var(--accent4-color); --accent4-color-hover: #{theme.$blue-hover}; --accent4-color-pressed: #{theme.$blue-pressed}; --accent5-color: #{theme.$purple}; + --accent5-border-color: var(--accent5-color); --accent5-color-hover: #{theme.$purple-hover}; --accent5-color-pressed: #{theme.$purple-pressed}; + --accent6-color: #{theme.$black}; + --accent6-color-hover: #{theme.$black-hover}; + --accent6-color-pressed: #{theme.$black-pressed}; + --primary-color: #{theme.$blue}; --primary-color-hover: #{theme.$blue-hover}; --primary-color-pressed: #{theme.$blue-pressed}; @@ -153,10 +163,18 @@ --overlay-outline-color: #{theme.$white}; --toolbar-icon-color: var(--text5-color); + --toolbar-icon-selected-bg: var(--transparent); --toolbar-basic-icon-color: var(--text1-color); + --toolbar-basic-selected-icon-color: var(--text1-color); --toolbar-basic-color: var(--secondary-color); --toolbar-basic-color-hover: var(--secondary-color-hover); --toolbar-basic-color-pressed: var(--secondary-color-pressed); + --toolbar-basic-border-color: var(--basic-border-color); + --toolbar-label-accent1: var(--accent1-color); + --toolbar-label-accent2: var(--accent2-color); + --toolbar-label-accent3: var(--accent3-color); + --toolbar-label-accent4: var(--accent4-color); + --toolbar-label-accent5: var(--accent5-color); --tile-text-color: var(--text4-color); --tile-bg-color: var(--secondary-color); @@ -445,3 +463,9 @@ input::placeholder { summary { cursor: pointer; } + +.hmc-logo { + [fill] { + fill: theme.$text1-color; + } +} \ No newline at end of file diff --git a/src/react-components/styles/style-utils.scss b/src/react-components/styles/style-utils.scss index d10e2ba6f6..65d174aba5 100644 --- a/src/react-components/styles/style-utils.scss +++ b/src/react-components/styles/style-utils.scss @@ -12,3 +12,70 @@ } } +:local(.margin-0) { + margin: 0px !important; +} + +:local(.textError) { + color: theme.$red +} + +$spacing: ( + "2xs": theme.$spacing-2xs, + "xs": theme.$spacing-xs, + "sm": theme.$spacing-sm, + "md": theme.$spacing-md, + "lg": theme.$spacing-lg, + "xl": theme.$spacing-xl +); + +@each $size, $theme-spacing in $spacing { + // .xs-margin-y // xsMarginY + :local(.#{$size}-margin-y) { + margin-bottom: $theme-spacing; + margin-top: $theme-spacing; + } + + // .xs-margin-r // xsMarginR + :local(.#{$size}-margin-r) { + margin-right: $theme-spacing; + } + + // .xs-margin-l // xsMarginL + :local(.#{$size}-margin-l) { + margin-left: $theme-spacing; + } + + // .xs-margin-bottom // xsMarginBottom + :local(.#{$size}-margin-bottom) { + margin-bottom: $theme-spacing; + } + // .xs-margin-top // xsMarginTop + :local(.#{$size}-margin-top) { + margin-top: $theme-spacing; + } + + // .xs-padding // xsPadding + :local(.#{$size}-padding) { + padding: $theme-spacing; + } + + // .xs-wrap-margin + // Used for row responsiveness, adds margins to wrapped content but not the first row + :local(.#{$size}-wrap-margin) { + margin-top: -$theme-spacing; + } + :local(.#{$size}-wrap-margin) > * { + margin-top: $theme-spacing; + } +} + +// flex-basis 10% to 90% +@for $i from 1 to 9 { + $percent: percentage($number: ($i/10)); + // .flex-basis-10 // flexBasis10 + :local(.flex-basis-#{$i}0) { + flex-basis: $percent; + } +} + diff --git a/src/react-components/styles/theme.js b/src/react-components/styles/theme.js index 2dc734213a..6edd2daf3b 100644 --- a/src/react-components/styles/theme.js +++ b/src/react-components/styles/theme.js @@ -33,9 +33,20 @@ function useDarkMode() { setDarkMode(darkmodeQuery.matches); - darkmodeQuery.addEventListener("change", event => { - setDarkMode(event.matches); - }); + // This is a workaround for old Safari. + // Prior to Safari 14, MediaQueryList is based on EventTarget, so you must use + // addListener() and removeListener() to observe media query lists. + // https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList/addListener + // We may remove this workaround when no one will use Safari 13 or before. + if (darkmodeQuery.addEventListener) { + darkmodeQuery.addEventListener("change", event => { + setDarkMode(event.matches); + }); + } else { + darkmodeQuery.addListener(event => { + setDarkMode(event.matches); + }); + } }, []); return darkMode; diff --git a/src/react-components/styles/theme.scss b/src/react-components/styles/theme.scss index 6786915f47..35d7e70d1f 100644 --- a/src/react-components/styles/theme.scss +++ b/src/react-components/styles/theme.scss @@ -42,9 +42,9 @@ $green: #7ED320; $green-hover: #8CDF2F; $green-pressed: #72BE1D; -$blue: #12A4ED; -$blue-hover: #2AADEF; -$blue-pressed: #1094D5; +$blue: #007AB8; +$blue-hover: #008BD1; +$blue-pressed: #00699E; $purple: #7854F6; $purple-hover: #8C6EF7; @@ -116,6 +116,7 @@ $link-color-hover: var(--link-color-hover); $link-color-pressed: var(--link-color-pressed); $accept-color: var(--accept-color); +$accept-border-color: var(--accept-border-color); $accept-color-hover: var(--accept-color-hover); $accept-color-pressed: var(--accept-color-pressed); @@ -124,25 +125,34 @@ $cancel-color-hover: var(--cancel-color-hover); $cancel-color-pressed: var(--cancel-color-pressed); $accent1-color: var(--accent1-color); +$accent1-border-color: var(--accent1-border-color); $accent1-color-hover: var(--accent1-color-hover); $accent1-color-pressed: var(--accent1-color-pressed); $accent2-color: var(--accent2-color); +$accent2-border-color: var(--accent2-border-color); $accent2-color-hover: var(--accent2-color-hover); $accent2-color-pressed: var(--accent2-color-pressed); $accent3-color: var(--accent3-color); $accent3-color-hover: var(--accent3-color-hover); $accent3-color-pressed: var(--accent3-color-pressed); +$accent3-border-color: var(--accent3-border-color); $accent4-color: var(--accent4-color); +$accent4-border-color: var(--accent4-border-color); $accent4-color-hover: var(--accent4-color-hover); $accent4-color-pressed: var(--accent4-color-pressed); $accent5-color: var(--accent5-color); +$accent5-border-color: var(--accent5-border-color); $accent5-color-hover: var(--accent5-color-hover); $accent5-color-pressed: var(--accent5-color-pressed); +$accent6-color: var(--accent6-color); +$accent6-color-hover: var(--accent6-color-hover); +$accent6-color-pressed: var(--accent6-color-pressed); + $primary-color: var(--primary-color); $primary-color-hover: var(--primary-color-hover); $primary-color-pressed: var(--primary-color-pressed); @@ -237,10 +247,18 @@ $overlay-border-color: var(--overlay-border-color); $overlay-outline-color: var(--overlay-outline-color); $toolbar-icon-color: var(--toolbar-icon-color); +$toolbar-icon-selected-bg: var(--toolbar-icon-selected-bg); $toolbar-basic-icon-color: var(--toolbar-basic-icon-color); +$toolbar-basic-selected-icon-color: var(--toolbar-basic-selected-icon-color); $toolbar-basic-color: var(--toolbar-basic-color); $toolbar-basic-color-hover: var(--toolbar-basic-color-hover); $toolbar-basic-color-pressed: var(--toolbar-basic-color-pressed); +$toolbar-basic-border-color: var(--toolbar-basic-border-color); +$toolbar-label-accent1: var(--toolbar-label-accent1); +$toolbar-label-accent2: var(--toolbar-label-accent2); +$toolbar-label-accent3: var(--toolbar-label-accent3); +$toolbar-label-accent4: var(--toolbar-label-accent4); +$toolbar-label-accent5: var(--toolbar-label-accent5); $tile-text-color: var(--tile-text-color); $tile-bg-color: var(--tile-bg-color); diff --git a/src/react-components/tokens/CreateToken.js b/src/react-components/tokens/CreateToken.js new file mode 100644 index 0000000000..9ac1ee0167 --- /dev/null +++ b/src/react-components/tokens/CreateToken.js @@ -0,0 +1,181 @@ +import React from "react"; +import PropTypes from "prop-types"; +import classNames from "classnames"; +import { FormattedMessage } from "react-intl"; +import { Divider } from "../layout/Divider"; +import { Column } from "../layout/Column"; +import styles from "./Tokens.scss"; +import styleUtils from "../styles/style-utils.scss"; +import { Button } from "../input/Button"; +import { Row } from "../layout/Row"; +import { CheckboxInput } from "../input/CheckboxInput"; +import { RadioInputField } from "../input/RadioInputField"; +import { RadioInputOption } from "../input/RadioInput"; +import { useIntl, defineMessages } from "react-intl"; +import { SpinWhileTrue } from "../layout/SpinWhileTrue"; + +const tokenTypes = ["account", "app"]; + +export const CreateToken = ({ + scopes, + selectedScopes, + toggleSelectedScopes, + selectedTokenType, + toggleTokenType, + error, + showNoScopesSelectedError, + onCreateToken, + onCreateTokenCancelled, + isPending +}) => ( + <div> + <h1> + <FormattedMessage id="new-token.title" defaultMessage="New Token" /> + </h1> + <SpinWhileTrue isSpinning={isPending}> + {error && ( + <Row padding="sm" className={styles.revokeWarning}> + <p>{`An Error occured: ${error}`}</p> + </Row> + )} + <Row gap="xl" breakpointColumn="md" className={styleUtils.smMarginY}> + <h2 className={styleUtils.flexBasis40}> + <FormattedMessage id="new-token.token-type" defaultMessage="Token type" /> + </h2> + <Row className={styleUtils.flexBasis60}> + <RadioInputField className={styles.flexDirectionRow} inputClassName={styles.flexDirectionRow}> + {tokenTypes.map(tokenType => ( + <RadioInputOption + key={tokenType} + className={classNames(styleUtils.flexBasis50, styleUtils.margin0)} + labelClassName={styles.radioLabel} + checked={tokenType === selectedTokenType} + onChange={() => toggleTokenType(tokenType)} + value={tokenType} + label={tokenType.charAt(0).toUpperCase() + tokenType.slice(1)} + /> + ))} + </RadioInputField> + </Row> + </Row> + <Divider /> + <Column gap="xl" className={styleUtils.mdMarginY}> + <h2> + <FormattedMessage id="new-token.select-scopes-title" defaultMessage="Select scopes" /> + </h2> + <p> + <FormattedMessage + id="new-token.select-scopes-description" + defaultMessage="Set the level of access this token will have by choosing from the scopes list." + /> + </p> + </Column> + <Column className={styleUtils.mdMarginY}> + {scopes.map(scopeName => { + return ( + <SelectScope + key={scopeName} + scopeName={scopeName} + toggleSelectedScopes={toggleSelectedScopes} + selected={selectedScopes.includes(scopeName)} + /> + ); + })} + </Column> + {showNoScopesSelectedError && ( + <Row className={styleUtils.mdMarginY}> + <p className={styleUtils.textError}> + <FormattedMessage + id="new-token.warning-at-least-one-scope" + defaultMessage="Please select at least one scope." + /> + </p> + </Row> + )} + <Row spaceBetween className={styleUtils.xlMarginBottom}> + <Button sm preset="basic" onClick={onCreateTokenCancelled}> + <FormattedMessage id="new-token.back" defaultMessage="Back" /> + </Button> + <Button + sm + preset="primary" + onClick={() => onCreateToken({ tokenType: selectedTokenType, scopes: selectedScopes })} + > + <FormattedMessage id="new-token.generate" defaultMessage="Generate" /> + </Button> + </Row> + </SpinWhileTrue> + </div> +); + +CreateToken.propTypes = { + scopes: PropTypes.array, + selectedScopes: PropTypes.array, + toggleSelectedScopes: PropTypes.func, + error: PropTypes.string, + showNoScopesSelectedError: PropTypes.bool, + toggleTokenType: PropTypes.func, + selectedTokenType: PropTypes.string, + onCreateToken: PropTypes.func, + onCreateTokenCancelled: PropTypes.func, + isPending: PropTypes.bool +}; + +// Scope info that is localized by language +// Ideally this would be fetched from the backend then compared with the localized information, +// but to ensure translations, we're defining it here. +const scopeInfo = { + write_rooms: defineMessages({ + description: { + id: "new-token-scopes.write-rooms.description", + defaultMessage: "Write room data" + } + }), + read_rooms: defineMessages({ + description: { + id: "new-token-scopes.read-rooms.description", + defaultMessage: "Read room data" + } + }), + // For storybook long scope example in Tokens.stories.js + another_long_scope_here: defineMessages({ + description: { + id: "new-token-scopes.write-rooms.description", + defaultMessage: "Write room data" + } + }) +}; + +const SelectScope = ({ scopeName, selected, toggleSelectedScopes }) => { + const intl = useIntl(); + const { description = null } = scopeInfo[scopeName]; + return ( + <Row + padding="sm" + breakpointColumn="md" + className={classNames(styles.backgroundWhite, { + [styles.unselectedBorder]: !selected, + [styles.selectedBorder]: selected + })} + topMargin="md" + > + <Row className={classNames(styleUtils.flexBasis40, styles.wordWrap)}> + <CheckboxInput + label={scopeName} + checked={selected} + labelClassName={styles.checkboxLabel} + onChange={() => toggleSelectedScopes(scopeName)} + /> + </Row> + <Column className={styleUtils.flexBasis60}> + <p>{description && intl.formatMessage(description)}</p> + </Column> + </Row> + ); +}; + +SelectScope.propTypes = { + scopeName: PropTypes.string, + selected: PropTypes.bool, + toggleSelectedScopes: PropTypes.func +}; diff --git a/src/react-components/tokens/CreateTokenContainer.js b/src/react-components/tokens/CreateTokenContainer.js new file mode 100644 index 0000000000..3fa26fc95e --- /dev/null +++ b/src/react-components/tokens/CreateTokenContainer.js @@ -0,0 +1,164 @@ +import React, { useReducer, useEffect } from "react"; +import PropTypes from "prop-types"; +import { CreateToken } from "./CreateToken"; +import { RevealTokenModal } from "./RevealTokenModal"; +import { createToken, fetchAvailableScopes } from "./token-utils"; +import { CenteredModalWrapper } from "../layout/CenteredModalWrapper"; + +const CreateTokenActions = { + submitCreateToken: "submitCreateToken", + createTokenSuccess: "createTokenSuccess", + createTokenError: "createTokenError", + fetchingScopes: "fetchingScopes", + fetchingScopesSuccess: "fetchingScopesSuccess", + fetchingScopesError: "fetchingScopesError", + showNoScopesError: "showNoScopesError", + toggleScopeChange: "toggleScopeChange", + toggleTokenTypeChange: "toggleTokenTypeChange" +}; + +const initialCreateTokenState = { + scopes: [], + selectedScopes: [], + selectedTokenType: "account", + token: "", + error: "", + showNoScopesSelectedError: false, + showRevealTokenModal: false, + isPending: false +}; + +function createTokenReducer(state, action) { + switch (action.type) { + case CreateTokenActions.submitCreateToken: + return { ...state, isPending: true }; + case CreateTokenActions.createTokenSuccess: + return { ...state, isPending: false, showRevealTokenModal: true, token: action.token }; + case CreateTokenActions.createTokenError: + return { ...state, isPending: false, error: action.errorMsg }; + case CreateTokenActions.fetchingScopesSuccess: + return { ...state, scopes: action.scopes }; + case CreateTokenActions.fetchingScopesError: + return { ...state, error: "Error fetching scopes, please try again later." }; + case CreateTokenActions.showNoScopesError: + return { ...state, showNoScopesSelectedError: true }; + case CreateTokenActions.toggleScopeChange: { + return { + ...state, + selectedScopes: state.selectedScopes.includes(action.scopeName) + ? state.selectedScopes.filter(name => name !== action.scopeName) + : [...state.selectedScopes, action.scopeName] + }; + } + case CreateTokenActions.toggleTokenTypeChange: { + return { + ...state, + selectedTokenType: action.tokenTypeValue + }; + } + default: + return state; + } +} + +function useCreateToken() { + const [state, dispatch] = useReducer(createTokenReducer, initialCreateTokenState); + + const onCreateToken = async ({ tokenType, scopes }) => { + if (scopes.length === 0) return dispatch({ type: CreateTokenActions.showNoScopesError }); + + dispatch({ type: CreateTokenActions.submitCreateToken }); + + try { + const tokenInfoObj = await createToken({ tokenType, scopes }); + const token = tokenInfoObj.credentials[0].token; + dispatch({ type: CreateTokenActions.createTokenSuccess, token }); + } catch (err) { + dispatch({ type: CreateTokenActions.createTokenError, errorMsg: err.message }); + } + }; + + const fetchScopes = async () => { + try { + const fetchedScopes = await fetchAvailableScopes(); + const scopes = fetchedScopes.scopes; + dispatch({ type: CreateTokenActions.fetchingScopesSuccess, scopes }); + } catch (err) { + dispatch({ type: CreateTokenActions.fetchingScopesError, errorMsg: err.message }); + } + }; + + const toggleSelectedScopes = scopeName => { + dispatch({ type: CreateTokenActions.toggleScopeChange, scopeName }); + }; + + const toggleTokenType = tokenTypeValue => { + dispatch({ type: CreateTokenActions.toggleTokenTypeChange, tokenTypeValue }); + }; + + return { + isPending: state.isPending, + scopes: state.scopes, + selectedScopes: state.selectedScopes, + token: state.token, + error: state.error, + showNoScopesSelectedError: state.showNoScopesSelectedError, + onCreateToken, + fetchScopes, + toggleSelectedScopes, + toggleTokenType, + selectedTokenType: state.selectedTokenType, + showRevealTokenModal: state.showRevealTokenModal + }; +} + +export const CreateTokenContainer = ({ onCreateTokenCreated, onCreateTokenCancelled }) => { + const { + scopes, + selectedScopes, + showRevealTokenModal, + token, + error, + showNoScopesSelectedError, + onCreateToken, + fetchScopes, + toggleSelectedScopes, + toggleTokenType, + selectedTokenType, + isPending + } = useCreateToken(); + + useEffect( + () => { + fetchScopes(); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [scopes[0]] + ); + + return ( + <> + {showRevealTokenModal && ( + <CenteredModalWrapper> + <RevealTokenModal token={token} selectedScopes={selectedScopes} onClose={onCreateTokenCreated} /> + </CenteredModalWrapper> + )} + <CreateToken + showNoScopesSelectedError={showNoScopesSelectedError} + onCreateToken={onCreateToken} + selectedScopes={selectedScopes} + selectedTokenType={selectedTokenType} + scopes={scopes} + toggleSelectedScopes={toggleSelectedScopes} + toggleTokenType={toggleTokenType} + error={error} + onCreateTokenCancelled={onCreateTokenCancelled} + isPending={isPending} + /> + </> + ); +}; + +CreateTokenContainer.propTypes = { + onClose: PropTypes.func +}; diff --git a/src/react-components/tokens/NoAccess.js b/src/react-components/tokens/NoAccess.js new file mode 100644 index 0000000000..79e6d0d1d2 --- /dev/null +++ b/src/react-components/tokens/NoAccess.js @@ -0,0 +1,44 @@ +import React from "react"; +import styles from "./Tokens.scss"; +import styleUtils from "../styles/style-utils.scss"; +import { Row } from "../layout/Row"; +import { ReactComponent as HubsDuckIcon } from "../icons/footer-duck.svg"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { Column } from "../layout/Column"; +import { FormattedMessage } from "react-intl"; +import { faTimesCircle } from "@fortawesome/free-solid-svg-icons/faTimesCircle"; + +export const NoAccess = () => { + return ( + <Column padding="xl" className={styles.noAccessContainer} lastChildMargin={false}> + <Row noWrap> + <div className={styles.noAccessIcon}> + <FontAwesomeIcon icon={faTimesCircle} /> + </div> + <h2> + <FormattedMessage + id="tokens.administrator-privileges-required" + defaultMessage="Administrator privileges required" + /> + </h2> + </Row> + <div className={styleUtils.mdMarginY}> + <p className={styleUtils.margin0}> + <FormattedMessage + id="tokens.no-access-description1" + defaultMessage="You do not have sufficient privileges to create API tokens." + /> + </p> + <p> + <FormattedMessage + id="tokens.no-access-description2" + defaultMessage="If you believe you should have access to this page, please request privileges from your Hubs administrator." + /> + </p> + </div> + <div className={styles.noAccessFooterDuckContainer}> + <HubsDuckIcon className={styles.noAccessFooterDuck} /> + </div> + </Column> + ); +}; diff --git a/src/react-components/tokens/RevealTokenModal.js b/src/react-components/tokens/RevealTokenModal.js new file mode 100644 index 0000000000..dfffad42bd --- /dev/null +++ b/src/react-components/tokens/RevealTokenModal.js @@ -0,0 +1,89 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { FormattedMessage } from "react-intl"; +import { Modal } from "../../react-components/modal/Modal"; +import styles from "./Tokens.scss"; +import styleUtils from "../styles/style-utils.scss"; +import { Button } from "../input/Button"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faTimes } from "@fortawesome/free-solid-svg-icons/faTimes"; +import { Column } from "../layout/Column"; +import { Row } from "../layout/Row"; +import { Center } from "../layout/Center"; +import classNames from "classnames"; +import { CopyableTextInputField } from "../input/CopyableTextInputField"; + +export const RevealTokenModal = ({ token, selectedScopes, onClose }) => { + return ( + <Modal + titleNode={ + <h2> + <FormattedMessage id="save-api-token.title" defaultMessage="API Token" /> + </h2> + } + afterTitle={<CloseModalButton onClose={onClose} />} + disableFullscreen + className={classNames(styles.maxWidth400, styles.tokenModal)} + > + <Column gap="xl" className={styleUtils.xlMarginTop}> + <p> + <b> + <FormattedMessage + id="save-api-token.description1" + defaultMessage="Please save this API token in a safe place." + /> + </b> + <br /> + <FormattedMessage + id="save-api-token.description2" + defaultMessage="You will not be able to see it again once you have closed this window." + /> + </p> + <CopyableTextInputField + buttonPreset="accent6" + className={styles.maxWidthAuto} + inputClassName={classNames(styles.backgroundDarkGrey, styles.textWhite)} + label={<FormattedMessage id="save-api-token.copy-label" defaultMessage="API Token" />} + value={token} + description={ + <p> + <FormattedMessage id="save-api-token.copied" defaultMessage="Copied" /> + </p> + } + /> + <Row padding="sm" className={styles.backgroundLightGrey}> + <p> + <b> + <FormattedMessage id="save-api-token.scopes" defaultMessage="Scopes" />: + </b>{" "} + {selectedScopes && + selectedScopes.map((scopeName, idx) => `${scopeName}${selectedScopes.length - 1 > idx ? ", " : ""}`)} + </p> + </Row> + <Center> + <Button preset="primary" sm onClick={onClose}> + <FormattedMessage id="save-api-token.revoke" defaultMessage="Confirm and close" /> + </Button> + </Center> + </Column> + </Modal> + ); +}; + +RevealTokenModal.propTypes = { + onClose: PropTypes.func.isRequired, + token: PropTypes.string.isRequired, + selectedScopes: PropTypes.array.isRequired +}; + +const CloseModalButton = ({ onClose }) => { + return ( + <div className={styles.closeModalButton}> + <FontAwesomeIcon icon={faTimes} onClick={onClose} /> + </div> + ); +}; + +CloseModalButton.propTypes = { + onClose: PropTypes.func.isRequired +}; diff --git a/src/react-components/tokens/RevokeTokenContainer.js b/src/react-components/tokens/RevokeTokenContainer.js new file mode 100644 index 0000000000..8e080e45a5 --- /dev/null +++ b/src/react-components/tokens/RevokeTokenContainer.js @@ -0,0 +1,37 @@ +import React, { useState } from "react"; +import PropTypes from "prop-types"; +import { CenteredModalWrapper } from "../layout/CenteredModalWrapper"; +import { RevokeTokenModal } from "./RevokeTokenModal"; +import { revokeToken } from "./token-utils"; + +export function RevokeTokenContainer({ onClose, tokenId }) { + const [error, setError] = useState(""); + const [isPending, setIsPending] = useState(false); + + const onConfirmRevoke = async () => { + setIsPending(true); + try { + await revokeToken({ id: tokenId }); + onClose({ removedTokenId: tokenId }); + } catch (err) { + setError(err.message); + } + setIsPending(false); + }; + + return ( + <CenteredModalWrapper> + <RevokeTokenModal + isPending={isPending} + error={error} + onRevoke={onConfirmRevoke} + onClose={() => onClose({ removedTokenId: null })} + /> + </CenteredModalWrapper> + ); +} + +RevokeTokenContainer.propTypes = { + onClose: PropTypes.func, + tokenId: PropTypes.string +}; diff --git a/src/react-components/tokens/RevokeTokenModal.js b/src/react-components/tokens/RevokeTokenModal.js new file mode 100644 index 0000000000..b80110691e --- /dev/null +++ b/src/react-components/tokens/RevokeTokenModal.js @@ -0,0 +1,80 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { FormattedMessage } from "react-intl"; +import { Modal } from "../../react-components/modal/Modal"; +import styles from "./Tokens.scss"; +import styleUtils from "../styles/style-utils.scss"; +import { Button } from "../input/Button"; +import { Row } from "../layout/Row"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faExclamationTriangle } from "@fortawesome/free-solid-svg-icons/faExclamationTriangle"; +import { faTimes } from "@fortawesome/free-solid-svg-icons/faTimes"; +import { Column } from "../layout/Column"; +import { SpinWhileTrue } from "../layout/SpinWhileTrue"; + +export function RevokeTokenModal({ onClose, onRevoke, error, isPending }) { + return ( + <Modal + title={<FormattedMessage id="revoke-token-modal.title" defaultMessage="Revoke token" />} + beforeTitle={<FontAwesomeIcon icon={faExclamationTriangle} />} + afterTitle={ + <div className={styles.closeModalButton}> + <FontAwesomeIcon onClick={onClose} icon={faTimes} /> + </div> + } + disableFullscreen + className={styles.maxWidth400} + > + <SpinWhileTrue isSpinning={isPending}> + {error && ( + <Row padding="sm" className={styles.revokeWarning}> + <p>{`An Error occured: ${error}`}</p> + </Row> + )} + <Column padding="sm"> + <Column className={styles.revokeDescription}> + <p className={styleUtils.xsMarginBottom}> + <FormattedMessage + id="revoke-token-modal.description1" + defaultMessage="Are you sure you want to revoke this token?" + /> + </p> + <p> + <FormattedMessage + id="revoke-token-modal.description2" + defaultMessage="Any scripts or requests relying on this token will lose access." + /> + </p> + </Column> + <Row padding="sm" className={styles.revokeWarning}> + <p> + <FormattedMessage id="revoke-token-modal.revoke-warning-1" defaultMessage="This action is" />{" "} + <b> + <FormattedMessage id="revoke-token-modal.revoke-warning-2" defaultMessage="permanent" /> + </b>{" "} + <FormattedMessage id="revoke-token-modal.revoke-warning-3" defaultMessage="and" />{" "} + <b> + <FormattedMessage id="revoke-token-modal.revoke-warning-4" defaultMessage="can not be undone." /> + </b> + </p> + </Row> + <Row spaceBetween padding="sm"> + <Button preset="basic" sm onClick={onClose}> + <FormattedMessage id="revoke-token-modal.cancel" defaultMessage="Cancel" /> + </Button> + <Button preset="accent1" sm onClick={onRevoke}> + <FormattedMessage id="revoke-token-modal.revoke" defaultMessage="Revoke" /> + </Button> + </Row> + </Column> + </SpinWhileTrue> + </Modal> + ); +} + +RevokeTokenModal.propTypes = { + onClose: PropTypes.func.isRequired, + onRevoke: PropTypes.func.isRequired, + error: PropTypes.string, + isPending: PropTypes.bool +}; diff --git a/src/react-components/tokens/Token.js b/src/react-components/tokens/Token.js new file mode 100644 index 0000000000..23987ef693 --- /dev/null +++ b/src/react-components/tokens/Token.js @@ -0,0 +1,88 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Button } from "../input/Button"; +import { FormattedMessage } from "react-intl"; +import { Row } from "../layout/Row"; +import styles from "./Token.scss"; +import { useIntl, defineMessages } from "react-intl"; + +const tokenTypes = { + account: defineMessages({ + type: { + id: "token-type.account-token", + defaultMessage: "Account Token" + } + }), + app: defineMessages({ + type: { + id: "token-type.app-token", + defaultMessage: "App Token" + } + }) +}; + +export function Token({ tokenInfo, onRevokeToken }) { + const { account_id, inserted_at, scopes, subject_type } = tokenInfo; + const intl = useIntl(); + const { type = null } = tokenTypes[subject_type]; + if (type === null) { + console.warn( + "WARNING: Token type translation was undefined. Meaning the frontend is missing the token type translation for: " + + subject_type + ); + } + + return ( + <div className={styles.borderGrey}> + <Row padding="sm" spaceBetween noWrap className={styles.backgroundWhite}> + <Row breakpointColumn="md" topMargin="md" childrenMarginR="xl"> + <div> + <span> + <b>{type && intl.formatMessage(type)}</b> + </span> + </div> + <div> + <span>{account_id}</span> + </div> + <div> + <span>{inserted_at}</span> + </div> + </Row> + <Button sm preset="cancel" onClick={onRevokeToken}> + <FormattedMessage id="tokens.revoke-token" defaultMessage="Revoke" /> + </Button> + </Row> + <Row padding="sm" className={styles.backgroundGrey}> + <div className={styles.scopes}> + <b> + <FormattedMessage id="tokens.scopes" defaultMessage="Scopes" /> + </b> + </div> + <Row topMargin="md" childrenMarginR="md"> + {scopes.map(scopeName => { + // TODO translation? + return ( + <p className={styles.scope} key={scopeName}> + {scopeName} + </p> + ); + })} + </Row> + </Row> + </div> + ); +} + +Token.propTypes = { + tokenInfo: PropTypes.shape({ + account_id: PropTypes.number, + id: PropTypes.string, + inserted_at: PropTypes.string, + is_revoked: PropTypes.bool, + scopes: PropTypes.array, + subject_type: PropTypes.string, + token: PropTypes.string, + updated_at: PropTypes.string + }), + onRevokeToken: PropTypes.func +}; diff --git a/src/react-components/tokens/Token.scss b/src/react-components/tokens/Token.scss new file mode 100644 index 0000000000..8bd2128c10 --- /dev/null +++ b/src/react-components/tokens/Token.scss @@ -0,0 +1,17 @@ +@use "../styles/theme.scss"; + +:local(.border-grey) { + border: 1px solid theme.$border2-color; +} + +:local(.background-grey) { + background-color: theme.$background3-color; +} + +:local(.background-white) { + background-color: theme.$background1-color; +} + +:local(.scopes) { + padding-right: theme.$spacing-xl; +} diff --git a/src/react-components/tokens/TokenList.js b/src/react-components/tokens/TokenList.js new file mode 100644 index 0000000000..fde201ebfb --- /dev/null +++ b/src/react-components/tokens/TokenList.js @@ -0,0 +1,71 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Token } from "./Token"; +import { Row } from "../layout/Row"; +import { Column } from "../layout/Column"; +import { FormattedMessage } from "react-intl"; +import { Button } from "../input/Button"; +import styleUtils from "../styles/style-utils.scss"; +import styles from "./Tokens.scss"; +import { SpinWhileTrue } from "../layout/SpinWhileTrue"; +import { Center } from "../layout/Center"; + +export const TokenList = ({ tokens, onRevokeToken, onShowCreateToken, error, isFetching }) => { + return ( + <div> + <TokenMenuHeader /> + <Row spaceBetween breakpointColumn="sm" topMargin="lg"> + <h2> + <FormattedMessage id="empty-token.title2" defaultMessage="Token List" /> + </h2> + <Button preset="primary" sm onClick={onShowCreateToken}> + <FormattedMessage id="tokens.button-create-token" defaultMessage="Create token" /> + </Button> + </Row> + <SpinWhileTrue isSpinning={isFetching}> + {error && ( + <Row padding="sm" className={styles.revokeWarning}> + <p>{`An Error occured: ${error}`}</p> + </Row> + )} + {tokens && tokens.length ? ( + <Column className={styleUtils.xlMarginY}> + {tokens.map(token => ( + <Token key={token.id} tokenInfo={token} onRevokeToken={() => onRevokeToken({ revokeId: token.id })} /> + ))} + </Column> + ) : ( + <div className={styleUtils.xlMarginY}> + <Row padding="md" className={styles.backgroundWhite}> + <Center> + <FormattedMessage id="tokens.no-tokens-created" defaultMessage="No tokens created." /> + </Center> + </Row> + </div> + )} + </SpinWhileTrue> + </div> + ); +}; + +TokenList.propTypes = { + tokens: PropTypes.array, + onRevokeToken: PropTypes.func, + onShowCreateToken: PropTypes.func, + error: PropTypes.string, + isFetching: PropTypes.bool +}; + +const TokenMenuHeader = () => ( + <Column gap="xl"> + <h1> + <FormattedMessage id="empty-token.title" defaultMessage="API Tokens" /> + </h1> + <p> + <FormattedMessage id="tokens.create-tokens-description" defaultMessage="Create tokens to access the" />{" "} + <a href="https://github.com/mozilla/reticulum/blob/master/guides/api.md" rel="noreferrer noopener"> + <FormattedMessage id="tokens.create-tokens-description-hubs-api" defaultMessage="Hubs API" /> + </a>. + </p> + </Column> +); diff --git a/src/react-components/tokens/TokenPageLayout.js b/src/react-components/tokens/TokenPageLayout.js new file mode 100644 index 0000000000..bac934791e --- /dev/null +++ b/src/react-components/tokens/TokenPageLayout.js @@ -0,0 +1,19 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { PageContainer } from "../layout/PageContainer"; +import { Column } from "../layout/Column"; +import classNames from "classnames"; +import styleUtils from "../styles/style-utils.scss"; +import styles from "./Tokens.scss"; + +export const TokenPageLayout = ({ children }) => ( + <PageContainer className={styles.tokenContainer}> + <Column gap="xl" className={classNames(styles.centerPaddingSides, styleUtils.xlPadding)}> + {children} + </Column> + </PageContainer> +); + +TokenPageLayout.propTypes = { + children: PropTypes.node +}; diff --git a/src/react-components/tokens/Tokens.scss b/src/react-components/tokens/Tokens.scss new file mode 100644 index 0000000000..927da12c1c --- /dev/null +++ b/src/react-components/tokens/Tokens.scss @@ -0,0 +1,143 @@ +@use "../styles/theme.scss"; + +h1 { + font-weight: 500; +} + +h2 { + font-weight: 100; +} + +:local(.token-container) { + background-color: theme.$background4-color; +} + +:local(.no-access-icon) { + font-size: 2em; + padding-right: 12px; +} + +:local(.background-white) { + background-color: theme.$background1-color; +} + +:local(.background-gray) { + background-color: theme.$background2-color; +} + +:local(.revoke-warning) { + background-color: theme.$red-hover; + border: 2px solid theme.$red; +} + +:local(.center-padding-sides) { + width: 100%; + + @media(min-width: theme.$breakpoint-md) { + width: 80%; + max-width: 800px; + margin: 0 auto; + } +} + +:local(.revoke-description) { + margin: theme.$spacing-xl 0; +} + +:local(.margin-bottom-xs) { + margin-bottom: theme.$spacing-2xs; +} + +:local(.margin-bottom-xl) { + margin-bottom: theme.$spacing-xl; +} + +$tag-top-margin: theme.$spacing-xs; +:local(.tag) { + padding: 5px; + border-radius: 3px; + background-color: theme.$background3-color; + margin-bottom: 0px; +} + +:local(.selected-border) { + border: 2px solid theme.$blue; +} + +:local(.unselected-border) { + border: 2px solid theme.$background1-color; +} + +:local(.word-wrap) { + word-break: break-word; +} + +:local(.flex-direction-row) { + flex-direction: row !important; +} + +:local(.padding-Y-xl) { + padding-bottom: theme.$spacing-xl; + padding-top: theme.$spacing-xl; +} + +:local(.background-dark-grey) { + background-color: theme.$darkgrey; +} + +:local(.background-light-grey) { + background-color: theme.$background3-color; +} + +:local(.max-width-auto) { + max-width: none !important; +} + +:local(.max-width-400) { + max-width: 400px; +} + +:local(.text-white) { + color: theme.$white; +} + +:local(.checkbox-label) { + color: theme.$text1-color !important; + margin-left: 5px; +} + +:local(.radio-label) { + color: theme.$text1-color !important; + margin-left: 10px; +} + +:local(.no-access-container) { + position: relative; + background-color: theme.$background1-color; +} + +:local(.token-modal) { + padding: theme.$spacing-md; +} + +:local(.token-modal) > * { + justify-content: left ; + height: auto; + border-bottom: none; + max-height: 100%; +} + +:local(.no-access-footer-duck-container) { + height: 45px; +} + +:local(.no-access-footer-duck) { + position: absolute; + right: 0; + bottom: 0; +} + +:local(.close-modal-button) { + font-size: 1.5em; + cursor: pointer; +} diff --git a/src/react-components/tokens/Tokens.stories.js b/src/react-components/tokens/Tokens.stories.js new file mode 100644 index 0000000000..d527487449 --- /dev/null +++ b/src/react-components/tokens/Tokens.stories.js @@ -0,0 +1,112 @@ +import React from "react"; +import { CenteredModalWrapper } from "../layout/CenteredModalWrapper"; +import { TokenList } from "./TokenList"; +import { TokenPageLayout } from "./TokenPageLayout"; +import { NoAccess } from "./NoAccess"; +import { RevokeTokenModal } from "./RevokeTokenModal"; +import { RevealTokenModal } from "./RevealTokenModal"; +import { CreateToken } from "./CreateToken"; +import { StorybookAuthContextProvider } from "../auth/AuthContext"; + +export default { + title: "Token/Tokens" +}; + +const scopes = ["read_rooms", "write_rooms", "another_long_scope_here"]; + +const dummyTokens = [ + { + account_id: "1234567890", + id: "1", + inserted_at: 1234, + is_revoked: false, + scopes: ["write_rooms", "read_rooms"], + subject_type: "app", + token: "(Redacted)", + updated_at: 1234 + }, + { + account_id: "1123456789", + id: "2", + inserted_at: 1234, + is_revoked: false, + scopes: ["write_rooms", "read_rooms"], + subject_type: "account", + token: "(Redacted)", + updated_at: 1234 + }, + { + account_id: "1234567890", + id: "3", + inserted_at: 1234, + is_revoked: false, + scopes: ["write_rooms", "read_rooms"], + subject_type: "account", + token: "(Redacted)", + updated_at: 1234 + } +]; + +const noop = () => {}; + +// eslint-disable-next-line react/prop-types +const StorybookWrapper = ({ children }) => { + return ( + <StorybookAuthContextProvider> + <TokenPageLayout>{children}</TokenPageLayout> + </StorybookAuthContextProvider> + ); +}; + +export const NoAccessPage = () => { + return ( + <StorybookWrapper> + <NoAccess /> + </StorybookWrapper> + ); +}; + +// eslint-disable-next-line react/prop-types +export const TokenListPage = ({ children }) => ( + <StorybookWrapper> + {children} + <TokenList tokens={dummyTokens} onRevokeToken={noop} /> + </StorybookWrapper> +); + +export const EmptyTokenListPage = () => ( + <StorybookWrapper> + <TokenList tokens={[]} onRevokeToken={noop} /> + </StorybookWrapper> +); + +export const RevokeTokenModalPage = () => ( + <TokenListPage> + <CenteredModalWrapper> + <RevokeTokenModal onClose={noop} revoke={noop} /> + </CenteredModalWrapper> + </TokenListPage> +); + +// eslint-disable-next-line react/prop-types +export function ModalRevokeToken() { + return <RevokeTokenModal onClose={noop} revoke={noop} />; +} + +const selectedScopes = ["read_rooms", "write_rooms"]; +// eslint-disable-next-line react/prop-types +export const CreateTokenPage = ({ children }) => ( + <StorybookWrapper> + {children} + <CreateToken scopes={scopes} selectedScopes={selectedScopes} /> + </StorybookWrapper> +); + +export const ModalSaveTokenPage = () => ( + <StorybookWrapper> + <CenteredModalWrapper> + <RevealTokenModal onClose={noop} token={{ token: "abcd1234" }} selectedScopes={["write_rooms"]} /> + </CenteredModalWrapper> + <TokenList tokens={dummyTokens} onRevokeToken={noop} /> + </StorybookWrapper> +); diff --git a/src/react-components/tokens/TokensContainer.js b/src/react-components/tokens/TokensContainer.js new file mode 100644 index 0000000000..24f808a3fd --- /dev/null +++ b/src/react-components/tokens/TokensContainer.js @@ -0,0 +1,83 @@ +import React, { useState, useEffect, useContext } from "react"; +import { fetchMyTokens } from "./token-utils"; +import { RevokeTokenContainer } from "./RevokeTokenContainer"; +import { TokenList } from "./TokenList"; +import { NoAccess } from "./NoAccess"; +import { AuthContext } from "../auth/AuthContext"; +import { CreateTokenContainer } from "./CreateTokenContainer"; + +export function TokensContainer() { + const [tokens, setTokens] = useState([]); + const [isFetching, setIsFetching] = useState(false); + const [error, setError] = useState(""); + const [showCreateToken, setShowCreateToken] = useState(false); + const [showRevokeTokenModal, setShowRevokeTokenModal] = useState(false); + const [selectedRevokeId, setSelectedRevokeId] = useState(); + + const auth = useContext(AuthContext); + + const fetchTokens = async () => { + try { + setIsFetching(true); + setTokens(await fetchMyTokens()); + } catch (err) { + setError("Error fetching tokens: " + err.message); + return null; + } finally { + setIsFetching(false); + } + }; + + useEffect( + () => { + if (auth?.isAdmin) fetchTokens(); + }, + [auth.isAdmin] + ); + + const onCreateTokenCreated = async () => { + setShowCreateToken(false); + await fetchTokens(); + }; + + const onCreateTokenCancelled = () => { + setShowCreateToken(false); + }; + + const onRevokeToken = ({ revokeId }) => { + setShowRevokeTokenModal(true); + setSelectedRevokeId(revokeId); + }; + + const onRevokeTokenClose = ({ removedTokenId }) => { + if (removedTokenId) setTokens(tokens.filter(token => token.id !== removedTokenId)); + setShowRevokeTokenModal(false); + setSelectedRevokeId(""); + }; + + return ( + <div> + {showRevokeTokenModal && <RevokeTokenContainer tokenId={selectedRevokeId} onClose={onRevokeTokenClose} />} + {auth?.isAdmin ? ( + showCreateToken ? ( + <CreateTokenContainer + onCreateTokenCancelled={onCreateTokenCancelled} + onCreateTokenCreated={onCreateTokenCreated} + /> + ) : ( + <TokenList + error={error} + isFetching={isFetching} + tokens={tokens} + onRevokeToken={onRevokeToken} + onShowCreateToken={() => { + setShowCreateToken(true); + }} + /> + ) + ) : ( + <NoAccess /> + )} + </div> + ); +} diff --git a/src/react-components/tokens/token-utils.js b/src/react-components/tokens/token-utils.js new file mode 100644 index 0000000000..0d1febb334 --- /dev/null +++ b/src/react-components/tokens/token-utils.js @@ -0,0 +1,64 @@ +import { fetchReticulumAuthenticated, getReticulumFetchUrl } from "../../utils/phoenix-utils.js"; + +const ENDPOINT = "/api/v2_alpha/credentials"; +const SCOPES_ENDPOINT = getReticulumFetchUrl("/api/v1/credentials/scopes"); +const CREDENTIALS_ENDPOINT_URL = getReticulumFetchUrl(ENDPOINT); + +export async function fetchMyTokens() { + return fetchReticulumAuthenticated(ENDPOINT).then(function(tokens) { + return tokens.credentials; + }); +} + +function getHeaders() { + return { + "content-type": "application/json", + authorization: `bearer ${window.APP.store.state.credentials.token}` + }; +} + +export async function createToken({ tokenType, scopes }) { + const res = await fetch(CREDENTIALS_ENDPOINT_URL, { + headers: getHeaders(), + method: "POST", + body: JSON.stringify({ + scopes, + subject_type: tokenType + }) + }); + if (res.ok) { + return res.json(); + } else { + throw new Error( + res.statusText ? res.statusText : "Something went wrong with creating a new token. Please try again." + ); + } +} + +export async function revokeToken({ id }) { + const res = await fetch(`${CREDENTIALS_ENDPOINT_URL}/${id}?revoke`, { + headers: getHeaders(), + method: "PUT", + body: JSON.stringify({ + id, + revoke: true + }) + }); + if (res.ok) { + return res.json(); + } else { + throw new Error(res.statusText); + } +} + +export async function fetchAvailableScopes() { + const res = await fetch(SCOPES_ENDPOINT, { + headers: getHeaders(), + method: "GET" + }); + if (res.ok) { + return res.json(); + } else { + throw new Error(res.statusText); + } +} diff --git a/src/react-components/ui-root.js b/src/react-components/ui-root.js index b28984c26d..3ae8aa6acf 100644 --- a/src/react-components/ui-root.js +++ b/src/react-components/ui-root.js @@ -22,6 +22,7 @@ import StateRoute from "./state-route.js"; import { getPresenceProfileForSession, hubUrl } from "../utils/phoenix-utils"; import { getMicrophonePresences } from "../utils/microphone-presence"; import { getCurrentStreamer } from "../utils/component-utils"; +import { isIOS } from "../utils/is-mobile"; import ProfileEntryPanel from "./profile-entry-panel"; import MediaBrowserContainer from "./media-browser"; @@ -153,11 +154,11 @@ class UIRoot extends Component { isMonetized: PropTypes.bool, sessionId: PropTypes.string, subscriptions: PropTypes.object, - initialIsSubscribed: PropTypes.bool, initialIsFavorited: PropTypes.bool, showSignInDialog: PropTypes.bool, signInMessage: PropTypes.string, onContinueAfterSignIn: PropTypes.func, + onSignInDialogVisibilityChanged: PropTypes.func, showSafariMicDialog: PropTypes.bool, onMediaSearchResultEntrySelected: PropTypes.func, onAvatarSaved: PropTypes.func, @@ -254,8 +255,22 @@ class UIRoot extends Component { window.setTimeout(() => { if (!this.props.isBotMode) { try { - this.props.scene.renderer.compileAndUploadMaterials(this.props.scene.object3D, this.props.scene.camera); - } catch { + this.props.scene.renderer.compile(this.props.scene.object3D, this.props.scene.camera); + this.props.scene.object3D.traverse(obj => { + if (!obj.material) { + return; + } + const materials = Array.isArray(obj.material) ? obj.material : [obj.material]; + for (const material of materials) { + for (const prop in material) { + if (material[prop] && material[prop].isTexture) { + this.props.scene.renderer.initTexture(material[prop]); + } + } + } + }); + } catch (e) { + console.error(e); this.props.exitScene(ExitReason.sceneError); // https://github.com/mozilla/hubs/issues/1950 } } @@ -376,6 +391,7 @@ class UIRoot extends Component { this.props.scene.addEventListener( "loading_finished", () => { + console.log("Loading has finished. Checking for forced room entry"); setTimeout(() => this.handleForceEntry(), 1000); }, { once: true } @@ -411,8 +427,11 @@ class UIRoot extends Component { }; showContextualSignInDialog = () => { - const { signInMessage, authChannel, onContinueAfterSignIn } = this.props; - + const { signInMessage, authChannel } = this.props; + const onCallback = () => { + const { onContinueAfterSignIn } = this.props; + (onContinueAfterSignIn && onContinueAfterSignIn()) || this.closeDialog(); + }; this.showNonHistoriedDialog(RoomSignInModalContainer, { step: SignInStep.submit, message: signInMessage, @@ -421,7 +440,7 @@ class UIRoot extends Component { this.showNonHistoriedDialog(RoomSignInModalContainer, { step: SignInStep.waitForVerification, - onClose: onContinueAfterSignIn || this.closeDialog + onClose: onCallback }); await authComplete; @@ -429,11 +448,11 @@ class UIRoot extends Component { this.setState({ signedIn: true }); this.showNonHistoriedDialog(RoomSignInModalContainer, { step: SignInStep.complete, - onClose: onContinueAfterSignIn || this.closeDialog, - onContinue: onContinueAfterSignIn || this.closeDialog + onClose: onCallback, + onContinue: onCallback }); }, - onClose: onContinueAfterSignIn || this.closeDialog + onClose: onCallback }); }; @@ -460,6 +479,7 @@ class UIRoot extends Component { }; onLoadingFinished = () => { + console.log("UI root loading has finished"); this.setState({ noMoreLoadingUpdates: true }); this.props.scene.emit("loading_finished"); @@ -469,6 +489,7 @@ class UIRoot extends Component { }; onSceneLoaded = () => { + console.log("UI root scene has loaded"); this.setState({ sceneLoaded: true }); }; @@ -485,7 +506,7 @@ class UIRoot extends Component { }; toggleMute = () => { - this.props.scene.emit("action_mute"); + APP.dialog.toggleMicrophone(); }; shareVideo = mediaSource => { @@ -508,6 +529,8 @@ class UIRoot extends Component { }; handleForceEntry = () => { + console.log("Forced entry type: " + this.props.forcedVREntryType); + if (!this.props.forcedVREntryType) return; if (this.props.forcedVREntryType.startsWith("daydream")) { @@ -576,10 +599,12 @@ class UIRoot extends Component { }; enter2D = async () => { + console.log("Entering in 2D mode"); await this.performDirectEntryFlow(false); }; enterVR = async () => { + console.log("Entering in VR mode"); if (this.props.forcedVREntryType || this.props.availableVREntryTypes.generic !== VR_DEVICE_AVAILABILITY.maybe) { await this.performDirectEntryFlow(true); } else { @@ -588,6 +613,7 @@ class UIRoot extends Component { }; enterDaydream = async () => { + console.log("Entering in Daydream mode"); await this.performDirectEntryFlow(true); }; @@ -596,30 +622,26 @@ class UIRoot extends Component { }; onRequestMicPermission = async () => { + console.log("Microphone permission requested"); // TODO: Show an error state if getting the microphone permissions fails await this.mediaDevicesManager.startLastUsedMicShare(); this.beginOrSkipAudioSetup(); }; beginOrSkipAudioSetup = () => { - console.log(this.props.forcedVREntryType); const skipAudioSetup = this.props.forcedVREntryType && this.props.forcedVREntryType.endsWith("_now"); - if (skipAudioSetup) { + console.log(`Skipping audio setup (forcedVREntryType = ${this.props.forcedVREntryType})`); this.onAudioReadyButton(); } else { + console.log(`Starting audio setup`); this.pushHistoryState("entry_step", "audio"); } }; shouldShowFullScreen = () => { // Disable full screen on iOS, since Safari's fullscreen mode does not let you prevent native pinch-to-zoom gestures. - return ( - (isMobile || AFRAME.utils.device.isMobileVR()) && - !AFRAME.utils.device.isIOS() && - !this.state.enterInVR && - screenfull.enabled - ); + return (isMobile || AFRAME.utils.device.isMobileVR()) && !isIOS() && !this.state.enterInVR && screenfull.enabled; }; onAudioReadyButton = async () => { @@ -631,9 +653,6 @@ class UIRoot extends Component { clearHistoryState(this.props.history); const muteOnEntry = this.props.store.state.preferences["muteMicOnEntry"] || false; - this.props.store.update({ - settings: { micMuted: false } - }); await this.props.enterScene(this.state.enterInVR, muteOnEntry); this.setState({ entered: true, entering: false, showShareDialog: false }); @@ -665,10 +684,11 @@ class UIRoot extends Component { closeDialog = () => { if (this.state.dialog) { this.setState({ dialog: null }); - } else { - this.props.history.goBack(); } + const { onSignInDialogVisibilityChanged } = this.props; + onSignInDialogVisibilityChanged && onSignInDialogVisibilityChanged(false); + if (isIn2DInterstitial()) { exit2DInterstitialAndEnterVR(); } else { @@ -677,6 +697,8 @@ class UIRoot extends Component { }; showNonHistoriedDialog = (DialogClass, props = {}) => { + const { onSignInDialogVisibilityChanged } = this.props; + onSignInDialogVisibilityChanged && onSignInDialogVisibilityChanged(true); this.setState({ dialog: <DialogClass {...{ onClose: this.closeDialog, ...props }} /> }); @@ -748,6 +770,7 @@ class UIRoot extends Component { () => { this.showNonHistoriedDialog(TweetModalContainer, { hubChannel: this.props.hubChannel, + isAdmin: configs.isAdmin(), ...detail }); }, @@ -1054,6 +1077,7 @@ class UIRoot extends Component { const watching = this.state.watching; const enteredOrWatching = entered || watching; const showRtcDebugPanel = this.props.store.state.preferences["showRtcDebugPanel"]; + const showAudioDebugPanel = this.props.store.state.preferences["showAudioDebugPanel"]; const displayNameOverride = this.props.hubIsBound ? getPresenceProfileForSession(this.props.presences, this.props.sessionId).displayName : null; @@ -1415,7 +1439,7 @@ class UIRoot extends Component { active={this.state.sidebarId === "people"} onClick={() => this.toggleSidebar("people", { hasUnreadFriendUpdate: false })} notification={this.state.hasUnreadFriendUpdate} - presenceCount={this.state.presenceCount} + presencecount={this.state.presenceCount} /> </ContentMenu> )} @@ -1454,13 +1478,15 @@ class UIRoot extends Component { scene={this.props.scene} store={this.props.store} /> - {showRtcDebugPanel && ( + {(showRtcDebugPanel || showAudioDebugPanel) && ( <RTCDebugPanel history={this.props.history} store={window.APP.store} scene={this.props.scene} presences={this.props.presences} sessionId={this.props.sessionId} + showRtcDebug={showRtcDebugPanel} + showAudioDebug={showAudioDebugPanel} /> )} </> diff --git a/src/react-components/video-message.js b/src/react-components/video-message.js index 5d01f7ec2d..07688a6e4b 100644 --- a/src/react-components/video-message.js +++ b/src/react-components/video-message.js @@ -16,7 +16,7 @@ export default function VideoMessage({ name, body: { src: url }, className, mayS title: intl.formatMessage( { id: "video-message.default-tweet", - defaultMessage: "Taken in {shareHashtag}, join me at {url}" + defaultMessage: "Taken in {shareHashtag}" }, { shareHashtag: configs.translation("share-hashtag"), diff --git a/src/scene-entry-manager.js b/src/scene-entry-manager.js index 71ca6540cc..222b678468 100644 --- a/src/scene-entry-manager.js +++ b/src/scene-entry-manager.js @@ -1,7 +1,7 @@ import qsTruthy from "./utils/qs_truthy"; import nextTick from "./utils/next-tick"; -import pinnedEntityToGltf from "./utils/pinned-entity-to-gltf"; import { hackyMobileSafariTest } from "./utils/detect-touchscreen"; +import { isIOS as detectIOS } from "./utils/is-mobile"; import { SignInMessages } from "./react-components/auth/SignInModal"; const isBotMode = qsTruthy("bot"); @@ -11,7 +11,7 @@ const isMobileVR = AFRAME.utils.device.isMobileVR(); const isDebug = qsTruthy("debug"); const qs = new URLSearchParams(location.search); -import { addMedia, getPromotionTokenForFile } from "./utils/media-utils"; +import { addMedia } from "./utils/media-utils"; import { isIn2DInterstitial, handleExitTo2DInterstitial, @@ -22,7 +22,7 @@ import { ObjectContentOrigins } from "./object-types"; import { getAvatarSrc, getAvatarType } from "./utils/avatar-utils"; import { SOUND_ENTER_SCENE } from "./systems/sound-effects-system"; -const isIOS = AFRAME.utils.device.isIOS(); +const isIOS = detectIOS(); export default class SceneEntryManager { constructor(hubChannel, authChannel, history) { @@ -41,6 +41,7 @@ export default class SceneEntryManager { init = () => { this.whenSceneLoaded(() => { + console.log("Scene is loaded so setting up controllers"); this.rightCursorController.components["cursor-controller"].enabled = false; this.leftCursorController.components["cursor-controller"].enabled = false; this.mediaDevicesManager = window.APP.mediaDevicesManager; @@ -53,6 +54,7 @@ export default class SceneEntryManager { }; enterScene = async (enterInVR, muteOnEntry) => { + console.log("Entering scene..."); document.getElementById("viewing-camera").removeAttribute("scene-preview-camera"); if (isDebug && NAF.connection.adapter.session) { @@ -96,10 +98,6 @@ export default class SceneEntryManager { return; } - if (this.mediaDevicesManager.mediaStream) { - await NAF.connection.adapter.setLocalMediaStream(this.mediaDevicesManager.mediaStream); - } - this.scene.classList.remove("hand-cursor"); this.scene.classList.add("no-cursor"); @@ -109,7 +107,7 @@ export default class SceneEntryManager { // Delay sending entry event telemetry until VR display is presenting. (async () => { - while (enterInVR && !this.scene.renderer.vr.isPresenting()) { + while (enterInVR && !this.scene.renderer.xr.isPresenting) { await nextTick(); } @@ -123,15 +121,15 @@ export default class SceneEntryManager { this.scene.addState("entered"); - if (muteOnEntry) { - this.scene.emit("action_mute"); - } + APP.dialog.enableMicrophone(!muteOnEntry); }; whenSceneLoaded = callback => { if (this.scene.hasLoaded) { + console.log("Scene already loaded so callback invoked directly"); callback(); } else { + console.log("Scene not yet loaded so callback is deferred"); this.scene.addEventListener("loaded", callback); } }; @@ -142,8 +140,8 @@ export default class SceneEntryManager { exitScene = () => { this.scene.exitVR(); - if (NAF.connection.adapter && NAF.connection.adapter.localMediaStream) { - NAF.connection.adapter.localMediaStream.getTracks().forEach(t => t.stop()); + if (APP.dialog && APP.dialog.localMediaStream) { + APP.dialog.localMediaStream.getTracks().forEach(t => t.stop()); } if (this.hubChannel) { this.hubChannel.disconnect(); @@ -195,7 +193,7 @@ export default class SceneEntryManager { if (entity.components.networked.data.persistent) { NAF.utils.takeOwnership(entity); - this._unpinElement(entity); + window.APP.pinningHelper.unpinElement(entity); entity.parentNode.removeChild(entity); } else { NAF.entities.removeEntity(id); @@ -214,74 +212,6 @@ export default class SceneEntryManager { }); }; - _pinElement = async el => { - const { networkId } = el.components.networked.data; - - const { fileId, src } = el.components["media-loader"].data; - - let fileAccessToken, promotionToken; - if (fileId) { - fileAccessToken = new URL(src).searchParams.get("token"); - const storedPromotionToken = getPromotionTokenForFile(fileId); - if (storedPromotionToken) { - promotionToken = storedPromotionToken.promotionToken; - } - } - - const gltfNode = pinnedEntityToGltf(el); - if (!gltfNode) return; - el.setAttribute("networked", { persistent: true }); - el.setAttribute("media-loader", { fileIsOwned: true }); - - try { - await this.hubChannel.pin(networkId, gltfNode, fileId, fileAccessToken, promotionToken); - this.store.update({ activity: { hasPinned: true } }); - } catch (e) { - if (e.reason === "invalid_token") { - await this.authChannel.signOut(this.hubChannel); - this._signInAndPinOrUnpinElement(el); - } else { - console.warn("Pin failed for unknown reason", e); - } - } - }; - - _signInAndPinOrUnpinElement = (el, pin) => { - const action = pin - ? () => this._pinElement(el) - : async () => { - await this._unpinElement(el); - }; - - this.performConditionalSignIn( - () => this.hubChannel.signedIn, - action, - pin ? SignInMessages.pin : SignInMessages.unpin, - () => { - // UI pins/un-pins the entity optimistically, so we undo that here. - // Note we have to disable the sign in flow here otherwise this will recurse. - this._disableSignInOnPinAction = true; - el.setAttribute("pinnable", "pinned", !pin); - this._disableSignInOnPinAction = false; - } - ); - }; - - _unpinElement = el => { - const components = el.components; - const networked = components.networked; - - if (!networked || !networked.data || !NAF.utils.isMine(el)) return; - - const networkId = components.networked.data.networkId; - el.setAttribute("networked", { persistent: false }); - - const mediaLoader = components["media-loader"]; - const fileId = mediaLoader.data && mediaLoader.data.fileId; - - this.hubChannel.unpin(networkId, fileId); - }; - _setupMedia = () => { const offset = { x: 0, y: 0, z: -1.5 }; const spawnMediaInfrontOfPlayer = (src, contentOrigin) => { @@ -311,18 +241,6 @@ export default class SceneEntryManager { spawnMediaInfrontOfPlayer(e.detail, contentOrigin); }); - const handlePinEvent = (e, pinned) => { - if (this._disableSignInOnPinAction) return; - const el = e.detail.el; - - if (NAF.utils.isMine(el)) { - this._signInAndPinOrUnpinElement(e.detail.el, pinned); - } - }; - - this.scene.addEventListener("pinned", e => handlePinEvent(e, true)); - this.scene.addEventListener("unpinned", e => handlePinEvent(e, false)); - this.scene.addEventListener("object_spawned", e => { this.hubChannel.sendObjectSpawnedEvent(e.detail.objectType); }); @@ -502,7 +420,6 @@ export default class SceneEntryManager { this.scene.addEventListener("action_end_mic_sharing", async () => { await this.mediaDevicesManager.stopMicShare(); - this.scene.emit("action_mute"); }); this.scene.addEventListener("action_selected_media_result_entry", async e => { @@ -635,7 +552,7 @@ export default class SceneEntryManager { this.mediaDevicesManager.mediaStream.addTrack(audioDestination.stream.getAudioTracks()[0]); } - await NAF.connection.adapter.setLocalMediaStream(this.mediaDevicesManager.mediaStream); + await APP.dialog.setLocalMediaStream(this.mediaDevicesManager.mediaStream); audioEl.play(); }; } diff --git a/src/scene.html b/src/scene.html index 97b28e7ea8..d4a251a126 100644 --- a/src/scene.html +++ b/src/scene.html @@ -37,7 +37,6 @@ alpha: false;" shadow="type: pcfsoft;autoUpdate: false" light="defaultLightsEnabled: false" - environment-map > <a-entity id="scene-root" diff --git a/src/scene.js b/src/scene.js index ef244db12a..97cb351c96 100644 --- a/src/scene.js +++ b/src/scene.js @@ -1,4 +1,3 @@ -import "./webxr-bypass-hacks"; import "./utils/theme"; import "./utils/configs"; @@ -9,11 +8,13 @@ import "./assets/stylesheets/scene.scss"; import "aframe"; import "./utils/logging"; -import "./utils/threejs-world-update"; import { patchWebGLRenderingContext } from "./utils/webgl"; patchWebGLRenderingContext(); -import "three/examples/js/loaders/GLTFLoader"; +// It seems we need to use require to import modules +// under the three/examples/js to avoid tree shaking +// in webpack production mode. +require("three/examples/js/loaders/GLTFLoader"); import "./components/scene-components"; import "./components/debug"; @@ -29,6 +30,7 @@ import { disableiOSZoom } from "./utils/disable-ios-zoom"; import "./systems/scene-systems"; import "./gltf-component-mappings"; +import { EnvironmentSystem } from "./systems/environment-system"; import { App } from "./App"; @@ -61,6 +63,8 @@ function mountUI(scene, props = {}) { } const onReady = async () => { + console.log("Scene is ready"); + const scene = document.querySelector("a-scene"); window.APP.scene = scene; @@ -101,17 +105,25 @@ const onReady = async () => { }); }); + const envSystem = new EnvironmentSystem(scene); + sceneModelEntity.addEventListener("environment-scene-loaded", () => { remountUI({ sceneLoaded: true }); const previewCamera = gltfEl.object3D.getObjectByName("scene-preview-camera"); if (previewCamera) { + console.log("Setting up preview camera"); camera.object3D.position.copy(previewCamera.position); camera.object3D.rotation.copy(previewCamera.rotation); camera.object3D.matrixNeedsUpdate = true; + } else { + console.warn("No preview camera found"); } camera.setAttribute("scene-preview-camera", ""); + + const environmentEl = sceneModelEntity.childNodes[0]; + envSystem.updateEnvironment(environmentEl); }); const res = await fetchReticulumAuthenticated(`/api/v1/scenes/${sceneId}`); diff --git a/src/schema.toml b/src/schema.toml index 8a1e54eb67..e2ba1956a2 100644 --- a/src/schema.toml +++ b/src/schema.toml @@ -29,7 +29,7 @@ features.public_rooms = { category = "features", type = "boolean", name = "Publi features.default_room_id = { category = "features", type = "string", name = "Homepage Room ID", description = "Use the specified room in place of the homepage."} features.enable_spoke = { category = "features", type = "boolean", name = "Enable Scene Editor", description = "Enable Scene Editor for all visitors."} features.enable_lobby_ghosts = { category = "features", type = "boolean", name = "Enable Lobby Ghosts", description = "Allow people in the lobby to explore the room while remaining invisible and inaudible." } -features.public_api_access = { category = "features", type = "boolean", name = "Public API Access", description = "Enables a publicly-accessible API for managing backend resources programmatically.", internal = "true" } +features.public_api_access = { category = "features", type = "boolean", name = "Public API Access", description = "Enables a publicly-accessible API for managing backend resources programmatically.", internal = "false" } features.permissive_rooms = { category = "rooms", type = "boolean", name = "Permissive Rooms", description = "Enable full content creation permissions on new rooms." } features.disable_room_creation = { category = "rooms", type = "boolean", name = "Disable room creation", description = "Disable creating rooms for non-administrators." } @@ -48,6 +48,7 @@ features.show_cloud = { category = "features", type = "boolean", internal = "tru features.show_newsletter_signup = { category = "features", type = "boolean", internal = "true" } images.logo = { category = "images", type = "file", name = "App Logo", description = "Logo used across the app." } +images.logo_dark = { category = "images", type = "file", name = "App Logo Dark", description = "Logo used across the app in dark mode." } images.favicon = { category = "images", type = "file", name = "Favicon", description = "Icon for the app." } images.app_icon = { category = "images", type = "file", name = "App Icon", description = "Icon for the app." } images.app_thumbnail = { category = "images", type = "file", name = "App Thumbnail", description = "Thumbnail for app." } diff --git a/src/storage/store.js b/src/storage/store.js index 501ad26424..fb6afc458a 100644 --- a/src/storage/store.js +++ b/src/storage/store.js @@ -3,7 +3,6 @@ import merge from "deepmerge"; import Cookies from "js-cookie"; import jwtDecode from "jwt-decode"; import { qsGet } from "../utils/qs_truthy.js"; -import { isSafari } from "../utils/detect-safari"; const LOCAL_STORE_KEY = "___hubs_store"; const STORE_STATE_CACHE_KEY = Symbol(); @@ -116,6 +115,8 @@ export const SCHEMA = { showFPSCounter: { type: "bool" }, allowMultipleHubsInstances: { type: "bool" }, disableIdleDetection: { type: "bool" }, + fastRoomSwitching: { type: "bool" }, + lazyLoadSceneMedia: { type: "bool" }, preferMobileObjectInfoPanel: { type: "bool" }, maxResolutionWidth: { type: "number" }, maxResolutionHeight: { type: "number" }, @@ -136,6 +137,9 @@ export const SCHEMA = { disableAutoGainControl: { type: "bool" }, locale: { type: "string" }, showRtcDebugPanel: { type: "bool" }, + showAudioDebugPanel: { type: "bool" }, + enableAudioClipping: { type: "bool" }, + audioClippingThreshold: { type: "number" }, theme: { type: "string" } } }, @@ -249,12 +253,6 @@ export default class Store extends EventTarget { preferences: {} }); - // Temporary fix for distorted audio in Safari. - // See https://github.com/mozilla/hubs/issues/4411 - if (isSafari()) { - this.update({ preferences: { audioOutputMode: "audio" } }); - } - this._shouldResetAvatarOnInit = false; const oauthFlowCredentials = Cookies.getJSON(OAUTH_FLOW_CREDENTIALS_KEY); @@ -265,6 +263,18 @@ export default class Store extends EventTarget { } this._signOutOnExpiredAuthToken(); + + const maybeDispatchThemeChanged = (() => { + let previous; + return () => { + const current = this.state.preferences.theme; + if ((previous || current) && previous !== current) { + this.dispatchEvent(new CustomEvent("themechanged", { detail: { current, previous } })); + } + previous = current; + }; + })(); + this.addEventListener("statechanged", maybeDispatchThemeChanged); } _signOutOnExpiredAuthToken = () => { diff --git a/src/subscriptions.js b/src/subscriptions.js index 9e0e9171e2..dc43e0bf3b 100644 --- a/src/subscriptions.js +++ b/src/subscriptions.js @@ -21,15 +21,36 @@ export default class Subscriptions { this.hubId = hubId; } + register() { + if (navigator.serviceWorker) { + try { + navigator.serviceWorker + .register("/hub.service.js") + .then(() => { + navigator.serviceWorker.ready + .then(registration => this.setRegistration(registration)) + .catch(e => this.setRegistrationFailed(e)); + }) + .catch(e => this.setRegistrationFailed(e)); + } catch (e) { + this.setRegistrationFailed(e); + } + } else { + this.setRegistrationFailed("Not supported"); + } + } + setHubChannel = hubChannel => { this.hubChannel = hubChannel; }; setRegistration = registration => { + console.log("Service worker registered"); this.registration = registration; }; - setRegistrationFailed = () => { + setRegistrationFailed = e => { + console.error("Service worker registration failed", e); this.registration = null; }; diff --git a/src/systems/audio-debug-system.js b/src/systems/audio-debug-system.js new file mode 100644 index 0000000000..cb20d0518a --- /dev/null +++ b/src/systems/audio-debug-system.js @@ -0,0 +1,206 @@ +import { THREE } from "aframe"; +import audioDebugVert from "./audio-debug.vert"; +import audioDebugFrag from "./audio-debug.frag"; +import { DistanceModelType } from "../components/audio-params"; +import { getWebGLVersion } from "../utils/webgl"; +import { getMeshes } from "../utils/aframe-utils"; + +const MAX_DEBUG_SOURCES = 64; + +const fakePanner = { + distanceModel: DistanceModelType.Inverse, + maxDistance: 0, + refDistance: 0, + rolloffFactor: 0, + coneInnerAngle: 0, + coneOuterAngle: 0 +}; + +AFRAME.registerSystem("audio-debug", { + schema: { + enabled: { default: false } + }, + + init() { + this.unsupported = false; + const webGLVersion = getWebGLVersion(this.el.sceneEl.renderer); + if (webGLVersion < "2.0") { + this.unsupported = true; + } + + window.APP.store.addEventListener("statechanged", this.updateState.bind(this)); + + this.onSceneLoaded = this.onSceneLoaded.bind(this); + this.el.sceneEl.addEventListener("environment-scene-loaded", this.onSceneLoaded); + + this.navMeshObject = null; + this.zones = []; + + this.material = new THREE.ShaderMaterial({ + uniforms: { + time: { value: 0.0 }, + colorInner: { value: new THREE.Color("#7AFF59") }, + colorOuter: { value: new THREE.Color("#FF6340") }, + colorGain: { value: new THREE.Color("#70DBFF") }, + count: { value: 0 }, + maxDistance: { value: [] }, + refDistance: { value: [] }, + rolloffFactor: { value: [] }, + distanceModel: { value: [] }, + sourcePosition: { value: [] }, + sourceOrientation: { value: [] }, + coneInnerAngle: { value: [] }, + coneOuterAngle: { value: [] }, + gain: { value: [] }, + clipped: { value: [] } + }, + vertexShader: audioDebugVert, + fragmentShader: audioDebugFrag + }); + this.material.side = THREE.FrontSide; + this.material.transparent = true; + this.material.uniforms.count.value = 0; + this.material.defines.MAX_DEBUG_SOURCES = MAX_DEBUG_SOURCES; + + this.sourcePositions = new Array(MAX_DEBUG_SOURCES); + this.sourcePositions.fill(new THREE.Vector3()); + this.sourceOrientations = new Array(MAX_DEBUG_SOURCES); + this.sourceOrientations.fill(new THREE.Vector3()); + this.distanceModels = new Array(MAX_DEBUG_SOURCES); + this.distanceModels.fill(0); + this.maxDistances = new Array(MAX_DEBUG_SOURCES); + this.maxDistances.fill(0.0); + this.refDistances = new Array(MAX_DEBUG_SOURCES); + this.refDistances.fill(0.0); + this.rolloffFactors = new Array(MAX_DEBUG_SOURCES); + this.rolloffFactors.fill(0.0); + this.coneInnerAngles = new Array(MAX_DEBUG_SOURCES); + this.coneInnerAngles.fill(0.0); + this.coneOuterAngles = new Array(MAX_DEBUG_SOURCES); + this.coneOuterAngles.fill(0.0); + this.gains = new Array(MAX_DEBUG_SOURCES); + this.gains.fill(0.0); + this.clipped = new Array(MAX_DEBUG_SOURCES); + this.clipped.fill(0.0); + }, + + remove() { + window.APP.store.removeEventListener("statechanged", this.updateState); + this.el.sceneEl.removeEventListener("environment-scene-loaded", this.onSceneLoaded); + }, + + registerZone(zone) { + this.zones.push(zone); + }, + + unregisterZone(zone) { + const index = this.zones.indexOf(zone); + + if (index !== -1) { + this.zones.splice(index, 1); + } + }, + + tick: (() => { + const sourcePos = new THREE.Vector3(); + const sourceDir = new THREE.Vector3(); + return function(time) { + if (!this.data.enabled) { + return; + } + + let sourceNum = 0; + for (const [el, audio] of APP.audios.entries()) { + if (sourceNum >= MAX_DEBUG_SOURCES) continue; + if (APP.isAudioPaused.has(el)) continue; + + audio.getWorldPosition(sourcePos); + audio.getWorldDirection(sourceDir); + this.sourcePositions[sourceNum] = this.navMeshObject.worldToLocal(sourcePos).clone(); // TODO: Use Vector3 pool + this.sourceOrientations[sourceNum] = this.navMeshObject.worldToLocal(sourceDir).clone(); + + const panner = audio.panner || fakePanner; + + this.distanceModels[sourceNum] = 0; + if (panner.distanceModel === DistanceModelType.Linear) { + this.distanceModels[sourceNum] = 0; + } else if (panner.distanceModel === DistanceModelType.Inverse) { + this.distanceModels[sourceNum] = 1; + } else if (panner.distanceModel === DistanceModelType.Exponential) { + this.distanceModels[sourceNum] = 2; + } + this.maxDistances[sourceNum] = panner.maxDistance; + this.refDistances[sourceNum] = panner.refDistance; + this.rolloffFactors[sourceNum] = panner.rolloffFactor; + this.coneInnerAngles[sourceNum] = panner.coneInnerAngle; + this.coneOuterAngles[sourceNum] = panner.coneOuterAngle; + + this.gains[sourceNum] = audio.gain.gain.value; + this.clipped[sourceNum] = APP.clippingState.has(el); + sourceNum++; + } + + // Update material uniforms + this.material.uniforms.time.value = time; + this.material.uniforms.distanceModel.value = this.distanceModels; + this.material.uniforms.maxDistance.value = this.maxDistances; + this.material.uniforms.refDistance.value = this.refDistances; + this.material.uniforms.rolloffFactor.value = this.rolloffFactors; + this.material.uniforms.sourcePosition.value = this.sourcePositions; + this.material.uniforms.sourceOrientation.value = this.sourceOrientations; + this.material.uniforms.count.value = sourceNum; + this.material.uniforms.coneInnerAngle.value = this.coneInnerAngles; + this.material.uniforms.coneOuterAngle.value = this.coneOuterAngles; + this.material.uniforms.gain.value = this.gains; + this.material.uniforms.clipped.value = this.clipped; + }; + })(), + + enableDebugMode(enabled, force = false) { + if (((enabled === undefined || enabled === this.data.enabled) && !force) || this.unsupported) return; + this.zones.forEach(zone => { + zone.el.setAttribute("audio-zone", "debuggable", enabled); + }); + + const collisionEntities = Array.from(this.el.sceneEl.querySelectorAll("[nav-mesh]")); + const meshes = getMeshes(collisionEntities); + + if (meshes.length) { + this.data.enabled = enabled; + meshes.forEach(obj => { + if (obj.isMesh) { + this.navMeshObject = obj; + obj.parent.visible = enabled; + if (obj.material) { + if (enabled) { + !obj._hubs_audio_debug_prev_material && (obj._hubs_audio_debug_prev_material = obj.material); + obj.material = this.material; + obj.material.needsUpdate = true; + } else if (obj._hubs_audio_debug_prev_material) { + obj.material = obj._hubs_audio_debug_prev_material; + obj._hubs_audio_debug_prev_material = null; + obj.material.needsUpdate = true; + } + obj.geometry.computeVertexNormals(); + } + } + }); + } + + if (!this.navMeshObject) { + this.data.enabled = false; + } + }, + + updateState({ force }) { + const isEnabled = window.APP.store.state.preferences.showAudioDebugPanel || false; + if (force || isEnabled !== this.data.enabled) { + this.enableDebugMode(isEnabled, force); + } + }, + + onSceneLoaded() { + this.navMeshObject = null; + this.updateState({ force: true }); + } +}); diff --git a/src/systems/audio-debug.frag b/src/systems/audio-debug.frag new file mode 100644 index 0000000000..6769936406 --- /dev/null +++ b/src/systems/audio-debug.frag @@ -0,0 +1,162 @@ +// Based on: https://www.shadertoy.com/view/Mll3D4# + +precision highp float; +precision highp int; + +varying vec2 vUv; +varying vec3 vNormal; +uniform float time; + +const int LINEAR = 0; +const int INVERSE = 1; +const int EXPONENTIAL = 2; + +uniform vec3 colorInner; +uniform vec3 colorOuter; +uniform vec3 colorGain; +uniform int count; +uniform vec3 sourcePosition[MAX_DEBUG_SOURCES]; +uniform vec3 sourceOrientation[MAX_DEBUG_SOURCES]; +uniform float maxDistance[MAX_DEBUG_SOURCES]; +uniform float refDistance[MAX_DEBUG_SOURCES]; +uniform float rolloffFactor[MAX_DEBUG_SOURCES]; +uniform int distanceModel[MAX_DEBUG_SOURCES]; +uniform float coneInnerAngle[MAX_DEBUG_SOURCES]; +uniform float coneOuterAngle[MAX_DEBUG_SOURCES]; +uniform float gain[MAX_DEBUG_SOURCES]; +uniform bool clipped[MAX_DEBUG_SOURCES]; + +const float kPi = 3.141592; +const float kDegToRad = kPi / 180.0; +const float kInvPi = 1.0 / 3.141592; +const float kRefDistWidth = 0.05; + +float distance[MAX_DEBUG_SOURCES]; +vec2 center[MAX_DEBUG_SOURCES]; +float startOffset[MAX_DEBUG_SOURCES]; +float clampedGain[MAX_DEBUG_SOURCES]; + +float att_linear(float x, float rolloff, float dref, float dmax) { + return 1.0-(rolloff*((x-dref)/(dmax-dref))); +} + +float att_inverse(float x, float rolloff, float dref) { + return dref/(dref+(rolloff*(max(x, dref)-dref))); +} + +float att_exponential(float x, float rolloff, float dref) { + return pow((max(x, dref)/dref),-rolloff); +} + +vec4 circle(vec2 center, float d, float len, float radius, float holeRadius, vec3 color, float offset) { + // Define how blurry the circle should be. + // A value of 1.0 means 'sharp', larger values + // will increase the bluriness. + float bluriness = 1.0; + + // Calculate angle, so we can draw segments, too. + float angle = atan( center.x, center.y ) * kInvPi * 0.5; + angle = fract( angle + offset); + + // Create an anti-aliased circle. + float wd = bluriness * fwidth( d ); + float circle = smoothstep( radius + wd, radius - wd, d ); + + // Optionally, you could create a hole in it: + float inner = holeRadius; + circle -= smoothstep( inner + wd, inner - wd, d ); + + // Or only draw a portion (segment) of the circle. + float wa = bluriness * fwidth( angle ); + float segment = smoothstep( len + wa, len - wa, angle ); + segment *= smoothstep( 0.0, 2.0 * wa, angle ); + circle *= mix( segment, 1.0, step( 1.0, len ) ); + + // Let's define the circle's color now. + vec3 rgb = color * circle; + + // Output final color. + return vec4( rgb, circle); +} + +float att(float d, float maxDistance, float refDistance, float rolloffFactor, int distanceModel) { + // Calculate attenuation + float attenuation = 1.0; + if (distanceModel == LINEAR) { + attenuation = att_linear(d, rolloffFactor, refDistance, maxDistance); + } else if (distanceModel == INVERSE) { + attenuation = att_inverse(d, rolloffFactor, refDistance); + } else if (distanceModel == EXPONENTIAL) { + attenuation = att_exponential(d, rolloffFactor, refDistance); + } + return clamp(attenuation, 0.0, 1.0); +} + +vec4 draw_att(float d, float attenuation, vec4 circle) { + // Waves + float v = sin((d * 2.0 * kPi) - (time * 0.005)) + 1.0; + float waves = circle.a * attenuation * v; + + // Output final color. + return vec4( circle.rgb, waves ); +} + +void main() { + // Draw background + vec4 background = vec4(1.0, 1.0, 1.0, 0.0); + + for (int i=0; i<count; i++) { + center[i] = sourcePosition[i].xz - vUv; + + // Calculate distance to (0,0). + distance[i] = length( center[i] ); + + // Optional start Offset. + vec2 orientation = normalize(sourceOrientation[i].xz); + float ang = atan(-orientation.x, orientation.y) * kInvPi * 0.5; + // Rotate to start drawing facing front + ang -= 0.5; + startOffset[i] = mod(ang, 1.0); + + // Gain + clampedGain[i] = clamp(gain[i], 0.0, 1.0); + } + + for (int i=0; i<count; i++) { + float attenuation = att(distance[i], maxDistance[i], refDistance[i], rolloffFactor[i], distanceModel[i]); + + // Draw inner cone + float innerAngle = coneInnerAngle[i] * kDegToRad * kInvPi * 0.5; + float innerStartAngle = startOffset[i] + innerAngle * 0.5; + vec4 innerLayer = circle(center[i], distance[i], innerAngle, 10000.0, 1.0, colorInner, innerStartAngle); + innerLayer = draw_att(distance[i], attenuation, innerLayer); + background = mix(background, innerLayer, innerLayer.a * clampedGain[i]); + + // Draw outer cone + float outerAngle = coneOuterAngle[i] * kDegToRad * kInvPi * 0.5; + float outerAngleDiffHalf = (outerAngle - innerAngle) * 0.5; + vec4 outerLayer1 = circle(center[i], distance[i], outerAngleDiffHalf, 10000.0, 1.0, colorOuter, innerStartAngle + outerAngleDiffHalf); + outerLayer1 = draw_att(distance[i], attenuation, outerLayer1); + background = mix(background, outerLayer1, outerLayer1.a * clampedGain[i]); + vec4 outerLayer2 = circle(center[i], distance[i], outerAngleDiffHalf, 10000.0, 1.0, colorOuter, innerStartAngle - innerAngle); + outerLayer2 = draw_att(distance[i], attenuation, outerLayer2); + background = mix(background, outerLayer2, outerLayer2.a * (clipped[i] ? 0.0 : 1.0) * clampedGain[i]); + } + + for (int i=0; i<count; i++) { + // Draw base + vec4 baseLayer = circle(center[i], distance[i], 1.0, 1.0, 0.1, vec3(0.5, 0.5, 0.5), 0.0); + background = mix(background, baseLayer, baseLayer.a); + + // Draw gain + vec4 gainLayer = circle(center[i], distance[i], clampedGain[i], 1.0, 0.5, colorGain, startOffset[i]); + background = mix(background, gainLayer, gainLayer.a); + if (gain[i] > 1.0) { + vec4 overGainLayer = circle(center[i], distance[i], gain[i] - clampedGain[i], 1.0, 0.5, vec3(1.0, 0.0, 0.0), startOffset[i]); + background = mix(background, overGainLayer, overGainLayer.a); + } + } + + // Blend + gl_FragColor = vec4(background.rgb, background.a * vNormal.y); +} \ No newline at end of file diff --git a/src/systems/audio-debug.vert b/src/systems/audio-debug.vert new file mode 100644 index 0000000000..305fc8dcd5 --- /dev/null +++ b/src/systems/audio-debug.vert @@ -0,0 +1,11 @@ +precision highp float; +precision highp int; + +varying vec2 vUv; +varying vec3 vNormal; +void main() +{ + vNormal = normalize(normal); + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + vUv = position.xz; +} \ No newline at end of file diff --git a/src/systems/audio-gain-system.js b/src/systems/audio-gain-system.js new file mode 100644 index 0000000000..0ad69f6e9a --- /dev/null +++ b/src/systems/audio-gain-system.js @@ -0,0 +1,90 @@ +import { CLIPPING_THRESHOLD_ENABLED, CLIPPING_THRESHOLD_DEFAULT } from "../react-components/preferences-screen"; +import { + getCurrentAudioSettings, + shouldAddSupplementaryAttenuation, + updateAudioSettings +} from "../update-audio-settings"; + +function isClippingEnabled() { + const { enableAudioClipping } = window.APP.store.state.preferences; + return enableAudioClipping !== undefined ? enableAudioClipping : CLIPPING_THRESHOLD_ENABLED; +} + +function getClippingThreshold() { + const { audioClippingThreshold } = window.APP.store.state.preferences; + return audioClippingThreshold !== undefined ? audioClippingThreshold : CLIPPING_THRESHOLD_DEFAULT; +} + +const distanceModels = { + linear: function(distance, rolloffFactor, refDistance, maxDistance) { + return 1.0 - rolloffFactor * ((distance - refDistance) / (maxDistance - refDistance)); + }, + inverse: function(distance, rolloffFactor, refDistance) { + return refDistance / (refDistance + rolloffFactor * (Math.max(distance, refDistance) - refDistance)); + }, + exponential: function(distance, rolloffFactor, refDistance) { + return Math.pow(Math.max(distance, refDistance) / refDistance, -rolloffFactor); + } +}; + +const calculateAttenuation = (() => { + const listenerPos = new THREE.Vector3(); + const sourcePos = new THREE.Vector3(); + return (el, audio) => { + el.sceneEl.audioListener.getWorldPosition(listenerPos); + audio.getWorldPosition(sourcePos); + const distance = sourcePos.distanceTo(listenerPos); + if (audio.panner) { + return distanceModels[audio.panner.distanceModel]( + distance, + audio.panner.rolloffFactor, + audio.panner.refDistance, + audio.panner.maxDistance + // TODO: Why are coneInnerAngle, coneOuterAngle and coneOuterGain not used? + ); + } else { + const { distanceModel, rolloffFactor, refDistance, maxDistance } = getCurrentAudioSettings(el); + if (!distanceModel) { + // Apparently, it is valid to give null as your distanceModel + return 1.0; + } + if (!distanceModels[distanceModel]) { + // TODO: Validate properties earlier in the process. + console.error("Unrecognized distance model."); + return 1.0; + } + + return distanceModels[distanceModel](distance, rolloffFactor, refDistance, maxDistance); + } + }; +})(); + +// TODO: Rename "GainSystem" because the name is suspicious +export class GainSystem { + tick() { + const clippingEnabled = isClippingEnabled(); + const clippingThreshold = getClippingThreshold(); + for (const [el, audio] of APP.audios.entries()) { + const attenuation = calculateAttenuation(el, audio); + + if (shouldAddSupplementaryAttenuation(el, audio)) { + APP.supplementaryAttenuation.set(el, attenuation); + updateAudioSettings(el, audio); + } else if (APP.supplementaryAttenuation.has(el)) { + APP.supplementaryAttenuation.delete(el); + updateAudioSettings(el, audio); + } + + const isClipped = APP.clippingState.has(el); + const shouldBeClipped = clippingEnabled && attenuation < clippingThreshold; + if (isClipped !== shouldBeClipped) { + if (shouldBeClipped) { + APP.clippingState.add(el); + } else { + APP.clippingState.delete(el); + } + updateAudioSettings(el, audio); + } + } + } +} diff --git a/src/systems/audio-settings-system.js b/src/systems/audio-settings-system.js index 2b0471c0de..765b6866cf 100644 --- a/src/systems/audio-settings-system.js +++ b/src/systems/audio-settings-system.js @@ -1,143 +1,34 @@ -import { isSafari } from "../utils/detect-safari"; - -function updateMediaAudioSettings(mediaVideo, settings) { - mediaVideo.el.setAttribute("media-video", { - distanceModel: settings.mediaDistanceModel, - rolloffFactor: settings.mediaRolloffFactor, - refDistance: settings.mediaRefDistance, - maxDistance: settings.mediaMaxDistance, - coneInnerAngle: settings.mediaConeInnerAngle, - coneOuterAngle: settings.mediaConeOuterAngle, - coneOuterGain: settings.mediaConeOuterGain - }); -} - -function updateAvatarAudioSettings(avatarAudioSource, settings, positional) { - avatarAudioSource.el.setAttribute("avatar-audio-source", { - positional, - distanceModel: settings.avatarDistanceModel, - maxDistance: settings.avatarMaxDistance, - refDistance: settings.avatarRefDistance, - rolloffFactor: settings.avatarRolloffFactor - }); -} +import { SourceType } from "../components/audio-params"; +import { updateAudioSettings } from "../update-audio-settings"; export class AudioSettingsSystem { constructor(sceneEl) { - this.sceneEl = sceneEl; - this.defaultSettings = { - avatarDistanceModel: "inverse", - avatarRolloffFactor: 2, - avatarRefDistance: 1, - avatarMaxDistance: 10000, - mediaVolume: 0.5, - mediaDistanceModel: "inverse", - mediaRolloffFactor: 1, - mediaRefDistance: 1, - mediaMaxDistance: 10000, - mediaConeInnerAngle: 360, - mediaConeOuterAngle: 0, - mediaConeOuterGain: 0 - }; - this.audioSettings = this.defaultSettings; - this.mediaVideos = []; - this.avatarAudioSources = []; - - this.sceneEl.addEventListener("reset_scene", this.onSceneReset); + sceneEl.addEventListener("reset_scene", this.onSceneReset); + + // HACK We are scared that users are going to set this preference and then + // forget about it and have a bad time, so we always remove the preference + // whenever the user refreshes the page. + // TODO: This is pretty weird and surprising. If the preference is exposed + // in the preference screen, then we would not be so scared about this. + // Also, if we feel so concerned about people using it, we should consider + // ways to make it safer or remove it. + window.APP.store.update({ + preferences: { audioOutputMode: undefined } + }); - // Do not force panner audio in Safari as a temporary fix for distorted audio. - // See https://github.com/mozilla/hubs/issues/4411 - if (!isSafari() && window.APP.store.state.preferences.audioOutputMode === "audio") { - //hack to always reset to "panner" - window.APP.store.update({ - preferences: { audioOutputMode: "panner" } - }); - } if (window.APP.store.state.preferences.audioNormalization !== 0.0) { //hack to always reset to 0.0 (disabled) window.APP.store.update({ preferences: { audioNormalization: 0.0 } }); } - - this.audioOutputMode = window.APP.store.state.preferences.audioOutputMode; - this.onPreferenceChanged = () => { - const newPref = window.APP.store.state.preferences.audioOutputMode; - const shouldUpdateAudioSettings = this.audioOutputMode !== newPref; - this.audioOutputMode = newPref; - if (shouldUpdateAudioSettings) { - this.updateAudioSettings(this.audioSettings); - } - }; - window.APP.store.addEventListener("statechanged", this.onPreferenceChanged); - } - - registerMediaAudioSource(mediaVideo) { - const index = this.mediaVideos.indexOf(mediaVideo); - if (index === -1) { - this.mediaVideos.push(mediaVideo); - } - updateMediaAudioSettings(mediaVideo, this.audioSettings); - } - - unregisterMediaAudioSource(mediaVideo) { - this.mediaVideos.splice(this.mediaVideos.indexOf(mediaVideo), 1); - } - - registerAvatarAudioSource(avatarAudioSource) { - const index = this.avatarAudioSources.indexOf(avatarAudioSource); - if (index === -1) { - this.avatarAudioSources.push(avatarAudioSource); - } - const positional = window.APP.store.state.preferences.audioOutputMode !== "audio"; - updateAvatarAudioSettings(avatarAudioSource, this.audioSettings, positional); - } - - unregisterAvatarAudioSource(avatarAudioSource) { - const index = this.avatarAudioSources.indexOf(avatarAudioSource); - if (index !== -1) { - this.avatarAudioSources.splice(index, 1); - } - } - - updateAudioSettings(settings) { - this.audioSettings = Object.assign({}, this.defaultSettings, settings); - - for (const mediaVideo of this.mediaVideos) { - updateMediaAudioSettings(mediaVideo, settings); - } - - const positional = window.APP.store.state.preferences.audioOutputMode !== "audio"; - for (const avatarAudioSource of this.avatarAudioSources) { - updateAvatarAudioSettings(avatarAudioSource, settings, positional); - } } onSceneReset = () => { - this.updateAudioSettings(this.defaultSettings); + APP.sceneAudioDefaults.delete(SourceType.AVATAR_AUDIO_SOURCE); + APP.sceneAudioDefaults.delete(SourceType.MEDIA_VIDEO); + for (const [el, audio] of APP.audios.entries()) { + updateAudioSettings(el, audio); + } }; } - -AFRAME.registerComponent("use-audio-system-settings", { - init() { - this.onVideoLoaded = this.onVideoLoaded.bind(this); - this.el.addEventListener("video-loaded", this.onVideoLoaded); - }, - - onVideoLoaded() { - const audioSettingsSystem = this.el.sceneEl.systems["hubs-systems"].audioSettingsSystem; - if (this.mediaVideo) { - audioSettingsSystem.unregisterMediaAudioSource(this.mediaVideo); - } - this.mediaVideo = this.el.components["media-video"]; - audioSettingsSystem.registerMediaAudioSource(this.mediaVideo); - }, - - remove() { - const audioSettingsSystem = this.el.sceneEl.systems["hubs-systems"].audioSettingsSystem; - if (this.mediaVideo) { - audioSettingsSystem.unregisterMediaAudioSource(this.mediaVideo); - } - this.el.removeEventListener("video-loaded", this.onVideoLoaded); - } -}); diff --git a/src/systems/audio-system.js b/src/systems/audio-system.js index ac125858c2..112122e07e 100644 --- a/src/systems/audio-system.js +++ b/src/systems/audio-system.js @@ -1,4 +1,5 @@ import { LogMessageType } from "../react-components/room/ChatSidebar"; +import { GAIN_TIME_CONST, SourceType } from "../components/audio-params"; let delayedReconnectTimeout = null; function performDelayedReconnect(gainNode) { @@ -137,11 +138,21 @@ export class AudioSystem { this.outboundAnalyser.connect(this.mediaStreamDestinationNode); this.audioContextNeedsToBeResumed = false; + this.mixer = { + [SourceType.AVATAR_AUDIO_SOURCE]: this.audioContext.createGain(), + [SourceType.MEDIA_VIDEO]: this.audioContext.createGain() + }; + this.mixer[SourceType.AVATAR_AUDIO_SOURCE].connect(this._sceneEl.audioListener.getInput()); + this.mixer[SourceType.MEDIA_VIDEO].connect(this._sceneEl.audioListener.getInput()); + // Webkit Mobile fix this._safariMobileAudioInterruptionFix(); document.body.addEventListener("touchend", this._resumeAudioContext, false); document.body.addEventListener("mouseup", this._resumeAudioContext, false); + + this.onPrefsUpdated = this.updatePrefs.bind(this); + window.APP.store.addEventListener("statechanged", this.onPrefsUpdated); } addStreamToOutboundAudio(id, mediaStream) { @@ -165,6 +176,29 @@ export class AudioSystem { } } + addAudio(mixerTrack, audioNode) { + this.removeAudio(audioNode); + audioNode.gain.connect(this.mixer[mixerTrack]); + } + + removeAudio(audioNode) { + audioNode.gain.disconnect(); + audioNode.sourceType !== "empty" && audioNode.disconnect(); + } + + updatePrefs() { + const { globalVoiceVolume, globalMediaVolume } = window.APP.store.state.preferences; + let newGain = (globalMediaVolume !== undefined ? globalMediaVolume : 100) / 100; + this.mixer[SourceType.MEDIA_VIDEO].gain.setTargetAtTime(newGain, this.audioContext.currentTime, GAIN_TIME_CONST); + + newGain = (globalVoiceVolume !== undefined ? globalVoiceVolume : 100) / 100; + this.mixer[SourceType.AVATAR_AUDIO_SOURCE].gain.setTargetAtTime( + newGain, + this.audioContext.currentTime, + GAIN_TIME_CONST + ); + } + /** * Chrome and Safari will start Audio contexts in a "suspended" state. * A user interaction (touch/mouse event) is needed in order to resume the AudioContext. diff --git a/src/systems/audio-zones-system.js b/src/systems/audio-zones-system.js new file mode 100644 index 0000000000..5610eb3280 --- /dev/null +++ b/src/systems/audio-zones-system.js @@ -0,0 +1,189 @@ +// We apply the most restrictive audio parameters +function paramsReducer(acc, curr) { + if (!curr && !acc) return {}; + else if (curr && !acc) return curr; + else if (!curr && acc) return acc; + else + return [ + "gain", + "maxDistance", + "refDistance", + "rolloffFactor", + "coneInnerAngle", + "coneOuterAngle", + "coneOuterGain" + ].reduce((result, key) => { + if (curr[key] !== undefined && acc[key] !== undefined) { + result[key] = Math.min(acc[key], curr[key]); + } else if (curr[key] !== undefined && acc[key] === undefined) { + result[key] = curr[key]; + } else if (curr[key] === undefined && acc[key] !== undefined) { + result[key] = acc[key]; + } + return result; + }, {}); +} + +function addOrRemoveZone(zones, zone, position) { + const isInZone = zone.isEnabled() && zone.contains(position); + const wasInZone = zones.has(zone); + if (isInZone && !wasInZone) { + zones.add(zone); + } else if (!isInZone && wasInZone) { + zones.delete(zone); + } +} + +function any(set, predicate) { + for (const item of set) { + if (predicate(item)) return true; + } + return false; +} + +function isUpdated(currZones, prevZones) { + return currZones.size !== prevZones.size || any(currZones, zone => !prevZones.has(zone)); +} + +const setRay = (function() { + const direction = new THREE.Vector3(); + return function setRay(ray, from, to) { + ray.set(from, direction.subVectors(to, from).normalize()); + }; +})(); + +function exclude(zones) { + return zone => { + return !zones.has(zone); + }; +} + +function hasIntersection(ray) { + const intersectTarget = new THREE.Vector3(); + return zone => { + ray.intersectBox(zone.getBoundingBox(), intersectTarget); + return intersectTarget !== null; + }; +} +const updateSource = (function() { + const ray = new THREE.Ray(); + return function updateSource(source, sourcePosition, sourceZones, listenerPosition, listenerZones) { + setRay(ray, listenerPosition, sourcePosition); + + // TODO: Reimplement the desired sorting of zones + const inOutParams = Array.from(sourceZones) + .filter(zone => zone.data.inOut) + .filter(exclude(listenerZones)) + .filter(hasIntersection(ray)) + .map(zone => zone.getAudioParams()) + .reduce(paramsReducer, null); + + // TODO: Reimplement the desired sorting of zones + const outInParams = Array.from(listenerZones) + .filter(zone => zone.data.outIn) + .filter(exclude(sourceZones)) + .filter(hasIntersection(ray)) + .map(zone => zone.getAudioParams()) + .reduce(paramsReducer, null); + + if (!outInParams && !inOutParams) { + source.restore(); + } else if (outInParams && !inOutParams) { + source.apply(outInParams); + } else if (!outInParams && inOutParams) { + source.apply(inOutParams); + } else { + // In this case two zones ar acting over the same source simultaneously. + // We apply the closest zone params with the lowest gain + source.apply( + Object.assign( + {}, + inOutParams, + outInParams, + paramsReducer( + { + gain: outInParams.gain + }, + { + gain: inOutParams.gain + } + ) + ) + ); + } + }; +})(); + +export class AudioZonesSystem { + constructor() { + this.zones = []; + this.sources = []; + this.entities = []; + this.currZones = new Map(); + this.prevZones = new Map(); + this.didRegisterAudioListener = false; + } + registerZone(zone) { + this.zones.push(zone); + } + unregisterZone(zone) { + this.zones.splice(this.zones.indexOf(zone), 1); + this.entities.forEach(entity => { + this.currZones.get(entity).delete(zone); + }); + } + registerSource(source) { + this.sources.push(source); + this.registerEntity(source); + } + unregisterSource(source) { + this.sources.splice(this.sources.indexOf(source), 1); + this.unregisterEntity(source); + } + registerEntity(entity) { + this.entities.push(entity); + this.currZones.set(entity, new Set()); + this.prevZones.set(entity, new Set()); + } + unregisterEntity(entity) { + this.entities.splice(this.entities.indexOf(entity), 1); + this.currZones.delete(entity); + this.prevZones.delete(entity); + } + + tick = (function() { + const listenerPosition = new THREE.Vector3(); + return function(scene) { + if (!scene.is("entered")) return; + + if (!this.didRegisterAudioListener) { + this.didRegisterAudioListener = true; + this.registerEntity(scene.audioListener); + } + + const currListenerZones = this.currZones.get(scene.audioListener); + scene.audioListener.getWorldPosition(listenerPosition); + this.zones.forEach(zone => { + addOrRemoveZone(currListenerZones, zone, listenerPosition); + this.sources.forEach(source => { + addOrRemoveZone(this.currZones.get(source), zone, source.getPosition()); + }); + }); + + const isListenerUpdated = isUpdated(currListenerZones, this.prevZones.get(scene.audioListener)); + this.sources + .filter(source => { + return isListenerUpdated || isUpdated(this.currZones.get(source), this.prevZones.get(source)); + }) + .forEach(source => { + updateSource(source, source.getPosition(), this.currZones.get(source), listenerPosition, currListenerZones); + }); + + this.entities.forEach(entity => { + const prevZones = this.prevZones.get(entity); + prevZones.clear(); + this.currZones.get(entity).forEach(zone => prevZones.add(zone)); + }); + }; + })(); +} diff --git a/src/systems/camera-system.js b/src/systems/camera-system.js index 1d02313c86..23fbd51baf 100644 --- a/src/systems/camera-system.js +++ b/src/systems/camera-system.js @@ -7,6 +7,7 @@ import { isTagged } from "../components/tags"; import { qsGet } from "../utils/qs_truthy"; const customFOV = qsGet("fov"); const enableThirdPersonMode = qsTruthy("thirdPerson"); +import { Layers } from "../components/layers"; function getInspectableInHierarchy(el) { let inspectable = el; @@ -64,7 +65,7 @@ const orbit = (function() { if (!target.parent) { // add dummy object to the scene, if this is the first time we call this function AFRAME.scenes[0].object3D.add(target); - target.applyMatrix(IDENTITY); // make sure target gets updated at least once for our matrix optimizations + target.applyMatrix4(IDENTITY); // make sure target gets updated at least once for our matrix optimizations } pivot.updateMatrices(); decompose(pivot.matrixWorld, owp, owq); @@ -107,7 +108,7 @@ const moveRigSoCameraLooksAtPivot = (function() { if (!target.parent) { // add dummy object to the scene, if this is the first time we call this function AFRAME.scenes[0].object3D.add(target); - target.applyMatrix(IDENTITY); // make sure target gets updated at least once for our matrix optimizations + target.applyMatrix4(IDENTITY); // make sure target gets updated at least once for our matrix optimizations } pivot.updateMatrices(); @@ -157,33 +158,29 @@ const NEXT_MODES = { [CAMERA_MODE_THIRD_PERSON_FAR]: CAMERA_MODE_FIRST_PERSON }; -const CAMERA_LAYER_INSPECT = 4; -// This layer is never actually rendered by a camera but lets the batching system know it should be rendered if inspecting -export const CAMERA_LAYER_BATCH_INSPECT = 5; - const ensureLightsAreSeenByCamera = function(o) { if (o.isLight) { - o.layers.enable(CAMERA_LAYER_INSPECT); + o.layers.enable(Layers.CAMERA_LAYER_INSPECT); } }; const enableInspectLayer = function(o) { const batchManagerSystem = AFRAME.scenes[0].systems["hubs-systems"].batchManagerSystem; const batch = batchManagerSystem.batchingEnabled && batchManagerSystem.batchManager.batchForMesh.get(o); if (batch) { - batch.layers.enable(CAMERA_LAYER_INSPECT); - o.layers.enable(CAMERA_LAYER_BATCH_INSPECT); + batch.layers.enable(Layers.CAMERA_LAYER_INSPECT); + o.layers.enable(Layers.CAMERA_LAYER_BATCH_INSPECT); } else { - o.layers.enable(CAMERA_LAYER_INSPECT); + o.layers.enable(Layers.CAMERA_LAYER_INSPECT); } }; const disableInspectLayer = function(o) { const batchManagerSystem = AFRAME.scenes[0].systems["hubs-systems"].batchManagerSystem; const batch = batchManagerSystem.batchingEnabled && batchManagerSystem.batchManager.batchForMesh.get(o); if (batch) { - batch.layers.disable(CAMERA_LAYER_INSPECT); - o.layers.disable(CAMERA_LAYER_BATCH_INSPECT); + batch.layers.disable(Layers.CAMERA_LAYER_INSPECT); + o.layers.disable(Layers.CAMERA_LAYER_BATCH_INSPECT); } else { - o.layers.disable(CAMERA_LAYER_INSPECT); + o.layers.disable(Layers.CAMERA_LAYER_INSPECT); } }; @@ -207,6 +204,9 @@ export class CameraSystem { this.mode = CAMERA_MODE_SCENE_PREVIEW; this.snapshot = { audioTransform: new THREE.Matrix4(), matrixWorld: new THREE.Matrix4() }; this.audioSourceTargetTransform = new THREE.Matrix4(); + scene.addEventListener("cameraready", ({ detail: { cameraEl } }) => { + cameraEl.getObject3D("camera").layers.enable(Layers.CAMERA_LAYER_VIDEO_TEXTURE_TARGET); + }); waitForDOMContentLoaded().then(() => { this.avatarPOV = document.getElementById("avatar-pov-node"); this.avatarRig = document.getElementById("avatar-rig"); @@ -217,7 +217,7 @@ export class CameraSystem { new THREE.BoxGeometry(100, 100, 100), new THREE.MeshBasicMaterial({ color: 0x020202, side: THREE.BackSide }) ); - bg.layers.set(CAMERA_LAYER_INSPECT); + bg.layers.set(Layers.CAMERA_LAYER_INSPECT); this.viewingRig.object3D.add(bg); if (customFOV) { if (this.viewingCamera.components.camera) { @@ -271,7 +271,7 @@ export class CameraSystem { this.pivot = pivot; const vrMode = scene.is("vr-mode"); - const camera = vrMode ? scene.renderer.vr.getCamera(scene.camera) : scene.camera; + const camera = vrMode ? scene.renderer.xr.getCamera() : scene.camera; this.snapshot.mask = camera.layers.mask; if (vrMode) { this.snapshot.mask0 = camera.cameras[0].layers.mask; @@ -371,11 +371,11 @@ export class CameraSystem { const scene = AFRAME.scenes[0]; const vrMode = scene.is("vr-mode"); - const camera = vrMode ? scene.renderer.vr.getCamera(scene.camera) : scene.camera; - camera.layers.set(CAMERA_LAYER_INSPECT); + const camera = vrMode ? scene.renderer.xr.getCamera() : scene.camera; + camera.layers.set(Layers.CAMERA_LAYER_INSPECT); if (vrMode) { - camera.cameras[0].layers.set(CAMERA_LAYER_INSPECT); - camera.cameras[1].layers.set(CAMERA_LAYER_INSPECT); + camera.cameras[0].layers.set(Layers.CAMERA_LAYER_INSPECT); + camera.cameras[1].layers.set(Layers.CAMERA_LAYER_INSPECT); } } @@ -386,7 +386,7 @@ export class CameraSystem { } const scene = AFRAME.scenes[0]; const vrMode = scene.is("vr-mode"); - const camera = vrMode ? scene.renderer.vr.getCamera(scene.camera) : scene.camera; + const camera = vrMode ? scene.renderer.xr.getCamera() : scene.camera; camera.layers.mask = this.snapshot.mask; if (vrMode) { camera.cameras[0].layers.mask = this.snapshot.mask0; diff --git a/src/systems/character-controller-system.js b/src/systems/character-controller-system.js index 5f720e9f6a..e05ba877af 100644 --- a/src/systems/character-controller-system.js +++ b/src/systems/character-controller-system.js @@ -71,7 +71,6 @@ export class CharacterControllerSystem { this.waypoints.push({ transform: getPooledMatrix4().copy(inTransform), isInstant, waypointComponentData }); //TODO: don't create new object } enqueueRelativeMotion(motion) { - motion.z *= -1; this.relativeMotion.add(motion); } enqueueInPlaceRotationAroundWorldUp(dXZ) { diff --git a/src/systems/environment-system.js b/src/systems/environment-system.js new file mode 100644 index 0000000000..1b30b707cf --- /dev/null +++ b/src/systems/environment-system.js @@ -0,0 +1,196 @@ +import { GUI } from "three/examples/jsm/libs/dat.gui.module.js"; +import qsTruthy from "../utils/qs_truthy"; + +import { LUTCubeLoader } from "three/examples/jsm/loaders/LUTCubeLoader"; +import blenderLutPath from "../assets/blender-lut.cube"; + +const toneMappingOptions = { + None: "NoToneMapping", + Linear: "LinearToneMapping", + Reinhard: "ReinhardToneMapping", + Cineon: "CineonToneMapping", + ACESFilmic: "ACESFilmicToneMapping", + CustomToneMapping: "CustomToneMapping", + LUTToneMapping: "LUTToneMapping" +}; + +const outputEncodingOptions = { + LinearEncoding: "LinearEncoding", + sRGBEncoding: "sRGBEncoding", + GammaEncoding: "GammaEncoding", + GBEEncoding: "GBEEncoding", + LogLuvEncoding: "LogLuvEncoding", + GBM7Encoding: "GBM7Encoding", + RGBM16Encoding: "RGBM16Encoding", + GBDEncoding: "GBDEncoding", + BasicDepthPacking: "BasicDepthPacking", + GBADepthPacking: "GBADepthPackig" +}; + +const defaultEnvSettings = { + toneMapping: toneMappingOptions.Linear, + outputEncoding: outputEncodingOptions.sRGBEncoding, + toneMappingExposure: 1, + physicallyCorrectLights: true, + envMapTexture: null, + backgroundTexture: null, + backgroundColor: new THREE.Color("#000000") +}; + +let blenderLUTPromise; // lazy loaded + +export class EnvironmentSystem { + constructor(sceneEl) { + this.scene = sceneEl.object3D; + this.renderer = sceneEl.renderer; + + this.pmremGenerator = new THREE.PMREMGenerator(this.renderer); + + this.applyEnvSettings(defaultEnvSettings); + + if (qsTruthy("envSettingsDebug")) { + this.setupDebugView(); + } + } + + setupDebugView() { + const debugSettings = { ...defaultEnvSettings }; + + const updateDebug = () => { + this.applyEnvSettings(debugSettings); + }; + + const gui = new GUI(); + gui + .add(debugSettings, "toneMapping", Object.values(toneMappingOptions)) + .onChange(updateDebug) + .listen(); + gui + .add(debugSettings, "toneMappingExposure", 0, 4, 0.01) + .onChange(updateDebug) + .listen(); + gui + .add(debugSettings, "outputEncoding", Object.values(outputEncodingOptions)) + .onChange(updateDebug) + .listen(); + gui + .add(debugSettings, "physicallyCorrectLights", true) + .onChange(updateDebug) + .listen(); + gui.open(); + + this.debugGui = gui; + this.debugSettings = debugSettings; + this.debugMode = true; + + window.$E = this; + } + + updateEnvironment(envEl) { + const envSettingsEl = envEl.querySelector("[environment-settings]"); + const skyboxEl = envEl.querySelector("[skybox]"); + const envSettings = { + ...defaultEnvSettings, + skybox: skyboxEl?.components["skybox"] + }; + + if (envSettingsEl) { + Object.assign(envSettings, envSettingsEl.components["environment-settings"].data); + } + + this.applyEnvSettings(envSettings); + } + + applyEnvSettings(settings) { + if (this.debugSettings) { + Object.assign(this.debugSettings, settings); + } + + let materialsNeedUpdate = false; + + if (this.debugMode) console.log("Applying environment settings", settings); + + if (this.renderer.physicallyCorrectLights !== settings.physicallyCorrectLights) { + this.renderer.physicallyCorrectLights = settings.physicallyCorrectLights; + materialsNeedUpdate = true; + } + + const newToneMapping = THREE[settings.toneMapping]; + if (this.renderer.toneMapping !== newToneMapping) { + this.renderer.toneMapping = newToneMapping; + materialsNeedUpdate = true; + + // TODO clean up async behavior + if (newToneMapping === THREE.LUTToneMapping) { + if (!blenderLUTPromise) { + blenderLUTPromise = new Promise(function(resolve, reject) { + new LUTCubeLoader().load(blenderLutPath, ({ texture3D }) => resolve(texture3D), null, reject); + }); + } + + blenderLUTPromise + .then(t => { + this.renderer.tonemappingLUT = t; + }) + .catch(function(e) { + console.error("Error loading Blender LUT", e); + blenderLUTPromise = null; + }); + } else { + this.renderer.tonemappingLUT = null; + } + } + + this.renderer.toneMappingExposure = settings.toneMappingExposure; + + const newOutputEncoding = THREE[settings.outputEncoding]; + if (this.renderer.outputEncoding !== newOutputEncoding) { + this.renderer.outputEncoding = newOutputEncoding; + materialsNeedUpdate = true; + } + + this.scene.remove(window.lp); + + if (settings.backgroundTexture) { + // Assume texture is always an equirect for now + settings.backgroundTexture.mapping = THREE.EquirectangularReflectionMapping; + this.scene.background = settings.backgroundTexture; + } else { + this.scene.background = settings.backgroundColor; + } + + if (settings.envMapTexture) { + if (this.prevEnvMapTextureUUID !== settings.envMapTexture.uuid) { + this.prevEnvMapTextureUUID = settings.envMapTexture.uuid; + // TODO PMREMGenerator should be fixed to not assume this + settings.envMapTexture.flipY = true; + // Assume texture is always an equirect for now + settings.envMapTexture.mapping = THREE.EquirectangularReflectionMapping; + this.scene.environment = settings.envMapTexture; + } + } else if (settings.skybox) { + if (this.prevEnvMapTextureUUID !== settings.skybox.uuid) { + this.prevEnvMapTextureUUID = settings.skybox.uuid; + this.scene.environment = settings.skybox.sky.generateEnvironmentMap(this.renderer); + } + } else { + this.scene.environment = null; + this.prevEnvMapTextureUUID = null; + } + + if (materialsNeedUpdate) { + if (this.debugMode) console.log("materials need updating"); + this.scene.traverse(o => { + if (o.material) o.material.needsUpdate = true; + }); + } + } +} + +AFRAME.registerComponent("environment-settings", { + schema: { + toneMapping: { default: defaultEnvSettings.toneMapping, oneOf: Object.values(toneMappingOptions) }, + toneMappingExposure: { default: defaultEnvSettings.toneMappingExposure }, + backgroundColor: { type: "color", default: defaultEnvSettings.background } + } +}); diff --git a/src/systems/hubs-systems.js b/src/systems/hubs-systems.js index 9263f7e4a3..ce39d8d696 100644 --- a/src/systems/hubs-systems.js +++ b/src/systems/hubs-systems.js @@ -30,6 +30,9 @@ import { ShadowSystem } from "./shadow-system"; import { MediaFramesSystem } from "./media-frames"; import { InspectYourselfSystem } from "./inspect-yourself-system"; import { EmojiSystem } from "./emoji-system"; +import { AudioZonesSystem } from "./audio-zones-system"; +import { GainSystem } from "./audio-gain-system"; +import { EnvironmentSystem } from "./environment-system"; AFRAME.registerSystem("hubs-systems", { init() { @@ -69,6 +72,9 @@ AFRAME.registerSystem("hubs-systems", { this.mediaFramesSystem = new MediaFramesSystem(this.physicsSystem, this.el.systems.interaction); this.inspectYourselfSystem = new InspectYourselfSystem(); this.emojiSystem = new EmojiSystem(this.el); + this.audioZonesSystem = new AudioZonesSystem(); + this.gainSystem = new GainSystem(); + this.environmentSystem = new EnvironmentSystem(this.el); }, tick(t, dt) { @@ -113,6 +119,8 @@ AFRAME.registerSystem("hubs-systems", { this.uvScrollSystem.tick(dt); this.shadowSystem.tick(); this.mediaFramesSystem.tick(); + this.audioZonesSystem.tick(this.el); + this.gainSystem.tick(); // We run this late in the frame so that its the last thing to have an opinion about the scale of an object this.boneVisibilitySystem.tick(); diff --git a/src/systems/linked-media.js b/src/systems/linked-media.js index 4522643a02..55cfa23985 100644 --- a/src/systems/linked-media.js +++ b/src/systems/linked-media.js @@ -6,6 +6,9 @@ // - Sync is bidirectional, however, elB is assumed to be a 'derivate of' elA. this means: // - for the video case, elA will have its volume set to zero and restored if elB is removed // - when elA is removed, elB will be removed (done in media-loader) but not vice-versa + +import { updateAudioSettings } from "../update-audio-settings"; + // AFRAME.registerSystem("linked-media", { init: function() { @@ -47,9 +50,11 @@ AFRAME.registerSystem("linked-media", { elA.setAttribute("linked-media", ""); elB.setAttribute("linked-media", ""); - // As a convenience, if elA is a video, we turn its volume off so we don't hear it twice - if (elA.components["media-video"]) { - elA.setAttribute("media-video", "volume", 0); + // As a convenience, if elA has audio, we turn its volume off so we don't hear it twice + APP.linkedMutedState.add(elA); + const audio = APP.audios.get(elA); + if (audio) { + updateAudioSettings(elA, audio); } this.handlers.push([elA, elB, handlerA, handlerB]); @@ -63,9 +68,10 @@ AFRAME.registerSystem("linked-media", { elB.removeEventListener("componentchanged", handlerB); } - // As a convenience, if elA is a video, we restore its volume to 50% since we muted it upon link. - if (elA.components["media-video"]) { - elA.setAttribute("media-video", "volume", 0.5); + APP.linkedMutedState.delete(elA); + const audio = APP.audios.get(elA); + if (audio) { + updateAudioSettings(elA, audio); } } diff --git a/src/systems/media-frames.js b/src/systems/media-frames.js index 95b89f5217..06548921a7 100644 --- a/src/systems/media-frames.js +++ b/src/systems/media-frames.js @@ -1,12 +1,14 @@ import { MediaType } from "../utils/media-utils"; -import { TEXTURES_FLIP_Y } from "../loaders/HubsTextureLoader"; import { applyPersistentSync } from "../utils/permissions-utils"; +import { cloneObject3D, disposeNode } from "../utils/three-utils"; +import qsTruthy from "../utils/qs_truthy"; -// TODO better handling for 3d objects function scaleForAspectFit(containerSize, itemSize) { - return Math.min(containerSize.x / itemSize.x, containerSize.y / itemSize.y); + return Math.min(containerSize.x / itemSize.x, containerSize.y / itemSize.y, containerSize.z / itemSize.z); } +const DEBUG = qsTruthy("debug"); + const isCapturableByType = { [MediaType.ALL]: function(el) { return !!(el && el.components["media-loader"]); @@ -176,16 +178,6 @@ AFRAME.registerComponent("media-frame", { }) ) ); - - const previewMaterial = new THREE.MeshBasicMaterial(); - previewMaterial.side = THREE.DoubleSide; - previewMaterial.transparent = true; - previewMaterial.opacity = 0.5; - - const geometry = new THREE.PlaneBufferGeometry(1, 1, 1, 1, TEXTURES_FLIP_Y); - const previewMesh = new THREE.Mesh(geometry, previewMaterial); - previewMesh.visible = false; - this.el.setObject3D("preview", previewMesh); }, update(oldData) { @@ -223,30 +215,103 @@ AFRAME.registerComponent("media-frame", { components.splice(components.indexOf(this), 1); }, - // TODO this "preview" feels a bit hacky and error prone, also needs support for previewing 3D objects - showPreview(capturableEntity) { - const srcMesh = capturableEntity.getObject3D("mesh"); - - if (!isCapturableByType[MediaType.ALL_2D](capturableEntity) || !(srcMesh && srcMesh.material)) return; - const previewMesh = this.el.getObject3D("preview"); + tick(_, dt) { + if (this.mixer) { + this.mixer.update(dt / 1000); + } + }, - previewMesh.material.map = srcMesh.material.map; - previewMesh.material.needsUpdate = true; + showPreview(capturableEntity) { + if (!this.preview) { + const srcMesh = capturableEntity.getObject3D("mesh"); + const clonedMesh = cloneObject3D(srcMesh, false); + + clonedMesh.traverse(node => { + if (node.isMesh) { + if (node.material) { + node.material = node.material.clone(); + node.material.transparent = true; + node.material.opacity = 0.5; + node.material.needsUpdate = true; + } + } + }); - previewMesh.scale.copy(srcMesh.scale); - previewMesh.scale.multiplyScalar(scaleForAspectFit(this.data.bounds, srcMesh.scale)); - // Preview mesh UVs are set to accomidate textureLoader default, but video textures don't match this - previewMesh.scale.y *= TEXTURES_FLIP_Y !== previewMesh.material.map.flipY ? -1 : 1; + const loopAnimation = capturableEntity.components["loop-animation"]; + if (loopAnimation && loopAnimation.isPlaying) { + const originalAnimation = loopAnimation.currentActions[loopAnimation.data.activeClipIndex]; + const animation = clonedMesh.animations[loopAnimation.data.activeClipIndex]; + this.mixer = new THREE.AnimationMixer(clonedMesh); + const action = this.mixer.clipAction(animation); + action.syncWith(originalAnimation); + action.setLoop(THREE.LoopRepeat, Infinity).play(); + } - previewMesh.matrixNeedsUpdate = true; - previewMesh.visible = true; + // Reset offsets + clonedMesh.position.set(0, 0, 0); + clonedMesh.quaternion.identity(); + let aabb = new THREE.Box3().setFromObject(clonedMesh); + const size = new THREE.Vector3(); + aabb.getSize(size); + let center = new THREE.Vector3(); + aabb.getCenter(center); + clonedMesh.position.copy(center); + clonedMesh.position.multiplyScalar(-1); + clonedMesh.matrixNeedsUpdate = true; + this.preview = new THREE.Object3D(); + this.el.sceneEl.object3D.add(this.preview); + this.preview.add(clonedMesh); + + // Apply preview mesh transforms to match the frame ones + this.el.object3D.updateWorldMatrix(true); + const worldPos = new THREE.Vector3(); + this.el.object3D.getWorldPosition(worldPos); + const worldQuat = new THREE.Quaternion(); + this.el.object3D.getWorldQuaternion(worldQuat); + this.preview.position.copy(worldPos); + this.preview.scale.multiplyScalar(scaleForAspectFit(this.data.bounds, size)); + this.preview.setRotationFromQuaternion(worldQuat); + this.preview.matrixNeedsUpdate = true; + + if (DEBUG) { + const quat = this.preview.quaternion.clone(); + this.preview.quaternion.identity(); + this.preview.matrixNeedsUpdate = true; + this.preview.updateMatrixWorld(true); + aabb = new THREE.Box3().setFromObject(this.preview); + this.preview.quaternion.copy(quat); + this.preview.matrixNeedsUpdate = true; + this.preview.updateMatrixWorld(true); + this.helperBBAA = new THREE.Box3Helper(aabb, 0xffff00); + this.helperBBAA.setRotationFromQuaternion(this.preview.quaternion); + this.el.sceneEl.object3D.add(this.helperBBAA); + + this.centerBBAA = new THREE.AxesHelper(0.25); + center = new THREE.Vector3(); + aabb.getCenter(center); + this.centerBBAA.position.copy(center); + this.centerBBAA.setRotationFromQuaternion(this.preview.quaternion); + this.el.sceneEl.object3D.add(this.centerBBAA); + } + } }, hidePreview() { - const previewMesh = this.el.getObject3D("preview"); - previewMesh.material.map = null; - previewMesh.material.needsUpdate = true; - previewMesh.visible = false; + if (this.preview) { + this.el.sceneEl.object3D.remove(this.preview); + if (this.mixer) { + this.mixer.stopAllAction(); + this.mixer.uncacheRoot(this.preview); + this.mixer = null; + } + disposeNode(this.preview); + this.preview = null; + + if (DEBUG) { + this.el.sceneEl.object3D.remove(this.helperBBAA); + this.el.sceneEl.object3D.remove(this.centerBBAA); + } + } }, snapObject(capturedEl) { @@ -261,22 +326,39 @@ AFRAME.registerComponent("media-frame", { capture(capturableEntity) { if (NAF.utils.isMine(this.el) || NAF.utils.takeOwnership(this.el)) { - this.el.setAttribute("media-frame", { - targetId: capturableEntity.id, - originalTargetScale: new THREE.Vector3().copy(capturableEntity.object3D.scale) - }); - const worldPosition = new THREE.Vector3(); - this.el.object3D.getWorldPosition(worldPosition); - capturableEntity.object3D.position.copy(worldPosition); - const worldQuat = new THREE.Quaternion(); - this.el.object3D.updateWorldMatrix(true); - this.el.object3D.getWorldQuaternion(worldQuat); - capturableEntity.object3D.setRotationFromQuaternion(worldQuat); - capturableEntity.object3D.scale.setScalar( - scaleForAspectFit(this.data.bounds, capturableEntity.getObject3D("mesh").scale) - ); - capturableEntity.object3D.matrixNeedsUpdate = true; - capturableEntity.components["floaty-object"].setLocked(true); + const update = () => { + this.el.setAttribute("media-frame", { + targetId: capturableEntity.id, + originalTargetScale: new THREE.Vector3().copy(capturableEntity.object3D.scale) + }); + + capturableEntity.object3D.scale.set(1, 1, 1); + capturableEntity.object3D.quaternion.identity(); + capturableEntity.object3D.matrixNeedsUpdate = true; + capturableEntity.object3D.updateMatrixWorld(); + const srcMesh = capturableEntity.getObject3D("mesh"); + const size = new THREE.Vector3(); + new THREE.Box3().setFromObject(srcMesh).getSize(size); + + capturableEntity.object3D.scale.multiplyScalar(scaleForAspectFit(this.data.bounds, size)); + capturableEntity.object3D.matrixNeedsUpdate = true; + + this.snapObject(capturableEntity); + }; + + // Make sure we snap the media element when it's loaded (otherwise we may only snap the loading object) + if (capturableEntity.components["media-loader"].isPlaying) { + capturableEntity.addEventListener( + "media-loaded", + () => { + update(); + }, + { once: true } + ); + } + + update(); + this.hidePreview(); } else { // TODO what do we do about this state? should evenetually resolve itself as it will try again next frame... diff --git a/src/systems/nav.js b/src/systems/nav.js index 076bdc75e4..ca41651a04 100644 --- a/src/systems/nav.js +++ b/src/systems/nav.js @@ -1,116 +1,6 @@ const { Pathfinding } = require("three-pathfinding"); import qsTruthy from "../utils/qs_truthy"; -const Vector3 = THREE.Vector3; -const Vector2 = THREE.Vector2; -const Face3 = THREE.Face3; -const Color = THREE.Color; - -// TODO this is backported from a later version of THREE. -// Geometry is going to be dropped from ThreeJS anyway so just copying here for now. -// Ideally three-pathfinding will just use BufferGeometry in the future -// https://github.com/donmccurdy/three-pathfinding/issues/74 -function fromBufferGeometry(scope, geometry) { - const index = geometry.index !== null ? geometry.index : undefined; - const attributes = geometry.attributes; - - if (attributes.position === undefined) { - console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."); - return scope; - } - - const position = attributes.position; - const normal = attributes.normal; - const color = attributes.color; - const uv = attributes.uv; - const uv2 = attributes.uv2; - - if (uv2 !== undefined) scope.faceVertexUvs[1] = []; - - for (let i = 0; i < position.count; i++) { - scope.vertices.push(new Vector3().fromBufferAttribute(position, i)); - - if (color !== undefined) { - scope.colors.push(new Color().fromBufferAttribute(color, i)); - } - } - - function addFace(a, b, c, materialIndex) { - const vertexColors = - color === undefined ? [] : [scope.colors[a].clone(), scope.colors[b].clone(), scope.colors[c].clone()]; - - const vertexNormals = - normal === undefined - ? [] - : [ - new Vector3().fromBufferAttribute(normal, a), - new Vector3().fromBufferAttribute(normal, b), - new Vector3().fromBufferAttribute(normal, c) - ]; - - const face = new Face3(a, b, c, vertexNormals, vertexColors, materialIndex); - - scope.faces.push(face); - - if (uv !== undefined) { - scope.faceVertexUvs[0].push([ - new Vector2().fromBufferAttribute(uv, a), - new Vector2().fromBufferAttribute(uv, b), - new Vector2().fromBufferAttribute(uv, c) - ]); - } - - if (uv2 !== undefined) { - scope.faceVertexUvs[1].push([ - new Vector2().fromBufferAttribute(uv2, a), - new Vector2().fromBufferAttribute(uv2, b), - new Vector2().fromBufferAttribute(uv2, c) - ]); - } - } - - const groups = geometry.groups; - - if (groups.length > 0) { - for (let i = 0; i < groups.length; i++) { - const group = groups[i]; - - const start = group.start; - const count = group.count; - - for (let j = start, jl = start + count; j < jl; j += 3) { - if (index !== undefined) { - addFace(index.getX(j), index.getX(j + 1), index.getX(j + 2), group.materialIndex); - } else { - addFace(j, j + 1, j + 2, group.materialIndex); - } - } - } - } else { - if (index !== undefined) { - for (let i = 0; i < index.count; i += 3) { - addFace(index.getX(i), index.getX(i + 1), index.getX(i + 2)); - } - } else { - for (let i = 0; i < position.count; i += 3) { - addFace(i, i + 1, i + 2); - } - } - } - - scope.computeFaceNormals(); - - if (geometry.boundingBox !== null) { - scope.boundingBox = geometry.boundingBox.clone(); - } - - if (geometry.boundingSphere !== null) { - scope.boundingSphere = geometry.boundingSphere.clone(); - } - - return scope; -} - AFRAME.registerSystem("nav", { init: function() { this.pathfinder = new Pathfinding(); @@ -124,9 +14,9 @@ AFRAME.registerSystem("nav", { console.error("tried to load multiple nav meshes"); this.removeNavMeshData(); } - const geometry = fromBufferGeometry(new THREE.Geometry(), mesh.geometry); + const geometry = mesh.geometry.clone(); mesh.updateMatrices(); - geometry.applyMatrix(mesh.matrixWorld); + geometry.applyMatrix4(mesh.matrixWorld); this.pathfinder.setZoneData(zone, Pathfinding.createZone(geometry)); this.mesh = mesh; this.el.sceneEl.emit("nav-mesh-loaded"); @@ -139,10 +29,16 @@ AFRAME.registerSystem("nav", { removeNavMeshData() { if (this.mesh && this.mesh.geometry && this.mesh.geometry.dispose) { - this.mesh.geometry.dispose(); + // If it's using the debug view material, restore the original material so it can be disposed. + if (this.mesh._hubs_audio_debug_prev_material) { + this.mesh.material = this.mesh._hubs_audio_debug_prev_material; + this.mesh._hubs_audio_debug_prev_material = null; + } } if (this.helperMesh) { - this.helperMesh.parent.remove(this.helperMesh); + this.helperMesh.material?.dispose(); + this.helperMesh.geometry?.dispose(); + this.helperMesh.removeFromParent(); this.helperMesh = null; } this.mesh = null; diff --git a/src/systems/personal-space-bubble.js b/src/systems/personal-space-bubble.js index 512ad19a53..91ea548f0c 100644 --- a/src/systems/personal-space-bubble.js +++ b/src/systems/personal-space-bubble.js @@ -254,7 +254,10 @@ AFRAME.registerComponent("personal-space-invader", { if (!material.userData.originalProps) { originalProps = material.userData.originalProps = { opacity: material.opacity, - transparent: material.transparent + transparent: material.transparent, + format: material.format, + blending: material.blending, + side: material.side }; } @@ -263,6 +266,13 @@ AFRAME.registerComponent("personal-space-invader", { // not across avatars in the room. material.opacity = invading ? this.data.invadingOpacity : originalProps.opacity; material.transparent = invading || originalProps.transparent; + + // Note: Since ThreeJS 0.132 the default format for GLTF imported opaque materials is RGBFormat + // so we need to switch before enabling transparency. + material.format = invading ? THREE.RGBAFormat : originalProps.format; + material.blending = invading ? THREE.NormalBlending : originalProps.blending; + // This shouldn't be necessary but for some reason transparency doens't work on some models if they are single sided. + material.side = invading ? THREE.DoubleSide : originalProps.side; }); }); } else { diff --git a/src/systems/physics-system.js b/src/systems/physics-system.js index f1045d8084..3a51c1ac24 100644 --- a/src/systems/physics-system.js +++ b/src/systems/physics-system.js @@ -166,7 +166,7 @@ export class PhysicsSystem { index * BUFFER_CONFIG.BODY_DATA_SIZE + BUFFER_CONFIG.MATRIX_OFFSET ); object3D.parent.updateMatrices(); - inverse.getInverse(object3D.parent.matrixWorld); + inverse.copy(object3D.parent.matrixWorld).invert(); transform.multiplyMatrices(inverse, matrix); transform.decompose(object3D.position, object3D.quaternion, scale); object3D.matrixNeedsUpdate = true; diff --git a/src/systems/render-manager-system.js b/src/systems/render-manager-system.js index f1cee336a1..08afa3af6c 100644 --- a/src/systems/render-manager-system.js +++ b/src/systems/render-manager-system.js @@ -1,79 +1,29 @@ -import { BatchManager } from "@mozillareality/three-batch-manager"; - -import HubsBatchRawUniformGroup from "./render-manager/hubs-batch-raw-uniform-group"; -import { sizeofInstances } from "./render-manager/hubs-batch-raw-uniform-group"; -import unlitBatchVert from "./render-manager/unlit-batch.vert"; -import unlitBatchFrag from "./render-manager/unlit-batch.frag"; -import qsTruthy from "../utils/qs_truthy"; - -const MAX_INSTANCES = 500; -const UBO_BYTE_LENGTH = sizeofInstances(MAX_INSTANCES); +// We disable batching manager because of some problems. +// BatchManagerSystem has some dependencies with our Three.js fork. +// Build errors with the upstreaming official Three.js. +// So replacing BatchManagerSystem with a stub so far. +// We may revert and update it when we will enable again. export class BatchManagerSystem { - constructor(scene, renderer) { - this.meshToEl = new WeakMap(); - const gl = renderer.getContext(); - - if (qsTruthy("disableBatching")) { - console.warn("Batching disabled by user via disableBatching. Disabling batching."); - return; - } - - if (!(window.WebGL2RenderingContext && gl instanceof WebGL2RenderingContext)) { - console.warn("Batching requires WebGL 2. Disabling batching."); - return; - } - - if (UBO_BYTE_LENGTH > gl.getParameter(gl.MAX_UNIFORM_BLOCK_SIZE)) { - console.warn("Insufficient MAX_UNIFORM_BLOCK_SIZE, Disabling batching."); - return; - } + constructor(/*scene, renderer*/) {} - this.batchingEnabled = qsTruthy("forceMeshBatching") || qsTruthy("forceImageBatching"); - - if (!this.batchingEnabled) { - console.warn("Batching must be forced on with forceMeshBatching or forceImageBatching. Disabling batching."); - return; - } - - this.ubo = new HubsBatchRawUniformGroup(MAX_INSTANCES, this.meshToEl); - this.batchManager = new BatchManager(scene, renderer, { - maxInstances: MAX_INSTANCES, - ubo: this.ubo, - shaders: { - unlit: { - vertexShader: unlitBatchVert, - fragmentShader: unlitBatchFrag - } - } - }); + get batchingEnabled() { + return false; } - addObject(rootObject) { - if (!this.batchingEnabled) return 0; - - let batchedCount = 0; - rootObject.traverse(object => { - if (object.isMesh) { - if (this.batchManager.addMesh(object)) batchedCount++; - } - }); - return batchedCount; + set batchingEnabled(enabled) { + // Ignore } - removeObject(rootObject) { - if (!this.batchingEnabled) return; - - rootObject.traverse(object => { - if (object.isMesh) { - this.batchManager.removeMesh(object); - } - }); + addObject(/*rootObject*/) { + return 0; } - tick(time) { - if (!this.batchingEnabled) return; + removeObject(/*rootObject*/) { + return; + } - this.batchManager.update(time); + tick(/*time*/) { + return; } } diff --git a/src/systems/render-manager/hubs-batch-raw-uniform-group.js b/src/systems/render-manager/hubs-batch-raw-uniform-group.js index 9857b39339..637cda5663 100644 --- a/src/systems/render-manager/hubs-batch-raw-uniform-group.js +++ b/src/systems/render-manager/hubs-batch-raw-uniform-group.js @@ -1,5 +1,6 @@ import { BatchRawUniformGroup } from "@mozillareality/three-batch-manager"; -import { CAMERA_MODE_INSPECT, CAMERA_LAYER_BATCH_INSPECT } from "../camera-system"; +import { Layers } from "../../components/layers"; +import { CAMERA_MODE_INSPECT } from "../camera-system"; const tempVec3 = new Array(3); const tempVec4 = new Array(4); @@ -20,7 +21,7 @@ export function sizeofInstances(instanceCount) { } const inspectLayer = new THREE.Layers(); -inspectLayer.set(CAMERA_LAYER_BATCH_INSPECT); +inspectLayer.set(Layers.CAMERA_LAYER_BATCH_INSPECT); export default class HubsBatchRawUniformGroup extends BatchRawUniformGroup { constructor(maxInstances, meshToEl) { diff --git a/src/systems/shadow-system.js b/src/systems/shadow-system.js index ac092a03a1..5ee1cd3999 100644 --- a/src/systems/shadow-system.js +++ b/src/systems/shadow-system.js @@ -64,7 +64,7 @@ function resizeShadowCameraFrustum(light, boundingBox) { verts[7].set(max.x, max.y, max.z); light.updateMatrices(); - inverseLightMatrixWorld.getInverse(light.matrixWorld); + inverseLightMatrixWorld.copy(light.matrixWorld).invert(); for (let i = 0; i < verts.length; i++) { verts[i].applyMatrix4(inverseLightMatrixWorld); diff --git a/src/systems/sound-effects-system.js b/src/systems/sound-effects-system.js index 31660bc5a3..ec448cbfeb 100644 --- a/src/systems/sound-effects-system.js +++ b/src/systems/sound-effects-system.js @@ -16,6 +16,7 @@ import URL_MEDIA_LOADED from "../assets/sfx/A_bendUp.mp3"; import URL_MEDIA_LOADING from "../assets/sfx/suspense.mp3"; import URL_SPAWN_EMOJI from "../assets/sfx/emoji.mp3"; import { setMatrixWorld } from "../utils/three-utils"; +import { isSafari } from "../utils/detect-safari"; let soundEnum = 0; export const SOUND_HOVER_OR_GRAB = soundEnum++; @@ -137,7 +138,7 @@ export class SoundEffectsSystem { const audioBuffer = this.sounds.get(sound); if (!audioBuffer) return null; - const disablePositionalAudio = window.APP.store.state.preferences.audioOutputMode === "audio"; + const disablePositionalAudio = isSafari() || window.APP.store.state.preferences.audioOutputMode === "audio"; const positionalAudio = disablePositionalAudio ? new THREE.Audio(this.scene.audioListener) : new THREE.PositionalAudio(this.scene.audioListener); @@ -203,7 +204,7 @@ export class SoundEffectsSystem { inPositionalAudio.stop(); } if (inPositionalAudio.parent) { - inPositionalAudio.parent.remove(inPositionalAudio); + inPositionalAudio.removeFromParent(); } } this.positionalAudiosStationary = this.positionalAudiosStationary.filter( diff --git a/src/systems/sprites.js b/src/systems/sprites.js index c6407a25d2..70d25bcba2 100644 --- a/src/systems/sprites.js +++ b/src/systems/sprites.js @@ -10,6 +10,9 @@ import { waitForDOMContentLoaded } from "../utils/async-utils"; import vert from "./sprites/sprite.vert"; import frag from "./sprites/sprite.frag"; import { getThemeColorShifter } from "../utils/theme-sprites"; +import { disposeTexture } from "../utils/material-utils"; + +const pngs = [[spritesheetActionPng, "action"], [spritesheetNoticePng, "notice"]]; const multiviewVertPrefix = [ // GLSL 3.0 conversion @@ -224,18 +227,18 @@ export class SpriteSystem { } const vertexShader = String.prototype.concat( - scene.renderer.vr.multiview ? multiviewVertPrefix : nonmultiviewVertPrefix, + scene.renderer.xr.multiview ? multiviewVertPrefix : nonmultiviewVertPrefix, vert ); const fragmentShader = String.prototype.concat( - scene.renderer.vr.multiview ? multiviewFragPrefix : nonmultiviewFragPrefix, + scene.renderer.xr.multiview ? multiviewFragPrefix : nonmultiviewFragPrefix, frag ); const domReady = waitForDOMContentLoaded(); Promise.all([domReady]).then(() => { - for (const [spritesheetPng, type] of [[spritesheetActionPng, "action"], [spritesheetNoticePng, "notice"]]) { + for (const [spritesheetPng, type] of pngs) { Promise.all([createImageTexture(spritesheetPng, getThemeColorShifter(type)), waitForDOMContentLoaded()]).then( ([spritesheetTexture]) => { const material = new THREE.RawShaderMaterial({ @@ -260,6 +263,20 @@ export class SpriteSystem { ); } }); + + APP.store.addEventListener("themechanged", async () => { + for (const [spritesheetPng, type] of pngs) { + if (this.meshes[type]) { + const newTexture = await createImageTexture(spritesheetPng, getThemeColorShifter(type)); + const oldTexture = this.meshes[type].material.uniforms.u_spritesheet.value; + if (oldTexture) { + disposeTexture(oldTexture); + } + this.meshes[type].material.uniforms.u_spritesheet.value = newTexture; + this.meshes[type].material.uniformsNeedUpdate = true; + } + } + }); } tick(t) { diff --git a/src/systems/userinput/devices/app-aware-touchscreen.js b/src/systems/userinput/devices/app-aware-touchscreen.js index 54c00000da..d4c3cd5a31 100644 --- a/src/systems/userinput/devices/app-aware-touchscreen.js +++ b/src/systems/userinput/devices/app-aware-touchscreen.js @@ -3,6 +3,7 @@ import { Pose } from "../pose"; import { touchIsAssigned, jobIsAssigned, assign, unassign, findByJob, findByTouch } from "./touchscreen/assignments"; import { findRemoteHoverTarget } from "../../interactions"; import { canMove } from "../../../utils/permissions-utils"; +import ResizeObserver from "resize-observer-polyfill"; const MOVE_CURSOR_JOB = "MOVE CURSOR"; const MOVE_CAMERA_JOB = "MOVE CAMERA"; @@ -35,14 +36,23 @@ const getPlayerCamera = (() => { }; })(); -function shouldMoveCursor(cursorPose, raycaster) { +function isSingleActionButton(el) { + return el.components.tags && el.components.tags.data.singleActionButton; +} + +function shouldMoveCursor(touch, rect, raycaster) { const isCursorGrabbing = !!AFRAME.scenes[0].systems.interaction.state.rightRemote.held; if (isCursorGrabbing) { return true; } const rawIntersections = []; - raycaster.ray.origin = cursorPose.position; - raycaster.ray.direction = cursorPose.direction; + raycaster.setFromCamera( + { + x: ((touch.clientX - rect.left) / rect.width) * 2 - 1, + y: -((touch.clientY - rect.top) / rect.height) * 2 + 1 + }, + getPlayerCamera() + ); raycaster.intersectObjects( AFRAME.scenes[0].systems["hubs-systems"].cursorTargettingSystem.targets, true, @@ -68,7 +78,7 @@ function shouldMoveCursor(cursorPose, raycaster) { (isFrozen || !isPinned) && !isStaticControlledMedia && !isStaticMedia && - (remoteHoverTarget && canMove(remoteHoverTarget)) + (remoteHoverTarget && (canMove(remoteHoverTarget) || isSingleActionButton(remoteHoverTarget))) ); } @@ -88,6 +98,8 @@ export class AppAwareTouchscreenDevice { ["touchstart", "touchend", "touchmove", "touchcancel"].map(x => this.canvas.addEventListener(x, this.events.push.bind(this.events)) ); + this.canvasRect = this.canvas.getBoundingClientRect(); + new ResizeObserver(() => (this.canvasRect = this.canvas.getBoundingClientRect())).observe(this.canvas); } end(touch) { @@ -166,11 +178,14 @@ export class AppAwareTouchscreenDevice { const assignment = findByTouch(touch, this.assignments); switch (assignment.job) { case MOVE_CURSOR_JOB: - assignment.cursorPose.fromCameraProjection( - getPlayerCamera(), - (touch.clientX / this.canvas.clientWidth) * 2 - 1, - -(touch.clientY / this.canvas.clientHeight) * 2 + 1 - ); + // Don't move the cursor until after the grab so that the grab happens at the touch's initial position + if (assignment.framesUntilGrab < 0) { + assignment.cursorPose.fromCameraProjection( + getPlayerCamera(), + ((touch.clientX - this.canvasRect.left) / this.canvasRect.width) * 2 - 1, + -((touch.clientY - this.canvasRect.top) / this.canvasRect.height) * 2 + 1 + ); + } break; case MOVE_CAMERA_JOB: assignment.delta[0] += touch.clientX - assignment.clientX; @@ -207,20 +222,15 @@ export class AppAwareTouchscreenDevice { if (isFirstTouch || (isThirdTouch && hasSecondPinch)) { let assignment; - const cursorPose = new Pose().fromCameraProjection( - getPlayerCamera(), - (touch.clientX / this.canvas.clientWidth) * 2 - 1, - -(touch.clientY / this.canvas.clientHeight) * 2 + 1 - ); // First touch or third touch and other two fingers were pinching - if (shouldMoveCursor(cursorPose, this.raycaster)) { + if (shouldMoveCursor(touch, this.canvasRect, this.raycaster)) { assignment = assign(touch, MOVE_CURSOR_JOB, this.assignments); // Grabbing objects is delayed by several frames: // - We don't want the physics constraint to be applied too early, which results in crazy velocities // - We don't want to mis-trigger grabs if the user is about to put down a second finger. - assignment.framesUntilGrab = 2; + assignment.framesUntilGrab = 8; } else { assignment = assign(touch, MOVE_CAMERA_JOB, this.assignments); assignment.delta = [0, 0]; @@ -231,7 +241,11 @@ export class AppAwareTouchscreenDevice { // On touch down, we always move the cursor on the first frame, but the MOVE_CURSOR_JOB indicates // the touch will then track the cursor (instead of the camera) - assignment.cursorPose = cursorPose; + assignment.cursorPose = new Pose().fromCameraProjection( + getPlayerCamera(), + ((touch.clientX - this.canvasRect.left) / this.canvasRect.width) * 2 - 1, + -((touch.clientY - this.canvasRect.top) / this.canvasRect.height) * 2 + 1 + ); } else if (isSecondTouch || isThirdTouch) { const cursorJob = findByJob(MOVE_CURSOR_JOB, this.assignments); diff --git a/src/systems/userinput/userinput.js b/src/systems/userinput/userinput.js index ec0c2308e0..8d3581f967 100644 --- a/src/systems/userinput/userinput.js +++ b/src/systems/userinput/userinput.js @@ -420,7 +420,12 @@ AFRAME.registerSystem("userinput", { inputSource.gamepad.isWebXRGamepad = true; inputSource.gamepad.targetRaySpace = inputSource.targetRaySpace; inputSource.gamepad.primaryProfile = inputSource.profiles[0]; - inputSource.gamepad.hand = inputSource.handedness; + // inputSource.gamepad.hand is a read-only property and still an experimental property. + // We read this property elsewhere. Only Firefox supports this property now. + // So we set this property if it's undefined. + if (inputSource.gamepad.hand === undefined) { + inputSource.gamepad.hand = inputSource.handedness; + } gamepadConnected(inputSource); } }; diff --git a/src/systems/waypoint-system.js b/src/systems/waypoint-system.js index 384ddeb8ba..e1ab28cf1e 100644 --- a/src/systems/waypoint-system.js +++ b/src/systems/waypoint-system.js @@ -298,6 +298,9 @@ export class WaypointSystem { this.nextMoveToSpawnResolve = resolve; }); } + // Reset system state to allow for waypoint selection based on URL fragments + this.previousWaypointHash = null; + this.initialSpawnHappened = false; return this.nextMoveToSpawn; } moveToWaypoint(waypointComponent, instant) { diff --git a/src/tokens.html b/src/tokens.html new file mode 100644 index 0000000000..e17ef77256 --- /dev/null +++ b/src/tokens.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + +<head> + <!-- DO NOT REMOVE/EDIT THIS COMMENT - META_TAGS --> + + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + + <link rel="shortcut icon" type="image/png" href="/favicon.ico"> + <title>Tokens + + + + + +
+ + + + diff --git a/src/tokens.js b/src/tokens.js new file mode 100644 index 0000000000..b01b933161 --- /dev/null +++ b/src/tokens.js @@ -0,0 +1,32 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import { WrappedIntlProvider } from "./react-components/wrapped-intl-provider"; +import registerTelemetry from "./telemetry"; +import Store from "./storage/store"; +import "./utils/theme"; +import { AuthContextProvider } from "./react-components/auth/AuthContext"; +import { TokensContainer } from "./react-components/tokens/TokensContainer"; +import "./assets/stylesheets/globals.scss"; +import "./react-components/styles/global.scss"; +import { TokenPageLayout } from "./react-components/tokens/TokenPageLayout"; +import configs from "./utils/configs"; +import { ThemeProvider } from "./react-components/styles/theme"; + +registerTelemetry("/tokens", "Backend API Tokens Page"); + +const store = new Store(); +window.APP = { store }; + +function Root() { + return ( + + + + {configs.feature("public_api_access") && } + + + + ); +} + +ReactDOM.render(, document.getElementById("ui-root")); diff --git a/src/transport-for-channel.js b/src/transport-for-channel.js new file mode 100644 index 0000000000..076e98ae85 --- /dev/null +++ b/src/transport-for-channel.js @@ -0,0 +1,40 @@ +export function transportForChannel(channel, reliable = true) { + return (clientId, dataType, data) => { + const payload = { dataType, data }; + + if (clientId) { + payload.clientId = clientId; + } + + const isOpen = channel.socket.connectionState() === "open"; + + if (isOpen || reliable) { + const hasFirstSync = + payload.dataType === "um" ? payload.data.d.find(r => r.isFirstSync) : payload.data.isFirstSync; + + if (hasFirstSync) { + if (isOpen) { + channel.push("naf", payload); + } else { + // Memory is re-used, so make a copy + channel.push("naf", AFRAME.utils.clone(payload)); + } + } else { + // Optimization: Strip isFirstSync and send payload as a string to reduce server parsing. + // The server will not parse messages without isFirstSync keys when sent to the nafr event. + // + // The client must assume any payload that does not have a isFirstSync key is not a first sync. + const nafrPayload = AFRAME.utils.clone(payload); + if (nafrPayload.dataType === "um") { + for (let i = 0; i < nafrPayload.data.d.length; i++) { + delete nafrPayload.data.d[i].isFirstSync; + } + } else { + delete nafrPayload.data.isFirstSync; + } + + channel.push("nafr", { naf: JSON.stringify(nafrPayload) }); + } + } + }; +} diff --git a/src/update-audio-settings.js b/src/update-audio-settings.js new file mode 100644 index 0000000000..a298543667 --- /dev/null +++ b/src/update-audio-settings.js @@ -0,0 +1,118 @@ +import { + AudioType, + SourceType, + MediaAudioDefaults, + AvatarAudioDefaults, + TargetAudioDefaults +} from "./components/audio-params"; +import { isSafari } from "./utils/detect-safari"; + +const defaultSettingsForSourceType = Object.freeze( + new Map([ + [SourceType.MEDIA_VIDEO, MediaAudioDefaults], + [SourceType.AVATAR_AUDIO_SOURCE, AvatarAudioDefaults], + [SourceType.AUDIO_TARGET, TargetAudioDefaults] + ]) +); + +function applySettings(audio, settings) { + if (audio.panner) { + audio.setDistanceModel(settings.distanceModel); + audio.setRolloffFactor(settings.rolloffFactor); + audio.setRefDistance(settings.refDistance); + audio.setMaxDistance(settings.maxDistance); + audio.panner.coneInnerAngle = settings.coneInnerAngle; + audio.panner.coneOuterAngle = settings.coneOuterAngle; + audio.panner.coneOuterGain = settings.coneOuterGain; + } + audio.gain.gain.setTargetAtTime(settings.gain, audio.context.currentTime, 0.1); +} + +export function getCurrentAudioSettings(el) { + const sourceType = APP.sourceType.get(el); + const defaults = defaultSettingsForSourceType.get(sourceType); + const sceneOverrides = APP.sceneAudioDefaults.get(sourceType); + const audioOverrides = APP.audioOverrides.get(el); + const audioDebugPanelOverrides = APP.audioDebugPanelOverrides.get(sourceType); + const zoneSettings = APP.zoneOverrides.get(el); + const preferencesOverrides = + APP.store.state.preferences.audioOutputMode === "audio" ? { audioType: AudioType.Stereo } : {}; + const safariOverrides = isSafari() ? { audioType: AudioType.Stereo } : {}; + const settings = Object.assign( + {}, + defaults, + sceneOverrides, + audioOverrides, + audioDebugPanelOverrides, + zoneSettings, + preferencesOverrides, + safariOverrides + ); + + if (APP.clippingState.has(el) || APP.linkedMutedState.has(el)) { + settings.gain = 0; + } else if (APP.gainMultipliers.has(el)) { + settings.gain = settings.gain * APP.gainMultipliers.get(el); + } + + if (APP.supplementaryAttenuation.has(el)) { + settings.gain = settings.gain * APP.supplementaryAttenuation.get(el); + } + + return settings; +} + +export function getCurrentAudioSettingsForSourceType(sourceType) { + const defaults = defaultSettingsForSourceType.get(sourceType); + const sceneOverrides = APP.sceneAudioDefaults.get(sourceType); + const audioDebugPanelOverrides = APP.audioDebugPanelOverrides.get(sourceType); + return Object.assign({}, defaults, sceneOverrides, audioDebugPanelOverrides); +} + +export function updateAudioSettings(el, audio) { + // Follow these rules and you'll have a good time: + // - If a THREE.Audio or THREE.PositionalAudio is created, call this function. + // - If audio settings change, call this function. + applySettings(audio, getCurrentAudioSettings(el)); +} + +export function shouldAddSupplementaryAttenuation(el, audio) { + // Never add supplemental attenuation to audios that have a panner node; + // The panner node adds its own attenuation. + if (audio.panner) return false; + + // This function must distinguish between Audios that are "incidentally" + // not PositionalAudios from Audios that are "purposefully" not PositionalAudios: + // - An audio is "incidentally" non-positional if it only non-positional + // because the audioOutputMode pref is set to "audio", or + // because panner nodes are broken on a particular platform, or + // because of something else like that. + // - An audio is "purposefully" non-positional if it was authored to be + // a "background sound" or otherwise made that way "on purpose". + // + // Authoring tools like Spoke create components where "audioType : stereo" + // is used to indicate that audio should play in the background without + // left/right panning and without distance-based attenuation. + // + // Those components also include properties like distanceModel, rolloffFactor, etc, + // but these properties were assumed to be ignored by the client. + // Thus we cannot simply apply the attenuation values we would get if we calculated + // attenuation with the provided distanceModel, rolloffFactor, etc. + // + // Instead, we determine what the audioType would be if it were not for the + // "incidental" factors. In particular, we check if the audioType would have + // been PannerNode if we ignored the overrides due to audioOutputMode and platform + // problems (e.g. Safari). + // + // If the audioType would have been PannerNode, then we should apply "fake", + // "supplementary" attenuation. Otherwise, the audio is purposefully a + // "background sound" and we should not apply supplementary attenuation. + const sourceType = APP.sourceType.get(el); + const defaults = defaultSettingsForSourceType.get(sourceType); + const sceneOverrides = APP.sceneAudioDefaults.get(sourceType); + const audioDebugPanelOverrides = APP.audioDebugPanelOverrides.get(sourceType); + const audioOverrides = APP.audioOverrides.get(el); + const zoneSettings = APP.zoneOverrides.get(el); + const settings = Object.assign({}, defaults, sceneOverrides, audioDebugPanelOverrides, audioOverrides, zoneSettings); + return settings.audioType === AudioType.PannerNode; +} diff --git a/src/utils/aframe-overrides.js b/src/utils/aframe-overrides.js new file mode 100644 index 0000000000..366a6f2dbd --- /dev/null +++ b/src/utils/aframe-overrides.js @@ -0,0 +1,7 @@ +import isMobile from "./is-mobile"; + +/** + * Checks if browser is mobile and not stand-alone dedicated vr device. + * @return {Boolean} True if mobile browser detected. + */ +AFRAME.utils.device.isMobile = isMobile; diff --git a/src/utils/aframe-utils.js b/src/utils/aframe-utils.js new file mode 100644 index 0000000000..5513ead898 --- /dev/null +++ b/src/utils/aframe-utils.js @@ -0,0 +1,9 @@ +export function getMeshes(collisionEntities) { + return collisionEntities + .map(function(entity) { + return entity.getObject3D("mesh"); + }) + .filter(function(n) { + return n; + }); +} diff --git a/src/utils/audio-normalizer.js b/src/utils/audio-normalizer.js new file mode 100644 index 0000000000..73497938fe --- /dev/null +++ b/src/utils/audio-normalizer.js @@ -0,0 +1,89 @@ +// Inserts analyser and gain nodes after audio source. +// Analyses audio source volume and adjusts gain value +// to make it in a certain range. +export class AudioNormalizer { + constructor(audio) { + this.audio = audio; + this.analyser = audio.context.createAnalyser(); + this.connected = false; + + // To analyse volume, 32 fftsize may be good enough + this.analyser.fftSize = 32; + this.gain = audio.context.createGain(); + this.timeData = new Uint8Array(this.analyser.frequencyBinCount); + this.volumes = []; + this.volumeSum = 0; + } + + apply() { + if (window.APP.store.state.preferences.audioNormalization) { + if (!this.connected) { + this.connect(); + } + } else { + if (this.connected) { + this.disconnect(); + } + return; + } + + // Adjusts volume in "a rule of the thumb" way + // Any better algorithm? + + // Regards the RMS of time-domain data as volume. + // Is this a right approach? + // Using the RMS of frequency-domain data would be another option. + this.analyser.getByteTimeDomainData(this.timeData); + const squareSum = this.timeData.reduce((sum, num) => sum + Math.pow(num - 128, 2), 0); + const volume = Math.sqrt(squareSum / this.analyser.frequencyBinCount); + const baseVolume = window.APP.store.state.preferences.audioNormalization; + + // Regards volume under certain threshold as "not speaking" and skips. + // I'm not sure if 0.4 is an appropriate threshold. + if (volume >= Math.min(0.4, baseVolume)) { + this.volumeSum += volume; + this.volumes.push(volume); + // Sees only recent volume history because there is a chance + // that a speaker changes their master input volume. + // I'm not sure if 600 is an appropriate number. + while (this.volumes.length > 600) { + this.volumeSum -= this.volumes.shift(); + } + // Adjusts volume after getting many enough volume history. + // I'm not sure if 60 is an appropriate number. + if (this.volumes.length >= 60) { + const averageVolume = this.volumeSum / this.volumes.length; + this.gain.gain.setTargetAtTime(baseVolume / averageVolume, this.audio.context.currentTime, 0.01); + } + } + } + + connect() { + // Hacks. THREE.Audio connects audio nodes when source is set. + // If audio is not played yet, THREE.Audio.setFilters() doesn't + // reset connections. Then manually caling .connect()/disconnect() here. + // This might be a bug of Three.js and should be fixed in Three.js side? + if (this.audio.source && !this.audio.isPlaying) { + this.audio.disconnect(); + } + const filters = this.audio.getFilters(); + filters.unshift(this.analyser, this.gain); + this.audio.setFilters(filters); + if (this.audio.source && !this.audio.isPlaying) { + this.audio.connect(); + } + this.connected = true; + } + + disconnect() { + if (this.audio.source && !this.audio.isPlaying) { + this.audio.disconnect(); + } + const filters = [this.analyser, this.gain]; + this.audio.setFilters(this.audio.getFilters().filter(filter => !filters.includes(filter))); + if (this.audio.source && !this.audio.isPlaying) { + this.audio.connect(); + } + this.connected = false; + } +} diff --git a/src/utils/auto-box-collider.js b/src/utils/auto-box-collider.js index f60f652bff..b5400adc92 100644 --- a/src/utils/auto-box-collider.js +++ b/src/utils/auto-box-collider.js @@ -16,7 +16,7 @@ export const computeLocalBoundingBox = (function() { return function computeLocalBoundingBox(root, box, excludeInvisible) { box.makeEmpty(); root.updateMatrices(); - rootInverse.getInverse(root.matrixWorld); + rootInverse.copy(root.matrixWorld).invert(); root.traverse(node => { if (excludeInvisible && !isVisibleUpToRoot(node, root)) { return; @@ -32,7 +32,7 @@ export const computeLocalBoundingBox = (function() { } } else if (node.geometry.isBufferGeometry && node.geometry.attributes.position) { const array = node.geometry.attributes.position.array; - const itemSize = node.geometry.attributes.position._itemSize; + const itemSize = node.geometry.attributes.position.itemSize; for (let i = 0; i < node.geometry.attributes.position.count; i++) { if (itemSize === 2) { vertex.set(array[2 * i], array[2 * i + 1], 0); diff --git a/src/utils/chat-message.js b/src/utils/chat-message.js index 792a4b3a08..df8cad2774 100644 --- a/src/utils/chat-message.js +++ b/src/utils/chat-message.js @@ -32,11 +32,13 @@ function safeHTML(text) { __html: linkifyHtml(sanitize(text, sanitizeOpts), linkifyOpts) }; } +export const MAX_MESSAGE_LENGTH = 750; export function formatMessageBody(body, { emojiClassName } = {}) { // Support wrapping text in ` to get monospace, and multiline. + const bodyLength = body.length >= MAX_MESSAGE_LENGTH ? MAX_MESSAGE_LENGTH : body.length; const monospace = body.startsWith("`") && body.endsWith("`"); - const cleanedBody = (monospace ? body.substring(1, body.length - 1) : body).trim(); + const cleanedBody = (monospace ? body.substring(1, bodyLength - 1) : body.substring(0, bodyLength)).trim(); const messages = cleanedBody .split("\n") diff --git a/src/utils/configs.js b/src/utils/configs.js index 9cac618092..d68d8e0e3a 100644 --- a/src/utils/configs.js +++ b/src/utils/configs.js @@ -1,4 +1,5 @@ import appLogo from "../assets/images/app-logo.png"; +import appLogoDark from "../assets/images/app-logo-dark.png"; import companyLogo from "../assets/images/company-logo.png"; import homeHeroBackground from "../assets/images/home-hero-background-unbranded.png"; import sceneEditorLogo from "../assets/images/editor-logo.png"; @@ -7,7 +8,6 @@ import { getLocale, getMessage } from "./i18n"; // Read configs from global variable if available, otherwise use the process.env injected from build. const configs = {}; let isAdmin = false; - [ "RETICULUM_SERVER", "THUMBNAIL_SERVER", @@ -19,7 +19,8 @@ let isAdmin = false; "IMMERS_SERVER", "IMMERS_SCOPE", "IMMERS_ALLOW_GUESTS", - "BASE_ASSETS_PATH" + "BASE_ASSETS_PATH", + "UPLOADS_HOST" ].forEach(x => { const el = document.querySelector(`meta[name='env:${x.toLowerCase()}']`); configs[x] = el ? el.getAttribute("content") : process.env[x]; @@ -30,6 +31,10 @@ let isAdmin = false; } }); +// Custom clients do not use tags for passing data, so if thumbnail_server meta tag exists, it is not a custom client +const hasThumbnailServerMetaTag = !!document.querySelector("meta[name='env:thumbnail_server']"); +configs.IS_LOCAL_OR_CUSTOM_CLIENT = !hasThumbnailServerMetaTag; + // Also include configs that reticulum injects as a script in the page head. configs.AVAILABLE_INTEGRATIONS = window.AVAILABLE_INTEGRATIONS || {}; @@ -77,6 +82,7 @@ let localDevImages = {}; if (isLocalDevelopment) { localDevImages = { logo: appLogo, + logo_dark: appLogoDark, company_logo: companyLogo, editor_logo: sceneEditorLogo, home_background: homeHeroBackground diff --git a/src/utils/create-basis-texture.js b/src/utils/create-basis-texture.js new file mode 100644 index 0000000000..2d94fe8e98 --- /dev/null +++ b/src/utils/create-basis-texture.js @@ -0,0 +1,56 @@ +import { KTX2Loader } from "three/examples/jsm/loaders/KTX2Loader"; +import { BasisTextureLoader } from "three/examples/jsm/loaders/BasisTextureLoader"; +import { rewriteBasisTranscoderUrls } from "./media-url-utils"; +const loadingManager = new THREE.LoadingManager(); +loadingManager.setURLModifier(rewriteBasisTranscoderUrls); +let ktxLoader; +let basisLoader; +export function createBasisTexture(url) { + if (!basisLoader) { + basisLoader = new BasisTextureLoader(loadingManager).detectSupport(AFRAME.scenes[0].renderer); + } + return new Promise((resolve, reject) => { + basisLoader.load( + url, + function(texture) { + texture.encoding = THREE.sRGBEncoding; + texture.onUpdate = function() { + // Delete texture data once it has been uploaded to the GPU + texture.mipmaps.length = 0; + }; + // texture.anisotropy = 4; + resolve(texture); + }, + undefined, + function(error) { + console.error(error); + reject(new Error(`'${url}' could not be fetched (Error: ${error}`)); + } + ); + }); +} + +export function createKTX2Texture(url) { + if (!ktxLoader) { + ktxLoader = new KTX2Loader(loadingManager).detectSupport(AFRAME.scenes[0].renderer); + } + return new Promise((resolve, reject) => { + ktxLoader.load( + url, + function(texture) { + texture.encoding = THREE.sRGBEncoding; + texture.onUpdate = function() { + // Delete texture data once it has been uploaded to the GPU + texture.mipmaps.length = 0; + }; + texture.anisotropy = 4; + resolve(texture); + }, + undefined, + function(error) { + console.error(error); + reject(new Error(`'${url}' could not be fetched (Error: ${error}`)); + } + ); + }); +} diff --git a/src/utils/detect-safari.js b/src/utils/detect-safari.js index e24518e54c..30858a8e84 100644 --- a/src/utils/detect-safari.js +++ b/src/utils/detect-safari.js @@ -2,6 +2,5 @@ import { detect } from "detect-browser"; export function isSafari() { const browser = detect(); - if (!browser) return false; return ["iOS", "Mac OS"].includes(browser.os) && ["safari", "ios"].includes(browser.name); } diff --git a/src/utils/error-texture.js b/src/utils/error-texture.js new file mode 100644 index 0000000000..98711578ba --- /dev/null +++ b/src/utils/error-texture.js @@ -0,0 +1,8 @@ +import errorImageSrc from "!!url-loader!../assets/images/media-error.png"; + +const errorImage = new Image(); +errorImage.src = errorImageSrc; +export const errorTexture = new THREE.Texture(errorImage); +errorImage.onload = () => { + errorTexture.needsUpdate = true; +}; diff --git a/src/utils/fullscreen.js b/src/utils/fullscreen.js index 0423bb7a6e..15056e4731 100644 --- a/src/utils/fullscreen.js +++ b/src/utils/fullscreen.js @@ -1,14 +1,11 @@ import screenfull from "screenfull"; +import { isIOS } from "./is-mobile"; let hasEnteredFullScreenThisSession = false; function shouldShowFullScreen() { // Disable full screen on iOS, since Safari's fullscreen mode does not let you prevent native pinch-to-zoom gestures. - return ( - (AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileVR()) && - !AFRAME.utils.device.isIOS() && - screenfull.enabled - ); + return (AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileVR()) && !isIOS() && screenfull.enabled; } export function willRequireUserGesture() { diff --git a/src/utils/get-app-logo.js b/src/utils/get-app-logo.js new file mode 100644 index 0000000000..33918515c2 --- /dev/null +++ b/src/utils/get-app-logo.js @@ -0,0 +1,20 @@ +import configs from "./configs"; +import { themes } from "../react-components/styles/theme"; +import { getColorSchemePref } from "./get-color-scheme-pref"; + +function getCurrentTheme() { + if (!Array.isArray(themes)) return; + + const preferredThemeId = APP.store?.state?.preferences?.theme; + if (preferredThemeId) { + return themes.find(t => t.id === preferredThemeId); + } else { + return getColorSchemePref(); + } +} + +export function getAppLogo() { + const theme = getCurrentTheme(); + const shouldUseDarkLogo = theme && theme.darkModeDefault; + return (shouldUseDarkLogo && configs.image("logo_dark")) || configs.image("logo"); +} diff --git a/src/utils/get-color-scheme-pref.js b/src/utils/get-color-scheme-pref.js new file mode 100644 index 0000000000..6009ace68b --- /dev/null +++ b/src/utils/get-color-scheme-pref.js @@ -0,0 +1,7 @@ +import { themes } from "../react-components/styles/theme"; + +export function getColorSchemePref() { + const darkmodeQuery = window.matchMedia("(prefers-color-scheme: dark)"); + const darkMode = darkmodeQuery.matches; + return (darkMode && themes.find(t => t.darkModeDefault)) || themes.find(t => t.default); +} diff --git a/src/utils/gif-texture.js b/src/utils/gif-texture.js new file mode 100644 index 0000000000..2f55e33fc5 --- /dev/null +++ b/src/utils/gif-texture.js @@ -0,0 +1,68 @@ +import { promisifyWorker } from "../utils/promisify-worker.js"; + +import GIFWorker from "../workers/gifparsing.worker.js"; + +class GIFTexture extends THREE.Texture { + constructor(frames, delays, disposals) { + super(document.createElement("canvas")); + this.image.width = frames[0].width; + this.image.height = frames[0].height; + + this._ctx = this.image.getContext("2d"); + + this.generateMipmaps = false; + this.isVideoTexture = true; + this.minFilter = THREE.NearestFilter; + + this.frames = frames; + this.delays = delays; + this.disposals = disposals; + + this.frame = 0; + this.frameStartTime = Date.now(); + } + + update() { + if (!this.frames || !this.delays || !this.disposals) return; + const now = Date.now(); + if (now - this.frameStartTime > this.delays[this.frame]) { + if (this.disposals[this.frame] === 2) { + this._ctx.clearRect(0, 0, this.image.width, this.image.width); + } + this.frame = (this.frame + 1) % this.frames.length; + this.frameStartTime = now; + this._ctx.drawImage(this.frames[this.frame], 0, 0, this.image.width, this.image.height); + this.needsUpdate = true; + } + } +} + +const parseGIF = promisifyWorker(new GIFWorker()); + +export async function createGIFTexture(url) { + return new Promise((resolve, reject) => { + fetch(url, { mode: "cors" }) + .then(r => r.arrayBuffer()) + .then(rawImageData => parseGIF(rawImageData, [rawImageData])) + .then(result => { + const { frames, delayTimes, disposals } = result; + let loadCnt = 0; + for (let i = 0; i < frames.length; i++) { + const img = new Image(); + img.onload = e => { + loadCnt++; + frames[i] = e.target; + if (loadCnt === frames.length) { + const texture = new GIFTexture(frames, delayTimes, disposals); + texture.image.src = url; + texture.encoding = THREE.sRGBEncoding; + texture.minFilter = THREE.LinearFilter; + resolve(texture); + } + }; + img.src = frames[i]; + } + }) + .catch(reject); + }); +} diff --git a/src/utils/history.js b/src/utils/history.js index a37150e7b9..4894015074 100644 --- a/src/utils/history.js +++ b/src/utils/history.js @@ -34,6 +34,9 @@ function pushOrUpdateHistory(history, replace, k, v, detail, newPathname, newSea const search = newSearch !== undefined ? newSearch : history.location.search; + // Hash can't be overriden like the other elements, but needs to be preserved for things like deep linking waypoints + const hash = history.location.hash; + // If popToBeginningOfHubHistory was previously used, there is a duplicate entry // at the top of the history stack (which was needed to wipe out forward history) // so we use this opportunity to replace it. @@ -41,7 +44,7 @@ function pushOrUpdateHistory(history, replace, k, v, detail, newPathname, newSea const method = replace || isDuplicate ? history.replace : history.push; state.__historyLength = newLength; - method({ pathname, search, state }); + method({ pathname, search, state, hash }); } export function pushHistoryState(history, k, v, detail) { diff --git a/src/utils/hub-channel.js b/src/utils/hub-channel.js index c55b76bf99..448a95e53c 100644 --- a/src/utils/hub-channel.js +++ b/src/utils/hub-channel.js @@ -1,7 +1,7 @@ import jwtDecode from "jwt-decode"; import { EventTarget } from "event-target-shim"; import { Presence } from "phoenix"; -import { migrateChannelToSocket, discordBridgesForPresences } from "./phoenix-utils"; +import { migrateChannelToSocket, discordBridgesForPresences, migrateToChannel } from "./phoenix-utils"; import configs from "./configs"; const MS_PER_DAY = 1000 * 60 * 60 * 24; @@ -43,6 +43,8 @@ export default class HubChannel extends EventTarget { this._signedIn = !!this.store.state.credentials.token; this._permissions = {}; this._blockedSessionIds = new Set(); + + store.addEventListener("profilechanged", this.sendProfileUpdate.bind(this)); } get signedIn() { @@ -105,13 +107,41 @@ export default class HubChannel extends EventTarget { } } - setPhoenixChannel = channel => { - this.channel = channel; - this.presence = new Presence(channel); - }; + async migrateToHub(hubId) { + let presenceBindings; + + const newChannel = this.channel.socket.channel(`hub:${hubId}`, APP.hubChannelParamsForPermsToken()); + const data = await migrateToChannel(this.channel, newChannel); + + if (this.presence) { + presenceBindings = { + onJoin: this.presence.caller.onJoin, + onLeave: this.presence.caller.onLeave, + onSync: this.presence.caller.onSync + }; + + this.presence.onJoin(function() {}); + this.presence.onLeave(function() {}); + this.presence.onSync(function() {}); + } + + this.channel = newChannel; + this.presence = new Presence(this.channel); + this.hubId = data.hubs[0].hub_id; + + this.setPermissionsFromToken(data.perms_token); + + if (presenceBindings) { + this.presence.onJoin(presenceBindings.onJoin); + this.presence.onLeave(presenceBindings.onLeave); + this.presence.onSync(presenceBindings.onSync); + } + return data; + } setPermissionsFromToken = token => { // Note: token is not verified. + this.token = token; this._permissions = jwtDecode(token); this._permissions.pin_objects = this._permissions.pin_objects && this._signedIn; configs.setIsAdmin(this._permissions.postgrest_role === "ret_admin"); @@ -119,10 +149,10 @@ export default class HubChannel extends EventTarget { // Refresh the token 1 minute before it expires. const nextRefresh = new Date(this._permissions.exp * 1000 - 60 * 1000) - new Date(); - setTimeout(async () => { - const result = await this.fetchPermissions(); - this.dispatchEvent(new CustomEvent("permissions-refreshed", { detail: result })); - }, nextRefresh); + if (this.fetchPermissionsTimeout) { + clearTimeout(this.fetchPermissionsTimeout); + } + this.fetchPermissionsTimeout = setTimeout(this.fetchPermissions, nextRefresh); }; sendEnteringEvent = async () => { @@ -149,13 +179,13 @@ export default class HubChannel extends EventTarget { } } - // This is fairly hacky, but gets the # of initial occupants - let initialOccupantCount = 0; - if (NAF.connection.adapter) { - // When I enter room as avatar, count number of people inside the room as avatars and lobby - // I enter room alone, no one in lobby, this is 0 - initialOccupantCount = Object.keys(NAF.connection.adapter.occupants).length; - } + const initialOccupantCount = this.presence + .list((key, presence) => { + return { key, entryState: presence.metas[presence.metas.length - 1].presence }; + }) + .filter(({ key, entryState }) => { + return key !== NAF.clientId && entryState === "room"; + }).length; const entryTimingFlags = this.getEntryTimingFlags(); @@ -332,7 +362,7 @@ export default class HubChannel extends EventTarget { .receive("ok", res => { resolve(res.oauth_url); }) - .receive("error", reject); + .receive("error", err => reject(new Error(err.reason))); }); }; @@ -382,6 +412,7 @@ export default class HubChannel extends EventTarget { hide = sessionId => { NAF.connection.adapter.block(sessionId); + APP.dialog.block(sessionId); this.channel.push("block", { session_id: sessionId }); this._blockedSessionIds.add(sessionId); }; @@ -389,6 +420,7 @@ export default class HubChannel extends EventTarget { unhide = sessionId => { if (!this._blockedSessionIds.has(sessionId)) return; NAF.connection.adapter.unblock(sessionId); + APP.dialog.unblock(sessionId); NAF.connection.entities.completeSync(sessionId); this.channel.push("unblock", { session_id: sessionId }); this._blockedSessionIds.delete(sessionId); @@ -397,8 +429,7 @@ export default class HubChannel extends EventTarget { isHidden = sessionId => this._blockedSessionIds.has(sessionId); kick = async sessionId => { - const permsToken = await this.fetchPermissions(); - NAF.connection.adapter.kick(sessionId, permsToken); + APP.dialog.kick(sessionId); this.channel.push("kick", { session_id: sessionId }); }; diff --git a/src/utils/hub-utils.js b/src/utils/hub-utils.js new file mode 100644 index 0000000000..db71ea6688 --- /dev/null +++ b/src/utils/hub-utils.js @@ -0,0 +1,50 @@ +import configs from "./configs"; +export function getCurrentHubId() { + const qs = new URLSearchParams(location.search); + const defaultRoomId = configs.feature("default_room_id"); + + return ( + qs.get("hub_id") || + (document.location.pathname === "/" && defaultRoomId + ? defaultRoomId + : document.location.pathname.substring(1).split("/")[0]) + ); +} + +export function updateVRHudPresenceCount({ presence }) { + const occupantCount = Object.getOwnPropertyNames(presence.state).length; + const vrHudPresenceCount = document.querySelector("#hud-presence-count"); + vrHudPresenceCount.setAttribute("text", "value", occupantCount.toString()); +} +export function updateSceneCopresentState(presence, scene) { + const occupantCount = Object.getOwnPropertyNames(presence.state).length; + if (occupantCount > 1) { + scene.addState("copresent"); + } else { + scene.removeState("copresent"); + } +} + +export function createHubChannelParams({ + permsToken, + profile, + pushSubscriptionEndpoint, + isMobile, + isMobileVR, + isEmbed, + hubInviteId, + authToken +}) { + return { + profile, + push_subscription_endpoint: pushSubscriptionEndpoint, + auth_token: authToken || null, + perms_token: permsToken || null, + context: { + mobile: isMobile || isMobileVR, + embed: isEmbed, + hmd: isMobileVR + }, + hub_invite_id: hubInviteId + }; +} diff --git a/src/utils/i18n.js b/src/utils/i18n.js index 86e9b8a1e3..b73077cdc2 100644 --- a/src/utils/i18n.js +++ b/src/utils/i18n.js @@ -8,7 +8,7 @@ const defaultLocaleData = { "contact-email": "app@company.com", "company-name": "Company", "share-hashtag": "#app", - "app-description": "Share a virtual room with friends. Watch videos, play with 3D objects, or just hang out.", + "app-description": "Gather share and collaborate together in a virtual, private and safe space", "app-tagline": "Private social VR in your web browser" }; diff --git a/src/utils/is-mobile.js b/src/utils/is-mobile.js index c6ffd9459d..a5893713c5 100644 --- a/src/utils/is-mobile.js +++ b/src/utils/is-mobile.js @@ -1,8 +1,16 @@ import { hackyMobileSafariTest } from "./detect-touchscreen"; +const MOBILE_RE = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i; +const TABLET_RE = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i; + +// from https://stackoverflow.com/questions/57776001/how-to-detect-ipad-pro-as-ipad-using-javascript +function isIpadOS() { + return window.navigator.maxTouchPoints && window.navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform); +} + // lifted from https://github.com/aframevr/aframe/blob/master/src/utils/device.js to ensure consistency -function isIOS() { - return /iPad|iPhone|iPod/.test(window.navigator.platform); +export function isIOS() { + return /iPad|iPhone|iPod/.test(window.navigator.platform) || isIpadOS(); } function isTablet(mockUserAgent) { @@ -14,18 +22,23 @@ function isR7() { return /R7 Build/.test(window.navigator.userAgent); } +function isOculusBrowser() { + return /(OculusBrowser)/i.test(window.navigator.userAgent); +} + +function isFirefoxReality() { + return /(Mobile VR)/i.test(window.navigator.userAgent); +} + +function isMobileVR() { + return isOculusBrowser() || isFirefoxReality(); +} + const isMobile = (function() { let _isMobile = false; (function(a) { // eslint-disable-next-line no-useless-escape - if ( - /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test( - a - ) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test( - a.substr(0, 4) - ) - ) { + if (MOBILE_RE.test(a) || TABLET_RE.test(a.substr(0, 4))) { _isMobile = true; } if (isIOS() || isTablet() || isR7()) { @@ -34,6 +47,9 @@ const isMobile = (function() { if (hackyMobileSafariTest()) { _isMobile = true; } + if (isMobileVR()) { + _isMobile = false; + } })(window.navigator.userAgent || window.navigator.vendor || window.opera); return function() { diff --git a/src/utils/material-utils.js b/src/utils/material-utils.js index 42cbf5ad5c..96f815179a 100644 --- a/src/utils/material-utils.js +++ b/src/utils/material-utils.js @@ -8,13 +8,23 @@ export function forEachMaterial(object3D, fn) { } } -export function mapMaterials(object3D, fn) { +export function updateMaterials(object3D, fn) { if (!object3D.material) return; + if (Array.isArray(object3D.material)) { + object3D.material = object3D.material.map(fn); + } else { + object3D.material = fn(object3D.material); + } +} + +export function mapMaterials(object3D, fn) { + if (!object3D.material) return []; + if (Array.isArray(object3D.material)) { return object3D.material.map(fn); } else { - return fn(object3D.material); + return [fn(object3D.material)]; } } @@ -47,9 +57,6 @@ class HubsMeshBasicMaterial extends THREE.MeshBasicMaterial { material.wireframeLinecap = source.wireframeLinecap; material.wireframeLinejoin = source.wireframeLinejoin; - material.skinning = source.skinning; - material.morphTargets = source.morphTargets; - return material; } @@ -107,17 +114,11 @@ class HubsMeshBasicMaterial extends THREE.MeshBasicMaterial { shader.fragmentShader = shader.fragmentShader.replace( "#include ", `#include - vec3 totalEmissiveRadiance = emissive; - - vec4 emissiveColor = vec4(0.0, 0.0, 0.0, 0.0); - - #ifdef USE_UV - emissiveColor = texture2D( emissiveMap, vUv ); - #endif - emissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb; - totalEmissiveRadiance *= emissiveColor.rgb; + vec3 totalEmissiveRadiance = emissive; + #include outgoingLight += totalEmissiveRadiance; + ` ); }; @@ -164,10 +165,6 @@ class HubsMeshPhongMaterial extends THREE.MeshPhongMaterial { material.wireframeLinecap = source.wireframeLinecap; material.wireframeLinejoin = source.wireframeLinejoin; - material.skinning = source.skinning; - material.morphTargets = source.morphTargets; - material.morphNormals = source.morphNormals; - return material; } @@ -225,6 +222,10 @@ export function convertStandardMaterial(source, quality) { } export function disposeTexture(texture) { + if (texture.dash) { + texture.dash.reset(); + } + if (texture.image instanceof HTMLVideoElement) { const video = texture.image; video.pause(); @@ -239,9 +240,5 @@ export function disposeTexture(texture) { texture.hls = null; } - if (texture.dash) { - texture.dash.reset(); - } - texture.dispose(); } diff --git a/src/utils/media-devices-manager.js b/src/utils/media-devices-manager.js index 3a11d95a61..e5234096d4 100644 --- a/src/utils/media-devices-manager.js +++ b/src/utils/media-devices-manager.js @@ -94,6 +94,7 @@ export default class MediaDevicesManager { }; async fetchMediaDevices() { + console.log("Fetching media devices"); return new Promise(resolve => { navigator.mediaDevices.enumerateDevices().then(mediaDevices => { this.micDevices = mediaDevices @@ -108,6 +109,7 @@ export default class MediaDevicesManager { } async startMicShare(deviceId) { + console.log("Starting microphone sharing"); let constraints = { audio: {} }; if (deviceId) { constraints = { audio: { deviceId: { ideal: [deviceId] } } }; @@ -129,7 +131,7 @@ export default class MediaDevicesManager { console.log("No available audio tracks"); } - NAF.connection.adapter.enableMicrophone(true); + await APP.dialog.setLocalMediaStream(this._mediaStream); return result; } @@ -165,6 +167,7 @@ export default class MediaDevicesManager { } try { + console.log("Adding microphone media stream"); const newStream = await navigator.mediaDevices.getUserMedia(constraints); this.audioSystem.addStreamToOutboundAudio("microphone", newStream); this.audioTrack = newStream.getAudioTracks()[0]; @@ -208,10 +211,8 @@ export default class MediaDevicesManager { this.audioTrack?.stop(); this.audioTrack = null; - this._scene.emit("action_mute"); - - NAF.connection.adapter.enableMicrophone(false); - await NAF.connection.adapter.setLocalMediaStream(this._mediaStream); + await APP.dialog.setLocalMediaStream(this._mediaStream); + APP.dialog.enableMicrophone(false); } async startVideoShare(constraints, isDisplayMedia, target, success, error) { @@ -242,7 +243,7 @@ export default class MediaDevicesManager { this.audioSystem.addStreamToOutboundAudio("screenshare", newStream); } - await NAF.connection.adapter.setLocalMediaStream(this._mediaStream); + await APP.dialog.setLocalMediaStream(this._mediaStream); } } catch (e) { error(e); @@ -263,7 +264,7 @@ export default class MediaDevicesManager { this.audioSystem.removeStreamFromOutboundAudio("screenshare"); - await NAF.connection.adapter.setLocalMediaStream(this._mediaStream); + await APP.dialog.setLocalMediaStream(this._mediaStream); } async shouldShowHmdMicWarning() { diff --git a/src/utils/media-url-utils.js b/src/utils/media-url-utils.js index 15faec5b14..416ee15104 100644 --- a/src/utils/media-url-utils.js +++ b/src/utils/media-url-utils.js @@ -3,7 +3,7 @@ import configs from "./configs"; const nonCorsProxyDomains = (configs.NON_CORS_PROXY_DOMAINS || "").split(","); if (configs.CORS_PROXY_SERVER) { - nonCorsProxyDomains.push(configs.CORS_PROXY_SERVER); + nonCorsProxyDomains.push(configs.CORS_PROXY_SERVER.split(":")[0]); } nonCorsProxyDomains.push(document.location.hostname); diff --git a/src/utils/media-utils.js b/src/utils/media-utils.js index 01c3c576f2..3c0477c69f 100644 --- a/src/utils/media-utils.js +++ b/src/utils/media-utils.js @@ -2,10 +2,11 @@ import { objectTypeForOriginAndContentType } from "../object-types"; import { getReticulumFetchUrl, getDirectReticulumFetchUrl } from "./phoenix-utils"; import { ObjectContentOrigins } from "../object-types"; import mediaHighlightFrag from "./media-highlight-frag.glsl"; -import { mapMaterials } from "./material-utils"; +import { updateMaterials } from "./material-utils"; import HubsTextureLoader from "../loaders/HubsTextureLoader"; import { validMaterials } from "../components/hoverable-visuals"; import { proxiedUrlFor, guessContentType } from "../utils/media-url-utils"; +import { isIOS as detectIOS } from "./is-mobile"; import Linkify from "linkify-it"; import tlds from "tlds"; @@ -260,16 +261,13 @@ export const cloneMedia = (sourceEl, template, src = null, networked = true, lin }; export function injectCustomShaderChunks(obj) { - const vertexRegex = /\bskinning_vertex\b/; - const fragRegex = /\bgl_FragColor\b/; - const shaderUniforms = []; const batchManagerSystem = AFRAME.scenes[0].systems["hubs-systems"].batchManagerSystem; obj.traverse(object => { if (!object.material) return; - object.material = mapMaterials(object, material => { + updateMaterials(object, material => { if (material.hubs_InjectedCustomShaderChunks) return material; if (!validMaterials.includes(material.type)) { return material; @@ -294,7 +292,7 @@ export function injectCustomShaderChunks(obj) { const newMaterial = material.clone(); // This will not run if the object is never rendered unbatched, since its unbatched shader will never be compiled newMaterial.onBeforeCompile = (shader, renderer) => { - if (!vertexRegex.test(shader.vertexShader)) return; + if (shader.vertexShader.indexOf("#include ") == -1) return; if (material.onBeforeCompile) { material.onBeforeCompile(shader, renderer); @@ -309,37 +307,40 @@ export function injectCustomShaderChunks(obj) { shader.uniforms.hubs_HighlightInteractorTwo = { value: false }; shader.uniforms.hubs_Time = { value: 0 }; - const vchunk = ` - if (hubs_HighlightInteractorOne || hubs_HighlightInteractorTwo || hubs_IsFrozen) { - vec4 wt = modelMatrix * vec4(transformed, 1); - - // Used in the fragment shader below. - hubs_WorldPosition = wt.xyz; - } - `; - - const vlines = shader.vertexShader.split("\n"); - const vindex = vlines.findIndex(line => vertexRegex.test(line)); - vlines.splice(vindex + 1, 0, vchunk); - vlines.unshift("varying vec3 hubs_WorldPosition;"); - vlines.unshift("uniform bool hubs_IsFrozen;"); - vlines.unshift("uniform bool hubs_HighlightInteractorOne;"); - vlines.unshift("uniform bool hubs_HighlightInteractorTwo;"); - shader.vertexShader = vlines.join("\n"); - - const flines = shader.fragmentShader.split("\n"); - const findex = flines.findIndex(line => fragRegex.test(line)); - flines.splice(findex + 1, 0, mediaHighlightFrag); - flines.unshift("varying vec3 hubs_WorldPosition;"); - flines.unshift("uniform bool hubs_IsFrozen;"); - flines.unshift("uniform bool hubs_EnableSweepingEffect;"); - flines.unshift("uniform vec2 hubs_SweepParams;"); - flines.unshift("uniform bool hubs_HighlightInteractorOne;"); - flines.unshift("uniform vec3 hubs_InteractorOnePos;"); - flines.unshift("uniform bool hubs_HighlightInteractorTwo;"); - flines.unshift("uniform vec3 hubs_InteractorTwoPos;"); - flines.unshift("uniform float hubs_Time;"); - shader.fragmentShader = flines.join("\n"); + shader.vertexShader = + [ + "varying vec3 hubs_WorldPosition;", + "uniform bool hubs_IsFrozen;", + "uniform bool hubs_HighlightInteractorOne;", + "uniform bool hubs_HighlightInteractorTwo;\n" + ].join("\n") + + shader.vertexShader.replace( + "#include ", + `#include + if (hubs_HighlightInteractorOne || hubs_HighlightInteractorTwo || hubs_IsFrozen) { + vec4 wt = modelMatrix * vec4(transformed, 1); + + // Used in the fragment shader below. + hubs_WorldPosition = wt.xyz; + }` + ); + + shader.fragmentShader = + [ + "varying vec3 hubs_WorldPosition;", + "uniform bool hubs_IsFrozen;", + "uniform bool hubs_EnableSweepingEffect;", + "uniform vec2 hubs_SweepParams;", + "uniform bool hubs_HighlightInteractorOne;", + "uniform vec3 hubs_InteractorOnePos;", + "uniform bool hubs_HighlightInteractorTwo;", + "uniform vec3 hubs_InteractorTwoPos;", + "uniform float hubs_Time;\n" + ].join("\n") + + shader.fragmentShader.replace( + "#include ", + "#include \n" + mediaHighlightFrag + ); shaderUniforms.push(shader.uniforms); }; @@ -440,10 +441,8 @@ export async function createImageTexture(url, filter) { texture = new THREE.CanvasTexture(canvas); } else { - texture = new THREE.Texture(); - try { - await textureLoader.loadTextureAsync(texture, url); + texture = await textureLoader.loadAsync(url); } catch (e) { throw new Error(`'${url}' could not be fetched (Error code: ${e.status}; Response: ${e.statusText})`); } @@ -455,7 +454,7 @@ export async function createImageTexture(url, filter) { return texture; } -const isIOS = AFRAME.utils.device.isIOS(); +const isIOS = detectIOS(); /** * Create video element to be used as a texture. @@ -546,3 +545,23 @@ export function closeExistingMediaMirror() { }); } } + +export function hasAudioTracks(el) { + if (!el) return false; + + // `audioTracks` is the "correct" way to check this but is not implemented by most browsers + // The rest of the checks are a bit of a race condition, but when loading videos we wait for + // the first frame to load, so audio should exist by then. We special case audio-only by checkin + // for a 0 size video. Not great... + if (el.audioTracks !== undefined) { + return el.audioTracks.length > 0; + } else if (el.videoWidth === 0 && el.videoHeight === 0) { + return true; + } else if (el.mozHasAudio !== undefined) { + return el.mozHasAudio; + } else if (el.webkitAudioDecodedByteCount !== undefined) { + return el.webkitAudioDecodedByteCount > 0; + } else { + return false; + } +} diff --git a/src/utils/microphone-presence.js b/src/utils/microphone-presence.js index 4fcf36486c..23970a6d6c 100644 --- a/src/utils/microphone-presence.js +++ b/src/utils/microphone-presence.js @@ -22,7 +22,9 @@ export const getMicrophonePresences = (() => { if (playerInfo.isLocalPlayerInfo) { talking = sceneEl.systems["local-audio-analyser"].volume > MIC_PRESENCE_VOLUME_THRESHOLD; } - sessionIds.push(playerSessionId); + if (sessionIds.indexOf(playerSessionId) === -1) { + sessionIds.push(playerSessionId); + } currentSessionIds.push(playerSessionId); if (microphonePresences.has(playerSessionId)) { const presence = microphonePresences.get(playerSessionId); diff --git a/src/utils/permissions-utils.js b/src/utils/permissions-utils.js index d441ef2eb2..f551cf51f1 100644 --- a/src/utils/permissions-utils.js +++ b/src/utils/permissions-utils.js @@ -232,9 +232,8 @@ export function authorizeOrSanitizeMessage(message) { } } -const PHOENIX_RELIABLE_NAF = "phx-reliable"; export function applyPersistentSync(networkId) { if (!persistentSyncs[networkId]) return; - NAF.connection.adapter.onData(authorizeOrSanitizeMessage(persistentSyncs[networkId]), PHOENIX_RELIABLE_NAF); + NAF.connection.adapter.handleIncomingNAF(persistentSyncs[networkId]); delete persistentSyncs[networkId]; } diff --git a/src/utils/phoenix-utils.js b/src/utils/phoenix-utils.js index 8ea88c584f..5ca00f548e 100644 --- a/src/utils/phoenix-utils.js +++ b/src/utils/phoenix-utils.js @@ -1,6 +1,7 @@ import { Socket } from "phoenix"; import { generateHubName } from "../utils/name-generation"; import configs from "../utils/configs"; +import { sleep } from "../utils/async-utils"; import Store from "../storage/store"; @@ -12,7 +13,7 @@ export function isLocalClient() { return hasReticulumServer() && document.location.host !== configs.RETICULUM_SERVER; } -export function hubUrl(hubId, extraParams) { +export function hubUrl(hubId, extraParams, slug) { if (!hubId) { if (isLocalClient()) { hubId = new URLSearchParams(location.search).get("hub_id"); @@ -26,7 +27,8 @@ export function hubUrl(hubId, extraParams) { url = new URL(`/hub.html`, location.href); url.searchParams.set("hub_id", hubId); } else { - url = new URL(`/${hubId}`, location.href); + const maybeSlug = slug ? `/${slug}` : ""; + url = new URL(`/${hubId}${maybeSlug}`, location.href); } for (const key in extraParams) { @@ -53,6 +55,18 @@ export function getReticulumFetchUrl(path, absolute = false, host = null, port = } } +export function getUploadsUrl(path, absolute = false, host = null, port = null) { + // If the Hubs Cloud stack is configured to use Cloudflare, we need to ignore the configured UPLOADS_HOST + // since reticulum will only serve uploads via the Cloudflare worker. BASE_ASSETS_PATH will have been + // correctly configured to use the Cloudflare worker, though we only need the hostname, + // not the full assets URL. + const isUsingCloudflare = configs.BASE_ASSETS_PATH.includes("workers.dev"); + const uploadsHost = isUsingCloudflare ? new URL(configs.BASE_ASSETS_PATH).hostname : configs.UPLOADS_HOST; + return uploadsHost + ? `https://${uploadsHost}${port ? `:${port}` : ""}${path}` + : getReticulumFetchUrl(path, absolute, host, port); +} + export async function getReticulumMeta() { if (!reticulumMeta) { // Initially look up version based upon page, avoiding round-trip, otherwise fetch. @@ -256,6 +270,20 @@ export function getPresenceProfileForSession(presences, sessionId) { return (getPresenceEntryForSession(presences, sessionId) || {}).profile || {}; } +function migrateBindings(oldChannel, newChannel) { + const doNotDuplicate = ["phx_close", "phx_error", "phx_reply", "presence_state", "presence_diff"]; + const shouldDuplicate = event => { + return !event.startsWith("chan_reply_") && !doNotDuplicate.includes(event); + }; + for (let i = 0, l = oldChannel.bindings.length; i < l; i++) { + const item = oldChannel.bindings[i]; + if (shouldDuplicate(item.event)) { + newChannel.bindings.push(item); + } + } + newChannel.bindingRef = oldChannel.bindingRef; +} + // Takes the given channel, and creates a new channel with the same bindings // with the given socket, joins it, and leaves the old channel after joining. // @@ -264,10 +292,7 @@ export function getPresenceProfileForSession(presences, sessionId) { export function migrateChannelToSocket(oldChannel, socket, params) { const channel = socket.channel(oldChannel.topic, params || oldChannel.params); - for (let i = 0, l = oldChannel.bindings.length; i < l; i++) { - const item = oldChannel.bindings[i]; - channel.on(item.event, item.callback); - } + migrateBindings(oldChannel, channel); for (let i = 0, l = oldChannel.pushBuffer.length; i < l; i++) { const item = oldChannel.pushBuffer[i]; @@ -291,6 +316,24 @@ export function migrateChannelToSocket(oldChannel, socket, params) { }); } +export function migrateToChannel(oldChannel, newChannel) { + migrateBindings(oldChannel, newChannel); + + return new Promise((resolve, reject) => { + newChannel + .join() + .receive("ok", data => { + oldChannel.leave(); + oldChannel.bindings = []; + resolve(data); + }) + .receive("error", data => { + newChannel.leave(); + reject(data); + }); + }); +} + export function discordBridgesForPresences(presences) { const channels = []; for (const p of Object.values(presences)) { @@ -314,3 +357,66 @@ export function hasEmbedPresences(presences) { return false; } + +export function denoisePresence({ onJoin, onLeave, onChange }) { + return { + rawOnJoin: (key, beforeJoin, afterJoin) => { + if (beforeJoin === undefined) { + onJoin(key, afterJoin.metas[0]); + } + }, + rawOnLeave: (key, remaining, removed) => { + if (remaining.metas.length === 0) { + onLeave(key, removed.metas[0]); + } else { + onChange(key, removed.metas[removed.metas.length - 1], remaining.metas[remaining.metas.length - 1]); + } + } + }; +} + +export function presenceEventsForHub(events) { + const onJoin = (key, meta) => { + events.trigger(`hub:join`, { key, meta }); + }; + const onLeave = (key, meta) => { + events.trigger(`hub:leave`, { key, meta }); + }; + const onChange = (key, previous, current) => { + events.trigger(`hub:change`, { key, previous, current }); + }; + return { + onJoin, + onLeave, + onChange + }; +} + +export const tryGetMatchingMeta = async ({ ret_pool, ret_version }, shouldAbandonMigration) => { + const backoffMS = 5000; + const randomMS = 15000; + const maxAttempts = 10; + let didMatchMeta = false; + let attempt = 0; + while (!didMatchMeta && attempt < maxAttempts && !shouldAbandonMigration()) { + try { + // Add randomness to the first request avoid flooding reticulum. + const delayMS = attempt * backoffMS + (attempt === 0 ? Math.random() * randomMS : 0); + console.log( + `[reconnect] Getting reticulum meta in ${Math.ceil(delayMS / 1000)} seconds.${ + attempt ? ` (Attempt ${attempt + 1} of ${maxAttempts})` : "" + }` + ); + await sleep(delayMS); + invalidateReticulumMeta(); + console.log(`[reconnect] Getting reticulum meta.${attempt ? ` (Attempt ${attempt + 1} of ${maxAttempts})` : ""}`); + const { pool, version } = await getReticulumMeta(); + didMatchMeta = ret_pool === pool && ret_version === version; + } catch { + didMatchMeta = false; + } + + attempt = attempt + 1; + } + return didMatchMeta; +}; diff --git a/src/utils/physics-utils.js b/src/utils/physics-utils.js index 86ddf0c44f..65493be4a4 100644 --- a/src/utils/physics-utils.js +++ b/src/utils/physics-utils.js @@ -22,6 +22,9 @@ function exceedsDensityThreshold(count, subtree) { } function isHighDensity(subtree) { + if (subtree.continueGeneration) { + subtree.continueGeneration(); + } if (subtree.count) { const result = exceedsDensityThreshold(subtree.count, subtree); return result === true ? true : subtree.count; diff --git a/src/utils/pinning-helper.js b/src/utils/pinning-helper.js new file mode 100644 index 0000000000..a3e8d9dc7e --- /dev/null +++ b/src/utils/pinning-helper.js @@ -0,0 +1,96 @@ +import pinnedEntityToGltf from "./pinned-entity-to-gltf"; +import { getPromotionTokenForFile } from "./media-utils"; +import { SignInMessages } from "../react-components/auth/SignInModal"; + +export default class PinningHelper { + constructor(hubChannel, authChannel, store, performConditionalSignIn) { + this.hubChannel = hubChannel; + this.authChannel = authChannel; + this.store = store; + this.performConditionalSignIn = performConditionalSignIn; + } + + async setPinned(el, pin) { + if (NAF.utils.isMine(el)) { + this._signInAndPinOrUnpinElement(el, pin); + } else { + console.warn("PinningHelper: Attempted to set pin state on object that was not mine."); + } + } + + _signInAndPinOrUnpinElement = (el, pin) => { + const action = pin ? () => this._pinElement(el) : () => this.unpinElement(el); + + this.performConditionalSignIn( + () => this.hubChannel.signedIn, + action, + pin ? SignInMessages.pin : SignInMessages.unpin, + e => { + console.warn(`PinningHelper: Conditional sign-in failed. ${e}`); + } + ); + }; + + async _pinElement(el) { + const { networkId } = el.components.networked.data; + + const { fileId, src } = el.components["media-loader"].data; + let fileAccessToken, promotionToken; + if (fileId) { + fileAccessToken = new URL(src).searchParams.get("token"); + const storedPromotionToken = getPromotionTokenForFile(fileId); + if (storedPromotionToken) { + promotionToken = storedPromotionToken.promotionToken; + } + } + + const gltfNode = pinnedEntityToGltf(el); + if (!gltfNode) { + console.warn("PinningHelper: Entity did not produce a GLTF node."); + return; + } + el.setAttribute("networked", { persistent: true }); + el.setAttribute("media-loader", { fileIsOwned: true }); + + try { + await this.hubChannel.pin(networkId, gltfNode, fileId, fileAccessToken, promotionToken); + + // If we lost ownership of the entity while waiting for the pin to go through, + // try to regain ownership before setting the "pinned" state. + if (!NAF.utils.isMine(el) && !NAF.utils.takeOwnership(el)) { + console.warn("PinningHelper: Pinning succeeded, but ownership was lost in the mean time"); + } + + el.setAttribute("pinnable", "pinned", true); + el.emit("pinned", { el }); + this.store.update({ activity: { hasPinned: true } }); + } catch (e) { + if (e.reason === "invalid_token") { + await this.authChannel.signOut(this.hubChannel); + this._signInAndPinOrUnpinElement(el); + } else { + console.warn("PinningHelper: Pin failed for unknown reason", e); + } + } + } + + unpinElement(el) { + const components = el.components; + const networked = components.networked; + + if (!networked || !networked.data || !NAF.utils.isMine(el)) { + console.warn("PinningHelper: Tried to unpin element that is not networked or not mine."); + return; + } + + const networkId = components.networked.data.networkId; + el.setAttribute("networked", { persistent: false }); + + const mediaLoader = components["media-loader"]; + const fileId = mediaLoader.data && mediaLoader.data.fileId; + + this.hubChannel.unpin(networkId, fileId); + el.setAttribute("pinnable", "pinned", false); + el.emit("unpinned", { el }); + } +} diff --git a/src/utils/scale-to-aspect-ratio.js b/src/utils/scale-to-aspect-ratio.js new file mode 100644 index 0000000000..98516df616 --- /dev/null +++ b/src/utils/scale-to-aspect-ratio.js @@ -0,0 +1,6 @@ +export function scaleToAspectRatio(el, ratio) { + const width = Math.min(1.0, 1.0 / ratio); + const height = Math.min(1.0, ratio); + el.object3DMap.mesh.scale.set(width, height, 1); + el.object3DMap.mesh.matrixNeedsUpdate = true; +} diff --git a/src/utils/texture-cache.js b/src/utils/texture-cache.js new file mode 100644 index 0000000000..339c004fab --- /dev/null +++ b/src/utils/texture-cache.js @@ -0,0 +1,51 @@ +import { disposeTexture } from "./material-utils"; + +export class TextureCache { + cache = new Map(); + + key(src, version) { + return `${src}_${version}`; + } + + set(src, version, texture) { + const image = texture.image; + this.cache.set(this.key(src, version), { + texture, + ratio: (image.videoHeight || image.height) / (image.videoWidth || image.width), + count: 0 + }); + return this.retain(src, version); + } + + has(src, version) { + return this.cache.has(this.key(src, version)); + } + + get(src, version) { + return this.cache.get(this.key(src, version)); + } + + retain(src, version) { + const cacheItem = this.cache.get(this.key(src, version)); + cacheItem.count++; + // console.log("retain", src, cacheItem.count); + return cacheItem; + } + + release(src, version) { + const cacheItem = this.cache.get(this.key(src, version)); + + if (!cacheItem) { + console.error(`Releasing uncached texture src ${src}`); + return; + } + + cacheItem.count--; + // console.log("release", src, cacheItem.count); + if (cacheItem.count <= 0) { + // Unload the video element to prevent it from continuing to play in the background + disposeTexture(cacheItem.texture); + this.cache.delete(this.key(src, version)); + } + } +} diff --git a/src/utils/three-utils.js b/src/utils/three-utils.js index b27fcde942..f8719c05bf 100644 --- a/src/utils/three-utils.js +++ b/src/utils/three-utils.js @@ -54,12 +54,15 @@ export function disposeNode(node) { const IDENTITY = new THREE.Matrix4().identity(); export function setMatrixWorld(object3D, m) { if (!object3D.matrixIsModified) { - object3D.applyMatrix(IDENTITY); // hack around our matrix optimizations + object3D.applyMatrix4(IDENTITY); // hack around our matrix optimizations } object3D.matrixWorld.copy(m); if (object3D.parent) { object3D.parent.updateMatrices(); - object3D.matrix = object3D.matrix.getInverse(object3D.parent.matrixWorld).multiply(object3D.matrixWorld); + object3D.matrix = object3D.matrix + .copy(object3D.parent.matrixWorld) + .invert() + .multiply(object3D.matrixWorld); } else { object3D.matrix.copy(object3D.matrixWorld); } @@ -220,7 +223,7 @@ export const interpolateAffine = (function() { return function(startMat4, endMat4, progress, outMat4) { start.quaternion.setFromRotationMatrix(mat4.extractRotation(startMat4)); end.quaternion.setFromRotationMatrix(mat4.extractRotation(endMat4)); - THREE.Quaternion.slerp(start.quaternion, end.quaternion, interpolated.quaternion, progress); + interpolated.quaternion.slerpQuaternions(start.quaternion, end.quaternion, progress); interpolated.position.lerpVectors( start.position.setFromMatrixColumn(startMat4, 3), end.position.setFromMatrixColumn(endMat4, 3), @@ -287,7 +290,10 @@ export const calculateCameraTransformForWaypoint = (function() { const detachFromWorldUp = new THREE.Matrix4(); return function calculateCameraTransformForWaypoint(cameraTransform, waypointTransform, outMat4) { affixToWorldUp(cameraTransform, upAffixedCameraTransform); - detachFromWorldUp.getInverse(upAffixedCameraTransform).multiply(cameraTransform); + detachFromWorldUp + .copy(upAffixedCameraTransform) + .invert() + .multiply(cameraTransform); affixToWorldUp(waypointTransform, upAffixedWaypointTransform); outMat4.copy(upAffixedWaypointTransform).multiply(detachFromWorldUp); }; @@ -330,10 +336,10 @@ export const childMatch = (function() { // transform the parent such that its child matches the target return function childMatch(parent, child, target) { parent.updateMatrices(); - inverseParentWorld.getInverse(parent.matrixWorld); + inverseParentWorld.copy(parent.matrixWorld).invert(); child.updateMatrices(); childRelativeToParent.multiplyMatrices(inverseParentWorld, child.matrixWorld); - childInverse.getInverse(childRelativeToParent); + childInverse.copy(childRelativeToParent).invert(); newParentMatrix.multiplyMatrices(target, childInverse); setMatrixWorld(parent, newParentMatrix); }; @@ -357,3 +363,17 @@ export function traverseAnimationTargets(rootObject, animations, callback) { } } } + +export function createPlaneBufferGeometry(width, height, widthSegments, heightSegments, flipY = true) { + const geometry = new THREE.PlaneBufferGeometry(width, height, widthSegments, heightSegments); + // Three.js seems to assume texture flipY is true for all its built in geometry + // but we turn this off on our texture loader since createImageBitmap in Firefox + // does not support flipping. Then we flip the uv for flipY = false texture. + if (flipY === false) { + const uv = geometry.getAttribute("uv"); + for (let i = 0; i < uv.count; i++) { + uv.setY(i, 1.0 - uv.getY(i)); + } + } + return geometry; +} diff --git a/src/utils/threejs-allocation-patches.js b/src/utils/threejs-allocation-patches.js deleted file mode 100644 index 995843948c..0000000000 --- a/src/utils/threejs-allocation-patches.js +++ /dev/null @@ -1,33 +0,0 @@ -export default function patchThreeAllocations() { - const renderer = AFRAME.scenes[0].renderer; - const gl = renderer.getContext(); - - // These functions in three.js uses the arguments object, which allocates. - renderer.state.texImage2D = function(a, b, c, d, e, f, g, h, i) { - try { - if (g === undefined) { - gl.texImage2D(a, b, c, d, e, f); - } else { - gl.texImage2D(a, b, c, d, e, f, g, h, i); - } - } catch (error) { - console.error("THREE.WebGLState:", error); - } - }; - - renderer.state.compressedTexImage2D = function(a, b, c, d, e, f, g, h, i, j) { - try { - if (h === undefined) { - gl.compressedTexImage2D(a, b, c, d, e, f, g); - } else if (i === undefined) { - gl.compressedTexImage2D(a, b, c, d, e, f, g, h); - } else if (j === undefined) { - gl.compressedTexImage2D(a, b, c, d, e, f, g, h, i); - } else { - gl.compressedTexImage2D(a, b, c, d, e, f, g, h, i, j); - } - } catch (error) { - console.error("THREE.WebGLState:", error); - } - }; -} diff --git a/src/utils/threejs-positional-audio-updatematrixworld.js b/src/utils/threejs-positional-audio-updatematrixworld.js deleted file mode 100644 index 14f9362b34..0000000000 --- a/src/utils/threejs-positional-audio-updatematrixworld.js +++ /dev/null @@ -1,60 +0,0 @@ -// Monkeypatch to address performance issue with updating panner nodes -// TODO this needs to be merged into 3.js - -THREE.PositionalAudio.prototype.updateMatrixWorld = (function() { - const position = new THREE.Vector3(); - const quaternion = new THREE.Quaternion(); - - const scale = new THREE.Vector3(); - const orientation = new THREE.Vector3(); - - return function updateMatrixWorld(force) { - THREE.Object3D.prototype.updateMatrixWorld.call(this, force); - - let setInitial = false; - - if (!this._lastPosition) { - setInitial = true; - this._lastPosition = new THREE.Vector3(); - this._lastOrientation = new THREE.Vector3(); - this._lastListenerPosition = new THREE.Vector3(); - } - - const panner = this.panner; - const listener = panner.context.listener; - this.matrixWorld.decompose(position, quaternion, scale); - orientation.set(0, 0, 1).applyQuaternion(quaternion); - - // Need to update the position on this node if either the listener moves or this node moves, - // because otherwise there are audio artifacts in Chrome. - if ( - setInitial || - Math.abs(position.x - this._lastPosition.x) > Number.EPSILON || - Math.abs(position.y - this._lastPosition.y) > Number.EPSILON || - Math.abs(position.z - this._lastPosition.z) > Number.EPSILON || - Math.abs(orientation.x - this._lastOrientation.x) > Number.EPSILON || - Math.abs(orientation.y - this._lastOrientation.y) > Number.EPSILON || - Math.abs(orientation.z - this._lastOrientation.z) > Number.EPSILON || - (listener.positionX && Math.abs(listener.positionX.value - this._lastListenerPosition.x) > Number.EPSILON) || - (listener.positionY && Math.abs(listener.positionY.value - this._lastListenerPosition.y) > Number.EPSILON) || - (listener.positionZ && Math.abs(listener.positionZ.value - this._lastListenerPosition.z) > Number.EPSILON) - ) { - panner.setPosition(position.x, position.y, position.z); - panner.setOrientation(orientation.x, orientation.y, orientation.z); - - this._lastPosition.x = position.x; - this._lastPosition.y = position.y; - this._lastPosition.z = position.z; - - this._lastOrientation.x = orientation.x; - this._lastOrientation.y = orientation.y; - this._lastOrientation.z = orientation.z; - - if (listener.positionX && listener.positionY && listener.positionZ) { - this._lastListenerPosition.x = listener.positionX.value; - this._lastListenerPosition.y = listener.positionY.value; - this._lastListenerPosition.z = listener.positionZ.value; - } - } - }; -})(); diff --git a/src/utils/threejs-world-update.js b/src/utils/threejs-world-update.js index 29b4a26af2..c440cf0a9f 100644 --- a/src/utils/threejs-world-update.js +++ b/src/utils/threejs-world-update.js @@ -1,9 +1,3 @@ -const zeroPos = new THREE.Vector3(0, 0, 0); -const zeroQuat = new THREE.Quaternion(); -const oneScale = new THREE.Vector3(1, 1, 1); -const identity = new THREE.Matrix4(); -identity.identity(); - /** With this patch you must make sure to follow these rules or very strange things will happen. - If you modify an object's position, rotation, quaternion, or scale you MUST set matrixNeedsUpdate. @@ -28,232 +22,5 @@ With this patch you must make sure to follow these rules or very strange things Be on the lookout for compatibility issues with third party libraries. */ -// Patch animation system -const bindingSetters = THREE.PropertyBinding.prototype.SetterByBindingTypeAndVersioning; -const Versioning = THREE.PropertyBinding.prototype.Versioning; - -// For all binding types, monkey patch the setters that require world matrix -// updates to also flip matrixNeedsUpdate -for (let i = 0; i < bindingSetters.length; i++) { - const setter = bindingSetters[i][Versioning.MatrixWorldNeedsUpdate]; - if (!setter) continue; - - bindingSetters[i][Versioning.MatrixWorldNeedsUpdate] = function() { - const v = setter.apply(this, arguments); - this.targetObject.matrixNeedsUpdate = true; - return v; - }; -} - -THREE.Object3D.prototype.getWorldPosition = function(target) { - if (target === undefined) { - console.warn("THREE.Object3D: .getWorldPosition() target is now required"); - target = new THREE.Vector3(); - } - - // New function, defined below (used instead of updateMatrixWorld) - this.updateMatrices(); - - return target.setFromMatrixPosition(this.matrixWorld); -}; - -THREE.Object3D.prototype.getWorldQuaternion = (function() { - const position = new THREE.Vector3(); - const scale = new THREE.Vector3(); - - return function getWorldQuaternion(target) { - if (target === undefined) { - console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"); - target = new THREE.Quaternion(); - } - - // New function, defined below (used instead of updateMatrixWorld) - this.updateMatrices(); - this.matrixWorld.decompose(position, target, scale); - - return target; - }; -})(); - -THREE.Object3D.getWorldScale = (function() { - const position = new THREE.Vector3(); - const quaternion = new THREE.Quaternion(); - - return function getWorldScale(target) { - if (target === undefined) { - console.warn("THREE.Object3D: .getWorldScale() target is now required"); - target = new THREE.Vector3(); - } - - // New function, defined below (used instead of updateMatrixWorld) - this.updateMatrices(); - this.matrixWorld.decompose(position, quaternion, target); - - return target; - }; -})(); - -const handleMatrixModification = o => { - if (!o.matrixIsModified) { - o.matrixIsModified = true; - - if (o.cachedMatrixWorld) { - o.cachedMatrixWorld.copy(o.matrixWorld); - o.matrixWorld = o.cachedMatrixWorld; - } - } -}; - -const updateMatrix = THREE.Object3D.prototype.updateMatrix; -THREE.Object3D.prototype.updateMatrix = function() { - updateMatrix.apply(this, arguments); - handleMatrixModification(this); -}; - -const applyMatrix = THREE.Object3D.prototype.applyMatrix; -THREE.Object3D.prototype.applyMatrix = function() { - applyMatrix.apply(this, arguments); - handleMatrixModification(this); -}; - -// Updates this function to use updateMatrices(). In general our code should prefer calling updateMatrices() directly, -// patching this for compatibility upstream, namely with Box3.expandToObject and Object3D.attach -THREE.Object3D.prototype.updateWorldMatrix = function(updateParents, updateChildren) { - this.updateMatrices(false, false, !updateParents); - if (updateChildren) { - const children = this.children; - for (let i = 0, l = children.length; i < l; i++) { - children[i].updateMatrixWorld(false, false); - } - if (this.childrenNeedMatrixWorldUpdate) this.childrenNeedMatrixWorldUpdate = false; - } -}; - -// By the end of this function this.matrix reflects the updated local matrix -// and this.matrixWorld reflects the updated world matrix, taking into account -// parent matrices. -// -// forceLocalUpdate - Forces the local matrix to be updated regardless of if it has not -// been marked dirty. -// -// forceWorldUpdate - Forces the world matrix to be updated regardless of if the local matrix -// has been updated since the last update. -// -// skipParents - unless true, all parent matricies are updated before updating this object's -// local and world matrix. -// -THREE.Object3D.prototype.updateMatrices = function(forceLocalUpdate, forceWorldUpdate, skipParents) { - if (!this.hasHadFirstMatrixUpdate) { - if ( - !this.position.equals(zeroPos) || - !this.quaternion.equals(zeroQuat) || - !this.scale.equals(oneScale) || - !this.matrix.equals(identity) - ) { - // Only update the matrix the first time if its non-identity, this way - // this.matrixIsModified will remain false until the default - // identity matrix is updated. - this.updateMatrix(); - } - - this.hasHadFirstMatrixUpdate = true; - this.matrixWorldNeedsUpdate = true; - this.cachedMatrixWorld = this.matrixWorld; - } else if (this.matrixNeedsUpdate || this.matrixAutoUpdate || forceLocalUpdate) { - // updateMatrix() sets matrixWorldNeedsUpdate = true - this.updateMatrix(); - if (this.matrixNeedsUpdate) this.matrixNeedsUpdate = false; - } - - if (!skipParents && this.parent) { - this.parent.updateMatrices(false, forceWorldUpdate, false); - this.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate || this.parent.childrenNeedMatrixWorldUpdate; - } - - if (this.matrixWorldNeedsUpdate || forceWorldUpdate) { - if (this.parent === null) { - this.matrixWorld.copy(this.matrix); - } else { - // If the matrix is unmodified, it is the identity matrix, - // and hence we can use the parent's world matrix directly. - // - // Note this assumes all callers will either not pass skipParents=true - // *or* will update the parent themselves beforehand as is done in - // updateMatrixWorld. - if (!this.matrixIsModified) { - this.matrixWorld = this.parent.matrixWorld; - } else { - // Once matrixIsModified === true, this.matrixWorld has been updated to be a local - // copy, not a reference to this.parent.matrixWorld (see updateMatrix/applyMatrix) - this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); - } - } - - this.childrenNeedMatrixWorldUpdate = true; - this.matrixWorldNeedsUpdate = false; - } -}; - -// Computes this object's matrices and then the recursively computes the matrices of all the children. -// -// forceWorldUpdate - If true and the object is visible, will force the world matrix to be updated for -// this node and all of its children. -// -// includeInvisible - If true, does not ignore non-visible objects. -THREE.Object3D.prototype.updateMatrixWorld = function(forceWorldUpdate, includeInvisible) { - if (!this.visible && !includeInvisible) return; - - // Do not recurse upwards, since this is recursing downwards - this.updateMatrices(false, forceWorldUpdate, true); - - const children = this.children; - const forceChildrenWorldUpdate = this.childrenNeedMatrixWorldUpdate || forceWorldUpdate; - - for (let i = 0, l = children.length; i < l; i++) { - children[i].updateMatrixWorld(forceChildrenWorldUpdate, includeInvisible); - } - - if (this.childrenNeedMatrixWorldUpdate) this.childrenNeedMatrixWorldUpdate = false; -}; - -// Updates this function to use updateMatrices() to avoid extra matrix computations -THREE.Object3D.prototype.lookAt = (function() { - // This method does not support objects having non-uniformly-scaled parent(s) - - const q1 = new THREE.Quaternion(); - const m1 = new THREE.Matrix4(); - const target = new THREE.Vector3(); - const position = new THREE.Vector3(); - - return function lookAt(x, y, z) { - if (x.isVector3) { - target.copy(x); - } else { - target.set(x, y, z); - } - - const parent = this.parent; - - if (parent) { - parent.updateMatrices(); - } - this.updateMatrices(); // hubs change - - position.setFromMatrixPosition(this.matrixWorld); - - if (this.isCamera || this.isLight) { - m1.lookAt(position, target, this.up); - } else { - m1.lookAt(target, position, this.up); - } - - this.quaternion.setFromRotationMatrix(m1); - - if (parent) { - m1.extractRotation(parent.matrixWorld); - q1.setFromRotationMatrix(m1); - this.quaternion.premultiply(q1.inverse()); - } - this.matrixNeedsUpdate = true; - }; -})(); +// The changes that require this contract now live in our ThreeJS branch. +// Retaining this file since it is referenced in many Discord messages and documentation. diff --git a/src/utils/vr-caps-detect.js b/src/utils/vr-caps-detect.js index fca64d3d00..2dd5dd353c 100644 --- a/src/utils/vr-caps-detect.js +++ b/src/utils/vr-caps-detect.js @@ -1,3 +1,5 @@ +import { isIOS } from "./is-mobile"; + const { detect } = require("detect-browser"); const browser = detect(); @@ -53,7 +55,7 @@ export async function getAvailableVREntryTypes() { const isWebXRCapableBrowser = window.hasNativeWebXRImplementation; const isDaydreamCapableBrowser = !!(isWebVRCapableBrowser && browser.name === "chrome" && !isSamsungBrowser); - const isIDevice = AFRAME.utils.device.isIOS(); + const isIDevice = isIOS(); const isFirefoxBrowser = browser.name === "firefox"; const isUIWebView = typeof navigator.mediaDevices === "undefined"; diff --git a/src/utils/webgl.js b/src/utils/webgl.js index b29423db77..9a236283ca 100644 --- a/src/utils/webgl.js +++ b/src/utils/webgl.js @@ -34,3 +34,8 @@ export function patchWebGLRenderingContext() { }; } } + +export function getWebGLVersion(renderer) { + const gl = renderer.getContext(); + return gl.getParameter(gl.VERSION).split(" ")[1]; +} diff --git a/src/vendor/Water.js b/src/vendor/Water.js index 226d27edf7..b173118b6a 100644 --- a/src/vendor/Water.js +++ b/src/vendor/Water.js @@ -14,30 +14,19 @@ THREE.Water = function(geometry, options) { options = options || {}; - const textureWidth = - options.textureWidth !== undefined ? options.textureWidth : 512; - const textureHeight = - options.textureHeight !== undefined ? options.textureHeight : 512; + const textureWidth = options.textureWidth !== undefined ? options.textureWidth : 512; + const textureHeight = options.textureHeight !== undefined ? options.textureHeight : 512; const clipBias = options.clipBias !== undefined ? options.clipBias : 0.0; const alpha = options.alpha !== undefined ? options.alpha : 1.0; const time = options.time !== undefined ? options.time : 0.0; - const normalSampler = - options.waterNormals !== undefined ? options.waterNormals : null; + const normalSampler = options.waterNormals !== undefined ? options.waterNormals : null; const sunDirection = - options.sunDirection !== undefined - ? options.sunDirection - : new THREE.Vector3(0.70707, 0.70707, 0.0); - const sunColor = new THREE.Color( - options.sunColor !== undefined ? options.sunColor : 0xffffff - ); - const waterColor = new THREE.Color( - options.waterColor !== undefined ? options.waterColor : 0x7f7f7f - ); - const eye = - options.eye !== undefined ? options.eye : new THREE.Vector3(0, 0, 0); - const distortionScale = - options.distortionScale !== undefined ? options.distortionScale : 20.0; + options.sunDirection !== undefined ? options.sunDirection : new THREE.Vector3(0.70707, 0.70707, 0.0); + const sunColor = new THREE.Color(options.sunColor !== undefined ? options.sunColor : 0xffffff); + const waterColor = new THREE.Color(options.waterColor !== undefined ? options.waterColor : 0x7f7f7f); + const eye = options.eye !== undefined ? options.eye : new THREE.Vector3(0, 0, 0); + const distortionScale = options.distortionScale !== undefined ? options.distortionScale : 20.0; const side = options.side !== undefined ? options.side : THREE.FrontSide; const fog = options.fog !== undefined ? options.fog : false; @@ -66,16 +55,9 @@ THREE.Water = function(geometry, options) { stencilBuffer: false }; - const renderTarget = new THREE.WebGLRenderTarget( - textureWidth, - textureHeight, - parameters - ); + const renderTarget = new THREE.WebGLRenderTarget(textureWidth, textureHeight, parameters); - if ( - !THREE.Math.isPowerOfTwo(textureWidth) || - !THREE.Math.isPowerOfTwo(textureHeight) - ) { + if (!THREE.Math.isPowerOfTwo(textureWidth) || !THREE.Math.isPowerOfTwo(textureHeight)) { renderTarget.texture.generateMipmaps = false; } @@ -260,24 +242,7 @@ THREE.Water = function(geometry, options) { mirrorCamera.projectionMatrix.copy(camera.projectionMatrix); // Update the texture matrix - textureMatrix.set( - 0.5, - 0.0, - 0.0, - 0.5, - 0.0, - 0.5, - 0.0, - 0.5, - 0.0, - 0.0, - 0.5, - 0.5, - 0.0, - 0.0, - 0.0, - 1.0 - ); + textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0); textureMatrix.multiply(mirrorCamera.projectionMatrix); textureMatrix.multiply(mirrorCamera.matrixWorldInverse); @@ -286,21 +251,12 @@ THREE.Water = function(geometry, options) { mirrorPlane.setFromNormalAndCoplanarPoint(normal, mirrorWorldPosition); mirrorPlane.applyMatrix4(mirrorCamera.matrixWorldInverse); - clipPlane.set( - mirrorPlane.normal.x, - mirrorPlane.normal.y, - mirrorPlane.normal.z, - mirrorPlane.constant - ); + clipPlane.set(mirrorPlane.normal.x, mirrorPlane.normal.y, mirrorPlane.normal.z, mirrorPlane.constant); const projectionMatrix = mirrorCamera.projectionMatrix; - q.x = - (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / - projectionMatrix.elements[0]; - q.y = - (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / - projectionMatrix.elements[5]; + q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]; + q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]; q.z = -1.0; q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]; @@ -319,19 +275,21 @@ THREE.Water = function(geometry, options) { const currentRenderTarget = renderer.getRenderTarget(); - const currentVrEnabled = renderer.vr.enabled; + const currentXrEnabled = renderer.xr.enabled; const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate; scope.visible = false; - renderer.vr.enabled = false; // Avoid camera modification and recursion + renderer.xr.enabled = false; // Avoid camera modification and recursion renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows - renderer.render(scene, mirrorCamera, renderTarget, true); + renderer.setRenderTarget(renderTarget); + renderer.render(scene, mirrorCamera); + renderer.setRenderTarget(null); scope.visible = true; - renderer.vr.enabled = currentVrEnabled; + renderer.xr.enabled = currentXrEnabled; renderer.shadowMap.autoUpdate = currentShadowAutoUpdate; renderer.setRenderTarget(currentRenderTarget); diff --git a/src/webxr-bypass-hacks.js b/src/webxr-bypass-hacks.js deleted file mode 100644 index 19ac382c77..0000000000 --- a/src/webxr-bypass-hacks.js +++ /dev/null @@ -1,29 +0,0 @@ -import qsTruthy from "./utils/qs_truthy"; - -const isOculusBrowser = /oculusbrowser/i.test(navigator.userAgent); -const isMobileVR = /mobile vr/i.test(navigator.userAgent); -const isFirefox = /firefox/i.test(navigator.userAgent); -const hasWebVRapi = "getVRDisplays" in navigator; - -/* -HACK: Our fork of aframe will read this global in src/utils/device.js to force the WebVR codepaths. -For now we want to continue using WebVR in Firefox on desktop and Firefox Reality. -*/ -const isNonFirefoxWebXR = !isFirefox && "xr" in navigator && "requestSession" in navigator.xr; -window.forceWebVR = !qsTruthy("no_force_webvr") && (!isNonFirefoxWebXR || hasWebVRapi); - -/* -HACK Fix a-frame's device detection in Chrome when WebXR or WebVR flags are enabled in -chrome://flags. See https://github.com/mozilla/hubs/issues/892 -*/ -if (!isMobileVR && !isNonFirefoxWebXR && navigator.xr && !navigator.xr.requestDevice) { - navigator.xr.requestDevice = () => Promise.reject({ message: "Hubs: requestDevice not supported." }); -} - -/* -HACK Call getVRDisplays to force Oculus Browser to use WebVR, which in turn disables the WebXR API. -This should only take effect in older version of Oculus Browser that still have the getVRDisplays API. -*/ -if (isOculusBrowser && hasWebVRapi) { - navigator.getVRDisplays(); -} diff --git a/src/webxr-polyfill.js b/src/webxr-polyfill.js new file mode 100644 index 0000000000..cd4fd0980e --- /dev/null +++ b/src/webxr-polyfill.js @@ -0,0 +1,9 @@ +import WebXRPolyfill from "webxr-polyfill"; + +// WebXR Polyfill for platforms only supporting WebVR API. e.g. Desktop Firefox +// WebVR API is deprecated. We may drop such platforms support at some point. +if (!("xr" in navigator) && "getVRDisplays" in navigator) { + new WebXRPolyfill({ + cardboard: false + }); +} diff --git a/themes.json b/themes.json index 396388441c..08196742e6 100644 --- a/themes.json +++ b/themes.json @@ -5,41 +5,84 @@ "name": "Hubs Default", "variables": {} }, - { + { + "name": "Hubs Dark Mode", "id": "hubs-dark-mode", "darkModeDefault": true, - "name": "Hubs Dark Mode", "variables": { + "loading-screen-background": "radial-gradient(50% 50% at 50% 50%, #15171B 0%, #282C31 100%)", + "accept-color-pressed": "#21242C", + "primary-color-hover": "#12A4ED", + "primary-color": "#12A4ED", + "outline-color": "#ffffff", + "basic-color": "#3A4048", + "basic-color-hover": "#4B5562", + "basic-color-pressed": "#636F80", + "basic-border-color": "#13a4ed", + "secondary-color-pressed": "#282C31", + "accent1-color": "#2B313B", + "accent1-color-hover": "#5D646C", + "accent1-border-color": "#13a4ed", + "accent1-color-pressed": "#21242C", + "accent2-color": "#2B313B", + "accent2-color-hover": "#5D646C", + "accent2-color-pressed": "#21242C", + "accent2-border-color": "#13a4ed", + "accent3-color-pressed": "#21242C", + "accent3-color": "#2B313B", + "accent3-color-hover": "#5D646C", + "accent3-border-color": "#13a4ed", + "accent4-color": "#2B313B", + "accent4-border-color": "#13a4ed", + "accent4-color-hover": "#5D646C", + "accent4-color-pressed": "#00699E", + "accent5-color": "#2B313B", + "accent5-border-color": "#13a4ed", + "accent5-color-hover": "#5D646C", + "accent5-color-pressed": "#21242C", + "admin-color": "#13a4ed", "text1-color": "#ffffff", "text1-color-hover": "#E7E7E7", "text1-color-pressed": "#DBDBDB", - "text2-color": "#E7E7E7", - "text2-color-hover": "#F5F5F5", "text2-color-pressed": "#DBDBDB", - "text3-color": "#BBBBBB", "text3-color-hover": "#C7C7C7", "text3-color-pressed": "#ADADAD", - "text4-color": "#E7E7E7", - "basic-color": "#3A4048", - "basic-color-hover": "#4B5562", - "basic-color-pressed": "#636F80", - "basic-border-color": "#5D646C", + "text2-color-hover": "#F5F5F5", + "text2-color": "#E7E7E7", + "text3-color": "#BBBBBB", + "text4-color": "#BBBBBB", "secondary-color": "#3A4048", "secondary-color-hover": "#5D646C", - "secondary-color-pressed": "#282C31", - "background1-color": "#15171B", - "background2-color": "#282C31", - "background3-color": "#3A4048", - "background4-color": "#5D646C", - "loading-screen-background": "radial-gradient(50% 50% at 50% 50%, #15171B 0%, #282C31 100%)", "border1-color": "#3A4048", "border2-color": "#5D646C", "border3-color": "#5D646C", - "outline-color": "#ffffff", - "action-color": "#ff3464", - "action-color-highlight": "#ff74a4", + "active-color-hover": "#12A4ED", + "active-text-color": "#2B313B", + "background1-color": "#2B313B", + "background2-color": "#21242C", + "background3-color": "#3A4048", + "background4-color": "#5D646C", + "accept-color": "#2B313B", + "accept-color-hover": "#5D646C", + "accept-border-color": "#7ED320", "background-hover-color": "#aaaaaa", - "notice-background-color": "#2f80ed" + "input-bg-color": "#21242C", + "tip-text-color": "#ffffff", + "tip-bg-color": "#017ab8", + "tip-button-color-hover": "#008bd1", + "action-color": "#000000", + "action-color-highlight": "#149ce2", + "action-label-color": "#5634ff", + "notice-background-color": "#000000", + "toolbar-icon-selected-bg": "#ffffff", + "toolbar-basic-icon-color": "#ffffff", + "toolbar-basic-selected-icon-color": "#2B313B", + "toolbar-basic-color-hover": "#ffffff", + "toolbar-label-accent1": "#ffffff", + "toolbar-label-accent2": "#ffffff", + "toolbar-label-accent3": "#ffffff", + "toolbar-label-accent4": "#ffffff", + "toolbar-label-accent5": "#ffffff" } } ] diff --git a/webpack.config.js b/webpack.config.js index 3359042417..a31ff4e491 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -137,7 +137,7 @@ function createDefaultAppConfig() { if (fs.existsSync(themesPath)) { const themesString = fs.readFileSync(themesPath).toString(); const themes = JSON.parse(themesString); - appConfig.themes = themes; + appConfig.theme.themes = themes; } return appConfig; @@ -229,7 +229,8 @@ module.exports = async (env, argv) => { BASE_ASSETS_PATH: "https://hubs.local:8080/", RETICULUM_SERVER: "hubs.local:4000", POSTGREST_SERVER: "", - ITA_SERVER: "" + ITA_SERVER: "", + UPLOADS_HOST: "https://hubs.local:4000" }); } } @@ -269,7 +270,9 @@ module.exports = async (env, argv) => { cloud: path.join(__dirname, "src", "cloud.js"), signin: path.join(__dirname, "src", "signin.js"), verify: path.join(__dirname, "src", "verify.js"), - "whats-new": path.join(__dirname, "src", "whats-new.js") + tokens: path.join(__dirname, "src", "tokens.js"), + "whats-new": path.join(__dirname, "src", "whats-new.js"), + "webxr-polyfill": path.join(__dirname, "src", "webxr-polyfill.js") }, output: { filename: "assets/js/[name]-[chunkhash].js", @@ -293,6 +296,7 @@ module.exports = async (env, argv) => { { from: /^\/discord/, to: "/discord.html" }, { from: /^\/cloud/, to: "/cloud.html" }, { from: /^\/verify/, to: "/verify.html" }, + { from: /^\/tokens/, to: "/tokens.html" }, { from: /^\/whats-new/, to: "/whats-new.html" } ] }, @@ -434,7 +438,7 @@ module.exports = async (env, argv) => { ] }, { - test: /\.(png|jpg|gif|glb|ogg|mp3|mp4|wav|woff2|svg|webm)$/, + test: /\.(png|jpg|gif|glb|ogg|mp3|mp4|wav|woff2|svg|webm|3dl|cube)$/, use: { loader: "file-loader", options: { @@ -523,7 +527,7 @@ module.exports = async (env, argv) => { new HTMLWebpackPlugin({ filename: "hub.html", template: path.join(__dirname, "src", "hub.html"), - chunks: ["support", "hub"], + chunks: ["webxr-polyfill", "support", "hub"], chunksSortMode: "manual", inject: "head", minify: { @@ -601,6 +605,14 @@ module.exports = async (env, argv) => { removeComments: false } }), + new HTMLWebpackPlugin({ + filename: "tokens.html", + template: path.join(__dirname, "src", "tokens.html"), + chunks: ["tokens"], + minify: { + removeComments: false + } + }), new CopyWebpackPlugin([ { from: "src/hub.service.js", @@ -635,6 +647,7 @@ module.exports = async (env, argv) => { IMMERS_SERVER: process.env.IMMERS_SERVER, IMMERS_SCOPE: process.env.IMMERS_SCOPE, IMMERS_ALLOW_GUESTS: process.env.IMMERS_ALLOW_GUESTS, + UPLOADS_HOST: process.env.UPLOADS_HOST, APP_CONFIG: appConfig }) })