From e3219aefca0dd4b6423b018b3245d250abd8b8fe Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:33:29 -0500 Subject: [PATCH 001/119] Pass "renderOtherFirst" config item to LocationFields --- example-config.yml | 3 +++ lib/components/app/batch-routing-panel.tsx | 8 +++++++- lib/components/mobile/batch-search-screen.tsx | 18 ++++++++++++++++-- lib/components/mobile/welcome-screen.tsx | 14 ++++++++++++-- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/example-config.yml b/example-config.yml index d132b835e..232839897 100644 --- a/example-config.yml +++ b/example-config.yml @@ -179,6 +179,9 @@ map: # geocoder test account can be obtained from the Pelias maintainers at geocode.earth. geocoder: apiKey: PELIAS_API_KEY + # When set to true, geocoder results will be displayed with the "Other" section first, + # above transit stops and stations + renderOtherFirst: false boundary: rect: minLon: -123.2034 diff --git a/lib/components/app/batch-routing-panel.tsx b/lib/components/app/batch-routing-panel.tsx index c1321091e..5e2a02eef 100644 --- a/lib/components/app/batch-routing-panel.tsx +++ b/lib/components/app/batch-routing-panel.tsx @@ -16,6 +16,7 @@ interface Props { activeSearch: any intl: IntlShape mobile?: boolean + renderOtherFirst?: boolean showUserSettings: boolean } @@ -34,7 +35,8 @@ class BatchRoutingPanel extends Component { } render() { - const { activeSearch, intl, mobile, showUserSettings } = this.props + const { activeSearch, intl, mobile, renderOtherFirst, showUserSettings } = + this.props const { planTripClicked } = this.state const mapAction = mobile ? intl.formatMessage({ @@ -71,6 +73,7 @@ class BatchRoutingPanel extends Component { )} isRequired locationType="from" + renderOtherFirst={renderOtherFirst} selfValidate={planTripClicked} showClearButton={!mobile} /> @@ -81,6 +84,7 @@ class BatchRoutingPanel extends Component { )} isRequired locationType="to" + renderOtherFirst={renderOtherFirst} selfValidate={planTripClicked} showClearButton={!mobile} /> @@ -115,8 +119,10 @@ const mapStateToProps = (state: any) => { getShowUserSettings(state) && (state.user.loggedInUser?.hasConsentedToTerms || getPersistenceMode(state.otp.config.persistence).isLocalStorage) + const { renderOtherFirst } = state.otp.config.geocoder return { activeSearch: getActiveSearch(state), + renderOtherFirst, showUserSettings } } diff --git a/lib/components/mobile/batch-search-screen.tsx b/lib/components/mobile/batch-search-screen.tsx index 930112a88..99b632439 100644 --- a/lib/components/mobile/batch-search-screen.tsx +++ b/lib/components/mobile/batch-search-screen.tsx @@ -17,6 +17,7 @@ const { SET_FROM_LOCATION, SET_TO_LOCATION } = MobileScreens interface Props { intl: IntlShape map: React.ReactElement + renderOtherFirst: boolean setMobileScreen: (screen: number) => void } @@ -34,7 +35,7 @@ class BatchSearchScreen extends Component { } render() { - const { intl } = this.props + const { intl, renderOtherFirst } = this.props const { planTripClicked } = this.state return ( @@ -52,6 +53,7 @@ class BatchSearchScreen extends Component { isRequired locationType="from" onTextInputClick={this._fromFieldClicked} + renderOtherFirst={renderOtherFirst} selfValidate={planTripClicked} showClearButton={false} /> @@ -62,6 +64,7 @@ class BatchSearchScreen extends Component { isRequired locationType="to" onTextInputClick={this._toFieldClicked} + renderOtherFirst={renderOtherFirst} selfValidate={planTripClicked} showClearButton={false} /> @@ -85,4 +88,15 @@ const mapDispatchToProps = { setMobileScreen: uiActions.setMobileScreen } -export default connect(null, mapDispatchToProps)(injectIntl(BatchSearchScreen)) +const mapStateToProps = (state: any) => { + const { renderOtherFirst } = state.otp.config.geocoder + + return { + renderOtherFirst + } +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(injectIntl(BatchSearchScreen)) diff --git a/lib/components/mobile/welcome-screen.tsx b/lib/components/mobile/welcome-screen.tsx index 9a3492407..484eae79b 100644 --- a/lib/components/mobile/welcome-screen.tsx +++ b/lib/components/mobile/welcome-screen.tsx @@ -12,10 +12,11 @@ import MobileContainer from './container' import MobileNavigationBar from './navigation-bar' interface Props { + renderOtherFirst: boolean setMobileScreen: (screen: number) => void } -const MobileWelcomeScreen = ({ setMobileScreen }: Props) => { +const MobileWelcomeScreen = ({ renderOtherFirst, setMobileScreen }: Props) => { const intl = useIntl() const toFieldClicked = useCallback( @@ -38,6 +39,7 @@ const MobileWelcomeScreen = ({ setMobileScreen }: Props) => { })} locationType="to" onTextInputClick={toFieldClicked} + renderOtherFirst={renderOtherFirst} showClearButton={false} /> @@ -56,4 +58,12 @@ const mapDispatchToProps = { setMobileScreen: uiActions.setMobileScreen } -export default connect(null, mapDispatchToProps)(MobileWelcomeScreen) +const mapStateToProps = (state: any) => { + const { renderOtherFirst } = state.otp.config.geocoder + + return { + renderOtherFirst + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(MobileWelcomeScreen) From 197c1457a8c4493c7f64f310dd5e545aede9b92a Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Wed, 23 Oct 2024 14:16:14 -0500 Subject: [PATCH 002/119] feat(advanced-settings-panel): add mobility profile section --- i18n/en-US.yml | 4 ++ .../form/advanced-settings-panel.tsx | 37 ++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index be563db0e..0381b558c 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -337,6 +337,10 @@ components: header: Mobility Profile mobilityDevices: "Mobility devices: " mobilityLimitations: "Mobility limitations: " + planTripDescription: >- + If you have a travel companion, you can choose to plan this trip + according to their mobility profile. To add travel companions, visit + your account settings. visionLimitations: "Vision limitations: " intro: >- Please answer a few questions to customize the trip planning experience to diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index d39e03ec9..84f89d15f 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -23,6 +23,7 @@ import { AppReduxState } from '../../util/state-types' import { blue, getBaseColor } from '../util/colors' import { ComponentContext } from '../../util/contexts' import { generateModeSettingValues } from '../../util/api' +import Link from '../util/link' import { addCustomSettingLabels, @@ -68,10 +69,12 @@ const HeaderContainer = styled.div` height: 30px; ` -const Subheader = styled.h2` - ${invisibleCss} +const Subheader = styled.h2<{ invisible?: boolean }>` + ${(props) => + props.invisible !== false + ? invisibleCss + : 'display: block; font-size: 18px; font-weight: 700; height: auto; margin: 1em 0; position: static; width: auto;'} ` - const ReturnToTripPlanButton = styled.button` align-items: center; background-color: var(--main-base-color, ${blue[900]}); @@ -110,10 +113,15 @@ const DtSelectorContainer = styled.div` } ` +const MobilityProfileContainer = styled.div` + margin-bottom: 12px; +` + const AdvancedSettingsPanel = ({ closeAdvancedSettings, enabledModeButtons, innerRef, + mobilityProfile, modeButtonOptions, modeSettingDefinitions, modeSettingValues, @@ -124,6 +132,7 @@ const AdvancedSettingsPanel = ({ closeAdvancedSettings: () => void enabledModeButtons: string[] innerRef: RefObject + mobilityProfile: boolean modeButtonOptions: ModeButtonDefinition[] modeSettingDefinitions: ModeSetting[] modeSettingValues: ModeSettingValues @@ -220,9 +229,24 @@ const AdvancedSettingsPanel = ({ )} - - - + {mobilityProfile && ( + + + + + ( + + {linkText} + + ) + }} + /> + + )} + { })?.modeButtons?.filter((mb): mb is string => mb !== null) || modes?.initialState?.enabledModeButtons || [], + mobilityProfile: state.otp.config?.mobilityProfile || false, modeButtonOptions: modes?.modeButtons || [], modeSettingDefinitions: state.otp?.modeSettingDefinitions || [], modeSettingValues, From cd9d023d7af262b340559c4495ef3eacfbd68ddb Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:10:21 -0500 Subject: [PATCH 003/119] feat(advanced-settings-panel): add dropdown selector for mobility profiles --- .../form/advanced-settings-panel.tsx | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 84f89d15f..848ce47e8 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -1,6 +1,7 @@ import { addSettingsToButton, AdvancedModeSubsettingsContainer, + DropdownSelector, ModeSettingRenderer, populateSettingWithValue } from '@opentripplanner/trip-form' @@ -117,6 +118,14 @@ const MobilityProfileContainer = styled.div` margin-bottom: 12px; ` +const UnderlinedLink = styled(Link)` + text-decoration: underline; +` + +const MobilityProfileDropdown = styled(DropdownSelector)` + margin: 10px 0px; +` + const AdvancedSettingsPanel = ({ closeAdvancedSettings, enabledModeButtons, @@ -238,12 +247,19 @@ const AdvancedSettingsPanel = ({ id="components.MobilityProfile.MobilityPane.planTripDescription" values={{ manageLink: (linkText: string) => ( - - {linkText} - + + {linkText} + ) }} /> + )} From 14ea7a1a560b04a64f61903d944c6da43092a5d4 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:17:52 -0500 Subject: [PATCH 004/119] add more margin on dropdown selector --- lib/components/form/advanced-settings-panel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 848ce47e8..dc70139fd 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -123,7 +123,7 @@ const UnderlinedLink = styled(Link)` ` const MobilityProfileDropdown = styled(DropdownSelector)` - margin: 10px 0px; + margin: 20px 0px; ` const AdvancedSettingsPanel = ({ From 855b7e40b21eb5ad9de60c8067568124b7f653f0 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 31 Oct 2024 15:48:19 -0500 Subject: [PATCH 005/119] use right status. dont use userid --- lib/components/user/mobility-profile/companions-pane.tsx | 3 +-- lib/components/util/status-badge.tsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/components/user/mobility-profile/companions-pane.tsx b/lib/components/user/mobility-profile/companions-pane.tsx index e95c2323d..d189b36eb 100644 --- a/lib/components/user/mobility-profile/companions-pane.tsx +++ b/lib/components/user/mobility-profile/companions-pane.tsx @@ -132,8 +132,7 @@ const CompanionsPane = ({ ...companions, { email: newEmail, - status: 'PENDING', - userId: '' + status: 'PENDING' } ]) resetForm() diff --git a/lib/components/util/status-badge.tsx b/lib/components/util/status-badge.tsx index 6d7f13776..71de7930d 100644 --- a/lib/components/util/status-badge.tsx +++ b/lib/components/util/status-badge.tsx @@ -21,7 +21,7 @@ function getStatusLabel(status?: string) { ) - case 'verified': + case 'confirmed': return ( From af428f433d2351e1b38094c46d8b47a115fc6d52 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Fri, 1 Nov 2024 15:15:25 -0500 Subject: [PATCH 006/119] start hooking up mobility selector to routing query --- lib/actions/apiV2.js | 2 ++ lib/components/form/advanced-settings-panel.tsx | 4 ++++ lib/components/user/types.ts | 2 ++ 3 files changed, 8 insertions(+) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 46c857616..b421e16ed 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -1048,6 +1048,8 @@ export function routingQuery(searchId = null, updateSearchInReducer) { ...currentQuery, numItineraries: numItineraries || getDefaultNumItineraries(config) } + + // TODO: get mobility profile from state or somewhere else? if (config.mobilityProfile) { baseQuery.mobilityProfile = loggedInUser?.mobilityProfile?.mobilityMode } diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index dc70139fd..8a37c2322 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -255,10 +255,14 @@ const AdvancedSettingsPanel = ({ /> { + return null + }} options={[ { text: 'Myself', value: 'test' }, { text: 'someone else', value: 'test2' } ]} + value="test" /> )} diff --git a/lib/components/user/types.ts b/lib/components/user/types.ts index 404c4fb49..f85ffa487 100644 --- a/lib/components/user/types.ts +++ b/lib/components/user/types.ts @@ -30,7 +30,9 @@ export interface MobilityProfile { } export interface CompanionInfo { + acceptKey?: string email: string + nickname?: string status?: string } From 28e41e53d57e7b370a5fa37f10f86930534ec769 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 4 Nov 2024 14:17:19 -0600 Subject: [PATCH 007/119] feat(advanced-settings-panel): add onChange event handling for mobility profile selector --- .../form/advanced-settings-panel.tsx | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 8a37c2322..a2f640369 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -24,6 +24,7 @@ import { AppReduxState } from '../../util/state-types' import { blue, getBaseColor } from '../util/colors' import { ComponentContext } from '../../util/contexts' import { generateModeSettingValues } from '../../util/api' +import { User } from '../user/types' import Link from '../util/link' import { @@ -130,6 +131,7 @@ const AdvancedSettingsPanel = ({ closeAdvancedSettings, enabledModeButtons, innerRef, + loggedInUser, mobilityProfile, modeButtonOptions, modeSettingDefinitions, @@ -141,6 +143,7 @@ const AdvancedSettingsPanel = ({ closeAdvancedSettings: () => void enabledModeButtons: string[] innerRef: RefObject + loggedInUser: User | null mobilityProfile: boolean modeButtonOptions: ModeButtonDefinition[] modeSettingDefinitions: ModeSetting[] @@ -150,6 +153,11 @@ const AdvancedSettingsPanel = ({ setQueryParam: (evt: any) => void }): JSX.Element => { const [closingBySave, setClosingBySave] = useState(false) + // TODO: this is an email for now + const [selectedMobilityProfile, setSelectedMobilityProfile] = + useState(loggedInUser?.email || '') + const relatedUsers = loggedInUser?.relatedUsers || [] + const baseColor = getBaseColor() const accentColor = baseColor || blue[900] @@ -238,7 +246,7 @@ const AdvancedSettingsPanel = ({ )} - {mobilityProfile && ( + {loggedInUser && relatedUsers.length > 0 && ( @@ -255,14 +263,18 @@ const AdvancedSettingsPanel = ({ /> { - return null + name="mobilityProfile" + onChange={(e) => { + setSelectedMobilityProfile(e.mobilityProfile as string) }} options={[ - { text: 'Myself', value: 'test' }, - { text: 'someone else', value: 'test2' } + { text: 'Myself', value: loggedInUser.email }, + ...relatedUsers.map((user) => ({ + text: user.nickname || user.email, + value: user.email // TODO: this needs to be mobilityMode + })) ]} - value="test" + value={selectedMobilityProfile} /> )} @@ -309,6 +321,7 @@ const mapStateToProps = (state: AppReduxState) => { ) const saveAndReturnButton = state.otp.config?.advancedSettingsPanel?.saveAndReturnButton + console.log('state:::', state) return { currentQuery: state.otp.currentQuery, // TODO: Duplicated in apiv2.js @@ -318,6 +331,7 @@ const mapStateToProps = (state: AppReduxState) => { })?.modeButtons?.filter((mb): mb is string => mb !== null) || modes?.initialState?.enabledModeButtons || [], + loggedInUser: state.user.loggedInUser || null, mobilityProfile: state.otp.config?.mobilityProfile || false, modeButtonOptions: modes?.modeButtons || [], modeSettingDefinitions: state.otp?.modeSettingDefinitions || [], From 714d2e6438ec8d3310baf5dcbcb83a5955f5cfc2 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:20:04 -0600 Subject: [PATCH 008/119] feat(advanced-settings-panel): add en i18n string for mobility profile dropdown --- i18n/en-US.yml | 1 + lib/components/form/advanced-settings-panel.tsx | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index 0381b558c..c21dcd4f4 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -342,6 +342,7 @@ components: according to their mobility profile. To add travel companions, visit your account settings. visionLimitations: "Vision limitations: " + dropdownLabel: "User mobility profile:" intro: >- Please answer a few questions to customize the trip planning experience to your needs and preferences. diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index a2f640369..bcb362d2d 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -262,7 +262,9 @@ const AdvancedSettingsPanel = ({ }} /> { setSelectedMobilityProfile(e.mobilityProfile as string) From a58f469bf55a906f85efc5bd2167afe1c136638e Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:55:44 -0400 Subject: [PATCH 009/119] feat: Add confirmation and error landing pages. --- public/confirmation.html | 5 +++++ public/error.html | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 public/confirmation.html create mode 100644 public/error.html diff --git a/public/confirmation.html b/public/confirmation.html new file mode 100644 index 000000000..3d34e48ff --- /dev/null +++ b/public/confirmation.html @@ -0,0 +1,5 @@ + + +

Your request is confirmed.

+ + diff --git a/public/error.html b/public/error.html new file mode 100644 index 000000000..4707860d3 --- /dev/null +++ b/public/error.html @@ -0,0 +1,19 @@ + + +

An error occurred:

+

+ + +

+ + + From 0bd5a77553ab2dc5c446cb7f4e3aacafdedf050a Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:13:20 -0400 Subject: [PATCH 010/119] refactor(confirmation.html): Merge error and confirmation pages --- public/confirmation.html | 18 +++++++++++++++++- public/error.html | 19 ------------------- 2 files changed, 17 insertions(+), 20 deletions(-) delete mode 100644 public/error.html diff --git a/public/confirmation.html b/public/confirmation.html index 3d34e48ff..5d9508e3f 100644 --- a/public/confirmation.html +++ b/public/confirmation.html @@ -1,5 +1,21 @@ + + Request Result + -

Your request is confirmed.

+

+ Your request is confirmed. + +

+ diff --git a/public/error.html b/public/error.html deleted file mode 100644 index 4707860d3..000000000 --- a/public/error.html +++ /dev/null @@ -1,19 +0,0 @@ - - -

An error occurred:

-

- - -

- - - From 368d0faa596988241804495720018a25ff1adf15 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 4 Nov 2024 14:32:15 -0600 Subject: [PATCH 011/119] refactor(user/types): add status values --- lib/components/user/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/user/types.ts b/lib/components/user/types.ts index f85ffa487..17efeb1f2 100644 --- a/lib/components/user/types.ts +++ b/lib/components/user/types.ts @@ -33,7 +33,7 @@ export interface CompanionInfo { acceptKey?: string email: string nickname?: string - status?: string + status?: 'PENDING' | 'CONFIRMED' | 'INVALID' } /** From afaa8080f33dd68e668d0322dbd7221be800b131 Mon Sep 17 00:00:00 2001 From: Josh Willis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 4 Nov 2024 14:40:10 -0600 Subject: [PATCH 012/119] Fix code scanning alert no. 7: Client-side cross-site scripting Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- public/confirmation.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/confirmation.html b/public/confirmation.html index 5d9508e3f..70ad909bf 100644 --- a/public/confirmation.html +++ b/public/confirmation.html @@ -8,13 +8,15 @@

+ From 077b61fd6c9eabece4e53392a89f9184478f8ccc Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:26:16 -0500 Subject: [PATCH 013/119] feat(advanced-trip-form): Add autoplan --- lib/components/app/batch-routing-panel.tsx | 24 +++++++++++++++++-- .../form/advanced-settings-panel.tsx | 18 +++++++++++--- lib/components/form/batch-settings.tsx | 6 +---- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/lib/components/app/batch-routing-panel.tsx b/lib/components/app/batch-routing-panel.tsx index 5c6a69c73..6ca1f6da2 100644 --- a/lib/components/app/batch-routing-panel.tsx +++ b/lib/components/app/batch-routing-panel.tsx @@ -3,12 +3,14 @@ import { CSSTransition, TransitionGroup } from 'react-transition-group' import { FormattedMessage, injectIntl, IntlShape } from 'react-intl' import React, { Component, FormEvent } from 'react' +import * as apiActions from '../../actions/api' import { advancedPanelClassName, mainPanelClassName, transitionDuration, TransitionStyles } from '../form/styled' +import { alertUserTripPlan } from '../form/util' import { getActiveSearch, getShowUserSettings } from '../../util/state' import { getPersistenceMode } from '../../util/user' import AdvancedSettingsPanel from '../form/advanced-settings-panel' @@ -22,9 +24,11 @@ import ViewerContainer from '../viewers/viewer-container' interface Props { activeSearch: any + currentQuery: any intl: IntlShape mainPanelContent: number mobile?: boolean + routingQuery: () => void showUserSettings: boolean } @@ -75,7 +79,13 @@ class BatchRoutingPanel extends Component { handleSubmit = (e: FormEvent) => e.preventDefault() handlePlanTripClick = () => { - this.setState({ planTripClicked: true }) + const { currentQuery, intl, routingQuery } = this.props + alertUserTripPlan( + intl, + currentQuery, + () => this.setState({ planTripClicked: true }), + routingQuery + ) } render() { @@ -128,6 +138,7 @@ class BatchRoutingPanel extends Component { > { (state.user.loggedInUser?.hasConsentedToTerms || getPersistenceMode(state.otp.config.persistence).isLocalStorage) const { mainPanelContent } = state.otp.ui + const currentQuery = state.otp.currentQuery return { activeSearch: getActiveSearch(state), + currentQuery, mainPanelContent, showUserSettings } } -export default connect(mapStateToProps)(injectIntl(BatchRoutingPanel)) +const mapDispatchToProps = { + routingQuery: apiActions.routingQuery +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(injectIntl(BatchRoutingPanel)) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index bcb362d2d..b3c4f5fac 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -128,8 +128,10 @@ const MobilityProfileDropdown = styled(DropdownSelector)` ` const AdvancedSettingsPanel = ({ + autoPlan, closeAdvancedSettings, enabledModeButtons, + handlePlanTrip, innerRef, loggedInUser, mobilityProfile, @@ -140,8 +142,10 @@ const AdvancedSettingsPanel = ({ setCloseAdvancedSettingsWithDelay, setQueryParam }: { + autoPlan: boolean closeAdvancedSettings: () => void enabledModeButtons: string[] + handlePlanTrip: () => void innerRef: RefObject loggedInUser: User | null mobilityProfile: boolean @@ -203,6 +207,11 @@ const AdvancedSettingsPanel = ({ ) ) + const closePanel = useCallback(() => { + autoPlan && handlePlanTrip() + closeAdvancedSettings() + }, [autoPlan, closeAdvancedSettings, handlePlanTrip]) + const handleModeButtonToggle = setModeButton( enabledModeButtons, onSettingsUpdate(setQueryParam) @@ -215,8 +224,8 @@ const AdvancedSettingsPanel = ({ const onSaveAndReturnClick = useCallback(async () => { await setCloseAdvancedSettingsWithDelay() setClosingBySave(true) - closeAdvancedSettings() - }, [closeAdvancedSettings, setCloseAdvancedSettingsWithDelay]) + closePanel() + }, [closePanel, setCloseAdvancedSettingsWithDelay]) return ( @@ -225,7 +234,7 @@ const AdvancedSettingsPanel = ({ aria-label={closeButtonText} id="close-advanced-settings-button" onClick={() => { - closeAdvancedSettings() + closePanel() }} title={closeButtonText} > @@ -321,10 +330,13 @@ const mapStateToProps = (state: AppReduxState) => { state.otp.modeSettingDefinitions || [], modes?.initialState?.modeSettingValues || {} ) + + const { autoPlan } = state.otp.config const saveAndReturnButton = state.otp.config?.advancedSettingsPanel?.saveAndReturnButton console.log('state:::', state) return { + autoPlan: autoPlan !== false, currentQuery: state.otp.currentQuery, // TODO: Duplicated in apiv2.js enabledModeButtons: diff --git a/lib/components/form/batch-settings.tsx b/lib/components/form/batch-settings.tsx index 23bd13a6c..12f036491 100644 --- a/lib/components/form/batch-settings.tsx +++ b/lib/components/form/batch-settings.tsx @@ -80,10 +80,6 @@ function BatchSettings({ pipe(addModeButtonIcon(ModeIcon), setModeButtonEnabled(enabledModeButtons)) ) - const _planTrip = useCallback(() => { - alertUserTripPlan(intl, currentQuery, onPlanTripClick, routingQuery) - }, [currentQuery, intl, onPlanTripClick, routingQuery]) - const baseColor = getBaseColor() const accentColor = getDarkenedBaseColor() @@ -109,7 +105,7 @@ function BatchSettings({ /> Date: Wed, 16 Oct 2024 17:49:15 -0500 Subject: [PATCH 014/119] Prevent autoplan if there are validation errors --- .../form/advanced-settings-panel.tsx | 12 ++++++++--- lib/components/form/util.tsx | 20 +++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index b3c4f5fac..48fe9db1e 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -33,7 +33,8 @@ import { onSettingsUpdate, pipe, populateSettingWithIcon, - setModeButton + setModeButton, + tripPlannerValidationErrors } from './util' import { setModeButtonEnabled } from './batch-settings' import { styledCheckboxCss } from './styled' @@ -130,6 +131,7 @@ const MobilityProfileDropdown = styled(DropdownSelector)` const AdvancedSettingsPanel = ({ autoPlan, closeAdvancedSettings, + currentQuery, enabledModeButtons, handlePlanTrip, innerRef, @@ -144,6 +146,7 @@ const AdvancedSettingsPanel = ({ }: { autoPlan: boolean closeAdvancedSettings: () => void + currentQuery: any enabledModeButtons: string[] handlePlanTrip: () => void innerRef: RefObject @@ -207,10 +210,13 @@ const AdvancedSettingsPanel = ({ ) ) + const tripFormErrors = tripPlannerValidationErrors(currentQuery, intl) + const closePanel = useCallback(() => { - autoPlan && handlePlanTrip() + // Only autoplan if there are no validation errors + tripFormErrors.length === 0 && autoPlan && handlePlanTrip() closeAdvancedSettings() - }, [autoPlan, closeAdvancedSettings, handlePlanTrip]) + }, [autoPlan, closeAdvancedSettings, handlePlanTrip, tripFormErrors.length]) const handleModeButtonToggle = setModeButton( enabledModeButtons, diff --git a/lib/components/form/util.tsx b/lib/components/form/util.tsx index 85dd3107d..c973af17c 100644 --- a/lib/components/form/util.tsx +++ b/lib/components/form/util.tsx @@ -72,13 +72,10 @@ export const setModeButton = ) } -export const alertUserTripPlan = ( - intl: IntlShape, +export const tripPlannerValidationErrors = ( currentQuery: any, - onPlanTripClick: () => void, - routingQuery: () => any -): void => { - // Check for any validation issues in query. + intl: IntlShape +): string[] => { const issues: string[] = [] if (!hasValidLocation(currentQuery, 'from')) { issues.push(intl.formatMessage({ id: 'components.BatchSettings.origin' })) @@ -88,6 +85,17 @@ export const alertUserTripPlan = ( intl.formatMessage({ id: 'components.BatchSettings.destination' }) ) } + return issues +} + +export const alertUserTripPlan = ( + intl: IntlShape, + currentQuery: any, + onPlanTripClick: () => void, + routingQuery: () => any +): void => { + // Check for any validation issues in query and alert user. + const issues = tripPlannerValidationErrors(currentQuery, intl) onPlanTripClick() if (issues.length > 0) { // TODO: replace with less obtrusive validation. From cb18e6e9f0dee9bab7ea5a1562b81f72e789de00 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 16 Oct 2024 18:10:05 -0500 Subject: [PATCH 015/119] Pass plan trip through mobile --- lib/components/mobile/batch-search-screen.tsx | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/components/mobile/batch-search-screen.tsx b/lib/components/mobile/batch-search-screen.tsx index c24b4dacb..89b14a433 100644 --- a/lib/components/mobile/batch-search-screen.tsx +++ b/lib/components/mobile/batch-search-screen.tsx @@ -4,6 +4,7 @@ import { injectIntl, IntlShape } from 'react-intl' import React, { Component } from 'react' import styled from 'styled-components' +import * as apiActions from '../../actions/api' import * as uiActions from '../../actions/ui' import { advancedPanelClassName, @@ -11,6 +12,7 @@ import { transitionDuration, TransitionStyles } from '../form/styled' +import { alertUserTripPlan } from '../form/util' import { MobileScreens } from '../../actions/ui-constants' import AdvancedSettingsPanel from '../form/advanced-settings-panel' import BatchSettings from '../form/batch-settings' @@ -43,8 +45,10 @@ const MobileSearchSettings = styled.div<{ ` interface Props { + currentQuery: any intl: IntlShape map: React.ReactElement + routingQuery: any setMobileScreen: (screen: number) => void } @@ -63,7 +67,10 @@ class BatchSearchScreen extends Component { _advancedSettingRef = React.createRef() handlePlanTripClick = () => { - this.setState({ planTripClicked: true }) + const { currentQuery, intl, routingQuery } = this.props + alertUserTripPlan(intl, currentQuery, routingQuery, () => + this.setState({ planTripClicked: true }) + ) } openAdvancedSettings = () => { @@ -159,6 +166,7 @@ class BatchSearchScreen extends Component { > { // connect to the redux store +const mapStateToProps = (state: any) => { + const { currentQuery } = state.otp.currentQuery + return { + currentQuery + } +} + const mapDispatchToProps = { + routingQuery: apiActions.routingQuery, setMobileScreen: uiActions.setMobileScreen } -export default connect(null, mapDispatchToProps)(injectIntl(BatchSearchScreen)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(injectIntl(BatchSearchScreen)) From 201af4b04bafb357f5b4777d750f3880b52603c8 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 16 Oct 2024 18:18:03 -0500 Subject: [PATCH 016/119] remove unnecessary props --- lib/components/form/batch-settings.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/components/form/batch-settings.tsx b/lib/components/form/batch-settings.tsx index 12f036491..47700fdeb 100644 --- a/lib/components/form/batch-settings.tsx +++ b/lib/components/form/batch-settings.tsx @@ -5,9 +5,8 @@ import { ModeButtonDefinition } from '@opentripplanner/types' import { Search } from '@styled-icons/fa-solid/Search' import { SyncAlt } from '@styled-icons/fa-solid/SyncAlt' import { useIntl } from 'react-intl' -import React, { useCallback, useContext, useState } from 'react' +import React, { useContext, useState } from 'react' -import * as apiActions from '../../actions/api' import * as formActions from '../../actions/form' import { ComponentContext } from '../../util/contexts' import { getActiveSearch, hasValidLocation } from '../../util/state' @@ -16,7 +15,6 @@ import { StyledIconWrapper } from '../util/styledIcon' import { addModeButtonIcon, - alertUserTripPlan, modesQueryParamConfig, onSettingsUpdate, pipe, @@ -39,7 +37,6 @@ type Props = { modeButtonOptions: ModeButtonDefinition[] onPlanTripClick: () => void openAdvancedSettings: () => void - routingQuery: any setQueryParam: (evt: any) => void spacedOutModeSelector?: boolean } @@ -64,7 +61,6 @@ function BatchSettings({ modeButtonOptions, onPlanTripClick, openAdvancedSettings, - routingQuery, setQueryParam, spacedOutModeSelector }: Props) { @@ -147,7 +143,6 @@ const mapStateToProps = (state: any) => { } const mapDispatchToProps = { - routingQuery: apiActions.routingQuery, setQueryParam: formActions.setQueryParam } From 489a8d45001db337b06fcb1ddfacd8cb12a062da Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:41:19 -0500 Subject: [PATCH 017/119] Fix mapstatetoprops incorrect destructure --- lib/components/mobile/batch-search-screen.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/mobile/batch-search-screen.tsx b/lib/components/mobile/batch-search-screen.tsx index 89b14a433..5be2cc8c7 100644 --- a/lib/components/mobile/batch-search-screen.tsx +++ b/lib/components/mobile/batch-search-screen.tsx @@ -189,7 +189,7 @@ class BatchSearchScreen extends Component { // connect to the redux store const mapStateToProps = (state: any) => { - const { currentQuery } = state.otp.currentQuery + const currentQuery = state.otp.currentQuery return { currentQuery } From 5856a976e682c2d4c75871a7636f4b167a2da207 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:42:52 -0500 Subject: [PATCH 018/119] Fix percy tests and add openEditIfNeeded function --- percy/percy.test.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/percy/percy.test.js b/percy/percy.test.js index 37433032d..957f07e43 100644 --- a/percy/percy.test.js +++ b/percy/percy.test.js @@ -42,6 +42,12 @@ async function loadPath(otpPath) { return page } +const openEditIfNeeded = async (page, isMobile) => { + if (isMobile) { + await page.click('button.edit-search-button') + } +} + beforeAll(async () => { try { // Launch OTP-RR web server @@ -114,9 +120,7 @@ async function executeTest(page, isMobile, isCallTaker) { if (!isCallTaker) { // Edit trip params [mobile-specific] - if (isMobile) { - await page.click('button.edit-search-button') - } + await openEditIfNeeded(page, isMobile) // Change the modes: Activate Transit and remove Bike. await page.click('label[title="Transit"]') @@ -148,6 +152,8 @@ async function executeTest(page, isMobile, isCallTaker) { await page.waitForTimeout(500) // Delete both origin and destination + await openEditIfNeeded(page, isMobile) + await page.click('.from-form-control') await page.waitForTimeout(300) // Click the clear button next to it From 334004e87efc2925197c64e5ea6a85fcb2b58cb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 02:32:30 +0000 Subject: [PATCH 019/119] chore(deps): bump elliptic from 6.5.7 to 6.6.0 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 427e440c6..fae1e042f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7476,9 +7476,9 @@ electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.811: integrity sha512-bpLc4QU4B8PYmdO4MSu2ZBTMD8lAaEXRS43C09lB31BvYwuk9UxgBRXbY5OJBw7VuMGcg2MZG5FyTaP9u4PQnw== elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.7" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" - integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + version "6.6.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210" + integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA== dependencies: bn.js "^4.11.9" brorand "^1.1.0" From 30158cb17e230af90e42059cfc1a9e2217ef7ec8 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 18 Oct 2024 16:19:10 -0400 Subject: [PATCH 020/119] fallback to departure time when `useArrivalTime` is true --- lib/util/viewer.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/util/viewer.js b/lib/util/viewer.js index d407b356c..e5bcd85a2 100644 --- a/lib/util/viewer.js +++ b/lib/util/viewer.js @@ -21,13 +21,15 @@ export function getSecondsUntilDeparture( ) { let time if (useSchedule) { - time = useArrivalTime - ? stopTime.scheduledArrival - : stopTime.scheduledDeparture + time = + useArrivalTime && !!stopTime.scheduledArrival + ? stopTime.scheduledArrival + : stopTime.scheduledDeparture } else { - time = useArrivalTime - ? stopTime.realtimeArrival - : stopTime.realtimeDeparture + time = + useArrivalTime && !!stopTime.realtimeArrival + ? stopTime.realtimeArrival + : stopTime.realtimeDeparture } return time + stopTime.serviceDay - Date.now() / 1000 From 38c46413ec99ea5945b1ac5205f28b3d39a5e9d3 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 21 Aug 2024 11:20:34 -0400 Subject: [PATCH 021/119] only show routes from current service week --- example-config.yml | 2 ++ lib/actions/apiV2.js | 13 ++++++++++++- lib/util/config-types.ts | 2 ++ lib/util/current-service-week.ts | 10 ++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 lib/util/current-service-week.ts diff --git a/example-config.yml b/example-config.yml index d62b241ae..00c24ad77 100644 --- a/example-config.yml +++ b/example-config.yml @@ -677,6 +677,8 @@ disableSingleItineraryDays: false # maxRealtimeVehicleAge: 60 # # Interval for refreshing vehicle positions # vehiclePositionRefreshSeconds: 30 # defaults to 30 seconds. +# # Enable this to restrict listing to routes active within the last to next Sunday +# onlyShowCurrentServiceWeek: true # API key to make Mapillary API calls. These are used to show street imagery. # Mapillary calls these "Client Tokens". They can be created at https://www.mapillary.com/dashboard/developers diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index b421e16ed..b3d56f168 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -23,6 +23,7 @@ import { isValidSubsequence, queryIsValid } from '../util/state' +import { getCurrentServiceWeek } from '../util/current-service-week' import { getRouteColorBasedOnSettings, getRouteIdForPattern, @@ -857,10 +858,20 @@ export const findRoute = (params) => export function findRoutes() { return function (dispatch, getState) { + // Only calculate current service week if the setting for it is enabled + const currentServiceWeek = + getState().otp?.routeViewer?.onlyShowCurrentServiceWeek === true + ? getCurrentServiceWeek() + : null + dispatch( createGraphQLQueryAction( `{ - routes { + routes ${ + currentServiceWeek + ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` + : '' + }{ id: gtfsId agency { id: gtfsId diff --git a/lib/util/config-types.ts b/lib/util/config-types.ts index 481a62582..93f00ce26 100644 --- a/lib/util/config-types.ts +++ b/lib/util/config-types.ts @@ -360,6 +360,8 @@ export interface RouteViewerConfig { hideRouteShapesWithinFlexZones?: boolean /** Remove vehicles from the map if they haven't sent an update in a number of seconds */ maxRealtimeVehicleAge?: number + /** Use OTP date limiting to only show current service week in list */ + onlyShowCurrentServiceWeek?: boolean /** Disable vehicle highlight if necessary (e.g. custom or inverted icons) */ vehicleIconHighlight?: boolean /** Customize vehicle icon padding (the default iconPadding is 2px in otp-ui) */ diff --git a/lib/util/current-service-week.ts b/lib/util/current-service-week.ts new file mode 100644 index 000000000..a512c9d49 --- /dev/null +++ b/lib/util/current-service-week.ts @@ -0,0 +1,10 @@ +import { addDays, nextSunday, previousSunday } from 'date-fns' +/** Gets the current service week */ +export const getCurrentServiceWeek = (): { + end: string + start: string +} => { + const start = previousSunday(new Date()).toISOString().split('T')[0] + const end = addDays(nextSunday(new Date()), 1).toISOString().split('T')[0] + return { end, start } +} From 54d47fe5c33dc411bd543c905ffab5d322b7e61d Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 16 Sep 2024 11:48:30 -0400 Subject: [PATCH 022/119] chore(deps): update otp-ui --- yarn.lock | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/yarn.lock b/yarn.lock index fae1e042f..71a5211e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2506,6 +2506,17 @@ isomorphic-mapzen-search "^1.6.1" lodash.memoize "^4.1.2" +"@opentripplanner/geocoder@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@opentripplanner/geocoder/-/geocoder-3.0.2.tgz#2c7618947d1d9b082bd39d037327c9cf23282782" + integrity sha512-pl7tCiodex0hXWKLH3WE+I+HzoSgOOWp9kR3xMcuRiE5g6k2JXNneoD/ZfSS1n6Oorxcjv3U2DbMSXT2j/39dQ== + dependencies: + "@conveyal/geocoder-arcgis-geojson" "^0.0.3" + "@conveyal/lonlat" "^1.4.1" + "@leeoniya/ufuzzy" "^1.0.14" + isomorphic-mapzen-search "^1.6.1" + lodash.memoize "^4.1.2" + "@opentripplanner/humanize-distance@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@opentripplanner/humanize-distance/-/humanize-distance-1.2.0.tgz#71cf5d5d1b756adef15300edbba0995ccd4b35ee" From fd92d0374cbb5d4078b6c0c3b975ca9f5835c2ef Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 25 Sep 2024 11:59:34 -0400 Subject: [PATCH 023/119] make currentServiceWeek query in nearby query --- lib/actions/api.js | 4 +-- lib/actions/apiV2.js | 12 +++++-- lib/components/viewers/nearby/nearby-view.tsx | 35 ++++++++++++++++--- lib/components/viewers/nearby/stop.tsx | 9 +++-- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/lib/actions/api.js b/lib/actions/api.js index 9a535c164..4ea9d99b4 100644 --- a/lib/actions/api.js +++ b/lib/actions/api.js @@ -370,8 +370,8 @@ export function vehicleRentalQuery( export const fetchNearbyResponse = createAction('FETCH_NEARBY_RESPONSE') export const fetchNearbyError = createAction('FETCH_NEARBY_ERROR') -export function fetchNearby(coords, map) { - return executeOTPAction('fetchNearby', coords, map) +export function fetchNearby(coords, map, currentServiceWeek) { + return executeOTPAction('fetchNearby', coords, map, currentServiceWeek) } // Single trip lookup query diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index b3d56f168..10d6d7165 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -380,7 +380,7 @@ export const fetchNearbyFromStopId = (stopId) => { ) } -export const fetchNearby = (position, radius) => { +export const fetchNearby = (position, radius, currentServiceWeek) => { const { lat, lon } = position return createGraphQLQueryAction( @@ -437,11 +437,19 @@ export const fetchNearby = (position, radius) => { lon code gtfsId + stopRoutes: routes ${ + currentServiceWeek + ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` + : '' + } { + gtfsId + } stoptimesForPatterns { pattern { headsign desc: name route { + gtfsId agency { name gtfsId @@ -860,7 +868,7 @@ export function findRoutes() { return function (dispatch, getState) { // Only calculate current service week if the setting for it is enabled const currentServiceWeek = - getState().otp?.routeViewer?.onlyShowCurrentServiceWeek === true + getState().otp?.config?.routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() : null diff --git a/lib/components/viewers/nearby/nearby-view.tsx b/lib/components/viewers/nearby/nearby-view.tsx index 653f3716a..855b596a8 100644 --- a/lib/components/viewers/nearby/nearby-view.tsx +++ b/lib/components/viewers/nearby/nearby-view.tsx @@ -8,6 +8,7 @@ import * as apiActions from '../../../actions/api' import * as mapActions from '../../../actions/map' import * as uiActions from '../../../actions/ui' import { AppReduxState } from '../../../util/state-types' +import { getCurrentServiceWeek } from '../../../util/current-service-week' import { SetLocationHandler, ZoomToPlaceHandler } from '../../util/types' import Loading from '../../narrative/loading' import MobileContainer from '../../mobile/container' @@ -31,13 +32,19 @@ const AUTO_REFRESH_INTERVAL = 15000 // TODO: use lonlat package type LatLonObj = { lat: number; lon: number } type CurrentPosition = { coords?: { latitude: number; longitude: number } } +type ServiceWeek = { end: string; start: string } type Props = { currentPosition?: CurrentPosition + currentServiceWeek?: ServiceWeek defaultLatLon: LatLonObj | null displayedCoords?: LatLonObj entityId?: string - fetchNearby: (latLon: LatLonObj, radius?: number) => void + fetchNearby: ( + latLon: LatLonObj, + radius?: number, + currentServiceWeek?: ServiceWeek + ) => void hideBackButton?: boolean location: string mobile?: boolean @@ -102,6 +109,7 @@ function getNearbyCoordsFromUrlOrLocationOrMapCenter( function NearbyView({ currentPosition, + currentServiceWeek, defaultLatLon, displayedCoords, entityId, @@ -175,10 +183,10 @@ function NearbyView({ firstItemRef.current?.scrollIntoView({ behavior: 'smooth' }) } if (finalNearbyCoords) { - fetchNearby(finalNearbyCoords, radius) + fetchNearby(finalNearbyCoords, radius, currentServiceWeek) setLoading(true) const interval = setInterval(() => { - fetchNearby(finalNearbyCoords, radius) + fetchNearby(finalNearbyCoords, radius, currentServiceWeek) setLoading(true) }, AUTO_REFRESH_INTERVAL) return function cleanup() { @@ -204,6 +212,16 @@ function NearbyView({ finalNearbyCoords?.lat !== displayedCoords?.lat || finalNearbyCoords?.lon !== displayedCoords?.lon + // Build list of nearby routes for filtering within the stop card + const nearbyRoutes = Array.from( + new Set( + nearby + ?.map((n: any) => + n.place?.stopRoutes?.map((sr: { gtfsId?: string }) => sr?.gtfsId) + ) + .flat(Infinity) + ) + ) const nearbyItemList = nearby?.map && nearby?.map((n: any) => ( @@ -223,7 +241,7 @@ function NearbyView({ /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex */ tabIndex={0} > - {getNearbyItem({ ...n.place, distance: n.distance })} + {getNearbyItem({ ...n.place, distance: n.distance, nearbyRoutes })} )) @@ -290,15 +308,22 @@ function NearbyView({ const mapStateToProps = (state: AppReduxState) => { const { config, location, transitIndex, ui } = state.otp - const { map } = state.otp.config + const { map, routeViewer } = config const { nearbyViewCoords } = ui const { nearby } = transitIndex const { entityId } = state.router.location.query const { currentPosition } = location const defaultLatLon = map?.initLat && map?.initLon ? { lat: map.initLat, lon: map.initLon } : null + + const currentServiceWeek = + routeViewer?.onlyShowCurrentServiceWeek === true + ? getCurrentServiceWeek() + : null + return { currentPosition, + currentServiceWeek, defaultLatLon, displayedCoords: nearby?.coords, entityId: entityId && decodeURIComponent(entityId), diff --git a/lib/components/viewers/nearby/stop.tsx b/lib/components/viewers/nearby/stop.tsx index de0ccc0f5..f11f443a2 100644 --- a/lib/components/viewers/nearby/stop.tsx +++ b/lib/components/viewers/nearby/stop.tsx @@ -1,7 +1,6 @@ import { Calendar } from '@styled-icons/fa-solid' import { connect } from 'react-redux' import { FormattedMessage } from 'react-intl' -import { TransitOperator } from '@opentripplanner/types' import coreUtils from '@opentripplanner/core-utils' import React from 'react' @@ -25,7 +24,7 @@ type Props = { homeTimezone: string nearbyViewConfig?: NearbyViewConfig routeSortComparator: (a: PatternStopTime, b: PatternStopTime) => number - stopData: StopData + stopData: StopData & { nearbyRoutes?: string[] } } const Stop = ({ @@ -70,6 +69,12 @@ const Stop = ({ const sortedStopTimes = st.stoptimes.sort( (a: StopTime, b: StopTime) => fullTimestamp(a) - fullTimestamp(b) ) + if ( + stopData.nearbyRoutes && + !stopData.nearbyRoutes.includes(st?.pattern?.route?.gtfsId) + ) { + return <> + } return ( Date: Mon, 7 Oct 2024 12:51:28 -0400 Subject: [PATCH 024/119] address pr feedback --- lib/actions/apiV2.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 10d6d7165..d1d17c544 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -388,6 +388,7 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { $lat: Float! $lon: Float! $radius: Int + $currentServiceWeek: LocalDateRangeInput ) { nearest(lat:$lat, lon:$lon, maxDistance: $radius, first: 100, filterByPlaceTypes: [STOP, VEHICLE_RENT, BIKE_PARK, CAR_PARK]) { edges { @@ -437,13 +438,9 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { lon code gtfsId - stopRoutes: routes ${ - currentServiceWeek - ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` - : '' - } { - gtfsId - } + stopRoutes: routes (serviceDates: $currentServiceWeek) { + gtfsId + } stoptimesForPatterns { pattern { headsign @@ -483,7 +480,7 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { } } }`, - { lat, lon, radius }, + { currentServiceWeek, lat, lon, radius }, fetchNearbyResponse, fetchNearbyError, { From 53059137dc988b96122e5e5be44ae3af2485ee67 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 12:56:23 -0400 Subject: [PATCH 025/119] complete pr feedback addressing --- lib/actions/apiV2.js | 12 +++++------- lib/components/viewers/nearby/stop.tsx | 2 ++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index d1d17c544..cf302a770 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -871,12 +871,10 @@ export function findRoutes() { dispatch( createGraphQLQueryAction( - `{ - routes ${ - currentServiceWeek - ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` - : '' - }{ + `query Routes( + $currentServiceWeek: LocalDateRangeInput + ) { + routes (serviceDates: $currentServiceWeek) { id: gtfsId agency { id: gtfsId @@ -891,7 +889,7 @@ export function findRoutes() { } } `, - {}, + { currentServiceWeek }, findRoutesResponse, findRoutesError, { diff --git a/lib/components/viewers/nearby/stop.tsx b/lib/components/viewers/nearby/stop.tsx index f11f443a2..c98d288c1 100644 --- a/lib/components/viewers/nearby/stop.tsx +++ b/lib/components/viewers/nearby/stop.tsx @@ -70,6 +70,8 @@ const Stop = ({ (a: StopTime, b: StopTime) => fullTimestamp(a) - fullTimestamp(b) ) if ( + // NearbyRoutes if present is populated with a list of routes that appear + // in the current service period. stopData.nearbyRoutes && !stopData.nearbyRoutes.includes(st?.pattern?.route?.gtfsId) ) { From e1c6d826255365143a4f8fd09179e027a8137b08 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 12:59:11 -0400 Subject: [PATCH 026/119] correct types --- lib/actions/apiV2.js | 2 +- lib/components/viewers/nearby/nearby-view.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index cf302a770..71dc3accc 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -867,7 +867,7 @@ export function findRoutes() { const currentServiceWeek = getState().otp?.config?.routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() - : null + : undefined dispatch( createGraphQLQueryAction( diff --git a/lib/components/viewers/nearby/nearby-view.tsx b/lib/components/viewers/nearby/nearby-view.tsx index 855b596a8..1405f9eae 100644 --- a/lib/components/viewers/nearby/nearby-view.tsx +++ b/lib/components/viewers/nearby/nearby-view.tsx @@ -319,7 +319,7 @@ const mapStateToProps = (state: AppReduxState) => { const currentServiceWeek = routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() - : null + : undefined return { currentPosition, From b94b3d223f1f4e0a071d5a47ac25064becd2fa0f Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 13:02:29 -0400 Subject: [PATCH 027/119] update snapshots --- .../viewers/__snapshots__/nearby-view.js.snap | 522 ++++++++++++++++++ 1 file changed, 522 insertions(+) diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index ac5bc3bee..46af4f668 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -4153,6 +4153,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4172,6 +4175,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4194,6 +4200,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4213,6 +4222,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4247,6 +4259,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4280,6 +4295,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4344,6 +4362,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4363,6 +4384,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3158, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4585,6 +4609,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4604,6 +4631,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4626,6 +4656,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4645,6 +4678,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4679,6 +4715,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4712,6 +4751,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4776,6 +4818,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -4795,6 +4840,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5017,6 +5065,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5036,6 +5087,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5058,6 +5112,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5077,6 +5134,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5111,6 +5171,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5144,6 +5207,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5208,6 +5274,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5227,6 +5296,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -5450,6 +5522,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -6016,6 +6091,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -6585,6 +6663,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -7153,6 +7234,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -7743,6 +7827,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -8309,6 +8396,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -8896,6 +8986,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -9462,6 +9555,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -10744,6 +10840,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -11310,6 +11409,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -14499,6 +14601,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -14864,6 +14969,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -15232,6 +15340,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -15599,6 +15710,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -15988,6 +16102,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -16353,6 +16470,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -16739,6 +16859,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -17104,6 +17227,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -17984,6 +18110,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -18349,6 +18478,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -20885,6 +21017,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -20904,6 +21039,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -20926,6 +21064,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -20945,6 +21086,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -20979,6 +21123,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -21012,6 +21159,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -21076,6 +21226,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -21095,6 +21248,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675873, "lon": -122.316137, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "bird-seattle-washington", "operative": true, "rentalUris": null, @@ -21317,6 +21473,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21336,6 +21495,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21358,6 +21520,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21377,6 +21542,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21411,6 +21579,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21444,6 +21615,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21508,6 +21682,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21527,6 +21704,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21749,6 +21929,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21768,6 +21951,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21790,6 +21976,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21809,6 +21998,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21843,6 +22035,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21876,6 +22071,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21940,6 +22138,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -21959,6 +22160,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6759, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -22182,6 +22386,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -22825,6 +23032,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -23471,6 +23681,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -24116,6 +24329,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -24783,6 +24999,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -25426,6 +25645,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -26090,6 +26312,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -26733,6 +26958,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -28169,6 +28397,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -28812,6 +29043,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -32477,6 +32711,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32496,6 +32733,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32518,6 +32758,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32537,6 +32780,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32571,6 +32817,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32604,6 +32853,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32668,6 +32920,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32687,6 +32942,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3157, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32909,6 +33167,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32928,6 +33189,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32950,6 +33214,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -32969,6 +33236,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33003,6 +33273,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33036,6 +33309,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33100,6 +33376,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33119,6 +33398,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33341,6 +33623,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33360,6 +33645,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33382,6 +33670,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33401,6 +33692,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33435,6 +33729,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33468,6 +33765,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33532,6 +33832,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33551,6 +33854,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6764, "lon": -122.3162, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33773,6 +34079,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33792,6 +34101,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33814,6 +34126,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33833,6 +34148,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33867,6 +34185,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33900,6 +34221,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33964,6 +34288,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -33983,6 +34310,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3173, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34205,6 +34535,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34224,6 +34557,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34246,6 +34582,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34265,6 +34604,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34299,6 +34641,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34332,6 +34677,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34396,6 +34744,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34415,6 +34766,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6754, "lon": -122.3174, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -34638,6 +34992,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -35003,6 +35360,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -35371,6 +35731,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -35738,6 +36101,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -36127,6 +36493,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -36492,6 +36861,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -36878,6 +37250,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -37243,6 +37618,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -38123,6 +38501,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -38488,6 +38869,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -41029,6 +41413,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41048,6 +41435,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41070,6 +41460,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41089,6 +41482,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41123,6 +41519,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41156,6 +41555,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41220,6 +41622,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41239,6 +41644,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675, "lon": -122.3164, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -41462,6 +41870,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -42002,6 +42413,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -42545,6 +42959,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -43087,6 +43504,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -43651,6 +44071,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -44191,6 +44614,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -44752,6 +45178,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -45292,6 +45721,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -46522,6 +46954,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -47062,6 +47497,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -48740,6 +49178,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -49383,6 +49824,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -50029,6 +50473,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -50674,6 +51121,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -51341,6 +51791,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -51984,6 +52437,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -52648,6 +53104,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -53291,6 +53750,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -54727,6 +55189,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -55370,6 +55835,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -60788,6 +61256,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60807,6 +61278,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60829,6 +61303,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60848,6 +61325,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60882,6 +61362,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60915,6 +61398,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60979,6 +61465,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -60998,6 +61487,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6772, "lon": -122.3159, "name": "Default vehicle type", + "nearbyRoutes": Array [ + undefined, + ], "network": "lime_seattle", "operative": true, "rentalUris": null, @@ -61221,6 +61713,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -61787,6 +62282,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -62356,6 +62854,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -62924,6 +63425,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -63514,6 +64018,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -64080,6 +64587,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -64667,6 +65177,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -65233,6 +65746,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -66515,6 +67031,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -67081,6 +67600,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { From f8cc983f164646c20f467455f38d163afcc6dab2 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 13:12:30 -0400 Subject: [PATCH 028/119] add missing `nearbyRoutes` to snapshots --- __tests__/components/viewers/__snapshots__/nearby-view.js.snap | 3 +++ 1 file changed, 3 insertions(+) diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index 46af4f668..46146c33b 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -3513,6 +3513,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { From 79679567d5ab80d7bacf7750f54d07b4c16b4afd Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 13:21:06 -0400 Subject: [PATCH 029/119] update snapshots --- .../viewers/__snapshots__/nearby-view.js.snap | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index 46146c33b..dd1dcddc1 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -3513,9 +3513,6 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", - "nearbyRoutes": Array [ - undefined, - ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -10136,6 +10133,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758881, "lon": -122.315994, "name": "Roosevelt Station - Bay 2", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -17607,6 +17607,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.676107, "lon": -122.316041, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -27616,6 +27619,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6757507, "lon": -122.316673, "name": "Roosevelt Station - Bay 1", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -37998,6 +38004,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.675457, "lon": -122.317467, "name": "Roosevelt Station Bay 5 - Bay 5", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -46276,6 +46285,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.677081, "lon": -122.315928, "name": "Roosevelt", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -54408,6 +54420,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6771355, "lon": -122.315582, "name": "Roosevelt Station - Bay 3", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { @@ -66327,6 +66342,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { From ed1c057ef7cb209d76a7b6ca85c824d49558f7f5 Mon Sep 17 00:00:00 2001 From: Daniel Heppner Date: Thu, 24 Oct 2024 17:05:28 -0700 Subject: [PATCH 030/119] update percy mocks --- percy/mocks/NearbyResponse.json | 6924 +++++++++---------------------- percy/otpSchema.json | 2 +- 2 files changed, 2018 insertions(+), 4908 deletions(-) diff --git a/percy/mocks/NearbyResponse.json b/percy/mocks/NearbyResponse.json index 607766394..978847174 100644 --- a/percy/mocks/NearbyResponse.json +++ b/percy/mocks/NearbyResponse.json @@ -4,96 +4,51 @@ "edges": [ { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjAuMTk4O1UzUnZjRHBOUVZKVVFUb3hNREl4TlRJ", - "distance": 0, + "id": "cGxhY2VBdERpc3RhbmNlOjE3Ljk1NDtVM1J2Y0RwTlFWSlVRVG80TURN", + "distance": 17, "place": { "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxMDIxNTI", - "lat": 33.750043, - "lon": -84.388393, - "name": "Martin L King J Dr at Washington St SW", - "code": "803", + "id": "U3RvcDpNQVJUQTo4MDM", + "lat": 33.775214, + "lon": -84.282466, + "name": "Avondale Station", + "code": "908691", "gtfsId": "MARTA:803", + "routes": [ + { + "gtfsId": "MARTA:23701" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "West Lake Station", + "headsign": "H E HOLMES STATION", + "name": "Blue to Five Points Station (MARTA:806)", "route": { + "gtfsId": "MARTA:23701", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "813", - "type": 3, - "mode": "BUS", - "longName": "Atlanta University Center", - "color": "00FFFF", + "shortName": "Blue", + "type": 1, + "mode": "SUBWAY", + "longName": "Blue", + "color": "0075B2", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 83810, - "scheduledDeparture": 83810, - "headsign": "West Lake Station", - "trip": { - "route": { - "shortName": "813" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 81410, - "scheduledDeparture": 81410, - "headsign": "West Lake Station", - "trip": { - "route": { - "shortName": "813" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 79010, - "scheduledDeparture": 79010, - "headsign": "West Lake Station", - "trip": { - "route": { - "shortName": "813" - } - } - }, - { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76610, - "scheduledDeparture": 76610, - "headsign": "West Lake Station", - "trip": { - "route": { - "shortName": "813" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 163, - "realtimeState": "UPDATED", - "realtimeDeparture": 74373, - "scheduledDeparture": 74210, - "headsign": "West Lake Station", + "realtimeDeparture": 90720, + "scheduledDeparture": 90720, + "headsign": "H E HOLMES STATION", "trip": { "route": { - "shortName": "813" + "shortName": "Blue" } } } @@ -101,167 +56,85 @@ }, { "pattern": { - "headsign": "Five Points Station", + "headsign": "H E HOLMES STATION", + "name": "Blue to Hamilton E Holmes Station (MARTA:40) from Indian Creek Station (MARTA:802)", "route": { + "gtfsId": "MARTA:23701", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "21", - "type": 3, - "mode": "BUS", - "longName": "Memorial Drive", - "color": "FF00FF", + "shortName": "Blue", + "type": 1, + "mode": "SUBWAY", + "longName": "Blue", + "color": "0075B2", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 80686, - "scheduledDeparture": 80686, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "21" - } - } - }, - { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78886, - "scheduledDeparture": 78886, - "headsign": "Five Points Station", + "realtimeDeparture": 77100, + "scheduledDeparture": 77100, + "headsign": "H E HOLMES STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 77086, - "scheduledDeparture": 77086, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "21" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -146, - "realtimeState": "UPDATED", - "realtimeDeparture": 75140, - "scheduledDeparture": 75286, - "headsign": "Five Points Station", + "realtimeDeparture": 75900, + "scheduledDeparture": 75900, + "headsign": "H E HOLMES STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, - "departureDelay": -18, - "realtimeState": "UPDATED", - "realtimeDeparture": 73468, - "scheduledDeparture": 73486, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "21" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Five Points Station", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "55", - "type": 3, - "mode": "BUS", - "longName": "Jonesboro Road", - "color": "FF8000", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80007, - "scheduledDeparture": 80007, - "headsign": "Five Points Station", + "realtimeDeparture": 74700, + "scheduledDeparture": 74700, + "headsign": "H E HOLMES STATION", "trip": { "route": { - "shortName": "55" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78207, - "scheduledDeparture": 78207, - "headsign": "Five Points Station", + "realtimeDeparture": 73500, + "scheduledDeparture": 73500, + "headsign": "H E HOLMES STATION", "trip": { "route": { - "shortName": "55" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76407, - "scheduledDeparture": 76407, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "55" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -30, - "realtimeState": "UPDATED", - "realtimeDeparture": 74577, - "scheduledDeparture": 74607, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "55" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 535, - "realtimeState": "UPDATED", - "realtimeDeparture": 73342, - "scheduledDeparture": 72807, - "headsign": "Five Points Station", + "realtimeDeparture": 72300, + "scheduledDeparture": 72300, + "headsign": "H E HOLMES STATION", "trip": { "route": { - "shortName": "55" + "shortName": "Blue" } } } @@ -273,3017 +146,51 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjQ5LjA2NDAwMDAwMDAwMDAxO1UzUnZjRHBEYjJKaVRHbHVZem81Tnpj", - "distance": 49, + "id": "cGxhY2VBdERpc3RhbmNlOjMyLjAxNTQ5OTk5OTk5OTk5NjtVM1J2Y0RwTlFWSlVRVG80TURB", + "distance": 32, "place": { "__typename": "Stop", - "id": "U3RvcDpDb2JiTGluYzo5Nzc", - "lat": 33.750359, - "lon": -84.388304, - "name": "Washington Street at Martin Luther King Junior Drive", - "code": "600015", - "gtfsId": "CobbLinc:977", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "Civic Center Station/Five Points Station", - "route": { - "agency": { - "name": "CobbLinc", - "gtfsId": "CobbLinc:1" - }, - "shortName": "101", - "type": 3, - "mode": "BUS", - "longName": "Civic Center/Five Points/MTC", - "color": "0d0d0d", - "textColor": "f2f2f2" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 31468, - "scheduledDeparture": 31468, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28168, - "scheduledDeparture": 28168, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24268, - "scheduledDeparture": 24268, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "101" - } - } - } - ] - }, + "id": "U3RvcDpNQVJUQTo4MDA", + "lat": 33.775554, + "lon": -84.281487, + "name": "Avondale Station", + "code": "908438", + "gtfsId": "MARTA:800", + "routes": [ { - "pattern": { - "headsign": "Civic Center Station/Five Points Station", - "route": { - "agency": { - "name": "CobbLinc", - "gtfsId": "CobbLinc:1" - }, - "shortName": "100", - "type": 3, - "mode": "BUS", - "longName": "Civic Center Station/Busbee P&R", - "color": "0d0d0d", - "textColor": "f2f2f2" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 29243, - "scheduledDeparture": 29243, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "100" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28343, - "scheduledDeparture": 28343, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "100" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24743, - "scheduledDeparture": 24743, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "100" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22943, - "scheduledDeparture": 22943, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "100" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 21743, - "scheduledDeparture": 21743, - "headsign": "Civic Center Station/Five Points Station", - "trip": { - "route": { - "shortName": "100" - } - } - } - ] + "gtfsId": "MARTA:23701" } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjQ5LjA2NDAwMDAwMDAwMDAxO1UzUnZjRHBIZDJsdWJtVjBkRU52ZFc1MGVWUnlZVzV6YVhRNk9ETTE", - "distance": 49, - "place": { - "__typename": "Stop", - "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6ODM1", - "lat": 33.750359, - "lon": -84.388304, - "name": "Washington Street at Martin Luther King Junior Drive", - "code": "600015", - "gtfsId": "GwinnettCountyTransit:835", + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "Downtown Atlanta", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "103A", - "type": 3, - "mode": "BUS", - "longName": "Rev Commute Atlanta - Sugarloaf Mills", - "color": "6A737B", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 66716, - "scheduledDeparture": 66716, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103A" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59174, - "scheduledDeparture": 59174, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103A" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Downtown Atlanta", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "103", - "type": 3, - "mode": "BUS", - "longName": "Sugarloaf Mills P&R - Downtown Atlanta", - "color": "008852", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 27453, - "scheduledDeparture": 27453, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26133, - "scheduledDeparture": 26133, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24333, - "scheduledDeparture": 24333, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 23133, - "scheduledDeparture": 23133, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 21633, - "scheduledDeparture": 21633, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "103" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Downtown Atlanta", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "101", - "type": 3, - "mode": "BUS", - "longName": "I-985 P&R - Downtown Atlanta", - "color": "E7A614", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 30753, - "scheduledDeparture": 30753, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28653, - "scheduledDeparture": 28653, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26444, - "scheduledDeparture": 26444, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24644, - "scheduledDeparture": 24644, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22844, - "scheduledDeparture": 22844, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "101" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Downtown Atlanta", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "102", - "type": 3, - "mode": "BUS", - "longName": "Indian Trail P&R - Downtown Atlanta", - "color": "A0CF67", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 30171, - "scheduledDeparture": 30171, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28371, - "scheduledDeparture": 28371, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26391, - "scheduledDeparture": 26391, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24591, - "scheduledDeparture": 24591, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22791, - "scheduledDeparture": 22791, - "headsign": "Downtown Atlanta", - "trip": { - "route": { - "shortName": "102" - } - } - } - ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjQ5LjE1NjAwMDAwMDAwMDAwNjtVM1J2Y0RwWWNISmxjM002TXpjeQ", - "distance": 49, - "place": { - "__typename": "Stop", - "id": "U3RvcDpYcHJlc3M6Mzcy", - "lat": 33.75036, - "lon": -84.388304, - "name": "Washington St at MLK Jr Dr", - "code": "600015", - "gtfsId": "Xpress:372", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "440 Hampton / Jonesboro", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "440", - "type": 3, - "mode": "BUS", - "longName": "Hampton/Jonesboro - DT/MT", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 65809, - "scheduledDeparture": 65809, - "headsign": "440 Hampton / Jonesboro", - "trip": { - "route": { - "shortName": "440" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 64228, - "scheduledDeparture": 64228, - "headsign": "440 Hampton / Jonesboro", - "trip": { - "route": { - "shortName": "440" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60726, - "scheduledDeparture": 60726, - "headsign": "440 Hampton / Jonesboro", - "trip": { - "route": { - "shortName": "440" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56848, - "scheduledDeparture": 56848, - "headsign": "440 Hampton / Jonesboro", - "trip": { - "route": { - "shortName": "440" - } - } - } - ] - }, - { - "pattern": { - "headsign": "432 Stockbridge / BrandsMart", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "432", - "type": 3, - "mode": "BUS", - "longName": "BrandsMart/Stockbridge - DT", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62569, - "scheduledDeparture": 62569, - "headsign": "432 Stockbridge / BrandsMart", - "trip": { - "route": { - "shortName": "432" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60611, - "scheduledDeparture": 60611, - "headsign": "432 Stockbridge / BrandsMart", - "trip": { - "route": { - "shortName": "432" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59411, - "scheduledDeparture": 59411, - "headsign": "432 Stockbridge / BrandsMart", - "trip": { - "route": { - "shortName": "432" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56313, - "scheduledDeparture": 56313, - "headsign": "432 Stockbridge / BrandsMart", - "trip": { - "route": { - "shortName": "432" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54513, - "scheduledDeparture": 54513, - "headsign": "432 Stockbridge / BrandsMart", - "trip": { - "route": { - "shortName": "432" - } - } - } - ] - }, - { - "pattern": { - "headsign": "400 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "400", - "type": 3, - "mode": "BUS", - "longName": "Cumming - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28189, - "scheduledDeparture": 28189, - "headsign": "400 Downtown", - "trip": { - "route": { - "shortName": "400" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24229, - "scheduledDeparture": 24229, - "headsign": "400 Downtown", - "trip": { - "route": { - "shortName": "400" - } - } - } - ] - }, - { - "pattern": { - "headsign": "West Douglas / Douglas MMTC", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "463", - "type": 3, - "mode": "BUS", - "longName": "W Douglas/Douglas MMTC - DT/MT", - "color": "8e287e", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62354, - "scheduledDeparture": 62354, - "headsign": "West Douglas / Douglas MMTC", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60766, - "scheduledDeparture": 60766, - "headsign": "West Douglas / Douglas MMTC", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58751, - "scheduledDeparture": 58751, - "headsign": "West Douglas / Douglas MMTC", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57614, - "scheduledDeparture": 57614, - "headsign": "West Douglas / Douglas MMTC", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56414, - "scheduledDeparture": 56414, - "headsign": "West Douglas / Douglas MMTC", - "trip": { - "route": { - "shortName": "463" - } - } - } - ] - }, - { - "pattern": { - "headsign": "426 Panola / West Conyers / East Conyers", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59774, - "scheduledDeparture": 59774, - "headsign": "426 Panola / West Conyers / East Conyers", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58543, - "scheduledDeparture": 58543, - "headsign": "426 Panola / West Conyers / East Conyers", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57374, - "scheduledDeparture": 57374, - "headsign": "426 Panola / West Conyers / East Conyers", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56443, - "scheduledDeparture": 56443, - "headsign": "426 Panola / West Conyers / East Conyers", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55514, - "scheduledDeparture": 55514, - "headsign": "426 Panola / West Conyers / East Conyers", - "trip": { - "route": { - "shortName": "426" - } - } - } - ] - }, - { - "pattern": { - "headsign": "419 Snellville / Hewatt / Stone Mountain", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "419", - "type": 3, - "mode": "BUS", - "longName": "Snellville/Hewatt/Stone Mtn - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61066, - "scheduledDeparture": 61066, - "headsign": "419 Snellville / Hewatt / Stone Mountain", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60134, - "scheduledDeparture": 60134, - "headsign": "419 Snellville / Hewatt / Stone Mountain", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59171, - "scheduledDeparture": 59171, - "headsign": "419 Snellville / Hewatt / Stone Mountain", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57643, - "scheduledDeparture": 57643, - "headsign": "419 Snellville / Hewatt / Stone Mountain", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54583, - "scheduledDeparture": 54583, - "headsign": "419 Snellville / Hewatt / Stone Mountain", - "trip": { - "route": { - "shortName": "419" - } - } - } - ] - }, - { - "pattern": { - "headsign": "480 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "480", - "type": 3, - "mode": "BUS", - "longName": "Acworth/Town Center - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 31576, - "scheduledDeparture": 31576, - "headsign": "480 Downtown", - "trip": { - "route": { - "shortName": "480" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 27496, - "scheduledDeparture": 27496, - "headsign": "480 Downtown", - "trip": { - "route": { - "shortName": "480" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 23056, - "scheduledDeparture": 23056, - "headsign": "480 Downtown", - "trip": { - "route": { - "shortName": "480" - } - } - } - ] - }, - { - "pattern": { - "headsign": "476 Hiram / Powder Springs", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "476", - "type": 3, - "mode": "BUS", - "longName": "Hiram/Powder Springs - DT/MT", - "color": "8e287e", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 63731, - "scheduledDeparture": 63731, - "headsign": "476 Hiram / Powder Springs", - "trip": { - "route": { - "shortName": "476" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61994, - "scheduledDeparture": 61994, - "headsign": "476 Hiram / Powder Springs", - "trip": { - "route": { - "shortName": "476" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60134, - "scheduledDeparture": 60134, - "headsign": "476 Hiram / Powder Springs", - "trip": { - "route": { - "shortName": "476" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56203, - "scheduledDeparture": 56203, - "headsign": "476 Hiram / Powder Springs", - "trip": { - "route": { - "shortName": "476" - } - } - } - ] - }, - { - "pattern": { - "headsign": "485 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "485", - "type": 3, - "mode": "BUS", - "longName": "Hickory Grove - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 29062, - "scheduledDeparture": 29062, - "headsign": "485 Downtown", - "trip": { - "route": { - "shortName": "485" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 25462, - "scheduledDeparture": 25462, - "headsign": "485 Downtown", - "trip": { - "route": { - "shortName": "485" - } - } - } - ] - }, - { - "pattern": { - "headsign": "453 Newnan / Union City", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "453", - "type": 3, - "mode": "BUS", - "longName": "Newnan/Union City - DT/MT", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 64009, - "scheduledDeparture": 64009, - "headsign": "453 Newnan / Union City", - "trip": { - "route": { - "shortName": "453" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62668, - "scheduledDeparture": 62668, - "headsign": "453 Newnan / Union City", - "trip": { - "route": { - "shortName": "453" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60088, - "scheduledDeparture": 60088, - "headsign": "453 Newnan / Union City", - "trip": { - "route": { - "shortName": "453" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56368, - "scheduledDeparture": 56368, - "headsign": "453 Newnan / Union City", - "trip": { - "route": { - "shortName": "453" - } - } - } - ] - }, - { - "pattern": { - "headsign": "442 Riverdale", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "442", - "type": 3, - "mode": "BUS", - "longName": "Riverdale - Downtown", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61969, - "scheduledDeparture": 61969, - "headsign": "442 Riverdale", - "trip": { - "route": { - "shortName": "442" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58211, - "scheduledDeparture": 58211, - "headsign": "442 Riverdale", - "trip": { - "route": { - "shortName": "442" - } - } - } - ] - }, - { - "pattern": { - "headsign": "490 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "490", - "type": 3, - "mode": "BUS", - "longName": "Woodstock - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26302, - "scheduledDeparture": 26302, - "headsign": "490 Downtown", - "trip": { - "route": { - "shortName": "490" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24382, - "scheduledDeparture": 24382, - "headsign": "490 Downtown", - "trip": { - "route": { - "shortName": "490" - } - } - } - ] - }, - { - "pattern": { - "headsign": "413 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "413", - "type": 3, - "mode": "BUS", - "longName": "Hamilton Mill/Mall of GA - DT", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 31762, - "scheduledDeparture": 31762, - "headsign": "413 Downtown", - "trip": { - "route": { - "shortName": "413" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28162, - "scheduledDeparture": 28162, - "headsign": "413 Downtown", - "trip": { - "route": { - "shortName": "413" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24556, - "scheduledDeparture": 24556, - "headsign": "413 Downtown", - "trip": { - "route": { - "shortName": "413" - } - } - } - ] - }, - { - "pattern": { - "headsign": "441 Jonesboro", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "441", - "type": 3, - "mode": "BUS", - "longName": "Jonesboro - Downtown/Midtown", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 63448, - "scheduledDeparture": 63448, - "headsign": "441 Jonesboro", - "trip": { - "route": { - "shortName": "441" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59766, - "scheduledDeparture": 59766, - "headsign": "441 Jonesboro", - "trip": { - "route": { - "shortName": "441" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55489, - "scheduledDeparture": 55489, - "headsign": "441 Jonesboro", - "trip": { - "route": { - "shortName": "441" - } - } - } - ] - }, - { - "pattern": { - "headsign": "416 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "416", - "type": 3, - "mode": "BUS", - "longName": "Dacula - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 27620, - "scheduledDeparture": 27620, - "headsign": "416 Downtown", - "trip": { - "route": { - "shortName": "416" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26240, - "scheduledDeparture": 26240, - "headsign": "416 Downtown", - "trip": { - "route": { - "shortName": "416" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22455, - "scheduledDeparture": 22455, - "headsign": "416 Downtown", - "trip": { - "route": { - "shortName": "416" - } - } - } - ] - }, - { - "pattern": { - "headsign": "430 McDonough", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "430", - "type": 3, - "mode": "BUS", - "longName": "McDonough - Downtown", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61969, - "scheduledDeparture": 61969, - "headsign": "430 McDonough", - "trip": { - "route": { - "shortName": "430" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60611, - "scheduledDeparture": 60611, - "headsign": "430 McDonough", - "trip": { - "route": { - "shortName": "430" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58211, - "scheduledDeparture": 58211, - "headsign": "430 McDonough", - "trip": { - "route": { - "shortName": "430" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56313, - "scheduledDeparture": 56313, - "headsign": "430 McDonough", - "trip": { - "route": { - "shortName": "430" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54213, - "scheduledDeparture": 54213, - "headsign": "430 McDonough", - "trip": { - "route": { - "shortName": "430" - } - } - } - ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjE5My45OTQ7VTNSdmNEcE5RVkpVUVRvNU9UazNNRGs1TUE", - "distance": 193, - "place": { - "__typename": "Stop", - "id": "U3RvcDpNQVJUQTo5OTk3MDk5MA", - "lat": 33.749937, - "lon": -84.386893, - "name": "Ga State Station - Piedmont Ave", - "code": "210709", - "gtfsId": "MARTA:99970990", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "Georgia State Station", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "899", - "type": 3, - "mode": "BUS", - "longName": "Old Fourth Ward", - "color": "FF00FF", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 36600, - "scheduledDeparture": 36600, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 33000, - "scheduledDeparture": 33000, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 29400, - "scheduledDeparture": 29400, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 25800, - "scheduledDeparture": 25800, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -36, - "realtimeState": "UPDATED", - "realtimeDeparture": 76164, - "scheduledDeparture": 76200, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "899" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Georgia State Station", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "107", - "type": 3, - "mode": "BUS", - "longName": "Glenwood", - "color": "008000", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 81389, - "scheduledDeparture": 81389, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "107" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 79589, - "scheduledDeparture": 79589, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "107" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -90, - "realtimeState": "UPDATED", - "realtimeDeparture": 77699, - "scheduledDeparture": 77789, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "107" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -482, - "realtimeState": "UPDATED", - "realtimeDeparture": 75507, - "scheduledDeparture": 75989, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "107" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -173, - "realtimeState": "UPDATED", - "realtimeDeparture": 74016, - "scheduledDeparture": 74189, - "headsign": "Georgia State Station", - "trip": { - "route": { - "shortName": "107" - } - } - } - ] - }, - { - "pattern": { - "headsign": "899 OLD 4TH WARD - NORTH AVE STN", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "899", - "type": 3, - "mode": "BUS", - "longName": "Old Fourth Ward", - "color": "FF00FF", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 33300, - "scheduledDeparture": 33300, - "headsign": "899 OLD 4TH WARD - NORTH AVE STN", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 29700, - "scheduledDeparture": 29700, - "headsign": "899 OLD 4TH WARD - NORTH AVE STN", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26100, - "scheduledDeparture": 26100, - "headsign": "899 OLD 4TH WARD - NORTH AVE STN", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22500, - "scheduledDeparture": 22500, - "headsign": "899 OLD 4TH WARD - NORTH AVE STN", - "trip": { - "route": { - "shortName": "899" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 76500, - "scheduledDeparture": 76500, - "headsign": "899 OLD 4TH WARD - NORTH AVE STN", - "trip": { - "route": { - "shortName": "899" - } - } - } - ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjIyNS44OTEwMDAwMDAwMDAwMjtVM1J2Y0RwWWNISmxjM002TXpjNQ", - "distance": 225, - "place": { - "__typename": "Stop", - "id": "U3RvcDpYcHJlc3M6Mzc5", - "lat": 33.751302, - "lon": -84.389382, - "name": "Central Ave at MLK Jr Dr", - "code": "600040", - "gtfsId": "Xpress:379", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "485 Hickory Grove", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "485", - "type": 3, - "mode": "BUS", - "longName": "Hickory Grove - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61429, - "scheduledDeparture": 61429, - "headsign": "485 Hickory Grove", - "trip": { - "route": { - "shortName": "485" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59629, - "scheduledDeparture": 59629, - "headsign": "485 Hickory Grove", - "trip": { - "route": { - "shortName": "485" - } - } - } - ] - }, - { - "pattern": { - "headsign": "490 Canton / Woodstock", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "490", - "type": 3, - "mode": "BUS", - "longName": "Woodstock - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60229, - "scheduledDeparture": 60229, - "headsign": "490 Canton / Woodstock", - "trip": { - "route": { - "shortName": "490" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58429, - "scheduledDeparture": 58429, - "headsign": "490 Canton / Woodstock", - "trip": { - "route": { - "shortName": "490" - } - } - } - ] - }, - { - "pattern": { - "headsign": "463 Downtown / Midtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "463", - "type": 3, - "mode": "BUS", - "longName": "W Douglas/Douglas MMTC - DT/MT", - "color": "8e287e", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 27605, - "scheduledDeparture": 27605, - "headsign": "463 Downtown / Midtown", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26885, - "scheduledDeparture": 26885, - "headsign": "463 Downtown / Midtown", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 25175, - "scheduledDeparture": 25175, - "headsign": "463 Downtown / Midtown", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22955, - "scheduledDeparture": 22955, - "headsign": "463 Downtown / Midtown", - "trip": { - "route": { - "shortName": "463" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 21544, - "scheduledDeparture": 21544, - "headsign": "463 Downtown / Midtown", - "trip": { - "route": { - "shortName": "463" - } - } - } - ] - }, - { - "pattern": { - "headsign": "480 Acworth / Town Center", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "480", - "type": 3, - "mode": "BUS", - "longName": "Acworth/Town Center - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61372, - "scheduledDeparture": 61372, - "headsign": "480 Acworth / Town Center", - "trip": { - "route": { - "shortName": "480" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57743, - "scheduledDeparture": 57743, - "headsign": "480 Acworth / Town Center", - "trip": { - "route": { - "shortName": "480" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54143, - "scheduledDeparture": 54143, - "headsign": "480 Acworth / Town Center", - "trip": { - "route": { - "shortName": "480" - } - } - } - ] - }, - { - "pattern": { - "headsign": "476 Downtown / Midtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "476", - "type": 3, - "mode": "BUS", - "longName": "Hiram/Powder Springs - DT/MT", - "color": "8e287e", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 29134, - "scheduledDeparture": 29134, - "headsign": "476 Downtown / Midtown", - "trip": { - "route": { - "shortName": "476" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 27063, - "scheduledDeparture": 27063, - "headsign": "476 Downtown / Midtown", - "trip": { - "route": { - "shortName": "476" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24903, - "scheduledDeparture": 24903, - "headsign": "476 Downtown / Midtown", - "trip": { - "route": { - "shortName": "476" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 21572, - "scheduledDeparture": 21572, - "headsign": "476 Downtown / Midtown", - "trip": { - "route": { - "shortName": "476" - } - } - } - ] - }, - { - "pattern": { - "headsign": "416 Dacula", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "416", - "type": 3, - "mode": "BUS", - "longName": "Dacula - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62272, - "scheduledDeparture": 62272, - "headsign": "416 Dacula", - "trip": { - "route": { - "shortName": "416" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58643, - "scheduledDeparture": 58643, - "headsign": "416 Dacula", - "trip": { - "route": { - "shortName": "416" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55043, - "scheduledDeparture": 55043, - "headsign": "416 Dacula", - "trip": { - "route": { - "shortName": "416" - } - } - } - ] - }, - { - "pattern": { - "headsign": "413 Hamilton Mill / Mall of Georgia", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "413", - "type": 3, - "mode": "BUS", - "longName": "Hamilton Mill/Mall of GA - DT", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61972, - "scheduledDeparture": 61972, - "headsign": "413 Hamilton Mill / Mall of Georgia", - "trip": { - "route": { - "shortName": "413" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58343, - "scheduledDeparture": 58343, - "headsign": "413 Hamilton Mill / Mall of Georgia", - "trip": { - "route": { - "shortName": "413" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54443, - "scheduledDeparture": 54443, - "headsign": "413 Hamilton Mill / Mall of Georgia", - "trip": { - "route": { - "shortName": "413" - } - } - } - ] - }, - { - "pattern": { - "headsign": "400 Cumming", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "400", - "type": 3, - "mode": "BUS", - "longName": "Cumming - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58515, - "scheduledDeparture": 58515, - "headsign": "400 Cumming", - "trip": { - "route": { - "shortName": "400" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56715, - "scheduledDeparture": 56715, - "headsign": "400 Cumming", - "trip": { - "route": { - "shortName": "400" - } - } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28871, - "scheduledDeparture": 28871, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 23949, - "scheduledDeparture": 23949, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26527, - "scheduledDeparture": 26527, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 31329, - "scheduledDeparture": 31329, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 22447, - "scheduledDeparture": 22447, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 20555, - "scheduledDeparture": 20555, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28031, - "scheduledDeparture": 28031, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26500, - "scheduledDeparture": 26500, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - } - ] - }, - { - "pattern": { - "headsign": "419 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "419", - "type": 3, - "mode": "BUS", - "longName": "Snellville/Hewatt/Stone Mtn - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 29260, - "scheduledDeparture": 29260, - "headsign": "419 Downtown", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28480, - "scheduledDeparture": 28480, - "headsign": "419 Downtown", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 26229, - "scheduledDeparture": 26229, - "headsign": "419 Downtown", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24638, - "scheduledDeparture": 24638, - "headsign": "419 Downtown", - "trip": { - "route": { - "shortName": "419" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 21247, - "scheduledDeparture": 21247, - "headsign": "419 Downtown", - "trip": { - "route": { - "shortName": "419" - } - } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 28151, - "scheduledDeparture": 28151, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 24518, - "scheduledDeparture": 24518, - "headsign": "426 Downtown", - "trip": { - "route": { - "shortName": "426" - } - } - } - ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjIyNS44OTEwMDAwMDAwMDAwMjtVM1J2Y0RwSGQybHVibVYwZEVOdmRXNTBlVlJ5WVc1emFYUTZOVE0w", - "distance": 225, - "place": { - "__typename": "Stop", - "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6NTM0", - "lat": 33.751302, - "lon": -84.389382, - "name": "Central Avenue at Martin Luther King Junior Drive", - "code": "600040", - "gtfsId": "GwinnettCountyTransit:534", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "Sweeper", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "SWPR", - "type": 3, - "mode": "BUS", - "longName": "Express PM Sweeper", - "color": "0037ff", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 71180, - "scheduledDeparture": 71180, - "headsign": "Sweeper", - "trip": { - "route": { - "shortName": "SWPR" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 69380, - "scheduledDeparture": 69380, - "headsign": "Sweeper", - "trip": { - "route": { - "shortName": "SWPR" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 67580, - "scheduledDeparture": 67580, - "headsign": "Sweeper", - "trip": { - "route": { - "shortName": "SWPR" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Sugarloaf Mills", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "103", - "type": 3, - "mode": "BUS", - "longName": "Sugarloaf Mills P&R - Downtown Atlanta", - "color": "008852", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57938, - "scheduledDeparture": 57938, - "headsign": "Sugarloaf Mills", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57338, - "scheduledDeparture": 57338, - "headsign": "Sugarloaf Mills", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56738, - "scheduledDeparture": 56738, - "headsign": "Sugarloaf Mills", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55538, - "scheduledDeparture": 55538, - "headsign": "Sugarloaf Mills", - "trip": { - "route": { - "shortName": "103" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54338, - "scheduledDeparture": 54338, - "headsign": "Sugarloaf Mills", - "trip": { - "route": { - "shortName": "103" - } - } - } - ] - }, - { - "pattern": { - "headsign": "I-985 P&R", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "101", - "type": 3, - "mode": "BUS", - "longName": "I-985 P&R - Downtown Atlanta", - "color": "E7A614", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61958, - "scheduledDeparture": 61958, - "headsign": "I-985 P&R", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60158, - "scheduledDeparture": 60158, - "headsign": "I-985 P&R", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58358, - "scheduledDeparture": 58358, - "headsign": "I-985 P&R", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56558, - "scheduledDeparture": 56558, - "headsign": "I-985 P&R", - "trip": { - "route": { - "shortName": "101" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54758, - "scheduledDeparture": 54758, - "headsign": "I-985 P&R", - "trip": { - "route": { - "shortName": "101" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Indian Trail P&R", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "102", - "type": 3, - "mode": "BUS", - "longName": "Indian Trail P&R - Downtown Atlanta", - "color": "A0CF67", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 64118, - "scheduledDeparture": 64118, - "headsign": "Indian Trail P&R", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62318, - "scheduledDeparture": 62318, - "headsign": "Indian Trail P&R", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60518, - "scheduledDeparture": 60518, - "headsign": "Indian Trail P&R", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58718, - "scheduledDeparture": 58718, - "headsign": "Indian Trail P&R", - "trip": { - "route": { - "shortName": "102" - } - } - }, - { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55118, - "scheduledDeparture": 55118, - "headsign": "Indian Trail P&R", - "trip": { - "route": { - "shortName": "102" - } - } - } - ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjI3OC4xNjg7VTNSdmNEcE5RVkpVUVRveE1ESXdOakk", - "distance": 278, - "place": { - "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxMDIwNjI", - "lat": 33.75141, - "lon": -84.39075, - "name": "Martin Luther King J Dr SW at Pryor St", - "code": "102062", - "gtfsId": "MARTA:102062", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "Five Points Station", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "42", - "type": 3, - "mode": "BUS", - "longName": "Pryor Road", - "color": "FF8000", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 83311, - "scheduledDeparture": 83311, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "42" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 80911, - "scheduledDeparture": 80911, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "42" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 78511, - "scheduledDeparture": 78511, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "42" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -151, - "realtimeState": "UPDATED", - "realtimeDeparture": 75960, - "scheduledDeparture": 76111, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "42" - } - } - }, + "headsign": "INDIAN CREEK STATION", + "name": "Blue to Indian Creek Station (MARTA:801) from Five Points Station (MARTA:797)", + "route": { + "gtfsId": "MARTA:23701", + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "Blue", + "type": 1, + "mode": "SUBWAY", + "longName": "Blue", + "color": "0075B2", + "textColor": "000000" + } + }, + "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 73711, - "scheduledDeparture": 73711, - "headsign": "Five Points Station", + "realtimeDeparture": 93600, + "scheduledDeparture": 93600, + "headsign": "INDIAN CREEK STATION", "trip": { "route": { - "shortName": "42" + "shortName": "Blue" } } } @@ -3291,167 +198,202 @@ }, { "pattern": { - "headsign": "Five Points Station", + "headsign": "INDIAN CREEK STATION", + "name": "Blue to Indian Creek Station (MARTA:801) from Hamilton E Holmes Station (MARTA:27)", "route": { + "gtfsId": "MARTA:23701", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "21", - "type": 3, - "mode": "BUS", - "longName": "Memorial Drive", - "color": "FF00FF", + "shortName": "Blue", + "type": 1, + "mode": "SUBWAY", + "longName": "Blue", + "color": "0075B2", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80735, - "scheduledDeparture": 80735, - "headsign": "Five Points Station", + "realtimeDeparture": 77340, + "scheduledDeparture": 77340, + "headsign": "INDIAN CREEK STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78935, - "scheduledDeparture": 78935, - "headsign": "Five Points Station", + "realtimeDeparture": 76140, + "scheduledDeparture": 76140, + "headsign": "INDIAN CREEK STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 77135, - "scheduledDeparture": 77135, - "headsign": "Five Points Station", + "realtimeDeparture": 74940, + "scheduledDeparture": 74940, + "headsign": "INDIAN CREEK STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, - "departureDelay": -142, - "realtimeState": "UPDATED", - "realtimeDeparture": 75193, - "scheduledDeparture": 75335, - "headsign": "Five Points Station", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73740, + "scheduledDeparture": 73740, + "headsign": "INDIAN CREEK STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } }, { - "serviceDay": 1698638400, - "departureDelay": -6, - "realtimeState": "UPDATED", - "realtimeDeparture": 73529, - "scheduledDeparture": 73535, - "headsign": "Five Points Station", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 72540, + "scheduledDeparture": 72540, + "headsign": "INDIAN CREEK STATION", "trip": { "route": { - "shortName": "21" + "shortName": "Blue" } } } ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjExNS4yNTM1O1UzUnZjRHBOUVZKVVFUbzROVGt3TWc", + "distance": 115, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTkwMg", + "lat": 33.775634, + "lon": -84.28177, + "name": "Avondale Station - North Loop", + "code": "904264", + "gtfsId": "MARTA:85902", + "routes": [ + { + "gtfsId": "MARTA:23638" + }, + { + "gtfsId": "MARTA:23708" }, + { + "gtfsId": "MARTA:23709" + }, + { + "gtfsId": "MARTA:23633" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "Five Points Station via Amal Drive", + "headsign": "Avondale Station via Lou Walker Center", + "name": "117 Avondale Station via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "42", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Pryor Road", - "color": "FF8000", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 35416, - "scheduledDeparture": 35416, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 53700, + "scheduledDeparture": 53700, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 30662, - "scheduledDeparture": 30662, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 50100, + "scheduledDeparture": 50100, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27062, - "scheduledDeparture": 27062, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 46500, + "scheduledDeparture": 46500, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23462, - "scheduledDeparture": 23462, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 42900, + "scheduledDeparture": 42900, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 18571, - "scheduledDeparture": 18571, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 39300, + "scheduledDeparture": 39300, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } } @@ -3459,242 +401,171 @@ }, { "pattern": { - "headsign": "Five Points Station via Cooper Street", + "headsign": "Xpress Panola Road Park & Ride", + "name": "117 Xpress Panola Road Park & Ride", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "42", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Pryor Road", - "color": "FF8000", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28921, - "scheduledDeparture": 28921, - "headsign": "Five Points Station via Cooper Street", + "realtimeDeparture": 79800, + "scheduledDeparture": 79800, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25321, - "scheduledDeparture": 25321, - "headsign": "Five Points Station via Cooper Street", + "realtimeDeparture": 78000, + "scheduledDeparture": 78000, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 21026, - "scheduledDeparture": 21026, - "headsign": "Five Points Station via Cooper Street", - "trip": { - "route": { - "shortName": "42" - } - } - } - ] - }, - { - "pattern": { - "headsign": "Five Points Station", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "55", - "type": 3, - "mode": "BUS", - "longName": "Jonesboro Road", - "color": "FF8000", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80040, - "scheduledDeparture": 80040, - "headsign": "Five Points Station", + "realtimeDeparture": 76200, + "scheduledDeparture": 76200, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "55" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78240, - "scheduledDeparture": 78240, - "headsign": "Five Points Station", + "realtimeDeparture": 74400, + "scheduledDeparture": 74400, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "55" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76440, - "scheduledDeparture": 76440, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "55" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": -4, - "realtimeState": "UPDATED", - "realtimeDeparture": 74636, - "scheduledDeparture": 74640, - "headsign": "Five Points Station", - "trip": { - "route": { - "shortName": "55" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 561, - "realtimeState": "UPDATED", - "realtimeDeparture": 73401, - "scheduledDeparture": 72840, - "headsign": "Five Points Station", + "realtimeDeparture": 72600, + "scheduledDeparture": 72600, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "55" + "shortName": "117" } } } ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMwNi44MTAwMDAwMDAwMDAwNjtVM1J2Y0RwTlFWSlVRVG94TURJeU5qSQ", - "distance": 306, - "place": { - "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxMDIyNjI", - "lat": 33.74963, - "lon": -84.390687, - "name": "Mitchell St SW at Central Ave SW", - "code": "600037", - "gtfsId": "MARTA:102262", - "stoptimesForPatterns": [ + }, { "pattern": { - "headsign": "Kensington Station", + "headsign": "Goldsmith Park & Ride", + "name": "120 Goldsmith Park & Ride", "route": { + "gtfsId": "MARTA:23638", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "21", + "shortName": "120", "type": 3, "mode": "BUS", - "longName": "Memorial Drive", + "longName": "East Ponce De Leon Avenue", "color": "FF00FF", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 82025, - "scheduledDeparture": 82025, - "headsign": "Kensington Station", + "realtimeDeparture": 80400, + "scheduledDeparture": 80400, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "21" + "shortName": "120" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80225, - "scheduledDeparture": 80225, - "headsign": "Kensington Station", + "realtimeDeparture": 78600, + "scheduledDeparture": 78600, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "21" + "shortName": "120" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78425, - "scheduledDeparture": 78425, - "headsign": "Kensington Station", + "realtimeDeparture": 76800, + "scheduledDeparture": 76800, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "21" + "shortName": "120" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76625, - "scheduledDeparture": 76625, - "headsign": "Kensington Station", + "realtimeDeparture": 75000, + "scheduledDeparture": 75000, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "21" + "shortName": "120" } } }, { - "serviceDay": 1698638400, - "departureDelay": 283, - "realtimeState": "UPDATED", - "realtimeDeparture": 75108, - "scheduledDeparture": 74825, - "headsign": "Kensington Station", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73200, + "scheduledDeparture": 73200, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "21" + "shortName": "120" } } } @@ -3702,158 +573,85 @@ }, { "pattern": { - "headsign": "Forest Park", + "headsign": "Fairington Parkway", + "name": "117 Fairington Parkway", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "55", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Jonesboro Road", - "color": "FF8000", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 81107, - "scheduledDeparture": 81107, - "headsign": "Forest Park", - "trip": { - "route": { - "shortName": "55" - } - } - }, - { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 79307, - "scheduledDeparture": 79307, - "headsign": "Forest Park", + "realtimeDeparture": 62700, + "scheduledDeparture": 62700, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "55" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 77507, - "scheduledDeparture": 77507, - "headsign": "Forest Park", - "trip": { - "route": { - "shortName": "55" - } - } - }, - { - "serviceDay": 1698638400, - "departureDelay": 30, - "realtimeState": "UPDATED", - "realtimeDeparture": 75737, - "scheduledDeparture": 75707, - "headsign": "Forest Park", + "realtimeDeparture": 60900, + "scheduledDeparture": 60900, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "55" + "shortName": "117" } } }, { - "serviceDay": 1698638400, - "departureDelay": 293, - "realtimeState": "UPDATED", - "realtimeDeparture": 74200, - "scheduledDeparture": 73907, - "headsign": "Forest Park", - "trip": { - "route": { - "shortName": "55" - } - } - } - ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMwOS4xMjgwMDAwMDAwMDAwNDtVM1J2Y0RwSGQybHVibVYwZEVOdmRXNTBlVlJ5WVc1emFYUTZNalE", - "distance": 309, - "place": { - "__typename": "Stop", - "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6MjQ", - "lat": 33.749523, - "lon": -84.3907, - "name": "Central Avenue Southwest at Mitchell Street Southwest", - "code": "600024", - "gtfsId": "GwinnettCountyTransit:24", - "stoptimesForPatterns": [ - { - "pattern": { - "headsign": "Sweeper", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "SWPR", - "type": 3, - "mode": "BUS", - "longName": "Express PM Sweeper", - "color": "0037ff", - "textColor": "ffffff" - } - }, - "stoptimes": [ - { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 71100, - "scheduledDeparture": 71100, - "headsign": "Sweeper", + "realtimeDeparture": 59100, + "scheduledDeparture": 59100, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "SWPR" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 69300, - "scheduledDeparture": 69300, - "headsign": "Sweeper", + "realtimeDeparture": 57300, + "scheduledDeparture": 57300, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "SWPR" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 67500, - "scheduledDeparture": 67500, - "headsign": "Sweeper", + "realtimeDeparture": 55500, + "scheduledDeparture": 55500, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "SWPR" + "shortName": "117" } } } @@ -3861,83 +659,85 @@ }, { "pattern": { - "headsign": "Sugarloaf Mills", + "headsign": "Avondale Station", + "name": "120 Avondale Station", "route": { + "gtfsId": "MARTA:23638", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "103", + "shortName": "120", "type": 3, "mode": "BUS", - "longName": "Sugarloaf Mills P&R - Downtown Atlanta", - "color": "008852", - "textColor": "ffffff" + "longName": "East Ponce De Leon Avenue", + "color": "FF00FF", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 57300, - "scheduledDeparture": 57300, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 79500, + "scheduledDeparture": 79500, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 56700, - "scheduledDeparture": 56700, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 77700, + "scheduledDeparture": 77700, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 56100, - "scheduledDeparture": 56100, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 75900, + "scheduledDeparture": 75900, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54900, - "scheduledDeparture": 54900, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 74100, + "scheduledDeparture": 74100, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 53700, - "scheduledDeparture": 53700, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 72300, + "scheduledDeparture": 72300, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103" + "shortName": "120" } } } @@ -3945,83 +745,85 @@ }, { "pattern": { - "headsign": "I-985 P&R", + "headsign": "Avondale Station", + "name": "114 Avondale Station", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "101", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "I-985 P&R - Downtown Atlanta", - "color": "E7A614", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 61380, - "scheduledDeparture": 61380, - "headsign": "I-985 P&R", + "realtimeDeparture": 82500, + "scheduledDeparture": 82500, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 59580, - "scheduledDeparture": 59580, - "headsign": "I-985 P&R", + "realtimeDeparture": 80100, + "scheduledDeparture": 80100, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 57780, - "scheduledDeparture": 57780, - "headsign": "I-985 P&R", + "realtimeDeparture": 77700, + "scheduledDeparture": 77700, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 55980, - "scheduledDeparture": 55980, - "headsign": "I-985 P&R", + "realtimeDeparture": 75300, + "scheduledDeparture": 75300, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54180, - "scheduledDeparture": 54180, - "headsign": "I-985 P&R", + "realtimeDeparture": 72900, + "scheduledDeparture": 72900, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } } @@ -4029,171 +831,171 @@ }, { "pattern": { - "headsign": "Indian Trail P&R", + "headsign": "Avondale Station", + "name": "117 Avondale Station", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "102", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Indian Trail P&R - Downtown Atlanta", - "color": "A0CF67", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 63480, - "scheduledDeparture": 63480, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 80700, + "scheduledDeparture": 80700, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 61680, - "scheduledDeparture": 61680, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 78900, + "scheduledDeparture": 78900, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 59880, - "scheduledDeparture": 59880, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 77100, + "scheduledDeparture": 77100, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58080, - "scheduledDeparture": 58080, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 75300, + "scheduledDeparture": 75300, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54480, - "scheduledDeparture": 54480, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 73500, + "scheduledDeparture": 73500, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "117" } } } ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMwOS4xMjgwMDAwMDAwMDAwNDtVM1J2Y0RwWWNISmxjM002TXpjeg", - "distance": 309, - "place": { - "__typename": "Stop", - "id": "U3RvcDpYcHJlc3M6Mzcz", - "lat": 33.749524, - "lon": -84.3907, - "name": "Central Ave at Mitchell St", - "code": "600024", - "gtfsId": "Xpress:373", - "stoptimesForPatterns": [ + }, { "pattern": { - "headsign": "453 Downtown / Midtown", + "headsign": "Avondale Station via Clifton Springs Health Center", + "name": "114 Avondale Station via Clifton Springs Health Center", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "453", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Newnan/Union City - DT/MT", - "color": "f44d23", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 39300, + "scheduledDeparture": 39300, + "headsign": "Avondale Station via Clifton Springs Health Center", + "trip": { + "route": { + "shortName": "114" + } + } + }, + { + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28770, - "scheduledDeparture": 28770, - "headsign": "453 Downtown / Midtown", + "realtimeDeparture": 36900, + "scheduledDeparture": 36900, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "453" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26969, - "scheduledDeparture": 26969, - "headsign": "453 Downtown / Midtown", + "realtimeDeparture": 34500, + "scheduledDeparture": 34500, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "453" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24932, - "scheduledDeparture": 24932, - "headsign": "453 Downtown / Midtown", + "realtimeDeparture": 32400, + "scheduledDeparture": 32400, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "453" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 22778, - "scheduledDeparture": 22778, - "headsign": "453 Downtown / Midtown", + "realtimeDeparture": 30000, + "scheduledDeparture": 30000, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "453" + "shortName": "114" } } } @@ -4201,83 +1003,85 @@ }, { "pattern": { - "headsign": "432 Downtown", + "headsign": "GSU Perimeter College", + "name": "114 GSU Perimeter College", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "432", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "BrandsMart/Stockbridge - DT", - "color": "f44d23", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 29970, - "scheduledDeparture": 29970, - "headsign": "432 Downtown", + "realtimeDeparture": 83400, + "scheduledDeparture": 83400, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "432" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27989, - "scheduledDeparture": 27989, - "headsign": "432 Downtown", + "realtimeDeparture": 81000, + "scheduledDeparture": 81000, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "432" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25359, - "scheduledDeparture": 25359, - "headsign": "432 Downtown", + "realtimeDeparture": 78600, + "scheduledDeparture": 78600, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "432" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24155, - "scheduledDeparture": 24155, - "headsign": "432 Downtown", + "realtimeDeparture": 76200, + "scheduledDeparture": 76200, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "432" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21404, - "scheduledDeparture": 21404, - "headsign": "432 Downtown", + "realtimeDeparture": 73800, + "scheduledDeparture": 73800, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "432" + "shortName": "114" } } } @@ -4285,70 +1089,85 @@ }, { "pattern": { - "headsign": "440 Downtown / Midtown", + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", + "name": "117 Xpress Panola Road Park & Ride via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "440", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Hampton/Jonesboro - DT/MT", - "color": "f44d23", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 47400, + "scheduledDeparture": 47400, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 31710, - "scheduledDeparture": 31710, - "headsign": "440 Downtown / Midtown", + "realtimeDeparture": 43800, + "scheduledDeparture": 43800, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "440" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28465, - "scheduledDeparture": 28465, - "headsign": "440 Downtown / Midtown", + "realtimeDeparture": 40200, + "scheduledDeparture": 40200, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "440" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24568, - "scheduledDeparture": 24568, - "headsign": "440 Downtown / Midtown", + "realtimeDeparture": 36600, + "scheduledDeparture": 36600, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "440" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21218, - "scheduledDeparture": 21218, - "headsign": "440 Downtown / Midtown", + "realtimeDeparture": 33000, + "scheduledDeparture": 33000, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "440" + "shortName": "117" } } } @@ -4356,102 +1175,85 @@ }, { "pattern": { - "headsign": "442 Downtown", + "headsign": "Avondale Station", + "name": "75 Avondale Station", "route": { + "gtfsId": "MARTA:23708", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "442", + "shortName": "75", "type": 3, "mode": "BUS", - "longName": "Riverdale - Downtown", - "color": "f44d23", - "textColor": "ffffff" + "longName": "Lawrenceville Highway", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26487, - "scheduledDeparture": 26487, - "headsign": "442 Downtown", + "realtimeDeparture": 83700, + "scheduledDeparture": 83700, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "442" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 20923, - "scheduledDeparture": 20923, - "headsign": "442 Downtown", + "realtimeDeparture": 81000, + "scheduledDeparture": 81000, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "442" + "shortName": "75" } } - } - ] - }, - { - "pattern": { - "headsign": "441 Downtown / Midtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "441", - "type": 3, - "mode": "BUS", - "longName": "Jonesboro - Downtown/Midtown", - "color": "f44d23", - "textColor": "ffffff" - } - }, - "stoptimes": [ + }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27446, - "scheduledDeparture": 27446, - "headsign": "441 Downtown / Midtown", + "realtimeDeparture": 78300, + "scheduledDeparture": 78300, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "441" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25468, - "scheduledDeparture": 25468, - "headsign": "441 Downtown / Midtown", + "realtimeDeparture": 75600, + "scheduledDeparture": 75600, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "441" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21941, - "scheduledDeparture": 21941, - "headsign": "441 Downtown / Midtown", + "realtimeDeparture": 72900, + "scheduledDeparture": 72900, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "441" + "shortName": "75" } } } @@ -4459,83 +1261,85 @@ }, { "pattern": { - "headsign": "430 Downtown", + "headsign": "Royal Atlanta Business Park", + "name": "75 Royal Atlanta Business Park", "route": { + "gtfsId": "MARTA:23708", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "430", + "shortName": "75", "type": 3, "mode": "BUS", - "longName": "McDonough - Downtown", - "color": "f44d23", - "textColor": "ffffff" + "longName": "Lawrenceville Highway", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 30093, - "scheduledDeparture": 30093, - "headsign": "430 Downtown", + "realtimeDeparture": 22200, + "scheduledDeparture": 22200, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "430" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27396, - "scheduledDeparture": 27396, - "headsign": "430 Downtown", + "realtimeDeparture": 81900, + "scheduledDeparture": 81900, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "430" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26434, - "scheduledDeparture": 26434, - "headsign": "430 Downtown", + "realtimeDeparture": 79200, + "scheduledDeparture": 79200, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "430" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24520, - "scheduledDeparture": 24520, - "headsign": "430 Downtown", + "realtimeDeparture": 76500, + "scheduledDeparture": 76500, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "430" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 22960, - "scheduledDeparture": 22960, - "headsign": "430 Downtown", + "realtimeDeparture": 73800, + "scheduledDeparture": 73800, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "430" + "shortName": "75" } } } @@ -4547,96 +1351,118 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMwOS42NTA1O1UzUnZjRHBOUVZKVVFUb3hNREl3TkRR", - "distance": 309, + "id": "cGxhY2VBdERpc3RhbmNlOjExOC43MTY1O1ZtVm9hV05zWlZCaGNtdHBibWM2VDFOTk9rOXpiVmRoZVM4ek9Ea3pPREl6Tmc", + "distance": 118, + "place": { + "__typename": "VehicleParking", + "id": "VmVoaWNsZVBhcmtpbmc6T1NNOk9zbVdheS8zODkzODIzNg", + "lat": 33.7750477, + "lon": -84.2838922, + "carPlaces": true, + "bicyclePlaces": false, + "name": "Avondale North Park and Ride" + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjEyNS41MTE0OTk5OTU5MzE5NztVM1J2Y0RwTlFWSlVRVG80TlRrd05B", + "distance": 125, "place": { "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxMDIwNDQ", - "lat": 33.7523, - "lon": -84.386449, - "name": "Decatur St SE at Collins St SE", - "code": "102044", - "gtfsId": "MARTA:102044", + "id": "U3RvcDpNQVJUQTo4NTkwNA", + "lat": 33.774493, + "lon": -84.282238, + "name": "Avondale Station - E College Ave (South)", + "code": "210548", + "gtfsId": "MARTA:85904", + "routes": [ + { + "gtfsId": "MARTA:23633" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "Five Points Station via East Side Drive", + "headsign": "Avondale Station", + "name": "114 Avondale Station", "route": { + "gtfsId": "MARTA:23633", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "186", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Rainbow Drive / South Dekalb", - "color": "00FF00", + "longName": "Columbia Drive", + "color": "FF8040", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 82115, - "scheduledDeparture": 82115, - "headsign": "Five Points Station via East Side Drive", + "realtimeDeparture": 82391, + "scheduledDeparture": 82391, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80315, - "scheduledDeparture": 80315, - "headsign": "Five Points Station via East Side Drive", + "realtimeDeparture": 79991, + "scheduledDeparture": 79991, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78515, - "scheduledDeparture": 78515, - "headsign": "Five Points Station via East Side Drive", + "realtimeDeparture": 77591, + "scheduledDeparture": 77591, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698638400, - "departureDelay": 83, - "realtimeState": "UPDATED", - "realtimeDeparture": 76798, - "scheduledDeparture": 76715, - "headsign": "Five Points Station via East Side Drive", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 75191, + "scheduledDeparture": 75191, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698638400, - "departureDelay": -310, - "realtimeState": "UPDATED", - "realtimeDeparture": 74605, - "scheduledDeparture": 74915, - "headsign": "Five Points Station via East Side Drive", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 72791, + "scheduledDeparture": 72791, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } } @@ -4644,83 +1470,85 @@ }, { "pattern": { - "headsign": "Five Points Station", + "headsign": "Avondale Station via Clifton Springs Health Center", + "name": "114 Avondale Station via Clifton Springs Health Center", "route": { + "gtfsId": "MARTA:23633", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "186", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Rainbow Drive / South Dekalb", - "color": "00FF00", + "longName": "Columbia Drive", + "color": "FF8040", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26885, - "scheduledDeparture": 26885, - "headsign": "Five Points Station", + "realtimeDeparture": 39199, + "scheduledDeparture": 39199, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25085, - "scheduledDeparture": 25085, - "headsign": "Five Points Station", + "realtimeDeparture": 36799, + "scheduledDeparture": 36799, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23285, - "scheduledDeparture": 23285, - "headsign": "Five Points Station", + "realtimeDeparture": 34399, + "scheduledDeparture": 34399, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21485, - "scheduledDeparture": 21485, - "headsign": "Five Points Station", + "realtimeDeparture": 32282, + "scheduledDeparture": 32282, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 19715, - "scheduledDeparture": 19715, - "headsign": "Five Points Station", + "realtimeDeparture": 29882, + "scheduledDeparture": 29882, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "186" + "shortName": "114" } } } @@ -4732,96 +1560,106 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMwOS43ODM7VTNSdmNEcE5RVkpVUVRveE1ESXdOakE", - "distance": 309, + "id": "cGxhY2VBdERpc3RhbmNlOjM2NS4zOTY7VTNSdmNEcE5RVkpVUVRvNE5UUTFPQQ", + "distance": 365, "place": { "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxMDIwNjA", - "lat": 33.749512, - "lon": -84.390693, - "name": "Central Ave SW at Mitchell St SW", - "code": "600024", - "gtfsId": "MARTA:102060", + "id": "U3RvcDpNQVJUQTo4NTQ1OA", + "lat": 33.776657, + "lon": -84.280273, + "name": "N Arcadia Ave at E Ponce De Leon Ave", + "code": "904940", + "gtfsId": "MARTA:85458", + "routes": [ + { + "gtfsId": "MARTA:23708" + }, + { + "gtfsId": "MARTA:23709" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "Five Points Station", + "headsign": "Xpress Panola Road Park & Ride", + "name": "117 Xpress Panola Road Park & Ride", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "42", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Pryor Road", - "color": "FF8000", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 83271, - "scheduledDeparture": 83271, - "headsign": "Five Points Station", + "realtimeDeparture": 79828, + "scheduledDeparture": 79828, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80871, - "scheduledDeparture": 80871, - "headsign": "Five Points Station", + "realtimeDeparture": 78028, + "scheduledDeparture": 78028, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78471, - "scheduledDeparture": 78471, - "headsign": "Five Points Station", + "realtimeDeparture": 76228, + "scheduledDeparture": 76228, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698638400, - "departureDelay": -151, - "realtimeState": "UPDATED", - "realtimeDeparture": 75920, - "scheduledDeparture": 76071, - "headsign": "Five Points Station", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 74428, + "scheduledDeparture": 74428, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 73671, - "scheduledDeparture": 73671, - "headsign": "Five Points Station", + "realtimeDeparture": 72628, + "scheduledDeparture": 72628, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } } @@ -4829,83 +1667,85 @@ }, { "pattern": { - "headsign": "Five Points Station via Amal Drive", + "headsign": "Fairington Parkway", + "name": "117 Fairington Parkway", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "42", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Pryor Road", - "color": "FF8000", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 35369, - "scheduledDeparture": 35369, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 62741, + "scheduledDeparture": 62741, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 30608, - "scheduledDeparture": 30608, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 60941, + "scheduledDeparture": 60941, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27008, - "scheduledDeparture": 27008, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 59141, + "scheduledDeparture": 59141, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23408, - "scheduledDeparture": 23408, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 57341, + "scheduledDeparture": 57341, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 18531, - "scheduledDeparture": 18531, - "headsign": "Five Points Station via Amal Drive", + "realtimeDeparture": 55541, + "scheduledDeparture": 55541, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } } @@ -4913,242 +1753,279 @@ }, { "pattern": { - "headsign": "Five Points Station via Cooper Street", + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", + "name": "117 Xpress Panola Road Park & Ride via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "42", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Pryor Road", - "color": "FF8000", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 47436, + "scheduledDeparture": 47436, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729828800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 43836, + "scheduledDeparture": 43836, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28867, - "scheduledDeparture": 28867, - "headsign": "Five Points Station via Cooper Street", + "realtimeDeparture": 40236, + "scheduledDeparture": 40236, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25267, - "scheduledDeparture": 25267, - "headsign": "Five Points Station via Cooper Street", + "realtimeDeparture": 36636, + "scheduledDeparture": 36636, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 20984, - "scheduledDeparture": 20984, - "headsign": "Five Points Station via Cooper Street", + "realtimeDeparture": 33036, + "scheduledDeparture": 33036, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "42" + "shortName": "117" } } } ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMxMy44MjE7VTNSdmNEcE5RVkpVUVRveE1ESXdNekk", - "distance": 313, - "place": { - "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxMDIwMzI", - "lat": 33.751593, - "lon": -84.391066, - "name": "Pryor St at Martin L King Jr Dr", - "code": "102032", - "gtfsId": "MARTA:102032", - "stoptimesForPatterns": [ + }, { "pattern": { - "headsign": "Five Points Station via East Side Drive", + "headsign": "Royal Atlanta Business Park", + "name": "75 Royal Atlanta Business Park", "route": { + "gtfsId": "MARTA:23708", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "186", + "shortName": "75", "type": 3, "mode": "BUS", - "longName": "Rainbow Drive / South Dekalb", + "longName": "Lawrenceville Highway", "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 80368, - "scheduledDeparture": 80368, - "headsign": "Five Points Station via East Side Drive", + "realtimeDeparture": 22235, + "scheduledDeparture": 22235, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "186" + "shortName": "75" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78568, - "scheduledDeparture": 78568, - "headsign": "Five Points Station via East Side Drive", + "realtimeDeparture": 81931, + "scheduledDeparture": 81931, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "186" + "shortName": "75" } } }, { - "serviceDay": 1698638400, - "departureDelay": 83, - "realtimeState": "UPDATED", - "realtimeDeparture": 76851, - "scheduledDeparture": 76768, - "headsign": "Five Points Station via East Side Drive", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 79231, + "scheduledDeparture": 79231, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "186" + "shortName": "75" } } }, { - "serviceDay": 1698638400, - "departureDelay": -238, - "realtimeState": "UPDATED", - "realtimeDeparture": 74730, - "scheduledDeparture": 74968, - "headsign": "Five Points Station via East Side Drive", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76531, + "scheduledDeparture": 76531, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "186" + "shortName": "75" } } }, { - "serviceDay": 1698638400, - "departureDelay": 138, - "realtimeState": "UPDATED", - "realtimeDeparture": 73306, - "scheduledDeparture": 73168, - "headsign": "Five Points Station via East Side Drive", + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73831, + "scheduledDeparture": 73831, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "186" + "shortName": "75" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjQwNC4wODM0OTk5OTk5OTk5NjtVM1J2Y0RwTlFWSlVRVG80TlRFeE5B", + "distance": 404, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTExNA", + "lat": 33.776743, + "lon": -84.279203, + "name": "E Ponce De Leon Ave at Grove Pl", + "code": "905079", + "gtfsId": "MARTA:85114", + "routes": [ + { + "gtfsId": "MARTA:23638" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "Five Points Station", + "headsign": "Goldsmith Park & Ride", + "name": "120 Goldsmith Park & Ride", "route": { + "gtfsId": "MARTA:23638", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "186", + "shortName": "120", "type": 3, "mode": "BUS", - "longName": "Rainbow Drive / South Dekalb", - "color": "00FF00", + "longName": "East Ponce De Leon Avenue", + "color": "FF00FF", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26958, - "scheduledDeparture": 26958, - "headsign": "Five Points Station", + "realtimeDeparture": 80436, + "scheduledDeparture": 80436, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "186" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25158, - "scheduledDeparture": 25158, - "headsign": "Five Points Station", + "realtimeDeparture": 78636, + "scheduledDeparture": 78636, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "186" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23358, - "scheduledDeparture": 23358, - "headsign": "Five Points Station", + "realtimeDeparture": 76836, + "scheduledDeparture": 76836, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "186" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21558, - "scheduledDeparture": 21558, - "headsign": "Five Points Station", + "realtimeDeparture": 75036, + "scheduledDeparture": 75036, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "186" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 19768, - "scheduledDeparture": 19768, - "headsign": "Five Points Station", + "realtimeDeparture": 73236, + "scheduledDeparture": 73236, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "186" + "shortName": "120" } } } @@ -5160,96 +2037,106 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMyMi44OTQ1MDAwMDAwMDAwNTtVM1J2Y0RwSGQybHVibVYwZEVOdmRXNTBlVlJ5WVc1emFYUTZOVEl3", - "distance": 322, + "id": "cGxhY2VBdERpc3RhbmNlOjQwNS4wMTQ1O1UzUnZjRHBOUVZKVVFUbzROVFExTmc", + "distance": 405, "place": { "__typename": "Stop", - "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6NTIw", - "lat": 33.749667, - "lon": -84.390799, - "name": "Mitchell Street Southwest at Central Avenue Southwest", - "code": "600037", - "gtfsId": "GwinnettCountyTransit:520", + "id": "U3RvcDpNQVJUQTo4NTQ1Ng", + "lat": 33.777575, + "lon": -84.28062, + "name": "N Arcadia Ave at E Ponce De Leon Ave", + "code": "904820", + "gtfsId": "MARTA:85456", + "routes": [ + { + "gtfsId": "MARTA:23708" + }, + { + "gtfsId": "MARTA:23709" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "Downtown Atlanta", + "headsign": "Avondale Station via Lou Walker Center", + "name": "117 Avondale Station via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "103", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Sugarloaf Mills P&R - Downtown Atlanta", - "color": "008852", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27720, - "scheduledDeparture": 27720, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 53616, + "scheduledDeparture": 53616, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "103" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26400, - "scheduledDeparture": 26400, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 50016, + "scheduledDeparture": 50016, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "103" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24600, - "scheduledDeparture": 24600, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 46416, + "scheduledDeparture": 46416, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "103" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23400, - "scheduledDeparture": 23400, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 42816, + "scheduledDeparture": 42816, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "103" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21900, - "scheduledDeparture": 21900, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 39216, + "scheduledDeparture": 39216, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "103" + "shortName": "117" } } } @@ -5257,83 +2144,85 @@ }, { "pattern": { - "headsign": "Downtown Atlanta", + "headsign": "Avondale Station", + "name": "117 Avondale Station", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "101", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "I-985 P&R - Downtown Atlanta", - "color": "E7A614", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 31140, - "scheduledDeparture": 31140, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 80634, + "scheduledDeparture": 80634, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 29040, - "scheduledDeparture": 29040, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 78834, + "scheduledDeparture": 78834, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26700, - "scheduledDeparture": 26700, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 77034, + "scheduledDeparture": 77034, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24900, - "scheduledDeparture": 24900, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 75234, + "scheduledDeparture": 75234, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23100, - "scheduledDeparture": 23100, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 73434, + "scheduledDeparture": 73434, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "117" } } } @@ -5341,83 +2230,85 @@ }, { "pattern": { - "headsign": "Downtown Atlanta", + "headsign": "Avondale Station", + "name": "75 Avondale Station", "route": { + "gtfsId": "MARTA:23708", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "102", + "shortName": "75", "type": 3, "mode": "BUS", - "longName": "Indian Trail P&R - Downtown Atlanta", - "color": "A0CF67", + "longName": "Lawrenceville Highway", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 30480, - "scheduledDeparture": 30480, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 83639, + "scheduledDeparture": 83639, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28680, - "scheduledDeparture": 28680, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 80939, + "scheduledDeparture": 80939, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26700, - "scheduledDeparture": 26700, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 78239, + "scheduledDeparture": 78239, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24900, - "scheduledDeparture": 24900, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 75539, + "scheduledDeparture": 75539, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23100, - "scheduledDeparture": 23100, - "headsign": "Downtown Atlanta", + "realtimeDeparture": 72839, + "scheduledDeparture": 72839, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "102" + "shortName": "75" } } } @@ -5429,96 +2320,103 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMyNi4zODMwMDAwMDAwMDAxO1UzUnZjRHBOUVZKVVFUb3hPVGc", - "distance": 326, + "id": "cGxhY2VBdERpc3RhbmNlOjQxMi44NzU0OTk5OTU5MzI7VTNSdmNEcE5RVkpVUVRvNE5UVXpOZw", + "distance": 412, "place": { "__typename": "Stop", - "id": "U3RvcDpNQVJUQToxOTg", - "lat": 33.750161, - "lon": -84.385915, - "name": "Georgia State Station", - "code": "908618", - "gtfsId": "MARTA:198", + "id": "U3RvcDpNQVJUQTo4NTUzNg", + "lat": 33.773624, + "lon": -84.285129, + "name": "E College Ave at New St", + "code": "904451", + "gtfsId": "MARTA:85536", + "routes": [ + { + "gtfsId": "MARTA:23633" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "BANKHEAD STATION", + "headsign": "Avondale Station", + "name": "114 Avondale Station", "route": { + "gtfsId": "MARTA:23633", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "Green", - "type": 1, - "mode": "SUBWAY", - "longName": "Green", - "color": "009D4B", + "shortName": "114", + "type": 3, + "mode": "BUS", + "longName": "Columbia Drive", + "color": "FF8040", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 18720, - "scheduledDeparture": 18720, - "headsign": "BANKHEAD STATION", + "realtimeDeparture": 82358, + "scheduledDeparture": 82358, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 17520, - "scheduledDeparture": 17520, - "headsign": "BANKHEAD STATION", + "realtimeDeparture": 79958, + "scheduledDeparture": 79958, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76320, - "scheduledDeparture": 76320, - "headsign": "BANKHEAD STATION", + "realtimeDeparture": 77558, + "scheduledDeparture": 77558, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 75120, - "scheduledDeparture": 75120, - "headsign": "BANKHEAD STATION", + "realtimeDeparture": 75158, + "scheduledDeparture": 75158, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 73920, - "scheduledDeparture": 73920, - "headsign": "BANKHEAD STATION", + "realtimeDeparture": 72758, + "scheduledDeparture": 72758, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "114" } } } @@ -5526,115 +2424,85 @@ }, { "pattern": { - "headsign": "H E HOLMES STATION", + "headsign": "Avondale Station via Clifton Springs Health Center", + "name": "114 Avondale Station via Clifton Springs Health Center", "route": { + "gtfsId": "MARTA:23633", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "Blue", - "type": 1, - "mode": "SUBWAY", - "longName": "Blue", - "color": "0075B2", + "shortName": "114", + "type": 3, + "mode": "BUS", + "longName": "Columbia Drive", + "color": "FF8040", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78120, - "scheduledDeparture": 78120, - "headsign": "H E HOLMES STATION", + "realtimeDeparture": 39169, + "scheduledDeparture": 39169, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76920, - "scheduledDeparture": 76920, - "headsign": "H E HOLMES STATION", + "realtimeDeparture": 36769, + "scheduledDeparture": 36769, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 75720, - "scheduledDeparture": 75720, - "headsign": "H E HOLMES STATION", + "realtimeDeparture": 34369, + "scheduledDeparture": 34369, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "114" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 74520, - "scheduledDeparture": 74520, - "headsign": "H E HOLMES STATION", + "realtimeDeparture": 32247, + "scheduledDeparture": 32247, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "114" } } }, { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 73320, - "scheduledDeparture": 73320, - "headsign": "H E HOLMES STATION", - "trip": { - "route": { - "shortName": "Blue" - } - } - } - ] - }, - { - "pattern": { - "headsign": "H E HOLMES STATION", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "Blue", - "type": 1, - "mode": "SUBWAY", - "longName": "Blue", - "color": "0075B2", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 91740, - "scheduledDeparture": 91740, - "headsign": "H E HOLMES STATION", + "realtimeDeparture": 29847, + "scheduledDeparture": 29847, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "114" } } } @@ -5646,319 +2514,300 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjMzMC4wMDQwMDAwMDAwMDAxO1UzUnZjRHBOUVZKVVFUb3lNREU", - "distance": 330, + "id": "cGxhY2VBdERpc3RhbmNlOjQ3OC44NzQ5OTk5OTk5OTk5NDtVM1J2Y0RwTlFWSlVRVG80TlRRMk1B", + "distance": 478, "place": { "__typename": "Stop", - "id": "U3RvcDpNQVJUQToyMDE", - "lat": 33.750143, - "lon": -84.385882, - "name": "Georgia State Station", - "code": "908696", - "gtfsId": "MARTA:201", + "id": "U3RvcDpNQVJUQTo4NTQ2MA", + "lat": 33.777124, + "lon": -84.278534, + "name": "E Ponce De Leon Ave at N Arcadia Ave", + "code": "904941", + "gtfsId": "MARTA:85460", + "routes": [ + { + "gtfsId": "MARTA:23638" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "CANDLER PARK STATION", + "headsign": "Avondale Station", + "name": "120 Avondale Station", "route": { + "gtfsId": "MARTA:23638", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "Green", - "type": 1, - "mode": "SUBWAY", - "longName": "Green", - "color": "009D4B", + "shortName": "120", + "type": 3, + "mode": "BUS", + "longName": "East Ponce De Leon Avenue", + "color": "FF00FF", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 19380, - "scheduledDeparture": 19380, - "headsign": "CANDLER PARK STATION", + "realtimeDeparture": 79463, + "scheduledDeparture": 79463, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 18180, - "scheduledDeparture": 18180, - "headsign": "CANDLER PARK STATION", + "realtimeDeparture": 77663, + "scheduledDeparture": 77663, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "120" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 75780, - "scheduledDeparture": 75780, - "headsign": "CANDLER PARK STATION", + "realtimeDeparture": 75863, + "scheduledDeparture": 75863, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "120" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 74580, - "scheduledDeparture": 74580, - "headsign": "CANDLER PARK STATION", + "realtimeDeparture": 74063, + "scheduledDeparture": 74063, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "120" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 73380, - "scheduledDeparture": 73380, - "headsign": "CANDLER PARK STATION", + "realtimeDeparture": 72263, + "scheduledDeparture": 72263, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "Green" + "shortName": "120" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjY0NS45MTY1O1UzUnZjRHBOUVZKVVFUbzROakE0TlE", + "distance": 645, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NjA4NQ", + "lat": 33.779396, + "lon": -84.279199, + "name": "N Arcadia Ave at Winn Way", + "code": "901198", + "gtfsId": "MARTA:86085", + "routes": [ { - "pattern": { - "headsign": "INDIAN CREEK STATION", - "route": { - "agency": { - "name": "Metropolitan Atlanta Rapid Transit Authority", - "gtfsId": "MARTA:MARTA" - }, - "shortName": "Blue", - "type": 1, - "mode": "SUBWAY", - "longName": "Blue", - "color": "0075B2", - "textColor": "000000" - } - }, - "stoptimes": [ - { - "serviceDay": 1698638400, - "departureDelay": 0, - "realtimeState": "SCHEDULED", - "realtimeDeparture": 92580, - "scheduledDeparture": 92580, - "headsign": "INDIAN CREEK STATION", - "trip": { - "route": { - "shortName": "Blue" - } - } - } - ] + "gtfsId": "MARTA:23708" }, + { + "gtfsId": "MARTA:23709" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "INDIAN CREEK STATION", + "headsign": "Avondale Station via Lou Walker Center", + "name": "117 Avondale Station via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { "name": "Metropolitan Atlanta Rapid Transit Authority", "gtfsId": "MARTA:MARTA" }, - "shortName": "Blue", - "type": 1, - "mode": "SUBWAY", - "longName": "Blue", - "color": "0075B2", + "shortName": "117", + "type": 3, + "mode": "BUS", + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 78720, - "scheduledDeparture": 78720, - "headsign": "INDIAN CREEK STATION", + "realtimeDeparture": 53581, + "scheduledDeparture": 53581, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 77520, - "scheduledDeparture": 77520, - "headsign": "INDIAN CREEK STATION", + "realtimeDeparture": 49981, + "scheduledDeparture": 49981, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 76320, - "scheduledDeparture": 76320, - "headsign": "INDIAN CREEK STATION", + "realtimeDeparture": 46381, + "scheduledDeparture": 46381, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 75120, - "scheduledDeparture": 75120, - "headsign": "INDIAN CREEK STATION", + "realtimeDeparture": 42781, + "scheduledDeparture": 42781, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "117" } } }, { - "serviceDay": 1698638400, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 73920, - "scheduledDeparture": 73920, - "headsign": "INDIAN CREEK STATION", + "realtimeDeparture": 39181, + "scheduledDeparture": 39181, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "Blue" + "shortName": "117" } } } ] - } - ] - } - } - }, - { - "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjM3Ny44MTk0OTk5OTk5OTk5O1UzUnZjRHBZY0hKbGMzTTZNekl5", - "distance": 377, - "place": { - "__typename": "Stop", - "id": "U3RvcDpYcHJlc3M6MzIy", - "lat": 33.752412, - "lon": -84.388429, - "name": "Central Ave at Wall St", - "code": "600002", - "gtfsId": "Xpress:322", - "stoptimesForPatterns": [ + }, { "pattern": { - "headsign": "485 Hickory Grove", + "headsign": "Avondale Station", + "name": "117 Avondale Station", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "485", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Hickory Grove - Downtown", - "color": "0f78af", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 61507, - "scheduledDeparture": 61507, - "headsign": "485 Hickory Grove", + "realtimeDeparture": 80606, + "scheduledDeparture": 80606, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "485" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 59707, - "scheduledDeparture": 59707, - "headsign": "485 Hickory Grove", + "realtimeDeparture": 78806, + "scheduledDeparture": 78806, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "485" + "shortName": "117" } } - } - ] - }, - { - "pattern": { - "headsign": "490 Canton / Woodstock", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "490", - "type": 3, - "mode": "BUS", - "longName": "Woodstock - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ + }, + { + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 77006, + "scheduledDeparture": 77006, + "headsign": "Avondale Station", + "trip": { + "route": { + "shortName": "117" + } + } + }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 60307, - "scheduledDeparture": 60307, - "headsign": "490 Canton / Woodstock", + "realtimeDeparture": 75206, + "scheduledDeparture": 75206, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "490" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58507, - "scheduledDeparture": 58507, - "headsign": "490 Canton / Woodstock", + "realtimeDeparture": 73406, + "scheduledDeparture": 73406, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "490" + "shortName": "117" } } } @@ -5966,141 +2815,193 @@ }, { "pattern": { - "headsign": "463 Downtown / Midtown", + "headsign": "Avondale Station", + "name": "75 Avondale Station", "route": { + "gtfsId": "MARTA:23708", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "463", + "shortName": "75", "type": 3, "mode": "BUS", - "longName": "W Douglas/Douglas MMTC - DT/MT", - "color": "8e287e", - "textColor": "ffffff" + "longName": "Lawrenceville Highway", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27681, - "scheduledDeparture": 27681, - "headsign": "463 Downtown / Midtown", + "realtimeDeparture": 83612, + "scheduledDeparture": 83612, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "463" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26961, - "scheduledDeparture": 26961, - "headsign": "463 Downtown / Midtown", + "realtimeDeparture": 80912, + "scheduledDeparture": 80912, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "463" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25241, - "scheduledDeparture": 25241, - "headsign": "463 Downtown / Midtown", + "realtimeDeparture": 78212, + "scheduledDeparture": 78212, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "463" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 23021, - "scheduledDeparture": 23021, - "headsign": "463 Downtown / Midtown", + "realtimeDeparture": 75512, + "scheduledDeparture": 75512, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "463" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21600, - "scheduledDeparture": 21600, - "headsign": "463 Downtown / Midtown", + "realtimeDeparture": 72812, + "scheduledDeparture": 72812, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "463" + "shortName": "75" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjczMC41NDg7VTNSdmNEcE5RVkpVUVRvNE5UQXdNdw", + "distance": 730, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTAwMw", + "lat": 33.78, + "lon": -84.27948, + "name": "Winn Way at Pinehurst St", + "code": "904370", + "gtfsId": "MARTA:85003", + "routes": [ + { + "gtfsId": "MARTA:23709" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "480 Acworth / Town Center", + "headsign": "Avondale Station via Lou Walker Center", + "name": "117 Avondale Station via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "480", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Acworth/Town Center - Downtown", - "color": "0f78af", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 53567, + "scheduledDeparture": 53567, + "headsign": "Avondale Station via Lou Walker Center", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729828800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 49967, + "scheduledDeparture": 49967, + "headsign": "Avondale Station via Lou Walker Center", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 61430, - "scheduledDeparture": 61430, - "headsign": "480 Acworth / Town Center", + "realtimeDeparture": 46367, + "scheduledDeparture": 46367, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "480" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 57792, - "scheduledDeparture": 57792, - "headsign": "480 Acworth / Town Center", + "realtimeDeparture": 42767, + "scheduledDeparture": 42767, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "480" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54192, - "scheduledDeparture": 54192, - "headsign": "480 Acworth / Town Center", + "realtimeDeparture": 39167, + "scheduledDeparture": 39167, + "headsign": "Avondale Station via Lou Walker Center", "trip": { "route": { - "shortName": "480" + "shortName": "117" } } } @@ -6108,128 +3009,193 @@ }, { "pattern": { - "headsign": "476 Downtown / Midtown", + "headsign": "Avondale Station", + "name": "117 Avondale Station", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "476", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Hiram/Powder Springs - DT/MT", - "color": "8e287e", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80595, + "scheduledDeparture": 80595, + "headsign": "Avondale Station", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 29218, - "scheduledDeparture": 29218, - "headsign": "476 Downtown / Midtown", + "realtimeDeparture": 78795, + "scheduledDeparture": 78795, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "476" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 27138, - "scheduledDeparture": 27138, - "headsign": "476 Downtown / Midtown", + "realtimeDeparture": 76995, + "scheduledDeparture": 76995, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "476" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24978, - "scheduledDeparture": 24978, - "headsign": "476 Downtown / Midtown", + "realtimeDeparture": 75195, + "scheduledDeparture": 75195, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "476" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21619, - "scheduledDeparture": 21619, - "headsign": "476 Downtown / Midtown", + "realtimeDeparture": 73395, + "scheduledDeparture": 73395, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "476" + "shortName": "117" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjczMy40NTk0OTk5OTU5MzI7VTNSdmNEcE5RVkpVUVRvNE5UVTFNQQ", + "distance": 733, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTU1MA", + "lat": 33.77219, + "lon": -84.2876, + "name": "Commerce Dr at E College Ave", + "code": "904260", + "gtfsId": "MARTA:85550", + "routes": [ + { + "gtfsId": "MARTA:23633" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "416 Dacula", + "headsign": "Avondale Station", + "name": "114 Avondale Station", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "416", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Dacula - Downtown", - "color": "0f78af", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 82319, + "scheduledDeparture": 82319, + "headsign": "Avondale Station", + "trip": { + "route": { + "shortName": "114" + } + } + }, + { + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 79919, + "scheduledDeparture": 79919, + "headsign": "Avondale Station", + "trip": { + "route": { + "shortName": "114" + } + } + }, + { + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 62330, - "scheduledDeparture": 62330, - "headsign": "416 Dacula", + "realtimeDeparture": 77519, + "scheduledDeparture": 77519, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "416" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58692, - "scheduledDeparture": 58692, - "headsign": "416 Dacula", + "realtimeDeparture": 75119, + "scheduledDeparture": 75119, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "416" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 55092, - "scheduledDeparture": 55092, - "headsign": "416 Dacula", + "realtimeDeparture": 72719, + "scheduledDeparture": 72719, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "416" + "shortName": "114" } } } @@ -6237,179 +3203,193 @@ }, { "pattern": { - "headsign": "413 Hamilton Mill / Mall of Georgia", + "headsign": "Avondale Station via Clifton Springs Health Center", + "name": "114 Avondale Station via Clifton Springs Health Center", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "413", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Hamilton Mill/Mall of GA - DT", - "color": "0f78af", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 62030, - "scheduledDeparture": 62030, - "headsign": "413 Hamilton Mill / Mall of Georgia", + "realtimeDeparture": 39133, + "scheduledDeparture": 39133, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "413" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58392, - "scheduledDeparture": 58392, - "headsign": "413 Hamilton Mill / Mall of Georgia", + "realtimeDeparture": 36733, + "scheduledDeparture": 36733, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "413" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54492, - "scheduledDeparture": 54492, - "headsign": "413 Hamilton Mill / Mall of Georgia", + "realtimeDeparture": 34333, + "scheduledDeparture": 34333, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "413" + "shortName": "114" } } - } - ] - }, - { - "pattern": { - "headsign": "400 Cumming", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "400", - "type": 3, - "mode": "BUS", - "longName": "Cumming - Downtown", - "color": "0f78af", - "textColor": "ffffff" - } - }, - "stoptimes": [ + }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58623, - "scheduledDeparture": 58623, - "headsign": "400 Cumming", + "realtimeDeparture": 32205, + "scheduledDeparture": 32205, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "400" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 56823, - "scheduledDeparture": 56823, - "headsign": "400 Cumming", + "realtimeDeparture": 29805, + "scheduledDeparture": 29805, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "400" + "shortName": "114" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjc1OC42ODI1O1UzUnZjRHBOUVZKVVFUbzROVE16TWc", + "distance": 758, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTMzMg", + "lat": 33.78027, + "lon": -84.279386, + "name": "Winn Way at Pinehurst St", + "code": "904608", + "gtfsId": "MARTA:85332", + "routes": [ + { + "gtfsId": "MARTA:23709" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "426 Downtown", + "headsign": "Xpress Panola Road Park & Ride", + "name": "117 Xpress Panola Road Park & Ride", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "426", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28961, - "scheduledDeparture": 28961, - "headsign": "426 Downtown", + "realtimeDeparture": 79886, + "scheduledDeparture": 79886, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24021, - "scheduledDeparture": 24021, - "headsign": "426 Downtown", + "realtimeDeparture": 78086, + "scheduledDeparture": 78086, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ + }, + { + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76286, + "scheduledDeparture": 76286, + "headsign": "Xpress Panola Road Park & Ride", + "trip": { + "route": { + "shortName": "117" + } + } + }, + { + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 74486, + "scheduledDeparture": 74486, + "headsign": "Xpress Panola Road Park & Ride", + "trip": { + "route": { + "shortName": "117" + } + } + }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26580, - "scheduledDeparture": 26580, - "headsign": "426 Downtown", + "realtimeDeparture": 72686, + "scheduledDeparture": 72686, + "headsign": "Xpress Panola Road Park & Ride", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } } @@ -6417,102 +3397,85 @@ }, { "pattern": { - "headsign": "426 Downtown", + "headsign": "Fairington Parkway", + "name": "117 Fairington Parkway", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "426", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 31401, - "scheduledDeparture": 31401, - "headsign": "426 Downtown", + "realtimeDeparture": 62812, + "scheduledDeparture": 62812, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 22500, - "scheduledDeparture": 22500, - "headsign": "426 Downtown", + "realtimeDeparture": 61012, + "scheduledDeparture": 61012, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 20600, - "scheduledDeparture": 20600, - "headsign": "426 Downtown", + "realtimeDeparture": 59212, + "scheduledDeparture": 59212, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } - } - ] - }, - { - "pattern": { - "headsign": "426 Downtown", - "route": { - "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" - }, - "shortName": "426", - "type": 3, - "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" - } - }, - "stoptimes": [ + }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28121, - "scheduledDeparture": 28121, - "headsign": "426 Downtown", + "realtimeDeparture": 57412, + "scheduledDeparture": 57412, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26581, - "scheduledDeparture": 26581, - "headsign": "426 Downtown", + "realtimeDeparture": 55612, + "scheduledDeparture": 55612, + "headsign": "Fairington Parkway", "trip": { "route": { - "shortName": "426" + "shortName": "117" } } } @@ -6520,128 +3483,193 @@ }, { "pattern": { - "headsign": "419 Downtown", + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", + "name": "117 Xpress Panola Road Park & Ride via Lou Walker Center", "route": { + "gtfsId": "MARTA:23709", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "419", + "shortName": "117", "type": 3, "mode": "BUS", - "longName": "Snellville/Hewatt/Stone Mtn - DT", - "color": "01925c", - "textColor": "ffffff" + "longName": "Rockbridge Road / Panola Road", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 29341, - "scheduledDeparture": 29341, - "headsign": "419 Downtown", + "realtimeDeparture": 47508, + "scheduledDeparture": 47508, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "419" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28561, - "scheduledDeparture": 28561, - "headsign": "419 Downtown", + "realtimeDeparture": 43908, + "scheduledDeparture": 43908, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "419" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 26301, - "scheduledDeparture": 26301, - "headsign": "419 Downtown", + "realtimeDeparture": 40308, + "scheduledDeparture": 40308, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "419" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24701, - "scheduledDeparture": 24701, - "headsign": "419 Downtown", + "realtimeDeparture": 36708, + "scheduledDeparture": 36708, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "419" + "shortName": "117" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 21300, - "scheduledDeparture": 21300, - "headsign": "419 Downtown", + "realtimeDeparture": 33108, + "scheduledDeparture": 33108, + "headsign": "Xpress Panola Road Park & Ride via Lou Walker Center", "trip": { "route": { - "shortName": "419" + "shortName": "117" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjc2My4zNzU7VTNSdmNEcE5RVkpVUVRvNE5qQXdNZw", + "distance": 763, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NjAwMg", + "lat": 33.778713, + "lon": -84.276131, + "name": "E Ponce De Leon Ave at 2775", + "code": "905117", + "gtfsId": "MARTA:86002", + "routes": [ + { + "gtfsId": "MARTA:23638" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "426 Downtown", + "headsign": "Goldsmith Park & Ride", + "name": "120 Goldsmith Park & Ride", "route": { + "gtfsId": "MARTA:23638", "agency": { - "name": "Xpress", - "gtfsId": "Xpress:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "426", + "shortName": "120", "type": 3, "mode": "BUS", - "longName": "E Conyer/W Conyer/Panola - DT", - "color": "01925c", - "textColor": "ffffff" + "longName": "East Ponce De Leon Avenue", + "color": "FF00FF", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80473, + "scheduledDeparture": 80473, + "headsign": "Goldsmith Park & Ride", + "trip": { + "route": { + "shortName": "120" + } + } + }, + { + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78673, + "scheduledDeparture": 78673, + "headsign": "Goldsmith Park & Ride", + "trip": { + "route": { + "shortName": "120" + } + } + }, + { + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76873, + "scheduledDeparture": 76873, + "headsign": "Goldsmith Park & Ride", + "trip": { + "route": { + "shortName": "120" + } + } + }, + { + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 28241, - "scheduledDeparture": 28241, - "headsign": "426 Downtown", + "realtimeDeparture": 75073, + "scheduledDeparture": 75073, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "426" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 24581, - "scheduledDeparture": 24581, - "headsign": "426 Downtown", + "realtimeDeparture": 73273, + "scheduledDeparture": 73273, + "headsign": "Goldsmith Park & Ride", "trip": { "route": { - "shortName": "426" + "shortName": "120" } } } @@ -6653,167 +3681,211 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjM3Ny44MTk0OTk5OTk5OTk5O1UzUnZjRHBEYjJKaVRHbHVZem81Tmpn", - "distance": 377, + "id": "cGxhY2VBdERpc3RhbmNlOjc2OS4yNzI5OTk5OTU5MzE5O1UzUnZjRHBOUVZKVVFUbzVPVGszTkRBM05n", + "distance": 769, "place": { "__typename": "Stop", - "id": "U3RvcDpDb2JiTGluYzo5Njg", - "lat": 33.752412, - "lon": -84.388429, - "name": "Central Ave at Wall St", - "code": "600002", - "gtfsId": "CobbLinc:968", + "id": "U3RvcDpNQVJUQTo5OTk3NDA3Ng", + "lat": 33.771971, + "lon": -84.28777, + "name": "Commerce Dr at E College Ave", + "code": "213701", + "gtfsId": "MARTA:99974076", + "routes": [ + { + "gtfsId": "MARTA:23633" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "Marietta Transfer Center", + "headsign": "GSU Perimeter College", + "name": "114 GSU Perimeter College", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "CobbLinc", - "gtfsId": "CobbLinc:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "101", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Civic Center/Five Points/MTC", - "color": "0d0d0d", - "textColor": "f2f2f2" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 83606, + "scheduledDeparture": 83606, + "headsign": "GSU Perimeter College", + "trip": { + "route": { + "shortName": "114" + } + } + }, + { + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 67885, - "scheduledDeparture": 67885, - "headsign": "Marietta Transfer Center", + "realtimeDeparture": 81206, + "scheduledDeparture": 81206, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 64968, - "scheduledDeparture": 64968, - "headsign": "Marietta Transfer Center", + "realtimeDeparture": 78806, + "scheduledDeparture": 78806, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 61668, - "scheduledDeparture": 61668, - "headsign": "Marietta Transfer Center", + "realtimeDeparture": 76406, + "scheduledDeparture": 76406, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 59508, - "scheduledDeparture": 59508, - "headsign": "Marietta Transfer Center", + "realtimeDeparture": 74006, + "scheduledDeparture": 74006, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjc3NC45MDk1O1UzUnZjRHBOUVZKVVFUbzROakl5TkE", + "distance": 774, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NjIyNA", + "lat": 33.780207, + "lon": -84.278276, + "name": "N Arcadia Ave at Grayson Pl", + "code": "901277", + "gtfsId": "MARTA:86224", + "routes": [ + { + "gtfsId": "MARTA:23708" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "Busbee Park & Ride", + "headsign": "Royal Atlanta Business Park", + "name": "75 Royal Atlanta Business Park", "route": { + "gtfsId": "MARTA:23708", "agency": { - "name": "CobbLinc", - "gtfsId": "CobbLinc:1" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "100", + "shortName": "75", "type": 3, "mode": "BUS", - "longName": "Civic Center Station/Busbee P&R", - "color": "0d0d0d", - "textColor": "f2f2f2" + "longName": "Lawrenceville Highway", + "color": "00FF00", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 65864, - "scheduledDeparture": 65864, - "headsign": "Busbee Park & Ride", + "realtimeDeparture": 22296, + "scheduledDeparture": 22296, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "100" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 63164, - "scheduledDeparture": 63164, - "headsign": "Busbee Park & Ride", + "realtimeDeparture": 81985, + "scheduledDeparture": 81985, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "100" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 61364, - "scheduledDeparture": 61364, - "headsign": "Busbee Park & Ride", + "realtimeDeparture": 79285, + "scheduledDeparture": 79285, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "100" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58664, - "scheduledDeparture": 58664, - "headsign": "Busbee Park & Ride", + "realtimeDeparture": 76585, + "scheduledDeparture": 76585, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "100" + "shortName": "75" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 55964, - "scheduledDeparture": 55964, - "headsign": "Busbee Park & Ride", + "realtimeDeparture": 73885, + "scheduledDeparture": 73885, + "headsign": "Royal Atlanta Business Park", "trip": { "route": { - "shortName": "100" + "shortName": "75" } } } @@ -6825,283 +3897,319 @@ }, { "node": { - "id": "cGxhY2VBdERpc3RhbmNlOjM3Ny44MTk0OTk5OTk5OTk5O1UzUnZjRHBIZDJsdWJtVjBkRU52ZFc1MGVWUnlZVzV6YVhRNk1qZzE", - "distance": 377, + "id": "cGxhY2VBdERpc3RhbmNlOjg2NC41MjAwMDAwMDAwMDAxO1UzUnZjRHBOUVZKVVFUbzROakExTWc", + "distance": 864, "place": { "__typename": "Stop", - "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6Mjg1", - "lat": 33.752412, - "lon": -84.388429, - "name": "Central Avenue at Wall Street", - "code": "600002", - "gtfsId": "GwinnettCountyTransit:285", + "id": "U3RvcDpNQVJUQTo4NjA1Mg", + "lat": 33.779541, + "lon": -84.275978, + "name": "E Ponce De Leon Ave at 2818", + "code": "904467", + "gtfsId": "MARTA:86052", + "routes": [ + { + "gtfsId": "MARTA:23638" + } + ], "stoptimesForPatterns": [ { "pattern": { - "headsign": "Sugarloaf Mills", + "headsign": "Avondale Station", + "name": "120 Avondale Station", "route": { + "gtfsId": "MARTA:23638", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "103A", + "shortName": "120", "type": 3, "mode": "BUS", - "longName": "Rev Commute Atlanta - Sugarloaf Mills", - "color": "6A737B", - "textColor": "ffffff" + "longName": "East Ponce De Leon Avenue", + "color": "FF00FF", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 29427, - "scheduledDeparture": 29427, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 79439, + "scheduledDeparture": 79439, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103A" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 25473, - "scheduledDeparture": 25473, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 77639, + "scheduledDeparture": 77639, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "103A" + "shortName": "120" } } - } - ] - }, - { - "pattern": { - "headsign": "Sweeper", - "route": { - "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" - }, - "shortName": "SWPR", - "type": 3, - "mode": "BUS", - "longName": "Express PM Sweeper", - "color": "0037ff", - "textColor": "ffffff" - } - }, - "stoptimes": [ + }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 71820, - "scheduledDeparture": 71820, - "headsign": "Sweeper", + "realtimeDeparture": 75839, + "scheduledDeparture": 75839, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "SWPR" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 70020, - "scheduledDeparture": 70020, - "headsign": "Sweeper", + "realtimeDeparture": 74039, + "scheduledDeparture": 74039, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "SWPR" + "shortName": "120" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 68220, - "scheduledDeparture": 68220, - "headsign": "Sweeper", + "realtimeDeparture": 72239, + "scheduledDeparture": 72239, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "SWPR" + "shortName": "120" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjk3MS42MDg0OTk5OTU5MzI7VTNSdmNEcE5RVkpVUVRvNE5USTBNZw", + "distance": 971, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTI0Mg", + "lat": 33.769433, + "lon": -84.28647, + "name": "S Columbia Dr at Talley St", + "code": "904849", + "gtfsId": "MARTA:85242", + "routes": [ + { + "gtfsId": "MARTA:23633" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "Sugarloaf Mills", + "headsign": "GSU Perimeter College", + "name": "114 GSU Perimeter College", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "103", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Sugarloaf Mills P&R - Downtown Atlanta", - "color": "008852", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 57993, - "scheduledDeparture": 57993, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 83654, + "scheduledDeparture": 83654, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "103" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 57393, - "scheduledDeparture": 57393, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 81254, + "scheduledDeparture": 81254, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "103" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 56793, - "scheduledDeparture": 56793, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 78854, + "scheduledDeparture": 78854, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "103" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 55593, - "scheduledDeparture": 55593, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 76454, + "scheduledDeparture": 76454, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "103" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54393, - "scheduledDeparture": 54393, - "headsign": "Sugarloaf Mills", + "realtimeDeparture": 74054, + "scheduledDeparture": 74054, + "headsign": "GSU Perimeter College", "trip": { "route": { - "shortName": "103" + "shortName": "114" } } } ] - }, + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjEwMDEuNjk0NDk5OTk1OTMyMjtVM1J2Y0RwTlFWSlVRVG80TlRJMk5B", + "distance": 1001, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQTo4NTI2NA", + "lat": 33.769241, + "lon": -84.286013, + "name": "Columbia Dr at Talley St", + "code": "904977", + "gtfsId": "MARTA:85264", + "routes": [ + { + "gtfsId": "MARTA:23633" + } + ], + "stoptimesForPatterns": [ { "pattern": { - "headsign": "I-985 P&R", + "headsign": "Avondale Station", + "name": "114 Avondale Station", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "101", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "I-985 P&R - Downtown Atlanta", - "color": "E7A614", - "textColor": "ffffff" + "longName": "Columbia Drive", + "color": "FF8040", + "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 62013, - "scheduledDeparture": 62013, - "headsign": "I-985 P&R", + "realtimeDeparture": 82275, + "scheduledDeparture": 82275, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 60213, - "scheduledDeparture": 60213, - "headsign": "I-985 P&R", + "realtimeDeparture": 79875, + "scheduledDeparture": 79875, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58413, - "scheduledDeparture": 58413, - "headsign": "I-985 P&R", + "realtimeDeparture": 77475, + "scheduledDeparture": 77475, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 56613, - "scheduledDeparture": 56613, - "headsign": "I-985 P&R", + "realtimeDeparture": 75075, + "scheduledDeparture": 75075, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729742400, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 54813, - "scheduledDeparture": 54813, - "headsign": "I-985 P&R", + "realtimeDeparture": 72675, + "scheduledDeparture": 72675, + "headsign": "Avondale Station", "trip": { "route": { - "shortName": "101" + "shortName": "114" } } } @@ -7109,83 +4217,85 @@ }, { "pattern": { - "headsign": "Indian Trail P&R", + "headsign": "Avondale Station via Clifton Springs Health Center", + "name": "114 Avondale Station via Clifton Springs Health Center", "route": { + "gtfsId": "MARTA:23633", "agency": { - "name": "Ride Gwinnett", - "gtfsId": "GwinnettCountyTransit:GCT" + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" }, - "shortName": "102", + "shortName": "114", "type": 3, "mode": "BUS", - "longName": "Indian Trail P&R - Downtown Atlanta", - "color": "A0CF67", + "longName": "Columbia Drive", + "color": "FF8040", "textColor": "000000" } }, "stoptimes": [ { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 64173, - "scheduledDeparture": 64173, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 39092, + "scheduledDeparture": 39092, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "102" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 62373, - "scheduledDeparture": 62373, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 36692, + "scheduledDeparture": 36692, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "102" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 60573, - "scheduledDeparture": 60573, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 34292, + "scheduledDeparture": 34292, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "102" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 58773, - "scheduledDeparture": 58773, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 32157, + "scheduledDeparture": 32157, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "102" + "shortName": "114" } } }, { - "serviceDay": 1698724800, + "serviceDay": 1729828800, "departureDelay": 0, "realtimeState": "SCHEDULED", - "realtimeDeparture": 55173, - "scheduledDeparture": 55173, - "headsign": "Indian Trail P&R", + "realtimeDeparture": 29757, + "scheduledDeparture": 29757, + "headsign": "Avondale Station via Clifton Springs Health Center", "trip": { "route": { - "shortName": "102" + "shortName": "114" } } } diff --git a/percy/otpSchema.json b/percy/otpSchema.json index 1657ab2b8..3a9592c06 100644 --- a/percy/otpSchema.json +++ b/percy/otpSchema.json @@ -1 +1 @@ -{"data":{"__schema":{"queryType":{"name":"QueryType"},"mutationType":null,"subscriptionType":null,"types":[{"kind":"ENUM","name":"AbsoluteDirection","description":"The cardinal (compass) direction taken when engaging a walking/driving step.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NORTH","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"NORTHEAST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"EAST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SOUTHEAST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SOUTH","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SOUTHWEST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"WEST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"NORTHWEST","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Agency","description":"A public transport agency","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"Agency feed and id","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the agency","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":"URL to the home page of the agency","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"timezone","description":"ID of the time zone which this agency operates on","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lang","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"phone","description":"Phone number which customers can use to contact this agency","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"fareUrl","description":"URL to a web page which has information of fares used by this agency","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"List of routes operated by this agency","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"By default, list of alerts which have an effect on all operations of the agency (e.g. a strike).\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the agency.\nBy default only returns alerts that have an effect on all operations of the agency (e.g. a strike).","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"AgencyAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"AgencyAlertType","description":"Entities, which are relevant for an agency and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCY","description":"Alerts affecting the agency.","isDeprecated":false,"deprecationReason":null},{"name":"ROUTES","description":"Alerts affecting agency's routes","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPES","description":"Alerts affecting the different route types of the agency.\nAlerts that affect route types on all agencies can be fetched through Feed.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Alert","description":"Alert of a current or upcoming disruption in public transportation","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alertHash","description":"hashcode from the original GTFS-RT alert","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"feed","description":"The feed in which this alert was published","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"Agency affected by the disruption. Note that this value is present only if the\ndisruption has an effect on all operations of the agency (e.g. in case of a strike).","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected agencies.\nUse entities instead."},{"name":"route","description":"Route affected by the disruption","args":[],"type":{"kind":"OBJECT","name":"Route","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected routes.\nUse entities instead."},{"name":"trip","description":"Trip affected by the disruption","args":[],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected trips.\nUse entities instead."},{"name":"stop","description":"Stop affected by the disruption","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected stops.\nUse entities instead."},{"name":"patterns","description":"Patterns affected by the disruption","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":true,"deprecationReason":"This will always return an empty list. Use entities instead."},{"name":"alertHeaderText","description":"Header of the alert, if available","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertHeaderTextTranslations","description":"Header of the alert in all different available languages","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"TranslatedString","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"alertDescriptionText","description":"Long description of the alert","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alertDescriptionTextTranslations","description":"Long descriptions of the alert in all different available languages","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"TranslatedString","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"alertUrl","description":"Url with more information","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertUrlTranslations","description":"Url with more information in all different available languages","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"TranslatedString","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"alertEffect","description":"Alert effect","args":[],"type":{"kind":"ENUM","name":"AlertEffectType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertCause","description":"Alert cause","args":[],"type":{"kind":"ENUM","name":"AlertCauseType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertSeverityLevel","description":"Alert severity level","args":[],"type":{"kind":"ENUM","name":"AlertSeverityLevelType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"effectiveStartDate","description":"Time when this alert comes into effect. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"effectiveEndDate","description":"Time when this alert is not in effect anymore. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"entities","description":"Entities affected by the disruption.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"UNION","name":"AlertEntity","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"AlertCauseType","description":"Cause of a alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"UNKNOWN_CAUSE","description":"UNKNOWN_CAUSE","isDeprecated":false,"deprecationReason":null},{"name":"OTHER_CAUSE","description":"OTHER_CAUSE","isDeprecated":false,"deprecationReason":null},{"name":"TECHNICAL_PROBLEM","description":"TECHNICAL_PROBLEM","isDeprecated":false,"deprecationReason":null},{"name":"STRIKE","description":"STRIKE","isDeprecated":false,"deprecationReason":null},{"name":"DEMONSTRATION","description":"DEMONSTRATION","isDeprecated":false,"deprecationReason":null},{"name":"ACCIDENT","description":"ACCIDENT","isDeprecated":false,"deprecationReason":null},{"name":"HOLIDAY","description":"HOLIDAY","isDeprecated":false,"deprecationReason":null},{"name":"WEATHER","description":"WEATHER","isDeprecated":false,"deprecationReason":null},{"name":"MAINTENANCE","description":"MAINTENANCE","isDeprecated":false,"deprecationReason":null},{"name":"CONSTRUCTION","description":"CONSTRUCTION","isDeprecated":false,"deprecationReason":null},{"name":"POLICE_ACTIVITY","description":"POLICE_ACTIVITY","isDeprecated":false,"deprecationReason":null},{"name":"MEDICAL_EMERGENCY","description":"MEDICAL_EMERGENCY","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"AlertEffectType","description":"Effect of a alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NO_SERVICE","description":"NO_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"REDUCED_SERVICE","description":"REDUCED_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"SIGNIFICANT_DELAYS","description":"SIGNIFICANT_DELAYS","isDeprecated":false,"deprecationReason":null},{"name":"DETOUR","description":"DETOUR","isDeprecated":false,"deprecationReason":null},{"name":"ADDITIONAL_SERVICE","description":"ADDITIONAL_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"MODIFIED_SERVICE","description":"MODIFIED_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"OTHER_EFFECT","description":"OTHER_EFFECT","isDeprecated":false,"deprecationReason":null},{"name":"UNKNOWN_EFFECT","description":"UNKNOWN_EFFECT","isDeprecated":false,"deprecationReason":null},{"name":"STOP_MOVED","description":"STOP_MOVED","isDeprecated":false,"deprecationReason":null},{"name":"NO_EFFECT","description":"NO_EFFECT","isDeprecated":false,"deprecationReason":null},{"name":"ACCESSIBILITY_ISSUE","description":"ACCESSIBILITY_ISSUE","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"UNION","name":"AlertEntity","description":"Entity related to an alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"Agency","ofType":null},{"kind":"OBJECT","name":"Route","ofType":null},{"kind":"OBJECT","name":"Pattern","ofType":null},{"kind":"OBJECT","name":"Stop","ofType":null},{"kind":"OBJECT","name":"Trip","ofType":null},{"kind":"OBJECT","name":"StopOnRoute","ofType":null},{"kind":"OBJECT","name":"StopOnTrip","ofType":null},{"kind":"OBJECT","name":"RouteType","ofType":null},{"kind":"OBJECT","name":"Unknown","ofType":null}]},{"kind":"ENUM","name":"AlertSeverityLevelType","description":"Severity level of a alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"UNKNOWN_SEVERITY","description":"Severity of alert is unknown","isDeprecated":false,"deprecationReason":null},{"name":"INFO","description":"Info alerts are used for informational messages that should not have a\nsignificant effect on user's journey, for example: A single entrance to a\nmetro station is temporarily closed.","isDeprecated":false,"deprecationReason":null},{"name":"WARNING","description":"Warning alerts are used when a single stop or route has a disruption that can\naffect user's journey, for example: All trams on a specific route are running\nwith irregular schedules.","isDeprecated":false,"deprecationReason":null},{"name":"SEVERE","description":"Severe alerts are used when a significant part of public transport services is\naffected, for example: All train services are cancelled due to technical problems.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"BikePark","description":"Bike park represents a location where bicycles can be parked.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"bikeParkId","description":"ID of the bike park","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the bike park","args":[{"name":"language","description":"Returns name with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of spaces available for bikes","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, value of `spacesAvailable` is updated from a real-time source.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tags","description":"Source specific tags of the bike park, which describe the available features.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"openingHours","description":"Opening hours of the parking facility","args":[],"type":{"kind":"OBJECT","name":"OpeningHours","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BikeRentalStation","description":"Bike rental station represents a location where users can rent bicycles for a fee.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stationId","description":"ID of the bike rental station","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the bike rental station","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"bikesAvailable","description":"Number of bikes currently available on the rental station.\nSee field `allowPickupNow` to know if is currently possible to pick up a bike.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of free spaces currently available on the rental station.\nNote that this value being 0 does not necessarily indicate that bikes cannot be returned\nto this station, as for example it might be possible to leave the bike in the vicinity of\nthe rental station, even if the bike racks don't have any spaces available.\nSee field `allowDropoffNow` to know if is currently possible to return a bike.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"state","description":"A description of the current state of this bike rental station, e.g. \"Station on\"","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"Use operative instead"},{"name":"realtime","description":"If true, values of `bikesAvailable` and `spacesAvailable` are updated from a\nreal-time source. If false, values of `bikesAvailable` and `spacesAvailable`\nare always the total capacity divided by two.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowDropoff","description":"If true, bikes can be returned to this station if the station has spaces available\nor allows overloading.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickup","description":"If true, bikes can be picked up from this station if the station has bikes available.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowDropoffNow","description":"If true, bikes can be currently returned to this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickupNow","description":"If true, bikes can be currently picked up from this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"networks","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the bike rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the bike rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"capacity","description":"Nominal capacity (number of racks) of the rental station.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowOverloading","description":"If true, bikes can be returned even if spacesAvailable is zero or bikes > capacity.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalUris","description":"Platform-specific URLs to begin renting a bike from this station.","args":[],"type":{"kind":"OBJECT","name":"BikeRentalStationUris","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"operative","description":"If true, station is on and in service.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BikeRentalStationUris","description":null,"fields":[{"name":"android","description":"A URI that can be passed to an Android app with an {@code android.intent.action.VIEW} Android\nintent to support Android Deep Links.\nMay be null if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"ios","description":"A URI that can be used on iOS to launch the rental app for this station.\nMay be {@code null} if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"web","description":"A URL that can be used by a web browser to show more information about renting a vehicle at\nthis station.\nMay be {@code null} if a rental URL does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"BikesAllowed","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NO_INFORMATION","description":"There is no bike information for the trip.","isDeprecated":false,"deprecationReason":null},{"name":"ALLOWED","description":"The vehicle being used on this particular trip can accommodate at least one bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"NOT_ALLOWED","description":"No bicycles are allowed on this trip.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"BookingInfo","description":"Booking information for a stop time which has special requirements to use, like calling ahead or\nusing an app.","fields":[{"name":"contactInfo","description":"Contact information for reaching the service provider","args":[],"type":{"kind":"OBJECT","name":"ContactInfo","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"earliestBookingTime","description":"When is the earliest time the service can be booked.","args":[],"type":{"kind":"OBJECT","name":"BookingTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"latestBookingTime","description":"When is the latest time the service can be booked","args":[],"type":{"kind":"OBJECT","name":"BookingTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"minimumBookingNoticeSeconds","description":"Minimum number of seconds before travel to make the request","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"maximumBookingNoticeSeconds","description":"Maximum number of seconds before travel to make the request","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"message","description":"A general message for those booking the service","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupMessage","description":"A message specific to the pick up","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropOffMessage","description":"A message specific to the drop off","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BookingTime","description":"Temporal restriction for a booking","fields":[{"name":"time","description":"Time of the booking","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"daysPrior","description":"How many days before the booking","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Boolean","description":"Built-in Boolean","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"CarPark","description":"Car park represents a location where cars can be parked.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"carParkId","description":"ID of the car park","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the car park","args":[{"name":"language","description":"Returns name with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"maxCapacity","description":"Number of parking spaces at the car park","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of currently available parking spaces at the car park","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, value of `spacesAvailable` is updated from a real-time source.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the car park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the car park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tags","description":"Source specific tags of the car park, which describe the available features.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"openingHours","description":"Opening hours for the selected dates using the local time of the park.\nEach date can have multiple time spans.","args":[],"type":{"kind":"OBJECT","name":"OpeningHours","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Cluster","description":"Cluster is a list of stops grouped by name and proximity","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ID of the cluster","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the cluster","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the center of this cluster (i.e. average latitude of stops in this cluster)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the center of this cluster (i.e. average longitude of stops in this cluster)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops in the cluster","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"ContactInfo","description":"Contact information for booking an on-demand or flexible service.","fields":[{"name":"contactPerson","description":"Name of the person to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"phoneNumber","description":"Phone number to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"eMail","description":"Email to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"faxNumber","description":"Fax number to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"infoUrl","description":"URL containing general information about the service","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bookingUrl","description":"URL to the booking systems of the service","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"additionalDetails","description":"Additional notes about the contacting the service provider","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Coordinates","description":null,"fields":[{"name":"lat","description":"Latitude (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Currency","description":"A currency","fields":[{"name":"code","description":"ISO-4217 currency code, for example `USD` or `EUR`.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"digits","description":"Fractional digits of this currency. A value of 2 would express that in this currency\n100 minor units make up one major unit.\n\nExpressed more concretely: 100 Euro-cents make up one Euro.\n\nNote: Some currencies don't even have any fractional digits, for example the Japanese Yen.\n\nSee also https://en.wikipedia.org/wiki/ISO_4217#Minor_unit_fractions","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"DefaultFareProduct","description":"The standard case of a fare product: it only has a single price to be paid by the passenger\nand no discounts are applied.","fields":[{"name":"id","description":"Identifier for the fare product.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the product, for example example \"Day pass\" or \"Single ticket\".","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"price","description":"The price of the product","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Money","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"riderCategory","description":"The category of riders this product applies to, for example students or pensioners.","args":[],"type":{"kind":"OBJECT","name":"RiderCategory","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"medium","description":"The 'medium' that this product applies to, for example \"Oyster Card\" or \"Berlin Ticket App\".\n\nThis communicates to riders that a specific way of buying or keeping this product is required.","args":[],"type":{"kind":"OBJECT","name":"FareMedium","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"FareProduct","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"DepartureRow","description":"Departure row is a combination of a pattern and a stop of that pattern.\n\nThey are de-duplicated so for each pattern there will only be a single departure row.\n\nThis is useful if you want to show a list of stop/pattern combinations but want each pattern to be\nlisted only once.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"Stop from which the departures leave","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pattern","description":"Pattern of the departure row","args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimes","description":"Departures of the pattern from the stop","args":[{"name":"startTime","description":"Return rows departing after this time. Time format: Unix timestamp in seconds. Default: current time.","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"How many seconds ahead to search for departures. Default is one day.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"},{"name":"numberOfDepartures","description":"Maximum number of departures to return.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"1"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Duration","description":"Duration in a lenient ISO-8601 duration format. Example P2DT2H12M40S, 2d2h12m40s or 1h","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Emissions","description":null,"fields":[{"name":"co2","description":"CO₂ emissions in grams.","args":[],"type":{"kind":"SCALAR","name":"Grams","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"FareMedium","description":"A 'medium' that a fare product applies to, for example cash, 'Oyster Card' or 'DB Navigator App'.","fields":[{"name":"id","description":"ID of the medium","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the medium.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INTERFACE","name":"FareProduct","description":"A fare product (a ticket) to be bought by a passenger","fields":[{"name":"id","description":"Identifier for the fare product.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the product, for example example \"Day pass\" or \"Single ticket\".","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"riderCategory","description":"The category of riders this product applies to, for example students or pensioners.","args":[],"type":{"kind":"OBJECT","name":"RiderCategory","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"medium","description":"The 'medium' that this product applies to, for example \"Oyster Card\" or \"Berlin Ticket App\".\n\nThis communicates to riders that a specific way of buying or keeping this product is required.","args":[],"type":{"kind":"OBJECT","name":"FareMedium","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"DefaultFareProduct","ofType":null}]},{"kind":"OBJECT","name":"FareProductUse","description":"A container for both a fare product (a ticket) and its relationship to the itinerary.","fields":[{"name":"id","description":"Represents the use of a single instance of a fare product throughout the itinerary. It can\nbe used to cross-reference and de-duplicate fare products that are applicable for more than one\nleg.\n\nIf you want to uniquely identify the fare product itself (not its use) use the product's `id`.\n\n### Example: Day pass\n\nThe day pass is valid for both legs in the itinerary. It is listed as the applicable `product` for each leg,\nand the same FareProductUse id is shown, indicating that only one pass was used/bought.\n\n**Illustration**\n```yaml\nitinerary:\n leg1:\n fareProducts:\n id: \"AAA\" // id of a FareProductUse instance\n product:\n id: \"day-pass\" // product id\n name: \"Day Pass\"\n leg2:\n fareProducts:\n id: \"AAA\" // identical to leg1. the passenger needs to buy ONE pass, not two.\n product:\n id: \"day-pass\" // product id\n name: \"Day Pass\"\n```\n\n**It is the responsibility of the API consumers to display the day pass as a product for the\nentire itinerary rather than two day passes!**\n\n### Example: Several single tickets\n\nIf you have two legs and need to buy two single tickets they will appear in each leg with the\nsame `FareProduct.id` but different `FareProductUse.id`.\n\n**Illustration**\n```yaml\nitinerary:\n leg1:\n fareProducts:\n id: \"AAA\" // id of a FareProductUse instance, not product id\n product:\n id: \"single-ticket\" // product id\n name: \"Single Ticket\"\n leg2:\n fareProducts:\n id: \"BBB\" // different to leg1. the passenger needs to buy two single tickets.\n product:\n id: \"single-ticket\" // product id\n name: \"Single Ticket\"\n```","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"product","description":"The purchasable fare product","args":[],"type":{"kind":"INTERFACE","name":"FareProduct","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Feed","description":"A feed provides routing data (stops, routes, timetables, etc.) from one or more public transport agencies.","fields":[{"name":"feedId","description":"ID of the feed","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"agencies","description":"List of agencies which provide data to this feed","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Agency","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"Alerts relevant for the feed.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the feed.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"FeedAlertType","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"FeedAlertType","description":"Entities, which are relevant for a feed and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCIES","description":"Alerts affecting the feed's agencies","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPES","description":"Alerts affecting the route types across the feed.\nThere might be alerts that only affect route types within an agency of the feed,\nand those can be fetched through the Agency.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"FilterPlaceType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"STOP","description":"Stops.\nNOTE: if this is selected at the same time as `STATION`, stops that have a parent station will not be returned but their parent stations will be returned instead.","isDeprecated":false,"deprecationReason":null},{"name":"DEPARTURE_ROW","description":"Departure rows","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE_RENT","description":"Old value for VEHICLE_RENT","isDeprecated":true,"deprecationReason":"Use VEHICLE_RENT instead as it's clearer that it also returns rental scooters, cars..."},{"name":"VEHICLE_RENT","description":"Vehicle (bicycles, scooters, cars ...) rental stations and vehicles","isDeprecated":false,"deprecationReason":null},{"name":"BIKE_PARK","description":"Parking lots (not rental stations) that contain spaces for bicycles","isDeprecated":false,"deprecationReason":null},{"name":"CAR_PARK","description":"Parking lots that contain spaces for cars","isDeprecated":false,"deprecationReason":null},{"name":"STATION","description":"Stations.\nNOTE: if this is selected at the same time as `STOP`, stops that have a parent station will not be returned but their parent stations will be returned instead.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"Float","description":"Built-in Float","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"FormFactor","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE","description":"A bicycle","isDeprecated":false,"deprecationReason":null},{"name":"CARGO_BICYCLE","description":"A bicycle with additional space for cargo","isDeprecated":false,"deprecationReason":null},{"name":"CAR","description":"An automobile","isDeprecated":false,"deprecationReason":null},{"name":"MOPED","description":"A moped that the rider sits on. For a disambiguation see https://github.com/NABSA/gbfs/pull/370#issuecomment-982631989","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER","description":"A kick scooter that the rider either sits or stands on. Will be deprecated in GBFS v3.0.","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_STANDING","description":"A kick scooter that the rider stands on","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_SEATED","description":"A kick scooter with a seat","isDeprecated":false,"deprecationReason":null},{"name":"OTHER","description":"A vehicle that doesn't fit into any other category","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"GeoJson","description":"Geographic data structures in JSON format. See: https://geojson.org/","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Geometry","description":null,"fields":[{"name":"length","description":"The number of points in the string","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"points","description":"List of coordinates of in a Google encoded polyline format (see\nhttps://developers.google.com/maps/documentation/utilities/polylinealgorithm)","args":[],"type":{"kind":"SCALAR","name":"Polyline","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Grams","description":"","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"ID","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputBanned","description":null,"fields":null,"inputFields":[{"name":"routes","description":"A comma-separated list of banned route ids","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"agencies","description":"A comma-separated list of banned agency ids","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"trips","description":"A comma-separated list of banned trip ids","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"stops","description":"A comma-separated list of banned stop ids. Note that these stops are only\nbanned for boarding and disembarking vehicles — it is possible to get an\nitinerary where a vehicle stops at one of these stops","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"stopsHard","description":"A comma-separated list of banned stop ids. Only itineraries where these stops\nare not travelled through are returned, e.g. if a bus route stops at one of\nthese stops, that route will not be used in the itinerary, even if the stop is\nnot used for boarding or disembarking the vehicle.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputCoordinates","description":null,"fields":null,"inputFields":[{"name":"lat","description":"Latitude of the place (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"lon","description":"Longitude of the place (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"address","description":"The name of the place. If specified, the place name in results uses this value instead of `\"Origin\"` or `\"Destination\"`","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"locationSlack","description":"The amount of time, in seconds, to spend at this location before venturing forth.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"InputField","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"DATE_TIME","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"FROM","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"TO","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputFilters","description":null,"fields":null,"inputFields":[{"name":"stops","description":"Stops to include by GTFS id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"stations","description":"Stations to include by GTFS id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"routes","description":"Routes to include by GTFS id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"bikeRentalStations","description":"Bike rentals to include by id (without network identifier).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"bikeParks","description":"Bike parks to include by id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"carParks","description":"Car parks to include by id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputModeWeight","description":null,"fields":null,"inputFields":[{"name":"TRAM","description":"The weight of TRAM traverse mode. Values over 1 add cost to tram travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"SUBWAY","description":"The weight of SUBWAY traverse mode. Values over 1 add cost to subway travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"RAIL","description":"The weight of RAIL traverse mode. Values over 1 add cost to rail travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"BUS","description":"The weight of BUS traverse mode. Values over 1 add cost to bus travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"FERRY","description":"The weight of FERRY traverse mode. Values over 1 add cost to ferry travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"CABLE_CAR","description":"The weight of CABLE_CAR traverse mode. Values over 1 add cost to cable car travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"GONDOLA","description":"The weight of GONDOLA traverse mode. Values over 1 add cost to gondola travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"FUNICULAR","description":"The weight of FUNICULAR traverse mode. Values over 1 add cost to funicular travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"AIRPLANE","description":"The weight of AIRPLANE traverse mode. Values over 1 add cost to airplane travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputPreferred","description":null,"fields":null,"inputFields":[{"name":"routes","description":"A comma-separated list of ids of the routes preferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"agencies","description":"A comma-separated list of ids of the agencies preferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"otherThanPreferredRoutesPenalty","description":"Penalty added for using every route that is not preferred if user set any\nroute as preferred. We return number of seconds that we are willing to wait\nfor preferred route.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputTriangle","description":"Relative importances of optimization factors. Only effective for bicycling legs.\nInvariant: `timeFactor + slopeFactor + safetyFactor == 1`","fields":null,"inputFields":[{"name":"safetyFactor","description":"Relative importance of safety","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"slopeFactor","description":"Relative importance of flat terrain","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"timeFactor","description":"Relative importance of duration","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputUnpreferred","description":null,"fields":null,"inputFields":[{"name":"routes","description":"A comma-separated list of ids of the routes unpreferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"agencies","description":"A comma-separated list of ids of the agencies unpreferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"unpreferredCost","description":"An cost function used to calculate penalty for an unpreferred route/agency. Function should return\nnumber of seconds that we are willing to wait for unpreferred route/agency.\nString must be of the format:\n`A + B x`, where A is fixed penalty and B is a multiplier of transit leg travel time x.\nFor example: `600 + 2.0 x`","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Int","description":"Built-in Int","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Itinerary","description":null,"fields":[{"name":"start","description":"Time when the user leaves from the origin.","args":[],"type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"end","description":"Time when the user leaves arrives at the destination.","args":[],"type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"duration","description":"Duration of the trip on this itinerary, in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"generalizedCost","description":"Generalized cost of the itinerary. Used for debugging search results.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"waitingTime","description":"How much time is spent waiting for transit to arrive, in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkTime","description":"How much time is spent walking, in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkDistance","description":"How far the user has to walk, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"emissionsPerPerson","description":"Emissions of this itinerary per traveler.","args":[],"type":{"kind":"OBJECT","name":"Emissions","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"legs","description":"A list of Legs. Each Leg is either a walking (cycling, car) portion of the\nitinerary, or a transit leg on a particular vehicle. So a itinerary where the\nuser walks to the Q train, transfers to the 6, then walks to their\ndestination, has four legs.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Leg","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"elevationGained","description":"How much elevation is gained, in total, over the course of the itinerary, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevationLost","description":"How much elevation is lost, in total, over the course of the itinerary, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"arrivedAtDestinationWithRentedBicycle","description":"Does the itinerary end without dropping off the rented bicycle:","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"systemNotices","description":"A list of system notices. Contains debug information for itineraries.\nOne use-case is to run a routing search with 'debugItineraryFilter: true'.\nThis will then tag itineraries instead of removing them from the result.\nThis make it possible to inspect the itinerary-filter-chain.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"SystemNotice","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"accessibilityScore","description":"Computes a numeric accessibility score between 0 and 1.\n\nThe closer the value is to 1 the better the wheelchair-accessibility of this itinerary is.\nA value of `null` means that no score has been computed, not that the leg is inaccessible.\n\nMore information is available in the [feature documentation](https://docs.opentripplanner.org/en/dev-2.x/sandbox/IBIAccessibilityScore/).","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"numberOfTransfers","description":"How many transfers are part of this itinerary.\n\nNotes:\n - Interlined/stay-seated transfers do not increase this count.\n - Transferring from a flex to a fixed schedule trip and vice versa increases this count.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"fares","description":"Information about the fares for this itinerary. This is primarily a GTFS Fares V1 interface\nand always returns an empty list. Use the leg's `fareProducts` instead.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"fare","ofType":null}},"isDeprecated":true,"deprecationReason":"Use the leg's `fareProducts`."},{"name":"startTime","description":"Time when the user leaves from the origin. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `start` instead which includes timezone information."},{"name":"endTime","description":"Time when the user arrives to the destination. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `end` instead which includes timezone information."}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Leg","description":null,"fields":[{"name":"start","description":"The time when the leg starts including real-time information, if available.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"LegTime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"end","description":"The time when the leg ends including real-time information, if available.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"LegTime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"mode","description":"The mode (e.g. `WALK`) used when traversing this leg.","args":[],"type":{"kind":"ENUM","name":"Mode","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"duration","description":"The leg's duration in seconds","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"generalizedCost","description":"Generalized cost of the leg. Used for debugging search results.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"legGeometry","description":"The leg's geometry.","args":[],"type":{"kind":"OBJECT","name":"Geometry","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"For transit legs, the transit agency that operates the service used for this leg. For non-transit legs, `null`.","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realTime","description":"Whether there is real-time data about this Leg","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeState","description":"State of real-time data","args":[],"type":{"kind":"ENUM","name":"RealtimeState","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"distance","description":"The distance traveled while traversing the leg in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"transitLeg","description":"Whether this leg is a transit leg or not.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkingBike","description":"Whether this leg is walking with a bike.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentedBike","description":"Whether this leg is traversed with a rented bike.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"from","description":"The Place where the leg originates.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"to","description":"The Place where the leg ends.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"For transit legs, the route that is used for traversing the leg. For non-transit legs, `null`.","args":[],"type":{"kind":"OBJECT","name":"Route","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"For transit legs, the trip that is used for traversing the leg. For non-transit legs, `null`.","args":[],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"serviceDate","description":"For transit legs, the service date of the trip. Format: YYYYMMDD. For non-transit legs, null.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"intermediateStops","description":"For transit legs, intermediate stops between the Place where the leg\noriginates and the Place where the leg ends. For non-transit legs, null.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"intermediatePlaces","description":"For transit legs, intermediate stops between the Place where the leg\noriginates and the Place where the leg ends. For non-transit legs, null.\nReturns Place type, which has fields for e.g. departure and arrival times","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"intermediatePlace","description":"Whether the destination of this leg (field `to`) is one of the intermediate places specified in the query.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"steps","description":"The turn-by-turn navigation instructions.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"step","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"headsign","description":"For transit legs, the headsign that the vehicle shows at the stop where the passenger boards.\nFor non-transit legs, null.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupType","description":"This is used to indicate if boarding this leg is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropoffType","description":"This is used to indicate if alighting from this leg is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"interlineWithPreviousLeg","description":"Interlines with previous leg.\nThis is true when the same vehicle is used for the previous leg as for this leg\nand passenger can stay inside the vehicle.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropOffBookingInfo","description":"Special booking information for the drop off stop of this leg if, for example, it needs\nto be booked in advance. This could be due to a flexible or on-demand service.","args":[],"type":{"kind":"OBJECT","name":"BookingInfo","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupBookingInfo","description":"Special booking information for the pick up stop of this leg if, for example, it needs\nto be booked in advance. This could be due to a flexible or on-demand service.","args":[],"type":{"kind":"OBJECT","name":"BookingInfo","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"Applicable alerts for this leg.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"nextLegs","description":"Future legs with same origin and destination stops or stations","args":[{"name":"numberOfLegs","description":"The number of alternative legs searched. If fewer than the requested number are found,\nthen only the found legs are returned.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"defaultValue":null},{"name":"originModesWithParentStation","description":"Transportation modes for which all stops in the parent station are used as possible origin stops\nfor the next legs. For modes not listed, only the exact origin stop of the leg is considered.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"TransitMode","ofType":null}}},"defaultValue":null},{"name":"destinationModesWithParentStation","description":"Transportation modes for which all stops in the parent station are used as possible destination stops\nfor the next legs. For modes not listed, only the exact destination stop of the leg is considered.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"TransitMode","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Leg","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"rideHailingEstimate","description":"Estimate of a hailed ride like Uber.","args":[],"type":{"kind":"OBJECT","name":"RideHailingEstimate","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"accessibilityScore","description":"Computes a numeric accessibility score between 0 and 1.\n\nThe closer the value is to 1 the better the wheelchair-accessibility of this leg is.\nA value of `null` means that no score has been computed, not that the itinerary is inaccessible.\n\nMore information is available in the [feature documentation](https://docs.opentripplanner.org/en/dev-2.x/sandbox/IBIAccessibilityScore/).","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"fareProducts","description":"Fare products are purchasable tickets which may have an optional fare container or rider\ncategory that limits who can buy them or how.\n\nPlease read the documentation of `id` very carefully to learn how a single fare product\nthat applies to multiple legs can appear several times.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"FareProductUse","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"startTime","description":"The date and time when this leg begins. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `start.estimated.time` instead which contains timezone information."},{"name":"endTime","description":"The date and time when this leg ends. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `end.estimated.time` instead which contains timezone information."},{"name":"departureDelay","description":"For transit leg, the offset from the scheduled departure time of the boarding\nstop in this leg, i.e. scheduled time of departure at boarding stop =\n`startTime - departureDelay`","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `end.estimated.delay` instead."},{"name":"arrivalDelay","description":"For transit leg, the offset from the scheduled arrival time of the alighting\nstop in this leg, i.e. scheduled time of arrival at alighting stop = `endTime\n- arrivalDelay`","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `start.estimated.delay` instead."}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"LegTime","description":"Time information about a passenger at a certain place. May contain real-time information if\navailable.","fields":[{"name":"scheduledTime","description":"The scheduled time of the event.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"estimated","description":"The estimated time of the event. If no real-time information is available, this is null.","args":[],"type":{"kind":"OBJECT","name":"RealTimeEstimate","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"LocalTimeSpan","description":"A span of time.","fields":[{"name":"from","description":"The start of the time timespan as seconds from midnight.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"to","description":"The end of the timespan as seconds from midnight.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"LocalTimeSpanDate","description":"A date using the local timezone of the object that can contain timespans.","fields":[{"name":"timeSpans","description":"The time spans for this date.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"LocalTimeSpan","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"date","description":"The date of this time span. Format: YYYYMMDD.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"LocationType","description":"Identifies whether this stop represents a stop or station.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"STOP","description":"A location where passengers board or disembark from a transit vehicle.","isDeprecated":false,"deprecationReason":null},{"name":"STATION","description":"A physical structure or area that contains one or more stop.","isDeprecated":false,"deprecationReason":null},{"name":"ENTRANCE","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"Long","description":"A 64-bit signed integer","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"Mode","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AIRPLANE","description":"AIRPLANE","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE","description":"BICYCLE","isDeprecated":false,"deprecationReason":null},{"name":"BUS","description":"BUS","isDeprecated":false,"deprecationReason":null},{"name":"CABLE_CAR","description":"CABLE_CAR","isDeprecated":false,"deprecationReason":null},{"name":"CAR","description":"CAR","isDeprecated":false,"deprecationReason":null},{"name":"COACH","description":"COACH","isDeprecated":false,"deprecationReason":null},{"name":"FERRY","description":"FERRY","isDeprecated":false,"deprecationReason":null},{"name":"FLEX","description":"Enables flexible transit for access and egress legs","isDeprecated":false,"deprecationReason":null},{"name":"FLEXIBLE","description":"Enables flexible transit for access and egress legs","isDeprecated":true,"deprecationReason":"Use FLEX instead"},{"name":"FUNICULAR","description":"FUNICULAR","isDeprecated":false,"deprecationReason":null},{"name":"GONDOLA","description":"GONDOLA","isDeprecated":false,"deprecationReason":null},{"name":"LEG_SWITCH","description":"Only used internally. No use for API users.","isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"RAIL","description":"RAIL","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER","description":"SCOOTER","isDeprecated":false,"deprecationReason":null},{"name":"SUBWAY","description":"SUBWAY","isDeprecated":false,"deprecationReason":null},{"name":"TRAM","description":"TRAM","isDeprecated":false,"deprecationReason":null},{"name":"CARPOOL","description":"\"Private car trips shared with others.","isDeprecated":false,"deprecationReason":null},{"name":"TAXI","description":"A taxi, possibly operated by a public transport agency.","isDeprecated":false,"deprecationReason":null},{"name":"TRANSIT","description":"A special transport mode, which includes all public transport.","isDeprecated":false,"deprecationReason":null},{"name":"WALK","description":"WALK","isDeprecated":false,"deprecationReason":null},{"name":"TROLLEYBUS","description":"Electric buses that draw power from overhead wires using poles.","isDeprecated":false,"deprecationReason":null},{"name":"MONORAIL","description":"Railway in which the track consists of a single rail or a beam.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Money","description":"An amount of money.","fields":[{"name":"currency","description":"The currency of this money amount.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Currency","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"amount","description":"Money in the major currency unit, so 3.10 USD is represented as `3.1`.\n\nIf you want to get the minor currency unit (310 cents), multiply with\n(10 to the power of `currency.digits`).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INTERFACE","name":"Node","description":"An object with an ID","fields":[{"name":"id","description":"The ID of an object","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"Agency","ofType":null},{"kind":"OBJECT","name":"Alert","ofType":null},{"kind":"OBJECT","name":"BikePark","ofType":null},{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},{"kind":"OBJECT","name":"CarPark","ofType":null},{"kind":"OBJECT","name":"Cluster","ofType":null},{"kind":"OBJECT","name":"DepartureRow","ofType":null},{"kind":"OBJECT","name":"Pattern","ofType":null},{"kind":"OBJECT","name":"RentalVehicle","ofType":null},{"kind":"OBJECT","name":"Route","ofType":null},{"kind":"OBJECT","name":"Stop","ofType":null},{"kind":"OBJECT","name":"TicketType","ofType":null},{"kind":"OBJECT","name":"Trip","ofType":null},{"kind":"OBJECT","name":"VehicleParking","ofType":null},{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null},{"kind":"OBJECT","name":"placeAtDistance","ofType":null},{"kind":"OBJECT","name":"stopAtDistance","ofType":null}]},{"kind":"ENUM","name":"OccupancyStatus","description":"Occupancy status of a vehicle.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NO_DATA_AVAILABLE","description":"Default. There is no occupancy-data on this departure.","isDeprecated":false,"deprecationReason":null},{"name":"EMPTY","description":"The vehicle is considered empty by most measures, and has few or no passengers onboard, but is\nstill accepting passengers. There isn't a big difference between this and MANY_SEATS_AVAILABLE\nso it's possible to handle them as the same value, if one wants to limit the number of different\nvalues.\nSIRI nordic profile: merge these into `MANY_SEATS_AVAILABLE`.","isDeprecated":false,"deprecationReason":null},{"name":"MANY_SEATS_AVAILABLE","description":"The vehicle or carriage has a large number of seats available. The amount of free seats out of\nthe total seats available to be considered large enough to fall into this category is\ndetermined at the discretion of the producer. There isn't a big difference between this and\nEMPTY so it's possible to handle them as the same value, if one wants to limit the number of\ndifferent values.\nSIRI nordic profile: more than ~50% of seats available.","isDeprecated":false,"deprecationReason":null},{"name":"FEW_SEATS_AVAILABLE","description":"The vehicle or carriage has a small number of seats available. The amount of free seats out of\nthe total seats available to be considered small enough to fall into this category is\ndetermined at the discretion of the producer.\nSIRI nordic profile: less than ~50% of seats available.","isDeprecated":false,"deprecationReason":null},{"name":"STANDING_ROOM_ONLY","description":"The vehicle or carriage can currently accommodate only standing passengers.\nSIRI nordic profile: less than ~10% of seats available.","isDeprecated":false,"deprecationReason":null},{"name":"CRUSHED_STANDING_ROOM_ONLY","description":"The vehicle or carriage can currently accommodate only standing passengers and has limited\nspace for them. There isn't a big difference between this and FULL so it's possible to handle\nthem as the same value, if one wants to limit the number of different values.\nSIRI nordic profile: merge into `STANDING_ROOM_ONLY`.","isDeprecated":false,"deprecationReason":null},{"name":"FULL","description":"The vehicle is considered full by most measures, but may still be allowing passengers to\nboard.","isDeprecated":false,"deprecationReason":null},{"name":"NOT_ACCEPTING_PASSENGERS","description":"The vehicle or carriage is not accepting passengers.\nSIRI nordic profile: if vehicle/carriage is not in use / unavailable, or passengers are only allowed\nto alight due to e.g. crowding.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"OffsetDateTime","description":"An ISO-8601-formatted datetime with offset, i.e. `2023-06-13T14:30+03:00` for 2:30pm on June 13th 2023 at Helsinki's offset from UTC at that time.\n\nISO-8601 allows many different formats but OTP will only return the profile specified in RFC3339.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"OpeningHours","description":null,"fields":[{"name":"osm","description":"OSM-formatted string of the opening hours.\n\nThe spec is available at: https://wiki.openstreetmap.org/wiki/Key:opening_hours","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dates","description":"Opening hours for the selected dates using the local time of the parking lot.\nEach date can have multiple time spans.\n\nNote: This is not implemented yet and always returns null.","args":[{"name":"dates","description":"Opening hours will be returned for these dates. Dates should use YYYYMMDD format.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"LocalTimeSpanDate","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"OptimizeType","description":"Optimization type for bicycling legs","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"QUICK","description":"Prefer faster routes","isDeprecated":false,"deprecationReason":null},{"name":"SAFE","description":"Prefer safer routes, i.e. avoid crossing streets and use bike paths when possible","isDeprecated":false,"deprecationReason":null},{"name":"FLAT","description":"Prefer flat terrain","isDeprecated":false,"deprecationReason":null},{"name":"GREENWAYS","description":"GREENWAYS","isDeprecated":false,"deprecationReason":null},{"name":"TRIANGLE","description":"**TRIANGLE** optimization type can be used to set relative preferences of optimization factors. See argument `triangle`.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"PageInfo","description":"Information about pagination in a connection.","fields":[{"name":"hasNextPage","description":"When paginating forwards, are there more items?","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"hasPreviousPage","description":"When paginating backwards, are there more items?","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"startCursor","description":"When paginating backwards, the cursor to continue.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"endCursor","description":"When paginating forwards, the cursor to continue.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ParkingFilter","description":"The filter definition to include or exclude parking facilities used during routing.\n\nLogically, the filter algorithm work as follows:\n\n- The starting point is the set of all facilities, lets call it `A`.\n- Then all `select` filters are applied to `A`, potentially reducing the number of facilities used.\n Let's call the result of this `B`.\n An empty `select` will lead to `A` being equal to `B`.\n- Lastly, the `not` filters are applied to `B`, reducing the set further.\n Lets call this final set `C`.\n An empty `not` will lead to `B` being equal to `C`.\n- The remaining parking facilities in `C` are used for routing.","fields":null,"inputFields":[{"name":"not","description":"Exclude parking facilities based on their properties.\n\nIf empty nothing is excluded from the initial set of facilities but may be filtered down\nfurther by the `select` filter.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilterOperation","ofType":null}}},"defaultValue":null},{"name":"select","description":"Include parking facilities based on their properties.\n\nIf empty everything is included from the initial set of facilities but may be filtered down\nfurther by the `not` filter.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilterOperation","ofType":null}}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ParkingFilterOperation","description":null,"fields":null,"inputFields":[{"name":"tags","description":"Filter parking facilities based on their tag","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Pattern","description":"Pattern is sequence of stops used by trips on a specific direction and variant\nof a route. Most routes have only two patterns: one for outbound trips and one\nfor inbound trips","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"The route this pattern runs on","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"directionId","description":"Direction of the pattern. Possible values: 0, 1 or -1.\n-1 indicates that the direction is irrelevant, i.e. the route has patterns only in one direction.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the pattern. Pattern name can be just the name of the route or it can\ninclude details of destination and origin stops.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"code","description":"ID of the pattern","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"headsign","description":"Vehicle headsign used by trips of this pattern","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trips","description":"Trips which run on this pattern","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"tripsForDate","description":"Trips which run on this pattern on the specified date","args":[{"name":"serviceDate","description":"Return trips of the pattern active on this date. Format: YYYYMMDD","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops served by this pattern","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"geometry","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Coordinates","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"patternGeometry","description":"Coordinates of the route of this pattern in Google polyline encoded format","args":[],"type":{"kind":"OBJECT","name":"Geometry","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"semanticHash","description":"Hash code of the pattern. This value is stable and not dependent on the\npattern id, i.e. this value can be used to check whether two patterns are the\nsame, even if their ids have changed.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"By default, list of alerts which have directly an effect on just the pattern.\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the pattern.\nBy default, list of alerts which have directly an effect on just the pattern.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"PatternAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehiclePositions","description":"Realtime-updated position of vehicles that are serving this pattern.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"VehiclePosition","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"originalTripPattern","description":"Original Trip pattern for changed patterns","args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PatternAlertType","description":"Entities, which are relevant for a pattern and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"PATTERN","description":"Alerts affecting the pattern","isDeprecated":false,"deprecationReason":null},{"name":"AGENCY","description":"Alerts affecting the pattern's route's agency","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE","description":"Alerts affecting the route that the pattern runs on","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPE","description":"Alerts affecting the route type of the route that the pattern runs on","isDeprecated":false,"deprecationReason":null},{"name":"TRIPS","description":"Alerts affecting the trips which run on this pattern","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_PATTERN","description":"Alerts affecting the stops which are on this pattern","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_TRIPS","description":"Alerts affecting the stops of the trips which run on this pattern","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"PickupDropoffType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"SCHEDULED","description":"Regularly scheduled pickup / drop off.","isDeprecated":false,"deprecationReason":null},{"name":"NONE","description":"No pickup / drop off available.","isDeprecated":false,"deprecationReason":null},{"name":"CALL_AGENCY","description":"Must phone agency to arrange pickup / drop off.","isDeprecated":false,"deprecationReason":null},{"name":"COORDINATE_WITH_DRIVER","description":"Must coordinate with driver to arrange pickup / drop off.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Place","description":null,"fields":[{"name":"name","description":"For transit stops, the name of the stop. For points of interest, the name of the POI.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vertexType","description":"Type of vertex. (Normal, Bike sharing station, Bike P+R, Transit stop) Mostly\nused for better localization of bike sharing and P+R station names","args":[],"type":{"kind":"ENUM","name":"VertexType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the place (WGS 84)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the place (WGS 84)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"arrival","description":"The time the rider will arrive at the place. This also includes real-time information\nif available.","args":[],"type":{"kind":"OBJECT","name":"LegTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"departure","description":"The time the rider will depart the place. This also includes real-time information\nif available.","args":[],"type":{"kind":"OBJECT","name":"LegTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"The stop related to the place.","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stopPosition","description":"The position of the stop in the pattern. This is not required to start from 0 or be consecutive - any\nincreasing integer sequence along the stops is valid.\n\nThe purpose of this field is to identify the stop within the pattern so it can be cross-referenced\nbetween it and the itinerary. It is safe to cross-reference when done quickly, i.e. within seconds.\nHowever, it should be noted that realtime updates can change the values, so don't store it for\nlonger amounts of time.\n\nDepending on the source data, this might not be the GTFS `stop_sequence` but another value, perhaps\neven generated.\n\nThe position can be either at a certain stop or in between two for trips where this is possible.","args":[],"type":{"kind":"UNION","name":"StopPosition","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleRentalStation","description":"The vehicle rental station related to the place","args":[],"type":{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalVehicle","description":"The rental vehicle related to the place","args":[],"type":{"kind":"OBJECT","name":"RentalVehicle","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParking","description":"The vehicle parking related to the place","args":[],"type":{"kind":"OBJECT","name":"VehicleParking","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikeRentalStation","description":"The bike rental station related to the place","args":[],"type":{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},"isDeprecated":true,"deprecationReason":"Use vehicleRentalStation and rentalVehicle instead"},{"name":"bikePark","description":"The bike parking related to the place","args":[],"type":{"kind":"OBJECT","name":"BikePark","ofType":null},"isDeprecated":true,"deprecationReason":"bikePark is deprecated. Use vehicleParking instead."},{"name":"carPark","description":"The car parking related to the place","args":[],"type":{"kind":"OBJECT","name":"CarPark","ofType":null},"isDeprecated":true,"deprecationReason":"carPark is deprecated. Use vehicleParking instead."},{"name":"arrivalTime","description":"The time the rider will arrive at the place. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Long","ofType":null}},"isDeprecated":true,"deprecationReason":"Use `arrival` which includes timezone information."},{"name":"departureTime","description":"The time the rider will depart the place. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Long","ofType":null}},"isDeprecated":true,"deprecationReason":"Use `departure` which includes timezone information."}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INTERFACE","name":"PlaceInterface","description":"Interface for places, e.g. stops, stations, parking areas..","fields":[{"name":"id","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the place (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the place (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"BikePark","ofType":null},{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},{"kind":"OBJECT","name":"CarPark","ofType":null},{"kind":"OBJECT","name":"DepartureRow","ofType":null},{"kind":"OBJECT","name":"RentalVehicle","ofType":null},{"kind":"OBJECT","name":"Stop","ofType":null},{"kind":"OBJECT","name":"VehicleParking","ofType":null},{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null}]},{"kind":"OBJECT","name":"Plan","description":null,"fields":[{"name":"date","description":"The time and date of travel. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"from","description":"The origin","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"to","description":"The destination","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"itineraries","description":"A list of possible itineraries","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Itinerary","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"messageEnums","description":"A list of possible error messages as enum","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"messageStrings","description":"A list of possible error messages in cleartext","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"routingErrors","description":"A list of routing errors, and fields which caused them","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RoutingError","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"nextPageCursor","description":"Use the cursor to go to the next \"page\" of itineraries. Copy the cursor from the last response\nto the pageCursor query parameter and keep the original request as is. This will enable you to\nsearch for itineraries in the next search-window.\nThe cursor based paging only support stepping to the next page, as it does not support jumping.\nThis is only usable when public transportation mode(s) are included in the query.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"previousPageCursor","description":"Use the cursor to go to the previous \"page\" of itineraries. Copy the cursor from the last\nresponse to the pageCursor query parameter and keep the original request otherwise as is.\nThis will enable you to search for itineraries in the previous search-window.\nThe cursor based paging only support stepping to the previous page, as it does not support\njumping.\nThis is only usable when public transportation mode(s) are included in the query.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"prevDateTime","description":"This is the suggested search time for the \"previous page\" or time window. Insert it together\nwith the searchWindowUsed in the request to get a new set of trips preceding in the\nsearch-window BEFORE the current search. No duplicate trips should be returned, unless a trip\nis delayed and new realtime-data is available.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use previousPageCursor instead"},{"name":"nextDateTime","description":"This is the suggested search time for the \"next page\" or time window. Insert it together\nwith the searchWindowUsed in the request to get a new set of trips following in the\nsearch-window AFTER the current search. No duplicate trips should be returned, unless a trip\nis delayed and new realtime-data is available.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use nextPageCursor instead"},{"name":"searchWindowUsed","description":"This is the `searchWindow` used by the raptor search. It is provided here for debugging\npurpousess.\n\nThe unit is seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"debugOutput","description":"Information about the timings for the plan generation","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"debugOutput","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Polyline","description":"List of coordinates in an encoded polyline format (see https://developers.google.com/maps/documentation/utilities/polylinealgorithm). The value appears in JSON as a string.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"PositionAtStop","description":"Stop position at a specific stop.","fields":[{"name":"position","description":"Position of the stop in the pattern. Positions are not required to start from 0 or be consecutive.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"PositionBetweenStops","description":"The board/alight position in between two stops of the pattern of a trip with continuous pickup/drop off.","fields":[{"name":"previousPosition","description":"Position of the previous stop in the pattern. Positions are not required to start from 0 or be consecutive.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"nextPosition","description":"Position of the next stop in the pattern. Positions are not required to start from 0 or be consecutive.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PropulsionType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"HUMAN","description":"Pedal or foot propulsion","isDeprecated":false,"deprecationReason":null},{"name":"ELECTRIC_ASSIST","description":"Provides electric motor assist only in combination with human propulsion - no throttle mode","isDeprecated":false,"deprecationReason":null},{"name":"ELECTRIC","description":"Powered by battery-powered electric motor with throttle mode","isDeprecated":false,"deprecationReason":null},{"name":"COMBUSTION","description":"Powered by gasoline combustion engine","isDeprecated":false,"deprecationReason":null},{"name":"COMBUSTION_DIESEL","description":"Powered by diesel combustion engine","isDeprecated":false,"deprecationReason":null},{"name":"HYBRID","description":"Powered by combined combustion engine and battery-powered motor","isDeprecated":false,"deprecationReason":null},{"name":"PLUG_IN_HYBRID","description":"Powered by combined combustion engine and battery-powered motor with plug-in charging","isDeprecated":false,"deprecationReason":null},{"name":"HYDROGEN_FUEL_CELL","description":"Powered by hydrogen fuel cell powered electric motor","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"Qualifier","description":"Additional qualifier for a transport mode.\nNote that qualifiers can only be used with certain transport modes.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"RENT","description":"The vehicle used for transport can be rented","isDeprecated":false,"deprecationReason":null},{"name":"HAVE","description":"~~HAVE~~\n**Currently not used**","isDeprecated":true,"deprecationReason":"Currently not used"},{"name":"PARK","description":"The vehicle used must be left to a parking area before continuing the journey.\nThis qualifier is usable with transport modes `CAR` and `BICYCLE`.\nNote that the vehicle is only parked if the journey is continued with public\ntransportation (e.g. if only `CAR` and `WALK` transport modes are allowed to\nbe used, the car will not be parked as it is used for the whole journey).","isDeprecated":false,"deprecationReason":null},{"name":"KEEP","description":"~~KEEP~~\n**Currently not used**","isDeprecated":true,"deprecationReason":"Currently not used"},{"name":"PICKUP","description":"The user can be picked up by someone else riding a vehicle","isDeprecated":false,"deprecationReason":null},{"name":"DROPOFF","description":"The user can be dropped off by someone else riding a vehicle","isDeprecated":false,"deprecationReason":null},{"name":"ACCESS","description":"The mode is used for the access part of the search.","isDeprecated":false,"deprecationReason":null},{"name":"EGRESS","description":"The mode is used for the egress part of the search.","isDeprecated":false,"deprecationReason":null},{"name":"DIRECT","description":"The mode is used for the direct street search.","isDeprecated":false,"deprecationReason":null},{"name":"HAIL","description":"Hailing a ride, for example via an app like Uber.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"QueryType","description":null,"fields":[{"name":"node","description":"Fetches an object given its ID","args":[{"name":"id","description":"The ID of an object","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"defaultValue":null}],"type":{"kind":"INTERFACE","name":"Node","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"feeds","description":"Get all available feeds","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Feed","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"agencies","description":"Get all agencies","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Agency","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"ticketTypes","description":"Return list of available ticket types","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"TicketType","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"Get a single agency based on agency ID, i.e. value of field `gtfsId` (ID format is `FeedId:StopId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"Get all stops","args":[{"name":"ids","description":"Return stops with these ids","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"name","description":"Query stops by this name","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stopsByBbox","description":"Get all stops within the specified bounding box","args":[{"name":"minLat","description":"Southern bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"minLon","description":"Western bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"maxLat","description":"Northern bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"maxLon","description":"Eastern bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"feeds","description":"List of feed ids from which stops are returned","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stopsByRadius","description":"Get all stops within the specified radius from a location. The returned type\nis a Relay connection (see\nhttps://facebook.github.io/relay/graphql/connections.htm). The stopAtDistance\ntype has two values: stop and distance.","args":[{"name":"lat","description":"Latitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"lon","description":"Longitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"radius","description":"Radius (in meters) to search for from the specified location. Note that this\nis walking distance along streets and paths rather than a geographic distance.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"defaultValue":null},{"name":"feeds","description":"List of feed ids from which stops are returned","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"before","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"after","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"first","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"last","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"stopAtDistanceConnection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"nearest","description":"Get all places (stops, stations, etc. with coordinates) within the specified\nradius from a location. The returned type is a Relay connection (see\nhttps://facebook.github.io/relay/graphql/connections.htm). The placeAtDistance\ntype has two fields: place and distance. The search is done by walking so the\ndistance is according to the network of walkable streets and paths.","args":[{"name":"lat","description":"Latitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"lon","description":"Longitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"maxDistance","description":"Maximum distance (in meters) to search for from the specified location. Note\nthat this is walking distance along streets and paths rather than a\ngeographic distance. Default is 2000m","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"2000"},{"name":"maxResults","description":"Maximum number of results. Search is stopped when this limit is reached. Default is 20.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"20"},{"name":"filterByPlaceTypes","description":"Only return places that are one of these types, e.g. `STOP` or `VEHICLE_RENT`","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"FilterPlaceType","ofType":null}},"defaultValue":null},{"name":"filterByModes","description":"Only return places that are related to one of these transport modes. This\nargument can be used to return e.g. only nearest railway stations or only\nnearest places related to bicycling.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"Mode","ofType":null}},"defaultValue":null},{"name":"before","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"after","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"first","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"last","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"placeAtDistanceConnection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"departureRow","description":"Get a single departure row based on its ID (ID format is `FeedId:StopId:PatternId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"DepartureRow","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"Get a single stop based on its ID, i.e. value of field `gtfsId` (ID format is `FeedId:StopId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"station","description":"Get a single station based on its ID, i.e. value of field `gtfsId` (format is `FeedId:StopId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stations","description":"Get all stations","args":[{"name":"ids","description":"Only return stations that match one of the ids in this list","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"name","description":"Query stations by name","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"Get all routes","args":[{"name":"ids","description":"Only return routes with these ids","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"feeds","description":"Only return routes with these feedIds","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"name","description":"Query routes by this name","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"transportModes","description":"Only include routes, which use one of these modes","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"Mode","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"Get a single route based on its ID, i.e. value of field `gtfsId` (format is `FeedId:RouteId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Route","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trips","description":"Get all trips","args":[{"name":"feeds","description":"Only return trips with these feedIds","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Get a single trip based on its ID, i.e. value of field `gtfsId` (format is `FeedId:TripId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"fuzzyTrip","description":"Finds a trip matching the given parameters. This query type is useful if the\nid of a trip is not known, but other details uniquely identifying the trip are\navailable from some source (e.g. MQTT vehicle positions).","args":[{"name":"route","description":"id of the route","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"direction","description":"Direction of the trip, possible values: 0, 1 or -1.\n-1 indicates that the direction is irrelevant, i.e. in case the route has\ntrips only in one direction. See field `directionId` of Pattern.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"-1"},{"name":"date","description":"Departure date of the trip, format: YYYY-MM-DD","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"time","description":"Departure time of the trip, format: seconds since midnight of the departure date","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"cancelledTripTimes","description":"Get cancelled TripTimes.","args":[{"name":"feeds","description":"Feed feedIds (e.g. [\"HSL\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"routes","description":"Route gtfsIds (e.g. [\"HSL:1098\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"patterns","description":"TripPattern codes (e.g. [\"HSL:1098:1:01\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"trips","description":"Trip gtfsIds (e.g. [\"HSL:1098_20190405_Ma_2_1455\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"minDate","description":"Only cancelled trip times scheduled to run on minDate or after are returned. Format: \"2019-12-23\" or \"20191223\".","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"maxDate","description":"Only cancelled trip times scheduled to run on maxDate or before are returned. Format: \"2019-12-23\" or \"20191223\".","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"minDepartureTime","description":"Only cancelled trip times that have first stop departure time at\nminDepartureTime or after are returned. Format: seconds since midnight of minDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"maxDepartureTime","description":"Only cancelled trip times that have first stop departure time at\nmaxDepartureTime or before are returned. Format: seconds since midnight of maxDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"minArrivalTime","description":"Only cancelled trip times that have last stop arrival time at minArrivalTime\nor after are returned. Format: seconds since midnight of minDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"maxArrivalTime","description":"Only cancelled trip times that have last stop arrival time at maxArrivalTime\nor before are returned. Format: seconds since midnight of maxDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"Get all patterns","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"pattern","description":"Get a single pattern based on its ID, i.e. value of field `code` (format is\n`FeedId:RouteId:DirectionId:PatternVariantNumber`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"clusters","description":"Get all clusters","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Cluster","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"cluster","description":"Get a single cluster based on its ID, i.e. value of field `gtfsId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Cluster","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"Get all active alerts","args":[{"name":"feeds","description":"Only return alerts in these feeds","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"severityLevel","description":"Only return alerts with these severity levels","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"AlertSeverityLevelType","ofType":null}}},"defaultValue":null},{"name":"effect","description":"Only return alerts with these effects","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"AlertEffectType","ofType":null}}},"defaultValue":null},{"name":"cause","description":"Only return alerts with these causes","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"AlertCauseType","ofType":null}}},"defaultValue":null},{"name":"route","description":"Only return alerts affecting these routes","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"stop","description":"Only return alerts affecting these stops","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"serviceTimeRange","description":"Get the time range for which the API has data available","args":[],"type":{"kind":"OBJECT","name":"serviceTimeRange","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikeRentalStations","description":"Get all bike rental stations","args":[{"name":"ids","description":"Return bike rental stations with these ids.\n**Note:** if an id is invalid (or the bike rental station service is unavailable)\nthe returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"BikeRentalStation","ofType":null}},"isDeprecated":true,"deprecationReason":"Use rentalVehicles or vehicleRentalStations instead"},{"name":"bikeRentalStation","description":"Get a single bike rental station based on its ID, i.e. value of field `stationId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},"isDeprecated":true,"deprecationReason":"Use rentalVehicle or vehicleRentalStation instead"},{"name":"rentalVehicles","description":"Get all rental vehicles","args":[{"name":"ids","description":"Return rental vehicles with these ids, i.e. value of field `vehicleId`.\n**Note:** if an id is invalid (or the rental service is unavailable)\nthe returned list will contain `null` values.\n\nIf this is provided all other filters are ignored.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"formFactors","description":"Return only rental vehicles that have this form factor.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"FormFactor","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"RentalVehicle","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"rentalVehicle","description":"Get a single rental vehicle based on its ID, i.e. value of field `vehicleId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"RentalVehicle","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleRentalStations","description":"Get all vehicle rental stations","args":[{"name":"ids","description":"Return vehicle rental stations with these ids, i.e. value of field `stationId`.\n**Note:** if an id is invalid (or the rental service is unavailable)\nthe returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleRentalStation","description":"Get a single vehicle rental station based on its ID, i.e. value of field `stationId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikeParks","description":"Get all bike parks","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"BikePark","ofType":null}},"isDeprecated":true,"deprecationReason":"bikeParks is deprecated. Use vehicleParkings instead."},{"name":"bikePark","description":"Get a single bike park based on its ID, i.e. value of field `bikeParkId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"BikePark","ofType":null},"isDeprecated":true,"deprecationReason":"bikePark is deprecated. Use vehicleParking instead."},{"name":"carParks","description":"Get all car parks","args":[{"name":"ids","description":"Return car parks with these ids.\n**Note:** if an id is invalid (or the car park service is unavailable) the returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"CarPark","ofType":null}},"isDeprecated":true,"deprecationReason":"carParks is deprecated. Use vehicleParkings instead."},{"name":"carPark","description":"Get a single car park based on its ID, i.e. value of field `carParkId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"CarPark","ofType":null},"isDeprecated":true,"deprecationReason":"carPark is deprecated. Use vehicleParking instead."},{"name":"vehicleParkings","description":"Get all vehicle parkings","args":[{"name":"ids","description":"Return vehicle parkings with these ids.\n**Note:** if an id is invalid (or the vehicle parking service is unavailable)\nthe returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"VehicleParking","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParking","description":"Get a single vehicle parking based on its ID","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"VehicleParking","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"viewer","description":"Needed until https://github.com/facebook/relay/issues/112 is resolved","args":[],"type":{"kind":"OBJECT","name":"QueryType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"plan","description":"Plans an itinerary from point A to point B based on the given arguments","args":[{"name":"date","description":"Date of departure or arrival in format YYYY-MM-DD. Default value: current date","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"time","description":"Time of departure or arrival in format hh:mm:ss. Default value: current time","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"from","description":"The geographical location where the itinerary begins.\nUse either this argument or `fromPlace`, but not both.","type":{"kind":"INPUT_OBJECT","name":"InputCoordinates","ofType":null},"defaultValue":null},{"name":"to","description":"The geographical location where the itinerary ends.\nUse either this argument or `toPlace`, but not both.","type":{"kind":"INPUT_OBJECT","name":"InputCoordinates","ofType":null},"defaultValue":null},{"name":"fromPlace","description":"The place where the itinerary begins in format `name::place`, where `place`\nis either a lat,lng pair (e.g. `Pasila::60.199041,24.932928`) or a stop id\n(e.g. `Pasila::HSL:1000202`).\nUse either this argument or `from`, but not both.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"toPlace","description":"The place where the itinerary ends in format `name::place`, where `place` is\neither a lat,lng pair (e.g. `Pasila::60.199041,24.932928`) or a stop id\n(e.g. `Pasila::HSL:1000202`).\nUse either this argument or `to`, but not both.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"wheelchair","description":"Whether the itinerary must be wheelchair accessible. Default value: false","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"numItineraries","description":"The maximum number of itineraries to return. Default value: 3.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"3"},{"name":"searchWindow","description":"The length of the search-window in seconds. This parameter is optional.\n\nThe search-window is defined as the duration between the earliest-departure-time(EDT) and\nthe latest-departure-time(LDT). OTP will search for all itineraries in this departure\nwindow. If `arriveBy=true` the `dateTime` parameter is the latest-arrival-time, so OTP\nwill dynamically calculate the EDT. Using a short search-window is faster than using a\nlonger one, but the search duration is not linear. Using a \\\"too\\\" short search-window will\nwaste resources server side, while using a search-window that is too long will be slow.\n\nOTP will dynamically calculate a reasonable value for the search-window, if not provided.\nThe calculation comes with a significant overhead (10-20% extra). Whether you should use the\ndynamic calculated value or pass in a value depends on your use-case. For a travel planner\nin a small geographical area, with a dense network of public transportation, a fixed value\nbetween 40 minutes and 2 hours makes sense. To find the appropriate search-window, adjust\nit so that the number of itineraries on average is around the wanted `numItineraries`. Make\nsure you set the `numItineraries` to a high number while testing. For a country wide area\nlike Norway, using the dynamic search-window is the best.\n\nWhen paginating, the search-window is calculated using the `numItineraries` in the original\nsearch together with statistics from the search for the last page. This behaviour is\nconfigured server side, and can not be overridden from the client.\n\nThe search-window used is returned to the response metadata as `searchWindowUsed` for\ndebugging purposes.","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":null},{"name":"pageCursor","description":"Use the cursor to get the next or previous page of results.\nThe next page is a set of itineraries departing after the last itinerary in this result and\nthe previous page is a set of itineraries departing before the first itinerary.\nThis is only usable when public transportation mode(s) are included in the query.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"bikeReluctance","description":"A multiplier for how bad biking is, compared to being in transit for equal\nlengths of time. Default value: 2.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"bikeWalkingReluctance","description":"A multiplier for how bad walking with a bike is, compared to being in transit for equal\nlengths of time. Default value: 5.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"carReluctance","description":"A multiplier for how bad driving is, compared to being in transit for equal\nlengths of time. Default value: 3.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"walkReluctance","description":"A multiplier for how bad walking is, compared to being in transit for equal\nlengths of time. Empirically, values between 2 and 4 seem to correspond\nwell to the concept of not wanting to walk too much without asking for\ntotally ridiculous itineraries, but this observation should in no way be\ntaken as scientific or definitive. Your mileage may vary. See\nhttps://github.com/opentripplanner/OpenTripPlanner/issues/4090 for impact on\nperformance with high values. Default value: 2.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"waitReluctance","description":"How much worse is waiting for a transit vehicle than being on a transit\nvehicle, as a multiplier. The default value treats wait and on-vehicle time\nas the same. It may be tempting to set this higher than walkReluctance (as\nstudies often find this kind of preferences among riders) but the planner\nwill take this literally and walk down a transit line to avoid waiting at a\nstop. This used to be set less than 1 (0.95) which would make waiting\noffboard preferable to waiting onboard in an interlined trip. That is also\nundesirable. If we only tried the shortest possible transfer at each stop to\nneighboring stop patterns, this problem could disappear. Default value: 1.0.","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"walkSpeed","description":"Max walk speed along streets, in meters per second. Default value: 1.33","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"bikeSpeed","description":"Max bike speed along streets, in meters per second. Default value: 5.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"bikeSwitchTime","description":"Time to get on and off your own bike, in seconds. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"bikeSwitchCost","description":"Cost of getting on and off your own bike. Unit: seconds. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"optimize","description":"Optimization type for bicycling legs, e.g. prefer flat terrain. Default value: `QUICK`","type":{"kind":"ENUM","name":"OptimizeType","ofType":null},"defaultValue":null},{"name":"triangle","description":"Triangle optimization parameters for bicycling legs. Only effective when `optimize` is set to **TRIANGLE**.","type":{"kind":"INPUT_OBJECT","name":"InputTriangle","ofType":null},"defaultValue":null},{"name":"arriveBy","description":"Whether the itinerary should depart at the specified time (false), or arrive\nto the destination at the specified time (true). Default value: false.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"preferred","description":"List of routes and agencies which are given higher preference when planning the itinerary","type":{"kind":"INPUT_OBJECT","name":"InputPreferred","ofType":null},"defaultValue":null},{"name":"unpreferred","description":"List of routes and agencies which are given lower preference when planning the itinerary","type":{"kind":"INPUT_OBJECT","name":"InputUnpreferred","ofType":null},"defaultValue":null},{"name":"walkBoardCost","description":"This prevents unnecessary transfers by adding a cost for boarding a vehicle. Unit: seconds. Default value: 600","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"bikeBoardCost","description":"Separate cost for boarding a vehicle with a bicycle, which is more difficult\nthan on foot. Unit: seconds. Default value: 600","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"banned","description":"List of routes, trips, agencies and stops which are not used in the itinerary","type":{"kind":"INPUT_OBJECT","name":"InputBanned","ofType":null},"defaultValue":null},{"name":"transferPenalty","description":"An extra penalty added on transfers (i.e. all boardings except the first\none). Not to be confused with bikeBoardCost and walkBoardCost, which are the\ncost of boarding a vehicle with and without a bicycle. The boardCosts are\nused to model the 'usual' perceived cost of using a transit vehicle, and the\ntransferPenalty is used when a user requests even less transfers. In the\nlatter case, we don't actually optimize for fewest transfers, as this can\nlead to absurd results. Consider a trip in New York from Grand Army Plaza\n(the one in Brooklyn) to Kalustyan's at noon. The true lowest transfers\nroute is to wait until midnight, when the 4 train runs local the whole way.\nThe actual fastest route is the 2/3 to the 4/5 at Nevins to the 6 at Union\nSquare, which takes half an hour. Even someone optimizing for fewest\ntransfers doesn't want to wait until midnight. Maybe they would be willing\nto walk to 7th Ave and take the Q to Union Square, then transfer to the 6.\nIf this takes less than optimize_transfer_penalty seconds, then that's what\nwe'll return. Default value: 0.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"transportModes","description":"List of transportation modes that the user is willing to use. Default: `[\"WALK\",\"TRANSIT\"]`","type":{"kind":"LIST","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"TransportMode","ofType":null}},"defaultValue":null},{"name":"modeWeight","description":"The weight multipliers for transit modes. WALK, BICYCLE, CAR, TRANSIT and LEG_SWITCH are not included.","type":{"kind":"INPUT_OBJECT","name":"InputModeWeight","ofType":null},"defaultValue":null},{"name":"debugItineraryFilter","description":"Debug the itinerary-filter-chain. The filters will mark itineraries as deleted, but does NOT delete them when this is enabled.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"allowKeepingRentedBicycleAtDestination","description":"Whether arriving at the destination with a rented (station) bicycle is allowed without\ndropping it off. Default: false.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"keepingRentedBicycleAtDestinationCost","description":"The cost of arriving at the destination with the rented vehicle, to discourage doing so.\nDefault value: 0.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"boardSlack","description":"Invariant: `boardSlack + alightSlack <= transferSlack`. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"alightSlack","description":"Invariant: `boardSlack + alightSlack <= transferSlack`. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"minTransferTime","description":"A global minimum transfer time (in seconds) that specifies the minimum\namount of time that must pass between exiting one transit vehicle and\nboarding another. This time is in addition to time it might take to walk\nbetween transit stops. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"nonpreferredTransferPenalty","description":"Penalty (in seconds) for using a non-preferred transfer. Default value: 180","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"maxTransfers","description":"Maximum number of transfers. Default value: 2","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"startTransitStopId","description":"This argument has currently no effect on which itineraries are returned. Use\nargument `fromPlace` to start the itinerary from a specific stop.\n~~A transit stop that this trip must start from~~","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"omitCanceled","description":"When false, return itineraries using canceled trips. Default value: true.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"},{"name":"ignoreRealtimeUpdates","description":"When true, real-time updates are ignored during this search. Default value: false","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"locale","description":"Two-letter language code (ISO 639-1) used for returned text.\n**Note:** only part of the data has translations available and names of\nstops and POIs are returned in their default language. Due to missing\ntranslations, it is sometimes possible that returned text uses a mixture of two languages.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"allowedTicketTypes","description":"List of ticket types that are allowed to be used in itineraries.\nSee `ticketTypes` query for list of possible ticket types.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"allowedVehicleRentalNetworks","description":"Which vehicle rental networks can be used. By default, all networks are allowed.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"bannedVehicleRentalNetworks","description":"Which vehicle rental networks cannot be used. By default, all networks are allowed.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"walkSafetyFactor","description":"Factor for how much the walk safety is considered in routing. Value should be between 0 and 1.\nIf the value is set to be 0, safety is ignored. Default is 1.0.","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"parking","description":"Preferences for vehicle parking","type":{"kind":"INPUT_OBJECT","name":"VehicleParkingInput","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Plan","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RealTimeEstimate","description":"Real-time estimates for a vehicle at a certain place.","fields":[{"name":"time","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"delay","description":"The delay or \"earliness\" of the vehicle at a certain place.\n\nIf the vehicle is early then this is a negative duration.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Duration","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"RealtimeState","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"SCHEDULED","description":"The trip information comes from the GTFS feed, i.e. no real-time update has been applied.","isDeprecated":false,"deprecationReason":null},{"name":"UPDATED","description":"The trip information has been updated, but the trip pattern stayed the same as the trip pattern of the scheduled trip.","isDeprecated":false,"deprecationReason":null},{"name":"CANCELED","description":"The trip has been canceled by a real-time update.","isDeprecated":false,"deprecationReason":null},{"name":"ADDED","description":"The trip has been added using a real-time update, i.e. the trip was not present in the GTFS feed.","isDeprecated":false,"deprecationReason":null},{"name":"MODIFIED","description":"The trip information has been updated and resulted in a different trip pattern\ncompared to the trip pattern of the scheduled trip.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"RelativeDirection","description":"Actions to take relative to the current position when engaging a walking/driving step.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"DEPART","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"HARD_LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SLIGHTLY_LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CONTINUE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SLIGHTLY_RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"HARD_RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CIRCLE_CLOCKWISE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CIRCLE_COUNTERCLOCKWISE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"ELEVATOR","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"UTURN_LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"UTURN_RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"ENTER_STATION","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"EXIT_STATION","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"FOLLOW_SIGNS","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicle","description":"Rental vehicle represents a vehicle that belongs to a rental network.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleId","description":"ID of the vehicle in the format of network:id","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the vehicle","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickupNow","description":"If true, vehicle is currently available for renting.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"network","description":"ID of the rental network.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the vehicle (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the vehicle (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalUris","description":"Platform-specific URLs to begin the vehicle.","args":[],"type":{"kind":"OBJECT","name":"VehicleRentalUris","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"operative","description":"If true, vehicle is not disabled.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleType","description":"The type of the rental vehicle (scooter, bicycle, car...)","args":[],"type":{"kind":"OBJECT","name":"RentalVehicleType","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicleEntityCounts","description":null,"fields":[{"name":"total","description":"The total number of entities (e.g. vehicles, spaces).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"byType","description":"The number of entities by type","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RentalVehicleTypeCount","ofType":null}}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicleType","description":null,"fields":[{"name":"formFactor","description":"The vehicle's general form factor","args":[],"type":{"kind":"ENUM","name":"FormFactor","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"propulsionType","description":"The primary propulsion type of the vehicle","args":[],"type":{"kind":"ENUM","name":"PropulsionType","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicleTypeCount","description":null,"fields":[{"name":"vehicleType","description":"The type of the rental vehicle (scooter, bicycle, car...)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RentalVehicleType","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"count","description":"The number of vehicles of this type","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RideHailingEstimate","description":"An estimate for a ride on a hailed vehicle, like an Uber car.","fields":[{"name":"provider","description":"The provider of the ride hailing service.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RideHailingProvider","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"minPrice","description":"The lower bound of the price estimate of this ride.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Money","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"maxPrice","description":"The upper bound of the price estimate of this ride.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Money","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"arrival","description":"The estimated time it takes for the vehicle to arrive.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Duration","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"productName","description":"The name of the ride, ie. UberX","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RideHailingProvider","description":null,"fields":[{"name":"id","description":"The ID of the ride hailing provider.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RiderCategory","description":"Category of riders a fare product applies to, for example students or pensioners.","fields":[{"name":"id","description":"ID of the category","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the category.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Route","description":"Route represents a public transportation service, usually from point A to point\nB and *back*, shown to customers under a single name, e.g. bus 550. Routes\ncontain patterns (see field `patterns`), which describe different variants of\nthe route, e.g. outbound pattern from point A to point B and inbound pattern\nfrom point B to point A.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ID of the route in format `FeedId:RouteId`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"Agency operating the route","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"shortName","description":"Short name of the route, usually a line number, e.g. 550","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"longName","description":"Long name of the route, e.g. Helsinki-Leppävaara","args":[{"name":"language","description":"If translated longName is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from routes.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"mode","description":"Transport mode of this route, e.g. `BUS`","args":[],"type":{"kind":"ENUM","name":"TransitMode","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"type","description":"The raw GTFS route type as a integer. For the list of possible values, see:\nhttps://developers.google.com/transit/gtfs/reference/#routestxt and\nhttps://developers.google.com/transit/gtfs/reference/extended-route-types","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"desc","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"color","description":"The color (in hexadecimal format) the agency operating this route would prefer\nto use on UI elements (e.g. polylines on a map) related to this route. This\nvalue is not available for most routes.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"textColor","description":"The color (in hexadecimal format) the agency operating this route would prefer\nto use when displaying text related to this route. This value is not available\nfor most routes.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikesAllowed","description":null,"args":[],"type":{"kind":"ENUM","name":"BikesAllowed","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"List of patterns which operate on this route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops on this route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"trips","description":"List of trips which operate on this route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"List of alerts which have an effect on the route directly or indirectly.\nBy default only alerts directly affecting this route are returned. It's also possible\nto return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the route.\nBy default only returns alerts that directly affect this route.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"RouteAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"sortOrder","description":"Orders the routes in a way which is useful for presentation to passengers.\nRoutes with smaller values should be displayed first.\n\nThe value can be any non-negative integer. A null value means that no information was supplied.\n\nThis value is passed through from the source data without modification. If multiple feeds\ndefine sort orders for their routes, they may not be comparable to each other as no agreed scale\nexists.\n\nTwo routes may also have the same sort order and clients must decide based on other criteria\nwhat the actual order is.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"RouteAlertType","description":"Entities that are relevant for routes that can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCY","description":"Alerts affecting the route's agency.","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE","description":"Alerts directly affecting the route.","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPE","description":"Alerts affecting the route type of the route.","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_ROUTE","description":"Alerts affecting the stops that are on the route.","isDeprecated":false,"deprecationReason":null},{"name":"TRIPS","description":"Alerts affecting the route's trips.","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_TRIPS","description":"Alerts affecting the stops on some trips of the route.","isDeprecated":false,"deprecationReason":null},{"name":"PATTERNS","description":"Alerts affecting route's patterns.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"RouteType","description":"Route type entity which covers all agencies if agency is null,\notherwise only relevant for one agency.","fields":[{"name":"routeType","description":"GTFS Route type.\nFor the list of possible values, see:\n https://developers.google.com/transit/gtfs/reference/#routestxt and\n https://developers.google.com/transit/gtfs/reference/extended-route-types","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"A public transport agency","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"The routes which have the defined routeType and belong to the agency, if defined.\nOtherwise all routes of the feed that have the defined routeType.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RoutingError","description":"Description of the reason, why the planner did not return any results","fields":[{"name":"code","description":"An enum describing the reason","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"RoutingErrorCode","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"inputField","description":"An enum describing the field which should be changed, in order for the search to succeed","args":[],"type":{"kind":"ENUM","name":"InputField","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":"A textual description of why the search failed. The clients are expected to have their own translations based on the code, for user visible error messages.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"RoutingErrorCode","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NO_TRANSIT_CONNECTION","description":"No transit connection was found between the origin and destination within the operating day or\nthe next day, not even sub-optimal ones.","isDeprecated":false,"deprecationReason":null},{"name":"NO_TRANSIT_CONNECTION_IN_SEARCH_WINDOW","description":"A transit connection was found, but it was outside the search window. See the metadata for a token\nfor retrieving the result outside the search window.","isDeprecated":false,"deprecationReason":null},{"name":"OUTSIDE_SERVICE_PERIOD","description":"The date specified is outside the range of data currently loaded into the system as it is too\nfar into the future or the past.\n\nThe specific date range of the system is configurable by an administrator and also depends on\nthe input data provided.","isDeprecated":false,"deprecationReason":null},{"name":"OUTSIDE_BOUNDS","description":"The coordinates are outside the geographic bounds of the transit and street data currently loaded\ninto the system and therefore cannot return any results.","isDeprecated":false,"deprecationReason":null},{"name":"LOCATION_NOT_FOUND","description":"The specified location is not close to any streets or transit stops currently loaded into the\nsystem, even though it is generally within its bounds.\n\nThis can happen when there is only transit but no street data coverage at the location in\nquestion.","isDeprecated":false,"deprecationReason":null},{"name":"NO_STOPS_IN_RANGE","description":"No stops are reachable from the start or end locations specified.\n\nYou can try searching using a different access or egress mode, for example cycling instead of walking,\nincrease the walking/cycling/driving speed or have an administrator change the system's configuration\nso that stops further away are considered.","isDeprecated":false,"deprecationReason":null},{"name":"WALKING_BETTER_THAN_TRANSIT","description":"Transit connections were requested and found but because it is easier to just walk all the way\nto the destination they were removed.\n\nIf you want to still show the transit results, you need to make walking less desirable by\nincreasing the walk reluctance.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Stop","description":"Stop can represent either a single public transport stop, where passengers can\nboard and/or disembark vehicles, or a station, which contains multiple stops.\nSee field `locationType`.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stopTimesForPattern","description":"Returns timetable of the specified pattern at this stop","args":[{"name":"id","description":"Id of the pattern","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"startTime","description":"Return departures after this time. Format: Unix timestamp in seconds. Default value: current time","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"Return stoptimes within this time range, starting from `startTime`. Unit: Seconds","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"},{"name":"numberOfDepartures","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"2"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ÌD of the stop in format `FeedId:StopId`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the stop, e.g. Pasilan asema","args":[{"name":"language","description":"If translated name is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from stops.txt.\nE.g. Swedish name for Pasilan asema is Böle station.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"geometries","description":"Representations of this stop's geometry. This is mainly interesting for flex stops which can be\na polygon or a group of stops either consisting of either points or polygons.\n\nRegular fixed-schedule stops return a single point.\n\nStations (parent stations with child stops) contain a geometry collection with a point for the\ncentral coordinate plus a convex hull polygon (https://en.wikipedia.org/wiki/Convex_hull) of all\ncoordinates of the child stops.\n\nIf there are only two child stops then the convex hull is a straight line between the them. If\nthere is a single child stop then it's a single point.","args":[],"type":{"kind":"OBJECT","name":"StopGeometries","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"code","description":"Stop code which is visible at the stop","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"desc","description":"Description of the stop, usually a street name","args":[{"name":"language","description":"If translated description is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses descriptions from stops.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"zoneId","description":"ID of the zone where this stop is located","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":null,"args":[{"name":"language","description":"If translated url is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses url from stops.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"locationType","description":"Identifies whether this stop represents a stop or station.","args":[],"type":{"kind":"ENUM","name":"LocationType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"parentStation","description":"The station which this stop is part of (or null if this stop is not part of a station)","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairBoarding","description":"Whether wheelchair boarding is possible for at least some of vehicles on this stop","args":[],"type":{"kind":"ENUM","name":"WheelchairBoarding","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"direction","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"timezone","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleType","description":"The raw GTFS route type used by routes which pass through this stop. For the\nlist of possible values, see:\nhttps://developers.google.com/transit/gtfs/reference/#routestxt and\nhttps://developers.google.com/transit/gtfs/reference/extended-route-types","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleMode","description":"Transport mode (e.g. `BUS`) used by routes which pass through this stop or\n`null` if mode cannot be determined, e.g. in case no routes pass through the stop.\nNote that also other types of vehicles may use the stop, e.g. tram replacement\nbuses might use stops which have `TRAM` as their mode.","args":[],"type":{"kind":"ENUM","name":"Mode","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"platformCode","description":"Identifier of the platform, usually a number. This value is only present for stops that are part of a station","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"cluster","description":"The cluster which this stop is part of","args":[],"type":{"kind":"OBJECT","name":"Cluster","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"Returns all stops that are children of this station (Only applicable for stations)","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"Routes which pass through this stop","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"Patterns which pass through this stop","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"transfers","description":"List of nearby stops which can be used for transfers","args":[{"name":"maxDistance","description":"Maximum distance to the transfer stop. Defaults to unlimited.\n**Note:** only stops that are linked as a transfer stops to this stop are\nreturned, i.e. this does not do a query to search for *all* stops within\nradius of `maxDistance`.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"stopAtDistance","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesForServiceDate","description":"Returns list of stoptimes for the specified date","args":[{"name":"date","description":"Date in format YYYYMMDD","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"StoptimesInPattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesForPatterns","description":"Returns list of stoptimes (arrivals and departures) at this stop, grouped by patterns","args":[{"name":"startTime","description":"Return departures after this time. Format: Unix timestamp in seconds. Default value: current time","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"Return stoptimes within this time range, starting from `startTime`. Unit: Seconds","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"},{"name":"numberOfDepartures","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"5"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"StoptimesInPattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesWithoutPatterns","description":"Returns list of stoptimes (arrivals and departures) at this stop","args":[{"name":"startTime","description":"Return departures after this time. Format: Unix timestamp in seconds. Default value: current time","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"Return stoptimes within this time range, starting from `startTime`. Unit: Seconds","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"},{"name":"numberOfDepartures","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"5"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"By default, list of alerts which have directly an effect on just the stop.\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the stop.\nBy default, list of alerts which have directly an effect on just the stop.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"StopAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"StopAlertType","description":"Entities, which are relevant for a stop and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"STOP","description":"Alerts affecting the stop","isDeprecated":false,"deprecationReason":null},{"name":"PATTERNS","description":"Alerts affecting the stop's patterns","isDeprecated":false,"deprecationReason":null},{"name":"AGENCIES_OF_ROUTES","description":"Alerts affecting the agencies of the routes going through the stop","isDeprecated":false,"deprecationReason":null},{"name":"ROUTES","description":"Alerts affecting the routes that go through the stop","isDeprecated":false,"deprecationReason":null},{"name":"TRIPS","description":"Alerts affecting the trips that go through this stop","isDeprecated":false,"deprecationReason":null},{"name":"STOP_ON_ROUTES","description":"Alerts affecting the stop on specific routes","isDeprecated":false,"deprecationReason":null},{"name":"STOP_ON_TRIPS","description":"Alerts affecting the stop on specific trips","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"StopGeometries","description":null,"fields":[{"name":"geoJson","description":"Representation of the stop geometries as GeoJSON (https://geojson.org/)","args":[],"type":{"kind":"SCALAR","name":"GeoJson","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"googleEncoded","description":"Representation of a stop as a series of polylines.\n\nPolygons of flex stops are represented as linear rings (lines where the first and last point are the same).\n\nProper stops are represented as single point \"lines\".","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Geometry","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"StopOnRoute","description":"Stop that should (but not guaranteed) to exist on a route.","fields":[{"name":"stop","description":"Stop at the route. It's also possible that the stop is no longer on the route.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"Route which contains the stop.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"StopOnTrip","description":"Stop that should (but not guaranteed) to exist on a trip.","fields":[{"name":"stop","description":"Stop at the trip. It's also possible that the stop is no longer on the trip.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Trip which contains the stop.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"UNION","name":"StopPosition","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"PositionAtStop","ofType":null},{"kind":"OBJECT","name":"PositionBetweenStops","ofType":null}]},{"kind":"OBJECT","name":"StopRelationship","description":"Upcoming or current stop and how close the vehicle is to it.","fields":[{"name":"status","description":"How close the vehicle is to `stop`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"VehicleStopStatus","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Stoptime","description":"Stoptime represents the time when a specific trip arrives to or departs from a specific stop.","fields":[{"name":"stop","description":"The stop where this arrival/departure happens","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stopPosition","description":"The sequence of the stop in the pattern. This is not required to start from 0 or be consecutive - any\nincreasing integer sequence along the stops is valid.\n\nThe purpose of this field is to identify the stop within the pattern so it can be cross-referenced\nbetween it and the itinerary. It is safe to cross-reference when done quickly, i.e. within seconds.\nHowever, it should be noted that realtime updates can change the values, so don't store it for\nlonger amounts of time.\n\nDepending on the source data, this might not be the GTFS `stop_sequence` but another value, perhaps\neven generated.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"scheduledArrival","description":"Scheduled arrival time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeArrival","description":"Realtime prediction of arrival time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"arrivalDelay","description":"The offset from the scheduled arrival time in seconds. Negative values\nindicate that the trip is running ahead of schedule.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"scheduledDeparture","description":"Scheduled departure time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeDeparture","description":"Realtime prediction of departure time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"departureDelay","description":"The offset from the scheduled departure time in seconds. Negative values\nindicate that the trip is running ahead of schedule","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"timepoint","description":"true, if this stop is used as a time equalization stop. false otherwise.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"true, if this stoptime has real-time data available","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeState","description":"State of real-time data","args":[],"type":{"kind":"ENUM","name":"RealtimeState","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupType","description":"Whether the vehicle can be boarded at this stop. This field can also be used\nto indicate if boarding is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropoffType","description":"Whether the vehicle can be disembarked at this stop. This field can also be\nused to indicate if disembarkation is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"serviceDay","description":"Departure date of the trip. Format: Unix timestamp (local time) in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Trip which this stoptime is for","args":[],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"headsign","description":"Vehicle headsign of the trip on this stop. Trip headsigns can change during\nthe trip (e.g. on routes which run on loops), so this value should be used\ninstead of `tripHeadsign` to display the headsign relevant to the user.","args":[{"name":"language","description":"If translated headsign is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from trip_headsign.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"StoptimesInPattern","description":"Stoptimes grouped by pattern","fields":[{"name":"pattern","description":null,"args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimes","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"String","description":"Built-in String","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"SystemNotice","description":"A system notice is used to tag elements with system information for debugging\nor other system related purpose. One use-case is to run a routing search with\n'debugItineraryFilter: true'. This will then tag itineraries instead of removing\nthem from the result. This make it possible to inspect the itinerary-filter-chain.\nA SystemNotice only has english text,\nbecause the primary user are technical staff, like testers and developers.","fields":[{"name":"tag","description":"Notice's tag","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"text","description":"Notice's description","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"TicketType","description":"Describes ticket type","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"fareId","description":"Ticket type ID in format `FeedId:TicketTypeId`. Ticket type IDs are usually\ncombination of ticket zones where the ticket is valid.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"price","description":"Price of the ticket in currency that is specified in `currency` field","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"currency","description":"ISO 4217 currency code","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"zones","description":"List of zones where this ticket is valid.\nCorresponds to field `zoneId` in **Stop** type.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"TransitMode","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AIRPLANE","description":"AIRPLANE","isDeprecated":false,"deprecationReason":null},{"name":"BUS","description":"BUS","isDeprecated":false,"deprecationReason":null},{"name":"CABLE_CAR","description":"CABLE_CAR","isDeprecated":false,"deprecationReason":null},{"name":"COACH","description":"COACH","isDeprecated":false,"deprecationReason":null},{"name":"FERRY","description":"FERRY","isDeprecated":false,"deprecationReason":null},{"name":"FUNICULAR","description":"FUNICULAR","isDeprecated":false,"deprecationReason":null},{"name":"GONDOLA","description":"GONDOLA","isDeprecated":false,"deprecationReason":null},{"name":"RAIL","description":"RAIL","isDeprecated":false,"deprecationReason":null},{"name":"SUBWAY","description":"SUBWAY","isDeprecated":false,"deprecationReason":null},{"name":"TRAM","description":"TRAM","isDeprecated":false,"deprecationReason":null},{"name":"CARPOOL","description":"\"Private car trips shared with others.","isDeprecated":false,"deprecationReason":null},{"name":"TAXI","description":"A taxi, possibly operated by a public transport agency.","isDeprecated":false,"deprecationReason":null},{"name":"TROLLEYBUS","description":"Electric buses that draw power from overhead wires using poles.","isDeprecated":false,"deprecationReason":null},{"name":"MONORAIL","description":"Railway in which the track consists of a single rail or a beam.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"TranslatedString","description":"Text with language","fields":[{"name":"text","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"language","description":"Two-letter language code (ISO 639-1)","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TransportMode","description":"Transportation mode which can be used in the itinerary","fields":null,"inputFields":[{"name":"mode","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"Mode","ofType":null}},"defaultValue":null},{"name":"qualifier","description":"Optional additional qualifier for transport mode, e.g. `RENT`","type":{"kind":"ENUM","name":"Qualifier","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Trip","description":"Trip is a specific occurance of a pattern, usually identified by route, direction on the route and exact departure time.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ID of the trip in format `FeedId:TripId`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"The route the trip is running on","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"serviceId","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"activeDates","description":"List of dates when this trip is in service. Format: YYYYMMDD","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"tripShortName","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tripHeadsign","description":"Headsign of the vehicle when running on this trip","args":[{"name":"language","description":"If a translated headsign is found from GTFS translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from trip_headsign.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routeShortName","description":"Short name of the route this trip is running. See field `shortName` of Route.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"directionId","description":"Direction code of the trip, i.e. is this the outbound or inbound trip of a\npattern. Possible values: 0, 1 or `null` if the direction is irrelevant, i.e.\nthe pattern has trips only in one direction.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"blockId","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"shapeId","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairAccessible","description":"Whether the vehicle running this trip can be boarded by a wheelchair","args":[],"type":{"kind":"ENUM","name":"WheelchairBoarding","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikesAllowed","description":"Whether bikes are allowed on board the vehicle running this trip","args":[],"type":{"kind":"ENUM","name":"BikesAllowed","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pattern","description":"The pattern the trip is running on","args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops this trip passes through","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"semanticHash","description":"Hash code of the trip. This value is stable and not dependent on the trip id.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimes","description":"List of times when this trip arrives to or departs from a stop","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"departureStoptime","description":"Departure time from the first stop","args":[{"name":"serviceDate","description":"Date for which the departure time is returned. Format: YYYYMMDD. If this\nargument is not used, field `serviceDay` in the stoptime will have a value of 0.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stoptime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"arrivalStoptime","description":"Arrival time to the final stop","args":[{"name":"serviceDate","description":"Date for which the arrival time is returned. Format: YYYYMMDD. If this\nargument is not used, field `serviceDay` in the stoptime will have a value of 0.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stoptime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesForDate","description":null,"args":[{"name":"serviceDate","description":"Date for which stoptimes are returned. Format: YYYYMMDD","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"geometry","description":"List of coordinates of this trip's route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"tripGeometry","description":"Coordinates of the route of this trip in Google polyline encoded format","args":[],"type":{"kind":"OBJECT","name":"Geometry","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"By default, list of alerts which have directly an effect on just the trip.\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the trip.\nBy default, list of alerts which have directly an effect on just the trip.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"TripAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"occupancy","description":"The latest realtime occupancy information for the latest occurance of this\ntrip.","args":[],"type":{"kind":"OBJECT","name":"TripOccupancy","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"TripAlertType","description":"Entities, which are relevant for a trip and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"TRIP","description":"Alerts affecting the trip","isDeprecated":false,"deprecationReason":null},{"name":"PATTERN","description":"Alerts affecting the trip's pattern","isDeprecated":false,"deprecationReason":null},{"name":"AGENCY","description":"Alerts affecting the trip's agency","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE","description":"Alerts affecting the trip's route","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPE","description":"Alerts affecting the route type of the trip's route","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_TRIP","description":"Alerts affecting the stops visited on the trip.\nSome of the alerts can only affect the trip or its route on the stop.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"TripOccupancy","description":"Occupancy of a vehicle on a trip. This should include the most recent occupancy information\navailable for a trip. Historic data might not be available.","fields":[{"name":"occupancyStatus","description":"Occupancy information mapped to a limited set of descriptive states.","args":[],"type":{"kind":"ENUM","name":"OccupancyStatus","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Unknown","description":"This is used for alert entities that we don't explicitly handle or they are missing.","fields":[{"name":"description","description":"Entity's description","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleParking","description":"Vehicle parking represents a location where bicycles or cars can be parked.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParkingId","description":"ID of the park","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the park","args":[{"name":"language","description":"Returns name with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, value of `spacesAvailable` is updated from a real-time source.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"detailsUrl","description":"URL which contains details of this vehicle parking.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"imageUrl","description":"URL of an image which may be displayed to the user showing the vehicle parking.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tags","description":"Source specific tags of the vehicle parking, which describe the available features. For example\npark_and_ride, bike_lockers, or static_osm_data.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"note","description":"A short translatable note containing details of this vehicle parking.","args":[{"name":"language","description":"Returns note with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"state","description":"The state of this vehicle parking.\nOnly ones in an OPERATIONAL state may be used for Park and Ride.","args":[],"type":{"kind":"ENUM","name":"VehicleParkingState","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bicyclePlaces","description":"Does this vehicle parking have spaces (capacity) for bicycles.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"anyCarPlaces","description":"Does this vehicle parking have spaces (capacity) for either wheelchair accessible (disabled)\nor normal cars.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"carPlaces","description":"Does this vehicle parking have spaces (capacity) for cars excluding wheelchair accessible spaces.\nUse anyCarPlaces to check if any type of car may use this vehicle parking.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairAccessibleCarPlaces","description":"Does this vehicle parking have wheelchair accessible (disabled) car spaces (capacity).","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"capacity","description":"The capacity (maximum available spaces) of this vehicle parking.","args":[],"type":{"kind":"OBJECT","name":"VehicleParkingSpaces","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"availability","description":"The currently available spaces at this vehicle parking.","args":[],"type":{"kind":"OBJECT","name":"VehicleParkingSpaces","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"openingHours","description":"Opening hours of the parking facility","args":[],"type":{"kind":"OBJECT","name":"OpeningHours","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"VehicleParkingInput","description":"Preferences for parking facilities used during the routing.","fields":null,"inputFields":[{"name":"filters","description":"Selection filters to include or exclude parking facilities.\nAn empty list will include all facilities in the routing search.","type":{"kind":"LIST","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}},"defaultValue":null},{"name":"unpreferredCost","description":"If `preferred` is non-empty, using a parking facility that doesn't contain\nat least one of the preferred conditions, will receive this extra cost and therefore avoided if\npreferred options are available.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"preferred","description":"If non-empty every parking facility that doesn't match this set of conditions will\nreceive an extra cost (defined by `unpreferredCost`) and therefore avoided.","type":{"kind":"LIST","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleParkingSpaces","description":"The number of spaces by type. null if unknown.","fields":[{"name":"bicycleSpaces","description":"The number of bicycle spaces.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"carSpaces","description":"The number of car spaces.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairAccessibleCarSpaces","description":"The number of wheelchair accessible (disabled) car spaces.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"VehicleParkingState","description":"The state of the vehicle parking. TEMPORARILY_CLOSED and CLOSED are distinct states so that they\nmay be represented differently to the user.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"OPERATIONAL","description":"May be used for park and ride.","isDeprecated":false,"deprecationReason":null},{"name":"TEMPORARILY_CLOSED","description":"Can't be used for park and ride.","isDeprecated":false,"deprecationReason":null},{"name":"CLOSED","description":"Can't be used for park and ride.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"VehiclePosition","description":"Realtime vehicle position","fields":[{"name":"vehicleId","description":"Feed-scoped ID that uniquely identifies the vehicle in the format FeedId:VehicleId","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"label","description":"Human-readable label of the vehicle, eg. a publicly visible number or a license plate","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the vehicle","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the vehicle","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stopRelationship","description":"The current stop where the vehicle will be or is currently arriving.","args":[],"type":{"kind":"OBJECT","name":"StopRelationship","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"speed","description":"Speed of the vehicle in meters/second","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"heading","description":"Bearing, in degrees, clockwise from North, i.e., 0 is North and 90 is East. This can be the\ncompass bearing, or the direction towards the next stop or intermediate location.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lastUpdated","description":"When the position of the vehicle was recorded in seconds since the UNIX epoch.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Which trip this vehicles runs on.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleRentalStation","description":"Vehicle rental station represents a location where users can rent bicycles etc. for a fee.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stationId","description":"ID of the vehicle in the format of network:id","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the vehicle rental station","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehiclesAvailable","description":"Number of vehicles currently available on the rental station.\nSee field `allowPickupNow` to know if is currently possible to pick up a vehicle.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `availableVehicles` instead, which also contains vehicle types"},{"name":"spacesAvailable","description":"Number of free spaces currently available on the rental station.\nNote that this value being 0 does not necessarily indicate that vehicles cannot be returned\nto this station, as for example it might be possible to leave the vehicle in the vicinity of\nthe rental station, even if the vehicle racks don't have any spaces available.\nSee field `allowDropoffNow` to know if is currently possible to return a vehicle.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `availableSpaces` instead, which also contains the space vehicle types"},{"name":"availableVehicles","description":"Number of vehicles currently available on the rental station, grouped by vehicle type.","args":[],"type":{"kind":"OBJECT","name":"RentalVehicleEntityCounts","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"availableSpaces","description":"Number of free spaces currently available on the rental station, grouped by vehicle type.","args":[],"type":{"kind":"OBJECT","name":"RentalVehicleEntityCounts","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, values of `vehiclesAvailable` and `spacesAvailable` are updated from a\nreal-time source. If false, values of `vehiclesAvailable` and `spacesAvailable`\nare always the total capacity divided by two.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowDropoff","description":"If true, vehicles can be returned to this station if the station has spaces available\nor allows overloading.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickup","description":"If true, vehicles can be picked up from this station if the station has vehicles available.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowDropoffNow","description":"If true, vehicles can be currently returned to this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickupNow","description":"If true, vehicles can be currently picked up from this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"network","description":"ID of the rental network.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the vehicle rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the vehicle rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"capacity","description":"Nominal capacity (number of racks) of the rental station.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowOverloading","description":"If true, vehicles can be returned even if spacesAvailable is zero or vehicles > capacity.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalUris","description":"Platform-specific URLs to begin renting a vehicle from this station.","args":[],"type":{"kind":"OBJECT","name":"VehicleRentalUris","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"operative","description":"If true, station is on and in service.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleRentalUris","description":null,"fields":[{"name":"android","description":"A URI that can be passed to an Android app with an {@code android.intent.action.VIEW} Android\nintent to support Android Deep Links.\nMay be null if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"ios","description":"A URI that can be used on iOS to launch the rental app for this rental network.\nMay be {@code null} if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"web","description":"A URL that can be used by a web browser to show more information about renting a vehicle.\nMay be {@code null} if a rental URL does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"VehicleStopStatus","description":"How close the vehicle is to the stop.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"STOPPED_AT","description":"The vehicle is standing at the stop.","isDeprecated":false,"deprecationReason":null},{"name":"IN_TRANSIT_TO","description":"The vehicle has departed the previous stop and is in transit.","isDeprecated":false,"deprecationReason":null},{"name":"INCOMING_AT","description":"The vehicle is just about to arrive at the stop (on a stop display, the vehicle symbol typically flashes).","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"VertexType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NORMAL","description":"NORMAL","isDeprecated":false,"deprecationReason":null},{"name":"TRANSIT","description":"TRANSIT","isDeprecated":false,"deprecationReason":null},{"name":"BIKEPARK","description":"BIKEPARK","isDeprecated":false,"deprecationReason":null},{"name":"BIKESHARE","description":"BIKESHARE","isDeprecated":false,"deprecationReason":null},{"name":"PARKANDRIDE","description":"PARKANDRIDE","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"WheelchairBoarding","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NO_INFORMATION","description":"There is no accessibility information for the stop.","isDeprecated":false,"deprecationReason":null},{"name":"POSSIBLE","description":"At least some vehicles at this stop can be boarded by a rider in a wheelchair.","isDeprecated":false,"deprecationReason":null},{"name":"NOT_POSSIBLE","description":"Wheelchair boarding is not possible at this stop.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"__Directive","description":null,"fields":[{"name":"name","description":"The __Directive type represents a Directive that a server supports.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isRepeatable","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"locations","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"__DirectiveLocation","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"args","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__InputValue","ofType":null}}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"__DirectiveLocation","description":"An enum describing valid locations where a directive can be placed","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"QUERY","description":"Indicates the directive is valid on queries.","isDeprecated":false,"deprecationReason":null},{"name":"MUTATION","description":"Indicates the directive is valid on mutations.","isDeprecated":false,"deprecationReason":null},{"name":"SUBSCRIPTION","description":"Indicates the directive is valid on subscriptions.","isDeprecated":false,"deprecationReason":null},{"name":"FIELD","description":"Indicates the directive is valid on fields.","isDeprecated":false,"deprecationReason":null},{"name":"FRAGMENT_DEFINITION","description":"Indicates the directive is valid on fragment definitions.","isDeprecated":false,"deprecationReason":null},{"name":"FRAGMENT_SPREAD","description":"Indicates the directive is valid on fragment spreads.","isDeprecated":false,"deprecationReason":null},{"name":"INLINE_FRAGMENT","description":"Indicates the directive is valid on inline fragments.","isDeprecated":false,"deprecationReason":null},{"name":"VARIABLE_DEFINITION","description":"Indicates the directive is valid on variable definitions.","isDeprecated":false,"deprecationReason":null},{"name":"SCHEMA","description":"Indicates the directive is valid on a schema SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"SCALAR","description":"Indicates the directive is valid on a scalar SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"OBJECT","description":"Indicates the directive is valid on an object SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"FIELD_DEFINITION","description":"Indicates the directive is valid on a field SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"ARGUMENT_DEFINITION","description":"Indicates the directive is valid on a field argument SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"INTERFACE","description":"Indicates the directive is valid on an interface SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"UNION","description":"Indicates the directive is valid on an union SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"ENUM","description":"Indicates the directive is valid on an enum SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"ENUM_VALUE","description":"Indicates the directive is valid on an enum value SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"INPUT_OBJECT","description":"Indicates the directive is valid on an input object SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"INPUT_FIELD_DEFINITION","description":"Indicates the directive is valid on an input object field SDL definition.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"__EnumValue","description":null,"fields":[{"name":"name","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isDeprecated","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"deprecationReason","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Field","description":null,"fields":[{"name":"name","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"args","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__InputValue","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"type","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"isDeprecated","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"deprecationReason","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__InputValue","description":null,"fields":[{"name":"name","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"type","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"defaultValue","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isDeprecated","description":null,"args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"deprecationReason","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Schema","description":"A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations.","fields":[{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"types","description":"A list of all types supported by this server.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"queryType","description":"The type that query operations will be rooted at.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"mutationType","description":"If this server supports mutation, the type that mutation operations will be rooted at.","args":[],"type":{"kind":"OBJECT","name":"__Type","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"directives","description":"'A list of all directives supported by this server.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Directive","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"subscriptionType","description":"'If this server support subscription, the type that subscription operations will be rooted at.","args":[],"type":{"kind":"OBJECT","name":"__Type","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Type","description":null,"fields":[{"name":"kind","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"__TypeKind","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"fields","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Field","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"interfaces","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"possibleTypes","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"enumValues","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__EnumValue","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"inputFields","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__InputValue","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"ofType","description":null,"args":[],"type":{"kind":"OBJECT","name":"__Type","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isOneOf","description":"This field is considered experimental because it has not yet been ratified in the graphql specification","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"specifiedByURL","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"specifiedByUrl","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"This legacy name has been replaced by `specifiedByURL`"}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"__TypeKind","description":"An enum describing what kind of type a given __Type is","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"SCALAR","description":"Indicates this type is a scalar. 'specifiedByURL' is a valid field","isDeprecated":false,"deprecationReason":null},{"name":"OBJECT","description":"Indicates this type is an object. `fields` and `interfaces` are valid fields.","isDeprecated":false,"deprecationReason":null},{"name":"INTERFACE","description":"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.","isDeprecated":false,"deprecationReason":null},{"name":"UNION","description":"Indicates this type is a union. `possibleTypes` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"ENUM","description":"Indicates this type is an enum. `enumValues` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"INPUT_OBJECT","description":"Indicates this type is an input object. `inputFields` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"LIST","description":"Indicates this type is a list. `ofType` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"NON_NULL","description":"Indicates this type is a non-null. `ofType` is a valid field.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"debugOutput","description":null,"fields":[{"name":"totalTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pathCalculationTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"precalculationTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"renderingTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"timedOut","description":null,"args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"elevationProfileComponent","description":null,"fields":[{"name":"distance","description":"The distance from the start of the step, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevation","description":"The elevation at this distance, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"fare","description":"This type is only here for backwards-compatibility and this API will never return it anymore.\nPlease use the leg's `fareProducts` instead.","fields":[{"name":"type","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"currency","description":"ISO 4217 currency code","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"cents","description":"Fare price in cents. **Note:** this value is dependent on the currency used,\nas one cent is not necessarily ¹/₁₀₀ of the basic monerary unit.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"components","description":"Components which this fare is composed of","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"fareComponent","ofType":null}},"isDeprecated":true,"deprecationReason":"No longer supported"}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"fareComponent","description":"This type is only here for backwards-compatibility and this API will never return it anymore.\nPlease use the leg's `fareProducts` instead.","fields":[{"name":"fareId","description":"ID of the ticket type. Corresponds to `fareId` in **TicketType**.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"currency","description":"ISO 4217 currency code","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"cents","description":"Fare price in cents. **Note:** this value is dependent on the currency used,\nas one cent is not necessarily ¹/₁₀₀ of the basic monerary unit.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"routes","description":"List of routes which use this fare component","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":true,"deprecationReason":"No longer supported"}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"placeAtDistance","description":null,"fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"place","description":null,"args":[],"type":{"kind":"INTERFACE","name":"PlaceInterface","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"distance","description":"Walking distance to the place along streets and paths","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"placeAtDistanceConnection","description":"A connection to a list of items.","fields":[{"name":"edges","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"placeAtDistanceEdge","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"pageInfo","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"PageInfo","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"placeAtDistanceEdge","description":"An edge in a connection.","fields":[{"name":"node","description":"The item at the end of the edge","args":[],"type":{"kind":"OBJECT","name":"placeAtDistance","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"cursor","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"serviceTimeRange","description":"Time range for which the API has data available","fields":[{"name":"start","description":"Time from which the API has data available. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"end","description":"Time until which the API has data available. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"step","description":null,"fields":[{"name":"distance","description":"The distance in meters that this step takes.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"The longitude of the start of the step.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"The latitude of the start of the step.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevationProfile","description":"The elevation profile as a list of { distance, elevation } values.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"elevationProfileComponent","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"relativeDirection","description":"The relative direction (e.g. left or right turn) to take when engaging this step.","args":[],"type":{"kind":"ENUM","name":"RelativeDirection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"absoluteDirection","description":"The cardinal (compass) direction (e.g. north, northeast) taken when engaging this step.","args":[],"type":{"kind":"ENUM","name":"AbsoluteDirection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"streetName","description":"The name of the street, road, or path taken for this step.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"exit","description":"When exiting a highway or traffic circle, the exit name/number.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stayOn","description":"Indicates whether or not a street changes direction at an intersection.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"area","description":"This step is on an open area, such as a plaza or train platform,\nand thus the directions should say something like \"cross\".","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bogusName","description":"The name of this street was generated by the system, so we should only display it once, and\ngenerally just display right/left directions","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkingBike","description":"Is this step walking with a bike?","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"A list of alerts (e.g. construction, detours) applicable to the step.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"stopAtDistance","description":null,"fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":null,"args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"distance","description":"Walking distance to the stop along streets and paths","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"stopAtDistanceConnection","description":"A connection to a list of items.","fields":[{"name":"edges","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"stopAtDistanceEdge","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"pageInfo","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"PageInfo","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"stopAtDistanceEdge","description":"An edge in a connection.","fields":[{"name":"node","description":"The item at the end of the edge","args":[],"type":{"kind":"OBJECT","name":"stopAtDistance","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"cursor","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null}],"directives":[{"name":"include","description":"Directs the executor to include this field or fragment only when the `if` argument is true","locations":["FIELD","FRAGMENT_SPREAD","INLINE_FRAGMENT"],"args":[{"name":"if","description":"Included when true.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"defaultValue":null}]},{"name":"skip","description":"Directs the executor to skip this field or fragment when the `if` argument is true.","locations":["FIELD","FRAGMENT_SPREAD","INLINE_FRAGMENT"],"args":[{"name":"if","description":"Skipped when true.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"defaultValue":null}]},{"name":"async","description":"Use an asynchronous data fetcher on a separate thread for this field.\n\nThis is useful when adding several queries in the same HTTP request, for example by using a batch: Those\nfields annotated with this directive run in parallel.\n\nThis is only worth it when the execution is long running, i.e. more than ~50 milliseconds, so this doesn't happen by default.","locations":["FIELD_DEFINITION"],"args":[]},{"name":"deprecated","description":"Marks the field, argument, input field or enum value as deprecated","locations":["FIELD_DEFINITION","ARGUMENT_DEFINITION","ENUM_VALUE","INPUT_FIELD_DEFINITION"],"args":[{"name":"reason","description":"The reason for the deprecation","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":"\"No longer supported\""}]},{"name":"specifiedBy","description":"Exposes a URL that specifies the behaviour of this scalar.","locations":["SCALAR"],"args":[{"name":"url","description":"The URL that specifies the behaviour of this scalar.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}]},{"name":"oneOf","description":"Indicates an Input Object is a OneOf Input Object.","locations":["INPUT_OBJECT"],"args":[]}]}}} \ No newline at end of file +{"data":{"__schema":{"queryType":{"name":"QueryType"},"mutationType":null,"subscriptionType":null,"types":[{"kind":"ENUM","name":"AbsoluteDirection","description":"The cardinal (compass) direction taken when engaging a walking/driving step.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"EAST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"NORTH","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"NORTHEAST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"NORTHWEST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SOUTH","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SOUTHEAST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SOUTHWEST","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"WEST","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"AccessibilityPreferencesInput","description":"Plan accessibilty preferences. This can be expanded to contain preferences for various accessibility use cases\nin the future. Currently only generic wheelchair preferences are available.","fields":null,"inputFields":[{"name":"wheelchair","description":"Wheelchair related preferences. Note, currently this is the only accessibility mode that is available.","type":{"kind":"INPUT_OBJECT","name":"WheelchairPreferencesInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Agency","description":"A public transport agency","fields":[{"name":"alerts","description":"By default, list of alerts which have an effect on all operations of the agency (e.g. a strike).\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the agency.\nBy default only returns alerts that have an effect on all operations of the agency (e.g. a strike).","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"AgencyAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"fareUrl","description":"URL to a web page which has information of fares used by this agency","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"Agency feed and id","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lang","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the agency","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"phone","description":"Phone number which customers can use to contact this agency","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"List of routes operated by this agency","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"timezone","description":"ID of the time zone which this agency operates on","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":"URL to the home page of the agency","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"AgencyAlertType","description":"Entities, which are relevant for an agency and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCY","description":"Alerts affecting the agency.","isDeprecated":false,"deprecationReason":null},{"name":"ROUTES","description":"Alerts affecting agency's routes","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPES","description":"Alerts affecting the different route types of the agency.\nAlerts that affect route types on all agencies can be fetched through Feed.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Alert","description":"Alert of a current or upcoming disruption in public transportation","fields":[{"name":"agency","description":"Agency affected by the disruption. Note that this value is present only if the\ndisruption has an effect on all operations of the agency (e.g. in case of a strike).","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected agencies.\nUse entities instead."},{"name":"alertCause","description":"Alert cause","args":[],"type":{"kind":"ENUM","name":"AlertCauseType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertDescriptionText","description":"Long description of the alert","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alertDescriptionTextTranslations","description":"Long descriptions of the alert in all different available languages","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"TranslatedString","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"alertEffect","description":"Alert effect","args":[],"type":{"kind":"ENUM","name":"AlertEffectType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertHash","description":"hashcode from the original GTFS-RT alert","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertHeaderText","description":"Header of the alert, if available","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertHeaderTextTranslations","description":"Header of the alert in all different available languages","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"TranslatedString","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"alertSeverityLevel","description":"Alert severity level","args":[],"type":{"kind":"ENUM","name":"AlertSeverityLevelType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertUrl","description":"Url with more information","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alertUrlTranslations","description":"Url with more information in all different available languages","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"TranslatedString","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"effectiveEndDate","description":"Time when this alert is not in effect anymore. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"effectiveStartDate","description":"Time when this alert comes into effect. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"entities","description":"Entities affected by the disruption.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"UNION","name":"AlertEntity","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"feed","description":"The feed in which this alert was published","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"Patterns affected by the disruption","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":true,"deprecationReason":"This will always return an empty list. Use entities instead."},{"name":"route","description":"Route affected by the disruption","args":[],"type":{"kind":"OBJECT","name":"Route","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected routes.\nUse entities instead."},{"name":"stop","description":"Stop affected by the disruption","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected stops.\nUse entities instead."},{"name":"trip","description":"Trip affected by the disruption","args":[],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":true,"deprecationReason":"Alert can have multiple affected entities now instead of there being duplicate alerts\nfor different entities. This will return only one of the affected trips.\nUse entities instead."}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"AlertCauseType","description":"Cause of a alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"ACCIDENT","description":"ACCIDENT","isDeprecated":false,"deprecationReason":null},{"name":"CONSTRUCTION","description":"CONSTRUCTION","isDeprecated":false,"deprecationReason":null},{"name":"DEMONSTRATION","description":"DEMONSTRATION","isDeprecated":false,"deprecationReason":null},{"name":"HOLIDAY","description":"HOLIDAY","isDeprecated":false,"deprecationReason":null},{"name":"MAINTENANCE","description":"MAINTENANCE","isDeprecated":false,"deprecationReason":null},{"name":"MEDICAL_EMERGENCY","description":"MEDICAL_EMERGENCY","isDeprecated":false,"deprecationReason":null},{"name":"OTHER_CAUSE","description":"OTHER_CAUSE","isDeprecated":false,"deprecationReason":null},{"name":"POLICE_ACTIVITY","description":"POLICE_ACTIVITY","isDeprecated":false,"deprecationReason":null},{"name":"STRIKE","description":"STRIKE","isDeprecated":false,"deprecationReason":null},{"name":"TECHNICAL_PROBLEM","description":"TECHNICAL_PROBLEM","isDeprecated":false,"deprecationReason":null},{"name":"UNKNOWN_CAUSE","description":"UNKNOWN_CAUSE","isDeprecated":false,"deprecationReason":null},{"name":"WEATHER","description":"WEATHER","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"AlertEffectType","description":"Effect of a alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"ACCESSIBILITY_ISSUE","description":"ACCESSIBILITY_ISSUE","isDeprecated":false,"deprecationReason":null},{"name":"ADDITIONAL_SERVICE","description":"ADDITIONAL_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"DETOUR","description":"DETOUR","isDeprecated":false,"deprecationReason":null},{"name":"MODIFIED_SERVICE","description":"MODIFIED_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"NO_EFFECT","description":"NO_EFFECT","isDeprecated":false,"deprecationReason":null},{"name":"NO_SERVICE","description":"NO_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"OTHER_EFFECT","description":"OTHER_EFFECT","isDeprecated":false,"deprecationReason":null},{"name":"REDUCED_SERVICE","description":"REDUCED_SERVICE","isDeprecated":false,"deprecationReason":null},{"name":"SIGNIFICANT_DELAYS","description":"SIGNIFICANT_DELAYS","isDeprecated":false,"deprecationReason":null},{"name":"STOP_MOVED","description":"STOP_MOVED","isDeprecated":false,"deprecationReason":null},{"name":"UNKNOWN_EFFECT","description":"UNKNOWN_EFFECT","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"UNION","name":"AlertEntity","description":"Entity related to an alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"Agency","ofType":null},{"kind":"OBJECT","name":"Pattern","ofType":null},{"kind":"OBJECT","name":"Route","ofType":null},{"kind":"OBJECT","name":"RouteType","ofType":null},{"kind":"OBJECT","name":"Stop","ofType":null},{"kind":"OBJECT","name":"StopOnRoute","ofType":null},{"kind":"OBJECT","name":"StopOnTrip","ofType":null},{"kind":"OBJECT","name":"Trip","ofType":null},{"kind":"OBJECT","name":"Unknown","ofType":null}]},{"kind":"ENUM","name":"AlertSeverityLevelType","description":"Severity level of a alert","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"INFO","description":"Info alerts are used for informational messages that should not have a\nsignificant effect on user's journey, for example: A single entrance to a\nmetro station is temporarily closed.","isDeprecated":false,"deprecationReason":null},{"name":"SEVERE","description":"Severe alerts are used when a significant part of public transport services is\naffected, for example: All train services are cancelled due to technical problems.","isDeprecated":false,"deprecationReason":null},{"name":"UNKNOWN_SEVERITY","description":"Severity of alert is unknown","isDeprecated":false,"deprecationReason":null},{"name":"WARNING","description":"Warning alerts are used when a single stop or route has a disruption that can\naffect user's journey, for example: All trams on a specific route are running\nwith irregular schedules.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"AlightPreferencesInput","description":"Preferences related to alighting from a transit vehicle.","fields":null,"inputFields":[{"name":"slack","description":"What is the required minimum time alighting from a vehicle.","type":{"kind":"SCALAR","name":"Duration","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"BicycleParkingPreferencesInput","description":"Preferences for bicycle parking facilities used during the routing.","fields":null,"inputFields":[{"name":"filters","description":"Selection filters to include or exclude parking facilities.\nAn empty list will include all facilities in the routing search.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}}},"defaultValue":null},{"name":"preferred","description":"If non-empty every parking facility that doesn't match this set of conditions will\nreceive an extra cost (defined by `unpreferredCost`) and therefore avoided.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}}},"defaultValue":null},{"name":"unpreferredCost","description":"If `preferred` is non-empty, using a parking facility that doesn't contain\nat least one of the preferred conditions, will receive this extra cost and therefore avoided if\npreferred options are available.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"BicyclePreferencesInput","description":"Preferences related to travel with a bicycle.","fields":null,"inputFields":[{"name":"boardCost","description":"Cost of boarding a vehicle with a bicycle.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null},{"name":"optimization","description":"What criteria should be used when optimizing a cycling route.","type":{"kind":"INPUT_OBJECT","name":"CyclingOptimizationInput","ofType":null},"defaultValue":null},{"name":"parking","description":"Bicycle parking related preferences.","type":{"kind":"INPUT_OBJECT","name":"BicycleParkingPreferencesInput","ofType":null},"defaultValue":null},{"name":"reluctance","description":"A multiplier for how bad cycling is compared to being in transit for equal lengths of time.","type":{"kind":"SCALAR","name":"Reluctance","ofType":null},"defaultValue":null},{"name":"rental","description":"Bicycle rental related preferences.","type":{"kind":"INPUT_OBJECT","name":"BicycleRentalPreferencesInput","ofType":null},"defaultValue":null},{"name":"speed","description":"Maximum speed on flat ground while riding a bicycle. Note, this speed is higher than\nthe average speed will be in itineraries as this is the maximum speed but there are\nfactors that slow down cycling such as crossings, intersections and elevation changes.","type":{"kind":"SCALAR","name":"Speed","ofType":null},"defaultValue":null},{"name":"walk","description":"Walking preferences when walking a bicycle.","type":{"kind":"INPUT_OBJECT","name":"BicycleWalkPreferencesInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"BicycleRentalPreferencesInput","description":"Preferences related to bicycle rental (station based or floating bicycle rental).","fields":null,"inputFields":[{"name":"allowedNetworks","description":"Rental networks which can be potentially used as part of an itinerary.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"bannedNetworks","description":"Rental networks which cannot be used as part of an itinerary.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"destinationBicyclePolicy","description":"Is it possible to arrive to the destination with a rented bicycle and does it\ncome with an extra cost.","type":{"kind":"INPUT_OBJECT","name":"DestinationBicyclePolicyInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"BicycleWalkPreferencesCostInput","description":"Costs related to walking a bicycle.","fields":null,"inputFields":[{"name":"mountDismountCost","description":"A static cost that is added each time hopping on or off a bicycle to start or end\nbicycle walking. However, this cost is not applied when getting on a rented bicycle\nfor the first time or when getting off the bicycle when returning the bicycle.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null},{"name":"reluctance","description":"A cost multiplier of bicycle walking travel time. The multiplier is for how bad\nwalking the bicycle is compared to being in transit for equal lengths of time.","type":{"kind":"SCALAR","name":"Reluctance","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"BicycleWalkPreferencesInput","description":"Preferences for walking a bicycle.","fields":null,"inputFields":[{"name":"cost","description":"Costs related to walking a bicycle.","type":{"kind":"INPUT_OBJECT","name":"BicycleWalkPreferencesCostInput","ofType":null},"defaultValue":null},{"name":"mountDismountTime","description":"How long it takes to hop on or off a bicycle when switching to walking the bicycle\nor when getting on the bicycle again. However, this is not applied when getting\non a rented bicycle for the first time or off the bicycle when returning the bicycle.","type":{"kind":"SCALAR","name":"Duration","ofType":null},"defaultValue":null},{"name":"speed","description":"Maximum walk speed on flat ground. Note, this speed is higher than the average speed\nwill be in itineraries as this is the maximum speed but there are\nfactors that slow down walking such as crossings, intersections and elevation changes.","type":{"kind":"SCALAR","name":"Speed","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BikePark","description":"Bike park represents a location where bicycles can be parked.","fields":[{"name":"bikeParkId","description":"ID of the bike park","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the bike park","args":[{"name":"language","description":"Returns name with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"openingHours","description":"Opening hours of the parking facility","args":[],"type":{"kind":"OBJECT","name":"OpeningHours","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, value of `spacesAvailable` is updated from a real-time source.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of spaces available for bikes","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tags","description":"Source specific tags of the bike park, which describe the available features.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BikeRentalStation","description":"Bike rental station represents a location where users can rent bicycles for a fee.","fields":[{"name":"allowDropoff","description":"If true, bikes can be returned to this station if the station has spaces available\nor allows overloading.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowDropoffNow","description":"If true, bikes can be currently returned to this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowOverloading","description":"If true, bikes can be returned even if spacesAvailable is zero or bikes > capacity.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickup","description":"If true, bikes can be picked up from this station if the station has bikes available.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickupNow","description":"If true, bikes can be currently picked up from this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikesAvailable","description":"Number of bikes currently available on the rental station.\nSee field `allowPickupNow` to know if is currently possible to pick up a bike.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"capacity","description":"Nominal capacity (number of racks) of the rental station.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the bike rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the bike rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the bike rental station","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"networks","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"operative","description":"If true, station is on and in service.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, values of `bikesAvailable` and `spacesAvailable` are updated from a\nreal-time source. If false, values of `bikesAvailable` and `spacesAvailable`\nare always the total capacity divided by two.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalUris","description":"Platform-specific URLs to begin renting a bike from this station.","args":[],"type":{"kind":"OBJECT","name":"BikeRentalStationUris","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of free spaces currently available on the rental station.\nNote that this value being 0 does not necessarily indicate that bikes cannot be returned\nto this station, as for example it might be possible to leave the bike in the vicinity of\nthe rental station, even if the bike racks don't have any spaces available.\nSee field `allowDropoffNow` to know if is currently possible to return a bike.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"state","description":"A description of the current state of this bike rental station, e.g. \"Station on\"","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"Use operative instead"},{"name":"stationId","description":"ID of the bike rental station","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BikeRentalStationUris","description":null,"fields":[{"name":"android","description":"A URI that can be passed to an Android app with an {@code android.intent.action.VIEW} Android\nintent to support Android Deep Links.\nMay be null if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"ios","description":"A URI that can be used on iOS to launch the rental app for this station.\nMay be {@code null} if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"web","description":"A URL that can be used by a web browser to show more information about renting a vehicle at\nthis station.\nMay be {@code null} if a rental URL does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"BikesAllowed","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"ALLOWED","description":"The vehicle being used on this particular trip can accommodate at least one bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"NOT_ALLOWED","description":"No bicycles are allowed on this trip.","isDeprecated":false,"deprecationReason":null},{"name":"NO_INFORMATION","description":"There is no bike information for the trip.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"BoardPreferencesInput","description":"Preferences related to boarding a transit vehicle. Note, board costs for each street mode\ncan be found under the street mode preferences.","fields":null,"inputFields":[{"name":"slack","description":"What is the required minimum waiting time at a stop. Setting this value as `PT0S`, for example, can lead\nto passenger missing a connection when the vehicle leaves ahead of time or the passenger arrives to the\nstop later than expected.","type":{"kind":"SCALAR","name":"Duration","ofType":null},"defaultValue":null},{"name":"waitReluctance","description":"A multiplier for how bad waiting at a stop is compared to being in transit for equal lengths of time.","type":{"kind":"SCALAR","name":"Reluctance","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BookingInfo","description":"Booking information for a stop time which has special requirements to use, like calling ahead or\nusing an app.","fields":[{"name":"contactInfo","description":"Contact information for reaching the service provider","args":[],"type":{"kind":"OBJECT","name":"ContactInfo","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropOffMessage","description":"A message specific to the drop off","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"earliestBookingTime","description":"When is the earliest time the service can be booked.","args":[],"type":{"kind":"OBJECT","name":"BookingTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"latestBookingTime","description":"When is the latest time the service can be booked","args":[],"type":{"kind":"OBJECT","name":"BookingTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"maximumBookingNoticeSeconds","description":"Maximum number of seconds before travel to make the request","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"message","description":"A general message for those booking the service","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"minimumBookingNoticeSeconds","description":"Minimum number of seconds before travel to make the request","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupMessage","description":"A message specific to the pick up","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"BookingTime","description":"Temporal restriction for a booking","fields":[{"name":"daysPrior","description":"How many days before the booking","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"time","description":"Time of the booking","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Boolean","description":"Built-in Boolean","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"CarPark","description":"Car park represents a location where cars can be parked.","fields":[{"name":"carParkId","description":"ID of the car park","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the car park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the car park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"maxCapacity","description":"Number of parking spaces at the car park","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the car park","args":[{"name":"language","description":"Returns name with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"openingHours","description":"Opening hours for the selected dates using the local time of the park.\nEach date can have multiple time spans.","args":[],"type":{"kind":"OBJECT","name":"OpeningHours","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, value of `spacesAvailable` is updated from a real-time source.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of currently available parking spaces at the car park","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tags","description":"Source specific tags of the car park, which describe the available features.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"CarParkingPreferencesInput","description":"Preferences for car parking facilities used during the routing.","fields":null,"inputFields":[{"name":"filters","description":"Selection filters to include or exclude parking facilities.\nAn empty list will include all facilities in the routing search.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}}},"defaultValue":null},{"name":"preferred","description":"If non-empty every parking facility that doesn't match this set of conditions will\nreceive an extra cost (defined by `unpreferredCost`) and therefore avoided.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}}},"defaultValue":null},{"name":"unpreferredCost","description":"If `preferred` is non-empty, using a parking facility that doesn't contain\nat least one of the preferred conditions, will receive this extra cost and therefore avoided if\npreferred options are available.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"CarPreferencesInput","description":"Preferences related to traveling on a car (excluding car travel on transit services such as taxi).","fields":null,"inputFields":[{"name":"parking","description":"Car parking related preferences.","type":{"kind":"INPUT_OBJECT","name":"CarParkingPreferencesInput","ofType":null},"defaultValue":null},{"name":"reluctance","description":"A multiplier for how bad travelling on car is compared to being in transit for equal lengths of time.","type":{"kind":"SCALAR","name":"Reluctance","ofType":null},"defaultValue":null},{"name":"rental","description":"Car rental related preferences.","type":{"kind":"INPUT_OBJECT","name":"CarRentalPreferencesInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"CarRentalPreferencesInput","description":"Preferences related to car rental (station based or floating car rental).","fields":null,"inputFields":[{"name":"allowedNetworks","description":"Rental networks which can be potentially used as part of an itinerary.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"bannedNetworks","description":"Rental networks which cannot be used as part of an itinerary.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Cluster","description":"Cluster is a list of stops grouped by name and proximity","fields":[{"name":"gtfsId","description":"ID of the cluster","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the center of this cluster (i.e. average latitude of stops in this cluster)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the center of this cluster (i.e. average longitude of stops in this cluster)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the cluster","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops in the cluster","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"ContactInfo","description":"Contact information for booking an on-demand or flexible service.","fields":[{"name":"additionalDetails","description":"Additional notes about the contacting the service provider","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bookingUrl","description":"URL to the booking systems of the service","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"contactPerson","description":"Name of the person to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"eMail","description":"Email to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"faxNumber","description":"Fax number to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"infoUrl","description":"URL containing general information about the service","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"phoneNumber","description":"Phone number to contact","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Coordinate","description":"Coordinate (often referred as coordinates), which is used to specify a location using in the\nWGS84 coordinate system.","fields":[{"name":"latitude","description":"Latitude as a WGS84 format number.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"CoordinateValue","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"longitude","description":"Longitude as a WGS84 format number.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"CoordinateValue","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"CoordinateValue","description":"Either a latitude or a longitude as a WGS84 format floating point number.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Coordinates","description":null,"fields":[{"name":"lat","description":"Latitude (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Cost","description":"A static cost that is applied to a certain event or entity. Cost is a positive integer,\nfor example `450`. One cost unit should roughly match a one second travel on transit.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Currency","description":"A currency","fields":[{"name":"code","description":"ISO-4217 currency code, for example `USD` or `EUR`.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"digits","description":"Fractional digits of this currency. A value of 2 would express that in this currency\n100 minor units make up one major unit.\n \nExpressed more concretely: 100 Euro-cents make up one Euro.\n \nNote: Some currencies don't even have any fractional digits, for example the Japanese Yen.\n \nSee also https://en.wikipedia.org/wiki/ISO_4217#Minor_unit_fractions","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"CyclingOptimizationInput","description":"What criteria should be used when optimizing a cycling route.","fields":null,"inputFields":[{"name":"triangle","description":"Define optimization by weighing three criteria.","type":{"kind":"INPUT_OBJECT","name":"TriangleCyclingFactorsInput","ofType":null},"defaultValue":null},{"name":"type","description":"Use one of the predefined optimization types.","type":{"kind":"ENUM","name":"CyclingOptimizationType","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"CyclingOptimizationType","description":"Predefined optimization alternatives for bicycling routing. For more customization,\none can use the triangle factors.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"FLAT_STREETS","description":"Emphasize flatness over safety or duration of the route. This option was previously called `FLAT`.","isDeprecated":false,"deprecationReason":null},{"name":"SAFEST_STREETS","description":"Completely ignore the elevation differences and prefer the streets, that are evaluated\nto be the safest, even more than with the `SAFE_STREETS` option.\nSafety can also include other concerns such as convenience and general cyclist preferences\nby taking into account road surface etc. This option was previously called `GREENWAYS`.","isDeprecated":false,"deprecationReason":null},{"name":"SAFE_STREETS","description":"Emphasize cycling safety over flatness or duration of the route. Safety can also include other\nconcerns such as convenience and general cyclist preferences by taking into account\nroad surface etc. This option was previously called `SAFE`.","isDeprecated":false,"deprecationReason":null},{"name":"SHORTEST_DURATION","description":"Search for routes with the shortest duration while ignoring the cycling safety\nof the streets (the routes should still follow local regulations). Routes can include\nsteep streets, if they are the fastest alternatives. This option was previously called\n`QUICK`.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"DefaultFareProduct","description":"The standard case of a fare product: it only has a single price to be paid by the passenger\nand no discounts are applied.","fields":[{"name":"id","description":"Identifier for the fare product.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"medium","description":"The 'medium' that this product applies to, for example \"Oyster Card\" or \"Berlin Ticket App\".\n \nThis communicates to riders that a specific way of buying or keeping this product is required.","args":[],"type":{"kind":"OBJECT","name":"FareMedium","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the product, for example example \"Day pass\" or \"Single ticket\".","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"price","description":"The price of the product","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Money","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"riderCategory","description":"The category of riders this product applies to, for example students or pensioners.","args":[],"type":{"kind":"OBJECT","name":"RiderCategory","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"FareProduct","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"DepartureRow","description":"Departure row is a combination of a pattern and a stop of that pattern.\n\nThey are de-duplicated so for each pattern there will only be a single departure row.\n\nThis is useful if you want to show a list of stop/pattern combinations but want each pattern to be\nlisted only once.","fields":[{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pattern","description":"Pattern of the departure row","args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"Stop from which the departures leave","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimes","description":"Departures of the pattern from the stop","args":[{"name":"numberOfDepartures","description":"Maximum number of departures to return.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"1"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"startTime","description":"Return rows departing after this time. Time format: Unix timestamp in seconds. Default: current time.","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"How many seconds ahead to search for departures. Default is one day.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"DestinationBicyclePolicyInput","description":"Is it possible to arrive to the destination with a rented bicycle and does it\ncome with an extra cost.","fields":null,"inputFields":[{"name":"allowKeeping","description":"For networks that require station drop-off, should the routing engine offer results that go directly to the destination without dropping off the rental bicycle first.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"keepingCost","description":"Cost associated with arriving to the destination with a rented bicycle.\nNo cost is applied if arriving to the destination after dropping off the rented\nbicycle.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"DestinationScooterPolicyInput","description":"Is it possible to arrive to the destination with a rented scooter and does it\ncome with an extra cost.","fields":null,"inputFields":[{"name":"allowKeeping","description":"For networks that require station drop-off, should the routing engine offer results that go directly to the destination without dropping off the rental scooter first.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"keepingCost","description":"Cost associated with arriving to the destination with a rented scooter.\nNo cost is applied if arriving to the destination after dropping off the rented\nscooter.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Duration","description":"Duration in a lenient ISO-8601 duration format. Example P2DT2H12M40S, 2d2h12m40s or 1h","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Emissions","description":null,"fields":[{"name":"co2","description":"CO₂ emissions in grams.","args":[],"type":{"kind":"SCALAR","name":"Grams","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"FareMedium","description":"A 'medium' that a fare product applies to, for example cash, 'Oyster Card' or 'DB Navigator App'.","fields":[{"name":"id","description":"ID of the medium","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the medium.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INTERFACE","name":"FareProduct","description":"A fare product (a ticket) to be bought by a passenger","fields":[{"name":"id","description":"Identifier for the fare product.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"medium","description":"The 'medium' that this product applies to, for example \"Oyster Card\" or \"Berlin Ticket App\".\n \nThis communicates to riders that a specific way of buying or keeping this product is required.","args":[],"type":{"kind":"OBJECT","name":"FareMedium","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the product, for example example \"Day pass\" or \"Single ticket\".","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"riderCategory","description":"The category of riders this product applies to, for example students or pensioners.","args":[],"type":{"kind":"OBJECT","name":"RiderCategory","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"DefaultFareProduct","ofType":null}]},{"kind":"OBJECT","name":"FareProductUse","description":"A container for both a fare product (a ticket) and its relationship to the itinerary.","fields":[{"name":"id","description":"Represents the use of a single instance of a fare product throughout the itinerary. It can\nbe used to cross-reference and de-duplicate fare products that are applicable for more than one\nleg.\n \nIf you want to uniquely identify the fare product itself (not its use) use the product's `id`.\n \n### Example: Day pass\n \nThe day pass is valid for both legs in the itinerary. It is listed as the applicable `product` for each leg,\nand the same FareProductUse id is shown, indicating that only one pass was used/bought.\n \n**Illustration**\n```yaml\nitinerary:\n leg1:\n fareProducts:\n id: \"AAA\" // id of a FareProductUse instance\n product:\n id: \"day-pass\" // product id\n name: \"Day Pass\"\n leg2:\n fareProducts:\n id: \"AAA\" // identical to leg1. the passenger needs to buy ONE pass, not two.\n product:\n id: \"day-pass\" // product id\n name: \"Day Pass\"\n```\n \n**It is the responsibility of the API consumers to display the day pass as a product for the\nentire itinerary rather than two day passes!**\n \n### Example: Several single tickets\n \nIf you have two legs and need to buy two single tickets they will appear in each leg with the\nsame `FareProduct.id` but different `FareProductUse.id`.\n \n**Illustration**\n```yaml\nitinerary:\n leg1:\n fareProducts:\n id: \"AAA\" // id of a FareProductUse instance, not product id\n product:\n id: \"single-ticket\" // product id\n name: \"Single Ticket\"\n leg2:\n fareProducts:\n id: \"BBB\" // different to leg1. the passenger needs to buy two single tickets.\n product:\n id: \"single-ticket\" // product id\n name: \"Single Ticket\"\n```","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"product","description":"The purchasable fare product","args":[],"type":{"kind":"INTERFACE","name":"FareProduct","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Feed","description":"A feed provides routing data (stops, routes, timetables, etc.) from one or more public transport agencies.","fields":[{"name":"agencies","description":"List of agencies which provide data to this feed","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Agency","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"Alerts relevant for the feed.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the feed.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"FeedAlertType","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"feedId","description":"ID of the feed","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"publisher","description":"The publisher of the input transit data.","args":[],"type":{"kind":"OBJECT","name":"FeedPublisher","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"FeedAlertType","description":"Entities, which are relevant for a feed and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCIES","description":"Alerts affecting the feed's agencies","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPES","description":"Alerts affecting the route types across the feed.\nThere might be alerts that only affect route types within an agency of the feed,\nand those can be fetched through the Agency.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"FeedPublisher","description":"Feed publisher information","fields":[{"name":"name","description":"Name of feed publisher","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":"Web address of feed publisher","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"FilterPlaceType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE_RENT","description":"Old value for VEHICLE_RENT","isDeprecated":true,"deprecationReason":"Use VEHICLE_RENT instead as it's clearer that it also returns rental scooters, cars..."},{"name":"BIKE_PARK","description":"Parking lots (not rental stations) that contain spaces for bicycles","isDeprecated":false,"deprecationReason":null},{"name":"CAR_PARK","description":"Parking lots that contain spaces for cars","isDeprecated":false,"deprecationReason":null},{"name":"DEPARTURE_ROW","description":"Departure rows","isDeprecated":false,"deprecationReason":null},{"name":"STATION","description":"Stations.\nNOTE: if this is selected at the same time as `STOP`, stops that have a parent station will not be returned but their parent stations will be returned instead.","isDeprecated":false,"deprecationReason":null},{"name":"STOP","description":"Stops.\nNOTE: if this is selected at the same time as `STATION`, stops that have a parent station will not be returned but their parent stations will be returned instead.","isDeprecated":false,"deprecationReason":null},{"name":"VEHICLE_RENT","description":"Vehicle (bicycles, scooters, cars ...) rental stations and vehicles","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"Float","description":"Built-in Float","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"FormFactor","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE","description":"A bicycle","isDeprecated":false,"deprecationReason":null},{"name":"CAR","description":"An automobile","isDeprecated":false,"deprecationReason":null},{"name":"CARGO_BICYCLE","description":"A bicycle with additional space for cargo","isDeprecated":false,"deprecationReason":null},{"name":"MOPED","description":"A moped that the rider sits on. For a disambiguation see https://github.com/NABSA/gbfs/pull/370#issuecomment-982631989","isDeprecated":false,"deprecationReason":null},{"name":"OTHER","description":"A vehicle that doesn't fit into any other category","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER","description":"A kick scooter that the rider either sits or stands on. Will be deprecated in GBFS v3.0.","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_SEATED","description":"A kick scooter with a seat","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_STANDING","description":"A kick scooter that the rider stands on","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"GeoJson","description":"Geographic data structures in JSON format. See: https://geojson.org/","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Geometry","description":null,"fields":[{"name":"length","description":"The number of points in the string","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"points","description":"List of coordinates of in a Google encoded polyline format (see\nhttps://developers.google.com/maps/documentation/utilities/polylinealgorithm)","args":[],"type":{"kind":"SCALAR","name":"Polyline","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Grams","description":"","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"ID","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputBanned","description":null,"fields":null,"inputFields":[{"name":"agencies","description":"A comma-separated list of banned agency ids","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"routes","description":"A comma-separated list of banned route ids","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"trips","description":"A comma-separated list of banned trip ids","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputCoordinates","description":null,"fields":null,"inputFields":[{"name":"address","description":"The name of the place. If specified, the place name in results uses this value instead of `\"Origin\"` or `\"Destination\"`","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"lat","description":"Latitude of the place (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"locationSlack","description":"The amount of time, in seconds, to spend at this location before venturing forth.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"lon","description":"Longitude of the place (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"InputField","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"DATE_TIME","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"FROM","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"TO","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputFilters","description":null,"fields":null,"inputFields":[{"name":"bikeParks","description":"Bike parks to include by id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"bikeRentalStations","description":"Bike rentals to include by id (without network identifier).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"carParks","description":"Car parks to include by id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"routes","description":"Routes to include by GTFS id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"stations","description":"Stations to include by GTFS id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"stops","description":"Stops to include by GTFS id.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputModeWeight","description":null,"fields":null,"inputFields":[{"name":"AIRPLANE","description":"The weight of AIRPLANE traverse mode. Values over 1 add cost to airplane travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"BUS","description":"The weight of BUS traverse mode. Values over 1 add cost to bus travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"CABLE_CAR","description":"The weight of CABLE_CAR traverse mode. Values over 1 add cost to cable car travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"FERRY","description":"The weight of FERRY traverse mode. Values over 1 add cost to ferry travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"FUNICULAR","description":"The weight of FUNICULAR traverse mode. Values over 1 add cost to funicular travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"GONDOLA","description":"The weight of GONDOLA traverse mode. Values over 1 add cost to gondola travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"RAIL","description":"The weight of RAIL traverse mode. Values over 1 add cost to rail travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"SUBWAY","description":"The weight of SUBWAY traverse mode. Values over 1 add cost to subway travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"TRAM","description":"The weight of TRAM traverse mode. Values over 1 add cost to tram travel and values under 1 decrease cost","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputPreferred","description":null,"fields":null,"inputFields":[{"name":"agencies","description":"A comma-separated list of ids of the agencies preferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"otherThanPreferredRoutesPenalty","description":"Penalty added for using every route that is not preferred if user set any\nroute as preferred. We return number of seconds that we are willing to wait\nfor preferred route.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"routes","description":"A comma-separated list of ids of the routes preferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputTriangle","description":"Relative importances of optimization factors. Only effective for bicycling legs.\nInvariant: `timeFactor + slopeFactor + safetyFactor == 1`","fields":null,"inputFields":[{"name":"safetyFactor","description":"Relative importance of safety","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"slopeFactor","description":"Relative importance of flat terrain","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"timeFactor","description":"Relative importance of duration","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"InputUnpreferred","description":null,"fields":null,"inputFields":[{"name":"agencies","description":"A comma-separated list of ids of the agencies unpreferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"routes","description":"A comma-separated list of ids of the routes unpreferred by the user.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"unpreferredCost","description":"An cost function used to calculate penalty for an unpreferred route/agency. Function should return\nnumber of seconds that we are willing to wait for unpreferred route/agency.\nString must be of the format:\n`A + B x`, where A is fixed penalty and B is a multiplier of transit leg travel time x.\nFor example: `600 + 2.0 x`","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Int","description":"Built-in Int","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Itinerary","description":null,"fields":[{"name":"accessibilityScore","description":"Computes a numeric accessibility score between 0 and 1.\n \nThe closer the value is to 1 the better the wheelchair-accessibility of this itinerary is.\nA value of `null` means that no score has been computed, not that the leg is inaccessible.\n \nMore information is available in the [feature documentation](https://docs.opentripplanner.org/en/dev-2.x/sandbox/IBIAccessibilityScore/).","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"arrivedAtDestinationWithRentedBicycle","description":"Does the itinerary end without dropping off the rented bicycle:","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"duration","description":"Duration of the trip on this itinerary, in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevationGained","description":"How much elevation is gained, in total, over the course of the itinerary, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevationLost","description":"How much elevation is lost, in total, over the course of the itinerary, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"emissionsPerPerson","description":"Emissions of this itinerary per traveler.","args":[],"type":{"kind":"OBJECT","name":"Emissions","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"end","description":"Time when the user leaves arrives at the destination.","args":[],"type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"endTime","description":"Time when the user arrives to the destination. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `end` instead which includes timezone information."},{"name":"fares","description":"Information about the fares for this itinerary. This is primarily a GTFS Fares V1 interface\nand always returns an empty list. Use the leg's `fareProducts` instead.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"fare","ofType":null}},"isDeprecated":true,"deprecationReason":"Use the leg's `fareProducts`."},{"name":"generalizedCost","description":"Generalized cost of the itinerary. Used for debugging search results.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"legs","description":"A list of Legs. Each Leg is either a walking (cycling, car) portion of the\nitinerary, or a transit leg on a particular vehicle. So a itinerary where the\nuser walks to the Q train, transfers to the 6, then walks to their\ndestination, has four legs.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Leg","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"numberOfTransfers","description":"How many transfers are part of this itinerary.\n \nNotes:\n - Interlined/stay-seated transfers do not increase this count.\n - Transferring from a flex to a fixed schedule trip and vice versa increases this count.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"start","description":"Time when the user leaves from the origin.","args":[],"type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"startTime","description":"Time when the user leaves from the origin. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `start` instead which includes timezone information."},{"name":"systemNotices","description":"A list of system notices. Contains debug information for itineraries.\nOne use-case is to run a routing search with 'debugItineraryFilter: true'.\nThis will then tag itineraries instead of removing them from the result.\nThis make it possible to inspect the itinerary-filter-chain.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"SystemNotice","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"waitingTime","description":"How much time is spent waiting for transit to arrive, in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkDistance","description":"How far the user has to walk, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkTime","description":"How much time is spent walking, in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"ItineraryFilterDebugProfile","description":"Enable this to attach a system notice to itineraries instead of removing them. This is very\nconvenient when tuning the itinerary-filter-chain.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"LIMIT_TO_NUMBER_OF_ITINERARIES","description":"Only return the requested number of itineraries, counting both actual and deleted ones.\nThe top `numItineraries` using the request sort order is returned. This does not work\nwith paging, itineraries after the limit, but inside the search-window are skipped when\nmoving to the next page.","isDeprecated":false,"deprecationReason":null},{"name":"LIMIT_TO_SEARCH_WINDOW","description":"Return all itineraries, including deleted ones, inside the actual search-window used\n(the requested search-window may differ).","isDeprecated":false,"deprecationReason":null},{"name":"LIST_ALL","description":"List all itineraries, including all deleted itineraries.","isDeprecated":false,"deprecationReason":null},{"name":"OFF","description":"By default, the debug itinerary filters is turned off.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Leg","description":null,"fields":[{"name":"accessibilityScore","description":"Computes a numeric accessibility score between 0 and 1.\n \nThe closer the value is to 1 the better the wheelchair-accessibility of this leg is.\nA value of `null` means that no score has been computed, not that the itinerary is inaccessible.\n \nMore information is available in the [feature documentation](https://docs.opentripplanner.org/en/dev-2.x/sandbox/IBIAccessibilityScore/).","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"For transit legs, the transit agency that operates the service used for this leg. For non-transit legs, `null`.","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"Applicable alerts for this leg.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"arrivalDelay","description":"For transit leg, the offset from the scheduled arrival time of the alighting\nstop in this leg, i.e. scheduled time of arrival at alighting stop = `endTime\n- arrivalDelay`","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `start.estimated.delay` instead."},{"name":"departureDelay","description":"For transit leg, the offset from the scheduled departure time of the boarding\nstop in this leg, i.e. scheduled time of departure at boarding stop =\n`startTime - departureDelay`","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `end.estimated.delay` instead."},{"name":"distance","description":"The distance traveled while traversing the leg in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropOffBookingInfo","description":"Special booking information for the drop off stop of this leg if, for example, it needs\nto be booked in advance. This could be due to a flexible or on-demand service.","args":[],"type":{"kind":"OBJECT","name":"BookingInfo","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropoffType","description":"This is used to indicate if alighting from this leg is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"duration","description":"The leg's duration in seconds","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"end","description":"The time when the leg ends including real-time information, if available.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"LegTime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"endTime","description":"The date and time when this leg ends. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `end.estimated.time` instead which contains timezone information."},{"name":"fareProducts","description":"Fare products are purchasable tickets which may have an optional fare container or rider\ncategory that limits who can buy them or how.\n \nPlease read the documentation of `id` very carefully to learn how a single fare product\nthat applies to multiple legs can appear several times.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"FareProductUse","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"from","description":"The Place where the leg originates.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"generalizedCost","description":"Generalized cost of the leg. Used for debugging search results.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"headsign","description":"For transit legs, the headsign that the vehicle shows at the stop where the passenger boards.\nFor non-transit legs, null.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"An identifier for the leg, which can be used to re-fetch transit leg information.\nRe-fetching fails when the underlying transit data no longer exists.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"interlineWithPreviousLeg","description":"Interlines with previous leg.\nThis is true when the same vehicle is used for the previous leg as for this leg\nand passenger can stay inside the vehicle.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"intermediatePlace","description":"Whether the destination of this leg (field `to`) is one of the intermediate places specified in the query.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"intermediatePlaces","description":"For transit legs, intermediate stops between the Place where the leg\noriginates and the Place where the leg ends. For non-transit legs, null.\nReturns Place type, which has fields for e.g. departure and arrival times","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"intermediateStops","description":"For transit legs, intermediate stops between the Place where the leg\noriginates and the Place where the leg ends. For non-transit legs, null.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"legGeometry","description":"The leg's geometry.","args":[],"type":{"kind":"OBJECT","name":"Geometry","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"mode","description":"The mode (e.g. `WALK`) used when traversing this leg.","args":[],"type":{"kind":"ENUM","name":"Mode","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"nextLegs","description":"Future legs with same origin and destination stops or stations","args":[{"name":"destinationModesWithParentStation","description":"Transportation modes for which all stops in the parent station are used as possible destination stops\nfor the next legs. For modes not listed, only the exact destination stop of the leg is considered.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"TransitMode","ofType":null}}},"defaultValue":null},{"name":"numberOfLegs","description":"The number of alternative legs searched. If fewer than the requested number are found,\nthen only the found legs are returned.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"defaultValue":null},{"name":"originModesWithParentStation","description":"Transportation modes for which all stops in the parent station are used as possible origin stops\nfor the next legs. For modes not listed, only the exact origin stop of the leg is considered.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"TransitMode","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Leg","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"pickupBookingInfo","description":"Special booking information for the pick up stop of this leg if, for example, it needs\nto be booked in advance. This could be due to a flexible or on-demand service.","args":[],"type":{"kind":"OBJECT","name":"BookingInfo","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupType","description":"This is used to indicate if boarding this leg is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realTime","description":"Whether there is real-time data about this Leg","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeState","description":"State of real-time data","args":[],"type":{"kind":"ENUM","name":"RealtimeState","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentedBike","description":"Whether this leg is traversed with a rented bike.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rideHailingEstimate","description":"Estimate of a hailed ride like Uber.","args":[],"type":{"kind":"OBJECT","name":"RideHailingEstimate","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"For transit legs, the route that is used for traversing the leg. For non-transit legs, `null`.","args":[],"type":{"kind":"OBJECT","name":"Route","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"serviceDate","description":"For transit legs, the service date of the trip. Format: YYYYMMDD. For non-transit legs, null.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"start","description":"The time when the leg starts including real-time information, if available.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"LegTime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"startTime","description":"The date and time when this leg begins. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use `start.estimated.time` instead which contains timezone information."},{"name":"steps","description":"The turn-by-turn navigation instructions.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"step","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"to","description":"The Place where the leg ends.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"transitLeg","description":"Whether this leg is a transit leg or not.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"For transit legs, the trip that is used for traversing the leg. For non-transit legs, `null`.","args":[],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkingBike","description":"Whether this leg is walking with a bike.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"LegTime","description":"Time information about a passenger at a certain place. May contain real-time information if\navailable.","fields":[{"name":"estimated","description":"The estimated time of the event. If no real-time information is available, this is null.","args":[],"type":{"kind":"OBJECT","name":"RealTimeEstimate","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"scheduledTime","description":"The scheduled time of the event.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"LocalDate","description":"An ISO-8601-formatted local date, i.e. `2024-05-24` for the 24th of May, 2024.\n\nISO-8601 allows many different date formats, however only the most common one - `yyyy-MM-dd` - is accepted.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"LocalDateRangeInput","description":"Filters an entity by a date range.","fields":null,"inputFields":[{"name":"end","description":"**Exclusive** end date of the filter. This means that if you want a time window from Sunday to\nSunday, `end` must be on Monday.\n \nIf `null` this means that no end filter is applied and all entities that are after or on `start`\nare selected.","type":{"kind":"SCALAR","name":"LocalDate","ofType":null},"defaultValue":null},{"name":"start","description":"**Inclusive** start date of the filter. If `null` this means that no `start` filter is applied and all\ndates that are before `end` are selected.","type":{"kind":"SCALAR","name":"LocalDate","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"LocalTimeSpan","description":"A span of time.","fields":[{"name":"from","description":"The start of the time timespan as seconds from midnight.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"to","description":"The end of the timespan as seconds from midnight.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"LocalTimeSpanDate","description":"A date using the local timezone of the object that can contain timespans.","fields":[{"name":"date","description":"The date of this time span. Format: YYYYMMDD.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"timeSpans","description":"The time spans for this date.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"LocalTimeSpan","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Locale","description":"A IETF BCP 47 language tag","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"LocationType","description":"Identifies whether this stop represents a stop or station.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"ENTRANCE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"STATION","description":"A physical structure or area that contains one or more stop.","isDeprecated":false,"deprecationReason":null},{"name":"STOP","description":"A location where passengers board or disembark from a transit vehicle.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"Long","description":"A 64-bit signed integer","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"Mode","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AIRPLANE","description":"AIRPLANE","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE","description":"BICYCLE","isDeprecated":false,"deprecationReason":null},{"name":"BUS","description":"BUS","isDeprecated":false,"deprecationReason":null},{"name":"CABLE_CAR","description":"CABLE_CAR","isDeprecated":false,"deprecationReason":null},{"name":"CAR","description":"CAR","isDeprecated":false,"deprecationReason":null},{"name":"CARPOOL","description":"Private car trips shared with others.","isDeprecated":false,"deprecationReason":null},{"name":"COACH","description":"COACH","isDeprecated":false,"deprecationReason":null},{"name":"FERRY","description":"FERRY","isDeprecated":false,"deprecationReason":null},{"name":"FLEX","description":"Enables flexible transit for access and egress legs","isDeprecated":false,"deprecationReason":null},{"name":"FLEXIBLE","description":"Enables flexible transit for access and egress legs","isDeprecated":true,"deprecationReason":"Use FLEX instead"},{"name":"FUNICULAR","description":"FUNICULAR","isDeprecated":false,"deprecationReason":null},{"name":"GONDOLA","description":"GONDOLA","isDeprecated":false,"deprecationReason":null},{"name":"LEG_SWITCH","description":"Only used internally. No use for API users.","isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"MONORAIL","description":"Railway in which the track consists of a single rail or a beam.","isDeprecated":false,"deprecationReason":null},{"name":"RAIL","description":"RAIL","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER","description":"SCOOTER","isDeprecated":false,"deprecationReason":null},{"name":"SUBWAY","description":"SUBWAY","isDeprecated":false,"deprecationReason":null},{"name":"TAXI","description":"A taxi, possibly operated by a public transport agency.","isDeprecated":false,"deprecationReason":null},{"name":"TRAM","description":"TRAM","isDeprecated":false,"deprecationReason":null},{"name":"TRANSIT","description":"A special transport mode, which includes all public transport.","isDeprecated":false,"deprecationReason":null},{"name":"TROLLEYBUS","description":"Electric buses that draw power from overhead wires using poles.","isDeprecated":false,"deprecationReason":null},{"name":"WALK","description":"WALK","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Money","description":"An amount of money.","fields":[{"name":"amount","description":"Money in the major currency unit, so 3.10 USD is represented as `3.1`.\n \nIf you want to get the minor currency unit (310 cents), multiply with\n(10 to the power of `currency.digits`).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"currency","description":"The currency of this money amount.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Currency","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INTERFACE","name":"Node","description":"An object with an ID","fields":[{"name":"id","description":"The ID of an object","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"Agency","ofType":null},{"kind":"OBJECT","name":"Alert","ofType":null},{"kind":"OBJECT","name":"BikePark","ofType":null},{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},{"kind":"OBJECT","name":"CarPark","ofType":null},{"kind":"OBJECT","name":"Cluster","ofType":null},{"kind":"OBJECT","name":"DepartureRow","ofType":null},{"kind":"OBJECT","name":"Pattern","ofType":null},{"kind":"OBJECT","name":"RentalVehicle","ofType":null},{"kind":"OBJECT","name":"Route","ofType":null},{"kind":"OBJECT","name":"Stop","ofType":null},{"kind":"OBJECT","name":"TicketType","ofType":null},{"kind":"OBJECT","name":"Trip","ofType":null},{"kind":"OBJECT","name":"VehicleParking","ofType":null},{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null},{"kind":"OBJECT","name":"placeAtDistance","ofType":null},{"kind":"OBJECT","name":"stopAtDistance","ofType":null}]},{"kind":"ENUM","name":"OccupancyStatus","description":"Occupancy status of a vehicle.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"CRUSHED_STANDING_ROOM_ONLY","description":"The vehicle or carriage can currently accommodate only standing passengers and has limited\nspace for them. There isn't a big difference between this and FULL so it's possible to handle\nthem as the same value, if one wants to limit the number of different values.\nSIRI nordic profile: merge into `STANDING_ROOM_ONLY`.","isDeprecated":false,"deprecationReason":null},{"name":"EMPTY","description":"The vehicle is considered empty by most measures, and has few or no passengers onboard, but is\nstill accepting passengers. There isn't a big difference between this and MANY_SEATS_AVAILABLE\nso it's possible to handle them as the same value, if one wants to limit the number of different\nvalues.\nSIRI nordic profile: merge these into `MANY_SEATS_AVAILABLE`.","isDeprecated":false,"deprecationReason":null},{"name":"FEW_SEATS_AVAILABLE","description":"The vehicle or carriage has a small number of seats available. The amount of free seats out of\nthe total seats available to be considered small enough to fall into this category is\ndetermined at the discretion of the producer.\nSIRI nordic profile: less than ~50% of seats available.","isDeprecated":false,"deprecationReason":null},{"name":"FULL","description":"The vehicle is considered full by most measures, but may still be allowing passengers to\nboard.","isDeprecated":false,"deprecationReason":null},{"name":"MANY_SEATS_AVAILABLE","description":"The vehicle or carriage has a large number of seats available. The amount of free seats out of\nthe total seats available to be considered large enough to fall into this category is\ndetermined at the discretion of the producer. There isn't a big difference between this and\nEMPTY so it's possible to handle them as the same value, if one wants to limit the number of\ndifferent values.\nSIRI nordic profile: more than ~50% of seats available.","isDeprecated":false,"deprecationReason":null},{"name":"NOT_ACCEPTING_PASSENGERS","description":"The vehicle or carriage is not accepting passengers.\nSIRI nordic profile: if vehicle/carriage is not in use / unavailable, or passengers are only allowed\nto alight due to e.g. crowding.","isDeprecated":false,"deprecationReason":null},{"name":"NO_DATA_AVAILABLE","description":"Default. There is no occupancy-data on this departure.","isDeprecated":false,"deprecationReason":null},{"name":"STANDING_ROOM_ONLY","description":"The vehicle or carriage can currently accommodate only standing passengers.\nSIRI nordic profile: less than ~10% of seats available.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"OffsetDateTime","description":"An ISO-8601-formatted datetime with offset, i.e. `2023-06-13T14:30+03:00` for 2:30pm on June 13th 2023 at Helsinki's offset from UTC at that time.\n\nISO-8601 allows many different formats but OTP will only return the profile specified in RFC3339.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"OpeningHours","description":null,"fields":[{"name":"dates","description":"Opening hours for the selected dates using the local time of the parking lot.\nEach date can have multiple time spans.\n \nNote: This is not implemented yet and always returns null.","args":[{"name":"dates","description":"Opening hours will be returned for these dates. Dates should use YYYYMMDD format.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"LocalTimeSpanDate","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"osm","description":"OSM-formatted string of the opening hours.\n \nThe spec is available at: https://wiki.openstreetmap.org/wiki/Key:opening_hours","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"OptimizeType","description":"Optimization type for bicycling legs","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"FLAT","description":"Prefer flat terrain","isDeprecated":false,"deprecationReason":null},{"name":"GREENWAYS","description":"GREENWAYS","isDeprecated":false,"deprecationReason":null},{"name":"QUICK","description":"Prefer faster routes","isDeprecated":false,"deprecationReason":null},{"name":"SAFE","description":"Prefer safer routes, i.e. avoid crossing streets and use bike paths when possible","isDeprecated":false,"deprecationReason":null},{"name":"TRIANGLE","description":"**TRIANGLE** optimization type can be used to set relative preferences of optimization factors. See argument `triangle`.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"PageInfo","description":"Information about pagination in a connection.","fields":[{"name":"endCursor","description":"When paginating forwards, the cursor to continue.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"hasNextPage","description":"When paginating forwards, are there more items?","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"hasPreviousPage","description":"When paginating backwards, are there more items?","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"startCursor","description":"When paginating backwards, the cursor to continue.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ParkingFilter","description":"The filter definition to include or exclude parking facilities used during routing.\n\nLogically, the filter algorithm work as follows:\n\n- The starting point is the set of all facilities, lets call it `A`.\n- Then all `select` filters are applied to `A`, potentially reducing the number of facilities used.\n Let's call the result of this `B`.\n An empty `select` will lead to `A` being equal to `B`.\n- Lastly, the `not` filters are applied to `B`, reducing the set further.\n Lets call this final set `C`.\n An empty `not` will lead to `B` being equal to `C`.\n- The remaining parking facilities in `C` are used for routing.","fields":null,"inputFields":[{"name":"not","description":"Exclude parking facilities based on their properties.\n \nIf empty nothing is excluded from the initial set of facilities but may be filtered down\nfurther by the `select` filter.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilterOperation","ofType":null}}},"defaultValue":null},{"name":"select","description":"Include parking facilities based on their properties.\n \nIf empty everything is included from the initial set of facilities but may be filtered down\nfurther by the `not` filter.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilterOperation","ofType":null}}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ParkingFilterOperation","description":null,"fields":null,"inputFields":[{"name":"tags","description":"Filter parking facilities based on their tag","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Pattern","description":"Pattern is sequence of stops used by trips on a specific direction and variant\nof a route. Most routes have only two patterns: one for outbound trips and one\nfor inbound trips","fields":[{"name":"alerts","description":"By default, list of alerts which have directly an effect on just the pattern.\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the pattern.\nBy default, list of alerts which have directly an effect on just the pattern.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"PatternAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"code","description":"ID of the pattern","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"directionId","description":"Direction of the pattern. Possible values: 0, 1 or -1.\n-1 indicates that the direction is irrelevant, i.e. the route has patterns only in one direction.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"geometry","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Coordinates","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"headsign","description":"Vehicle headsign used by trips of this pattern","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the pattern. Pattern name can be just the name of the route or it can\ninclude details of destination and origin stops.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"originalTripPattern","description":"Original Trip pattern for changed patterns","args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"patternGeometry","description":"Coordinates of the route of this pattern in Google polyline encoded format","args":[],"type":{"kind":"OBJECT","name":"Geometry","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"The route this pattern runs on","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"semanticHash","description":"Hash code of the pattern. This value is stable and not dependent on the\npattern id, i.e. this value can be used to check whether two patterns are the\nsame, even if their ids have changed.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops served by this pattern","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"trips","description":"Trips which run on this pattern","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"tripsForDate","description":"Trips which run on this pattern on the specified date","args":[{"name":"serviceDate","description":"Return trips of the pattern active on this date. Format: YYYYMMDD","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"vehiclePositions","description":"Real-time updated position of vehicles that are serving this pattern.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"VehiclePosition","ofType":null}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PatternAlertType","description":"Entities, which are relevant for a pattern and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCY","description":"Alerts affecting the pattern's route's agency","isDeprecated":false,"deprecationReason":null},{"name":"PATTERN","description":"Alerts affecting the pattern","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE","description":"Alerts affecting the route that the pattern runs on","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPE","description":"Alerts affecting the route type of the route that the pattern runs on","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_PATTERN","description":"Alerts affecting the stops which are on this pattern","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_TRIPS","description":"Alerts affecting the stops of the trips which run on this pattern","isDeprecated":false,"deprecationReason":null},{"name":"TRIPS","description":"Alerts affecting the trips which run on this pattern","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"PickupDropoffType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"CALL_AGENCY","description":"Must phone agency to arrange pickup / drop off.","isDeprecated":false,"deprecationReason":null},{"name":"COORDINATE_WITH_DRIVER","description":"Must coordinate with driver to arrange pickup / drop off.","isDeprecated":false,"deprecationReason":null},{"name":"NONE","description":"No pickup / drop off available.","isDeprecated":false,"deprecationReason":null},{"name":"SCHEDULED","description":"Regularly scheduled pickup / drop off.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"Place","description":null,"fields":[{"name":"arrival","description":"The time the rider will arrive at the place. This also includes real-time information\nif available.","args":[],"type":{"kind":"OBJECT","name":"LegTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"arrivalTime","description":"The time the rider will arrive at the place. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Long","ofType":null}},"isDeprecated":true,"deprecationReason":"Use `arrival` which includes timezone information."},{"name":"bikePark","description":"The bike parking related to the place","args":[],"type":{"kind":"OBJECT","name":"BikePark","ofType":null},"isDeprecated":true,"deprecationReason":"bikePark is deprecated. Use vehicleParking instead."},{"name":"bikeRentalStation","description":"The bike rental station related to the place","args":[],"type":{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},"isDeprecated":true,"deprecationReason":"Use vehicleRentalStation and rentalVehicle instead"},{"name":"carPark","description":"The car parking related to the place","args":[],"type":{"kind":"OBJECT","name":"CarPark","ofType":null},"isDeprecated":true,"deprecationReason":"carPark is deprecated. Use vehicleParking instead."},{"name":"departure","description":"The time the rider will depart the place. This also includes real-time information\nif available.","args":[],"type":{"kind":"OBJECT","name":"LegTime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"departureTime","description":"The time the rider will depart the place. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Long","ofType":null}},"isDeprecated":true,"deprecationReason":"Use `departure` which includes timezone information."},{"name":"lat","description":"Latitude of the place (WGS 84)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the place (WGS 84)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"For transit stops, the name of the stop. For points of interest, the name of the POI.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalVehicle","description":"The rental vehicle related to the place","args":[],"type":{"kind":"OBJECT","name":"RentalVehicle","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"The stop related to the place.","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stopPosition","description":"The position of the stop in the pattern. This is not required to start from 0 or be consecutive - any\nincreasing integer sequence along the stops is valid.\n \nThe purpose of this field is to identify the stop within the pattern so it can be cross-referenced\nbetween it and the itinerary. It is safe to cross-reference when done quickly, i.e. within seconds.\nHowever, it should be noted that real-time updates can change the values, so don't store it for\nlonger amounts of time.\n \nDepending on the source data, this might not be the GTFS `stop_sequence` but another value, perhaps\neven generated.\n \nThe position can be either at a certain stop or in between two for trips where this is possible.","args":[],"type":{"kind":"UNION","name":"StopPosition","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParking","description":"The vehicle parking related to the place","args":[],"type":{"kind":"OBJECT","name":"VehicleParking","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleRentalStation","description":"The vehicle rental station related to the place","args":[],"type":{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vertexType","description":"Type of vertex. (Normal, Bike sharing station, Bike P+R, Transit stop) Mostly\nused for better localization of bike sharing and P+R station names","args":[],"type":{"kind":"ENUM","name":"VertexType","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INTERFACE","name":"PlaceInterface","description":"Interface for places, e.g. stops, stations, parking areas..","fields":[{"name":"id","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the place (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the place (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"BikePark","ofType":null},{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},{"kind":"OBJECT","name":"CarPark","ofType":null},{"kind":"OBJECT","name":"DepartureRow","ofType":null},{"kind":"OBJECT","name":"RentalVehicle","ofType":null},{"kind":"OBJECT","name":"Stop","ofType":null},{"kind":"OBJECT","name":"VehicleParking","ofType":null},{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null}]},{"kind":"OBJECT","name":"Plan","description":null,"fields":[{"name":"date","description":"The time and date of travel. Format: Unix timestamp in milliseconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"debugOutput","description":"Information about the timings for the plan generation","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"debugOutput","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"from","description":"The origin","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"itineraries","description":"A list of possible itineraries","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Itinerary","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"messageEnums","description":"A list of possible error messages as enum","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"messageStrings","description":"A list of possible error messages in cleartext","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"nextDateTime","description":"This is the suggested search time for the \"next page\" or time window. Insert it together\nwith the searchWindowUsed in the request to get a new set of trips following in the\nsearch-window AFTER the current search. No duplicate trips should be returned, unless a trip\nis delayed and new real-time data is available.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use nextPageCursor instead"},{"name":"nextPageCursor","description":"Use the cursor to go to the next \"page\" of itineraries. Copy the cursor from the last response\nto the pageCursor query parameter and keep the original request as is. This will enable you to\nsearch for itineraries in the next search-window.\nThe cursor based paging only support stepping to the next page, as it does not support jumping.\nThis is only usable when public transportation mode(s) are included in the query.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"prevDateTime","description":"This is the suggested search time for the \"previous page\" or time window. Insert it together\nwith the searchWindowUsed in the request to get a new set of trips preceding in the\nsearch-window BEFORE the current search. No duplicate trips should be returned, unless a trip\nis delayed and new real-time data is available.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":true,"deprecationReason":"Use previousPageCursor instead"},{"name":"previousPageCursor","description":"Use the cursor to go to the previous \"page\" of itineraries. Copy the cursor from the last\nresponse to the pageCursor query parameter and keep the original request otherwise as is.\nThis will enable you to search for itineraries in the previous search-window.\nThe cursor based paging only support stepping to the previous page, as it does not support\njumping.\nThis is only usable when public transportation mode(s) are included in the query.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routingErrors","description":"A list of routing errors, and fields which caused them","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RoutingError","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"searchWindowUsed","description":"This is the `searchWindow` used by the raptor search. It is provided here for debugging\npurpousess.\n \nThe unit is seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"to","description":"The destination","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Place","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PlanAccessMode","description":"Street modes that can be used for access to the transit network from origin.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE","description":"Cycling to a stop and boarding a vehicle with the bicycle.\nNote, this can include walking when it's needed to walk the bicycle.\nAccess can use cycling only if the mode used for transfers\nand egress is also `BICYCLE`.","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE_PARKING","description":"Starting the itinerary with a bicycle and parking the bicycle to\na parking location. Note, this can include walking after parking\nthe bicycle or when it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE_RENTAL","description":"Bicycle rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, access will include only walking. Also, this\ncan include walking before picking up or after dropping off the\nbicycle or when it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_DROP_OFF","description":"Getting dropped off by a car to a location that is accessible with a car.\nNote, this can include walking after the drop-off.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_PARKING","description":"Starting the itinerary with a car and parking the car to a parking location.\nNote, this can include walking after parking the car.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_RENTAL","description":"Car rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, access will include only walking. Also, this\ncan include walking before picking up or after dropping off the\ncar.","isDeprecated":false,"deprecationReason":null},{"name":"FLEX","description":"Flexible transit. This can include different forms of flexible transit that\ncan be defined in GTFS-Flex or in Netex. Note, this can include walking before\nor after the flexible transit leg.","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_RENTAL","description":"Scooter rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, access will include only walking. Also, this\ncan include walking before picking up or after dropping off the\nscooter.","isDeprecated":false,"deprecationReason":null},{"name":"WALK","description":"Walking to a stop.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"PlanConnection","description":"Plan (result of an itinerary search) that follows\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","fields":[{"name":"edges","description":"Edges which contain the itineraries. Part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"PlanEdge","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"pageInfo","description":"Contains cursors to continue the search and the information if there are more itineraries available.\nPart of the [GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"PlanPageInfo","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"routingErrors","description":"Errors faced during the routing search.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RoutingError","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"searchDateTime","description":"What was the starting point for the itinerary search.","args":[],"type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanCoordinateInput","description":"A coordinate used for a location in a plan query.","fields":null,"inputFields":[{"name":"latitude","description":"Latitude as a WGS84 format number.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"CoordinateValue","ofType":null}},"defaultValue":null},{"name":"longitude","description":"Longitude as a WGS84 format number.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"CoordinateValue","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanDateTimeInput","description":"Plan date time options. Only one of the values should be defined.","fields":null,"inputFields":[{"name":"earliestDeparture","description":"Earliest departure date time. The returned itineraries should not\ndepart before this instant unless one is using paging to find earlier\nitineraries. Note, it is not currently possible to define both\n`earliestDeparture` and `latestArrival`.","type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"defaultValue":null},{"name":"latestArrival","description":"Latest arrival time date time. The returned itineraries should not\narrive to the destination after this instant unless one is using\npaging to find later itineraries. Note, it is not currently possible\nto define both `earliestDeparture` and `latestArrival`.","type":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PlanDirectMode","description":"Street mode that is used when searching for itineraries that don't use any transit.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE","description":"Cycling from the origin to the destination. Note, this can include walking\nwhen it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE_PARKING","description":"Starting the itinerary with a bicycle and parking the bicycle to\na parking location. Note, this can include walking after parking\nthe bicycle or when it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE_RENTAL","description":"Bicycle rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, itinerary will include only walking.\nAlso, it can include walking before picking up or after dropping off the\nbicycle or when it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"CAR","description":"Driving a car from the origin to the destination.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_PARKING","description":"Starting the itinerary with a car and parking the car to a parking location.\nNote, this can include walking after parking the car.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_RENTAL","description":"Car rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, itinerary will include only walking. Also, this\ncan include walking before picking up or after dropping off the\ncar.","isDeprecated":false,"deprecationReason":null},{"name":"FLEX","description":"Flexible transit. This can include different forms of flexible transit that\ncan be defined in GTFS-Flex or in Netex. Note, this can include walking before\nor after the flexible transit leg.","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_RENTAL","description":"Scooter rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, itinerary will include only walking. Also, this\ncan include walking before picking up or after dropping off the\nscooter.","isDeprecated":false,"deprecationReason":null},{"name":"WALK","description":"Walking from the origin to the destination. Note, this can include walking\nwhen it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"PlanEdge","description":"Edge outputted by a plan search. Part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","fields":[{"name":"cursor","description":"The cursor of the edge. Part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"node","description":"An itinerary suggestion. Part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Itinerary","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PlanEgressMode","description":"Street modes that can be used for egress from the transit network to destination.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE","description":"Cycling from a stop to the destination. Note, this can include walking when\nit's needed to walk the bicycle. Egress can use cycling only if the mode used\nfor access and transfers is also `BICYCLE`.","isDeprecated":false,"deprecationReason":null},{"name":"BICYCLE_RENTAL","description":"Bicycle rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, egress will include only walking. Also, this\ncan include walking before picking up or after dropping off the\nbicycle or when it's needed to walk the bicycle.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_PICKUP","description":"Getting picked up by a car from a location that is accessible with a car.\nNote, this can include walking before the pickup.","isDeprecated":false,"deprecationReason":null},{"name":"CAR_RENTAL","description":"Car rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, egress will include only walking. Also, this\ncan include walking before picking up or after dropping off the\ncar.","isDeprecated":false,"deprecationReason":null},{"name":"FLEX","description":"Flexible transit. This can include different forms of flexible transit that\ncan be defined in GTFS-Flex or in Netex. Note, this can include walking before\nor after the flexible transit leg.","isDeprecated":false,"deprecationReason":null},{"name":"SCOOTER_RENTAL","description":"Scooter rental can use either station based systems or \"floating\"\nvehicles which are not linked to a rental station. Note, if there are no\nrental options available, egress will include only walking. Also, this\ncan include walking before picking up or after dropping off the\nscooter.","isDeprecated":false,"deprecationReason":null},{"name":"WALK","description":"Walking from a stop to the destination.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanItineraryFilterInput","description":"Settings that control the behavior of itinerary filtering. **These are advanced settings and\nshould not be set by a user through user preferences.**","fields":null,"inputFields":[{"name":"groupSimilarityKeepOne","description":"Pick one itinerary from each group after putting itineraries that are `85%` similar together,\nif the given value is `0.85`, for example. Itineraries are grouped together based on relative\nthe distance of transit travel that is identical between the itineraries (access, egress and\ntransfers are ignored). The value must be at least `0.5`.","type":{"kind":"SCALAR","name":"Ratio","ofType":null},"defaultValue":"0.85"},{"name":"groupSimilarityKeepThree","description":"Pick three itineraries from each group after putting itineraries that are `68%` similar together,\nif the given value is `0.68`, for example. Itineraries are grouped together based on relative\nthe distance of transit travel that is identical between the itineraries (access, egress and\ntransfers are ignored). The value must be at least `0.5`.","type":{"kind":"SCALAR","name":"Ratio","ofType":null},"defaultValue":"0.68"},{"name":"groupedOtherThanSameLegsMaxCostMultiplier","description":"Of the itineraries grouped to maximum of three itineraries, how much worse can the non-grouped\nlegs be compared to the lowest cost. `2.0` means that they can be double the cost, and any\nitineraries having a higher cost will be filtered away. Use a value lower than `1.0` to turn the\ngrouping off.","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":"2.0"},{"name":"itineraryFilterDebugProfile","description":"Itinerary filter debug profile used to control the behaviour of itinerary filters.","type":{"kind":"ENUM","name":"ItineraryFilterDebugProfile","ofType":null},"defaultValue":"OFF"}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanLabeledLocationInput","description":"Plan location settings. Location must be set. Label is optional\nand used for naming the location.","fields":null,"inputFields":[{"name":"label","description":"A label that can be attached to the location. This label is then returned with the location\nin the itineraries.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"location","description":"A location that has to be used in an itinerary.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"PlanLocationInput","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanLocationInput","description":"Plan location. Either a coordinate or a stop location should be defined.","fields":null,"inputFields":[{"name":"coordinate","description":"Coordinate of the location. Note, either a coordinate or a stop location should be defined.","type":{"kind":"INPUT_OBJECT","name":"PlanCoordinateInput","ofType":null},"defaultValue":null},{"name":"stopLocation","description":"Stop, station, a group of stop places or multimodal stop place that should be used as\na location for the search. The trip doesn't have to use the given stop location for a\ntransit connection as it's possible to start walking to another stop from the given\nlocation. If a station or a group of stop places is provided, a stop that makes the most\nsense for the journey is picked as the location within the station or group of stop places.","type":{"kind":"INPUT_OBJECT","name":"PlanStopLocationInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanModesInput","description":"Mode selections for the plan search.","fields":null,"inputFields":[{"name":"direct","description":"Street mode that is used when searching for itineraries that don't use any transit.\nIf more than one mode is selected, at least one of them must be used but not necessarily all.\nThere are modes that automatically also use walking such as the rental modes. To force rental\nto be used, this should only include the rental mode and not `WALK` in addition.\nThe default access mode is `WALK`.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"PlanDirectMode","ofType":null}}},"defaultValue":null},{"name":"directOnly","description":"Should only the direct search without any transit be done.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"transit","description":"Modes for different phases of an itinerary when transit is included. Also\nincludes street mode selections related to connecting to the transit network\nand transfers. By default, all transit modes are usable and `WALK` is used for\naccess, egress and transfers.","type":{"kind":"INPUT_OBJECT","name":"PlanTransitModesInput","ofType":null},"defaultValue":null},{"name":"transitOnly","description":"Should only the transit search be done and never suggest itineraries that don't\ncontain any transit legs.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"PlanPageInfo","description":"Information about pagination in a connection. Part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","fields":[{"name":"endCursor","description":"When paginating forwards, the cursor to continue.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"hasNextPage","description":"When paginating forwards, are there more items?","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"hasPreviousPage","description":"When paginating backwards, are there more items?","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"searchWindowUsed","description":"The search window that was used for the search in the current page.","args":[],"type":{"kind":"SCALAR","name":"Duration","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"startCursor","description":"When paginating backwards, the cursor to continue.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanPreferencesInput","description":"Wrapper type for different types of preferences related to plan query.","fields":null,"inputFields":[{"name":"accessibility","description":"Accessibility preferences that affect both the street and transit routing.","type":{"kind":"INPUT_OBJECT","name":"AccessibilityPreferencesInput","ofType":null},"defaultValue":null},{"name":"street","description":"Street routing preferences used for ingress, egress and transfers. These do not directly affect\nthe transit legs but can change how preferable walking or cycling, for example, is compared to\ntransit.","type":{"kind":"INPUT_OBJECT","name":"PlanStreetPreferencesInput","ofType":null},"defaultValue":null},{"name":"transit","description":"Transit routing preferences used for transit legs.","type":{"kind":"INPUT_OBJECT","name":"TransitPreferencesInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanStopLocationInput","description":"Stop, station, a group of stop places or multimodal stop place that should be used as\na location for the search. The trip doesn't have to use the given stop location for a\ntransit connection as it's possible to start walking to another stop from the given\nlocation. If a station or a group of stop places is provided, a stop that makes the most\nsense for the journey is picked as the location within the station or group of stop places.","fields":null,"inputFields":[{"name":"stopLocationId","description":"ID of the stop, station, a group of stop places or multimodal stop place. Format\nshould be `FeedId:StopLocationId`.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanStreetPreferencesInput","description":"Street routing preferences used for ingress, egress and transfers. These do not directly affect\nthe transit legs but can change how preferable walking or cycling, for example, is compared to\ntransit.","fields":null,"inputFields":[{"name":"bicycle","description":"Cycling related preferences.","type":{"kind":"INPUT_OBJECT","name":"BicyclePreferencesInput","ofType":null},"defaultValue":null},{"name":"car","description":"Car related preferences. These are not used for car travel as part of transit, such as\ntaxi travel.","type":{"kind":"INPUT_OBJECT","name":"CarPreferencesInput","ofType":null},"defaultValue":null},{"name":"scooter","description":"Scooter (kick or electrical) related preferences.","type":{"kind":"INPUT_OBJECT","name":"ScooterPreferencesInput","ofType":null},"defaultValue":null},{"name":"walk","description":"Walk related preferences. These are not used when walking a bicycle or a scooter as they\nhave their own preferences.","type":{"kind":"INPUT_OBJECT","name":"WalkPreferencesInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PlanTransferMode","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BICYCLE","description":"Cycling between transit vehicles (typically between stops). Note, this can\ninclude walking when it's needed to walk the bicycle. Transfers can only use\ncycling if the mode used for access and egress is also `BICYCLE`.","isDeprecated":false,"deprecationReason":null},{"name":"WALK","description":"Walking between transit vehicles (typically between stops).","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanTransitModePreferenceInput","description":"Transit mode and a reluctance associated with it.","fields":null,"inputFields":[{"name":"cost","description":"Costs related to using a transit mode.","type":{"kind":"INPUT_OBJECT","name":"TransitModePreferenceCostInput","ofType":null},"defaultValue":null},{"name":"mode","description":"Transit mode that could be (but doesn't have to be) used in an itinerary.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"TransitMode","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"PlanTransitModesInput","description":"Modes for different phases of an itinerary when transit is included. Also includes street\nmode selections related to connecting to the transit network and transfers.","fields":null,"inputFields":[{"name":"access","description":"Street mode that is used when searching for access to the transit network from origin.\nIf more than one mode is selected, at least one of them must be used but not necessarily all.\nThere are modes that automatically also use walking such as the rental modes. To force rental\nto be used, this should only include the rental mode and not `WALK` in addition.\nThe default access mode is `WALK`.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"PlanAccessMode","ofType":null}}},"defaultValue":null},{"name":"egress","description":"Street mode that is used when searching for egress to destination from the transit network.\nIf more than one mode is selected, at least one of them must be used but not necessarily all.\nThere are modes that automatically also use walking such as the rental modes. To force rental\nto be used, this should only include the rental mode and not `WALK` in addition.\nThe default access mode is `WALK`.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"PlanEgressMode","ofType":null}}},"defaultValue":null},{"name":"transfer","description":"Street mode that is used when searching for transfers. Selection of only one allowed for now.\nThe default transfer mode is `WALK`.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"PlanTransferMode","ofType":null}}},"defaultValue":null},{"name":"transit","description":"Transit modes and reluctances associated with them. Each defined mode can be used in\nan itinerary but doesn't have to be. If direct search is not disabled, there can be an\nitinerary without any transit legs. By default, all transit modes are usable.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"PlanTransitModePreferenceInput","ofType":null}}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Polyline","description":"List of coordinates in an encoded polyline format (see https://developers.google.com/maps/documentation/utilities/polylinealgorithm). The value appears in JSON as a string.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"PositionAtStop","description":"Stop position at a specific stop.","fields":[{"name":"position","description":"Position of the stop in the pattern. Positions are not required to start from 0 or be consecutive.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"PositionBetweenStops","description":"The board/alight position in between two stops of the pattern of a trip with continuous pickup/drop off.","fields":[{"name":"nextPosition","description":"Position of the next stop in the pattern. Positions are not required to start from 0 or be consecutive.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"previousPosition","description":"Position of the previous stop in the pattern. Positions are not required to start from 0 or be consecutive.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"PropulsionType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"COMBUSTION","description":"Powered by gasoline combustion engine","isDeprecated":false,"deprecationReason":null},{"name":"COMBUSTION_DIESEL","description":"Powered by diesel combustion engine","isDeprecated":false,"deprecationReason":null},{"name":"ELECTRIC","description":"Powered by battery-powered electric motor with throttle mode","isDeprecated":false,"deprecationReason":null},{"name":"ELECTRIC_ASSIST","description":"Provides electric motor assist only in combination with human propulsion - no throttle mode","isDeprecated":false,"deprecationReason":null},{"name":"HUMAN","description":"Pedal or foot propulsion","isDeprecated":false,"deprecationReason":null},{"name":"HYBRID","description":"Powered by combined combustion engine and battery-powered motor","isDeprecated":false,"deprecationReason":null},{"name":"HYDROGEN_FUEL_CELL","description":"Powered by hydrogen fuel cell powered electric motor","isDeprecated":false,"deprecationReason":null},{"name":"PLUG_IN_HYBRID","description":"Powered by combined combustion engine and battery-powered motor with plug-in charging","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"Qualifier","description":"Additional qualifier for a transport mode.\nNote that qualifiers can only be used with certain transport modes.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"ACCESS","description":"The mode is used for the access part of the search.","isDeprecated":false,"deprecationReason":null},{"name":"DIRECT","description":"The mode is used for the direct street search.","isDeprecated":false,"deprecationReason":null},{"name":"DROPOFF","description":"The user can be dropped off by someone else riding a vehicle","isDeprecated":false,"deprecationReason":null},{"name":"EGRESS","description":"The mode is used for the egress part of the search.","isDeprecated":false,"deprecationReason":null},{"name":"HAIL","description":"Hailing a ride, for example via an app like Uber.","isDeprecated":false,"deprecationReason":null},{"name":"HAVE","description":"~~HAVE~~\n**Currently not used**","isDeprecated":true,"deprecationReason":"Currently not used"},{"name":"KEEP","description":"~~KEEP~~\n**Currently not used**","isDeprecated":true,"deprecationReason":"Currently not used"},{"name":"PARK","description":"The vehicle used must be left to a parking area before continuing the journey.\nThis qualifier is usable with transport modes `CAR` and `BICYCLE`.\nNote that the vehicle is only parked if the journey is continued with public\ntransportation (e.g. if only `CAR` and `WALK` transport modes are allowed to\nbe used, the car will not be parked as it is used for the whole journey).","isDeprecated":false,"deprecationReason":null},{"name":"PICKUP","description":"The user can be picked up by someone else riding a vehicle","isDeprecated":false,"deprecationReason":null},{"name":"RENT","description":"The vehicle used for transport can be rented","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"QueryType","description":null,"fields":[{"name":"agencies","description":"Get all agencies","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Agency","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"agency","description":"Get a single agency based on agency ID, i.e. value of field `gtfsId` (ID format is `FeedId:StopId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"Get all active alerts","args":[{"name":"cause","description":"Only return alerts with these causes","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"AlertCauseType","ofType":null}}},"defaultValue":null},{"name":"effect","description":"Only return alerts with these effects","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"AlertEffectType","ofType":null}}},"defaultValue":null},{"name":"feeds","description":"Only return alerts in these feeds","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"route","description":"Only return alerts affecting these routes","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"severityLevel","description":"Only return alerts with these severity levels","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"AlertSeverityLevelType","ofType":null}}},"defaultValue":null},{"name":"stop","description":"Only return alerts affecting these stops","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"bikePark","description":"Get a single bike park based on its ID, i.e. value of field `bikeParkId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"BikePark","ofType":null},"isDeprecated":true,"deprecationReason":"bikePark is deprecated. Use vehicleParking instead."},{"name":"bikeParks","description":"Get all bike parks","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"BikePark","ofType":null}},"isDeprecated":true,"deprecationReason":"bikeParks is deprecated. Use vehicleParkings instead."},{"name":"bikeRentalStation","description":"Get a single bike rental station based on its ID, i.e. value of field `stationId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"BikeRentalStation","ofType":null},"isDeprecated":true,"deprecationReason":"Use rentalVehicle or vehicleRentalStation instead"},{"name":"bikeRentalStations","description":"Get all bike rental stations","args":[{"name":"ids","description":"Return bike rental stations with these ids.\n**Note:** if an id is invalid (or the bike rental station service is unavailable)\nthe returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"BikeRentalStation","ofType":null}},"isDeprecated":true,"deprecationReason":"Use rentalVehicles or vehicleRentalStations instead"},{"name":"cancelledTripTimes","description":"Get cancelled TripTimes.","args":[{"name":"feeds","description":"Feed feedIds (e.g. [\"HSL\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"maxArrivalTime","description":"Only cancelled trip times that have last stop arrival time at maxArrivalTime\nor before are returned. Format: seconds since midnight of maxDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"maxDate","description":"Only cancelled trip times scheduled to run on maxDate or before are returned. Format: \"2019-12-23\" or \"20191223\".","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"maxDepartureTime","description":"Only cancelled trip times that have first stop departure time at\nmaxDepartureTime or before are returned. Format: seconds since midnight of maxDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"minArrivalTime","description":"Only cancelled trip times that have last stop arrival time at minArrivalTime\nor after are returned. Format: seconds since midnight of minDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"minDate","description":"Only cancelled trip times scheduled to run on minDate or after are returned. Format: \"2019-12-23\" or \"20191223\".","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"minDepartureTime","description":"Only cancelled trip times that have first stop departure time at\nminDepartureTime or after are returned. Format: seconds since midnight of minDate.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"patterns","description":"TripPattern codes (e.g. [\"HSL:1098:1:01\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"routes","description":"Route gtfsIds (e.g. [\"HSL:1098\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"trips","description":"Trip gtfsIds (e.g. [\"HSL:1098_20190405_Ma_2_1455\"]).","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"carPark","description":"Get a single car park based on its ID, i.e. value of field `carParkId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"CarPark","ofType":null},"isDeprecated":true,"deprecationReason":"carPark is deprecated. Use vehicleParking instead."},{"name":"carParks","description":"Get all car parks","args":[{"name":"ids","description":"Return car parks with these ids.\n**Note:** if an id is invalid (or the car park service is unavailable) the returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"CarPark","ofType":null}},"isDeprecated":true,"deprecationReason":"carParks is deprecated. Use vehicleParkings instead."},{"name":"cluster","description":"Get a single cluster based on its ID, i.e. value of field `gtfsId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Cluster","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"clusters","description":"Get all clusters","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Cluster","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"departureRow","description":"Get a single departure row based on its ID (ID format is `FeedId:StopId:PatternId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"DepartureRow","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"feeds","description":"Get all available feeds","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Feed","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"fuzzyTrip","description":"Finds a trip matching the given parameters. This query type is useful if the\nid of a trip is not known, but other details uniquely identifying the trip are\navailable from some source (e.g. MQTT vehicle positions).","args":[{"name":"date","description":"Departure date of the trip, format: YYYY-MM-DD","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"direction","description":"Direction of the trip, possible values: 0, 1 or -1.\n-1 indicates that the direction is irrelevant, i.e. in case the route has\ntrips only in one direction. See field `directionId` of Pattern.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"-1"},{"name":"route","description":"id of the route","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"time","description":"Departure time of the trip, format: seconds since midnight of the departure date","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"leg","description":"Try refetching the current state of a transit leg using its id.\nThis fails when the underlying transit data (mostly IDs) has changed or are no longer available.","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Leg","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"nearest","description":"Get all places (stops, stations, etc. with coordinates) within the specified\nradius from a location. The returned type is a Relay connection (see\nhttps://facebook.github.io/relay/graphql/connections.htm). The placeAtDistance\ntype has two fields: place and distance. The search is done by walking so the\ndistance is according to the network of walkable streets and paths.","args":[{"name":"after","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"before","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"filterByModes","description":"Only return places that are related to one of these transport modes. This\nargument can be used to return e.g. only nearest railway stations or only\nnearest places related to bicycling.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"Mode","ofType":null}},"defaultValue":null},{"name":"filterByNetwork","description":"Only include vehicle rental networks that match one of the given network ids.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"filterByPlaceTypes","description":"Only return places that are one of these types, e.g. `STOP` or `VEHICLE_RENT`","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"FilterPlaceType","ofType":null}},"defaultValue":null},{"name":"first","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"last","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"lat","description":"Latitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"lon","description":"Longitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"maxDistance","description":"Maximum distance (in meters) to search for from the specified location. Note\nthat this is walking distance along streets and paths rather than a\ngeographic distance. Default is 2000m","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"2000"},{"name":"maxResults","description":"Maximum number of results. Search is stopped when this limit is reached. Default is 20.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"20"}],"type":{"kind":"OBJECT","name":"placeAtDistanceConnection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"node","description":"Fetches an object given its ID","args":[{"name":"id","description":"The ID of an object","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"defaultValue":null}],"type":{"kind":"INTERFACE","name":"Node","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pattern","description":"Get a single pattern based on its ID, i.e. value of field `code` (format is\n`FeedId:RouteId:DirectionId:PatternVariantNumber`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"Get all patterns","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"plan","description":"Plans an itinerary from point A to point B based on the given arguments","args":[{"name":"alightSlack","description":"Invariant: `boardSlack + alightSlack <= transferSlack`. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"allowKeepingRentedBicycleAtDestination","description":"Whether arriving at the destination with a rented (station) bicycle is allowed without\ndropping it off. Default: false.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"allowedTicketTypes","description":"List of ticket types that are allowed to be used in itineraries.\nSee `ticketTypes` query for list of possible ticket types.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"allowedVehicleRentalNetworks","description":"Which vehicle rental networks can be used. By default, all networks are allowed.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"arriveBy","description":"Whether the itinerary should depart at the specified time (false), or arrive\nto the destination at the specified time (true). Default value: false.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"banned","description":"List of routes, trips, agencies and stops which are not used in the itinerary","type":{"kind":"INPUT_OBJECT","name":"InputBanned","ofType":null},"defaultValue":null},{"name":"bannedVehicleRentalNetworks","description":"Which vehicle rental networks cannot be used. By default, all networks are allowed.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"bikeBoardCost","description":"Separate cost for boarding a vehicle with a bicycle, which is more difficult\nthan on foot. Unit: seconds. Default value: 600","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"bikeReluctance","description":"A multiplier for how bad biking is, compared to being in transit for equal\nlengths of time. Default value: 2.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"bikeSpeed","description":"Max bike speed along streets, in meters per second. Default value: 5.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"bikeSwitchCost","description":"Cost of getting on and off your own bike. Unit: seconds. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"bikeSwitchTime","description":"Time to get on and off your own bike, in seconds. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"bikeWalkingReluctance","description":"A multiplier for how bad walking with a bike is, compared to being in transit for equal\nlengths of time. Default value: 5.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"boardSlack","description":"Invariant: `boardSlack + alightSlack <= transferSlack`. Default value: 0","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"carReluctance","description":"A multiplier for how bad driving is, compared to being in transit for equal\nlengths of time. Default value: 3.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"date","description":"Date of departure or arrival in format YYYY-MM-DD. Default value: current date","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"debugItineraryFilter","description":"Debug the itinerary-filter-chain. The filters will mark itineraries as deleted, but does NOT delete them when this is enabled.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"from","description":"The geographical location where the itinerary begins.\nUse either this argument or `fromPlace`, but not both.","type":{"kind":"INPUT_OBJECT","name":"InputCoordinates","ofType":null},"defaultValue":null},{"name":"fromPlace","description":"The place where the itinerary begins in format `name::place`, where `place`\nis either a lat,lng pair (e.g. `Pasila::60.199041,24.932928`) or a stop id\n(e.g. `Pasila::HSL:1000202`).\nUse either this argument or `from`, but not both.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"ignoreRealtimeUpdates","description":"When true, real-time updates are ignored during this search. Default value: false","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"keepingRentedBicycleAtDestinationCost","description":"The cost of arriving at the destination with the rented vehicle, to discourage doing so.\nDefault value: 0.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"locale","description":"Two-letter language code (ISO 639-1) used for returned text.\n**Note:** only part of the data has translations available and names of\nstops and POIs are returned in their default language. Due to missing\ntranslations, it is sometimes possible that returned text uses a mixture of two languages.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"maxTransfers","description":"Maximum number of transfers. Default value: 2","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"minTransferTime","description":"A global minimum transfer time (in seconds) that specifies the minimum\namount of time that must pass between exiting one transit vehicle and\nboarding another. This time is in addition to time it might take to walk\nbetween transit stops. Default value: 120","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"modeWeight","description":"The weight multipliers for transit modes. WALK, BICYCLE, CAR, TRANSIT and LEG_SWITCH are not included.","type":{"kind":"INPUT_OBJECT","name":"InputModeWeight","ofType":null},"defaultValue":null},{"name":"nonpreferredTransferPenalty","description":"Penalty (in seconds) for using a non-preferred transfer. Default value: 180","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"numItineraries","description":"The maximum number of itineraries to return. Default value: 3.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"3"},{"name":"omitCanceled","description":"When false, return itineraries using canceled trips. Default value: true.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"},{"name":"optimize","description":"Optimization type for bicycling legs, e.g. prefer flat terrain. Default value: `QUICK`","type":{"kind":"ENUM","name":"OptimizeType","ofType":null},"defaultValue":null},{"name":"pageCursor","description":"Use the cursor to get the next or previous page of results.\nThe next page is a set of itineraries departing after the last itinerary in this result and\nthe previous page is a set of itineraries departing before the first itinerary.\nThis is only usable when public transportation mode(s) are included in the query.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"parking","description":"Preferences for vehicle parking","type":{"kind":"INPUT_OBJECT","name":"VehicleParkingInput","ofType":null},"defaultValue":null},{"name":"preferred","description":"List of routes and agencies which are given higher preference when planning the itinerary","type":{"kind":"INPUT_OBJECT","name":"InputPreferred","ofType":null},"defaultValue":null},{"name":"searchWindow","description":"The length of the search-window in seconds. This parameter is optional.\n \nThe search-window is defined as the duration between the earliest-departure-time(EDT) and\nthe latest-departure-time(LDT). OTP will search for all itineraries in this departure\nwindow. If `arriveBy=true` the `dateTime` parameter is the latest-arrival-time, so OTP\nwill dynamically calculate the EDT. Using a short search-window is faster than using a\nlonger one, but the search duration is not linear. Using a \\\"too\\\" short search-window will\nwaste resources server side, while using a search-window that is too long will be slow.\n \nOTP will dynamically calculate a reasonable value for the search-window, if not provided.\nThe calculation comes with a significant overhead (10-20% extra). Whether you should use the\ndynamic calculated value or pass in a value depends on your use-case. For a travel planner\nin a small geographical area, with a dense network of public transportation, a fixed value\nbetween 40 minutes and 2 hours makes sense. To find the appropriate search-window, adjust\nit so that the number of itineraries on average is around the wanted `numItineraries`. Make\nsure you set the `numItineraries` to a high number while testing. For a country wide area\nlike Norway, using the dynamic search-window is the best.\n \nWhen paginating, the search-window is calculated using the `numItineraries` in the original\nsearch together with statistics from the search for the last page. This behaviour is\nconfigured server side, and can not be overridden from the client.\n \nThe search-window used is returned to the response metadata as `searchWindowUsed` for\ndebugging purposes.","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":null},{"name":"startTransitStopId","description":"This argument has currently no effect on which itineraries are returned. Use\nargument `fromPlace` to start the itinerary from a specific stop.\n~~A transit stop that this trip must start from~~","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"time","description":"Time of departure or arrival in format hh:mm:ss. Default value: current time","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"to","description":"The geographical location where the itinerary ends.\nUse either this argument or `toPlace`, but not both.","type":{"kind":"INPUT_OBJECT","name":"InputCoordinates","ofType":null},"defaultValue":null},{"name":"toPlace","description":"The place where the itinerary ends in format `name::place`, where `place` is\neither a lat,lng pair (e.g. `Pasila::60.199041,24.932928`) or a stop id\n(e.g. `Pasila::HSL:1000202`).\nUse either this argument or `to`, but not both.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"transferPenalty","description":"An extra penalty added on transfers (i.e. all boardings except the first\none). Not to be confused with bikeBoardCost and walkBoardCost, which are the\ncost of boarding a vehicle with and without a bicycle. The boardCosts are\nused to model the 'usual' perceived cost of using a transit vehicle, and the\ntransferPenalty is used when a user requests even less transfers. In the\nlatter case, we don't actually optimize for fewest transfers, as this can\nlead to absurd results. Consider a trip in New York from Grand Army Plaza\n(the one in Brooklyn) to Kalustyan's at noon. The true lowest transfers\nroute is to wait until midnight, when the 4 train runs local the whole way.\nThe actual fastest route is the 2/3 to the 4/5 at Nevins to the 6 at Union\nSquare, which takes half an hour. Even someone optimizing for fewest\ntransfers doesn't want to wait until midnight. Maybe they would be willing\nto walk to 7th Ave and take the Q to Union Square, then transfer to the 6.\nIf this takes less than optimize_transfer_penalty seconds, then that's what\nwe'll return. Default value: 0.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"transportModes","description":"List of transportation modes that the user is willing to use. Default: `[\"WALK\",\"TRANSIT\"]`","type":{"kind":"LIST","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"TransportMode","ofType":null}},"defaultValue":null},{"name":"triangle","description":"Triangle optimization parameters for bicycling legs. Only effective when `optimize` is set to **TRIANGLE**.","type":{"kind":"INPUT_OBJECT","name":"InputTriangle","ofType":null},"defaultValue":null},{"name":"unpreferred","description":"List of routes and agencies which are given lower preference when planning the itinerary","type":{"kind":"INPUT_OBJECT","name":"InputUnpreferred","ofType":null},"defaultValue":null},{"name":"waitReluctance","description":"How much worse is waiting for a transit vehicle than being on a transit\nvehicle, as a multiplier. The default value treats wait and on-vehicle time\nas the same. It may be tempting to set this higher than walkReluctance (as\nstudies often find this kind of preferences among riders) but the planner\nwill take this literally and walk down a transit line to avoid waiting at a\nstop. This used to be set less than 1 (0.95) which would make waiting\noffboard preferable to waiting onboard in an interlined trip. That is also\nundesirable. If we only tried the shortest possible transfer at each stop to\nneighboring stop patterns, this problem could disappear. Default value: 1.0.","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"walkBoardCost","description":"This prevents unnecessary transfers by adding a cost for boarding a vehicle. Unit: seconds. Default value: 600","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"walkReluctance","description":"A multiplier for how bad walking is, compared to being in transit for equal\nlengths of time. Empirically, values between 2 and 4 seem to correspond\nwell to the concept of not wanting to walk too much without asking for\ntotally ridiculous itineraries, but this observation should in no way be\ntaken as scientific or definitive. Your mileage may vary. See\nhttps://github.com/opentripplanner/OpenTripPlanner/issues/4090 for impact on\nperformance with high values. Default value: 2.0","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"walkSafetyFactor","description":"Factor for how much the walk safety is considered in routing. Value should be between 0 and 1.\nIf the value is set to be 0, safety is ignored. Default is 1.0.","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"walkSpeed","description":"Max walk speed along streets, in meters per second. Default value: 1.33","type":{"kind":"SCALAR","name":"Float","ofType":null},"defaultValue":null},{"name":"wheelchair","description":"Whether the itinerary must be wheelchair accessible. Default value: false","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Plan","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"planConnection","description":"Plan (itinerary) search that follows\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm).","args":[{"name":"after","description":"Takes in cursor from a previous search. Used for forward pagination. If earliest departure time\nis used in the original query, the new search then returns itineraries that depart after\nthe start time of the last itinerary that was returned, or at the same time if there are multiple\nitinerary options that can depart at that moment in time.\nIf latest arrival time is defined, the new search returns itineraries that arrive before the end\ntime of the last itinerary that was returned in the previous search, or at the same time if there\nare multiple itinerary options that can arrive at that moment in time. This parameter is part of\nthe [GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm) and\nshould be used together with the `first` parameter.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"before","description":"Takes in cursor from a previous search. Used for backwards pagination. If earliest departure time\nis used in the original query, the new search then returns itineraries that depart before that time.\nIf latest arrival time is defined, the new search returns itineraries that arrive after that time.\nThis parameter is part of the [GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm)\nand should be used together with the `last` parameter.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"dateTime","description":"Datetime of the search. It's possible to either define the earliest departure time\nor the latest arrival time. By default, earliest departure time is set as now.","type":{"kind":"INPUT_OBJECT","name":"PlanDateTimeInput","ofType":null},"defaultValue":null},{"name":"destination","description":"The destination where the search ends. Usually coordinates but can also be a stop location.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"PlanLabeledLocationInput","ofType":null}},"defaultValue":null},{"name":"first","description":"How many new itineraries should at maximum be returned in either the first search or with\nforward pagination. This parameter is part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm)\nand should be used together with the `after` parameter (although `after` shouldn't be defined\nin the first search).","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"itineraryFilter","description":"Settings that control the behavior of itinerary filtering. These are advanced settings and\nshould not be set by a user through user preferences.","type":{"kind":"INPUT_OBJECT","name":"PlanItineraryFilterInput","ofType":null},"defaultValue":null},{"name":"last","description":"How many new itineraries should at maximum be returned in backwards pagination. It's recommended to\nuse the same value as was used for the `first` parameter in the original search for optimal\nperformance. This parameter is part of the\n[GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm)\nand should be used together with the `before` parameter.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"locale","description":"Locale used for translations. Note, there might not necessarily be translations available.\nIt's possible and recommended to use the ´accept-language´ header instead of this parameter.","type":{"kind":"SCALAR","name":"Locale","ofType":null},"defaultValue":null},{"name":"modes","description":"Street and transit modes used during the search. This also includes options to only return\nan itinerary that contains no transit legs or force transit to be used in all itineraries.\nBy default, all transit modes are usable and `WALK` is used for direct street suggestions,\naccess, egress and transfers.","type":{"kind":"INPUT_OBJECT","name":"PlanModesInput","ofType":null},"defaultValue":null},{"name":"origin","description":"The origin where the search starts. Usually coordinates but can also be a stop location.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"PlanLabeledLocationInput","ofType":null}},"defaultValue":null},{"name":"preferences","description":"Preferences that affect what itineraries are returned. Preferences are split into categories.","type":{"kind":"INPUT_OBJECT","name":"PlanPreferencesInput","ofType":null},"defaultValue":null},{"name":"searchWindow","description":"Duration of the search window. This either starts at the defined earliest departure\ntime or ends at the latest arrival time. If this is not provided, a reasonable\nsearch window is automatically generated. When searching for earlier or later itineraries\nwith paging, this search window is no longer used and the new window will be based\non how many suggestions were returned in the previous search. The new search window can be\nshorter or longer than the original search window. Note, itineraries are returned faster\nwith a smaller search window and search window limitation is done mainly for performance reasons.\n \nSetting this parameter makes especially sense if the transportation network is as sparse or dense\nin the whole itinerary search area. Otherwise, letting the system decide what is the search window\nis in combination of using paging can lead to better performance and to getting a more consistent\nnumber of itineraries in each search.","type":{"kind":"SCALAR","name":"Duration","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"PlanConnection","ofType":null},"isDeprecated":true,"deprecationReason":"Experimental and can include breaking changes, use plan instead"},{"name":"rentalVehicle","description":"Get a single rental vehicle based on its ID, i.e. value of field `vehicleId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"RentalVehicle","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalVehicles","description":"Get all rental vehicles","args":[{"name":"formFactors","description":"Return only rental vehicles that have this form factor.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"FormFactor","ofType":null}},"defaultValue":null},{"name":"ids","description":"Return rental vehicles with these ids, i.e. value of field `vehicleId`.\n**Note:** if an id is invalid (or the rental service is unavailable)\nthe returned list will contain `null` values.\n \nIf this is provided all other filters are ignored.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"RentalVehicle","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"Get a single route based on its ID, i.e. value of field `gtfsId` (format is `FeedId:RouteId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Route","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"Get all routes","args":[{"name":"feeds","description":"Only return routes with these feedIds","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"name","description":"Query routes by this name","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"serviceDates","description":"Only include routes whose pattern operates on at least one service date specified by this filter.\n \n**Note**: A service date is a technical term useful for transit planning purposes and might not\ncorrespond to a how a passenger thinks of a calendar date. For example, a night bus running\non Sunday morning at 1am to 3am, might have the previous Saturday's service date.","type":{"kind":"INPUT_OBJECT","name":"LocalDateRangeInput","ofType":null},"defaultValue":null},{"name":"transportModes","description":"Only include routes, which use one of these modes","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"Mode","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"serviceTimeRange","description":"Get the time range for which the API has data available","args":[],"type":{"kind":"OBJECT","name":"serviceTimeRange","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"station","description":"Get a single station based on its ID, i.e. value of field `gtfsId` (format is `FeedId:StopId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stations","description":"Get all stations","args":[{"name":"ids","description":"Only return stations that match one of the ids in this list","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"name","description":"Query stations by name","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"Get a single stop based on its ID, i.e. value of field `gtfsId` (ID format is `FeedId:StopId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"Get all stops","args":[{"name":"ids","description":"Return stops with these ids","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"name","description":"Query stops by this name","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stopsByBbox","description":"Get all stops within the specified bounding box","args":[{"name":"feeds","description":"List of feed ids from which stops are returned","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"maxLat","description":"Northern bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"maxLon","description":"Eastern bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"minLat","description":"Southern bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"minLon","description":"Western bound of the bounding box","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stopsByRadius","description":"Get all stops within the specified radius from a location. The returned type\nis a Relay connection (see\nhttps://facebook.github.io/relay/graphql/connections.htm). The stopAtDistance\ntype has two values: stop and distance.","args":[{"name":"after","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"before","description":null,"type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"feeds","description":"List of feed ids from which stops are returned","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"first","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"last","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"lat","description":"Latitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"lon","description":"Longitude of the location (WGS 84)","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}},"defaultValue":null},{"name":"radius","description":"Radius (in meters) to search for from the specified location. Note that this\nis walking distance along streets and paths rather than a geographic distance.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"stopAtDistanceConnection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"ticketTypes","description":"Return list of available ticket types","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"TicketType","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Get a single trip based on its ID, i.e. value of field `gtfsId` (format is `FeedId:TripId`)","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trips","description":"Get all trips","args":[{"name":"feeds","description":"Only return trips with these feedIds","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParking","description":"Get a single vehicle parking based on its ID","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"VehicleParking","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParkings","description":"Get all vehicle parkings","args":[{"name":"ids","description":"Return vehicle parkings with these ids.\n**Note:** if an id is invalid (or the vehicle parking service is unavailable)\nthe returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"VehicleParking","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleRentalStation","description":"Get a single vehicle rental station based on its ID, i.e. value of field `stationId`","args":[{"name":"id","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleRentalStations","description":"Get all vehicle rental stations","args":[{"name":"ids","description":"Return vehicle rental stations with these ids, i.e. value of field `stationId`.\n**Note:** if an id is invalid (or the rental service is unavailable)\nthe returned list will contain `null` values.","type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"VehicleRentalStation","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"viewer","description":"Needed until https://github.com/facebook/relay/issues/112 is resolved","args":[],"type":{"kind":"OBJECT","name":"QueryType","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Ratio","description":"A fractional multiplier between 0 and 1, for example 0.25. 0 means 0% and 1 means 100%.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RealTimeEstimate","description":"Real-time estimates for a vehicle at a certain place.","fields":[{"name":"delay","description":"The delay or \"earliness\" of the vehicle at a certain place.\n \nIf the vehicle is early then this is a negative duration.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Duration","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"time","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"OffsetDateTime","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"RealtimeState","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"ADDED","description":"The trip has been added using a real-time update, i.e. the trip was not present in the GTFS feed.","isDeprecated":false,"deprecationReason":null},{"name":"CANCELED","description":"The trip has been canceled by a real-time update.","isDeprecated":false,"deprecationReason":null},{"name":"MODIFIED","description":"The trip information has been updated and resulted in a different trip pattern\ncompared to the trip pattern of the scheduled trip.","isDeprecated":false,"deprecationReason":null},{"name":"SCHEDULED","description":"The trip information comes from the GTFS feed, i.e. no real-time update has been applied.","isDeprecated":false,"deprecationReason":null},{"name":"UPDATED","description":"The trip information has been updated, but the trip pattern stayed the same as the trip pattern of the scheduled trip.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"RelativeDirection","description":"Actions to take relative to the current position when engaging a walking/driving step.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"CIRCLE_CLOCKWISE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CIRCLE_COUNTERCLOCKWISE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CONTINUE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"DEPART","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"ELEVATOR","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"ENTER_STATION","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"EXIT_STATION","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"FOLLOW_SIGNS","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"HARD_LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"HARD_RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SLIGHTLY_LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"SLIGHTLY_RIGHT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"UTURN_LEFT","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"UTURN_RIGHT","description":null,"isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"SCALAR","name":"Reluctance","description":"A cost multiplier for how bad something is compared to being in transit for equal lengths of time.\nThe value should be greater than 0. 1 means neutral and values below 1 mean that something is\npreferred over transit.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicle","description":"Rental vehicle represents a vehicle that belongs to a rental network.","fields":[{"name":"allowPickupNow","description":"If true, vehicle is currently available for renting.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the vehicle (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the vehicle (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the vehicle","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"network","description":"ID of the rental network.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"Use `networkId` from `rentalNetwork` instead."},{"name":"operative","description":"If true, vehicle is not disabled.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalNetwork","description":"The vehicle rental network information. This is referred as system in the GBFS terminology.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"VehicleRentalNetwork","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"rentalUris","description":"Platform-specific URLs to begin the vehicle.","args":[],"type":{"kind":"OBJECT","name":"VehicleRentalUris","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleId","description":"ID of the vehicle in the format of network:id","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleType","description":"The type of the rental vehicle (scooter, bicycle, car...)","args":[],"type":{"kind":"OBJECT","name":"RentalVehicleType","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicleEntityCounts","description":null,"fields":[{"name":"byType","description":"The number of entities by type","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RentalVehicleTypeCount","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"total","description":"The total number of entities (e.g. vehicles, spaces).","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicleType","description":null,"fields":[{"name":"formFactor","description":"The vehicle's general form factor","args":[],"type":{"kind":"ENUM","name":"FormFactor","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"propulsionType","description":"The primary propulsion type of the vehicle","args":[],"type":{"kind":"ENUM","name":"PropulsionType","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RentalVehicleTypeCount","description":null,"fields":[{"name":"count","description":"The number of vehicles of this type","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleType","description":"The type of the rental vehicle (scooter, bicycle, car...)","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RentalVehicleType","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RideHailingEstimate","description":"An estimate for a ride on a hailed vehicle, like an Uber car.","fields":[{"name":"arrival","description":"The estimated time it takes for the vehicle to arrive.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Duration","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"maxPrice","description":"The upper bound of the price estimate of this ride.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Money","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"minPrice","description":"The lower bound of the price estimate of this ride.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Money","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"productName","description":"The name of the ride, ie. UberX","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"provider","description":"The provider of the ride hailing service.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"RideHailingProvider","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RideHailingProvider","description":null,"fields":[{"name":"id","description":"The ID of the ride hailing provider.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RiderCategory","description":"Category of riders a fare product applies to, for example students or pensioners.","fields":[{"name":"id","description":"ID of the category","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Human readable name of the category.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Route","description":"Route represents a public transportation service, usually from point A to point\nB and *back*, shown to customers under a single name, e.g. bus 550. Routes\ncontain patterns (see field `patterns`), which describe different variants of\nthe route, e.g. outbound pattern from point A to point B and inbound pattern\nfrom point B to point A.","fields":[{"name":"agency","description":"Agency operating the route","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"List of alerts which have an effect on the route directly or indirectly.\nBy default only alerts directly affecting this route are returned. It's also possible\nto return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the route.\nBy default only returns alerts that directly affect this route.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"RouteAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"bikesAllowed","description":null,"args":[],"type":{"kind":"ENUM","name":"BikesAllowed","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"color","description":"The color (in hexadecimal format) the agency operating this route would prefer\nto use on UI elements (e.g. polylines on a map) related to this route. This\nvalue is not available for most routes.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"desc","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ID of the route in format `FeedId:RouteId`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"longName","description":"Long name of the route, e.g. Helsinki-Leppävaara","args":[{"name":"language","description":"If translated longName is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from routes.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"mode","description":"Transport mode of this route, e.g. `BUS`","args":[],"type":{"kind":"ENUM","name":"TransitMode","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"List of patterns which operate on this route","args":[{"name":"serviceDates","description":"Filter patterns by the service dates they operate on.\n \n**Note**: A service date is a technical term useful for transit planning purposes and might not\ncorrespond to a how a passenger thinks of a calendar date. For example, a night bus running\non Sunday morning at 1am to 3am, might have the previous Saturday's service date.","type":{"kind":"INPUT_OBJECT","name":"LocalDateRangeInput","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"shortName","description":"Short name of the route, usually a line number, e.g. 550","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"sortOrder","description":"Orders the routes in a way which is useful for presentation to passengers.\nRoutes with smaller values should be displayed first.\n \nThe value can be any non-negative integer. A null value means that no information was supplied.\n \nThis value is passed through from the source data without modification. If multiple feeds\ndefine sort orders for their routes, they may not be comparable to each other as no agreed scale\nexists.\n \nTwo routes may also have the same sort order and clients must decide based on other criteria\nwhat the actual order is.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops on this route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"textColor","description":"The color (in hexadecimal format) the agency operating this route would prefer\nto use when displaying text related to this route. This value is not available\nfor most routes.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trips","description":"List of trips which operate on this route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"type","description":"The raw GTFS route type as a integer. For the list of possible values, see:\nhttps://developers.google.com/transit/gtfs/reference/#routestxt and\nhttps://developers.google.com/transit/gtfs/reference/extended-route-types","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"RouteAlertType","description":"Entities that are relevant for routes that can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCY","description":"Alerts affecting the route's agency.","isDeprecated":false,"deprecationReason":null},{"name":"PATTERNS","description":"Alerts affecting route's patterns.","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE","description":"Alerts directly affecting the route.","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPE","description":"Alerts affecting the route type of the route.","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_ROUTE","description":"Alerts affecting the stops that are on the route.","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_TRIPS","description":"Alerts affecting the stops on some trips of the route.","isDeprecated":false,"deprecationReason":null},{"name":"TRIPS","description":"Alerts affecting the route's trips.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"RouteType","description":"Route type entity which covers all agencies if agency is null,\notherwise only relevant for one agency.","fields":[{"name":"agency","description":"A public transport agency","args":[],"type":{"kind":"OBJECT","name":"Agency","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routeType","description":"GTFS Route type.\nFor the list of possible values, see:\n https://developers.google.com/transit/gtfs/reference/#routestxt and\n https://developers.google.com/transit/gtfs/reference/extended-route-types","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Int","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"The routes which have the defined routeType and belong to the agency, if defined.\nOtherwise all routes of the feed that have the defined routeType.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"RoutingError","description":"Description of the reason, why the planner did not return any results","fields":[{"name":"code","description":"An enum describing the reason","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"RoutingErrorCode","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":"A textual description of why the search failed. The clients are expected to have their own translations based on the code, for user visible error messages.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"inputField","description":"An enum describing the field which should be changed, in order for the search to succeed","args":[],"type":{"kind":"ENUM","name":"InputField","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"RoutingErrorCode","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"LOCATION_NOT_FOUND","description":"The specified location is not close to any streets or transit stops currently loaded into the\nsystem, even though it is generally within its bounds.\n \nThis can happen when there is only transit but no street data coverage at the location in\nquestion.","isDeprecated":false,"deprecationReason":null},{"name":"NO_STOPS_IN_RANGE","description":"No stops are reachable from the start or end locations specified.\n \nYou can try searching using a different access or egress mode, for example cycling instead of walking,\nincrease the walking/cycling/driving speed or have an administrator change the system's configuration\nso that stops further away are considered.","isDeprecated":false,"deprecationReason":null},{"name":"NO_TRANSIT_CONNECTION","description":"No transit connection was found between the origin and destination within the operating day or\nthe next day, not even sub-optimal ones.","isDeprecated":false,"deprecationReason":null},{"name":"NO_TRANSIT_CONNECTION_IN_SEARCH_WINDOW","description":"A transit connection was found, but it was outside the search window. See the metadata for a token\nfor retrieving the result outside the search window.","isDeprecated":false,"deprecationReason":null},{"name":"OUTSIDE_BOUNDS","description":"The coordinates are outside the geographic bounds of the transit and street data currently loaded\ninto the system and therefore cannot return any results.","isDeprecated":false,"deprecationReason":null},{"name":"OUTSIDE_SERVICE_PERIOD","description":"The date specified is outside the range of data currently loaded into the system as it is too\nfar into the future or the past.\n \nThe specific date range of the system is configurable by an administrator and also depends on\nthe input data provided.","isDeprecated":false,"deprecationReason":null},{"name":"WALKING_BETTER_THAN_TRANSIT","description":"Transit connections were requested and found but because it is easier to just walk all the way\nto the destination they were removed.\n \nIf you want to still show the transit results, you need to make walking less desirable by\nincreasing the walk reluctance.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ScooterOptimizationInput","description":"What criteria should be used when optimizing a scooter route.","fields":null,"inputFields":[{"name":"triangle","description":"Define optimization by weighing three criteria.","type":{"kind":"INPUT_OBJECT","name":"TriangleScooterFactorsInput","ofType":null},"defaultValue":null},{"name":"type","description":"Use one of the predefined optimization types.","type":{"kind":"ENUM","name":"ScooterOptimizationType","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"ScooterOptimizationType","description":"Predefined optimization alternatives for scooter routing. For more customization,\none can use the triangle factors.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"FLAT_STREETS","description":"Emphasize flatness over safety or duration of the route. This option was previously called `FLAT`.","isDeprecated":false,"deprecationReason":null},{"name":"SAFEST_STREETS","description":"Completely ignore the elevation differences and prefer the streets, that are evaluated\nto be safest for scooters, even more than with the `SAFE_STREETS` option.\nSafety can also include other concerns such as convenience and general preferences by taking\ninto account road surface etc. Note, currently the same criteria is used both for cycling and\nscooter travel to determine how safe streets are for cycling or scooter.\nThis option was previously called `GREENWAYS`.","isDeprecated":false,"deprecationReason":null},{"name":"SAFE_STREETS","description":"Emphasize scooter safety over flatness or duration of the route. Safety can also include other\nconcerns such as convenience and general preferences by taking into account road surface etc.\nNote, currently the same criteria is used both for cycling and scooter travel to determine how\nsafe streets are for cycling or scooter. This option was previously called `SAFE`.","isDeprecated":false,"deprecationReason":null},{"name":"SHORTEST_DURATION","description":"Search for routes with the shortest duration while ignoring the scooter safety\nof the streets. The routes should still follow local regulations, but currently scooters\nare only allowed on the same streets as bicycles which might not be accurate for each country\nor with different types of scooters. Routes can include steep streets, if they are\nthe fastest alternatives. This option was previously called `QUICK`.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ScooterPreferencesInput","description":"Preferences related to travel with a scooter (kick or e-scooter).","fields":null,"inputFields":[{"name":"optimization","description":"What criteria should be used when optimizing a scooter route.","type":{"kind":"INPUT_OBJECT","name":"ScooterOptimizationInput","ofType":null},"defaultValue":null},{"name":"reluctance","description":"A multiplier for how bad riding a scooter is compared to being in transit\nfor equal lengths of time.","type":{"kind":"SCALAR","name":"Reluctance","ofType":null},"defaultValue":null},{"name":"rental","description":"Scooter rental related preferences.","type":{"kind":"INPUT_OBJECT","name":"ScooterRentalPreferencesInput","ofType":null},"defaultValue":null},{"name":"speed","description":"Maximum speed on flat ground while riding a scooter. Note, this speed is higher than\nthe average speed will be in itineraries as this is the maximum speed but there are\nfactors that slow down the travel such as crossings, intersections and elevation changes.","type":{"kind":"SCALAR","name":"Speed","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"ScooterRentalPreferencesInput","description":"Preferences related to scooter rental (station based or floating scooter rental).","fields":null,"inputFields":[{"name":"allowedNetworks","description":"Rental networks which can be potentially used as part of an itinerary.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"bannedNetworks","description":"Rental networks which cannot be used as part of an itinerary.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"destinationScooterPolicy","description":"Is it possible to arrive to the destination with a rented scooter and does it\ncome with an extra cost.","type":{"kind":"INPUT_OBJECT","name":"DestinationScooterPolicyInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"Speed","description":"Speed in meters per seconds. Values are positive floating point numbers (for example, 2.34).","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Stop","description":"Stop can represent either a single public transport stop, where passengers can\nboard and/or disembark vehicles, or a station, which contains multiple stops.\nSee field `locationType`.","fields":[{"name":"alerts","description":"By default, list of alerts which have directly an effect on just the stop.\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the stop.\nBy default, list of alerts which have directly an effect on just the stop.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"StopAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"cluster","description":"The cluster which this stop is part of","args":[],"type":{"kind":"OBJECT","name":"Cluster","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"code","description":"Stop code which is visible at the stop","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"desc","description":"Description of the stop, usually a street name","args":[{"name":"language","description":"If translated description is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses descriptions from stops.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"direction","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"geometries","description":"Representations of this stop's geometry. This is mainly interesting for flex stops which can be\na polygon or a group of stops either consisting of either points or polygons.\n \nRegular fixed-schedule stops return a single point.\n \nStations (parent stations with child stops) contain a geometry collection with a point for the\ncentral coordinate plus a convex hull polygon (https://en.wikipedia.org/wiki/Convex_hull) of all\ncoordinates of the child stops.\n \nIf there are only two child stops then the convex hull is a straight line between the them. If\nthere is a single child stop then it's a single point.","args":[],"type":{"kind":"OBJECT","name":"StopGeometries","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ÌD of the stop in format `FeedId:StopId`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"locationType","description":"Identifies whether this stop represents a stop or station.","args":[],"type":{"kind":"ENUM","name":"LocationType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the stop (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the stop, e.g. Pasilan asema","args":[{"name":"language","description":"If translated name is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from stops.txt.\nE.g. Swedish name for Pasilan asema is Böle station.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"parentStation","description":"The station which this stop is part of (or null if this stop is not part of a station)","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"patterns","description":"Patterns which pass through this stop","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Pattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"platformCode","description":"Identifier of the platform, usually a number. This value is only present for stops that are part of a station","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"routes","description":"Routes which pass through this stop","args":[{"name":"serviceDates","description":"Only include routes which are operational on at least one service date specified by this filter.\n \n**Note**: A service date is a technical term useful for transit planning purposes and might not\ncorrespond to a how a passenger thinks of a calendar date. For example, a night bus running\non Sunday morning at 1am to 3am, might have the previous Saturday's service date.","type":{"kind":"INPUT_OBJECT","name":"LocalDateRangeInput","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"stopTimesForPattern","description":"Returns timetable of the specified pattern at this stop","args":[{"name":"id","description":"Id of the pattern","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"numberOfDepartures","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"2"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"startTime","description":"Return departures after this time. Format: Unix timestamp in seconds. Default value: current time","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"Return stoptimes within this time range, starting from `startTime`. Unit: Seconds","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"Returns all stops that are children of this station (Only applicable for stations)","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesForPatterns","description":"Returns list of stoptimes (arrivals and departures) at this stop, grouped by patterns","args":[{"name":"numberOfDepartures","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"5"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"startTime","description":"Return departures after this time. Format: Unix timestamp in seconds. Default value: current time","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"Return stoptimes within this time range, starting from `startTime`. Unit: Seconds","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"StoptimesInPattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesForServiceDate","description":"Returns list of stoptimes for the specified date","args":[{"name":"date","description":"Date in format YYYYMMDD","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"StoptimesInPattern","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesWithoutPatterns","description":"Returns list of stoptimes (arrivals and departures) at this stop","args":[{"name":"numberOfDepartures","description":null,"type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"5"},{"name":"omitCanceled","description":"If false, returns also canceled trips","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"true"},{"name":"omitNonPickups","description":"If true, only those departures which allow boarding are returned","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"},{"name":"startTime","description":"Return departures after this time. Format: Unix timestamp in seconds. Default value: current time","type":{"kind":"SCALAR","name":"Long","ofType":null},"defaultValue":"0"},{"name":"timeRange","description":"Return stoptimes within this time range, starting from `startTime`. Unit: Seconds","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":"86400"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"timezone","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"transfers","description":"List of nearby stops which can be used for transfers","args":[{"name":"maxDistance","description":"Maximum distance to the transfer stop. Defaults to unlimited.\n**Note:** only stops that are linked as a transfer stops to this stop are\nreturned, i.e. this does not do a query to search for *all* stops within\nradius of `maxDistance`.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"stopAtDistance","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":null,"args":[{"name":"language","description":"If translated url is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses url from stops.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleMode","description":"Transport mode (e.g. `BUS`) used by routes which pass through this stop or\n`null` if mode cannot be determined, e.g. in case no routes pass through the stop.\nNote that also other types of vehicles may use the stop, e.g. tram replacement\nbuses might use stops which have `TRAM` as their mode.","args":[],"type":{"kind":"ENUM","name":"Mode","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleType","description":"The raw GTFS route type used by routes which pass through this stop. For the\nlist of possible values, see:\nhttps://developers.google.com/transit/gtfs/reference/#routestxt and\nhttps://developers.google.com/transit/gtfs/reference/extended-route-types","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairBoarding","description":"Whether wheelchair boarding is possible for at least some of vehicles on this stop","args":[],"type":{"kind":"ENUM","name":"WheelchairBoarding","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"zoneId","description":"ID of the zone where this stop is located","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"StopAlertType","description":"Entities, which are relevant for a stop and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCIES_OF_ROUTES","description":"Alerts affecting the agencies of the routes going through the stop","isDeprecated":false,"deprecationReason":null},{"name":"PATTERNS","description":"Alerts affecting the stop's patterns","isDeprecated":false,"deprecationReason":null},{"name":"ROUTES","description":"Alerts affecting the routes that go through the stop","isDeprecated":false,"deprecationReason":null},{"name":"STOP","description":"Alerts affecting the stop","isDeprecated":false,"deprecationReason":null},{"name":"STOP_ON_ROUTES","description":"Alerts affecting the stop on specific routes","isDeprecated":false,"deprecationReason":null},{"name":"STOP_ON_TRIPS","description":"Alerts affecting the stop on specific trips","isDeprecated":false,"deprecationReason":null},{"name":"TRIPS","description":"Alerts affecting the trips that go through this stop","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"StopGeometries","description":null,"fields":[{"name":"geoJson","description":"Representation of the stop geometries as GeoJSON (https://geojson.org/)","args":[],"type":{"kind":"SCALAR","name":"GeoJson","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"googleEncoded","description":"Representation of a stop as a series of polylines.\n \nPolygons of flex stops are represented as linear rings (lines where the first and last point are the same).\n \nProper stops are represented as single point \"lines\".","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Geometry","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"StopOnRoute","description":"Stop that should (but not guaranteed) to exist on a route.","fields":[{"name":"route","description":"Route which contains the stop.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"Stop at the route. It's also possible that the stop is no longer on the route.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"StopOnTrip","description":"Stop that should (but not guaranteed) to exist on a trip.","fields":[{"name":"stop","description":"Stop at the trip. It's also possible that the stop is no longer on the trip.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Trip which contains the stop.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"UNION","name":"StopPosition","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":[{"kind":"OBJECT","name":"PositionAtStop","ofType":null},{"kind":"OBJECT","name":"PositionBetweenStops","ofType":null}]},{"kind":"OBJECT","name":"StopRelationship","description":"Upcoming or current stop and how close the vehicle is to it.","fields":[{"name":"status","description":"How close the vehicle is to `stop`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"VehicleStopStatus","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Stoptime","description":"Stoptime represents the time when a specific trip arrives to or departs from a specific stop.","fields":[{"name":"arrivalDelay","description":"The offset from the scheduled arrival time in seconds. Negative values\nindicate that the trip is running ahead of schedule.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"departureDelay","description":"The offset from the scheduled departure time in seconds. Negative values\nindicate that the trip is running ahead of schedule","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"dropoffType","description":"Whether the vehicle can be disembarked at this stop. This field can also be\nused to indicate if disembarkation is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"headsign","description":"Vehicle headsign of the trip on this stop. Trip headsigns can change during\nthe trip (e.g. on routes which run on loops), so this value should be used\ninstead of `tripHeadsign` to display the headsign relevant to the user.","args":[{"name":"language","description":"If translated headsign is found from gtfs translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from trip_headsign.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pickupType","description":"Whether the vehicle can be boarded at this stop. This field can also be used\nto indicate if boarding is possible only with special arrangements.","args":[],"type":{"kind":"ENUM","name":"PickupDropoffType","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"true, if this stoptime has real-time data available","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeArrival","description":"Real-time prediction of arrival time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeDeparture","description":"Real-time prediction of departure time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtimeState","description":"State of real-time data","args":[],"type":{"kind":"ENUM","name":"RealtimeState","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"scheduledArrival","description":"Scheduled arrival time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"scheduledDeparture","description":"Scheduled departure time. Format: seconds since midnight of the departure date","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"serviceDay","description":"Departure date of the trip. Format: Unix timestamp (local time) in seconds.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":"The stop where this arrival/departure happens","args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stopPosition","description":"The sequence of the stop in the pattern. This is not required to start from 0 or be consecutive - any\nincreasing integer sequence along the stops is valid.\n \nThe purpose of this field is to identify the stop within the pattern so it can be cross-referenced\nbetween it and the itinerary. It is safe to cross-reference when done quickly, i.e. within seconds.\nHowever, it should be noted that real-time updates can change the values, so don't store it for\nlonger amounts of time.\n \nDepending on the source data, this might not be the GTFS `stop_sequence` but another value, perhaps\neven generated.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"timepoint","description":"true, if this stop is used as a time equalization stop. false otherwise.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Trip which this stoptime is for","args":[],"type":{"kind":"OBJECT","name":"Trip","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"StoptimesInPattern","description":"Stoptimes grouped by pattern","fields":[{"name":"pattern","description":null,"args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimes","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"String","description":"Built-in String","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"SystemNotice","description":"A system notice is used to tag elements with system information for debugging\nor other system related purpose. One use-case is to run a routing search with\n'debugItineraryFilter: true'. This will then tag itineraries instead of removing\nthem from the result. This make it possible to inspect the itinerary-filter-chain.\nA SystemNotice only has english text,\nbecause the primary user are technical staff, like testers and developers.","fields":[{"name":"tag","description":"Notice's tag","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"text","description":"Notice's description","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"TicketType","description":"Describes ticket type","fields":[{"name":"currency","description":"ISO 4217 currency code","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"fareId","description":"Ticket type ID in format `FeedId:TicketTypeId`. Ticket type IDs are usually\ncombination of ticket zones where the ticket is valid.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"price","description":"Price of the ticket in currency that is specified in `currency` field","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"zones","description":"List of zones where this ticket is valid.\nCorresponds to field `zoneId` in **Stop** type.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TimetablePreferencesInput","description":null,"fields":null,"inputFields":[{"name":"excludeRealTimeUpdates","description":"When false, real-time updates are considered during the routing.\nIn practice, when this option is set as true, some of the suggestions might not be\nrealistic as the transfers could be invalid due to delays,\ntrips can be cancelled or stops can be skipped.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"includePlannedCancellations","description":"When true, departures that have been cancelled ahead of time will be\nincluded during the routing. This means that an itinerary can include\na cancelled departure while some other alternative that contains no cancellations\ncould be filtered out as the alternative containing a cancellation would normally\nbe better.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"includeRealTimeCancellations","description":"When true, departures that have been cancelled through a real-time feed will be\nincluded during the routing. This means that an itinerary can include\na cancelled departure while some other alternative that contains no cancellations\ncould be filtered out as the alternative containing a cancellation would normally\nbe better. This option can't be set to true while `includeRealTimeUpdates` is false.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TransferPreferencesInput","description":"Preferences related to transfers between transit vehicles (typically between stops).","fields":null,"inputFields":[{"name":"cost","description":"A static cost that is added for each transfer on top of other costs.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null},{"name":"maximumAdditionalTransfers","description":"How many additional transfers there can be at maximum compared to the itinerary with the\nleast number of transfers.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"maximumTransfers","description":"How many transfers there can be at maximum in an itinerary.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null},{"name":"slack","description":"A global minimum transfer time (in seconds) that specifies the minimum amount of time\nthat must pass between exiting one transit vehicle and boarding another. This time is\nin addition to time it might take to walk between transit stops. Setting this value\nas `PT0S`, for example, can lead to passenger missing a connection when the vehicle leaves\nahead of time or the passenger arrives to the stop later than expected.","type":{"kind":"SCALAR","name":"Duration","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"TransitMode","description":"Transit modes include modes that are used within organized transportation networks\nrun by public transportation authorities, taxi companies etc.\nEquivalent to GTFS route_type or to NeTEx TransportMode.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AIRPLANE","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"BUS","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CABLE_CAR","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"CARPOOL","description":"Private car trips shared with others.","isDeprecated":false,"deprecationReason":null},{"name":"COACH","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"FERRY","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"FUNICULAR","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"GONDOLA","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"MONORAIL","description":"Railway in which the track consists of a single rail or a beam.","isDeprecated":false,"deprecationReason":null},{"name":"RAIL","description":"This includes long or short distance trains.","isDeprecated":false,"deprecationReason":null},{"name":"SUBWAY","description":"Subway or metro, depending on the local terminology.","isDeprecated":false,"deprecationReason":null},{"name":"TAXI","description":"A taxi, possibly operated by a public transport agency.","isDeprecated":false,"deprecationReason":null},{"name":"TRAM","description":null,"isDeprecated":false,"deprecationReason":null},{"name":"TROLLEYBUS","description":"Electric buses that draw power from overhead wires using poles.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TransitModePreferenceCostInput","description":"Costs related to using a transit mode.","fields":null,"inputFields":[{"name":"reluctance","description":"A cost multiplier of transit leg travel time.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Reluctance","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TransitPreferencesInput","description":"Transit routing preferences used for transit legs.","fields":null,"inputFields":[{"name":"alight","description":"Preferences related to alighting from a transit vehicle.","type":{"kind":"INPUT_OBJECT","name":"AlightPreferencesInput","ofType":null},"defaultValue":null},{"name":"board","description":"Preferences related to boarding a transit vehicle. Note, board costs for each street mode\ncan be found under the street mode preferences.","type":{"kind":"INPUT_OBJECT","name":"BoardPreferencesInput","ofType":null},"defaultValue":null},{"name":"timetable","description":"Preferences related to cancellations and real-time.","type":{"kind":"INPUT_OBJECT","name":"TimetablePreferencesInput","ofType":null},"defaultValue":null},{"name":"transfer","description":"Preferences related to transfers between transit vehicles (typically between stops).","type":{"kind":"INPUT_OBJECT","name":"TransferPreferencesInput","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"TranslatedString","description":"Text with language","fields":[{"name":"language","description":"Two-letter language code (ISO 639-1)","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"text","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TransportMode","description":"Transportation mode which can be used in the itinerary","fields":null,"inputFields":[{"name":"mode","description":null,"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"Mode","ofType":null}},"defaultValue":null},{"name":"qualifier","description":"Optional additional qualifier for transport mode, e.g. `RENT`","type":{"kind":"ENUM","name":"Qualifier","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TriangleCyclingFactorsInput","description":"Relative importance of optimization factors. Only effective for bicycling legs.\nInvariant: `safety + flatness + time == 1`","fields":null,"inputFields":[{"name":"flatness","description":"Relative importance of flat terrain","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Ratio","ofType":null}},"defaultValue":null},{"name":"safety","description":"Relative importance of cycling safety, but this factor can also include other\nconcerns such as convenience and general cyclist preferences by taking into account\nroad surface etc.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Ratio","ofType":null}},"defaultValue":null},{"name":"time","description":"Relative importance of duration","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Ratio","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"TriangleScooterFactorsInput","description":"Relative importance of optimization factors. Only effective for scooter legs.\nInvariant: `safety + flatness + time == 1`","fields":null,"inputFields":[{"name":"flatness","description":"Relative importance of flat terrain","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Ratio","ofType":null}},"defaultValue":null},{"name":"safety","description":"Relative importance of scooter safety, but this factor can also include other\nconcerns such as convenience and general scooter preferences by taking into account\nroad surface etc.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Ratio","ofType":null}},"defaultValue":null},{"name":"time","description":"Relative importance of duration","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Ratio","ofType":null}},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Trip","description":"Trip is a specific occurance of a pattern, usually identified by route, direction on the route and exact departure time.","fields":[{"name":"activeDates","description":"List of dates when this trip is in service. Format: YYYYMMDD","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"By default, list of alerts which have directly an effect on just the trip.\nIt's also possible to return other relevant alerts through defining types.","args":[{"name":"types","description":"Returns alerts for these types that are relevant for the trip.\nBy default, list of alerts which have directly an effect on just the trip.","type":{"kind":"LIST","name":null,"ofType":{"kind":"ENUM","name":"TripAlertType","ofType":null}},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"arrivalStoptime","description":"Arrival time to the final stop","args":[{"name":"serviceDate","description":"Date for which the arrival time is returned. Format: YYYYMMDD. If this\nargument is not used, field `serviceDay` in the stoptime will have a value of 0.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stoptime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bikesAllowed","description":"Whether bikes are allowed on board the vehicle running this trip","args":[],"type":{"kind":"ENUM","name":"BikesAllowed","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"blockId","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"departureStoptime","description":"Departure time from the first stop","args":[{"name":"serviceDate","description":"Date for which the departure time is returned. Format: YYYYMMDD. If this\nargument is not used, field `serviceDay` in the stoptime will have a value of 0.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"Stoptime","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"directionId","description":"Direction code of the trip, i.e. is this the outbound or inbound trip of a\npattern. Possible values: 0, 1 or `null` if the direction is irrelevant, i.e.\nthe pattern has trips only in one direction.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"geometry","description":"List of coordinates of this trip's route","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"Float","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"gtfsId","description":"ID of the trip in format `FeedId:TripId`","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"occupancy","description":"The latest real-time occupancy information for the latest occurance of this\ntrip.","args":[],"type":{"kind":"OBJECT","name":"TripOccupancy","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"pattern","description":"The pattern the trip is running on","args":[],"type":{"kind":"OBJECT","name":"Pattern","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"route","description":"The route the trip is running on","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"routeShortName","description":"Short name of the route this trip is running. See field `shortName` of Route.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"semanticHash","description":"Hash code of the trip. This value is stable and not dependent on the trip id.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"serviceId","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"shapeId","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stops","description":"List of stops this trip passes through","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Stop","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimes","description":"List of times when this trip arrives to or departs from a stop","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stoptimesForDate","description":null,"args":[{"name":"serviceDate","description":"Date for which stoptimes are returned. Format: YYYYMMDD","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Stoptime","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"tripGeometry","description":"Coordinates of the route of this trip in Google polyline encoded format","args":[],"type":{"kind":"OBJECT","name":"Geometry","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tripHeadsign","description":"Headsign of the vehicle when running on this trip","args":[{"name":"language","description":"If a translated headsign is found from GTFS translation.txt and wanted language is not same as\nfeed's language then returns wanted translation. Otherwise uses name from trip_headsign.txt.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tripShortName","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairAccessible","description":"Whether the vehicle running this trip can be boarded by a wheelchair","args":[],"type":{"kind":"ENUM","name":"WheelchairBoarding","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"TripAlertType","description":"Entities, which are relevant for a trip and can contain alerts","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"AGENCY","description":"Alerts affecting the trip's agency","isDeprecated":false,"deprecationReason":null},{"name":"PATTERN","description":"Alerts affecting the trip's pattern","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE","description":"Alerts affecting the trip's route","isDeprecated":false,"deprecationReason":null},{"name":"ROUTE_TYPE","description":"Alerts affecting the route type of the trip's route","isDeprecated":false,"deprecationReason":null},{"name":"STOPS_ON_TRIP","description":"Alerts affecting the stops visited on the trip.\nSome of the alerts can only affect the trip or its route on the stop.","isDeprecated":false,"deprecationReason":null},{"name":"TRIP","description":"Alerts affecting the trip","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"TripOccupancy","description":"Occupancy of a vehicle on a trip. This should include the most recent occupancy information\navailable for a trip. Historic data might not be available.","fields":[{"name":"occupancyStatus","description":"Occupancy information mapped to a limited set of descriptive states.","args":[],"type":{"kind":"ENUM","name":"OccupancyStatus","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Unknown","description":"This is used for alert entities that we don't explicitly handle or they are missing.","fields":[{"name":"description","description":"Entity's description","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleParking","description":"Vehicle parking represents a location where bicycles or cars can be parked.","fields":[{"name":"anyCarPlaces","description":"Does this vehicle parking have spaces (capacity) for either wheelchair accessible (disabled)\nor normal cars.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"availability","description":"The currently available spaces at this vehicle parking.","args":[],"type":{"kind":"OBJECT","name":"VehicleParkingSpaces","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bicyclePlaces","description":"Does this vehicle parking have spaces (capacity) for bicycles.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"capacity","description":"The capacity (maximum available spaces) of this vehicle parking.","args":[],"type":{"kind":"OBJECT","name":"VehicleParkingSpaces","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"carPlaces","description":"Does this vehicle parking have spaces (capacity) for cars excluding wheelchair accessible spaces.\nUse anyCarPlaces to check if any type of car may use this vehicle parking.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"detailsUrl","description":"URL which contains details of this vehicle parking.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"imageUrl","description":"URL of an image which may be displayed to the user showing the vehicle parking.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the bike park (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the park","args":[{"name":"language","description":"Returns name with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"note","description":"A short translatable note containing details of this vehicle parking.","args":[{"name":"language","description":"Returns note with the specified language, if found, otherwise returns with some default language.","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":null}],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"openingHours","description":"Opening hours of the parking facility","args":[],"type":{"kind":"OBJECT","name":"OpeningHours","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, value of `spacesAvailable` is updated from a real-time source.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"state","description":"The state of this vehicle parking.\nOnly ones in an OPERATIONAL state may be used for Park and Ride.","args":[],"type":{"kind":"ENUM","name":"VehicleParkingState","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"tags","description":"Source specific tags of the vehicle parking, which describe the available features. For example\npark_and_ride, bike_lockers, or static_osm_data.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleParkingId","description":"ID of the park","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairAccessibleCarPlaces","description":"Does this vehicle parking have wheelchair accessible (disabled) car spaces (capacity).","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"VehicleParkingInput","description":"Preferences for parking facilities used during the routing.","fields":null,"inputFields":[{"name":"filters","description":"Selection filters to include or exclude parking facilities.\nAn empty list will include all facilities in the routing search.","type":{"kind":"LIST","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}},"defaultValue":null},{"name":"preferred","description":"If non-empty every parking facility that doesn't match this set of conditions will\nreceive an extra cost (defined by `unpreferredCost`) and therefore avoided.","type":{"kind":"LIST","name":null,"ofType":{"kind":"INPUT_OBJECT","name":"ParkingFilter","ofType":null}},"defaultValue":null},{"name":"unpreferredCost","description":"If `preferred` is non-empty, using a parking facility that doesn't contain\nat least one of the preferred conditions, will receive this extra cost and therefore avoided if\npreferred options are available.","type":{"kind":"SCALAR","name":"Int","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleParkingSpaces","description":"The number of spaces by type. null if unknown.","fields":[{"name":"bicycleSpaces","description":"The number of bicycle spaces.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"carSpaces","description":"The number of car spaces.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"wheelchairAccessibleCarSpaces","description":"The number of wheelchair accessible (disabled) car spaces.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"VehicleParkingState","description":"The state of the vehicle parking. TEMPORARILY_CLOSED and CLOSED are distinct states so that they\nmay be represented differently to the user.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"CLOSED","description":"Can't be used for park and ride.","isDeprecated":false,"deprecationReason":null},{"name":"OPERATIONAL","description":"May be used for park and ride.","isDeprecated":false,"deprecationReason":null},{"name":"TEMPORARILY_CLOSED","description":"Can't be used for park and ride.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"VehiclePosition","description":"Real-time vehicle position","fields":[{"name":"heading","description":"Bearing, in degrees, clockwise from North, i.e., 0 is North and 90 is East. This can be the\ncompass bearing, or the direction towards the next stop or intermediate location.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"label","description":"Human-readable label of the vehicle, eg. a publicly visible number or a license plate","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lastUpdated","description":"When the position of the vehicle was recorded in seconds since the UNIX epoch.","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the vehicle","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the vehicle","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"speed","description":"Speed of the vehicle in meters/second","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stopRelationship","description":"The current stop where the vehicle will be or is currently arriving.","args":[],"type":{"kind":"OBJECT","name":"StopRelationship","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"trip","description":"Which trip this vehicles runs on.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"Trip","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"vehicleId","description":"Feed-scoped ID that uniquely identifies the vehicle in the format FeedId:VehicleId","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleRentalNetwork","description":"Vehicle rental network, which is referred as system in the GBFS terminology. Note, the same operator can operate in multiple\nregions either with the same network/system or with a different one. This can contain information about either the rental brand\nor about the operator.","fields":[{"name":"networkId","description":"ID of the vehicle rental network. In GBFS, this is the `system_id` field from the system information, but it can\nbe overridden in the configuration to have a different value so this field doesn't necessarily match the source data.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"url","description":"The rental vehicle operator's network/system URL. In GBFS, this is the `url` field from the system information.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleRentalStation","description":"Vehicle rental station represents a location where users can rent bicycles etc. for a fee.","fields":[{"name":"allowDropoff","description":"If true, vehicles can be returned to this station if the station has spaces available\nor allows overloading.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowDropoffNow","description":"If true, vehicles can be currently returned to this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowOverloading","description":"If true, vehicles can be returned even if spacesAvailable is zero or vehicles > capacity.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickup","description":"If true, vehicles can be picked up from this station if the station has vehicles available.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"allowPickupNow","description":"If true, vehicles can be currently picked up from this station.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"availableSpaces","description":"Number of free spaces currently available on the rental station, grouped by vehicle type.","args":[],"type":{"kind":"OBJECT","name":"RentalVehicleEntityCounts","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"availableVehicles","description":"Number of vehicles currently available on the rental station, grouped by vehicle type.","args":[],"type":{"kind":"OBJECT","name":"RentalVehicleEntityCounts","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"capacity","description":"Nominal capacity (number of racks) of the rental station.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"Latitude of the vehicle rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"Longitude of the vehicle rental station (WGS 84)","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":"Name of the vehicle rental station","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"network","description":"ID of the rental network.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"Use `networkId` from `rentalNetwork` instead."},{"name":"operative","description":"If true, station is on and in service.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"realtime","description":"If true, values of `vehiclesAvailable` and `spacesAvailable` are updated from a\nreal-time source. If false, values of `vehiclesAvailable` and `spacesAvailable`\nare always the total capacity divided by two.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"rentalNetwork","description":"The vehicle rental network information. This is referred as system in the GBFS terminology.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"VehicleRentalNetwork","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"rentalUris","description":"Platform-specific URLs to begin renting a vehicle from this station.","args":[],"type":{"kind":"OBJECT","name":"VehicleRentalUris","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"spacesAvailable","description":"Number of free spaces currently available on the rental station.\nNote that this value being 0 does not necessarily indicate that vehicles cannot be returned\nto this station, as for example it might be possible to leave the vehicle in the vicinity of\nthe rental station, even if the vehicle racks don't have any spaces available.\nSee field `allowDropoffNow` to know if is currently possible to return a vehicle.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `availableSpaces` instead, which also contains the space vehicle types"},{"name":"stationId","description":"ID of the vehicle in the format of network:id","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"vehiclesAvailable","description":"Number of vehicles currently available on the rental station.\nSee field `allowPickupNow` to know if is currently possible to pick up a vehicle.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"Use `availableVehicles` instead, which also contains vehicle types"}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null},{"kind":"INTERFACE","name":"PlaceInterface","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"VehicleRentalUris","description":null,"fields":[{"name":"android","description":"A URI that can be passed to an Android app with an {@code android.intent.action.VIEW} Android\nintent to support Android Deep Links.\nMay be null if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"ios","description":"A URI that can be used on iOS to launch the rental app for this rental network.\nMay be {@code null} if a rental URI does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"web","description":"A URL that can be used by a web browser to show more information about renting a vehicle.\nMay be {@code null} if a rental URL does not exist.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"VehicleStopStatus","description":"How close the vehicle is to the stop.","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"INCOMING_AT","description":"The vehicle is just about to arrive at the stop (on a stop display, the vehicle symbol typically flashes).","isDeprecated":false,"deprecationReason":null},{"name":"IN_TRANSIT_TO","description":"The vehicle has departed the previous stop and is in transit.","isDeprecated":false,"deprecationReason":null},{"name":"STOPPED_AT","description":"The vehicle is standing at the stop.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"ENUM","name":"VertexType","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"BIKEPARK","description":"BIKEPARK","isDeprecated":false,"deprecationReason":null},{"name":"BIKESHARE","description":"BIKESHARE","isDeprecated":false,"deprecationReason":null},{"name":"NORMAL","description":"NORMAL","isDeprecated":false,"deprecationReason":null},{"name":"PARKANDRIDE","description":"PARKANDRIDE","isDeprecated":false,"deprecationReason":null},{"name":"TRANSIT","description":"TRANSIT","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"WalkPreferencesInput","description":"Preferences related to walking (excluding walking a bicycle or a scooter).","fields":null,"inputFields":[{"name":"boardCost","description":"The cost of boarding a vehicle while walking.","type":{"kind":"SCALAR","name":"Cost","ofType":null},"defaultValue":null},{"name":"reluctance","description":"A multiplier for how bad walking is compared to being in transit for equal lengths of time.","type":{"kind":"SCALAR","name":"Reluctance","ofType":null},"defaultValue":null},{"name":"safetyFactor","description":"Factor for how much the walk safety is considered in routing. Value should be between 0 and 1.\nIf the value is set to be 0, safety is ignored.","type":{"kind":"SCALAR","name":"Ratio","ofType":null},"defaultValue":null},{"name":"speed","description":"Maximum walk speed on flat ground. Note, this speed is higher than the average speed\nwill be in itineraries as this is the maximum speed but there are\nfactors that slow down walking such as crossings, intersections and elevation changes.","type":{"kind":"SCALAR","name":"Speed","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"WheelchairBoarding","description":null,"fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"NOT_POSSIBLE","description":"Wheelchair boarding is not possible at this stop.","isDeprecated":false,"deprecationReason":null},{"name":"NO_INFORMATION","description":"There is no accessibility information for the stop.","isDeprecated":false,"deprecationReason":null},{"name":"POSSIBLE","description":"At least some vehicles at this stop can be boarded by a rider in a wheelchair.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"INPUT_OBJECT","name":"WheelchairPreferencesInput","description":"Wheelchair related preferences. Note, this is the only from of accessibilty available\ncurrently and is sometimes is used for other accessibility needs as well.","fields":null,"inputFields":[{"name":"enabled","description":"Is wheelchair accessibility considered in routing. Note, this does not guarantee\nthat the itineraries are wheelchair accessible as there can be data issues.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null}],"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Directive","description":null,"fields":[{"name":"name","description":"The __Directive type represents a Directive that a server supports.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isRepeatable","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"locations","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"__DirectiveLocation","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"args","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__InputValue","ofType":null}}}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"__DirectiveLocation","description":"An enum describing valid locations where a directive can be placed","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"QUERY","description":"Indicates the directive is valid on queries.","isDeprecated":false,"deprecationReason":null},{"name":"MUTATION","description":"Indicates the directive is valid on mutations.","isDeprecated":false,"deprecationReason":null},{"name":"SUBSCRIPTION","description":"Indicates the directive is valid on subscriptions.","isDeprecated":false,"deprecationReason":null},{"name":"FIELD","description":"Indicates the directive is valid on fields.","isDeprecated":false,"deprecationReason":null},{"name":"FRAGMENT_DEFINITION","description":"Indicates the directive is valid on fragment definitions.","isDeprecated":false,"deprecationReason":null},{"name":"FRAGMENT_SPREAD","description":"Indicates the directive is valid on fragment spreads.","isDeprecated":false,"deprecationReason":null},{"name":"INLINE_FRAGMENT","description":"Indicates the directive is valid on inline fragments.","isDeprecated":false,"deprecationReason":null},{"name":"VARIABLE_DEFINITION","description":"Indicates the directive is valid on variable definitions.","isDeprecated":false,"deprecationReason":null},{"name":"SCHEMA","description":"Indicates the directive is valid on a schema SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"SCALAR","description":"Indicates the directive is valid on a scalar SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"OBJECT","description":"Indicates the directive is valid on an object SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"FIELD_DEFINITION","description":"Indicates the directive is valid on a field SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"ARGUMENT_DEFINITION","description":"Indicates the directive is valid on a field argument SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"INTERFACE","description":"Indicates the directive is valid on an interface SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"UNION","description":"Indicates the directive is valid on an union SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"ENUM","description":"Indicates the directive is valid on an enum SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"ENUM_VALUE","description":"Indicates the directive is valid on an enum value SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"INPUT_OBJECT","description":"Indicates the directive is valid on an input object SDL definition.","isDeprecated":false,"deprecationReason":null},{"name":"INPUT_FIELD_DEFINITION","description":"Indicates the directive is valid on an input object field SDL definition.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"__EnumValue","description":null,"fields":[{"name":"name","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isDeprecated","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"deprecationReason","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Field","description":null,"fields":[{"name":"name","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"args","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__InputValue","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"type","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"isDeprecated","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"deprecationReason","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__InputValue","description":null,"fields":[{"name":"name","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"type","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"defaultValue","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isDeprecated","description":null,"args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"deprecationReason","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Schema","description":"A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations.","fields":[{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"types","description":"A list of all types supported by this server.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"queryType","description":"The type that query operations will be rooted at.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"mutationType","description":"If this server supports mutation, the type that mutation operations will be rooted at.","args":[],"type":{"kind":"OBJECT","name":"__Type","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"directives","description":"'A list of all directives supported by this server.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Directive","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"subscriptionType","description":"'If this server support subscription, the type that subscription operations will be rooted at.","args":[],"type":{"kind":"OBJECT","name":"__Type","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"__Type","description":null,"fields":[{"name":"kind","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"ENUM","name":"__TypeKind","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"name","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"description","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"fields","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Field","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"interfaces","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"possibleTypes","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__Type","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"enumValues","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__EnumValue","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"inputFields","description":null,"args":[{"name":"includeDeprecated","description":null,"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":"false"}],"type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"__InputValue","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"ofType","description":null,"args":[],"type":{"kind":"OBJECT","name":"__Type","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"isOneOf","description":"This field is considered experimental because it has not yet been ratified in the graphql specification","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"specifiedByURL","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"specifiedByUrl","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"This legacy name has been replaced by `specifiedByURL`"}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"ENUM","name":"__TypeKind","description":"An enum describing what kind of type a given __Type is","fields":null,"inputFields":null,"interfaces":null,"enumValues":[{"name":"SCALAR","description":"Indicates this type is a scalar. 'specifiedByURL' is a valid field","isDeprecated":false,"deprecationReason":null},{"name":"OBJECT","description":"Indicates this type is an object. `fields` and `interfaces` are valid fields.","isDeprecated":false,"deprecationReason":null},{"name":"INTERFACE","description":"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.","isDeprecated":false,"deprecationReason":null},{"name":"UNION","description":"Indicates this type is a union. `possibleTypes` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"ENUM","description":"Indicates this type is an enum. `enumValues` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"INPUT_OBJECT","description":"Indicates this type is an input object. `inputFields` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"LIST","description":"Indicates this type is a list. `ofType` is a valid field.","isDeprecated":false,"deprecationReason":null},{"name":"NON_NULL","description":"Indicates this type is a non-null. `ofType` is a valid field.","isDeprecated":false,"deprecationReason":null}],"possibleTypes":null},{"kind":"OBJECT","name":"debugOutput","description":null,"fields":[{"name":"pathCalculationTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"precalculationTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"renderingTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"timedOut","description":null,"args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"totalTime","description":null,"args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"elevationProfileComponent","description":null,"fields":[{"name":"distance","description":"The distance from the start of the step, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevation","description":"The elevation at this distance, in meters.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"fare","description":"This type is only here for backwards-compatibility and this API will never return it anymore.\nPlease use the leg's `fareProducts` instead.","fields":[{"name":"cents","description":"Fare price in cents. **Note:** this value is dependent on the currency used,\nas one cent is not necessarily ¹/₁₀₀ of the basic monerary unit.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"components","description":"Components which this fare is composed of","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"fareComponent","ofType":null}},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"currency","description":"ISO 4217 currency code","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"type","description":null,"args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"fareComponent","description":"This type is only here for backwards-compatibility and this API will never return it anymore.\nPlease use the leg's `fareProducts` instead.","fields":[{"name":"cents","description":"Fare price in cents. **Note:** this value is dependent on the currency used,\nas one cent is not necessarily ¹/₁₀₀ of the basic monerary unit.","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"currency","description":"ISO 4217 currency code","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"fareId","description":"ID of the ticket type. Corresponds to `fareId` in **TicketType**.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":true,"deprecationReason":"No longer supported"},{"name":"routes","description":"List of routes which use this fare component","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Route","ofType":null}},"isDeprecated":true,"deprecationReason":"No longer supported"}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"placeAtDistance","description":null,"fields":[{"name":"distance","description":"Walking distance to the place along streets and paths","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"place","description":null,"args":[],"type":{"kind":"INTERFACE","name":"PlaceInterface","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"placeAtDistanceConnection","description":"A connection to a list of items.","fields":[{"name":"edges","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"placeAtDistanceEdge","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"pageInfo","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"PageInfo","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"placeAtDistanceEdge","description":"An edge in a connection.","fields":[{"name":"cursor","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"node","description":"The item at the end of the edge","args":[],"type":{"kind":"OBJECT","name":"placeAtDistance","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"serviceTimeRange","description":"Time range for which the API has data available","fields":[{"name":"end","description":"Time until which the API has data available. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"start","description":"Time from which the API has data available. Format: Unix timestamp in seconds","args":[],"type":{"kind":"SCALAR","name":"Long","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"step","description":null,"fields":[{"name":"absoluteDirection","description":"The cardinal (compass) direction (e.g. north, northeast) taken when engaging this step.","args":[],"type":{"kind":"ENUM","name":"AbsoluteDirection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"alerts","description":"A list of alerts (e.g. construction, detours) applicable to the step.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"Alert","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"area","description":"This step is on an open area, such as a plaza or train platform,\nand thus the directions should say something like \"cross\".","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"bogusName","description":"The name of this street was generated by the system, so we should only display it once, and\ngenerally just display right/left directions","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"distance","description":"The distance in meters that this step takes.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"elevationProfile","description":"The elevation profile as a list of { distance, elevation } values.","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"elevationProfileComponent","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"exit","description":"When exiting a highway or traffic circle, the exit name/number.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lat","description":"The latitude of the start of the step.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"lon","description":"The longitude of the start of the step.","args":[],"type":{"kind":"SCALAR","name":"Float","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"relativeDirection","description":"The relative direction (e.g. left or right turn) to take when engaging this step.","args":[],"type":{"kind":"ENUM","name":"RelativeDirection","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"stayOn","description":"Indicates whether or not a street changes direction at an intersection.","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"streetName","description":"The name of the street, road, or path taken for this step.","args":[],"type":{"kind":"SCALAR","name":"String","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"walkingBike","description":"Is this step walking with a bike?","args":[],"type":{"kind":"SCALAR","name":"Boolean","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"stopAtDistance","description":null,"fields":[{"name":"distance","description":"Walking distance to the stop along streets and paths","args":[],"type":{"kind":"SCALAR","name":"Int","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"id","description":"Global object ID provided by Relay. This value can be used to refetch this object using **node** query.","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"ID","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"stop","description":null,"args":[],"type":{"kind":"OBJECT","name":"Stop","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[{"kind":"INTERFACE","name":"Node","ofType":null}],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"stopAtDistanceConnection","description":"A connection to a list of items.","fields":[{"name":"edges","description":null,"args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"stopAtDistanceEdge","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"pageInfo","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"PageInfo","ofType":null}},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"stopAtDistanceEdge","description":"An edge in a connection.","fields":[{"name":"cursor","description":null,"args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"node","description":"The item at the end of the edge","args":[],"type":{"kind":"OBJECT","name":"stopAtDistance","ofType":null},"isDeprecated":false,"deprecationReason":null}],"inputFields":null,"interfaces":[],"enumValues":null,"possibleTypes":null}],"directives":[{"name":"include","description":"Directs the executor to include this field or fragment only when the `if` argument is true","locations":["FIELD","FRAGMENT_SPREAD","INLINE_FRAGMENT"],"args":[{"name":"if","description":"Included when true.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"defaultValue":null}]},{"name":"skip","description":"Directs the executor to skip this field or fragment when the `if` argument is true.","locations":["FIELD","FRAGMENT_SPREAD","INLINE_FRAGMENT"],"args":[{"name":"if","description":"Skipped when true.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"Boolean","ofType":null}},"defaultValue":null}]},{"name":"async","description":"Use an asynchronous data fetcher on a separate thread for this field.\n\nThis is useful when adding several queries in the same HTTP request, for example by using a batch: Those\nfields annotated with this directive run in parallel.\n\nThis is only worth it when the execution is long running, i.e. more than ~50 milliseconds, so this doesn't happen by default.","locations":["FIELD_DEFINITION"],"args":[]},{"name":"deprecated","description":"Marks the field, argument, input field or enum value as deprecated","locations":["FIELD_DEFINITION","ARGUMENT_DEFINITION","ENUM_VALUE","INPUT_FIELD_DEFINITION"],"args":[{"name":"reason","description":"The reason for the deprecation","type":{"kind":"SCALAR","name":"String","ofType":null},"defaultValue":"\"No longer supported\""}]},{"name":"oneOf","description":"Exactly one of the fields on an input object must be set and non-null while all others are omitted.","locations":["INPUT_OBJECT"],"args":[]},{"name":"specifiedBy","description":"Exposes a URL that specifies the behaviour of this scalar.","locations":["SCALAR"],"args":[{"name":"url","description":"The URL that specifies the behaviour of this scalar.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}]}]}}} \ No newline at end of file From 6ff36e642763a724a9b3759b5313f2a37fcd1804 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 1 Nov 2024 08:09:30 -0400 Subject: [PATCH 031/119] chore(craco): Update comment for graphql files --- craco.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/craco.config.js b/craco.config.js index f156dcfe1..074f3309e 100644 --- a/craco.config.js +++ b/craco.config.js @@ -67,7 +67,7 @@ module.exports = { } addBeforeLoader(webpackConfig, loaderByName('file-loader'), yamlLoader) - // Support YAML + // Support import of raw GraphQL files const graphqlLoader = { loader: ['raw-loader'], test: /\.graphql$/ From 06004833de2173651312e5314fad2a4ade95b9a3 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 1 Nov 2024 08:10:27 -0400 Subject: [PATCH 032/119] refactor(main): Update comment regarding custom graphql query. --- lib/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main.js b/lib/main.js index 33e36c552..03aeeb322 100644 --- a/lib/main.js +++ b/lib/main.js @@ -43,7 +43,7 @@ const otpConfig = require(YAML_CONFIG) // eslint-disable-next-line no-undef const jsConfig = require(JS_CONFIG).configure(otpConfig) -// Plug the plan query into the config (if available) +// If defined, plug custom plan query into the redux config, so it is available from actions. otpConfig.api.planQuery = jsConfig.planQuery const history = createHashHistory() From 7a61fa937a046c95c045f3017521f0f5a330e29d Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 15 Oct 2024 13:18:09 -0400 Subject: [PATCH 033/119] set correct hover index --- .../map/itinerary-summary-overlay.tsx | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index aec2823fc..0cab9ad6f 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import { Feature, lineString, LineString, Position } from '@turf/helpers' -import { Itinerary, Location } from '@opentripplanner/types' +import { Itinerary, Leg, Location } from '@opentripplanner/types' import { Marker } from 'react-map-gl' import centroid from '@turf/centroid' import distance from '@turf/distance' @@ -103,6 +103,8 @@ function addTrueIndex(array: ItinWithGeometry[]): ItinWithGeometry[] { return array } +const getLegRoute = (leg: Leg) => leg.routeId + type ItinUniquePoint = { itin: ItinWithGeometry uniquePoint: Position @@ -152,14 +154,18 @@ const ItinerarySummaryOverlay = ({ ) if (!itins || !visible) return <> - const mergedItins: ItinWithGeometry[] = addTrueIndex( - doMergeItineraries(itins).mergedItineraries.map(addItinLineString) + const indexedItins: ItinWithGeometry[] = addTrueIndex( + itins.map(addItinLineString) ) + const mergedItins = doMergeItineraries(indexedItins).mergedItineraries - const midPoints = mergedItins.reduce((prev, curItin) => { - prev.push(getUniquePoint(curItin, prev)) - return prev - }, []) + const midPoints = mergedItins.reduce( + (prev: ItinUniquePoint[], curItin: ItinWithGeometry) => { + prev.push(getUniquePoint(curItin, prev)) + return prev + }, + [] + ) // The first point is probably not well placed, so let's run the algorithm again if (midPoints.length > 1) { midPoints[0] = getUniquePoint(mergedItins[0], midPoints) @@ -186,18 +192,8 @@ const ItinerarySummaryOverlay = ({ onClick={() => { setActive({ index: mp.itin.index }) }} - // TODO: useCallback here (getting weird errors?) - onMouseEnter={() => { - setSharedTimeout( - setTimeout(() => { - setVisible({ index: mp.itin.index }) - }, 150) - ) - }} - onMouseLeave={() => { - sharedTimeout && clearTimeout(sharedTimeout) - setVisible({ index: null }) - }} + // TODO: restore setting visible itinerary on hover without + // causing endless re-render? > Date: Tue, 15 Oct 2024 14:31:48 -0400 Subject: [PATCH 034/119] remove dead code --- lib/components/map/itinerary-summary-overlay.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index 0cab9ad6f..8df12478e 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -103,8 +103,6 @@ function addTrueIndex(array: ItinWithGeometry[]): ItinWithGeometry[] { return array } -const getLegRoute = (leg: Leg) => leg.routeId - type ItinUniquePoint = { itin: ItinWithGeometry uniquePoint: Position From 4ff3481991ddd803ea926d8aabd8ad6a11fdbe38 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 15 Oct 2024 14:32:15 -0400 Subject: [PATCH 035/119] clean up --- lib/components/map/itinerary-summary-overlay.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index 8df12478e..d28307b80 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import { Feature, lineString, LineString, Position } from '@turf/helpers' -import { Itinerary, Leg, Location } from '@opentripplanner/types' +import { Itinerary, Location } from '@opentripplanner/types' import { Marker } from 'react-map-gl' import centroid from '@turf/centroid' import distance from '@turf/distance' From e44e0253f53c41816f9a9cf8febcba067801f3d0 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 1 Nov 2024 11:07:51 -0400 Subject: [PATCH 036/119] add missing typescript --- lib/components/map/itinerary-summary-overlay.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index d28307b80..d66e50d45 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -173,7 +173,10 @@ const ItinerarySummaryOverlay = ({ return ( <> {midPoints.map( - (mp) => + (mp: { + itin: Itinerary & { index: number } + uniquePoint: [number, number] + }) => // If no itinerary is hovered, show all of them. If one is selected, show only that one // TODO: clean up conditionals, move these to a more appropriate place without breaking indexing (isDefined(visibleItinerary) From 7ca25695b24d7c9b6e31831b99cb96bd5ffa67d4 Mon Sep 17 00:00:00 2001 From: Daniel Heppner Date: Mon, 4 Nov 2024 12:57:11 -0800 Subject: [PATCH 037/119] clean up miles's bad code --- lib/components/map/itinerary-summary-overlay.tsx | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index d66e50d45..5f47f527d 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -5,7 +5,7 @@ import { Marker } from 'react-map-gl' import centroid from '@turf/centroid' import distance from '@turf/distance' import polyline from '@mapbox/polyline' -import React, { useContext, useState } from 'react' +import React, { useContext } from 'react' import styled from 'styled-components' import * as narriativeActions from '../../actions/narrative' @@ -147,17 +147,14 @@ const ItinerarySummaryOverlay = ({ // @ts-expect-error React context is populated dynamically const { LegIcon } = useContext(ComponentContext) - const [sharedTimeout, setSharedTimeout] = useState( - null - ) - if (!itins || !visible) return <> const indexedItins: ItinWithGeometry[] = addTrueIndex( itins.map(addItinLineString) ) - const mergedItins = doMergeItineraries(indexedItins).mergedItineraries + const mergedItins: ItinWithGeometry[] = + doMergeItineraries(indexedItins).mergedItineraries - const midPoints = mergedItins.reduce( + const midPoints = mergedItins.reduce( (prev: ItinUniquePoint[], curItin: ItinWithGeometry) => { prev.push(getUniquePoint(curItin, prev)) return prev @@ -173,10 +170,7 @@ const ItinerarySummaryOverlay = ({ return ( <> {midPoints.map( - (mp: { - itin: Itinerary & { index: number } - uniquePoint: [number, number] - }) => + (mp) => // If no itinerary is hovered, show all of them. If one is selected, show only that one // TODO: clean up conditionals, move these to a more appropriate place without breaking indexing (isDefined(visibleItinerary) From 16aef0e4299a143c3a2603fdeacf3d66887c73ee Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 9 Oct 2024 12:19:25 -0400 Subject: [PATCH 038/119] respect mode text color --- lib/actions/apiV2.js | 11 +++++++++++ lib/util/viewer.js | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 71dc3accc..8ca8958a9 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -27,6 +27,7 @@ import { getCurrentServiceWeek } from '../util/current-service-week' import { getRouteColorBasedOnSettings, getRouteIdForPattern, + getRouteTextColorBasedOnSettings, routeIsValid } from '../util/viewer' import { isLastStop } from '../util/stop-times' @@ -1165,6 +1166,16 @@ export function routingQuery(searchId = null, updateSearchInReducer) { config.transitOperators ), { color: leg?.route?.color, mode: leg.mode } + ).split('#')?.[1], + textColor: getRouteTextColorBasedOnSettings( + getRouteOperator( + { + agencyId: leg?.agency?.id, + id: leg?.route?.id + }, + config.transitOperators + ), + { color: leg?.route?.color, mode: leg.mode } ).split('#')?.[1] } } diff --git a/lib/util/viewer.js b/lib/util/viewer.js index e5bcd85a2..c3d026486 100644 --- a/lib/util/viewer.js +++ b/lib/util/viewer.js @@ -355,6 +355,10 @@ export function getRouteColorBasedOnSettings(operator = {}, route = {}) { return backgroundColor } } +export function getRouteTextColorBasedOnSettings(operator = {}, route = {}) { + const { color } = getColorAndNameFromRoute(operator, route) + return color +} /** * Helper method to determine if a stop being viewed is a flex stop. This is not marked by From 715bf08ebd53a327a3293cc939b9ca57d24da1ce Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 1 Nov 2024 10:59:36 -0400 Subject: [PATCH 039/119] address pr feedback --- lib/actions/apiV2.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 8ca8958a9..91d552251 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -1152,30 +1152,30 @@ export function routingQuery(searchId = null, updateSearchInReducer) { ...itin, legs: itin.legs ?.map((leg) => { + const routeOperator = getRouteOperator( + { + agencyId: leg?.agency?.id, + id: leg?.route?.id + }, + config.transitOperators + ) + const routeProperties = { + color: leg?.route?.color, + mode: leg.mode + } + return { ...leg, origColor: leg?.route?.color, route: { ...leg.route, color: getRouteColorBasedOnSettings( - getRouteOperator( - { - agencyId: leg?.agency?.id, - id: leg?.route?.id - }, - config.transitOperators - ), - { color: leg?.route?.color, mode: leg.mode } + routeOperator, + routeProperties ).split('#')?.[1], textColor: getRouteTextColorBasedOnSettings( - getRouteOperator( - { - agencyId: leg?.agency?.id, - id: leg?.route?.id - }, - config.transitOperators - ), - { color: leg?.route?.color, mode: leg.mode } + routeOperator, + routeProperties ).split('#')?.[1] } } From 440d9749e9e8a49f740b94a4e83015453c4622e6 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:50:13 -0500 Subject: [PATCH 040/119] chore(i18n): Add FR translations --- i18n/fr.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/i18n/fr.yml b/i18n/fr.yml index 20afa65fb..a471a4295 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -232,6 +232,20 @@ components: advancedOptions: Options avancées groupSize: "Taille du groupe :" intermediateDestination: Entrez la destination intermédiaire + CompanionsPane: + addNewCompanion: Ajouter un accompagnateur + companionAlreadyAdded: Vous avez déjà un accompagnateur utilisant {email}. + companionExplanation: > + Invitez un utilisateur G-MAP existant à être votre accompagnateur en + entrant leur adresse email. Leur statut passera à "vérifié" dès leur + acceptation, et vous pourrez alors partager vos trajets et planifier des + trajets qui conviennent à leur profil de mobilité. + confirmDeleteCompanion: Voulez-vous supprimer l'accompagnateur {email} ? + currentCompanionsLabel: "Mes accompagnateurs :" + deleteCompanion: Supprimer {email} + noCompanions: Vous n'avez aucun accompagnateur. + submitNewCompanion: Envoyer l'invitation + title: Accompagnateurs DateTimeOptions: arriveBy: Arriver à departAt: Partir à @@ -534,6 +548,7 @@ components: deleteSavedTrip: Supprimer ce trajet editSavedTrip: Modifier un trajet enregistré saveNewTrip: Enregistrer un nouveau trajet + travelCompanion: Accompagnateurs tripInformation: Informations sur le trajet tripNotFound: Trajet introuvable tripNotFoundDescription: Le trajet recherché est introuvable. From 0e71d55306417f36c213886f96aad888251e8f84 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:24:49 -0600 Subject: [PATCH 041/119] refactor: use plural travelCompanions --- i18n/en-US.yml | 2 +- i18n/fr.yml | 2 +- lib/components/user/monitored-trip/saved-trip-editor.tsx | 4 ++-- lib/components/user/monitored-trip/saved-trip-screen.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index c21dcd4f4..a5cf3dbac 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -532,7 +532,7 @@ components: deleteSavedTrip: Delete saved trip editSavedTrip: Edit saved trip saveNewTrip: Save new trip - travelCompanion: Travel companions + travelCompanions: Travel companions tripInformation: Trip information tripNotFound: Trip not found tripNotFoundDescription: Sorry, the requested trip was not found. diff --git a/i18n/fr.yml b/i18n/fr.yml index a471a4295..a8283e9f1 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -548,7 +548,7 @@ components: deleteSavedTrip: Supprimer ce trajet editSavedTrip: Modifier un trajet enregistré saveNewTrip: Enregistrer un nouveau trajet - travelCompanion: Accompagnateurs + travelCompanions: Accompagnateurs tripInformation: Informations sur le trajet tripNotFound: Trajet introuvable tripNotFoundDescription: Le trajet recherché est introuvable. diff --git a/lib/components/user/monitored-trip/saved-trip-editor.tsx b/lib/components/user/monitored-trip/saved-trip-editor.tsx index d086103c3..cbca0a9dd 100644 --- a/lib/components/user/monitored-trip/saved-trip-editor.tsx +++ b/lib/components/user/monitored-trip/saved-trip-editor.tsx @@ -53,10 +53,10 @@ const SavedTripEditor = (props: Props): JSX.Element => { if (props.hasMobilityProfile) { paneSequence.push({ collapsible: true, - pane: panes.travelCompanion, + pane: panes.travelCompanions, props, title: ( - + ) }) } diff --git a/lib/components/user/monitored-trip/saved-trip-screen.js b/lib/components/user/monitored-trip/saved-trip-screen.js index ccb3d15f2..5e66539ab 100644 --- a/lib/components/user/monitored-trip/saved-trip-screen.js +++ b/lib/components/user/monitored-trip/saved-trip-screen.js @@ -122,7 +122,7 @@ class SavedTripScreen extends Component { basics: TripBasicsPane, notifications: TripNotificationsPane, summary: TripSummaryPane, - travelCompanion: CompanionsPane + travelCompanions: CompanionsPane } componentDidMount() { From 3b09e8ac84f0c966e63e0a00cb94c29ed8d94f1f Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:25:43 -0600 Subject: [PATCH 042/119] fix(en-us): fix spelling --- i18n/en-US.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index a5cf3dbac..92e46fb8c 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -223,7 +223,7 @@ components: addNewCompanion: Add a new travel companion companionAlreadyAdded: You already have a companion with email {email} companionExplanation: > - Invite an exiting GMAP user to be a travel companion by entering their + Invite an exiting G-MAP user to be a travel companion by entering their email. When they accept, their status will change to "verified", and you can share your trip status and plan trips based on one another's mobility profile. From 1bc082da022294ea4f6710e942cfe7c94b5601e2 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:31:23 -0600 Subject: [PATCH 043/119] refactor(status-badge): use implicit return syntax --- lib/components/util/status-badge.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/components/util/status-badge.tsx b/lib/components/util/status-badge.tsx index 71de7930d..b6004d639 100644 --- a/lib/components/util/status-badge.tsx +++ b/lib/components/util/status-badge.tsx @@ -39,15 +39,13 @@ function getStatusLabel(status?: string) { } /** Renders a badge to convey status such as 'verified', 'pending'. */ -const StatusBadge = ({ status }: Props): JSX.Element => { - return ( - <> - {/* Surround badge with invisible parentheses for no-CSS and screen readers */} - ( - {getStatusLabel(status)} - ) - - ) -} +const StatusBadge = ({ status }: Props): JSX.Element => ( + <> + {/* Surround badge with invisible parentheses for no-CSS and screen readers */} + ( + {getStatusLabel(status)} + ) + +) export default StatusBadge From 23791f95a5eb269f4c533f3715940647cc0fb76a Mon Sep 17 00:00:00 2001 From: Daniel Heppner Date: Mon, 28 Oct 2024 15:29:58 -0700 Subject: [PATCH 044/119] fix: don't zoom when clicking itinerary --- lib/components/app/responsive-webapp.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/components/app/responsive-webapp.js b/lib/components/app/responsive-webapp.js index 537e13bc3..2b2a44dfc 100644 --- a/lib/components/app/responsive-webapp.js +++ b/lib/components/app/responsive-webapp.js @@ -58,6 +58,7 @@ class ResponsiveWebapp extends Component { /* eslint-disable-next-line complexity */ componentDidUpdate(prevProps) { const { + activeItinerary, activeSearchId, autoFly, currentPosition, @@ -101,7 +102,11 @@ class ResponsiveWebapp extends Component { setLocationToCurrent({ locationType: 'from' }, intl) setMapCenter(map, pt) } - } else if (mainPanelContent === null && autoFly !== false) { + } else if ( + mainPanelContent === null && + autoFly !== false && + activeItinerary === null + ) { if (query.from && query.to) { map?.fitBounds([query.from, query.to], { duration: 600, From ddcd70ebc2fcb9681e26b333cb20f435f775d31f Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 10 Oct 2024 17:12:01 +0200 Subject: [PATCH 045/119] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/ --- i18n/ru.yml | 71 ++++++++++++++++++++++++++++++++--------------------- i18n/vi.yml | 55 +++++++++++++++++++++++++---------------- 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/i18n/ru.yml b/i18n/ru.yml index b7a2eedd4..5130b920a 100644 --- a/i18n/ru.yml +++ b/i18n/ru.yml @@ -18,7 +18,8 @@ actions: itineraryCapacityError: >- Невозможно сохранить план. Этот план невозможно сохранить из-за нехватки мест в одном или нескольких транспортных средствах. Измените план поездки. - maxTripRequestsExceeded: Превышено количество запросов на поездку без действительных результатов + maxTripRequestsExceeded: Превышено количество запросов на поездку без действительных + результатов saveItinerariesError: "Не удалось сохранить маршруты: {err}" setDateError: "Ошибка введения данных:" location: @@ -37,9 +38,11 @@ actions: authTokenError: Ошибка получения токена на авторизацию. confirmDeleteMonitoredTrip: Удалить эту поездку? confirmDeletePlace: Удалить это место? - emailVerificationResent: Сообщение с подтверждением адреса электронной почты отправлено повторно. + emailVerificationResent: Сообщение с подтверждением адреса электронной почты отправлено + повторно. genericError: "Произошла ошибка: {err}" - itineraryExistenceCheckFailed: При проверке возможности выбранной поездки произошла ошибка. + itineraryExistenceCheckFailed: При проверке возможности выбранной поездки произошла + ошибка. mustAcceptTermsToSavePlace: >- Примите «Условия использования» (в разделе «Моя учетная запись»), чтобы сохранять местоположения. @@ -99,15 +102,11 @@ common: submitting: Отправка… "yes": Да itineraryDescriptions: - calories: "{calories, number} кал" fareUnknown: Информации о стоимости поездки нет. noItineraryToDisplay: Нет маршрута для отображения. relativeCo2: > {co2} {isMore, select, true {больше } other {меньше} } CO₂, чем при вождении в одиночку - transfers: >- - {transfers, plural, =0 {} one {# пересадка} other {несколько пересадок - (#)}} linkOpensNewWindow: (Открывает новое окно) modes: bicycle_rent: Прокат велосипедов @@ -146,7 +145,6 @@ common: enterStartLocation: Введите место отправления или {mapAction} на карте… tap: коснитесь его time: - departureArrivalTimes: "{startTime, time, short}\_— {endTime, time, short}" duration: aFewSeconds: несколько секунд nDays: "{days} дн." @@ -256,7 +254,6 @@ components: ariaLabel: Навигационная форма ItinerarySummary: itineraryDetails: Сведения о маршруте - minMaxFare: "{minTotalFare}\_— {maxTotalFare}" LocationSearch: enterLocation: Ввести местоположение setDestination: Выбрать место назначения @@ -285,7 +282,8 @@ components: header: Задать параметры поиска NarrativeItinerariesHeader: changeSortDir: Изменить направление сортировки - howToFindResults: Чтобы просмотреть результаты, см. заголовок «Найденные маршруты» ниже. + howToFindResults: Чтобы просмотреть результаты, см. заголовок «Найденные маршруты» + ниже. itinerariesFound: |- {itineraryNum, plural, one {найден # маршрут} @@ -388,7 +386,7 @@ components: TO: Mесто назначения PhoneNumberEditor: changeNumber: Изменить номер - invalidCode: "Введите проверочный код из 6\_цифр." + invalidCode: "Введите проверочный код из 6 цифр." invalidPhone: Введите действительный номер телефона. pending: Ожидание phoneNumberSubmitted: Номер телефона{phoneNumber} был успешно отправлен. @@ -402,7 +400,9 @@ components: подтверждением и мониторингом поездки. Вашим оператором мобильной связи могут взиматься дополнительные пени. verificationCode: "Код подтверждения:" - verificationInstructions: "Откройте приложение для обмена SMS на телефоне и найдите текстовое сообщение с кодом подтверждения. Затем введите код ниже (срок действия кода: 10\_минут).\n" + verificationInstructions: "Откройте приложение для обмена SMS на телефоне и найдите + текстовое сообщение с кодом подтверждения. Затем введите код ниже (срок действия + кода: 10 минут).\n" verified: Подтверждено verify: Подтвердить Place: @@ -498,7 +498,8 @@ components: tooManyTrips: > Можно сохранить не более пяти поездок. Удалите неиспользуемые поездки из раздела сохраненных и попробуйте еще раз. - tripNameAlreadyUsed: У вас уже сохранена поездка с таким именем. Укажите другое имя. + tripNameAlreadyUsed: У вас уже сохранена поездка с таким именем. Укажите другое + имя. tripNameRequired: Укажите имя поездки. SequentialPaneDisplay: stepNumber: Шаг {шаг} из {общее кол-во} @@ -553,9 +554,13 @@ components: defaultContent: Переключить switchLocations: Переключить местоположения TermsOfUsePane: - confirmDeletionPrompt: "Недавние поисковые запросы и\_(или) места сохранены. Отключение сохранения недавних мест и\_(или) поисковых запросов приведет к удалению этих элементов. Продолжить?\n" + confirmDeletionPrompt: "Недавние поисковые запросы и (или) места сохранены. Отключение + сохранения недавних мест и (или) поисковых запросов приведет к удалению этих + элементов. Продолжить?\n" mustAgreeToTerms: Для продолжения примите условия использования. - termsOfServiceStatement: "Я подтверждаю, что мне исполнилось 18\_лет и что я прочитал и принимаю Условия использования планировщика поездок.\n" + termsOfServiceStatement: "Я подтверждаю, что мне исполнилось 18 лет и что я прочитал + и принимаю Условия использования планировщика + поездок.\n" termsOfStorageStatement: > Необязательно: я даю согласие на то, чтобы планировщик поездок хранил архивные данные о моих запланированных поездках с целью улучшения услуг @@ -573,8 +578,10 @@ components: tripIsAvailableOnDaysIndicated: Поездка доступна для указанных выше дней. tripNamePrompt: "Укажите имя поездки:" tripNotAvailableOnDay: "Поездка недоступна для следующих дней: {repeatedDay}" - unsavedChangesExistingTrip: Вы не сохранили поездку. Если вы выйдете, все изменения будут утеряны. - unsavedChangesNewTrip: Вы не сохранили новую поездку. Если вы выйдете, она будет удалена. + unsavedChangesExistingTrip: Вы не сохранили поездку. Если вы выйдете, все изменения + будут утеряны. + unsavedChangesNewTrip: Вы не сохранили новую поездку. Если вы выйдете, она будет + удалена. TripNotificationsPane: advancedSettings: Расширенные настройки altRouteRecommended: Рекомендуется использовать пересадку или альтернативный маршрут @@ -585,7 +592,7 @@ components: monitorThisTrip: "Мониторинг данной поездки до ее начала:" notificationsTurnedOff: Уведомления отключены в настройках вашей учетной записи. notifyViaChannelWhen: "Использовать канал «{channel}» для уведомлений, когда:" - oneHour: "1\_ч" + oneHour: "1 ч" realtimeAlertFlagged: Для моего пути есть предупреждение в режиме реального времени timeBefore: "{time} до" TripStatus: @@ -644,14 +651,16 @@ components: реальном времени запустится в {monitoringStart, time, short}.) tripStartIsDelayed: Начало поездки откладывается на {duration}! tripStartIsEarly: Начало поездки произойдет на {duration} раньше ожидаемого! - tripStartsSoonNoUpdates: Поездка скоро начнется (обновления в реальном времени недоступны). + tripStartsSoonNoUpdates: Поездка скоро начнется (обновления в реальном времени + недоступны). tripStartsSoonOnTime: Поездка скоро начнется. Без задержек. TripSummary: arriveAt: "Прибытие в " leaveAt: "Оставить " TripSummaryPane: happensOnDays: "Проходит в такие дни: {days}" - notifications: за {leadTimeInMinutes} мин до запланированного времени отправления + notifications: за {leadTimeInMinutes} мин до запланированного времени + отправления notificationsDisabled: "Уведомления: отключены" TripTools: copyLink: Скопировать ссылку @@ -691,17 +700,23 @@ components: storeTripHistory: Сохранять историю поездок updating: Обновляется UserSettings: - confirmDeletion: "Недавние поисковые запросы и\_(или) места сохранены. Отключение сохранения недавних мест и\_(или) поисковых запросов приведет к удалению этих элементов. Продолжить?" + confirmDeletion: "Недавние поисковые запросы и (или) места сохранены. Отключение + сохранения недавних мест и (или) поисковых запросов приведет к удалению этих + элементов. Продолжить?" favoriteStops: Избранные остановки myPreferences: Мои параметры mySavedPlaces: Мои сохраненные места (изменить) noFavoriteStops: Избранные остановки recentPlaces: Недавние места - recentSearchSummary: "Режим «{mode}». {from}\_— {to}" + recentSearchSummary: "Режим «{mode}». {from} — {to}" recentSearches: Недавние поисковые запросы - rememberSearches: "Сохранить недавние места\_/ поисковые запросы?" + rememberSearches: "Сохранить недавние места / поисковые запросы?" stopId: "Идентификатор остановки: {stopId}" - storageDisclaimer: "Все сохраненные параметры, места и настройки будут храниться в локальном хранилище браузера. TriMet не получит доступ к данным о вашем доме, месте работы или другим местоположениям. В любой момент вы можете отключить сохранение недавних мест\_/ поисковых запросов и очистить список местоположений дома/работы, а также избранных остановок.\n" + storageDisclaimer: "Все сохраненные параметры, места и настройки будут храниться + в локальном хранилище браузера. TriMet не получит доступ к данным о вашем доме, + месте работы или другим местоположениям. В любой момент вы можете отключить + сохранение недавних мест / поисковых запросов и очистить список местоположений + дома/работы, а также избранных остановок.\n" UserTripSettings: forgetOptions: Удалить варианты rememberOptions: Сохранить варианты поездки @@ -723,12 +738,12 @@ components: prompt: Куда вы хотите отправиться? config: accessModes: - bicycle: "Общественный транспорт\_+\_личный велосипед" - bicycle_rent: "Общественный транспорт\_+\_прокат велосипеда" + bicycle: "Общественный транспорт + личный велосипед" + bicycle_rent: "Общественный транспорт + прокат велосипеда" car_hail: Заказная поездка car_park: Парковочное место - micromobility: "Общественный транспорт\_+\_личный самокат" - micromobility_rent: "Общественный транспорт\_+\_прокат электросамоката" + micromobility: "Общественный транспорт + личный самокат" + micromobility_rent: "Общественный транспорт + прокат электросамоката" bicycleModes: bicycle: Личный велосипед bicycle_rent: Прокат велосипедов diff --git a/i18n/vi.yml b/i18n/vi.yml index 719ee0898..dd44b335f 100644 --- a/i18n/vi.yml +++ b/i18n/vi.yml @@ -5,7 +5,8 @@ actions: callQuerySaveError: "Lỗi khi lưu trữ các truy vấn cuộc gọi: {err}" callSaveError: "Không thể lưu cuộc gọi: {err}" checkSessionError: "Lỗi khi thiết lập phiên ủy quyền: {err}" - couldNotFindCallError: Không thể tìm thấy cuộc gọi. Đang hủy yêu cầu lưu truy vấn. + couldNotFindCallError: Không thể tìm thấy cuộc gọi. Đang hủy yêu cầu lưu truy + vấn. fetchCallsError: "Lỗi khi tìm nạp cuộc gọi: {err}" queryFetchError: "Lỗi khi tìm nạp các truy vấn: {err}" fieldTrip: @@ -28,7 +29,8 @@ actions: Không thể lưu kế hoạch chuyến đi: Không thể lưu kế hoạch chuyến đi này do thiếu sức chứa trên một hoặc nhiều xe. Vui lòng lên kế hoạch lại chuyến đi của bạn. - maxTripRequestsExceeded: Đã vượt quá số lượng yêu cầu chuyến đi mà không có kết quả hợp lệ + maxTripRequestsExceeded: Đã vượt quá số lượng yêu cầu chuyến đi mà không có kết + quả hợp lệ saveItinerariesError: "Không lưu được hành trình: {err}" setDateError: "Lỗi khi cài đặt ngày:" setGroupSizeError: "Lỗi khi cài đặt kích thước nhóm:" @@ -40,7 +42,8 @@ actions: Để sử dụng địa điểm hiện tại của mình, quý vị hãy cho phép sử dụng vị trí trong trình duyệt và tải lại trang này. - geolocationNotSupportedError: Định vị địa lý không được hỗ trợ bởi trình duyệt của bạn + geolocationNotSupportedError: Định vị địa lý không được hỗ trợ bởi trình duyệt + của bạn unknownPositionError: Lỗi không xác định khi tìm vị trí userDeniedPermission: Người dùng từ chối cấp quyền map: @@ -52,7 +55,8 @@ actions: confirmDeletePlace: Bạn có muốn loại bỏ nơi này không? emailVerificationResent: Thông báo xác minh email đã được gửi lại. genericError: "Phát sinh lỗi: {err}" - itineraryExistenceCheckFailed: Lỗi kiểm tra xem chuyến đi được chọn của bạn là có thể. + itineraryExistenceCheckFailed: Lỗi kiểm tra xem chuyến đi được chọn của bạn là + có thể. mustAcceptTermsToSavePlace: >- Vui lòng chấp nhận Điều Khoản Sử Dụng (trong phần Tài Khoản Của Tôi) để lưu lại địa điểm. @@ -112,12 +116,10 @@ common: submitting: Đang gửi… "yes": Đúng itineraryDescriptions: - calories: "{calories, number} calo" fareUnknown: Không có thông tin giá vé noItineraryToDisplay: Không có hành trình để hiển thị. relativeCo2: | {co2} CO₂ {isMore, select, true {nhiều} other {ít} } hơn so với xe hơi - transfers: "{transfers, plural, =0 {} other {# chuyển}}" linkOpensNewWindow: (Mở khoảng thời gian mới) modes: bicycle_rent: Chia sẻ xe đạp @@ -156,7 +158,6 @@ common: enterStartLocation: Nhập vị trí bắt đầu hoặc {mapAction} vào bản đồ… tap: chạm time: - departureArrivalTimes: "{startTime, time, short}—{endTime, time, short}" duration: aFewSeconds: vài giây nDays: "{days} ngày" @@ -168,12 +169,14 @@ common: {} other {# giây}} components: A11yPrefs: - accessibilityRoutingByDefault: Thích những chuyến đi có thể truy cập theo mặc định + accessibilityRoutingByDefault: Thích những chuyến đi có thể truy cập theo mặc + định AccountSetupFinishPane: message: Bạn đã sẵn sàng để bắt đầu lên kế hoạch cho các chuyến đi của bạn. AddPlaceButton: addPlace: Thêm địa điểm - needOriginDestination: Xác định nguồn gốc hoặc đích đến để thêm các địa điểm trung gian + needOriginDestination: Xác định nguồn gốc hoặc đích đến để thêm các địa điểm trung + gian tooManyPlaces: Địa điểm trung gian tối đa đạt được AdvancedOptions: bannedRoutes: Chọn các tuyến đường bị cấm… @@ -259,14 +262,14 @@ components: editPlaceGeneric: Chỉnh sửa vị trí invalidAddress: Vui lòng cài đặt một vị trí cho nơi này. invalidName: Vui lòng nhập tên cho nơi này. - nameAlreadyUsed: Bạn đã sử dụng tên này cho một nơi khác. Vui lòng nhập một tên khác. + nameAlreadyUsed: Bạn đã sử dụng tên này cho một nơi khác. Vui lòng nhập một tên + khác. placeNotFound: Không tìm thấy địa điểm placeNotFoundDescription: Xin lỗi, địa điểm được yêu cầu không được tìm thấy. FormNavigationButtons: ariaLabel: Điều hướng hình thức ItinerarySummary: itineraryDetails: Chi tiết hành trình - minMaxFare: "{minTotalFare} - {maxTotalFare}" LocationSearch: enterLocation: Nhập vị trí setDestination: Chọn điểm đến @@ -335,8 +338,10 @@ components: description: Nội dung bạn yêu cầu không có sẵn. header: Không tìm thấy nội dung NotificationPrefsPane: - devicesRegistered: "{count, plural, one {# device} other {# devices}} đã đăng ký" - noDeviceForPush: Đăng ký thiết bị của quý vị bằng ứng dụng di động để nhận thông báo đẩy. + devicesRegistered: "{count, plural, one {# device} other {# devices}} đã đăng + ký" + noDeviceForPush: Đăng ký thiết bị của quý vị bằng ứng dụng di động để nhận thông + báo đẩy. notificationChannelPrompt: "Nhận thông báo về các chuyến đi đã lưu bằng:" OTP2ErrorRenderer: LOCATION_NOT_FOUND: @@ -577,16 +582,21 @@ components: travelingAt: di chuyển với tốc độ {milesPerHour} vehicleName: Phương tiện giao thông {vehicleNumber} TripBasicsPane: - checkingItineraryExistence: Kiểm tra sự tồn tại của hành trình cho mỗi ngày trong tuần… + checkingItineraryExistence: Kiểm tra sự tồn tại của hành trình cho mỗi ngày trong + tuần… tripDaysPrompt: Bạn thực hiện chuyến đi này vào những ngày nào? - tripIsAvailableOnDaysIndicated: Chuyến đi của bạn có sẵn vào những ngày trong tuần như đã nêu ở trên. + tripIsAvailableOnDaysIndicated: Chuyến đi của bạn có sẵn vào những ngày trong + tuần như đã nêu ở trên. tripNamePrompt: "Vui lòng cung cấp tên cho chuyến đi này:" tripNotAvailableOnDay: Chuyến đi không có sẵn vào {repeatedDay} - unsavedChangesExistingTrip: Bạn chưa lưu chuyến đi của mình. Nếu bạn rời đi, những thay đổi sẽ bị mất. - unsavedChangesNewTrip: Bạn chưa lưu chuyến đi mới của mình. Nếu bạn rời đi, nó sẽ bị mất. + unsavedChangesExistingTrip: Bạn chưa lưu chuyến đi của mình. Nếu bạn rời đi, những + thay đổi sẽ bị mất. + unsavedChangesNewTrip: Bạn chưa lưu chuyến đi mới của mình. Nếu bạn rời đi, nó + sẽ bị mất. TripNotificationsPane: advancedSettings: Cài đặt nâng cao - altRouteRecommended: Một tuyến đường hoặc điểm trung chuyển thay thế được khuyến nghị + altRouteRecommended: Một tuyến đường hoặc điểm trung chuyển thay thế được khuyến + nghị delaysAboveThreshold: Có sự chậm trễ hoặc gián đoạn của hơn howToReceiveAlerts: > Để nhận thông báo cho các chuyến đi đã lưu của bạn, bật thông báo trong @@ -595,7 +605,8 @@ components: notificationsTurnedOff: Thông báo được tắt cho tài khoản của bạn. notifyViaChannelWhen: "Thông báo cho tôi qua {channel} khi:" oneHour: 1 tiếng - realtimeAlertFlagged: Có một cảnh báo thời gian thực được gắn cờ trên hành trình của tôi + realtimeAlertFlagged: Có một cảnh báo thời gian thực được gắn cờ trên hành trình + của tôi timeBefore: "{time} trước" TripStatus: alerts: "{alerts, plural, one {# cảnh báo!} other {# cảnh báo!}}" @@ -608,7 +619,8 @@ components: earlyHeading: >- Chuyến đi đang diễn ra và sẽ đến sớm hơn {formattedDuration} so với dự kiến! - noDataHeading: Chuyến đi đang được tiến hành (không có cập nhật thời gian thực có sẵn). + noDataHeading: Chuyến đi đang được tiến hành (không có cập nhật thời gian thực + có sẵn). onTimeHeading: Chuyến đi đang được tiến hành và đúng giờ. base: lastCheckedDefaultText: Thời gian được kiểm tra lần cuối không xác định @@ -651,7 +663,8 @@ components: tripStartIsEarly: >- Thời gian bắt đầu chuyến đi đang diễn ra sớm hơn {duration} so với dự kiến! - tripStartsSoonNoUpdates: Chuyến đi đang bắt đầu sớm (không có cập nhật về thời gian thực). + tripStartsSoonNoUpdates: Chuyến đi đang bắt đầu sớm (không có cập nhật về thời + gian thực). tripStartsSoonOnTime: Chuyến đi đang bắt đầu sớm và sắp đúng giờ. TripSummary: arriveAt: "Đến nơi " From deaa9a5d52061310568ecdb4512d002f9e395e6b Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 10 Oct 2024 15:43:18 +0000 Subject: [PATCH 046/119] Translated using Weblate (Spanish) Currently translated at 100.0% (553 of 553 strings) Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/es/ --- i18n/es.yml | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/i18n/es.yml b/i18n/es.yml index 2a25daa1a..6675da344 100644 --- a/i18n/es.yml +++ b/i18n/es.yml @@ -30,7 +30,8 @@ actions: No se puede guardar el plan: este plan no se pudo guardar debido a la falta de capacidad en uno o más vehículos. Por favor, vuelva a planificar su viaje. - maxTripRequestsExceeded: Número de solicitudes de viaje superadas sin resultados válidos + maxTripRequestsExceeded: Número de solicitudes de viaje superadas sin resultados + válidos saveItinerariesError: "No se pudieron guardar los itinerarios: {err}" setDateError: "Error al establecer la fecha:" setGroupSizeError: "No se pudo establecer el tamaño del grupo:" @@ -52,10 +53,13 @@ actions: authTokenError: Error al obtener un token de autorización. confirmDeleteMonitoredTrip: ¿Desea eliminar este viaje? confirmDeletePlace: ¿Quiere eliminar este lugar? - emailVerificationResent: El mensaje de verificación de correo electrónico ha sido reenviado. + emailVerificationResent: El mensaje de verificación de correo electrónico ha sido + reenviado. genericError: "Se ha encontrado un error: {err}" - itineraryExistenceCheckFailed: Comprobación de errores para ver si el viaje seleccionado es posible. - mustAcceptTermsToSavePlace: Acepte los Términos de uso (en Mi Cuenta) para guardar las ubicaciones. + itineraryExistenceCheckFailed: Comprobación de errores para ver si el viaje seleccionado + es posible. + mustAcceptTermsToSavePlace: Acepte los Términos de uso (en Mi Cuenta) para guardar + las ubicaciones. mustBeLoggedInToSavePlace: Por favor, inicia la sesión para guardar las ubicaciones. placeRemembered: La configuración de este lugar se ha guardado. preferencesSaved: Sus preferencias se han guardado. @@ -112,13 +116,12 @@ common: submitting: Enviando… "yes": Sí itineraryDescriptions: - calories: "{calories, number} kcal" fareUnknown: No hay información de las tarifas noItineraryToDisplay: No hay itinerario que mostrar. relativeCo2: > {co2} de CO₂ en {isMore, select, true {más} other {menos} } que conducir solo - transfers: "{transfers, plural, =0 {} one {# transferencia} other {# transferencias}}" + timeStartEnd: '{start} – {end}' linkOpensNewWindow: (Abre una nueva ventana) modes: bicycle_rent: Compartir bicicleta @@ -157,7 +160,6 @@ common: enterStartLocation: Introduzca la ubicación de inicio o {mapAction} en el mapa… tap: toque time: - departureArrivalTimes: "{startTime, time, short}—{endTime, time, short}" duration: aFewSeconds: unos segundos nDays: "{days, plural, =1 {un día} other {# días}}" @@ -201,6 +203,13 @@ components: BatchSearchScreen: header: Planifique su viaje modeSelectorLabel: Seleccione un modo de desplazamiento + moreOptions: Más opciones + saveAndReturn: Guardar y volver + saved: Guardado + tripOptions: Opciones de ruta + submodeSelectorLabel: Seleccionar modos y submodos de desplazamiento + advancedHeader: Ajustes avanzados + modeOptions: Más opciones BatchSettings: destination: destino invalidModeSelection: >- @@ -208,7 +217,8 @@ components: a incluir el transporte publico en la selección de modos. origin: origen planTripTooltip: Planificar viaje - validationMessage: "Por favor, defina los siguientes campos para planificar un viaje: {issues}" + validationMessage: "Por favor, defina los siguientes campos para planificar un + viaje: {issues}" BeforeSignInScreen: mainTitle: Iniciando sesión message: > @@ -267,7 +277,6 @@ components: ariaLabel: Navegar por los formularios ItinerarySummary: itineraryDetails: Detalles del itinerario - minMaxFare: "{minTotalFare} - {maxTotalFare}" LocationSearch: enterLocation: Introduzca la ubicación setDestination: Establecer el destino @@ -281,6 +290,7 @@ components: shared-vehicles: Vehículos compartidos stops: Paradas de tránsito streets: Calles + stations: Estaciones de transporte MapillaryFrame: title: Imágenes de la calle MetroUI: @@ -292,6 +302,7 @@ components: originallyScheduledTime: (originalmente {originalTime}) singleModeItineraryDescription: Viaja {time} {mode} timeWalking: "{time} caminando" + itinerarySummary: Desde {stopName} | {cost} MobileOptions: header: Configurar las opciones de búsqueda MobilityProfile: @@ -370,6 +381,7 @@ components: nearbyListIntro: Lista de {count} entidades cercanas. nothingNearby: No ubicaciónes cercanas. spacesAvailable: "{spacesAvailable} espacios libres disponibles" + headsign: '{destination}' NewAccountWizard: createNewAccount: Crear una nueva cuenta finish: ¡Configuración de la cuenta completa! @@ -549,6 +561,7 @@ components: Otro viaje guardado ya utiliza este nombre. Por favor, elija un nombre diferente. tripNameRequired: Por favor, introduzca el nombre del viaje. + selectAtLeastOneDay: Por favor, seleccione al menos un día para realizar el seguimiento. SequentialPaneDisplay: stepNumber: Paso {step} de {total} SessionTimeout: @@ -558,7 +571,8 @@ components: header: ¡La sesión está a punto de terminar! keepSession: Continuar sesión SimpleRealtimeAnnotation: - usingRealtimeInfo: Este viaje utiliza información de tráfico y retrasos en tiempo real + usingRealtimeInfo: Este viaje utiliza información de tráfico y retrasos en tiempo + real StackedPaneDisplay: savePreferences: Guardar preferencias StopScheduleTable: @@ -620,15 +634,18 @@ components: travelingAt: Viajando a {milesPerHour} vehicleName: Vehículo {vehicleNumber} TripBasicsPane: - checkingItineraryExistence: Comprobación de la existencia de itinerarios para cada día de la semana… + checkingItineraryExistence: Comprobación de la existencia de itinerarios para + cada día de la semana… tripDaysPrompt: ¿Qué días hace este viaje? - tripIsAvailableOnDaysIndicated: Su viaje está disponible en los días de la semana indicados anteriormente. + tripIsAvailableOnDaysIndicated: Su viaje está disponible en los días de la semana + indicados anteriormente. tripNamePrompt: "Por favor, indique un nombre para este viaje:" tripNotAvailableOnDay: El viaje no está disponible el {repeatedDay} unsavedChangesExistingTrip: >- Todavía no ha guardado su viaje. Si abandona la página, los cambios se perderán. - unsavedChangesNewTrip: Todavía no ha guardado su nuevo viaje. Si abandona la página, se perderá. + unsavedChangesNewTrip: Todavía no ha guardado su nuevo viaje. Si abandona la página, + se perderá. TripNotificationsPane: advancedSettings: Configuración avanzada altRouteRecommended: Se recomienda una ruta alternativa o un punto de transferencia @@ -694,11 +711,15 @@ components: El viaje debe comenzar a las {tripStart, time, short}. (El seguimiento en tiempo real comenzará a las {monitoringStart, time, short}.) tripStartIsDelayed: ¡La hora de inicio del viaje se retrasa {duration}! - tripStartIsEarly: ¡La hora de inicio del viaje se produce {duration} antes de lo previsto! + tripStartIsEarly: ¡La hora de inicio del viaje se produce {duration} antes de + lo previsto! tripStartsSoonNoUpdates: >- El viaje comienza pronto (no hay actualizaciones disponibles en tiempo real). tripStartsSoonOnTime: El viaje comienza pronto y es más o menos puntual. + past: + heading: Viaje realizado + description: Un viaje que ocurrió el pasado. TripSummary: arriveAt: "Llegue a las " leaveAt: "Salida a las " From 3f6d69d72d9592ab5e64598844430696d0ee9c0a Mon Sep 17 00:00:00 2001 From: Binh Dam Date: Thu, 10 Oct 2024 15:14:45 +0000 Subject: [PATCH 047/119] Translated using Weblate (Spanish) Currently translated at 100.0% (553 of 553 strings) Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/es/ --- i18n/es.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/es.yml b/i18n/es.yml index 6675da344..9ba66b675 100644 --- a/i18n/es.yml +++ b/i18n/es.yml @@ -646,6 +646,8 @@ components: perderán. unsavedChangesNewTrip: Todavía no ha guardado su nuevo viaje. Si abandona la página, se perderá. + onlyOnDate: Solo el {date, date, ::eeeee yyyyMMdd} + recurringEachWeek: En ciertos días de cada semana TripNotificationsPane: advancedSettings: Configuración avanzada altRouteRecommended: Se recomienda una ruta alternativa o un punto de transferencia From 13c464f03d6f7747275056c4d7ce9327b5134c25 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 10 Oct 2024 15:44:32 +0000 Subject: [PATCH 048/119] Translated using Weblate (Spanish) Currently translated at 100.0% (553 of 553 strings) Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/es/ --- i18n/es.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es.yml b/i18n/es.yml index 9ba66b675..c8059863b 100644 --- a/i18n/es.yml +++ b/i18n/es.yml @@ -647,7 +647,7 @@ components: unsavedChangesNewTrip: Todavía no ha guardado su nuevo viaje. Si abandona la página, se perderá. onlyOnDate: Solo el {date, date, ::eeeee yyyyMMdd} - recurringEachWeek: En ciertos días de cada semana + recurringEachWeek: Algunos días de la semana TripNotificationsPane: advancedSettings: Configuración avanzada altRouteRecommended: Se recomienda una ruta alternativa o un punto de transferencia From 973aad8fc9de424e5aedcec43271972882ba7272 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 18 Oct 2024 17:33:51 +0000 Subject: [PATCH 049/119] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/ --- i18n/ko.yml | 10 ++++------ i18n/tl.yml | 28 ++++++++++++++++------------ i18n/zh_Hans.yml | 4 ---- i18n/zh_Hant.yml | 4 ---- 4 files changed, 20 insertions(+), 26 deletions(-) diff --git a/i18n/ko.yml b/i18n/ko.yml index e333e7e62..6b2288763 100644 --- a/i18n/ko.yml +++ b/i18n/ko.yml @@ -22,7 +22,8 @@ actions: fetchFieldTripsError: "트립을 가져오는 중에 오류가 발생했습니다: {err}" fetchTripsForDateError: "필트 트립 날짜에 대한 트립을 가져오는 중에 오류가 발생했습니다: {err}" incompatibleTripDateError: 계획한 트립 날짜({tripDate})가 요청한 트립 날짜({requestDate})가 아닙니다 - itineraryCapacityError: "플랜을 저장할 수 없습니다: 하나 이상의 차량의 용량이 부족하여 이 플랜을 저장할 수 없습니다. 트립을 다시 계획하세요." + itineraryCapacityError: "플랜을 저장할 수 없습니다: 하나 이상의 차량의 용량이 부족하여 이 플랜을 저장할 수 없습니다. + 트립을 다시 계획하세요." maxTripRequestsExceeded: 유효한 결과없이 초과된 트립 요청의 개수 saveItinerariesError: "트립을 저장하는 데 실패했습니다: {err}" setDateError: "날짜를 설정하는 중에 오류가 발생했습니다:" @@ -99,12 +100,10 @@ common: submitting: 제출 중… "yes": 예 itineraryDescriptions: - calories: "{calories, number} 칼로리" fareUnknown: 운임 정보 없음 noItineraryToDisplay: 표시할 일정이 없습니다. relativeCo2: | {co2} CO₂ 를 자동차보다 {isMore, select, true {더} other {덜} } 사용합니다 - transfers: "{transfers, plural, =0 {} other {# 전송}}" linkOpensNewWindow: (새 창 열림) modes: bicycle_rent: 공유자전거 @@ -143,7 +142,6 @@ common: enterStartLocation: 시작 위치 또는 {mapAction}을(를) 지도에 입력하십시오… tap: 클릭 time: - departureArrivalTimes: "{startTime, time, short}—{endTime, time, short}" duration: aFewSeconds: 몇 초 nDays: "{days} 일" @@ -244,7 +242,6 @@ components: ariaLabel: 내비게이션 양식 ItinerarySummary: itineraryDetails: 여정 세부 정보 - minMaxFare: "{minTotalFare} - {maxTotalFare}" LocationSearch: enterLocation: 위치 입력 setDestination: 목적지 선택 @@ -685,5 +682,6 @@ util: networkUnavailable: 현재 {network} 네트워크를 사용할 수 없습니다. noTripFound: 트립을 찾을 수 없습니다. noTripFoundForMode: "{modes}의 트립을 찾을 수 없습니다." - noTripFoundReason: 지정된 최대 거리 내 또는 지정된 시간에 대중 교통 서비스가 없거나, 출발지 또는 도착지가 안전하게 접근가능하지 못할 수 있습니다. + noTripFoundReason: 지정된 최대 거리 내 또는 지정된 시간에 대중 교통 서비스가 없거나, 출발지 또는 도착지가 안전하게 접근가능하지 + 못할 수 있습니다. noTripFoundWithReason: "{noTripFound} {reason}" diff --git a/i18n/tl.yml b/i18n/tl.yml index d1e65084a..87e851dce 100644 --- a/i18n/tl.yml +++ b/i18n/tl.yml @@ -45,7 +45,8 @@ actions: confirmDeletePlace: Gusto mo bang alisin ang lugar na ito? emailVerificationResent: Ipinadala ulit ang mensahe ng pag-verify sa email. genericError: "Nagka-error: {err}" - itineraryExistenceCheckFailed: Nagka-error sa pagtingin kung posible ang napili mong biyahe. + itineraryExistenceCheckFailed: Nagka-error sa pagtingin kung posible ang napili + mong biyahe. mustAcceptTermsToSavePlace: >- Pakitanggap ang Mga Tuntunin ng Paggamit (sa ilalim ng Aking Account) para mag-save ng mga lokasyon. @@ -106,13 +107,11 @@ common: submitting: Isinusumite… "yes": Oo itineraryDescriptions: - calories: "{calories, number} Cal" fareUnknown: Walang impormasyon sa pamasahe noItineraryToDisplay: Walang ipapakitang itinerary. relativeCo2: > {co2} {isMore, select, true {mas maraming} other {mas kaunting} } CO₂ kaysa magmaneho nang mag-isa - transfers: "{transfers, plural, =0 {} one {# transfer} other {# transfers}}" linkOpensNewWindow: (Magbubukas sa bagong window) modes: bicycle_rent: Bikeshare @@ -151,7 +150,6 @@ common: enterStartLocation: Ilagay ang lokasyon ng pagsisimula o {mapAction} sa mapa… tap: tap time: - departureArrivalTimes: "{startTime, time, short}—{endTime, time, short}" duration: aFewSeconds: a few seconds nDays: "{days, plural, =1 {one day} other {# days}}" @@ -204,7 +202,8 @@ components: ang pampublikong transportasyon sa pagpili mo ng mode. origin: pinagmulan planTripTooltip: Planuhin ang biyahe - validationMessage: "Ilarawan ang mga sumusunod na field para makapagplano ng biyahe: {issues}" + validationMessage: "Ilarawan ang mga sumusunod na field para makapagplano ng biyahe: + {issues}" BeforeSignInScreen: mainTitle: Sina-sign in ka message: > @@ -263,7 +262,6 @@ components: ariaLabel: Pag-navigate sa form ItinerarySummary: itineraryDetails: Mga detalye ng itinerary - minMaxFare: "{minTotalFare} - {maxTotalFare}" LocationSearch: enterLocation: Ilagay ang lokasyon setDestination: Itakda ang Patutunguhan @@ -397,7 +395,8 @@ components: invalidPhone: Maglagay ng valid na numero ng telepono. pending: Nakabinbin phoneNumberSubmitted: Matagumpay na naisumite ang numero ng teleponong {phoneNumber}. - phoneNumberVerified: Matagumpay na na-verify ang numero ng teleponong {phoneNumber} . + phoneNumberVerified: Matagumpay na na-verify ang numero ng teleponong {phoneNumber} + . placeholder: Ilagay ang numero ng iyong telepono prompt: "Ilagay ang numero ng iyong telepono para sa mga SMS na notification:" requestNewCode: Humiling ng bagong code @@ -583,9 +582,11 @@ components: travelingAt: Bumibiyahe nang {milesPerHour} vehicleName: Sasakyan {vehicleNumber} TripBasicsPane: - checkingItineraryExistence: Tinitingnan kung may itinerary para sa bawat araw ng linggo... + checkingItineraryExistence: Tinitingnan kung may itinerary para sa bawat araw + ng linggo... tripDaysPrompt: Anong mga araw mo ginagawa ang biyaheng ito? - tripIsAvailableOnDaysIndicated: Available ang iyong biyahe sa mga araw ng linggo na nakasaad sa itaas. + tripIsAvailableOnDaysIndicated: Available ang iyong biyahe sa mga araw ng linggo + na nakasaad sa itaas. tripNamePrompt: "Pangalanan ang biyaheng ito:" tripNotAvailableOnDay: Hindi available ang biyahe sa {repeatedDay} unsavedChangesExistingTrip: >- @@ -630,7 +631,8 @@ components: unknownState: Hindi Alam ang Status ng Biyahe untogglePause: Ipagpatuloy inactive: - description: Ipagpatuloy ang pagsubaybay sa biyahe para makita ang updated na status + description: Ipagpatuloy ang pagsubaybay sa biyahe para makita ang updated na + status heading: Naka-pause ang pagsubaybay sa biyahe nextTripNotPossible: description: > @@ -649,7 +651,8 @@ components: description: Hinihintay na makalkula ang biyahe. heading: Hindi pa nakakalkula ang biyahe snoozed: - description: I-unsnooze ang pagsubaybay sa biyahe para makita ang updated na status. + description: I-unsnooze ang pagsubaybay sa biyahe para makita ang updated na + status. heading: Naka-snooze ang pagsubaybay sa biyahe ngayong araw upcoming: nextTripBegins: >- @@ -659,7 +662,8 @@ components: Magsisimula ang biyahe nang {tripStart, time, short}. (Magsisimula ang realtime na pagsubaybay nang {monitoringStart, time, short}.) tripStartIsDelayed: Naantala ang oras ng pagsisimula ng biyahe nang {duration}! - tripStartIsEarly: Nagsisimula na ang biyahe {duration} na mas maaga kaysa sa inaasahan! + tripStartIsEarly: Nagsisimula na ang biyahe {duration} na mas maaga kaysa sa + inaasahan! tripStartsSoonNoUpdates: >- Malapit nang magsimula ang biyahe (walang realtime na update na available). diff --git a/i18n/zh_Hans.yml b/i18n/zh_Hans.yml index 47464fc2c..1458db732 100644 --- a/i18n/zh_Hans.yml +++ b/i18n/zh_Hans.yml @@ -99,12 +99,10 @@ common: submitting: 正在提交… "yes": 是 itineraryDescriptions: - calories: "{calories, number} 大卡" fareUnknown: 无票价信息 noItineraryToDisplay: 没有显示行程. relativeCo2: | {co2} {isMore, select, true {更多} other {更少} } CO₂ 比单独驾车 - transfers: "{transfers, plural, =0 {} other {# 换乘}}" linkOpensNewWindow: (打开新窗口) modes: bicycle_rent: 共享单车 @@ -143,7 +141,6 @@ common: enterStartLocation: 输入出发地点或{mapAction}地图… tap: 点击 time: - departureArrivalTimes: "{startTime, time, short}—{endTime, time, short}" duration: aFewSeconds: 几秒钟 nDays: "{days} 天" @@ -244,7 +241,6 @@ components: ariaLabel: 表格导航 ItinerarySummary: itineraryDetails: 行程详情 - minMaxFare: "{minTotalFare} - {maxTotalFare}" LocationSearch: enterLocation: 输入位置 setDestination: 设置目的地 diff --git a/i18n/zh_Hant.yml b/i18n/zh_Hant.yml index e625d04c7..b94f45d0a 100644 --- a/i18n/zh_Hant.yml +++ b/i18n/zh_Hant.yml @@ -99,12 +99,10 @@ common: submitting: 正在提交… "yes": 是 itineraryDescriptions: - calories: "{calories, number}卡" fareUnknown: 無票價資訊 noItineraryToDisplay: 沒有預定行程可顯示。 relativeCo2: | {co2}比單獨開車排放的CO₂{isMore, select, true {要多} other {少}} - transfers: "{transfers}次轉乘" linkOpensNewWindow: (開啟新視窗) modes: bicycle_rent: 自行車共享 @@ -143,7 +141,6 @@ common: enterStartLocation: 輸入開始位置或{mapAction} 地圖…… tap: 輕觸 time: - departureArrivalTimes: "{startTime, time, short}—{endTime, time, short}" duration: aFewSeconds: 幾秒鐘 nDays: "{days}天" @@ -244,7 +241,6 @@ components: ariaLabel: 表單導航 ItinerarySummary: itineraryDetails: 路線詳細資訊 - minMaxFare: "{minTotalFare} - {maxTotalFare}" LocationSearch: enterLocation: 輸入位置 setDestination: 設定目的地 From aca5acffd21824843d4bcad727a258762c5caa81 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 18 Oct 2024 17:58:09 +0000 Subject: [PATCH 050/119] Translated using Weblate (Spanish) Currently translated at 100.0% (554 of 554 strings) Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/es/ --- i18n/es.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/es.yml b/i18n/es.yml index c8059863b..7d9dbc970 100644 --- a/i18n/es.yml +++ b/i18n/es.yml @@ -816,6 +816,8 @@ components: switcher: Botón de cambio WelcomeScreen: prompt: ¿A donde quiere ir? + TripPreviewLayout: + previewTrip: Vista previa del viaje config: accessModes: bicycle: Tránsito + Bicicleta Personal From f470d95468a48a967e62d82ed32b30a930b3b291 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:55:26 -0600 Subject: [PATCH 051/119] feat(advanced-settings-panel): make api call to get dependent user info --- lib/actions/user.js | 26 +++++++++ .../form/advanced-settings-panel.tsx | 56 +++++++++++++++---- lib/components/user/types.ts | 9 +++ lib/reducers/create-user-reducer.js | 6 ++ 4 files changed, 85 insertions(+), 12 deletions(-) diff --git a/lib/actions/user.js b/lib/actions/user.js index 837d7341e..b6588a198 100644 --- a/lib/actions/user.js +++ b/lib/actions/user.js @@ -41,6 +41,7 @@ const setCurrentUserMonitoredTrips = createAction( const setCurrentUserTripRequests = createAction( 'SET_CURRENT_USER_TRIP_REQUESTS' ) +const setDependentUserInfo = createAction('SET_DEPENDENT_USER_INFO') const setLastPhoneSmsRequest = createAction('SET_LAST_PHONE_SMS_REQUEST') export const setPathBeforeSignIn = createAction('SET_PATH_BEFORE_SIGNIN') export const clearItineraryExistence = createAction('CLEAR_ITINERARY_EXISTENCE') @@ -693,6 +694,31 @@ export function checkItineraryExistence(trip, intl) { } } +export function getDependentUserInfo(userIds, intl) { + return async function (dispatch, getState) { + const state = getState() + const { accessToken, apiBaseUrl, apiKey } = getMiddlewareVariables(state) + const requestUrl = `${apiBaseUrl}${API_OTPUSER_PATH}/getdependentmobilityprofile?dependentuserids=${userIds}` + + const { data, status } = await secureFetch( + requestUrl, + accessToken, + apiKey, + 'GET' + ) + + console.log('data::::::', data) + + if (status === 'success' && data) { + dispatch(setDependentUserInfo(data)) + } else { + alert( + intl.formatMessage({ id: 'actions.user.getDependentUserInfoFailed' }) + ) + } + } +} + /** * Plans a new trip for the current date given the query parameters in the given * monitored trip diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 48fe9db1e..a8dcc7901 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -9,17 +9,25 @@ import { ArrowLeft } from '@styled-icons/fa-solid/ArrowLeft' import { Check } from '@styled-icons/boxicons-regular' import { connect } from 'react-redux' import { decodeQueryParams, DelimitedArrayParam } from 'serialize-query-params' -import { FormattedMessage, useIntl } from 'react-intl' +import { FormattedMessage, IntlShape, useIntl } from 'react-intl' import { invisibleCss } from '@opentripplanner/trip-form/lib/MetroModeSelector' import { ModeButtonDefinition, ModeSetting, ModeSettingValues } from '@opentripplanner/types' -import React, { RefObject, useCallback, useContext, useState } from 'react' +import React, { + RefObject, + useCallback, + useContext, + useEffect, + useMemo, + useState +} from 'react' import styled from 'styled-components' import * as formActions from '../../actions/form' +import * as userActions from '../../actions/user' import { AppReduxState } from '../../util/state-types' import { blue, getBaseColor } from '../util/colors' import { ComponentContext } from '../../util/contexts' @@ -133,6 +141,7 @@ const AdvancedSettingsPanel = ({ closeAdvancedSettings, currentQuery, enabledModeButtons, + getDependentUserInfo, handlePlanTrip, innerRef, loggedInUser, @@ -148,6 +157,7 @@ const AdvancedSettingsPanel = ({ closeAdvancedSettings: () => void currentQuery: any enabledModeButtons: string[] + getDependentUserInfo: (userIds: string[], intl: IntlShape) => void handlePlanTrip: () => void innerRef: RefObject loggedInUser: User | null @@ -159,16 +169,25 @@ const AdvancedSettingsPanel = ({ setCloseAdvancedSettingsWithDelay: () => void setQueryParam: (evt: any) => void }): JSX.Element => { + const intl = useIntl() const [closingBySave, setClosingBySave] = useState(false) // TODO: this is an email for now const [selectedMobilityProfile, setSelectedMobilityProfile] = - useState(loggedInUser?.email || '') - const relatedUsers = loggedInUser?.relatedUsers || [] + useState(loggedInUser?.mobilityProfile?.mobilityMode || '') + const dependents = useMemo( + () => loggedInUser?.dependents || [], + [loggedInUser] + ) + + useEffect(() => { + if (mobilityProfile && dependents.length > 0) { + getDependentUserInfo(dependents, intl) + } + }, [dependents, getDependentUserInfo, intl, mobilityProfile]) const baseColor = getBaseColor() const accentColor = baseColor || blue[900] - const intl = useIntl() const closeButtonText = intl.formatMessage({ id: 'components.BatchSearchScreen.saveAndReturn' }) @@ -233,6 +252,16 @@ const AdvancedSettingsPanel = ({ closePanel() }, [closePanel, setCloseAdvancedSettingsWithDelay]) + const showMobilityProfileDropdown = () => { + return ( + loggedInUser && + loggedInUser.mobilityProfile && + loggedInUser.mobilityProfile.mobilityMode && + loggedInUser.dependents && + loggedInUser.dependents.length > 0 + ) + } + return ( @@ -261,7 +290,7 @@ const AdvancedSettingsPanel = ({ )} - {loggedInUser && relatedUsers.length > 0 && ( + {showMobilityProfileDropdown() && loggedInUser && ( @@ -285,11 +314,14 @@ const AdvancedSettingsPanel = ({ setSelectedMobilityProfile(e.mobilityProfile as string) }} options={[ - { text: 'Myself', value: loggedInUser.email }, - ...relatedUsers.map((user) => ({ - text: user.nickname || user.email, - value: user.email // TODO: this needs to be mobilityMode - })) + { + text: 'Myself', + value: loggedInUser.mobilityProfile?.mobilityMode || '' + }, + ...(loggedInUser.dependentsInfo?.map((user) => ({ + text: user.name || user.email, + value: user.mobilityMode || '' + })) || []) ]} value={selectedMobilityProfile} /> @@ -325,7 +357,6 @@ const AdvancedSettingsPanel = ({ ) } - const queryParamConfig = { modeButtons: DelimitedArrayParam } const mapStateToProps = (state: AppReduxState) => { @@ -361,6 +392,7 @@ const mapStateToProps = (state: AppReduxState) => { } const mapDispatchToProps = { + getDependentUserInfo: userActions.getDependentUserInfo, setQueryParam: formActions.setQueryParam, updateQueryTimeIfLeavingNow: formActions.updateQueryTimeIfLeavingNow } diff --git a/lib/components/user/types.ts b/lib/components/user/types.ts index 17efeb1f2..be05872cd 100644 --- a/lib/components/user/types.ts +++ b/lib/components/user/types.ts @@ -36,11 +36,20 @@ export interface CompanionInfo { status?: 'PENDING' | 'CONFIRMED' | 'INVALID' } +export interface DependentInfo { + email: string + mobilityMode: string + name?: string + userId: string +} + /** * Type definition for an OTP-middleware (OTP-personas) user. */ export interface User { accessibilityRoutingByDefault?: boolean + dependents?: string[] + dependentsInfo?: DependentInfo[] // email always exists per Auth0. email: string hasConsentedToTerms?: boolean diff --git a/lib/reducers/create-user-reducer.js b/lib/reducers/create-user-reducer.js index d52d3761c..af03f8a25 100644 --- a/lib/reducers/create-user-reducer.js +++ b/lib/reducers/create-user-reducer.js @@ -173,6 +173,12 @@ function createUserReducer(config) { }) } + case 'SET_DEPENDENT_USER_INFO': { + return update(state, { + loggedInUser: { dependentsInfo: { $set: action.payload } } + }) + } + case 'SET_PATH_BEFORE_SIGNIN': { return update(state, { pathBeforeSignIn: { $set: action.payload } From d626c559c58d449af629b2a91291d3dd5918979e Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 15 Oct 2024 13:18:09 -0400 Subject: [PATCH 052/119] set correct hover index --- lib/components/map/itinerary-summary-overlay.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index 5f47f527d..8eb3312dc 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import { Feature, lineString, LineString, Position } from '@turf/helpers' -import { Itinerary, Location } from '@opentripplanner/types' +import { Itinerary, Leg, Location } from '@opentripplanner/types' import { Marker } from 'react-map-gl' import centroid from '@turf/centroid' import distance from '@turf/distance' @@ -103,6 +103,8 @@ function addTrueIndex(array: ItinWithGeometry[]): ItinWithGeometry[] { return array } +const getLegRoute = (leg: Leg) => leg.routeId + type ItinUniquePoint = { itin: ItinWithGeometry uniquePoint: Position @@ -151,10 +153,9 @@ const ItinerarySummaryOverlay = ({ const indexedItins: ItinWithGeometry[] = addTrueIndex( itins.map(addItinLineString) ) - const mergedItins: ItinWithGeometry[] = - doMergeItineraries(indexedItins).mergedItineraries + const mergedItins = doMergeItineraries(indexedItins).mergedItineraries - const midPoints = mergedItins.reduce( + const midPoints = mergedItins.reduce( (prev: ItinUniquePoint[], curItin: ItinWithGeometry) => { prev.push(getUniquePoint(curItin, prev)) return prev From ad11fc13da73697ceb34a03267fcb7e8ca4baf07 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 15 Oct 2024 14:31:48 -0400 Subject: [PATCH 053/119] remove dead code --- lib/components/map/itinerary-summary-overlay.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index 8eb3312dc..5d8a6f486 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -103,8 +103,6 @@ function addTrueIndex(array: ItinWithGeometry[]): ItinWithGeometry[] { return array } -const getLegRoute = (leg: Leg) => leg.routeId - type ItinUniquePoint = { itin: ItinWithGeometry uniquePoint: Position From ed27d8cbf71322d02955fe7675e748fc35c0a44c Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 15 Oct 2024 14:32:15 -0400 Subject: [PATCH 054/119] clean up --- lib/components/map/itinerary-summary-overlay.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index 5d8a6f486..891c328d4 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import { Feature, lineString, LineString, Position } from '@turf/helpers' -import { Itinerary, Leg, Location } from '@opentripplanner/types' +import { Itinerary, Location } from '@opentripplanner/types' import { Marker } from 'react-map-gl' import centroid from '@turf/centroid' import distance from '@turf/distance' From 734aa58e527fab7143a29958b92267046298aca2 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 1 Nov 2024 11:07:51 -0400 Subject: [PATCH 055/119] add missing typescript --- lib/components/map/itinerary-summary-overlay.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index 891c328d4..e1f2e0e2f 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -169,7 +169,10 @@ const ItinerarySummaryOverlay = ({ return ( <> {midPoints.map( - (mp) => + (mp: { + itin: Itinerary & { index: number } + uniquePoint: [number, number] + }) => // If no itinerary is hovered, show all of them. If one is selected, show only that one // TODO: clean up conditionals, move these to a more appropriate place without breaking indexing (isDefined(visibleItinerary) From 4cd8ff331d51e551f9776268c0c483e53121bd04 Mon Sep 17 00:00:00 2001 From: Daniel Heppner Date: Mon, 4 Nov 2024 12:57:11 -0800 Subject: [PATCH 056/119] clean up miles's bad code --- lib/components/map/itinerary-summary-overlay.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/components/map/itinerary-summary-overlay.tsx b/lib/components/map/itinerary-summary-overlay.tsx index e1f2e0e2f..5f47f527d 100644 --- a/lib/components/map/itinerary-summary-overlay.tsx +++ b/lib/components/map/itinerary-summary-overlay.tsx @@ -151,9 +151,10 @@ const ItinerarySummaryOverlay = ({ const indexedItins: ItinWithGeometry[] = addTrueIndex( itins.map(addItinLineString) ) - const mergedItins = doMergeItineraries(indexedItins).mergedItineraries + const mergedItins: ItinWithGeometry[] = + doMergeItineraries(indexedItins).mergedItineraries - const midPoints = mergedItins.reduce( + const midPoints = mergedItins.reduce( (prev: ItinUniquePoint[], curItin: ItinWithGeometry) => { prev.push(getUniquePoint(curItin, prev)) return prev @@ -169,10 +170,7 @@ const ItinerarySummaryOverlay = ({ return ( <> {midPoints.map( - (mp: { - itin: Itinerary & { index: number } - uniquePoint: [number, number] - }) => + (mp) => // If no itinerary is hovered, show all of them. If one is selected, show only that one // TODO: clean up conditionals, move these to a more appropriate place without breaking indexing (isDefined(visibleItinerary) From a9bea3fb48f53b89d892d14a69e61ed9d4940e10 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 9 Oct 2024 12:19:25 -0400 Subject: [PATCH 057/119] respect mode text color --- lib/actions/apiV2.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 91d552251..fc2eb9d7d 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -1170,12 +1170,24 @@ export function routingQuery(searchId = null, updateSearchInReducer) { route: { ...leg.route, color: getRouteColorBasedOnSettings( - routeOperator, - routeProperties + getRouteOperator( + { + agencyId: leg?.agency?.id, + id: leg?.route?.id + }, + config.transitOperators + ), + { color: leg?.route?.color, mode: leg.mode } ).split('#')?.[1], textColor: getRouteTextColorBasedOnSettings( - routeOperator, - routeProperties + getRouteOperator( + { + agencyId: leg?.agency?.id, + id: leg?.route?.id + }, + config.transitOperators + ), + { color: leg?.route?.color, mode: leg.mode } ).split('#')?.[1] } } From 1e4a6d7e2bb5353768e2f774cae762836480110e Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 1 Nov 2024 10:59:36 -0400 Subject: [PATCH 058/119] address pr feedback --- lib/actions/apiV2.js | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index fc2eb9d7d..91d552251 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -1170,24 +1170,12 @@ export function routingQuery(searchId = null, updateSearchInReducer) { route: { ...leg.route, color: getRouteColorBasedOnSettings( - getRouteOperator( - { - agencyId: leg?.agency?.id, - id: leg?.route?.id - }, - config.transitOperators - ), - { color: leg?.route?.color, mode: leg.mode } + routeOperator, + routeProperties ).split('#')?.[1], textColor: getRouteTextColorBasedOnSettings( - getRouteOperator( - { - agencyId: leg?.agency?.id, - id: leg?.route?.id - }, - config.transitOperators - ), - { color: leg?.route?.color, mode: leg.mode } + routeOperator, + routeProperties ).split('#')?.[1] } } From 85964b23b6f4c77b73d99e66045f8dd25ab11095 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 6 Nov 2024 19:59:36 -0500 Subject: [PATCH 059/119] nearby: use stoptime headsigns if applicable --- lib/components/viewers/nearby/stop.tsx | 3 ++- lib/components/viewers/pattern-row.tsx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/components/viewers/nearby/stop.tsx b/lib/components/viewers/nearby/stop.tsx index c98d288c1..6c9c0b301 100644 --- a/lib/components/viewers/nearby/stop.tsx +++ b/lib/components/viewers/nearby/stop.tsx @@ -36,7 +36,8 @@ const Stop = ({ }: Props): JSX.Element => { const patternRows = (stopData.stoptimesForPatterns || []) ?.reduce((acc, cur) => { - const currentHeadsign = extractHeadsignFromPattern(cur.pattern) + const currentHeadsign = + cur.stoptimes?.[0]?.headsign || extractHeadsignFromPattern(cur.pattern) const dupe = acc.findIndex((p) => { // TODO: use OTP_generated ids let sameRoute = false diff --git a/lib/components/viewers/pattern-row.tsx b/lib/components/viewers/pattern-row.tsx index 4f87a8c7a..e4bbef83c 100644 --- a/lib/components/viewers/pattern-row.tsx +++ b/lib/components/viewers/pattern-row.tsx @@ -113,6 +113,7 @@ const PatternRow = ({ id="components.NearbyView.headsign" values={{ destination: + stopTimes?.[0]?.headsign || extractHeadsignFromPattern(pattern) || (pattern.route.longName !== routeName && pattern.route.longName) From 6c46ae887e090879ea74d25a009828a3cb6dd154 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 13 Nov 2024 15:29:09 -0500 Subject: [PATCH 060/119] revert unneeded change --- lib/components/viewers/nearby/stop.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/components/viewers/nearby/stop.tsx b/lib/components/viewers/nearby/stop.tsx index 6c9c0b301..c98d288c1 100644 --- a/lib/components/viewers/nearby/stop.tsx +++ b/lib/components/viewers/nearby/stop.tsx @@ -36,8 +36,7 @@ const Stop = ({ }: Props): JSX.Element => { const patternRows = (stopData.stoptimesForPatterns || []) ?.reduce((acc, cur) => { - const currentHeadsign = - cur.stoptimes?.[0]?.headsign || extractHeadsignFromPattern(cur.pattern) + const currentHeadsign = extractHeadsignFromPattern(cur.pattern) const dupe = acc.findIndex((p) => { // TODO: use OTP_generated ids let sameRoute = false From 1b2975daf7c3ae341a2be65698eb2126ed46649d Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 21 Aug 2024 11:20:34 -0400 Subject: [PATCH 061/119] only show routes from current service week --- lib/actions/apiV2.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 91d552251..6c51359f1 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -866,16 +866,18 @@ export function findRoutes() { return function (dispatch, getState) { // Only calculate current service week if the setting for it is enabled const currentServiceWeek = - getState().otp?.config?.routeViewer?.onlyShowCurrentServiceWeek === true + getState().otp?.routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() - : undefined + : null dispatch( createGraphQLQueryAction( - `query Routes( - $currentServiceWeek: LocalDateRangeInput - ) { - routes (serviceDates: $currentServiceWeek) { + `{ + routes ${ + currentServiceWeek + ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` + : '' + }{ id: gtfsId agency { id: gtfsId From 5f5ba94e046bd209fe153b536d099372e3b162b8 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 16 Sep 2024 11:48:30 -0400 Subject: [PATCH 062/119] chore(deps): update otp-ui --- yarn.lock | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/yarn.lock b/yarn.lock index 71a5211e8..db8be0801 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2517,6 +2517,17 @@ isomorphic-mapzen-search "^1.6.1" lodash.memoize "^4.1.2" +"@opentripplanner/geocoder@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@opentripplanner/geocoder/-/geocoder-3.0.2.tgz#2c7618947d1d9b082bd39d037327c9cf23282782" + integrity sha512-pl7tCiodex0hXWKLH3WE+I+HzoSgOOWp9kR3xMcuRiE5g6k2JXNneoD/ZfSS1n6Oorxcjv3U2DbMSXT2j/39dQ== + dependencies: + "@conveyal/geocoder-arcgis-geojson" "^0.0.3" + "@conveyal/lonlat" "^1.4.1" + "@leeoniya/ufuzzy" "^1.0.14" + isomorphic-mapzen-search "^1.6.1" + lodash.memoize "^4.1.2" + "@opentripplanner/humanize-distance@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@opentripplanner/humanize-distance/-/humanize-distance-1.2.0.tgz#71cf5d5d1b756adef15300edbba0995ccd4b35ee" From 21c15f3d97e8b043f3d3b82d08eaf9b0cde5a736 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 25 Sep 2024 11:59:34 -0400 Subject: [PATCH 063/119] make currentServiceWeek query in nearby query --- lib/actions/apiV2.js | 12 ++++++++---- lib/components/viewers/nearby/nearby-view.tsx | 2 +- lib/components/viewers/nearby/stop.tsx | 2 -- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 6c51359f1..3afac6394 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -439,9 +439,13 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { lon code gtfsId - stopRoutes: routes (serviceDates: $currentServiceWeek) { - gtfsId - } + stopRoutes: routes ${ + currentServiceWeek + ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` + : '' + } { + gtfsId + } stoptimesForPatterns { pattern { headsign @@ -866,7 +870,7 @@ export function findRoutes() { return function (dispatch, getState) { // Only calculate current service week if the setting for it is enabled const currentServiceWeek = - getState().otp?.routeViewer?.onlyShowCurrentServiceWeek === true + getState().otp?.config?.routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() : null diff --git a/lib/components/viewers/nearby/nearby-view.tsx b/lib/components/viewers/nearby/nearby-view.tsx index 1405f9eae..855b596a8 100644 --- a/lib/components/viewers/nearby/nearby-view.tsx +++ b/lib/components/viewers/nearby/nearby-view.tsx @@ -319,7 +319,7 @@ const mapStateToProps = (state: AppReduxState) => { const currentServiceWeek = routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() - : undefined + : null return { currentPosition, diff --git a/lib/components/viewers/nearby/stop.tsx b/lib/components/viewers/nearby/stop.tsx index c98d288c1..f11f443a2 100644 --- a/lib/components/viewers/nearby/stop.tsx +++ b/lib/components/viewers/nearby/stop.tsx @@ -70,8 +70,6 @@ const Stop = ({ (a: StopTime, b: StopTime) => fullTimestamp(a) - fullTimestamp(b) ) if ( - // NearbyRoutes if present is populated with a list of routes that appear - // in the current service period. stopData.nearbyRoutes && !stopData.nearbyRoutes.includes(st?.pattern?.route?.gtfsId) ) { From e63f20d7e3e5c650ae8ebc5703d7bc9e037bc0b9 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 12:51:28 -0400 Subject: [PATCH 064/119] address pr feedback --- lib/actions/apiV2.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 3afac6394..2db7451dd 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -439,13 +439,9 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { lon code gtfsId - stopRoutes: routes ${ - currentServiceWeek - ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` - : '' - } { - gtfsId - } + stopRoutes: routes (serviceDates: $currentServiceWeek) { + gtfsId + } stoptimesForPatterns { pattern { headsign From d0566bab69e08e177c06463bdb436d346b3c60d0 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 12:56:23 -0400 Subject: [PATCH 065/119] complete pr feedback addressing --- lib/actions/apiV2.js | 10 ++++------ lib/components/viewers/nearby/stop.tsx | 2 ++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 2db7451dd..11699ce99 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -872,12 +872,10 @@ export function findRoutes() { dispatch( createGraphQLQueryAction( - `{ - routes ${ - currentServiceWeek - ? `(serviceDates: {start: "${currentServiceWeek.start}", end: "${currentServiceWeek.end}"})` - : '' - }{ + `query Routes( + $currentServiceWeek: LocalDateRangeInput + ) { + routes (serviceDates: $currentServiceWeek) { id: gtfsId agency { id: gtfsId diff --git a/lib/components/viewers/nearby/stop.tsx b/lib/components/viewers/nearby/stop.tsx index f11f443a2..c98d288c1 100644 --- a/lib/components/viewers/nearby/stop.tsx +++ b/lib/components/viewers/nearby/stop.tsx @@ -70,6 +70,8 @@ const Stop = ({ (a: StopTime, b: StopTime) => fullTimestamp(a) - fullTimestamp(b) ) if ( + // NearbyRoutes if present is populated with a list of routes that appear + // in the current service period. stopData.nearbyRoutes && !stopData.nearbyRoutes.includes(st?.pattern?.route?.gtfsId) ) { From 928edbbab72c2ad4cb7d403dac9249abdb6d5e62 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 12:59:11 -0400 Subject: [PATCH 066/119] correct types --- lib/actions/apiV2.js | 2 +- lib/components/viewers/nearby/nearby-view.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 11699ce99..91d552251 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -868,7 +868,7 @@ export function findRoutes() { const currentServiceWeek = getState().otp?.config?.routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() - : null + : undefined dispatch( createGraphQLQueryAction( diff --git a/lib/components/viewers/nearby/nearby-view.tsx b/lib/components/viewers/nearby/nearby-view.tsx index 855b596a8..1405f9eae 100644 --- a/lib/components/viewers/nearby/nearby-view.tsx +++ b/lib/components/viewers/nearby/nearby-view.tsx @@ -319,7 +319,7 @@ const mapStateToProps = (state: AppReduxState) => { const currentServiceWeek = routeViewer?.onlyShowCurrentServiceWeek === true ? getCurrentServiceWeek() - : null + : undefined return { currentPosition, From feb9a97e6dbdd9b6da3be8f0fad0ec298c9cb1a5 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 13:12:30 -0400 Subject: [PATCH 067/119] add missing `nearbyRoutes` to snapshots --- __tests__/components/viewers/__snapshots__/nearby-view.js.snap | 3 +++ 1 file changed, 3 insertions(+) diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index dd1dcddc1..4b34a1ba5 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -3513,6 +3513,9 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", + "nearbyRoutes": Array [ + undefined, + ], "stoptimesForPatterns": Array [ Object { "pattern": Object { From 0b01a326a428b89348efa302ffbb0e8c257c6624 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 7 Oct 2024 13:21:06 -0400 Subject: [PATCH 068/119] update snapshots --- __tests__/components/viewers/__snapshots__/nearby-view.js.snap | 3 --- 1 file changed, 3 deletions(-) diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index 4b34a1ba5..dd1dcddc1 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -3513,9 +3513,6 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` "lat": 47.6758652, "lon": -122.313545, "name": "NE 65th St & 14th Ave NE", - "nearbyRoutes": Array [ - undefined, - ], "stoptimesForPatterns": Array [ Object { "pattern": Object { From 405040f63beb60db40b1d68d4a0941e888a0499e Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 13 Nov 2024 15:38:40 -0500 Subject: [PATCH 069/119] update snapshots --- .../components/viewers/__snapshots__/nearby-view.js.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index dd1dcddc1..a3a1b7bc5 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -30968,7 +30968,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` id="components.NearbyView.headsign" values={ Object { - "destination": "Sand Point East Green Lake", + "destination": "Sand Point", } } > @@ -59945,7 +59945,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` id="components.NearbyView.headsign" values={ Object { - "destination": "Kenmore P&R Roosevelt Station", + "destination": "Kenmore P&R", } } > From 721ef463e58d0bbe2e352c66fdf8b1e88eb4463d Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Fri, 15 Nov 2024 12:56:16 -0600 Subject: [PATCH 070/119] remove comment --- lib/components/form/advanced-settings-panel.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index a8dcc7901..99256c311 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -171,7 +171,6 @@ const AdvancedSettingsPanel = ({ }): JSX.Element => { const intl = useIntl() const [closingBySave, setClosingBySave] = useState(false) - // TODO: this is an email for now const [selectedMobilityProfile, setSelectedMobilityProfile] = useState(loggedInUser?.mobilityProfile?.mobilityMode || '') const dependents = useMemo( From c4bf3c931c276276e08f5b8fd42d4ff7937c305a Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Fri, 15 Nov 2024 13:10:48 -0600 Subject: [PATCH 071/119] remove weird check --- .../form/advanced-settings-panel.tsx | 89 +++++++++---------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 99256c311..62e2e812c 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -179,7 +179,9 @@ const AdvancedSettingsPanel = ({ ) useEffect(() => { + console.log('mobilityProfile', mobilityProfile) if (mobilityProfile && dependents.length > 0) { + console.log('test') getDependentUserInfo(dependents, intl) } }, [dependents, getDependentUserInfo, intl, mobilityProfile]) @@ -251,16 +253,6 @@ const AdvancedSettingsPanel = ({ closePanel() }, [closePanel, setCloseAdvancedSettingsWithDelay]) - const showMobilityProfileDropdown = () => { - return ( - loggedInUser && - loggedInUser.mobilityProfile && - loggedInUser.mobilityProfile.mobilityMode && - loggedInUser.dependents && - loggedInUser.dependents.length > 0 - ) - } - return ( @@ -289,43 +281,45 @@ const AdvancedSettingsPanel = ({ )} - {showMobilityProfileDropdown() && loggedInUser && ( - - - - - ( - - {linkText} - - ) - }} - /> - { - setSelectedMobilityProfile(e.mobilityProfile as string) - }} - options={[ - { - text: 'Myself', - value: loggedInUser.mobilityProfile?.mobilityMode || '' - }, - ...(loggedInUser.dependentsInfo?.map((user) => ({ - text: user.name || user.email, - value: user.mobilityMode || '' - })) || []) - ]} - value={selectedMobilityProfile} - /> - - )} + {loggedInUser && + loggedInUser.dependentsInfo && + loggedInUser.dependentsInfo.length > 0 && ( + + + + + ( + + {linkText} + + ) + }} + /> + { + setSelectedMobilityProfile(e.mobilityProfile as string) + }} + options={[ + { + text: 'Myself', + value: loggedInUser.mobilityProfile?.mobilityMode || '' + }, + ...(loggedInUser.dependentsInfo?.map((user) => ({ + text: user.name || user.email, + value: user.mobilityMode || '' + })) || []) + ]} + value={selectedMobilityProfile} + /> + + )} ) } + const queryParamConfig = { modeButtons: DelimitedArrayParam } const mapStateToProps = (state: AppReduxState) => { From c8d0d250bb42f1bff825046eafaeffccd7379230 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:19:52 -0600 Subject: [PATCH 072/119] feat(advanced-settings-panel): set selected mobility profile in current query --- lib/components/form/advanced-settings-panel.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 62e2e812c..5b9281c11 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -172,16 +172,18 @@ const AdvancedSettingsPanel = ({ const intl = useIntl() const [closingBySave, setClosingBySave] = useState(false) const [selectedMobilityProfile, setSelectedMobilityProfile] = - useState(loggedInUser?.mobilityProfile?.mobilityMode || '') + useState( + currentQuery.mobilityProfile || + loggedInUser?.mobilityProfile?.mobilityMode || + '' + ) const dependents = useMemo( () => loggedInUser?.dependents || [], [loggedInUser] ) useEffect(() => { - console.log('mobilityProfile', mobilityProfile) if (mobilityProfile && dependents.length > 0) { - console.log('test') getDependentUserInfo(dependents, intl) } }, [dependents, getDependentUserInfo, intl, mobilityProfile]) @@ -305,6 +307,7 @@ const AdvancedSettingsPanel = ({ name="mobilityProfile" onChange={(e) => { setSelectedMobilityProfile(e.mobilityProfile as string) + setQueryParam(e) }} options={[ { From 908ed592a6d41cd29e3b894e6e2828af3050201f Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:20:20 -0600 Subject: [PATCH 073/119] feat(api-v2): get mobility profile from current query or from user --- lib/actions/apiV2.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 91d552251..931080be7 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -1063,10 +1063,10 @@ export function routingQuery(searchId = null, updateSearchInReducer) { ...currentQuery, numItineraries: numItineraries || getDefaultNumItineraries(config) } - - // TODO: get mobility profile from state or somewhere else? if (config.mobilityProfile) { - baseQuery.mobilityProfile = loggedInUser?.mobilityProfile?.mobilityMode + baseQuery.mobilityProfile = + currentQuery.mobilityProfile || + loggedInUser?.mobilityProfile?.mobilityMode } // Generate combinations if the modes for query are not specified in the query // FIXME: BICYCLE_RENT does not appear in this list unless TRANSIT is also enabled. From fef9147127d655efa38e729ce1ffc761dd6f43c9 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:11:31 -0600 Subject: [PATCH 074/119] feat(i18n): add missing strings and remove unused --- i18n/en-US.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index 92e46fb8c..ff78d7881 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -51,6 +51,7 @@ actions: confirmDeletePlace: Would you like to remove this place? emailVerificationResent: The email verification message has been resent. genericError: "An error was encountered: {err}" + getDependentUserInfoFailed: Error getting mobility profile information. itineraryExistenceCheckFailed: Error checking whether your selected trip is possible. mustAcceptTermsToSavePlace: Please accept the Terms of Use (under My Account) to save locations. mustBeLoggedInToSavePlace: Please log in to save locations. @@ -195,7 +196,6 @@ components: BatchSearchScreen: advancedHeader: Advanced Preferences header: Plan Your Trip - modeOptions: Mode Options modeSelectorLabel: Select a travel mode moreOptions: More options saveAndReturn: Save and return From 1274bfe4a5e9f9f6f4b8b0b21c538fd554547434 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Mon, 18 Nov 2024 13:02:56 -0600 Subject: [PATCH 075/119] fix(i18n): remove unused string from fr translations --- i18n/fr.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/i18n/fr.yml b/i18n/fr.yml index a8283e9f1..a1b42e3f6 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -206,7 +206,6 @@ components: BatchSearchScreen: advancedHeader: Préférences avancées header: Votre trajet - modeOptions: Choix du mode modeSelectorLabel: Sélectionnez un mode de déplacement moreOptions: Plus d'options saveAndReturn: Enregistrer et fermer From c512398cce3c104ce2f545feb954738c7929caec Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:14:59 -0600 Subject: [PATCH 076/119] Update config item to geocoderResultsOrder --- example-config.yml | 6 +++--- lib/components/app/batch-routing-panel.tsx | 19 ++++++++++++------- lib/components/mobile/batch-search-screen.tsx | 12 ++++++------ lib/components/mobile/welcome-screen.tsx | 13 ++++++++----- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/example-config.yml b/example-config.yml index 232839897..e5d10ae79 100644 --- a/example-config.yml +++ b/example-config.yml @@ -179,9 +179,9 @@ map: # geocoder test account can be obtained from the Pelias maintainers at geocode.earth. geocoder: apiKey: PELIAS_API_KEY - # When set to true, geocoder results will be displayed with the "Other" section first, - # above transit stops and stations - renderOtherFirst: false + # Pass an array of geocoder result types to control the order in which they are displayed. + # The default order is ['STATIONS', 'STOPS', 'OTHER']. + geocoderResultsOrder: ['STATIONS', 'STOPS', 'OTHER'] boundary: rect: minLon: -123.2034 diff --git a/lib/components/app/batch-routing-panel.tsx b/lib/components/app/batch-routing-panel.tsx index 5e2a02eef..e675e5cc6 100644 --- a/lib/components/app/batch-routing-panel.tsx +++ b/lib/components/app/batch-routing-panel.tsx @@ -14,9 +14,9 @@ import ViewerContainer from '../viewers/viewer-container' interface Props { activeSearch: any + geocoderResultsOrder?: Array intl: IntlShape mobile?: boolean - renderOtherFirst?: boolean showUserSettings: boolean } @@ -35,8 +35,13 @@ class BatchRoutingPanel extends Component { } render() { - const { activeSearch, intl, mobile, renderOtherFirst, showUserSettings } = - this.props + const { + activeSearch, + geocoderResultsOrder, + intl, + mobile, + showUserSettings + } = this.props const { planTripClicked } = this.state const mapAction = mobile ? intl.formatMessage({ @@ -67,24 +72,24 @@ class BatchRoutingPanel extends Component { > @@ -119,10 +124,10 @@ const mapStateToProps = (state: any) => { getShowUserSettings(state) && (state.user.loggedInUser?.hasConsentedToTerms || getPersistenceMode(state.otp.config.persistence).isLocalStorage) - const { renderOtherFirst } = state.otp.config.geocoder + const { geocoderResultsOrder } = state.otp.config.geocoder return { activeSearch: getActiveSearch(state), - renderOtherFirst, + geocoderResultsOrder, showUserSettings } } diff --git a/lib/components/mobile/batch-search-screen.tsx b/lib/components/mobile/batch-search-screen.tsx index 99b632439..f773cf2f7 100644 --- a/lib/components/mobile/batch-search-screen.tsx +++ b/lib/components/mobile/batch-search-screen.tsx @@ -15,9 +15,9 @@ import MobileNavigationBar from './navigation-bar' const { SET_FROM_LOCATION, SET_TO_LOCATION } = MobileScreens interface Props { + geocoderResultsOrder: Array intl: IntlShape map: React.ReactElement - renderOtherFirst: boolean setMobileScreen: (screen: number) => void } @@ -35,7 +35,7 @@ class BatchSearchScreen extends Component { } render() { - const { intl, renderOtherFirst } = this.props + const { geocoderResultsOrder, intl } = this.props const { planTripClicked } = this.state return ( @@ -47,24 +47,24 @@ class BatchSearchScreen extends Component {
@@ -89,10 +89,10 @@ const mapDispatchToProps = { } const mapStateToProps = (state: any) => { - const { renderOtherFirst } = state.otp.config.geocoder + const { geocoderResultsOrder } = state.otp.config.geocoder return { - renderOtherFirst + geocoderResultsOrder } } diff --git a/lib/components/mobile/welcome-screen.tsx b/lib/components/mobile/welcome-screen.tsx index 484eae79b..8fde116df 100644 --- a/lib/components/mobile/welcome-screen.tsx +++ b/lib/components/mobile/welcome-screen.tsx @@ -12,11 +12,14 @@ import MobileContainer from './container' import MobileNavigationBar from './navigation-bar' interface Props { - renderOtherFirst: boolean + geocoderResultsOrder: Array setMobileScreen: (screen: number) => void } -const MobileWelcomeScreen = ({ renderOtherFirst, setMobileScreen }: Props) => { +const MobileWelcomeScreen = ({ + geocoderResultsOrder, + setMobileScreen +}: Props) => { const intl = useIntl() const toFieldClicked = useCallback( @@ -34,12 +37,12 @@ const MobileWelcomeScreen = ({ renderOtherFirst, setMobileScreen }: Props) => {
@@ -59,10 +62,10 @@ const mapDispatchToProps = { } const mapStateToProps = (state: any) => { - const { renderOtherFirst } = state.otp.config.geocoder + const { geocoderResultsOrder } = state.otp.config.geocoder return { - renderOtherFirst + geocoderResultsOrder } } From 8b9c63f01fe14883a2e70381a1b85e0baea84c89 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:21:48 -0600 Subject: [PATCH 077/119] Update otp packages to include location field changes --- package.json | 4 ++-- yarn.lock | 29 ++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 898bc9182..3ed8c8330 100644 --- a/package.json +++ b/package.json @@ -51,9 +51,9 @@ "@opentripplanner/humanize-distance": "^1.2.0", "@opentripplanner/icons": "3.0.1", "@opentripplanner/itinerary-body": "6.0.3", - "@opentripplanner/location-field": "3.0.0", + "@opentripplanner/location-field": "3.1.0", "@opentripplanner/location-icon": "^1.4.1", - "@opentripplanner/map-popup": "5.1.0", + "@opentripplanner/map-popup": "5.1.1", "@opentripplanner/otp2-tile-overlay": "2.1.1", "@opentripplanner/park-and-ride-overlay": "3.0.0", "@opentripplanner/printable-itinerary": "3.0.0", diff --git a/yarn.lock b/yarn.lock index 75e4f6c32..203b32681 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2578,13 +2578,13 @@ react-resize-detector "^4.2.1" string-similarity "^4.0.4" -"@opentripplanner/location-field@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-3.0.0.tgz#a6f8743290cf088bcd589cf8e6b0d07a651b704a" - integrity sha512-wPb9l5pvSeocZ45K1E3Zeb4hDjJtP9tw/S0MQ3HXYEQSf+700n4CWXVXYReYJXJYriOzge5/2whjUPGTlJckWw== +"@opentripplanner/location-field@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-3.1.0.tgz#2339d7214084ccece494969eafd7af8a2a9cc355" + integrity sha512-UDKEwNOlPyWhbcPgycOMTv8Mcto2CuhPVQw6b1r85qjLgzm4urHb00hcvTW0eqNfuCett0h/lM2Y1KFKuBC+iQ== dependencies: "@conveyal/geocoder-arcgis-geojson" "^0.0.3" - "@opentripplanner/core-utils" "^11.4.4" + "@opentripplanner/core-utils" "^12.0.0" "@opentripplanner/geocoder" "^3.0.2" "@opentripplanner/humanize-distance" "^1.2.0" "@opentripplanner/location-icon" "^1.4.1" @@ -2599,10 +2599,10 @@ "@styled-icons/fa-regular" "^10.34.0" "@styled-icons/fa-solid" "^10.34.0" -"@opentripplanner/map-popup@5.1.0", "@opentripplanner/map-popup@^v5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/map-popup/-/map-popup-5.1.0.tgz#cf6374bf7b69af69c026ec414a84719078c56e9e" - integrity sha512-EShoMyFZa7Zb2ZZrJhEsJfuCAvs2jfQe5QstU+AEk5Jm1zc8LzU6PsXmizQ/RMVi6zIYLhlBoZ3u458tTA3VQA== +"@opentripplanner/map-popup@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/map-popup/-/map-popup-5.1.1.tgz#f4699b63a2ba0fae6263f2417c5b85f5ffc204cb" + integrity sha512-HifqZFmrBy3FmARVKZwUnad8U/L8ftBm2PcSck4oGQ768E7TKhqyzXz+GzkO39TyKNU5yiNgmQEbss8elZuJ/g== dependencies: "@opentripplanner/base-map" "^4.0.0" "@opentripplanner/building-blocks" "^2.0.0" @@ -2621,6 +2621,17 @@ "@opentripplanner/from-to-location-picker" "^2.1.14" flat "^5.0.2" +"@opentripplanner/map-popup@^v5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/map-popup/-/map-popup-5.1.0.tgz#cf6374bf7b69af69c026ec414a84719078c56e9e" + integrity sha512-EShoMyFZa7Zb2ZZrJhEsJfuCAvs2jfQe5QstU+AEk5Jm1zc8LzU6PsXmizQ/RMVi6zIYLhlBoZ3u458tTA3VQA== + dependencies: + "@opentripplanner/base-map" "^4.0.0" + "@opentripplanner/building-blocks" "^2.0.0" + "@opentripplanner/core-utils" "^12.0.0" + "@opentripplanner/from-to-location-picker" "^3.0.0" + flat "^5.0.2" + "@opentripplanner/otp2-tile-overlay@2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@opentripplanner/otp2-tile-overlay/-/otp2-tile-overlay-2.1.1.tgz#3bd2f26caa01181eb4ca90bbd05ce784f9b05a7a" From 1c6c3ef8313a7b7861bdd3813c286a46db64693d Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:27:02 -0600 Subject: [PATCH 078/119] Update Location Field --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3ed8c8330..1c98635c5 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@opentripplanner/humanize-distance": "^1.2.0", "@opentripplanner/icons": "3.0.1", "@opentripplanner/itinerary-body": "6.0.3", - "@opentripplanner/location-field": "3.1.0", + "@opentripplanner/location-field": "3.1.1", "@opentripplanner/location-icon": "^1.4.1", "@opentripplanner/map-popup": "5.1.1", "@opentripplanner/otp2-tile-overlay": "2.1.1", diff --git a/yarn.lock b/yarn.lock index 203b32681..214d59710 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2578,10 +2578,10 @@ react-resize-detector "^4.2.1" string-similarity "^4.0.4" -"@opentripplanner/location-field@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-3.1.0.tgz#2339d7214084ccece494969eafd7af8a2a9cc355" - integrity sha512-UDKEwNOlPyWhbcPgycOMTv8Mcto2CuhPVQw6b1r85qjLgzm4urHb00hcvTW0eqNfuCett0h/lM2Y1KFKuBC+iQ== +"@opentripplanner/location-field@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-3.1.1.tgz#0658df4cfd47866153c8ae33fd60e991cdf94df0" + integrity sha512-Q9yhi3AVlnj8izrpJvxN+uVBjjtEDyFXUsJ0VhE9zevVpGzCh/gcGNzJY5EnP2IRDd/Szx6dPUogt3XJlHkHTQ== dependencies: "@conveyal/geocoder-arcgis-geojson" "^0.0.3" "@opentripplanner/core-utils" "^12.0.0" From 5761a5e5aa7d64c56c32977010b1bb0a5888b6ff Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:12:35 -0600 Subject: [PATCH 079/119] address pr feedback --- i18n/en-US.yml | 1 + lib/actions/user.js | 2 -- .../form/advanced-settings-panel.tsx | 24 ++++++++++++------- .../user/monitored-trip/saved-trip-screen.js | 4 +++- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index ff78d7881..c44db0bd3 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -346,6 +346,7 @@ components: intro: >- Please answer a few questions to customize the trip planning experience to your needs and preferences. + myself: Myself title: Define Your Mobility Profile NarrativeItinerariesHeader: changeSortDir: Change sort direction diff --git a/lib/actions/user.js b/lib/actions/user.js index b6588a198..a65f93665 100644 --- a/lib/actions/user.js +++ b/lib/actions/user.js @@ -707,8 +707,6 @@ export function getDependentUserInfo(userIds, intl) { 'GET' ) - console.log('data::::::', data) - if (status === 'success' && data) { dispatch(setDependentUserInfo(data)) } else { diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 5b9281c11..3f3f7b1a4 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -16,6 +16,7 @@ import { ModeSetting, ModeSettingValues } from '@opentripplanner/types' +import { QueryParamChangeEvent } from '@opentripplanner/trip-form/lib/types' import React, { RefObject, useCallback, @@ -160,7 +161,7 @@ const AdvancedSettingsPanel = ({ getDependentUserInfo: (userIds: string[], intl: IntlShape) => void handlePlanTrip: () => void innerRef: RefObject - loggedInUser: User | null + loggedInUser?: User | null mobilityProfile: boolean modeButtonOptions: ModeButtonDefinition[] modeSettingDefinitions: ModeSetting[] @@ -255,6 +256,16 @@ const AdvancedSettingsPanel = ({ closePanel() }, [closePanel, setCloseAdvancedSettingsWithDelay]) + const onMobilityProfileChange = useCallback( + (evt: QueryParamChangeEvent) => { + const value = evt.mobilityProfile + setSelectedMobilityProfile(value as string) + setQueryParam({ + mobilityProfile: value + }) + }, + [setSelectedMobilityProfile, setQueryParam] + ) return ( @@ -305,13 +316,12 @@ const AdvancedSettingsPanel = ({ id: 'components.MobilityProfile.dropdownLabel' })} name="mobilityProfile" - onChange={(e) => { - setSelectedMobilityProfile(e.mobilityProfile as string) - setQueryParam(e) - }} + onChange={onMobilityProfileChange} options={[ { - text: 'Myself', + text: intl.formatMessage({ + id: 'components.MobilityProfile.myself' + }), value: loggedInUser.mobilityProfile?.mobilityMode || '' }, ...(loggedInUser.dependentsInfo?.map((user) => ({ @@ -353,7 +363,6 @@ const AdvancedSettingsPanel = ({ ) } - const queryParamConfig = { modeButtons: DelimitedArrayParam } const mapStateToProps = (state: AppReduxState) => { @@ -368,7 +377,6 @@ const mapStateToProps = (state: AppReduxState) => { const { autoPlan } = state.otp.config const saveAndReturnButton = state.otp.config?.advancedSettingsPanel?.saveAndReturnButton - console.log('state:::', state) return { autoPlan: autoPlan !== false, currentQuery: state.otp.currentQuery, diff --git a/lib/components/user/monitored-trip/saved-trip-screen.js b/lib/components/user/monitored-trip/saved-trip-screen.js index 5e66539ab..76206baa9 100644 --- a/lib/components/user/monitored-trip/saved-trip-screen.js +++ b/lib/components/user/monitored-trip/saved-trip-screen.js @@ -163,6 +163,7 @@ class SavedTripScreen extends Component { render() { const { disableSingleItineraryDays, + hasMobilityProfile, isCreating, itinerary, loggedInUser, @@ -241,7 +242,7 @@ class SavedTripScreen extends Component {
{ const { disableSingleItineraryDays } = state.otp.config return { disableSingleItineraryDays, + hasMobilityProfile: state.otp.config.mobilityProfile, homeTimezone: state.otp.config.homeTimezone, isCreating: tripId === 'new', itinerary: itineraries[activeItinerary], From 45b81406867ad83f19752c50daee97b22bd0ca77 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:55:44 -0400 Subject: [PATCH 080/119] feat: Add confirmation and error landing pages. --- public/error.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 public/error.html diff --git a/public/error.html b/public/error.html new file mode 100644 index 000000000..4707860d3 --- /dev/null +++ b/public/error.html @@ -0,0 +1,19 @@ + + +

An error occurred:

+

+ + +

+ + + From 2922f2ef434a3430fa21e72331aeac310e09ccf5 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:13:20 -0400 Subject: [PATCH 081/119] refactor(confirmation.html): Merge error and confirmation pages --- public/error.html | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 public/error.html diff --git a/public/error.html b/public/error.html deleted file mode 100644 index 4707860d3..000000000 --- a/public/error.html +++ /dev/null @@ -1,19 +0,0 @@ - - -

An error occurred:

-

- - -

- - - From 8178e87e44d7a7cdae898698b47b6dd254fc634d Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:50:13 -0500 Subject: [PATCH 082/119] chore(i18n): Add FR translations --- i18n/fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/fr.yml b/i18n/fr.yml index a1b42e3f6..a2208dd60 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -547,7 +547,7 @@ components: deleteSavedTrip: Supprimer ce trajet editSavedTrip: Modifier un trajet enregistré saveNewTrip: Enregistrer un nouveau trajet - travelCompanions: Accompagnateurs + travelCompanion: Accompagnateurs tripInformation: Informations sur le trajet tripNotFound: Trajet introuvable tripNotFoundDescription: Le trajet recherché est introuvable. From f4ca59ed822b2352e04c7f16a268fa1f5da6c2e1 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:24:49 -0600 Subject: [PATCH 083/119] refactor: use plural travelCompanions --- i18n/fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/fr.yml b/i18n/fr.yml index a2208dd60..a1b42e3f6 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -547,7 +547,7 @@ components: deleteSavedTrip: Supprimer ce trajet editSavedTrip: Modifier un trajet enregistré saveNewTrip: Enregistrer un nouveau trajet - travelCompanion: Accompagnateurs + travelCompanions: Accompagnateurs tripInformation: Informations sur le trajet tripNotFound: Trajet introuvable tripNotFoundDescription: Le trajet recherché est introuvable. From cd22a1b6befacaa76d169d98bf597867ba27dba4 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Fri, 15 Nov 2024 00:00:57 -0600 Subject: [PATCH 084/119] refactor(existing-account-display): remove collapsible prop --- lib/components/user/existing-account-display.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/components/user/existing-account-display.tsx b/lib/components/user/existing-account-display.tsx index 98a3e675b..0f4452869 100644 --- a/lib/components/user/existing-account-display.tsx +++ b/lib/components/user/existing-account-display.tsx @@ -50,7 +50,6 @@ const ExistingAccountDisplay = (props: Props) => { ) }, { - collapsible: true, hidden: !mobilityProfileEnabled, pane: CompanionsPane, props, From 50e09cb9ac61c55c1faf5cb22b36cb7d606250a6 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Fri, 15 Nov 2024 00:02:37 -0600 Subject: [PATCH 085/119] refactor(saved-trip-editor): remove collapsible prop --- lib/components/user/monitored-trip/saved-trip-editor.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/components/user/monitored-trip/saved-trip-editor.tsx b/lib/components/user/monitored-trip/saved-trip-editor.tsx index cbca0a9dd..55e235878 100644 --- a/lib/components/user/monitored-trip/saved-trip-editor.tsx +++ b/lib/components/user/monitored-trip/saved-trip-editor.tsx @@ -52,7 +52,6 @@ const SavedTripEditor = (props: Props): JSX.Element => { // if mobility profile is present, then add travel companions pane if (props.hasMobilityProfile) { paneSequence.push({ - collapsible: true, pane: panes.travelCompanions, props, title: ( From 5ba7b3759bace239ef9a785efe06da6dc7232d60 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:23:13 -0500 Subject: [PATCH 086/119] fix: consolidate stop times query, remove onlyRequestForOperators --- lib/actions/apiV2.js | 50 ++++-------------------------- lib/components/map/default-map.tsx | 1 - 2 files changed, 6 insertions(+), 45 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 931080be7..41de55bee 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -506,13 +506,15 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { export const findStopTimesForStop = (params) => function (dispatch, getState) { dispatch(fetchingStopTimesForStop(params)) - const { date, onlyRequestForOperators, stopId } = params + const { date, stopId } = params const timeZone = getState().otp.config.homeTimezone // Create a service date timestamp from 3:30am local. const serviceDay = getServiceStart(date, timeZone).getTime() / 1000 - const fullStopTimesQuery = `query StopTimes( + return dispatch( + createGraphQLQueryAction( + `query StopTimes( $serviceDay: Long! $stopId: String! ) { @@ -547,6 +549,7 @@ export const findStopTimesForStop = (params) => id: code route { agency { + name gtfsId } gtfsId @@ -572,48 +575,7 @@ export const findStopTimesForStop = (params) => } } } - }` - - const shorterStopTimesQueryForOperators = `query StopTimes( - $stopId: String! - ) { - stop(id: $stopId) { - gtfsId - code - routes { - id: gtfsId - agency { - gtfsId - name - } - patterns { - id - headsign - } - } - stoptimesForPatterns(numberOfDepartures: 100, omitNonPickups: true, omitCanceled: false) { - pattern { - desc: name - headsign - id: code - route { - agency { - gtfsId - } - gtfsId - } - } - } - } - }` - - const query = onlyRequestForOperators - ? shorterStopTimesQueryForOperators - : fullStopTimesQuery - - return dispatch( - createGraphQLQueryAction( - query, + }`, { serviceDay, stopId diff --git a/lib/components/map/default-map.tsx b/lib/components/map/default-map.tsx index 5548f8171..367133ac3 100644 --- a/lib/components/map/default-map.tsx +++ b/lib/components/map/default-map.tsx @@ -166,7 +166,6 @@ class DefaultMap extends Component { const stopId = firstStopOfStationId || entity.gtfsId this.props.findStopTimesForStop({ date: getCurrentDate(), - onlyRequestForOperators: true, stopId }) return From 4e16499bd0986483d1215e6afcc594cd40f9fa73 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 16 Oct 2024 09:13:48 -0500 Subject: [PATCH 087/119] fix query for stops --- lib/actions/apiV2.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 41de55bee..0e8a121d6 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -554,9 +554,6 @@ export const findStopTimesForStop = (params) => } gtfsId } - stops { - gtfsId - } } stoptimes { headsign From 483846408c1ef97c749ef89dda01632a185a0325 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:44:56 -0500 Subject: [PATCH 088/119] fix: make transitIndex stops comprehensive list instead of rewriting on each call --- lib/reducers/create-otp-reducer.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/reducers/create-otp-reducer.js b/lib/reducers/create-otp-reducer.js index c4b3a7811..2e93ba2dd 100644 --- a/lib/reducers/create-otp-reducer.js +++ b/lib/reducers/create-otp-reducer.js @@ -853,6 +853,7 @@ function createOtpReducer(config) { transitIndex: { stops: { $set: { + ...state.transitIndex.stops, [action.payload.stopId]: { fetchStatus: FETCH_STATUS.FETCHING } @@ -864,8 +865,11 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - [action.payload.stopId]: { - fetchStatus: { $set: FETCH_STATUS.FETCHING } + $set: { + ...state.transitIndex.stops, + [action.payload.stopId]: { + fetchStatus: FETCH_STATUS.FETCHING + } } } } @@ -875,7 +879,10 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - [action.payload.gtfsId]: { $set: action.payload } + $set: { + ...state.transitIndex.stops, + [action.payload.gtfsId]: action.payload + } } } }) From b67ba236a2c9de2e5ee3ae123eae7ec208c85d09 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:13:14 -0500 Subject: [PATCH 089/119] replace $set wtih $merge for FIND_STOP_TIMES_FOR_STOP --- lib/reducers/create-otp-reducer.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/reducers/create-otp-reducer.js b/lib/reducers/create-otp-reducer.js index 2e93ba2dd..22643414f 100644 --- a/lib/reducers/create-otp-reducer.js +++ b/lib/reducers/create-otp-reducer.js @@ -852,10 +852,9 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - $set: { - ...state.transitIndex.stops, + $merge: { [action.payload.stopId]: { - fetchStatus: FETCH_STATUS.FETCHING + fetchStatus: { $merge: FETCH_STATUS.FETCHING } } } } @@ -865,7 +864,7 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - $set: { + $merge: { ...state.transitIndex.stops, [action.payload.stopId]: { fetchStatus: FETCH_STATUS.FETCHING @@ -879,10 +878,7 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - $set: { - ...state.transitIndex.stops, - [action.payload.gtfsId]: action.payload - } + [action.payload.gtfsId]: { $merge: action.payload } } } }) From 86005cd5e27a23f6b77f349347da433dbbbcd9e9 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:23:27 -0500 Subject: [PATCH 090/119] we only need one $merge actually --- lib/reducers/create-otp-reducer.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/reducers/create-otp-reducer.js b/lib/reducers/create-otp-reducer.js index 22643414f..e753c466c 100644 --- a/lib/reducers/create-otp-reducer.js +++ b/lib/reducers/create-otp-reducer.js @@ -854,7 +854,7 @@ function createOtpReducer(config) { stops: { $merge: { [action.payload.stopId]: { - fetchStatus: { $merge: FETCH_STATUS.FETCHING } + fetchStatus: FETCH_STATUS.FETCHING } } } @@ -864,11 +864,8 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - $merge: { - ...state.transitIndex.stops, - [action.payload.stopId]: { - fetchStatus: FETCH_STATUS.FETCHING - } + [action.payload.stopId]: { + fetchStatus: { $set: FETCH_STATUS.FETCHING } } } } @@ -878,7 +875,7 @@ function createOtpReducer(config) { return update(state, { transitIndex: { stops: { - [action.payload.gtfsId]: { $merge: action.payload } + [action.payload.gtfsId]: { $set: action.payload } } } }) From 21dd75b690a6924660c525c91fa01cecbb422a6d Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:30:41 -0500 Subject: [PATCH 091/119] Provide transiations for OTP-UI-stopsAndStations layer --- lib/components/map/default-map.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/components/map/default-map.tsx b/lib/components/map/default-map.tsx index 367133ac3..412dc0382 100644 --- a/lib/components/map/default-map.tsx +++ b/lib/components/map/default-map.tsx @@ -86,6 +86,8 @@ function getLayerName(overlay, config, intl) { return intl.formatMessage({ id: 'components.MapLayers.streets' }) case 'Satellite': return intl.formatMessage({ id: 'components.MapLayers.satellite' }) + case 'Stops': + return intl.formatMessage({ id: 'components.MapLayers.stops' }) default: if (name) return name } From 125ce26b896442d34a7c3bf9d9dcbce19465284b Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 8 Nov 2024 12:38:42 -0500 Subject: [PATCH 092/119] restore missing otp1 fields --- lib/components/map/connected-transit-vehicle-overlay.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/components/map/connected-transit-vehicle-overlay.js b/lib/components/map/connected-transit-vehicle-overlay.js index 0a52f1c1e..9eed2356d 100644 --- a/lib/components/map/connected-transit-vehicle-overlay.js +++ b/lib/components/map/connected-transit-vehicle-overlay.js @@ -142,6 +142,8 @@ const mapStateToProps = (state) => { vehicle.routeShortName = vehicle.routeShortName || route?.shortName vehicle.routeLongName = vehicle.routeLongName || route?.longName vehicle.textColor = route?.routeTextColor + + vehicle.lastUpdated = vehicle?.seconds return vehicle }) From ea089526fa5c5a5cb69d259d2343963e63f4dc8a Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 13 Nov 2024 14:49:20 -0500 Subject: [PATCH 093/119] chore(deps): update otp-ui --- package.json | 10 ++++----- yarn.lock | 61 +++++++++++++++++++++++++++++----------------------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index 8c7af7b2e..898bc9182 100644 --- a/package.json +++ b/package.json @@ -43,14 +43,14 @@ "@bugsnag/plugin-react": "^7.17.0", "@floating-ui/react": "^0.19.2", "@opentripplanner/base-map": "4.0.0", - "@opentripplanner/building-blocks": "2.0.0", + "@opentripplanner/building-blocks": "2.1.0", "@opentripplanner/core-utils": "12.0.1", "@opentripplanner/endpoints-overlay": "3.0.1", "@opentripplanner/from-to-location-picker": "3.0.0", "@opentripplanner/geocoder": "^3.0.2", "@opentripplanner/humanize-distance": "^1.2.0", "@opentripplanner/icons": "3.0.1", - "@opentripplanner/itinerary-body": "6.0.1", + "@opentripplanner/itinerary-body": "6.0.3", "@opentripplanner/location-field": "3.0.0", "@opentripplanner/location-icon": "^1.4.1", "@opentripplanner/map-popup": "5.1.0", @@ -60,10 +60,10 @@ "@opentripplanner/route-viewer-overlay": "3.0.0", "@opentripplanner/stop-viewer-overlay": "3.0.0", "@opentripplanner/stops-overlay": "6.0.0", - "@opentripplanner/transit-vehicle-overlay": "5.0.0", - "@opentripplanner/transitive-overlay": "4.0.0", + "@opentripplanner/transit-vehicle-overlay": "5.0.1", + "@opentripplanner/transitive-overlay": "4.0.1", "@opentripplanner/trip-details": "6.0.0", - "@opentripplanner/trip-form": "4.1.0", + "@opentripplanner/trip-form": "4.1.1", "@opentripplanner/trip-viewer-overlay": "3.0.0", "@opentripplanner/vehicle-rental-overlay": "3.0.0", "@styled-icons/fa-regular": "^10.34.0", diff --git a/yarn.lock b/yarn.lock index db8be0801..989268574 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2403,16 +2403,23 @@ maplibre-gl "^2.1.9" react-map-gl "^7.0.15" -"@opentripplanner/building-blocks@2.0.0", "@opentripplanner/building-blocks@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/building-blocks/-/building-blocks-2.0.0.tgz#8282c01dff7db5c7e809f6ea91cb52df559a2f9d" - integrity sha512-N07rDaZL8fp552eI9/0j1udKjc0uOpvO0Wv1P19Ge0a4roques463MJgWJ026fbopRCi3uwbc/gYTlh4/ske9A== +"@opentripplanner/building-blocks@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/building-blocks/-/building-blocks-2.1.0.tgz#20d688dbc7a152256f571562199981099bde7820" + integrity sha512-Vnc/W2EGybIbzXXofthGVW8HN1o5ThW1+XjWquVlKlSb2xxruWscstz9frOWlbHg239SEdTpZUuaARwMWflVaA== + dependencies: + "@styled-icons/bootstrap" "^10.47.0" "@opentripplanner/building-blocks@^1.2.2": version "1.2.3" resolved "https://registry.yarnpkg.com/@opentripplanner/building-blocks/-/building-blocks-1.2.3.tgz#404e8f9038867d66d55f51adf8855b1326c51ed5" integrity sha512-I0AxiZrTZu+e7+av4u0tHW2ijqpxH0AkLHrhf75BHf1Ep2FOGxaul/v+8UT18mNYiM5eHNstOX3XiXaDjtCUaw== +"@opentripplanner/building-blocks@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/building-blocks/-/building-blocks-2.0.0.tgz#8282c01dff7db5c7e809f6ea91cb52df559a2f9d" + integrity sha512-N07rDaZL8fp552eI9/0j1udKjc0uOpvO0Wv1P19Ge0a4roques463MJgWJ026fbopRCi3uwbc/gYTlh4/ske9A== + "@opentripplanner/core-utils@12.0.1": version "12.0.1" resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-12.0.1.tgz#2bafb78133393213b4943c76fec5d46436c0fb6d" @@ -2557,10 +2564,10 @@ "@opentripplanner/core-utils" "^11.4.4" prop-types "^15.7.2" -"@opentripplanner/itinerary-body@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-6.0.1.tgz#74139536b34083af5b324fb94e69be267ea6bbeb" - integrity sha512-6Z+ZEW28MwtteOwZZUjkPkTnYQ0Aq1lMpfKMZW7F+OD6hfKhFBUx4NLMExTffXHswXQ3faYaHScOHxpalX73UQ== +"@opentripplanner/itinerary-body@6.0.3", "@opentripplanner/itinerary-body@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-6.0.3.tgz#84573d20ac9cc1fc7f2d2e032fac5a072ac3e142" + integrity sha512-1qrH8hpR5Rr9KMGNnajI7GJyuoV+rogmyGqd5Z5DErZGp4luVzksIsnyW1IbxRslnV3bqKll+DH8lTXy4QIyZg== dependencies: "@opentripplanner/core-utils" "^12.0.0" "@opentripplanner/humanize-distance" "^1.2.0" @@ -2698,25 +2705,25 @@ "@opentripplanner/map-popup" "^4.0.0" flat "^5.0.2" -"@opentripplanner/transit-vehicle-overlay@5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/transit-vehicle-overlay/-/transit-vehicle-overlay-5.0.0.tgz#1a3ea04abce38d65a21a9eaad8c5e0ac19a41100" - integrity sha512-N0vM89xozWTbbb63pBeZEZIbdlbgnP2K0qNJZ0vk87clJU0T7RxBtq/sdftBQ6CzB86AjXCCxfitCZH9HOD7/A== +"@opentripplanner/transit-vehicle-overlay@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/transit-vehicle-overlay/-/transit-vehicle-overlay-5.0.1.tgz#500f0d3e16823d0ebafce906bb4fa2184af69e7b" + integrity sha512-kHnzjFg8yWHc9iL7jO4ST2qJuSLq+KhV52A/+Fw2YtvXYou+gDLNHMNkJGePYBFLzUnzWZjwyiCfC7AyHEYvEg== dependencies: - "@opentripplanner/base-map" "^3.2.2" - "@opentripplanner/core-utils" "^11.4.4" - "@opentripplanner/icons" "^2.0.12" + "@opentripplanner/base-map" "^4.0.0" + "@opentripplanner/core-utils" "^12.0.0" + "@opentripplanner/icons" "^3.0.0" flat "^5.0.2" -"@opentripplanner/transitive-overlay@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/transitive-overlay/-/transitive-overlay-4.0.0.tgz#1a0c41dd4a22704b74da105ef67c0ac63624c335" - integrity sha512-kFKRbKGeIKNDx2t21HaPXsOOkG+qlnHgXN8lbTZRxpfy+EIV3ZeoH72/ymWuiHdLnxUORHBAjhacQh+2fryc4A== +"@opentripplanner/transitive-overlay@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/transitive-overlay/-/transitive-overlay-4.0.1.tgz#37efb8c4a7356b28ddb31a8c6fbde4aa54dfe8bc" + integrity sha512-EUTBvO33c/qKznjEukWvUlj0Nyl7AjtdraNjJuFsybqKY+KWcxZdJYgDLkBARyV5RnU9ES6eaCQlqjVdLOe1sA== dependencies: "@mapbox/polyline" "^1.1.1" - "@opentripplanner/base-map" "^3.2.2" - "@opentripplanner/core-utils" "^11.4.4" - "@opentripplanner/itinerary-body" "^5.3.6" + "@opentripplanner/base-map" "^4.0.0" + "@opentripplanner/core-utils" "^12.0.0" + "@opentripplanner/itinerary-body" "^6.0.0" "@turf/bbox" "^6.5.0" "@turf/bearing" "^6.5.0" "@turf/destination" "^6.5.0" @@ -2735,10 +2742,10 @@ flat "^5.0.2" react-animate-height "^3.0.4" -"@opentripplanner/trip-form@4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/trip-form/-/trip-form-4.1.0.tgz#83bd7135d1c814f1ea0be4f6896dd2494c9ddba9" - integrity sha512-VOWoyAfnnmwNnsolYLk7vfXRQvF3rj2XW5pXJ+OKwplGTgOhxJGNMKjZxau4legRedauyf0MHBNRpD3M3vsqRg== +"@opentripplanner/trip-form@4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/trip-form/-/trip-form-4.1.1.tgz#892b3b5f8b32dae5dc3f85bc1d6e9c26342b7cf8" + integrity sha512-+q9HnQDgV1wNu2qA7jFYFLbRXRlvrV4DE1RNUND87s8yd1qAxuoB/SSX/QF+wX9/gsugOKDMIC7PMdyBgoUPIA== dependencies: "@floating-ui/react" "^0.19.2" "@opentripplanner/building-blocks" "^2.0.0" @@ -3160,7 +3167,7 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@styled-icons/bootstrap@^10.34.0": +"@styled-icons/bootstrap@^10.34.0", "@styled-icons/bootstrap@^10.47.0": version "10.47.0" resolved "https://registry.yarnpkg.com/@styled-icons/bootstrap/-/bootstrap-10.47.0.tgz#c3e363dfe87b732a5da818f320f90f5ab4961b84" integrity sha512-xpnPdrLhAhpTRE4iljQIEK73twVj7VPglwHSL+8nQdH7EsW5RJIOWsmlkZMyqhQHN0H7fGmT10F3/6OQhSpfGg== From 44fb4b609ff613ec2c471ef1edcde561744552c2 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:31:41 -0500 Subject: [PATCH 094/119] chore(i18n): Add FR text --- i18n/fr.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/i18n/fr.yml b/i18n/fr.yml index a1b42e3f6..9719c7b86 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -57,6 +57,7 @@ actions: Le message de vérification de votre adresse e-mail a été envoyé de nouveau. genericError: "Une erreur s'est produite : {err}" + getDependentUserInfoFailed: Erreur lors de l'obtention des profils de mobilité. itineraryExistenceCheckFailed: Erreur lors de la vérification de la validité du trajet choisi. mustAcceptTermsToSavePlace: >- Veuillez accepter les conditions d'utilisation (dans Mon compte) pour @@ -353,10 +354,16 @@ components: header: Profil mobilité mobilityDevices: "Appareils d'aide : " mobilityLimitations: "Handicaps moteurs : " + planTripDescription: >- + Vous pouvez rechercher des trajets adaptés au profil mobilité des + personnes que vous accompagnez. Pour ajouter des personnes + accompagnatrices, allez dans Préférences. visionLimitations: "Handicaps visuels : " + dropdownLabel: "Profil à utiliser :" intro: >- Veuillez répondre a quelques questions pour personaliser vos recherches de trajets selon vos besoins et préférences. + myself: Moi-même title: Spécifiez votre profil de mobilité NarrativeItinerariesHeader: changeSortDir: Changer l'ordre de tri From 736d2d0439bb28df83b503f4a472a55a04dc38d7 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:58:06 -0600 Subject: [PATCH 095/119] address pr feedback --- i18n/en-US.yml | 3 +- .../form/advanced-settings-panel.tsx | 91 +++++++++---------- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index c44db0bd3..f8de813f1 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -339,8 +339,7 @@ components: mobilityLimitations: "Mobility limitations: " planTripDescription: >- If you have a travel companion, you can choose to plan this trip - according to their mobility profile. To add travel companions, visit - your account settings. + according to their mobility profile. visionLimitations: "Vision limitations: " dropdownLabel: "User mobility profile:" intro: >- diff --git a/lib/components/form/advanced-settings-panel.tsx b/lib/components/form/advanced-settings-panel.tsx index 3f3f7b1a4..90281e16d 100644 --- a/lib/components/form/advanced-settings-panel.tsx +++ b/lib/components/form/advanced-settings-panel.tsx @@ -81,11 +81,17 @@ const HeaderContainer = styled.div` height: 30px; ` -const Subheader = styled.h2<{ invisible?: boolean }>` - ${(props) => - props.invisible !== false - ? invisibleCss - : 'display: block; font-size: 18px; font-weight: 700; height: auto; margin: 1em 0; position: static; width: auto;'} +const InvisibleSubheader = styled.h2` + ${invisibleCss} +` +const VisibleSubheader = styled.h2` + display: block; + font-size: 18px; + font-weight: 700; + height: auto; + margin: 1em 0; + position: static; + width: auto; ` const ReturnToTripPlanButton = styled.button` align-items: center; @@ -161,7 +167,7 @@ const AdvancedSettingsPanel = ({ getDependentUserInfo: (userIds: string[], intl: IntlShape) => void handlePlanTrip: () => void innerRef: RefObject - loggedInUser?: User | null + loggedInUser?: User mobilityProfile: boolean modeButtonOptions: ModeButtonDefinition[] modeSettingDefinitions: ModeSetting[] @@ -286,53 +292,42 @@ const AdvancedSettingsPanel = ({ {processedGlobalSettings.length > 0 && ( <> - + - + {globalSettingsComponents} )} - {loggedInUser && - loggedInUser.dependentsInfo && - loggedInUser.dependentsInfo.length > 0 && ( - - - - - ( - - {linkText} - - ) - }} - /> - ({ - text: user.name || user.email, - value: user.mobilityMode || '' - })) || []) - ]} - value={selectedMobilityProfile} - /> - - )} + {loggedInUser?.dependentsInfo?.length && ( + + + + + + ({ + text: user.name || user.email, + value: user.mobilityMode || '' + })) || []) + ]} + value={selectedMobilityProfile} + /> + + )} { })?.modeButtons?.filter((mb): mb is string => mb !== null) || modes?.initialState?.enabledModeButtons || [], - loggedInUser: state.user.loggedInUser || null, + loggedInUser: state.user.loggedInUser, mobilityProfile: state.otp.config?.mobilityProfile || false, modeButtonOptions: modes?.modeButtons || [], modeSettingDefinitions: state.otp?.modeSettingDefinitions || [], From 7e5e75c4d486cb619f44ec4bd5f8841c6232c255 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Fri, 22 Nov 2024 11:01:03 -0600 Subject: [PATCH 096/119] fix(i18n): remove extra space --- i18n/en-US.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/en-US.yml b/i18n/en-US.yml index f8de813f1..624b54064 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -339,7 +339,7 @@ components: mobilityLimitations: "Mobility limitations: " planTripDescription: >- If you have a travel companion, you can choose to plan this trip - according to their mobility profile. + according to their mobility profile. visionLimitations: "Vision limitations: " dropdownLabel: "User mobility profile:" intro: >- From 05a28452d8419625853ec7d7c74aaef33ed6660d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 22 Nov 2024 20:04:21 +0000 Subject: [PATCH 097/119] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: OTP-react-redux/OTP-RR Main UI Translate-URL: https://hosted.weblate.org/projects/otp-react-redux/otp-rr-main-ui/ --- i18n/nb_NO.yml | 1 - i18n/ru.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/i18n/nb_NO.yml b/i18n/nb_NO.yml index f65100277..a3c25a12f 100644 --- a/i18n/nb_NO.yml +++ b/i18n/nb_NO.yml @@ -104,7 +104,6 @@ components: requestNewCode: Forespør ny kode sendVerificationText: Send bekreftelsestekst verificationCode: Bekreftelseskode - verified: Bekreftet verify: Bekreft Place: deleteThisPlace: Slett dette stedet diff --git a/i18n/ru.yml b/i18n/ru.yml index 09ee5e6f6..9e8f20b2f 100644 --- a/i18n/ru.yml +++ b/i18n/ru.yml @@ -402,7 +402,6 @@ components: verificationInstructions: "Откройте приложение для обмена SMS на телефоне и найдите текстовое сообщение с кодом подтверждения. Затем введите код ниже (срок действия кода: 10 минут).\n" - verified: Подтверждено verify: Подтвердить Place: deleteThisPlace: Удалить это место From fd6dafb08eba446dfb7a41a11ab385fae2221001 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:54:40 -0600 Subject: [PATCH 098/119] Only call stopTimes if we don't already have the data --- lib/actions/apiV2.js | 7 +++++++ lib/components/viewers/stop-schedule-viewer.tsx | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index e7deb84e3..626243897 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -505,6 +505,13 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { export const findStopTimesForStop = (params) => function (dispatch, getState) { + // If the stop is already in the store, don't fetch it again, unless we are forcing a refetch + if ( + !params.forceFetch && + getState().otp.transitIndex.stops[params.stopId] + ) { + return + } dispatch(fetchingStopTimesForStop(params)) const { date, stopId } = params const timeZone = getState().otp.config.homeTimezone diff --git a/lib/components/viewers/stop-schedule-viewer.tsx b/lib/components/viewers/stop-schedule-viewer.tsx index 51f85c967..8b62234c8 100644 --- a/lib/components/viewers/stop-schedule-viewer.tsx +++ b/lib/components/viewers/stop-schedule-viewer.tsx @@ -33,7 +33,11 @@ import TimezoneWarning from './timezone-warning' interface Props { calendarMax: string calendarMin: string - findStopTimesForStop: (arg: { date: string; stopId: string }) => void + findStopTimesForStop: (arg: { + date: string + forceFetch?: boolean + stopId: string + }) => void hideBackButton?: boolean homeTimezone: string intl: IntlShape @@ -137,7 +141,7 @@ class StopScheduleViewer extends Component { _findStopTimesForDate = (date: string) => { const { findStopTimesForStop, stopId } = this.props if (stopId) { - findStopTimesForStop({ date, stopId }) + findStopTimesForStop({ date, forceFetch: true, stopId }) } } From 20047af21b3835b311c83123222f0104821e4195 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Tue, 26 Nov 2024 18:06:31 -0600 Subject: [PATCH 099/119] feat: add network connection status to ui and redux --- i18n/en-US.yml | 2 + lib/actions/ui.js | 3 + lib/components/app/desktop-nav.tsx | 8 ++ .../app/network-connection-banner.tsx | 78 +++++++++++++++++++ lib/components/app/responsive-webapp.js | 6 +- lib/components/mobile/navigation-bar.js | 9 ++- lib/reducers/create-otp-reducer.js | 12 +++ 7 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 lib/components/app/network-connection-banner.tsx diff --git a/i18n/en-US.yml b/i18n/en-US.yml index e3f9c8025..9bb360c76 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -183,6 +183,8 @@ components: closeMenu: Close Menu fieldTrip: Field Trip mailables: Mailables + networkConnectionLost: Network connection lost + networkConnectionRestored: Network connection restored openMenu: Open Menu skipNavigation: Skip navigation BackToTripPlanner: diff --git a/lib/actions/ui.js b/lib/actions/ui.js index cdd0691da..a548a43bc 100644 --- a/lib/actions/ui.js +++ b/lib/actions/ui.js @@ -47,6 +47,9 @@ const viewRoute = createAction('SET_VIEWED_ROUTE') export const toggleAutoRefresh = createAction('TOGGLE_AUTO_REFRESH') const settingItineraryView = createAction('SET_ITINERARY_VIEW') export const setPopupContent = createAction('SET_POPUP_CONTENT') +export const setNetworkConnectionLost = createAction( + 'SET_NETWORK_CONNECTION_LOST' +) // This code-less action calls the reducer code // and thus resets the session timeout. diff --git a/lib/components/app/desktop-nav.tsx b/lib/components/app/desktop-nav.tsx index f9a265b86..ef692d88c 100644 --- a/lib/components/app/desktop-nav.tsx +++ b/lib/components/app/desktop-nav.tsx @@ -13,6 +13,7 @@ import { DEFAULT_APP_TITLE } from '../../util/constants' import InvisibleA11yLabel from '../util/invisible-a11y-label' import NavLoginButtonAuth0 from '../user/nav-login-button-auth0' +import { NetworkConnectionBanner } from './network-connection-banner' import AppMenu, { Icon } from './app-menu' import LocaleSelector from './locale-selector' import NavbarItem from './nav-item' @@ -63,6 +64,7 @@ const NavItemOnLargeScreens = styled(NavbarItem)` // Typscript TODO: otpConfig type export type Props = { locale: string + networkConnectionLost: boolean otpConfig: AppConfig popupTarget?: string setPopupContent: (url: string) => void @@ -83,6 +85,7 @@ export type Props = { */ const DesktopNav = ({ locale, + networkConnectionLost, otpConfig, popupTarget, setPopupContent @@ -117,6 +120,8 @@ const DesktopNav = ({ id: `config.popups.${popupTarget}` }) + console.log(networkConnectionLost) + return (
@@ -166,6 +171,7 @@ const DesktopNav = ({ +
) } @@ -173,8 +179,10 @@ const DesktopNav = ({ // connect to the redux store const mapStateToProps = (state: AppReduxState) => { const { config: otpConfig } = state.otp + const { networkConnectionLost } = state.otp.ui.errors return { locale: state.otp.ui.locale, + networkConnectionLost, otpConfig, popupTarget: otpConfig.popups?.launchers?.toolbar } diff --git a/lib/components/app/network-connection-banner.tsx b/lib/components/app/network-connection-banner.tsx new file mode 100644 index 000000000..9ea7de51b --- /dev/null +++ b/lib/components/app/network-connection-banner.tsx @@ -0,0 +1,78 @@ +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { FormattedMessage } from 'react-intl' +import React, { useRef } from 'react' +import styled from 'styled-components' + +import { RED_ON_WHITE } from '../util/colors' + +const containerClassname = 'network-connection-banner' +const timeout = 200 + +const TransitionStyles = styled.div` + .${containerClassname} { + background: ${RED_ON_WHITE}; + border-left: 1px solid #e7e7e7; + border-right: 1px solid #e7e7e7; + color: #fff; + font-weight: 600; + padding: 5px; + position: absolute; + text-align: center; + top: 50px; + width: 100%; + z-index: 1; + } + .${containerClassname}-enter { + opacity: 0; + transform: translateY(-100%); + } + .${containerClassname}-enter-active { + opacity: 1; + transform: translateY(0); + transition: opacity ${timeout}ms ease-in; + } + .${containerClassname}-exit { + opacity: 1; + transform: translateY(0); + } + .${containerClassname}-exit-active { + opacity: 0; + transform: translateY(-100%); + transition: opacity ${timeout}ms ease-in, transform ${timeout}ms ease-in; + } +` +export const NetworkConnectionLostBanner = styled.div`` + +export const NetworkConnectionBanner = ({ + networkConnectionLost +}: { + networkConnectionLost: boolean +}): JSX.Element => { + const connectionLostBannerRef = useRef(null) + return ( + + + {networkConnectionLost && ( + + + {networkConnectionLost ? ( + + ) : ( + + )} + + + )} + + + ) +} diff --git a/lib/components/app/responsive-webapp.js b/lib/components/app/responsive-webapp.js index 2b2a44dfc..15e5d4a22 100644 --- a/lib/components/app/responsive-webapp.js +++ b/lib/components/app/responsive-webapp.js @@ -154,10 +154,13 @@ class ResponsiveWebapp extends Component { map, matchContentToUrl, parseUrlQueryString, - receivedPositionResponse + receivedPositionResponse, + setNetworkConnectionLost } = this.props // Add on back button press behavior. window.addEventListener('popstate', handleBackButtonPress) + window.addEventListener('online', () => setNetworkConnectionLost(false)) + window.addEventListener('offline', () => setNetworkConnectionLost(true)) // If a URL is detected without hash routing (e.g., http://localhost:9966?sessionId=test), // window.location.search will have a value. In this case, we need to redirect to the URL root with the @@ -441,6 +444,7 @@ const mapStateToWrapperProps = (state) => { const mapWrapperDispatchToProps = { processSignIn: authActions.processSignIn, setLocale: uiActions.setLocale, + setNetworkConnectionLost: uiActions.setNetworkConnectionLost, showAccessTokenError: authActions.showAccessTokenError, showLoginError: authActions.showLoginError } diff --git a/lib/components/mobile/navigation-bar.js b/lib/components/mobile/navigation-bar.js index 4426a244c..eaa071f3d 100644 --- a/lib/components/mobile/navigation-bar.js +++ b/lib/components/mobile/navigation-bar.js @@ -9,6 +9,7 @@ import * as uiActions from '../../actions/ui' import { accountLinks, getAuth0Config } from '../../util/auth' import { ComponentContext } from '../../util/contexts' import { injectIntl } from 'react-intl' +import { NetworkConnectionBanner } from '../app/network-connection-banner' import { StyledIconWrapper } from '../util/styledIcon' import AppMenu from '../app/app-menu' import LocaleSelector from '../app/locale-selector' @@ -32,6 +33,7 @@ class MobileNavigationBar extends Component { headerText: PropTypes.string, intl: PropTypes.object, locale: PropTypes.string, + networkConnectionLost: PropTypes.bool, onBackClicked: PropTypes.func, setMobileScreen: PropTypes.func, showBackButton: PropTypes.bool @@ -55,6 +57,7 @@ class MobileNavigationBar extends Component { headerText, intl, locale, + networkConnectionLost, showBackButton } = this.props @@ -111,6 +114,9 @@ class MobileNavigationBar extends Component { )} + ) } @@ -123,7 +129,8 @@ const mapStateToProps = (state) => { auth0Config: getAuth0Config(state.otp.config.persistence), configLanguages: state.otp.config.language, extraMenuItems: state.otp?.config?.extraMenuItems, - locale: state.otp.ui.locale + locale: state.otp.ui.locale, + networkConnectionLost: state.otp.ui.errors.networkConnectionLost } } diff --git a/lib/reducers/create-otp-reducer.js b/lib/reducers/create-otp-reducer.js index e753c466c..0028f5095 100644 --- a/lib/reducers/create-otp-reducer.js +++ b/lib/reducers/create-otp-reducer.js @@ -225,6 +225,9 @@ export function getInitialState(userDefinedConfig) { }, ui: { diagramLeg: null, + errors: { + networkConnectionLost: !navigator.onLine + }, locale: null, localizedMessages: null, mainPanelContent: null, @@ -1108,6 +1111,15 @@ function createOtpReducer(config) { } } }) + case 'SET_NETWORK_CONNECTION_LOST': + console.log(action.payload) + return update(state, { + ui: { + errors: { + networkConnectionLost: { $set: action.payload } + } + } + }) case 'SERVICE_TIME_RANGE_REQUEST': return update(state, { serviceTimeRange: { $set: { pending: true } } From 7e30272c8f0a0cc575ce089ea7ee1f098bc78d16 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:22:26 -0600 Subject: [PATCH 100/119] remove unnecessary brackets in return --- lib/actions/apiV2.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js index 626243897..9438d5e3d 100644 --- a/lib/actions/apiV2.js +++ b/lib/actions/apiV2.js @@ -506,12 +506,9 @@ export const fetchNearby = (position, radius, currentServiceWeek) => { export const findStopTimesForStop = (params) => function (dispatch, getState) { // If the stop is already in the store, don't fetch it again, unless we are forcing a refetch - if ( - !params.forceFetch && - getState().otp.transitIndex.stops[params.stopId] - ) { + if (!params.forceFetch && getState().otp.transitIndex.stops[params.stopId]) return - } + dispatch(fetchingStopTimesForStop(params)) const { date, stopId } = params const timeZone = getState().otp.config.homeTimezone From de5f4790cc9b087675d6956ca99d973f2f42d264 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 2 Dec 2024 12:11:26 -0600 Subject: [PATCH 101/119] fix(responsive-webapp): prevent error in safari positioning --- lib/components/app/responsive-webapp.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/components/app/responsive-webapp.js b/lib/components/app/responsive-webapp.js index 2b2a44dfc..71e5238f1 100644 --- a/lib/components/app/responsive-webapp.js +++ b/lib/components/app/responsive-webapp.js @@ -180,10 +180,7 @@ class ResponsiveWebapp extends Component { navigator.geolocation.watchPosition( // On success (position) => { - // This object cloning is required to be allowed to read the position info twice - // on webkit browsers. - // See https://github.com/opentripplanner/otp-react-redux/pull/697 for details - receivedPositionResponse({ position: { ...position } }) + receivedPositionResponse({ position }) }, // On error (error) => { From 3fcf0592f4358959139a0c497707064f3f309c61 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 2 Dec 2024 13:17:10 -0600 Subject: [PATCH 102/119] tweak styling and create status region --- lib/components/app/app.css | 3 +++ lib/components/app/desktop-nav.tsx | 11 ++++++++--- .../app/network-connection-banner.tsx | 19 +++++++++++-------- lib/components/mobile/batch-search-screen.tsx | 5 +++-- lib/reducers/create-otp-reducer.js | 1 - 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/components/app/app.css b/lib/components/app/app.css index 87fe44222..e5d39188a 100644 --- a/lib/components/app/app.css +++ b/lib/components/app/app.css @@ -108,6 +108,9 @@ height: 100%; width: 100%; } +.otp .navbar { + z-index: 25; +} /** These changes kick in when the map is hidden. These rules ensure that the entire "sidebar" (which at this point fills the entire screen) scrolls as a single unit. diff --git a/lib/components/app/desktop-nav.tsx b/lib/components/app/desktop-nav.tsx index ef692d88c..a92cd9df5 100644 --- a/lib/components/app/desktop-nav.tsx +++ b/lib/components/app/desktop-nav.tsx @@ -1,7 +1,7 @@ import { connect } from 'react-redux' +import { FormattedMessage, useIntl } from 'react-intl' import { isMobile } from '@opentripplanner/core-utils/lib/ui' import { Nav, Navbar } from 'react-bootstrap' -import { useIntl } from 'react-intl' import React from 'react' import styled from 'styled-components' @@ -120,8 +120,6 @@ const DesktopNav = ({ id: `config.popups.${popupTarget}` }) - console.log(networkConnectionLost) - return (
@@ -171,6 +169,13 @@ const DesktopNav = ({ + + {networkConnectionLost ? ( + + ) : ( + + )} +
) diff --git a/lib/components/app/network-connection-banner.tsx b/lib/components/app/network-connection-banner.tsx index 9ea7de51b..50c4924a0 100644 --- a/lib/components/app/network-connection-banner.tsx +++ b/lib/components/app/network-connection-banner.tsx @@ -6,7 +6,7 @@ import styled from 'styled-components' import { RED_ON_WHITE } from '../util/colors' const containerClassname = 'network-connection-banner' -const timeout = 200 +const timeout = 250 const TransitionStyles = styled.div` .${containerClassname} { @@ -20,7 +20,12 @@ const TransitionStyles = styled.div` text-align: center; top: 50px; width: 100%; - z-index: 1; + // When banner is fully loaded, set z-index higher than nav so we're not seeing the nav border. + z-index: 26; + + @media (max-width: 768px) { + border: 0; + } } .${containerClassname}-enter { opacity: 0; @@ -34,11 +39,13 @@ const TransitionStyles = styled.div` .${containerClassname}-exit { opacity: 1; transform: translateY(0); + z-index: 20; } .${containerClassname}-exit-active { opacity: 0; transform: translateY(-100%); transition: opacity ${timeout}ms ease-in, transform ${timeout}ms ease-in; + z-index: 20; } ` export const NetworkConnectionLostBanner = styled.div`` @@ -62,13 +69,9 @@ export const NetworkConnectionBanner = ({ aria-live="assertive" className={containerClassname} ref={connectionLostBannerRef} - role="status" + role="alert" > - {networkConnectionLost ? ( - - ) : ( - - )} + )} diff --git a/lib/components/mobile/batch-search-screen.tsx b/lib/components/mobile/batch-search-screen.tsx index 5be2cc8c7..04e2a850c 100644 --- a/lib/components/mobile/batch-search-screen.tsx +++ b/lib/components/mobile/batch-search-screen.tsx @@ -40,8 +40,9 @@ const MobileSearchSettings = styled.div<{ top: 50px; transition: ${(props) => `all ${props.transitionDuration}ms ease`}; transition-delay: ${(props) => props.transitionDelay}ms; - /* Must appear under the 'hamburger' dropdown which has z-index of 1000. */ - z-index: 999; + /* Must appear under the 'hamburger' dropdown which has z-index of 1000, and the "network lost" + banner which has a z-index of 10 */ + z-index: 9; ` interface Props { diff --git a/lib/reducers/create-otp-reducer.js b/lib/reducers/create-otp-reducer.js index 0028f5095..9d66ab43b 100644 --- a/lib/reducers/create-otp-reducer.js +++ b/lib/reducers/create-otp-reducer.js @@ -1112,7 +1112,6 @@ function createOtpReducer(config) { } }) case 'SET_NETWORK_CONNECTION_LOST': - console.log(action.payload) return update(state, { ui: { errors: { From f8141fd46567593e7a9848524a67584ae00e03ac Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 2 Dec 2024 13:23:40 -0600 Subject: [PATCH 103/119] Add status region to mobile --- lib/components/mobile/navigation-bar.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/components/mobile/navigation-bar.js b/lib/components/mobile/navigation-bar.js index eaa071f3d..555690226 100644 --- a/lib/components/mobile/navigation-bar.js +++ b/lib/components/mobile/navigation-bar.js @@ -1,5 +1,6 @@ import { ArrowLeft } from '@styled-icons/fa-solid/ArrowLeft' import { connect } from 'react-redux' +import { FormattedMessage, injectIntl } from 'react-intl' import { Navbar } from 'react-bootstrap' import PropTypes from 'prop-types' import React, { Component } from 'react' @@ -8,10 +9,10 @@ import styled from 'styled-components' import * as uiActions from '../../actions/ui' import { accountLinks, getAuth0Config } from '../../util/auth' import { ComponentContext } from '../../util/contexts' -import { injectIntl } from 'react-intl' import { NetworkConnectionBanner } from '../app/network-connection-banner' import { StyledIconWrapper } from '../util/styledIcon' import AppMenu from '../app/app-menu' +import InvisibleA11yLabel from '../util/invisible-a11y-label' import LocaleSelector from '../app/locale-selector' import NavLoginButtonAuth0 from '../../components/user/nav-login-button-auth0' import PageTitle from '../util/page-title' @@ -114,6 +115,13 @@ class MobileNavigationBar extends Component { )} + + {networkConnectionLost ? ( + + ) : ( + + )} + From 27bd54808ed4c227f05889329017eaff7d24fa39 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 2 Dec 2024 13:35:53 -0600 Subject: [PATCH 104/119] consolidate network connection status regions into one --- lib/components/app/desktop-nav.tsx | 9 +-------- .../app/network-connection-banner.tsx | 18 ++++++++++-------- lib/components/mobile/navigation-bar.js | 10 +--------- 3 files changed, 12 insertions(+), 25 deletions(-) diff --git a/lib/components/app/desktop-nav.tsx b/lib/components/app/desktop-nav.tsx index a92cd9df5..43b4ca919 100644 --- a/lib/components/app/desktop-nav.tsx +++ b/lib/components/app/desktop-nav.tsx @@ -1,7 +1,7 @@ import { connect } from 'react-redux' -import { FormattedMessage, useIntl } from 'react-intl' import { isMobile } from '@opentripplanner/core-utils/lib/ui' import { Nav, Navbar } from 'react-bootstrap' +import { useIntl } from 'react-intl' import React from 'react' import styled from 'styled-components' @@ -169,13 +169,6 @@ const DesktopNav = ({ - - {networkConnectionLost ? ( - - ) : ( - - )} - ) diff --git a/lib/components/app/network-connection-banner.tsx b/lib/components/app/network-connection-banner.tsx index 50c4924a0..a323520ac 100644 --- a/lib/components/app/network-connection-banner.tsx +++ b/lib/components/app/network-connection-banner.tsx @@ -4,6 +4,7 @@ import React, { useRef } from 'react' import styled from 'styled-components' import { RED_ON_WHITE } from '../util/colors' +import InvisibleA11yLabel from '../util/invisible-a11y-label' const containerClassname = 'network-connection-banner' const timeout = 250 @@ -48,7 +49,6 @@ const TransitionStyles = styled.div` z-index: 20; } ` -export const NetworkConnectionLostBanner = styled.div`` export const NetworkConnectionBanner = ({ networkConnectionLost @@ -58,6 +58,13 @@ export const NetworkConnectionBanner = ({ const connectionLostBannerRef = useRef(null) return ( + + {networkConnectionLost ? ( + + ) : ( + + )} + {networkConnectionLost && ( - +
- +
)}
diff --git a/lib/components/mobile/navigation-bar.js b/lib/components/mobile/navigation-bar.js index 555690226..1e7b0079c 100644 --- a/lib/components/mobile/navigation-bar.js +++ b/lib/components/mobile/navigation-bar.js @@ -1,6 +1,6 @@ import { ArrowLeft } from '@styled-icons/fa-solid/ArrowLeft' import { connect } from 'react-redux' -import { FormattedMessage, injectIntl } from 'react-intl' +import { injectIntl } from 'react-intl' import { Navbar } from 'react-bootstrap' import PropTypes from 'prop-types' import React, { Component } from 'react' @@ -12,7 +12,6 @@ import { ComponentContext } from '../../util/contexts' import { NetworkConnectionBanner } from '../app/network-connection-banner' import { StyledIconWrapper } from '../util/styledIcon' import AppMenu from '../app/app-menu' -import InvisibleA11yLabel from '../util/invisible-a11y-label' import LocaleSelector from '../app/locale-selector' import NavLoginButtonAuth0 from '../../components/user/nav-login-button-auth0' import PageTitle from '../util/page-title' @@ -115,13 +114,6 @@ class MobileNavigationBar extends Component { )} - - {networkConnectionLost ? ( - - ) : ( - - )} - From 9ab8492883568a17ff85a727b3718395daa2d008 Mon Sep 17 00:00:00 2001 From: amy-corson-ibigroup <115499534+amy-corson-ibigroup@users.noreply.github.com> Date: Mon, 2 Dec 2024 13:56:45 -0600 Subject: [PATCH 105/119] French translations for network connection strings --- i18n/fr.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i18n/fr.yml b/i18n/fr.yml index a8283e9f1..b7bddef7a 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -194,6 +194,8 @@ components: closeMenu: Fermer le menu fieldTrip: Groupes scolaires mailables: Prêt-à-poster + networkConnectionLost: Erreur de connexion réseau + networkConnectionRestored: Connexion réseau restaurée openMenu: Ouvrir le menu skipNavigation: Sauter la navigation BackToTripPlanner: From b276b6ba761d5ef449abb064ed39626a609bd953 Mon Sep 17 00:00:00 2001 From: josh-willis-arcadis <168561922+josh-willis-arcadis@users.noreply.github.com> Date: Tue, 3 Dec 2024 11:38:19 -0600 Subject: [PATCH 106/119] fix(trip-basics-pane): remove ability to select days that the trip isn't available --- lib/components/user/monitored-trip/trip-basics-pane.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/components/user/monitored-trip/trip-basics-pane.tsx b/lib/components/user/monitored-trip/trip-basics-pane.tsx index dafafcd00..e3685dcec 100644 --- a/lib/components/user/monitored-trip/trip-basics-pane.tsx +++ b/lib/components/user/monitored-trip/trip-basics-pane.tsx @@ -180,9 +180,8 @@ const RenderAvailableDays = ({ title={notAvailableText} > Date: Tue, 3 Dec 2024 14:01:29 -0500 Subject: [PATCH 107/119] swap ok and cancel --- lib/actions/field-trip.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/actions/field-trip.js b/lib/actions/field-trip.js index 0b667dbf1..6a464d17d 100644 --- a/lib/actions/field-trip.js +++ b/lib/actions/field-trip.js @@ -534,8 +534,8 @@ function prepareQueryParams(request, outbound) { const hasExistingLocations = currentQuery.from || currentQuery.to const locations = !hasExistingLocations || - window.confirm( - 'Use custom set locations? Pressing "Cancel" will use the locations you have typed in. Pressing "OK" will use the locations currently saved to the field trip' + !window.confirm( + 'Use custom set locations? Pressing "OK" will use the locations you have typed in. Pressing "Cancel" will use the locations currently saved to the field trip' ) ? await planParamsToQueryAsync(locationsToGeocode, config) : { from: currentQuery.from, to: currentQuery.to } From 1cb40bcf385b83162ee679da47a697808ed5ae4c Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 3 Dec 2024 14:15:08 -0500 Subject: [PATCH 108/119] reset search fields on closing field trip --- lib/actions/field-trip.js | 3 +++ lib/components/admin/field-trip-list.js | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/actions/field-trip.js b/lib/actions/field-trip.js index 6a464d17d..dafa74ebc 100644 --- a/lib/actions/field-trip.js +++ b/lib/actions/field-trip.js @@ -33,6 +33,7 @@ import { setPendingRequests, updateOtpUrlParams } from './api' +import { setLocation } from './map' import { toggleCallHistory } from './call-taker' if (typeof fetch === 'undefined') require('isomorphic-fetch') @@ -1078,6 +1079,8 @@ export function clearActiveFieldTrip() { return function (dispatch) { dispatch(setActiveFieldTrip(null)) dispatch(clearActiveSearch()) + dispatch(setLocation({ location: null, locationType: 'from' })) + dispatch(setLocation({ location: null, locationType: 'to' })) dispatch(setQueryParam({ numItineraries: undefined })) dispatch(clearSaveable()) } diff --git a/lib/components/admin/field-trip-list.js b/lib/components/admin/field-trip-list.js index f74dbe841..29728d403 100644 --- a/lib/components/admin/field-trip-list.js +++ b/lib/components/admin/field-trip-list.js @@ -129,7 +129,7 @@ class FieldTripList extends Component { } _onCloseActiveFieldTrip = () => { - this.props.setActiveFieldTrip(null) + this.props.clearActiveFieldTrip() } _getReportUrl = () => { @@ -268,6 +268,7 @@ const mapStateToProps = (state) => { } const mapDispatchToProps = { + clearActiveFieldTrip: fieldTripActions.clearActiveFieldTrip, fetchFieldTripDetails: fieldTripActions.fetchFieldTripDetails, fetchFieldTrips: fieldTripActions.fetchFieldTrips, setActiveFieldTrip: fieldTripActions.setActiveFieldTrip, From 07c40a3dd165abce703de463a131451d4b031506 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 3 Dec 2024 14:16:55 -0500 Subject: [PATCH 109/119] add add place button class --- lib/components/form/add-place-button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/form/add-place-button.tsx b/lib/components/form/add-place-button.tsx index 5cecd5d11..ce585331b 100644 --- a/lib/components/form/add-place-button.tsx +++ b/lib/components/form/add-place-button.tsx @@ -22,7 +22,7 @@ const AddPlaceButton = ({ const disabled = !from || !to || maxPlacesDefined return (