diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index cfc31658b..b1568432d 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -15,4 +15,4 @@ jobs: # skip git, yarn, pixel test script and HAR file, and all i18n resources. # Also, the a11y test file has a false positive and the ignore list does not work # see https://github.com/opentripplanner/otp-react-redux/pull/436/checks?check_run_id=3369380014 - skip: ./.git,yarn.lock,./a11y/a11y.test.js,./a11y/mocks,./percy/percy.test.js,./percy/mock.har,./i18n,./__tests__/mocks + skip: ./.git,yarn.lock,./a11y/a11y.test.js,./a11y/mocks,./percy/percy.test.js,./percy/mock.har,./i18n,./__tests__/mocks,otpSchema.json,./percy/mocks/*.json diff --git a/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap b/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap index 4cf2c86dd..11a00e14f 100644 --- a/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap +++ b/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap @@ -1496,7 +1496,7 @@ exports[`components > viewers > stop viewer should render countdown times after className="next-trip-preview" >
  • - viewers > stop viewer should render countdown times after } } > -
    - +
    - viewers > stop viewer should render countdown times after } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times after iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - + + + + + + + + - - common.time.tripDurationFormat - - - -
    - + + common.time.tripDurationFormat + + + +
    +
    +
  • - viewers > stop viewer should render countdown times after } } > -
    - +
    - viewers > stop viewer should render countdown times after } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times after iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 1:52 AM - - - -
    - + + 1:52 AM + + + +
    +
    +
  • - viewers > stop viewer should render countdown times after } } > -
    - +
    - viewers > stop viewer should render countdown times after } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times after iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 2:53 AM - - - -
    - + + 2:53 AM + + + +
    +
    +
  • @@ -3981,7 +4056,7 @@ exports[`components > viewers > stop viewer should render countdown times for st className="next-trip-preview" >
  • - viewers > stop viewer should render countdown times for st } } > -
    - +
    - viewers > stop viewer should render countdown times for st } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times for st iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - + + + + + + + + - - common.time.tripDurationFormat - - - -
    - + + common.time.tripDurationFormat + + + +
    +
    +
  • @@ -6117,7 +6217,7 @@ exports[`components > viewers > stop viewer should render times after midnight w className="next-trip-preview" >
  • - viewers > stop viewer should render times after midnight w } } > -
    - +
    - viewers > stop viewer should render times after midnight w } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render times after midnight w iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 12:51 AM - - - -
    - + + 12:51 AM + + + +
    +
    +
  • - viewers > stop viewer should render times after midnight w } } > -
    - +
    - viewers > stop viewer should render times after midnight w } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render times after midnight w iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 1:52 AM - - - -
    - + + 1:52 AM + + + +
    +
    +
  • - viewers > stop viewer should render times after midnight w } } > -
    - +
    - viewers > stop viewer should render times after midnight w } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render times after midnight w iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 2:53 AM - - - -
    - + + 2:53 AM + + + +
    +
    +
  • @@ -9736,7 +9911,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:00 PM - - - -
    - + + 6:00 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:15 PM - - - -
    - + + 6:15 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:31 PM - - - -
    - + + 6:31 PM + + + +
    +
    +
  • @@ -10334,7 +10584,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 2:28 PM - - - -
    - + + 2:28 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 3:02 PM - - - -
    - + + 3:02 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 3:12 PM - - - -
    - + + 3:12 PM + + + +
    +
    +
  • @@ -10882,7 +11207,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 3:22 PM - - - -
    - + + 3:22 PM + + + +
    +
    +
  • @@ -11162,7 +11512,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 4:11 PM - - - -
    - + + 4:11 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 5:09 PM - - - -
    - + + 5:09 PM + + + +
    +
    +
  • @@ -11581,7 +11981,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 3:22 PM - - - -
    - + + 3:22 PM + + + +
    +
    +
  • @@ -11843,7 +12268,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index "timepoint": true, "tripId": "TriMet:9231858", } - } - > -
    + - - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 4:11 PM - - - -
    -
    + + 4:11 PM + + + + + +
  • @@ -12119,7 +12569,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.thursday - - - - - - + common.daysOfWeek.thursday + + + + + + - - 3:22 PM - - - -
    - + + 3:22 PM + + + +
    +
    +
  • @@ -16471,7 +16946,7 @@ exports[`components > viewers > stop viewer should render with TriMet transit in className="next-trip-preview" >
  • - viewers > stop viewer should render with TriMet transit in } } > -
    - +
    - viewers > stop viewer should render with TriMet transit in } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with TriMet transit in iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 5:45 PM - - - -
    - + + 5:45 PM + + + +
    +
    +
  • - viewers > stop viewer should render with TriMet transit in } } > -
    - +
    - viewers > stop viewer should render with TriMet transit in } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with TriMet transit in iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:00 PM - - - -
    - + + 6:00 PM + + + +
    +
    +
  • - viewers > stop viewer should render with TriMet transit in } } > -
    - +
    - viewers > stop viewer should render with TriMet transit in } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with TriMet transit in iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:15 PM - - - -
    - + + 6:15 PM + + + +
    +
    +
  • diff --git a/example-config.yml b/example-config.yml index c9e44cc86..e820d7b34 100644 --- a/example-config.yml +++ b/example-config.yml @@ -326,6 +326,10 @@ itinerary: # One fare will always be shown by default defaultFareType: { mediumId: null, riderCategoryId: null } + # List of OTP2 errors to not display. Can be a list + # mutedErrors: + # - NO_TRANSIT_CONNECTION_IN_SEARCH_WINDOW + # The following settings must be set to these values to use the new # "Metro" UI. The settings can be used without the Metro UI, but # this may have unexpected effects. @@ -352,6 +356,8 @@ itinerary: # This flag disables the dot between legs in the metro itnerary summary, replacing it with # a gray background disableMetroSeperatorDot: false + # If enabled, always shows departures as times ("10pm" instead of "3 min") unless realtime data is present + onlyShowCountdownForRealtime: true # Show the number of minutes of delay or early beneath a time in the itinerary body showScheduleDeviation: true # Shows the duration of a leg below the leg in the metro itinerary summary diff --git a/i18n/en-US.yml b/i18n/en-US.yml index 563914d33..c4dfee8ef 100644 --- a/i18n/en-US.yml +++ b/i18n/en-US.yml @@ -359,6 +359,7 @@ components: companyBicycle: "{company} Bike" companyScooter: "{company} Scooter" error: An error occurred loading nearby amenities. + header: Nearby View nothingNearby: There are no places nearby. spacesAvailable: "{spacesAvailable} empty spaces available" NewAccountWizard: diff --git a/lib/actions/api.js b/lib/actions/api.js index 4ff463b8f..c41252c70 100644 --- a/lib/actions/api.js +++ b/lib/actions/api.js @@ -494,7 +494,7 @@ export function findStopTimesForStop(params) { const { date, stopId, ...otherParams } = params let datePath = '' if (date) { - const dateWithoutDashes = date.replace('-', '') + const dateWithoutDashes = date.replace(/-/g, '') datePath = `/${dateWithoutDashes}` } diff --git a/lib/actions/form.js b/lib/actions/form.js index c16405f17..bb6c401b9 100644 --- a/lib/actions/form.js +++ b/lib/actions/form.js @@ -55,6 +55,7 @@ export function resetForm(full = false) { // If fully resetting form, also clear the active search, from/to // locations, and query params. dispatch(clearActiveSearch()) + dispatch(settingQueryParam({ departArrive: 'NOW' })) dispatch(setLocation({ location: null, locationType: 'from' })) dispatch(setLocation({ location: null, locationType: 'to' })) // Get query params. Delete everything except sessionId. diff --git a/lib/actions/plan.js b/lib/actions/plan.js index da09f0da8..7803f7671 100644 --- a/lib/actions/plan.js +++ b/lib/actions/plan.js @@ -11,7 +11,7 @@ import { getFirstStopId } from '../util/itinerary' import { routingQuery } from './api' import { setQueryParam } from './form' -const SERVICE_BREAK = '03:00' +const SERVICE_BREAK = '03:30' const NINETY_SECONDS = 90000 function updateParamsAndPlan(params) { diff --git a/lib/components/admin/mailables-window.js b/lib/components/admin/mailables-window.js index 05232c2d4..585515d36 100644 --- a/lib/components/admin/mailables-window.js +++ b/lib/components/admin/mailables-window.js @@ -48,11 +48,6 @@ class SelectedMailable extends Component { updateField(index, 'largeFormat', evt.target.checked) } - _changeSmallFormat = (evt) => { - const { index, updateField } = this.props - updateField(index, 'smallFormat', evt.target.checked) - } - _changeQuantity = (evt) => { const { index, updateField } = this.props updateField(index, 'quantity', evt.target.value) @@ -62,8 +57,7 @@ class SelectedMailable extends Component { render() { const { index, mailable } = this.props - const largeId = `largeFormat-${index}` - const smallId = `smallFormat-${index}` + const id = `largeFormat-${index}` return ( @@ -76,26 +70,15 @@ class SelectedMailable extends Component { type="number" value={mailable.quantity} /> -
    - - -
    {mailable.largePrint && (
    -
    @@ -122,11 +105,9 @@ class MailablesWindow extends Component { } _addMailable = (mailable) => { - if (!this.state.mailables.find((m) => m.name === mailable.name)) { - const mailables = [...this.state.mailables] - mailables.push({ ...mailable, quantity: 1, smallFormat: true }) - this.setState({ mailables }) - } + const mailables = [...this.state.mailables] + mailables.push({ ...mailable, quantity: 1 }) + this.setState({ mailables }) } _removeMailable = (mailable) => { @@ -156,9 +137,9 @@ class MailablesWindow extends Component { const { mailables: selectedMailables } = this.state const { items } = mailablesConfig if (!callTaker.mailables.visible) return null - const selectableMailables = items.filter( - (m) => !selectedMailables.find((mailable) => mailable.name === m.name) - ) + // If items should not be addable twice, then this line can be amended + const selectableMailables = items + return ( - {time} -
    - {params.from.name} to {params.to.name} + {params.from.name} to {params.to.name} at {time} ) diff --git a/lib/components/mobile/main.js b/lib/components/mobile/main.js index f9d914b01..c280b89bf 100644 --- a/lib/components/mobile/main.js +++ b/lib/components/mobile/main.js @@ -15,6 +15,7 @@ import MobileRouteViewer from './route-viewer' import MobileStopViewer from './stop-viewer' import MobileTripViewer from './trip-viewer' import MobileWelcomeScreen from './welcome-screen' +import NearbyView from '../viewers/nearby/nearby-view' class MobileMain extends Component { static propTypes = { @@ -62,14 +63,15 @@ class MobileMain extends Component { return } + if (uiState.mainPanelContent === MainPanelContent.NEARBY_VIEW) { + return + } + // check for viewed stop if (uiState.viewedStop) return // check for viewed trip - if ( - uiState.viewedTrip || - uiState.mainPanelContent === MainPanelContent.TRIP_VIEWER - ) + if (uiState.mainPanelContent === MainPanelContent.TRIP_VIEWER) return switch (uiState.mobileScreen) { diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 353cf9709..dd445fd9d 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -20,8 +20,7 @@ import { getAccessibilityScoreForItinerary, itineraryHasAccessibilityScores } from '../../../util/accessibility-routing' -import { getFare, getTotalFare } from '../../../util/state' -import { getFirstLegStartTime } from '../../../util/itinerary' +import { getFare, getFirstLegStartTime } from '../../../util/itinerary' import { Icon, StyledIconWrapperTextAlign } from '../../util/styledIcon' import { localizeGradationMap } from '../utils' import FieldTripGroupSize from '../../admin/field-trip-itinerary-group-size' diff --git a/lib/components/narrative/default/itinerary.css b/lib/components/narrative/default/itinerary.css index 656a4b9ef..91a5e089c 100644 --- a/lib/components/narrative/default/itinerary.css +++ b/lib/components/narrative/default/itinerary.css @@ -198,6 +198,8 @@ .otp .option.default-itin > .header .title > .summary > .mode-block { height: 18px; width: 18px; + color: #eee; + fill: #eee; } .otp .option.default-itin > .header .title > .summary > .arrow-block { diff --git a/lib/components/narrative/line-itin/itin-summary.tsx b/lib/components/narrative/line-itin/itin-summary.tsx index 24409f790..18aca4230 100644 --- a/lib/components/narrative/line-itin/itin-summary.tsx +++ b/lib/components/narrative/line-itin/itin-summary.tsx @@ -1,12 +1,13 @@ import { connect } from 'react-redux' +import { FareProductSelector, Itinerary, Leg } from '@opentripplanner/types' import { FormattedMessage, FormattedNumber } from 'react-intl' import coreUtils from '@opentripplanner/core-utils' import React, { Component } from 'react' import styled from 'styled-components' -import type { Itinerary, Leg } from '@opentripplanner/types' +import { AppReduxState } from '../../../util/state-types' import { ComponentContext } from '../../../util/contexts' -import { getFare } from '../../../util/state' +import { getFare } from '../../../util/itinerary' import FormattedDuration from '../../util/formatted-duration' // TODO: make this a prop @@ -77,7 +78,7 @@ const ShortName = styled.div<{ leg: Leg }>` type Props = { currency?: string - defaultFareType: string + defaultFareType?: FareProductSelector itinerary: Itinerary onClick: () => void } @@ -236,7 +237,7 @@ function getRouteColorForBadge(leg: Leg): string { return leg.routeColor ? '#' + leg.routeColor : defaultRouteColor } -const mapStateToProps = (state: any) => { +const mapStateToProps = (state: AppReduxState) => { return { defaultFareType: state.otp.config.itinerary?.defaultFareType } diff --git a/lib/components/narrative/metro/departure-times-list.tsx b/lib/components/narrative/metro/departure-times-list.tsx index be754892a..bebfd30e8 100644 --- a/lib/components/narrative/metro/departure-times-list.tsx +++ b/lib/components/narrative/metro/departure-times-list.tsx @@ -1,30 +1,21 @@ import { FormattedList, useIntl } from 'react-intl' -import { Itinerary, Leg } from '@opentripplanner/types' import React, { MouseEvent, useCallback } from 'react' import { firstTransitLegIsRealtime } from '../../../util/viewer' import { getFirstLegStartTime, - getLastLegEndTime + getLastLegEndTime, + ItineraryStartTime, + ItineraryWithIndex } from '../../../util/itinerary' import InvisibleA11yLabel from '../../util/invisible-a11y-label' -interface ItineraryWithIndex extends Itinerary { - index: number -} - -interface StartTime { - itinerary: ItineraryWithIndex - legs: Leg[] - realtime: boolean -} - export type SetActiveItineraryHandler = (payload: { index: number }) => void type DepartureTimesProps = { expanded?: boolean itinerary: ItineraryWithIndex & { - allStartTimes?: StartTime[] + allStartTimes?: ItineraryStartTime[] } setActiveItinerary: SetActiveItineraryHandler showArrivals?: boolean diff --git a/lib/components/narrative/metro/metro-error-renderer.tsx b/lib/components/narrative/metro/metro-error-renderer.tsx index 8ad779a75..92a8838f8 100644 --- a/lib/components/narrative/metro/metro-error-renderer.tsx +++ b/lib/components/narrative/metro/metro-error-renderer.tsx @@ -1,8 +1,10 @@ +import { connect } from 'react-redux' import { ExclamationCircle } from '@styled-icons/fa-solid/ExclamationCircle' import { FormattedMessage, useIntl } from 'react-intl' import React from 'react' import styled from 'styled-components' +import { AppReduxState } from '../../../util/state-types' import { Icon } from '../../util/styledIcon' type Error = Record @@ -38,12 +40,27 @@ const Container = styled.li` } ` -const ErrorRenderer = ({ errors }: { errors: Error }): JSX.Element => { +const ErrorRenderer = ({ + errors, + mutedErrors +}: { + errors: Error + mutedErrors?: string[] +}): JSX.Element => { const intl = useIntl() return ( {Object.keys(errors).map((error: string) => { + // The search window is hardcoded in otp-rr and can't be changed by the user. + // Do not tell them what's happening as they can't act on the issue. + if (error === 'NO_TRANSIT_CONNECTION_IN_SEARCH_WINDOW') { + return null + } + + // Don't show errors that have been muted in the config + if (mutedErrors?.includes(error)) return null + const localizedInputFieldList = Array.from(errors[error])?.map( (inputField) => intl.formatMessage({ @@ -51,12 +68,6 @@ const ErrorRenderer = ({ errors }: { errors: Error }): JSX.Element => { }) ) - // The search window is hardcoded in otp-rr and can't be changed by the user. - // Do not tell them what's happening as they can't act on the issue. - if (error === 'NO_TRANSIT_CONNECTION_IN_SEARCH_WINDOW') { - return null - } - return ( @@ -81,5 +92,10 @@ const ErrorRenderer = ({ errors }: { errors: Error }): JSX.Element => { ) } -export default ErrorRenderer +const mapStateToProps = (state: AppReduxState) => { + const { itinerary } = state.otp.config + return { mutedErrors: itinerary?.mutedErrors } +} +export default connect(mapStateToProps)(ErrorRenderer) + export type { Error } diff --git a/lib/components/narrative/metro/metro-itinerary.tsx b/lib/components/narrative/metro/metro-itinerary.tsx index 6eff07f40..92a89d7bf 100644 --- a/lib/components/narrative/metro/metro-itinerary.tsx +++ b/lib/components/narrative/metro/metro-itinerary.tsx @@ -12,13 +12,15 @@ import React from 'react' import styled, { keyframes } from 'styled-components' import * as uiActions from '../../../actions/ui' +import { AppReduxState } from '../../../util/state-types' import { ComponentContext } from '../../../util/contexts' import { FlexIndicator } from '../default/flex-indicator' import { getAccessibilityScoreForItinerary, itineraryHasAccessibilityScores } from '../../../util/accessibility-routing' -import { getActiveSearch, getFare } from '../../../util/state' +import { getActiveSearch } from '../../../util/state' +import { getFare } from '../../../util/itinerary' import { IconWithText } from '../../util/styledIcon' import { ItineraryDescription } from '../default/itinerary-description' import { ItineraryView } from '../../../util/ui' @@ -451,8 +453,7 @@ class MetroItinerary extends NarrativeItinerary { } } -// TODO: state type -const mapStateToProps = (state: any, ownProps: Props) => { +const mapStateToProps = (state: AppReduxState, ownProps: Props) => { const activeSearch = getActiveSearch(state) return { diff --git a/lib/components/narrative/narrative-itineraries.js b/lib/components/narrative/narrative-itineraries.js index 588033883..6d20a2437 100644 --- a/lib/components/narrative/narrative-itineraries.js +++ b/lib/components/narrative/narrative-itineraries.js @@ -5,6 +5,7 @@ import { FormattedMessage, injectIntl } from 'react-intl' import { isFlex, isTransit } from '@opentripplanner/core-utils/lib/itinerary' import clone from 'clone' import coreUtils from '@opentripplanner/core-utils' +import memoize from 'lodash.memoize' import PropTypes from 'prop-types' import React, { Component } from 'react' import Skeleton, { SkeletonTheme } from 'react-loading-skeleton' @@ -17,7 +18,8 @@ import { getActiveSearch, getRealtimeEffects, getResponsesWithErrors, - getVisibleItineraryIndex + getVisibleItineraryIndex, + sortItinerariesInPlaceIfNeeded } from '../../util/state' import { getFirstLegStartTime, @@ -52,12 +54,11 @@ function makeStartTime(itinerary) { } } -function doMergeItineraries(itineraries) { +const doMergeItineraries = memoize((itineraries) => { const mergedItineraries = itineraries - .reduce((prev, cur, curIndex) => { + .reduce((prev, cur) => { const updatedItineraries = clone(prev) const updatedItinerary = clone(cur) - updatedItinerary.index = curIndex const duplicateIndex = updatedItineraries.findIndex((itin) => itinerariesAreEqual(itin, cur) @@ -149,56 +150,7 @@ function doMergeItineraries(itineraries) { allItineraries, mergedItineraries } -} - -// Returns a car itinerary if there is one, otherwise returns false -function getCarItinerary(itineraries) { - const isCarOnly = (itin) => - itin.legs.length === 1 && itin.legs[0].mode.startsWith('CAR') - return ( - !!itineraries.filter(isCarOnly).length && itineraries.filter(isCarOnly)[0] - ) -} - -function computeCarbonBaseline(itineraries, co2Config) { - // Sums the sum of the leg distances for each leg - const avgDistance = - itineraries.reduce( - (sum, itin) => - sum + itin.legs.reduce((legsum, leg) => legsum + leg.distance, 0), - 0 - ) / itineraries.length - - // If we do not have a drive yourself itinerary, estimate the distance based on avg of transit distances. - return coreUtils.itinerary.calculateEmissions( - getCarItinerary(itineraries) || { - legs: [{ distance: avgDistance, mode: 'CAR' }] - }, - co2Config?.carbonIntensity, - co2Config?.massUnit - ) -} - -function addCarbonInfo(itin, co2Config, baselineCo2) { - const emissions = coreUtils.itinerary.calculateEmissions( - itin, - co2Config?.carbonIntensity, - co2Config?.massUnit - ) - return { - ...itin, - co2: emissions, - co2VsBaseline: (emissions - baselineCo2) / baselineCo2 - } -} - -function addCarbonInfoToAll(itineraries, co2Config) { - const baselineCo2 = computeCarbonBaseline(itineraries, co2Config) - return ( - itineraries?.map((itin) => addCarbonInfo(itin, co2Config, baselineCo2)) || - [] - ) -} +}) // FIXME: move to typescript once shared types exist class NarrativeItineraries extends Component { @@ -578,12 +530,14 @@ const reduceErrorsFromResponse = (acc, cur) => { // connect to the redux store const mapStateToProps = (state) => { + const { config, filter } = state.otp + const { co2, errorMessages, modes } = config + const { sort } = filter + const activeSearch = getActiveSearch(state) - const activeItinerary = activeSearch && activeSearch.activeItinerary - const { co2, errorMessages, modes } = state.otp.config - const { sort } = state.otp.filter + const activeItinerary = activeSearch?.activeItinerary const pending = activeSearch?.pending > 0 - const itineraries = getActiveItineraries(state) + const itinsWithCo2 = getActiveItineraries(state) const realtimeEffects = getRealtimeEffects(state) const urlParams = coreUtils.query.getUrlParams() const itineraryView = getItineraryView(urlParams) @@ -598,17 +552,14 @@ const mapStateToProps = (state) => { mergeItineraries, showHeaderText, sortModes - } = state.otp.config?.itinerary || false + } = config.itinerary || false // Default to true for backwards compatibility - const renderSkeletons = !state.otp.config.itinerary?.hideSkeletons + const renderSkeletons = !config.itinerary?.hideSkeletons const itineraryIsExpanded = activeItinerary !== undefined && activeItinerary !== null && showDetails const { localUser, loggedInUser } = state.user const user = loggedInUser || localUser - // Add carbon info, if available. - const itinsWithCo2 = addCarbonInfoToAll(itineraries, co2) - // Merge duplicate itineraries together and save multiple departure times let mergedItineraries let allItineraries @@ -616,18 +567,19 @@ const mapStateToProps = (state) => { // eslint-disable-next-line prettier/prettier ({ allItineraries, mergedItineraries } = doMergeItineraries(itinsWithCo2)) } else { - allItineraries = mergedItineraries = itinsWithCo2.map((itin, index) => ({ - ...itin, - index - })) + allItineraries = itinsWithCo2 + mergedItineraries = [...allItineraries] } + // Sort the merged (displayed) itineraries if needed + sortItinerariesInPlaceIfNeeded(mergedItineraries, state) + return { // swap out realtime itineraries with non-realtime depending on boolean activeItinerary, - activeLeg: activeSearch && activeSearch.activeLeg, + activeLeg: activeSearch?.activeLeg, activeSearch, - activeStep: activeSearch && activeSearch.activeStep, + activeStep: activeSearch?.activeStep, co2Config: co2, customBatchUiBackground, enabledSortModes: sortModes, @@ -645,13 +597,13 @@ const mapStateToProps = (state) => { mergedItineraries, modes, pending, - popupTarget: state.otp.config?.popups?.launchers?.optionFilter, + popupTarget: config.popups?.launchers?.optionFilter, realtimeEffects, renderSkeletons, showDetails, showHeaderText, sort, - timeFormat: coreUtils.time.getTimeFormat(state.otp.config), + timeFormat: coreUtils.time.getTimeFormat(config), user, visibleItinerary: getVisibleItineraryIndex(state) } diff --git a/lib/components/viewers/nearby/nearby-view.tsx b/lib/components/viewers/nearby/nearby-view.tsx index 19eee9c32..b5583c9e2 100644 --- a/lib/components/viewers/nearby/nearby-view.tsx +++ b/lib/components/viewers/nearby/nearby-view.tsx @@ -1,16 +1,21 @@ import { connect } from 'react-redux' import { FormattedMessage, useIntl } from 'react-intl' import { MapRef, useMap } from 'react-map-gl' -import React, { useEffect, useRef, useState } from 'react' + +import MobileNavigationBar from '../../mobile/navigation-bar' +import React, { useCallback, useEffect, useRef, useState } from 'react' import * as apiActions from '../../../actions/api' +import * as uiActions from '../../../actions/ui' import { FloatingLoadingIndicator, NearbySidebarContainer, Scrollable } from './styled' +import { MainPanelContent } from '../../../actions/ui-constants' import Loading from '../../narrative/loading' +import MobileContainer from '../../mobile/container' import RentalStation from './rental-station' import Stop from './stop' import Vehicle from './vehicle-rent' @@ -21,8 +26,10 @@ type LatLonObj = { lat: number; lon: number } type Props = { fetchNearby: (latLon: LatLonObj, map?: MapRef) => void hideBackButton?: boolean + mobile?: boolean nearby: any nearbyViewCoords?: LatLonObj + setMainPanelContent: (content: number) => void } const getNearbyItem = (place: any) => { @@ -47,7 +54,8 @@ const getNearbyItemList = (nearby: any) => { } function NearbyView(props: Props): JSX.Element { - const { fetchNearby, nearby, nearbyViewCoords } = props + const { fetchNearby, mobile, nearby, nearbyViewCoords, setMainPanelContent } = + props const map = useMap().current const intl = useIntl() const [loading, setLoading] = useState(true) @@ -71,11 +79,18 @@ function NearbyView(props: Props): JSX.Element { setLoading(false) }, [nearby]) - // TODO: when coordinates are set, put a marker on the map and zoom there + const MainContainer = mobile ? MobileContainer : Scrollable return ( - - + + setMainPanelContent(0), [])} + /> +
    {loading && ( @@ -91,7 +106,7 @@ function NearbyView(props: Props): JSX.Element { ))} - + ) } @@ -107,7 +122,8 @@ const mapStateToProps = (state: any) => { } const mapDispatchToProps = { - fetchNearby: apiActions.fetchNearby + fetchNearby: apiActions.fetchNearby, + setMainPanelContent: uiActions.setMainPanelContent } export default connect(mapStateToProps, mapDispatchToProps)(NearbyView) diff --git a/lib/components/viewers/stop-time-cell.tsx b/lib/components/viewers/stop-time-cell.tsx index 27b63a649..d1867c3c2 100644 --- a/lib/components/viewers/stop-time-cell.tsx +++ b/lib/components/viewers/stop-time-cell.tsx @@ -1,13 +1,14 @@ import { Clock } from '@styled-icons/fa-regular/Clock' +import { connect } from 'react-redux' import { format, getTimezoneOffset, utcToZonedTime } from 'date-fns-tz' import { FormattedMessage, useIntl } from 'react-intl' import { Rss } from '@styled-icons/fa-solid/Rss' -import addDays from 'date-fns/addDays' import coreUtils from '@opentripplanner/core-utils' import isSameDay from 'date-fns/isSameDay' import React from 'react' import styled from 'styled-components' +import { AppReduxState } from '../../util/state-types' import { getSecondsUntilDeparture, getTripStatus } from '../../util/viewer' import { StyledIconWrapperTextAlign } from '../util/styledIcon' import FormattedDayOfWeek from '../util/formatted-day-of-week' @@ -15,10 +16,10 @@ import FormattedDuration from '../util/formatted-duration' import getRealtimeStatusLabel, { status } from '../util/get-realtime-status-label' +import InvisibleA11yLabel from '../util/invisible-a11y-label' import type { Time } from '../util/types' import DepartureTime from './departure-time' -import InvisibleA11yLabel from '../util/invisible-a11y-label' const { getUserTimezone } = coreUtils.time const ONE_HOUR_IN_SECONDS = 3600 @@ -31,6 +32,8 @@ const PulsingRss = styled(Rss)` type Props = { /** If configured, the timezone of the area */ homeTimezone?: string + /** Optionally hide countdown unless realtime data is present */ + onlyShowCountdownForRealtime?: boolean /** A stopTime object as received from a transit index API */ stopTime: Time } @@ -39,8 +42,10 @@ type Props = { * Renders a stop time as either schedule or countdown, with an optional status icon. * Stop time that apply to a different day have an additional text showing the day of departure. */ +// eslint-disable-next-line complexity const StopTimeCell = ({ homeTimezone = getUserTimezone(), + onlyShowCountdownForRealtime, stopTime }: Props): JSX.Element => { const intl = useIntl() @@ -109,7 +114,10 @@ const StopTimeCell = ({ status: getTripStatus(realtime, stopTime.departureDelay, 30) as status })} > - {showCountdown ? ( + {/* Not the cleanest boolean, but makes it very clear what we're doing + in all cases. */} + {(onlyShowCountdownForRealtime === true && realtime) || + (onlyShowCountdownForRealtime === false && showCountdown) ? ( // Show countdown string (e.g., 3 min or Due) isDue ? ( @@ -140,4 +148,13 @@ const StopTimeCell = ({ ) } -export default StopTimeCell +const mapStateToProps = (state: AppReduxState) => { + return { + onlyShowCountdownForRealtime: + state.otp.config?.itinerary?.onlyShowCountdownForRealtime || false + } +} + +const mapDispatchToProps = {} + +export default connect(mapStateToProps, mapDispatchToProps)(StopTimeCell) diff --git a/lib/components/viewers/trip-viewer.js b/lib/components/viewers/trip-viewer.js index f39984c2b..9940d22c8 100644 --- a/lib/components/viewers/trip-viewer.js +++ b/lib/components/viewers/trip-viewer.js @@ -9,7 +9,7 @@ import { toDate } from 'date-fns-tz' import { Wheelchair } from '@styled-icons/fa-solid/Wheelchair' import coreUtils from '@opentripplanner/core-utils' import PropTypes from 'prop-types' -import React, { Component } from 'react' +import React, { Component, createRef } from 'react' import styled from 'styled-components' import * as apiActions from '../../actions/api' @@ -59,6 +59,8 @@ class TripViewer extends Component { viewedTrip: PropTypes.object } + firstStopRef = createRef() + _backClicked = () => { this.props.setViewedTrip(null) } @@ -69,6 +71,13 @@ class TripViewer extends Component { findTrip({ tripId }) } + componentDidUpdate() { + const { current } = this.firstStopRef + if (current) { + current.scrollIntoView({ behavior: 'smooth', block: 'start' }) + } + } + /** * Gets a breadcrumbs-like text of format (Trip Viewer - ) */ @@ -116,10 +125,7 @@ class TripViewer extends Component { -
    -
    - -
    +
    {/* Basic Trip Info */} {tripData && (
    @@ -181,7 +187,9 @@ class TripViewer extends Component { )}
    )} +
    +
    {/* Stop Listing */} ) + refProp = this.firstStopRef } if (toIndex === i) { stopLabel = ( @@ -229,7 +239,7 @@ class TripViewer extends Component { {stopLabel && ( {stopLabel} )} -
    +
    leg.transitLeg) -} - -/** - * Get the first stop ID from the itinerary in the underscore format required by - * the startTransitStopId query param (e.g., TRIMET_12345 instead of TRIMET:12345). - */ -export function getFirstStopId(itinerary) { - return getFirstTransitLeg(itinerary)?.from.stopId.replace(':', '_') -} - -/** - * Returns the set of monitored days that will be initially shown to the user - * for the given itinerary. - * @param itinerary The itinerary from which the default monitored days are extracted. - * @returns ['monday' thru 'friday'] if itinerary happens on a weekday(*), - * ['saturday', 'sunday'] if itinerary happens on a saturday/sunday(*). - * (*) For transit itineraries, the first transit leg is used to make - * the determination. Otherwise, the itinerary startTime is used. - */ -export function getItineraryDefaultMonitoredDays( - itinerary, - timeZone = coreUtils.time.getUserTimezone() -) { - const firstTransitLeg = getFirstTransitLeg(itinerary) - // firstTransitLeg should be non-null because only transit trips can be monitored at this time. - // - using serviceDate covers legs that start past midnight. - // - The format of serviceDate can either be 'yyyyMMdd' (OTP v1) or 'yyyy-MM-dd' (OTP v2) - // and both formats are correctly handled by toDate from date-fns-tz. - const startDate = firstTransitLeg - ? toDate(firstTransitLeg.serviceDate, { timeZone }) - : utcToZonedTime(new Date(itinerary.startTime), timeZone) - - const dayOfWeek = startDate.getDay() - return dayOfWeek === 0 || dayOfWeek === 6 ? WEEKEND_DAYS : WEEKDAYS -} - -function legLocationsAreEqual(legLocation, other) { - return ( - !!legLocation && - !!other && - legLocation.lat === other.lat && - legLocation.lon === other.lon - ) -} - -export function itinerariesAreEqual(itinerary, other) { - return ( - itinerary.legs.length === other.legs.length && - itinerary.legs.every((leg, index) => { - const otherLeg = other?.legs?.[index] - return ( - otherLeg.mode === leg.mode && - legLocationsAreEqual(otherLeg?.to, leg?.to) && - legLocationsAreEqual(otherLeg?.from, leg?.from) - ) - }) - ) -} - -export function getFirstLegStartTime(legs) { - return legs[0].startTime -} - -export function getLastLegEndTime(legs) { - return legs[legs.length - 1].endTime -} - -export function sortStartTimes(startTimes) { - return startTimes?.sort( - (a, b) => getFirstLegStartTime(a.legs) - getFirstLegStartTime(b.legs) - ) -} diff --git a/lib/util/itinerary.tsx b/lib/util/itinerary.tsx new file mode 100644 index 000000000..a66f3322d --- /dev/null +++ b/lib/util/itinerary.tsx @@ -0,0 +1,461 @@ +import { differenceInMinutes } from 'date-fns' +import { Itinerary, Leg, Place } from '@opentripplanner/types' +import { toDate, utcToZonedTime } from 'date-fns-tz' +import coreUtils from '@opentripplanner/core-utils' +import hash from 'object-hash' +import memoize from 'lodash.memoize' + +import { AppConfig, CO2Config } from './config-types' +import { WEEKDAYS, WEEKEND_DAYS } from './monitored-trip' + +export interface ItineraryStartTime { + itinerary: ItineraryWithIndex + legs: Leg[] + realtime: boolean +} + +// FIXME: replace with OTP2 logic. +interface ItineraryWithOtp1HailedCar extends Itinerary { + legs: (Leg & { hailedCar?: boolean })[] +} + +interface OtpResponse { + plan: { + itineraries: Itinerary[] + } +} + +export interface ItineraryWithIndex extends Itinerary { + index: number +} + +export interface ItineraryWithCO2Info extends Itinerary { + co2: number + co2VsBaseline: number +} + +export interface ItineraryWithSortingCosts extends Itinerary { + rank: number + totalFare: number +} + +export interface ItineraryFareSummary { + fareCurrency?: string + maxTNCFare: number + minTNCFare: number + transitFare?: number +} + +// Similar to OTP-UI's FareProductSelector, but the fields are nullable. +interface RelaxedFareProductSelector { + mediumId: string | null + riderCategoryId: string | null +} + +/** + * Determines whether the specified Itinerary can be monitored. + * @returns true if at least one Leg of the specified Itinerary is a transit leg, + * and none of the legs is a rental or ride hail leg (e.g. CAR_RENT, CAR_HAIL, BICYCLE_RENT, etc.). + * (We use the corresponding fields returned by OTP to get transit legs and rental/ride hail legs.) + */ +export function itineraryCanBeMonitored( + itinerary: ItineraryWithOtp1HailedCar +): boolean { + let hasTransit = false + let hasRentalOrRideHail = false + + if (itinerary && itinerary.legs) { + for (const leg of itinerary.legs) { + if (leg.transitLeg) { + hasTransit = true + } + if ( + leg.rentedBike || + leg.rentedCar || + leg.rentedVehicle || + leg.hailedCar + ) { + hasRentalOrRideHail = true + } + } + } + + return hasTransit && !hasRentalOrRideHail +} + +export function getMinutesUntilItineraryStart(itinerary: Itinerary): number { + return differenceInMinutes(new Date(itinerary.startTime), new Date()) +} + +/** + * Gets the first transit leg of the given itinerary, or null if none found. + */ +function getFirstTransitLeg(itinerary: Itinerary) { + return itinerary?.legs?.find((leg) => leg.transitLeg) +} + +/** + * Get the first stop ID from the itinerary in the underscore format required by + * the startTransitStopId query param (e.g., TRIMET_12345 instead of TRIMET:12345). + */ +export function getFirstStopId(itinerary: Itinerary): string | undefined { + return getFirstTransitLeg(itinerary)?.from.stopId?.replace(':', '_') +} + +/** + * Returns the set of monitored days that will be initially shown to the user + * for the given itinerary. + * @param itinerary The itinerary from which the default monitored days are extracted. + * @returns ['monday' thru 'friday'] if itinerary happens on a weekday(*), + * ['saturday', 'sunday'] if itinerary happens on a saturday/sunday(*). + * (*) For transit itineraries, the first transit leg is used to make + * the determination. Otherwise, the itinerary startTime is used. + */ +export function getItineraryDefaultMonitoredDays( + itinerary: Itinerary, + timeZone = coreUtils.time.getUserTimezone() +): string[] { + const firstTransitLeg = getFirstTransitLeg(itinerary) + // firstTransitLeg should be non-null because only transit trips can be monitored at this time. + // - using serviceDate covers legs that start past midnight. + // - The format of serviceDate can either be 'yyyyMMdd' (OTP v1) or 'yyyy-MM-dd' (OTP v2) + // and both formats are correctly handled by toDate from date-fns-tz. + const startDate = firstTransitLeg + ? toDate(firstTransitLeg.serviceDate || '', { timeZone }) + : utcToZonedTime(new Date(itinerary.startTime), timeZone) + + const dayOfWeek = startDate.getDay() + return dayOfWeek === 0 || dayOfWeek === 6 ? WEEKEND_DAYS : WEEKDAYS +} + +function legLocationsAreEqual(legLocation: Place, other: Place) { + return ( + !!legLocation && + !!other && + legLocation.lat === other.lat && + legLocation.lon === other.lon + ) +} + +export function itinerariesAreEqual( + itinerary: Itinerary, + other: Itinerary +): boolean { + return ( + itinerary.legs.length === other.legs.length && + itinerary.legs.every((leg, index) => { + const otherLeg = other?.legs?.[index] + return ( + otherLeg.mode === leg.mode && + legLocationsAreEqual(otherLeg?.to, leg?.to) && + legLocationsAreEqual(otherLeg?.from, leg?.from) + ) + }) + ) +} + +export function getFirstLegStartTime(legs: Leg[]): number { + return +legs[0].startTime +} + +export function getLastLegEndTime(legs: Leg[]): number { + return +legs[legs.length - 1].endTime +} + +export function sortStartTimes( + startTimes: ItineraryStartTime[] +): ItineraryStartTime[] { + return startTimes?.sort( + (a, b) => getFirstLegStartTime(a.legs) - getFirstLegStartTime(b.legs) + ) +} + +// Ignore certain keys that could add significant calculation time to hashing. +// The alerts are irrelevant, but the intermediateStops, interStopGeometry and +// steps could have the legGeometry substitute as an equivalent hash value +const blackListedKeys = [ + 'alerts', + 'intermediateStops', + 'interStopGeometry', + 'steps' +] +// make blackListedKeys into an object due to superior lookup performance +const blackListedKeyLookup: Record = {} +blackListedKeys.forEach((key) => { + blackListedKeyLookup[key] = true +}) + +/** + * A memoized function to hash the itinerary. + * NOTE: It can take a while (>30ms) for the object-hash library to calculate + * an itinerary's hash for some lengthy itineraries. If better performance is + * desired, additional values to blackListedKeys should be added to avoid + * spending extra time hashing values that wouldn't result in different + * itineraries. + */ +const hashItinerary = memoize((itinerary) => + hash(itinerary, { excludeKeys: (key) => blackListedKeyLookup[key] }) +) + +/** + * Returns a list of itineraries from the redux-stored responses, without duplicates. + */ +export function collectItinerariesWithoutDuplicates( + response: OtpResponse[] +): ItineraryWithIndex[] { + const itineraries: ItineraryWithIndex[] = [] + // keep track of itinerary hashes in order to not include duplicate + // itineraries. Duplicate itineraries can occur in batch routing where a walk + // to transit trip can sometimes still be the most optimal trip even when + // additional modes such as bike rental were also requested + const seenItineraryHashes: Record = {} + response?.forEach((res) => { + res?.plan?.itineraries?.forEach((itinerary) => { + // hashing takes a while on itineraries + const itineraryHash = hashItinerary(itinerary) + if (!seenItineraryHashes[itineraryHash]) { + itineraries.push({ ...itinerary, index: itineraries.length }) + seenItineraryHashes[itineraryHash] = true + } + }) + }) + + return itineraries +} + +/** + * Whether an itinerary is car-only. + */ +function isCarOnly(itin: Pick) { + return itin.legs.length === 1 && itin.legs[0].mode.startsWith('CAR') +} + +/** + * Returns a car itinerary if there is one, otherwise returns false. + */ +function getCarItinerary(itineraries: Pick[]) { + return ( + !!itineraries.filter(isCarOnly).length && itineraries.filter(isCarOnly)[0] + ) +} + +/** + * Compute the carbon emitted while driving (the baseline for comparison). + */ +function computeCarbonBaseline(itineraries: Itinerary[], co2Config: CO2Config) { + // Sums the sum of the leg distances for each leg + const avgDistance = + itineraries.reduce( + (sum, itin) => + sum + itin.legs.reduce((legsum, leg) => legsum + leg.distance, 0), + 0 + ) / itineraries.length + + // If we do not have a drive yourself itinerary, estimate the distance based on avg of transit distances. + return coreUtils.itinerary.calculateEmissions( + getCarItinerary(itineraries) || { + legs: [{ distance: avgDistance, mode: 'CAR' }] as Leg[] + }, + co2Config?.carbonIntensity, + co2Config?.massUnit + ) +} + +/** + * Add carbon info to an itinerary. + */ +function addCarbonInfo( + itin: T, + co2Config: CO2Config, + baselineCo2: number +) { + const emissions = coreUtils.itinerary.calculateEmissions( + itin, + co2Config?.carbonIntensity, + co2Config?.massUnit + ) + return { + ...itin, + co2: emissions, + co2VsBaseline: (emissions - baselineCo2) / baselineCo2 + } +} + +/** + * Add carbon info to the given set of itineraries. + */ +export function addCarbonInfoToAll( + itineraries: T[], + co2Config: CO2Config +): ItineraryWithCO2Info[] { + const baselineCo2 = computeCarbonBaseline(itineraries, co2Config) + return ( + itineraries?.map((itin) => addCarbonInfo(itin, co2Config, baselineCo2)) || + [] + ) +} + +/** + * Get total drive time (i.e., total duration for legs with mode=CAR) for an + * itinerary. + */ +function getDriveTime(itinerary: Itinerary): number { + if (!itinerary) return 0 + let driveTime = 0 + itinerary.legs.forEach((leg) => { + if (leg.mode === 'CAR') driveTime += leg.duration + }) + return driveTime +} + +/** + * Parses OTP itinerary fare object and returns fares along with overridden currency + */ +export function getFare( + itinerary: Itinerary, + defaultFareType?: RelaxedFareProductSelector +): ItineraryFareSummary { + const { maxTNCFare, minTNCFare } = + coreUtils.itinerary.calculateTncFares(itinerary) + + const itineraryCost = coreUtils.itinerary.getItineraryCost( + itinerary?.legs, + defaultFareType?.mediumId || null, + defaultFareType?.riderCategoryId || null + ) + + return { + fareCurrency: itineraryCost?.currency.code, + maxTNCFare, + minTNCFare, + transitFare: itineraryCost?.amount + } +} + +/** + * Default costs for modes that currently have no costs evaluated in + * OpenTripPlanner. + */ +const DEFAULT_COSTS = { + // $2 per trip? This is a made up number. + bikeshareTripCostCents: 2 * 100, + // $2 for 3 hours of parking? + carParkingCostCents: 3 * 2.0 * 100, + // FL per diem rate: https://www.flcourts.org/content/download/219314/1981830/TravelInformation.pdf + drivingCentsPerMile: 0.445 * 100 +} + +/** + * Returns total fare for itinerary (in cents) + * FIXME: Move to otp-ui? + * TODO: Add GBFS fares + */ +export function getTotalFare( + itinerary: Itinerary, + configCosts = {}, + defaultFareType: RelaxedFareProductSelector = { + mediumId: null, + riderCategoryId: null + } +): number | null { + // Get TNC fares. + const { maxTNCFare, transitFare } = getFare(itinerary, defaultFareType) + // Start with default cost values. + const costs = DEFAULT_COSTS + // If config contains values to override defaults, apply those. + if (configCosts) Object.assign(costs, configCosts) + // Calculate total cost from itinerary legs. + let drivingCost = 0 + let hasBikeshare = false + let transitFareNotProvided = false + let rideHailTrip = false + itinerary.legs.forEach((leg) => { + rideHailTrip = rideHailTrip || !!leg?.rideHailingEstimate + if (leg.mode === 'CAR' && !rideHailTrip) { + // Convert meters to miles and multiple by cost per mile. + drivingCost += leg.distance * 0.000621371 * costs.drivingCentsPerMile + } + if ( + leg.mode === 'BICYCLE_RENT' || + leg.mode === 'MICROMOBILITY' || + leg.mode === 'SCOOTER' || + leg.rentedBike + ) { + hasBikeshare = true + } + if (coreUtils.itinerary.isTransit(leg.mode) && transitFare == null) { + transitFareNotProvided = true + } + }) + // If our itinerary includes a transit leg, but transit fare data is not provided + // return no fare information, rather than an underestimate + if (transitFareNotProvided) return null + const bikeshareCost = hasBikeshare ? costs.bikeshareTripCostCents : 0 + // If some leg uses driving, add parking cost to the total. + if (drivingCost > 0 && !rideHailTrip) drivingCost += costs.carParkingCostCents + return bikeshareCost + drivingCost + (transitFare || 0) + maxTNCFare * 100 +} + +/** + * Default constants for calculating itinerary "cost", i.e., how preferential a + * particular itinerary is based on factors like wait time, total fare, drive + * time, etc. + */ +const DEFAULT_WEIGHTS = { + driveReluctance: 2, + durationFactor: 0.25, + fareFactor: 0.5, + transferReluctance: 0.9, + waitReluctance: 0.1, + walkReluctance: 0.1 +} + +/** + * This calculates the "cost" (not the monetary cost, but the cost according to + * multiple factors like duration, total fare, and walking distance) for a + * particular itinerary, for use in sorting itineraries. + * FIXME: Do major testing to get this right. + */ +export function calculateItineraryCost( + itinerary: Itinerary, + config: Pick = {} +): number { + // Initialize weights to default values. + const weights = DEFAULT_WEIGHTS + // If config contains values to override defaults, apply those. + const configWeights = config.itinerary && config.itinerary.weights + if (configWeights) Object.assign(weights, configWeights) + return ( + (getTotalFare( + itinerary, + config.itinerary?.costs, + config.itinerary?.defaultFareType + ) || 0) * + weights.fareFactor + + itinerary.duration * weights.durationFactor + + (itinerary.walkDistance || 0) * weights.walkReluctance + + getDriveTime(itinerary) * weights.driveReluctance + + itinerary.waitingTime * weights.waitReluctance + + (itinerary.transfers || 0) * weights.transferReluctance + ) +} + +/** + * Computes and add cost attributes to avoid recomputing those costs during sorting. + */ +export function addSortingCosts( + itinerary: T, + config: AppConfig +): ItineraryWithSortingCosts { + const configCosts = config.itinerary?.costs + const totalFareResult = getTotalFare(itinerary, configCosts) + const totalFare = + totalFareResult === null ? Number.MAX_VALUE : totalFareResult + + const rank = calculateItineraryCost(itinerary, config) + return { + ...itinerary, + rank, + totalFare + } +} diff --git a/lib/util/mailables.js b/lib/util/mailables.js index fc5437797..5705cc92d 100644 --- a/lib/util/mailables.js +++ b/lib/util/mailables.js @@ -113,22 +113,13 @@ async function writePDF(formData, imageData, otpConfig) { const tableData = { headers: ['Item', 'Quantity'], - rows: mailables - .map((mailable) => { - let { largeFormat, largePrint, name, quantity, smallFormat } = mailable - const rows = [] - - if (smallFormat) { - rows.push([name, quantity]) - } - - if (largePrint && largeFormat) { - name += ' (LARGE PRINT)' - rows.push([name, quantity]) - } - return rows - }) - .flat() + rows: mailables.map((mailable) => { + let { largeFormat, largePrint, name, quantity } = mailable + if (largePrint && largeFormat) { + name += ' (LARGE PRINT)' + } + return [name, quantity] + }) } doc.table(tableData, { diff --git a/lib/util/state-types.ts b/lib/util/state-types.ts index 18f7ef36b..ae33c020e 100644 --- a/lib/util/state-types.ts +++ b/lib/util/state-types.ts @@ -2,6 +2,11 @@ import { AppConfig } from './config-types' export interface OtpState { config: AppConfig + filter: { + sort: { + type: string + } + } // TODO: Add other OTP states ui: any // TODO } diff --git a/lib/util/state.js b/lib/util/state.js index eaaf9aa15..3ce343b5b 100644 --- a/lib/util/state.js +++ b/lib/util/state.js @@ -2,12 +2,9 @@ import { compareTwoStrings } from 'string-similarity' import { createSelector } from 'reselect' import { format } from 'date-fns-tz' import { FormattedList, FormattedMessage } from 'react-intl' -import { isTransit } from '@opentripplanner/core-utils/lib/itinerary' import { itineraryToTransitive } from '@opentripplanner/transitive-overlay' import coreUtils from '@opentripplanner/core-utils' -import hash from 'object-hash' import isEqual from 'lodash.isequal' -import memoize from 'lodash.memoize' import qs from 'qs' import React from 'react' import styled from 'styled-components' @@ -15,6 +12,13 @@ import styled from 'styled-components' import FormattedMode from '../components/util/formatted-mode' import Strong from '../components/util/strong-text' +import { + addCarbonInfoToAll, + addSortingCosts, + calculateItineraryCost, + collectItinerariesWithoutDuplicates +} from './itinerary' + // For lowercase context const LowerCase = styled.span` text-transform: lowercase; @@ -29,190 +33,28 @@ export function getActiveSearch(state) { return state.otp.searches[state.otp.activeSearchId] } -/** - * Get total drive time (i.e., total duration for legs with mode=CAR) for an - * itinerary. - */ -function getDriveTime(itinerary) { - if (!itinerary) return 0 - let driveTime = 0 - itinerary.legs.forEach((leg) => { - if (leg.mode === 'CAR') driveTime += leg.duration - }) - return driveTime -} - -/** - * Parses OTP itinerary fare object and returns fares along with overridden currency - */ -export function getFare(itinerary, defaultFareType) { - const { maxTNCFare, minTNCFare } = - coreUtils.itinerary.calculateTncFares(itinerary) - - const itineraryCost = coreUtils.itinerary.getItineraryCost( - itinerary?.legs, - defaultFareType?.mediumId || null, - defaultFareType?.riderCategoryId || null - ) - - return { - fareCurrency: itineraryCost?.currency.code, - maxTNCFare, - minTNCFare, - transitFare: itineraryCost?.amount - } -} - -/** - * Default costs for modes that currently have no costs evaluated in - * OpenTripPlanner. - */ -const DEFAULT_COSTS = { - // $2 per trip? This is a made up number. - bikeshareTripCostCents: 2 * 100, - // $2 for 3 hours of parking? - carParkingCostCents: 3 * 2.0 * 100, - // FL per diem rate: https://www.flcourts.org/content/download/219314/1981830/TravelInformation.pdf - drivingCentsPerMile: 0.445 * 100 -} - -/** - * Returns total fare for itinerary (in cents) - * FIXME: Move to otp-ui? - * TODO: Add GBFS fares - */ -export function getTotalFare( - itinerary, - configCosts = {}, - defaultFareType = { mediumId: null, riderCategoryId: null } -) { - // Get TNC fares. - const { fareCurrency, maxTNCFare, transitFare } = getFare( - itinerary, - defaultFareType - ) - // Start with default cost values. - const costs = DEFAULT_COSTS - // If config contains values to override defaults, apply those. - if (configCosts) Object.assign(costs, configCosts) - // Calculate total cost from itinerary legs. - let drivingCost = 0 - let hasBikeshare = false - let transitFareNotProvided = false - let rideHailTrip = false - itinerary.legs.forEach((leg) => { - rideHailTrip = rideHailTrip || leg?.rideHailingEstimate - if (leg.mode === 'CAR' && !rideHailTrip) { - // Convert meters to miles and multiple by cost per mile. - drivingCost += leg.distance * 0.000621371 * costs.drivingCentsPerMile - } - if ( - leg.mode === 'BICYCLE_RENT' || - leg.mode === 'MICROMOBILITY' || - leg.mode === 'SCOOTER' || - leg.rentedBike - ) { - hasBikeshare = true - } - if (isTransit(leg.mode) && transitFare == null) { - transitFareNotProvided = true - } - }) - // If our itinerary includes a transit leg, but transit fare data is not provided - // return no fare information, rather than an underestimate - if (transitFareNotProvided) return null - const bikeshareCost = hasBikeshare ? costs.bikeshareTripCostCents : 0 - // If some leg uses driving, add parking cost to the total. - if (drivingCost > 0 && !rideHailTrip) drivingCost += costs.carParkingCostCents - return bikeshareCost + drivingCost + transitFare + maxTNCFare * 100 -} - -/** - * Default constants for calculating itinerary "cost", i.e., how preferential a - * particular itinerary is based on factors like wait time, total fare, drive - * time, etc. - */ -const DEFAULT_WEIGHTS = { - driveReluctance: 2, - durationFactor: 0.25, - fareFactor: 0.5, - transferReluctance: 0.9, - waitReluctance: 0.1, - walkReluctance: 0.1 -} - -/** - * This calculates the "cost" (not the monetary cost, but the cost according to - * multiple factors like duration, total fare, and walking distance) for a - * particular itinerary, for use in sorting itineraries. - * FIXME: Do major testing to get this right. - */ -function calculateItineraryCost(itinerary, config = {}) { - // Initialize weights to default values. - const weights = DEFAULT_WEIGHTS - // If config contains values to override defaults, apply those. - const configWeights = config.itinerary && config.itinerary.weights - if (configWeights) Object.assign(weights, configWeights) - return ( - getTotalFare( - itinerary, - config.itinerary?.costs, - config.itinerary?.defaultFareType - ) * - weights.fareFactor + - itinerary.duration * weights.durationFactor + - itinerary.walkDistance * weights.walkReluctance + - getDriveTime(itinerary) * weights.driveReluctance + - itinerary.waitingTime * weights.waitReluctance + - itinerary.transfers * weights.transferReluctance - ) -} - /** * Array sort function for itineraries (in batch routing context) that attempts * to sort based on the type/direction specified. */ -/* eslint-disable-next-line complexity */ -function sortItineraries(type, direction, a, b, config) { +export function sortItineraries(type, direction, a, b, config) { + const dirFactor = direction === 'ASC' ? 1 : -1 switch (type) { case 'WALKTIME': - if (direction === 'ASC') return a.walkTime - b.walkTime - else return b.walkTime - a.walkTime + return dirFactor * (a.walkTime - b.walkTime) case 'ARRIVALTIME': - if (direction === 'ASC') return a.endTime - b.endTime - else return b.endTime - a.endTime + return dirFactor * (a.endTime - b.endTime) case 'DEPARTURETIME': - if (direction === 'ASC') return a.startTime - b.startTime - else return b.startTime - a.startTime + return dirFactor * (a.startTime - b.startTime) case 'DURATION': - if (direction === 'ASC') return a.duration - b.duration - else return b.duration - a.duration + return dirFactor * (a.duration - b.duration) case 'COST': - // eslint-disable-next-line no-case-declarations - const configCosts = config.itinerary?.costs - // Sort an itinerary without fare information last - // eslint-disable-next-line no-case-declarations - const aTotal = - getTotalFare(a, configCosts) === null - ? Number.MAX_VALUE - : getTotalFare(a, configCosts) - // eslint-disable-next-line no-case-declarations - const bTotal = - getTotalFare(b, configCosts) === null - ? Number.MAX_VALUE - : getTotalFare(b, configCosts) - if (direction === 'ASC') return aTotal - bTotal - else return bTotal - aTotal + return dirFactor * (a.totalFare - b.totalFare) default: if (type !== 'BEST') console.warn(`Sort (${type}) not supported. Defaulting to BEST.`) // FIXME: Fully implement default sort algorithm. - // eslint-disable-next-line no-case-declarations - const aCost = calculateItineraryCost(a, config) - // eslint-disable-next-line no-case-declarations - const bCost = calculateItineraryCost(b, config) - if (direction === 'ASC') return aCost - bCost - else return bCost - aCost + return dirFactor * (a.rank - b.rank) } } @@ -253,33 +95,6 @@ export const getActiveFieldTripRequest = createSelector( } ) -// Ignore certain keys that could add significant calculation time to hashing. -// The alerts are irrelevant, but the intermediateStops, interStopGeometry and -// steps could have the legGeometry substitute as an equivalent hash value -const blackListedKeys = [ - 'alerts', - 'intermediateStops', - 'interStopGeometry', - 'steps' -] -// make blackListedKeys into an object due to superior lookup performance -const blackListedKeyLookup = {} -blackListedKeys.forEach((key) => { - blackListedKeyLookup[key] = true -}) - -/** - * A memoized function to hash the itinerary. - * NOTE: It can take a while (>30ms) for the object-hash library to calculate - * an itinerary's hash for some lengthy itineraries. If better performance is - * desired, additional values to blackListedKeys should be added to avoid - * spending extra time hashing values that wouldn't result in different - * itineraries. - */ -const hashItinerary = memoize((itinerary) => - hash(itinerary, { excludeKeys: (key) => blackListedKeyLookup[key] }) -) - /** * Get the active itineraries for the active search, which is dependent on * whether realtime or non-realtime results should be displayed @@ -290,48 +105,37 @@ const hashItinerary = memoize((itinerary) => export const getActiveItineraries = createSelector( (state) => state.otp.config, getActiveSearchNonRealtimeResponse, - (state) => state.otp.filter, getActiveSearchRealtimeResponse, - getActiveFieldTripRequest, - ( - config, - nonRealtimeResponse, - itinerarySortSettings, - realtimeResponse, - activeFieldTripRequest - ) => { + (config, nonRealtimeResponse, realtimeResponse) => { const response = realtimeResponse || nonRealtimeResponse - const itineraries = [] - // keep track of itinerary hashes in order to not include duplicate - // itineraries. Duplicate itineraries can occur in batch routing where a walk - // to transit trip can sometimes still be the most optimal trip even when - // additional modes such as bike rental were also requested - const seenItineraryHashes = {} - if (response) { - response.forEach((res) => { - res?.plan?.itineraries?.forEach((itinerary) => { - // hashing takes a while on itineraries - const itineraryHash = hashItinerary(itinerary) - if (!seenItineraryHashes[itineraryHash]) { - itineraries.push(itinerary) - seenItineraryHashes[itineraryHash] = true - } - }) - }) + const itineraries = collectItinerariesWithoutDuplicates(response).map( + (itin) => addSortingCosts(itin, config) + ) + // Add carbon info, if available. + if (config.co2?.enabled) { + return addCarbonInfoToAll(itineraries, config.co2) } - const { sort } = itinerarySortSettings - const { direction, type } = sort - // If no sort type is provided (e.g., because batch routing is not enabled), - // do not sort itineraries (default sort from API response is used). - // Also, do not sort itineraries if a field trip request is active - return !type || Boolean(activeFieldTripRequest) - ? itineraries - : itineraries.sort((a, b) => - sortItineraries(type, direction, a, b, config) - ) + return itineraries } ) +/** + * Helper method to sort itineraries. + * As the name indicates, it will mutate the order in the specified array. + */ +export function sortItinerariesInPlaceIfNeeded(itineraries, state) { + const { config, filter } = state.otp + const { sort } = filter + const { direction, type } = sort + + // If no sort type is provided (e.g., because batch routing is not enabled), + // do not sort itineraries (default sort from API response is used). + // Also, do not sort itineraries if a field trip request is active + return !type || Boolean(getActiveFieldTripRequest(state)) + ? itineraries + : itineraries.sort((a, b) => sortItineraries(type, direction, a, b, config)) +} + /** * Get the active itinerary/profile for the active search object * @param {Object} state the redux state object diff --git a/package.json b/package.json index c58098d48..268aa8e2f 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "semantic-release": "semantic-release", "start": "craco start", "percy-serve": "serve", - "percy-har-express": "har-express" + "percy-har-express": "har-express", + "percy-mock-server": "node ./percy/mock-server.js" }, "standard": { "parser": "babel-eslint" @@ -39,7 +40,7 @@ "@bugsnag/plugin-react": "^7.17.0", "@floating-ui/react": "^0.19.2", "@opentripplanner/base-map": "^3.0.15", - "@opentripplanner/core-utils": "^12.0.0-alpha.4", + "@opentripplanner/core-utils": "^11.1.3", "@opentripplanner/endpoints-overlay": "^2.0.10", "@opentripplanner/from-to-location-picker": "^2.1.10", "@opentripplanner/geocoder": "^1.4.2", @@ -57,7 +58,7 @@ "@opentripplanner/stops-overlay": "^5.2.0-alpha.3", "@opentripplanner/transit-vehicle-overlay": "^4.0.7", "@opentripplanner/transitive-overlay": "^3.0.16", - "@opentripplanner/trip-details": "^5.0.5", + "@opentripplanner/trip-details": "^5.0.6", "@opentripplanner/trip-form": "^3.3.6", "@opentripplanner/trip-viewer-overlay": "^2.0.7", "@opentripplanner/vehicle-rental-overlay": "^2.1.3", @@ -131,6 +132,7 @@ "@babel/plugin-transform-runtime": "^7.15.0", "@babel/preset-typescript": "^7.15.0", "@craco/craco": "^6.3.0", + "@graphql-tools/schema": "^10.0.0", "@jackwilsdon/craco-use-babelrc": "^1.0.0", "@opentripplanner/scripts": "^1.2.0", "@opentripplanner/types": "^6.1.1", @@ -138,7 +140,9 @@ "@percy/puppeteer": "^2.0.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.1", "@types/clone": "^2.1.1", + "@types/lodash.memoize": "^4.1.8", "@types/mapbox__polyline": "^1.0.2", + "@types/object-hash": "^3.0.5", "@types/qs": "^6.9.7", "@types/react-bootstrap": "^0.32.26", "@types/react-router": "^5.1.17", diff --git a/percy/graphql-mocks.js b/percy/graphql-mocks.js new file mode 100644 index 000000000..78431cbe6 --- /dev/null +++ b/percy/graphql-mocks.js @@ -0,0 +1,73 @@ +const PlanResponseBike = require('./mocks/PlanResponseBike.json').data.plan +const PlanResponseWalk = require('./mocks/PlanResponseWalk.json').data.plan +const PlanResponseBusSubwayTram = + require('./mocks/PlanResponseBusSubwayTram.json').data.plan +const TripResponse = require('./mocks/TripResponse.json').data.trip +const NearestResponse = require('./mocks/NearbyResponse.json').data.nearest +const Stop114900Response = require('./mocks/Stop114900Response.json').data.stop +const Stop803Response = require('./mocks/Stop803Response.json').data.stop +const StopsByRadiusResponse = require('./mocks/StopsByRadiusResponse.json').data + .stopsByRadius +const ServiceTimeRangeResponse = + require('./mocks/ServiceTimeRangeResponse.json').data.serviceTimeRange +const RoutesResponse = require('./mocks/Routes.json').data.routes +const IndividualRouteResponse = require('./mocks/IndividualRoute.json').data + .route + +function getPlanResponseMock(transportModes) { + const transportModesString = transportModes + .map((tm) => tm.mode) + .sort() + .join('') + switch (transportModesString) { + case 'BICYCLEBUSSUBWAYTRAM': + case 'BUSSUBWAY': + return PlanResponseBusSubwayTram + case 'BICYCLE': + return PlanResponseBike + case 'WALK': + return PlanResponseWalk + default: + return PlanResponseBike + } +} + +function getStopResponseMock(stopId) { + switch (stopId) { + case 'MARTA:803': + return Stop803Response + case 'MARTA:114900': + default: + return Stop114900Response + } +} + +const mocks = { + QueryType: { + nearest() { + return NearestResponse + }, + plan(obj, { transportModes }) { + return getPlanResponseMock(transportModes) + }, + route() { + return IndividualRouteResponse + }, + routes() { + return RoutesResponse + }, + serviceTimeRange() { + return ServiceTimeRangeResponse + }, + stop(obj, { id }) { + return getStopResponseMock(id) + }, + stopsByRadius() { + return StopsByRadiusResponse + }, + trip() { + return TripResponse + } + } +} +module.exports = mocks diff --git a/percy/mock-server.js b/percy/mock-server.js new file mode 100755 index 000000000..d9910bee6 --- /dev/null +++ b/percy/mock-server.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node +// Require the framework and instantiate it +const express = require('express') +const har = require('har-express') +const { buildClientSchema, graphql } = require('graphql') +const { addResolversToSchema } = require('@graphql-tools/schema') + +const mocks = require('./graphql-mocks') +const otpSchema = require('./otpSchema.json').data + +const port = process.env.PORT || 9999 +const harPath = process.env.HAR || './percy/mock.har' + +const app = express() +const schema = buildClientSchema(otpSchema) +const schemaWithMocks = addResolversToSchema({ resolvers: mocks, schema }) + +app.all('*', function (req, res, next) { + // Allow all origins + const origin = req.headers.origin + res.header('Access-Control-Allow-Origin', origin) + res.header( + 'Access-Control-Allow-Headers', + 'Origin, X-Requested-With, Content-Type, Accept' + ) + next() +}) + +app.use(express.json()) +app.post('/otp2/routers/default/index/graphql', (req, res) => { + graphql({ + schema: schemaWithMocks, + source: req.body.query, + variableValues: req.body.variables + }).then((data) => res.json(data)) +}) + +if (harPath) { + console.log(`Running HAR server with file ${harPath}`) + app.use(har.getMiddleware(harPath)) +} + +// Run the server is this file was executed on the command line +if (require.main === module) { + app.listen(port, () => { + console.log(`Mock server running on port ${port}`) + }) +} + +module.exports.mockServer = app diff --git a/percy/mocks/IndividualRoute.json b/percy/mocks/IndividualRoute.json new file mode 100644 index 000000000..8159eada0 --- /dev/null +++ b/percy/mocks/IndividualRoute.json @@ -0,0 +1,2146 @@ +{ + "data": { + "route": { + "gtfsId": "MARTA:19330", + "desc": null, + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority", + "url": "https://www.itsmarta.com", + "timezone": "America/New_York", + "lang": "en", + "phone": "404-848-5000" + }, + "longName": "Marietta Blvd/Joseph E Lowery Blvd", + "shortName": "1", + "mode": "BUS", + "type": 3, + "color": "FF00FF", + "textColor": "000000", + "bikesAllowed": "NO_INFORMATION", + "routeBikesAllowed": "NO_INFORMATION", + "url": "https://itsmarta.com/1.aspx", + "patterns": [ + { + "vehiclePositions": [ + { + "vehicleId": "MARTA: 1677", + "label": "1677", + "lat": 33.7447929, + "lon": -84.4175034, + "stopRelationship": { + "status": "IN_TRANSIT_TO", + "stop": { + "name": "Joseph E Lowery Blvd at Sells Ave SW", + "gtfsId": "MARTA: 100114" + } + }, + "speed": null, + "heading": 0.8943710923194885, + "lastUpdated": 1691526540, + "trip": { + "pattern": { + "id": "UGF0dGVybjpNQVJUQToxOTMzMDoxOjAx" + } + } + }, + { + "vehicleId": "MARTA: 1563", + "label": "1563", + "lat": 33.817524, + "lon": -84.447998, + "stopRelationship": { + "status": "STOPPED_AT", + "stop": { + "name": "Marietta Blvd at Coronet Way", + "gtfsId": "MARTA: 57004" + } + }, + "speed": null, + "heading": 303.4278564453125, + "lastUpdated": 1691526537, + "trip": { + "pattern": { + "id": "UGF0dGVybjpNQVJUQToxOTMzMDoxOjAx" + } + } + } + ], + "id": "UGF0dGVybjpNQVJUQToxOTMzMDoxOjAx", + "headsign": "Moores Mill Center", + "name": "1 Moores Mill Center", + "patternGeometry": { + "points": "i`|lE|~ebOfD@B?B@@@B@@B@@@B?B?DAlBIAeAAYAeAAeBAiAAaAAkF@?hA?xF@p@Bb@Bp@TbDNhBiA?aAAyAA]?eAAiB?cB?sAEgA?M?OAaACy@A{CGk@Cg@?{EA}C?YAqD@[?Y?oB?uFAsBAI???I?U?sCAaB@k@?]?}@?iC?o@?e@?q@?}@?K?_B@U?]?eB?wA?g@?cDCgB?k@AeA?yA?iAB_A@oA?q@?eCCgCC_B?a@?eJEmA?iDBE?_DEK?{B?{GA{B?Q?mJEaEAI?Q?mG?sCAKAkCCa@AcE?K?{B?uA?aBAkBCuV@U?yB?_IEK?]CWGWGqDrCo@p@q@hAu@pAw@lBe@jBWxASrBSrC?FMhBi@xGE[xEUhBe@lBa@fBY~AMfACbAcAHYBQ@YBK@a@DqAJmARyATm@Ny@Zi@R]L}@ZqAp@aAn@q@^iB`Au@^oBbA{OnIQH_Bx@iDbByFvCuCzAqNlHMFsD~AGBgCl@_@H_Dv@aMlCI@_IlB_Cd@uFfAs@JcBX@?_BXWD??cDd@yDj@w@LeARA?A@eAeAl@??qA`AgArA??q@fAABk@tAe@lByBzKi@nC??eAjD??c@dAa@|@cAzBy@bB??cA~BcAxB??yEnKeA~B", + "length": 214 + }, + "stops": [ + { + "code": "114900", + "gtfsId": "MARTA:114900", + "lat": 33.735899, + "lon": -84.413542, + "name": "West End Station", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4135, + 33.7359 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008000" + }, + { + "textColor": "000000", + "color": "00FF00" + }, + { + "textColor": "000000", + "color": "FF8080" + }, + { + "textColor": "000000", + "color": "FFFF00" + }, + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + }, + { + "textColor": "000000", + "color": "00FF00" + }, + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "00FFFF" + } + ] + }, + { + "code": "113166", + "gtfsId": "MARTA:113166", + "lat": 33.738338, + "lon": -84.416122, + "name": "Ralph D Abernathy Blvd SW at Dunn St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4161, + 33.7383 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF8080" + }, + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + } + ] + }, + { + "code": "113092", + "gtfsId": "MARTA:113092", + "lat": 33.738364, + "lon": -84.417643, + "name": "Joseph E Lowery Blvd SW at Ralph D Abernathy Blvd SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4176, + 33.7384 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + } + ] + }, + { + "code": "113094", + "gtfsId": "MARTA:113094", + "lat": 33.73929, + "lon": -84.417629, + "name": "Joseph E Lowery Blvd at 577", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4176, + 33.7393 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + } + ] + }, + { + "code": "113096", + "gtfsId": "MARTA:113096", + "lat": 33.74017, + "lon": -84.417656, + "name": "Joseph E Lowery Blvd at Oak St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4177, + 33.7402 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + } + ] + }, + { + "code": "213518", + "gtfsId": "MARTA:99973727", + "lat": 33.743427, + "lon": -84.417498, + "name": "Joseph E Lowery Blvd at Cunningham Pl", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4175, + 33.7434 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100114", + "gtfsId": "MARTA:100114", + "lat": 33.745314, + "lon": -84.41729, + "name": "Joseph E Lowery Blvd at Sells Ave SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.7453 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100115", + "gtfsId": "MARTA:100115", + "lat": 33.74634, + "lon": -84.417334, + "name": "Joseph E Lowery Blvd at Westview Dr SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.7463 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100024", + "gtfsId": "MARTA:100024", + "lat": 33.749024, + "lon": -84.417337, + "name": "Joseph E Lowery Blvd at Atlanta Student Movement Blvd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.749 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100026", + "gtfsId": "MARTA:100026", + "lat": 33.75063, + "lon": -84.417277, + "name": "Joseph E Lowery Blvd at Parsons St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.7506 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100028", + "gtfsId": "MARTA:100028", + "lat": 33.752027, + "lon": -84.417322, + "name": "Joseph E Lowery Blvd at Beckwith St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.752 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100046", + "gtfsId": "MARTA:100046", + "lat": 33.753318, + "lon": -84.417466, + "name": "Joseph E Lowery Blvd at Mitchell St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4175, + 33.7533 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100048", + "gtfsId": "MARTA:100048", + "lat": 33.754524, + "lon": -84.417346, + "name": "Joseph E Lowery Blvd at Martin L King Jr Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.7545 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904642", + "gtfsId": "MARTA:79028", + "lat": 33.756066, + "lon": -84.417371, + "name": "Ashby Station - Northbound", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7561 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904629", + "gtfsId": "MARTA:79468", + "lat": 33.75842, + "lon": -84.417483, + "name": "Joseph E Lowery Blvd NW at Magnolia St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4175, + 33.7584 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904627", + "gtfsId": "MARTA:79464", + "lat": 33.760255, + "lon": -84.417441, + "name": "Joseph E Lowery Blvd NW at Thurmond St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7603 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904750", + "gtfsId": "MARTA:79472", + "lat": 33.763459, + "lon": -84.417391, + "name": "Joseph E Lowery Blvd NW at Joseph E Boone Blvd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7635 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904946", + "gtfsId": "MARTA:79480", + "lat": 33.767004, + "lon": -84.417385, + "name": "Joseph E Lowery Blvd NW at Neal St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.767 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904873", + "gtfsId": "MARTA:79484", + "lat": 33.76994, + "lon": -84.417355, + "name": "Joseph E Lowery Blvd NW at North Ave NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7699 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904875", + "gtfsId": "MARTA:79488", + "lat": 33.772124, + "lon": -84.417336, + "name": "Joseph E Lowery Blvd NW at Fox St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.7721 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904268", + "gtfsId": "MARTA:79528", + "lat": 33.774039, + "lon": -84.417305, + "name": "Joseph E Lowery Blvd NW at Wheeler St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.774 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "213392", + "gtfsId": "MARTA:99973766", + "lat": 33.779969, + "lon": -84.417278, + "name": "Joseph E Lowery Blvd at 841", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.78 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "213388", + "gtfsId": "MARTA:99973765", + "lat": 33.782343, + "lon": -84.417253, + "name": "Joseph E Lowery Blvd NW at W Marietta St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4173, + 33.7823 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "901912", + "gtfsId": "MARTA:67234", + "lat": 33.785249, + "lon": -84.421812, + "name": "W Marietta St NW at Herndon St", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4218, + 33.7852 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008080" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "901911", + "gtfsId": "MARTA:67232", + "lat": 33.785523, + "lon": -84.423791, + "name": "W Marietta St NW at Longley Ave NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4238, + 33.7855 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008080" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "213421", + "gtfsId": "MARTA:99973795", + "lat": 33.789237, + "lon": -84.428482, + "name": "Marietta Blvd at Huff Rd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4285, + 33.7892 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210972", + "gtfsId": "MARTA:99971216", + "lat": 33.791205, + "lon": -84.429714, + "name": "Marietta Blvd NW at Elaine Ave NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4297, + 33.7912 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210973", + "gtfsId": "MARTA:99971217", + "lat": 33.794828, + "lon": -84.431938, + "name": "Marietta Blvd at Tacoma Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4319, + 33.7948 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210974", + "gtfsId": "MARTA:99971218", + "lat": 33.798165, + "lon": -84.433944, + "name": "Marietta Blvd at 1595", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4339, + 33.7982 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "211963", + "gtfsId": "MARTA:99972311", + "lat": 33.800705, + "lon": -84.435525, + "name": "Marietta Blvd at 1695", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4355, + 33.8007 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210975", + "gtfsId": "MARTA:99971219", + "lat": 33.802324, + "lon": -84.436256, + "name": "Marietta Blvd at Carroll Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4363, + 33.8023 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210976", + "gtfsId": "MARTA:99971220", + "lat": 33.805545, + "lon": -84.43725, + "name": "Marietta Blvd at Plymouth Rd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4373, + 33.8055 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "211037", + "gtfsId": "MARTA:99971288", + "lat": 33.810288, + "lon": -84.438693, + "name": "Marietta Blvd at Chattahoochee Ave", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4387, + 33.8103 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "901457", + "gtfsId": "MARTA:67160", + "lat": 33.812825, + "lon": -84.439287, + "name": "Marietta Blvd at 2095", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4393, + 33.8128 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "901458", + "gtfsId": "MARTA:67161", + "lat": 33.814527, + "lon": -84.440842, + "name": "Marietta Blvd at Bolton Pl", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4408, + 33.8145 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "213670", + "gtfsId": "MARTA:99974025", + "lat": 33.816361, + "lon": -84.445786, + "name": "Marietta Blvd at Bolton Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4458, + 33.8164 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "900375", + "gtfsId": "MARTA:57004", + "lat": 33.817514, + "lon": -84.447838, + "name": "Marietta Blvd at Coronet Way", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4478, + 33.8175 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF80" + }, + { + "textColor": "000000", + "color": "00FFFF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "900349", + "gtfsId": "MARTA:57008", + "lat": 33.819344, + "lon": -84.451044, + "name": "Marietta Blvd NW at Moores Mill Rd NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.451, + 33.8193 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF80" + }, + { + "textColor": "000000", + "color": "00FFFF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + } + ] + }, + { + "vehiclePositions": [], + "id": "UGF0dGVybjpNQVJUQToxOTMzMDowOjAx", + "headsign": "West End Station", + "name": "1 West End Station", + "patternGeometry": { + "points": "ailmEvjmbOiCvFGHiAbCm@rAc@`AYr@OAO?]GlAgKd@_Ef@oE@?Dk@TkC??pAgArBaBjDgC~BcBXUXEFn@h@??x@cB@A`AyBdAcC??dAkD??h@oCZ{A|A_Id@mBj@uAr@kA??fAsApAaA??d@W^UfA_@@?dASv@MxDk@pC_@PE??vB_@A?bBYr@KtFgA~Be@~HmBHA`MmC~Cw@n@OvBg@FC`EgBv@_@vKyFvDoBxFwChDcBbAg@l@[zOoIb@UjAm@~CaBp@_@`Ao@pAq@|@[fAa@x@[l@OxAUlASpAK`@EJAXCPAXCbAIBcALgAToABO`@gBd@mBTiBVqDBg@n@wHLiBFkAJoARsBVyAd@kBv@mBt@qAp@iAn@q@h@a@fCqBVFVFh@B~HDxB?fB?bTAjBB`B@tA?jA?n@?nE?`@@jCBf@@vB@bG?H?Z?`E@lJD`C?J?zG@zB?J?~CDfBAfAAlA?bJD@?`C?fCBvDBP?|@?~@AhACxA?dA?@?pC@bDB~B?dB??tBAJ?h@?R?p@?tA?hB?^?|@?hA?pA?NAlC@D?T?H?H?rB@tF@~A?N?X?pD?ZAvD@bG@j@BnBDj@@x@@`ABN@L?fA?rADlE?v@@j@?xA@jC@OiBUcDGuAA[?U?yF?iABsD@_@?c@hF@??AxA@B?B@B@B@@@B@@B?FBlE@", + "length": 227 + }, + "stops": [ + { + "code": "900349", + "gtfsId": "MARTA:57008", + "lat": 33.819344, + "lon": -84.451044, + "name": "Marietta Blvd NW at Moores Mill Rd NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.451, + 33.8193 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF80" + }, + { + "textColor": "000000", + "color": "00FFFF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "900378", + "gtfsId": "MARTA:57012", + "lat": 33.820737, + "lon": -84.452113, + "name": "Bolton Rd NW at Moores Mill Rd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4521, + 33.8207 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF80" + }, + { + "textColor": "000000", + "color": "00FFFF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "900379", + "gtfsId": "MARTA:57014", + "lat": 33.820318, + "lon": -84.449893, + "name": "Bolton Rd NW at Coronet Way NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4499, + 33.8203 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF80" + }, + { + "textColor": "000000", + "color": "00FFFF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "213759", + "gtfsId": "MARTA:99974143", + "lat": 33.818389, + "lon": -84.44766, + "name": "Coronet Way at Pine Grove Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4477, + 33.8184 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF80" + }, + { + "textColor": "000000", + "color": "00FFFF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "900394", + "gtfsId": "MARTA:57062", + "lat": 33.816713, + "lon": -84.446824, + "name": "Marietta Blvd NW at Coronet Way NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4468, + 33.8167 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "213592", + "gtfsId": "MARTA:99973937", + "lat": 33.815322, + "lon": -84.443486, + "name": "Marietta Blvd at 2210", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4435, + 33.8153 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "901803", + "gtfsId": "MARTA:67196", + "lat": 33.813256, + "lon": -84.439754, + "name": "Marietta Blvd NW at 2130", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4398, + 33.8133 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "00FF00" + } + ] + }, + { + "code": "211036", + "gtfsId": "MARTA:99971287", + "lat": 33.810494, + "lon": -84.438824, + "name": "Marietta Blvd at Chattahoochee Ave", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4388, + 33.8105 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210977", + "gtfsId": "MARTA:99971221", + "lat": 33.805501, + "lon": -84.437457, + "name": "Marietta Blvd at Plymouth Rd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4375, + 33.8055 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210978", + "gtfsId": "MARTA:99971222", + "lat": 33.802226, + "lon": -84.43631, + "name": "Marietta Blvd at Carroll Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4363, + 33.8022 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "211962", + "gtfsId": "MARTA:99972310", + "lat": 33.800293, + "lon": -84.435491, + "name": "Marietta Blvd at 1650", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4355, + 33.8003 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210979", + "gtfsId": "MARTA:99971223", + "lat": 33.798272, + "lon": -84.434183, + "name": "Marietta Blvd at 1594", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4342, + 33.7983 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210980", + "gtfsId": "MARTA:99971224", + "lat": 33.794935, + "lon": -84.432112, + "name": "Marietta Blvd at Tacoma Dr", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4321, + 33.7949 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "210981", + "gtfsId": "MARTA:99971225", + "lat": 33.791786, + "lon": -84.430271, + "name": "Marietta Blvd at Elaine Ave", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4303, + 33.7918 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "902121", + "gtfsId": "MARTA:67114", + "lat": 33.785946, + "lon": -84.426788, + "name": "W Marietta St NW at Rice St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4268, + 33.7859 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008080" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "902123", + "gtfsId": "MARTA:67118", + "lat": 33.785328, + "lon": -84.424187, + "name": "W Marietta St NW at Longley Ave NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4242, + 33.7853 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008080" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "902124", + "gtfsId": "MARTA:67120", + "lat": 33.785076, + "lon": -84.421493, + "name": "W Marietta St NW at Herndon St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4215, + 33.7851 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008080" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "213389", + "gtfsId": "MARTA:99972852", + "lat": 33.783371, + "lon": -84.417833, + "name": "W Marietta St NW at Joseph E Lowery Blvd NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4178, + 33.7834 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008080" + }, + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "213393", + "gtfsId": "MARTA:99973767", + "lat": 33.779559, + "lon": -84.417391, + "name": "Joseph E Lowery Blvd at 841", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7796 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904644", + "gtfsId": "MARTA:79040", + "lat": 33.774334, + "lon": -84.417408, + "name": "Joseph E Lowery Blvd at Wheeler St", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7743 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904625", + "gtfsId": "MARTA:79450", + "lat": 33.771989, + "lon": -84.417447, + "name": "Joseph E Lowery Blvd NW at Fox St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.772 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904698", + "gtfsId": "MARTA:79454", + "lat": 33.770083, + "lon": -84.417431, + "name": "Joseph E Lowery Blvd NW at North Ave NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4174, + 33.7701 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904837", + "gtfsId": "MARTA:79050", + "lat": 33.766449, + "lon": -84.417481, + "name": "Joseph E Lowery Blvd NW at Neal St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4175, + 33.7664 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904748", + "gtfsId": "MARTA:79460", + "lat": 33.762968, + "lon": -84.417543, + "name": "Joseph E Lowery Blvd NW at Joseph E Boone Blvd", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4175, + 33.763 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904957", + "gtfsId": "MARTA:79058", + "lat": 33.760434, + "lon": -84.417529, + "name": "Joseph E Lowery Blvd NW at Thurmond St NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4175, + 33.7604 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904628", + "gtfsId": "MARTA:79466", + "lat": 33.75808, + "lon": -84.417569, + "name": "Joseph E Lowery Blvd NW at Mayson Turner Rd NW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4176, + 33.7581 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "904948", + "gtfsId": "MARTA:79496", + "lat": 33.756281, + "lon": -84.417724, + "name": "Ashby Station - Southbound", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4177, + 33.7563 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "100004", + "gtfsId": "MARTA:100004", + "lat": 33.752569, + "lon": -84.4176, + "name": "Joseph E Lowery Blvd at Beckwith St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4176, + 33.7526 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "FF0000" + } + ] + }, + { + "code": "100006", + "gtfsId": "MARTA:100006", + "lat": 33.751251, + "lon": -84.417762, + "name": "Joseph E Lowery Blvd at Parsons St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4178, + 33.7513 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "FF0000" + } + ] + }, + { + "code": "100008", + "gtfsId": "MARTA:100008", + "lat": 33.750004, + "lon": -84.417604, + "name": "Joseph E Lowery Blvd at Ashby Grv SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4176, + 33.75 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "FF0000" + } + ] + }, + { + "code": "100010", + "gtfsId": "MARTA:100010", + "lat": 33.749212, + "lon": -84.417594, + "name": "Joseph E Lowery Blvd at Fair St SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4176, + 33.7492 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "FF0000" + } + ] + }, + { + "code": "100012", + "gtfsId": "MARTA:100012", + "lat": 33.746685, + "lon": -84.417803, + "name": "Joseph E Lowery Blvd at Westview Dr SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4178, + 33.7467 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "FF0000" + } + ] + }, + { + "code": "100014", + "gtfsId": "MARTA:100014", + "lat": 33.745587, + "lon": -84.417784, + "name": "Joseph E Lowery Blvd at Sells Ave SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4178, + 33.7456 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "FF0000" + } + ] + }, + { + "code": "213517", + "gtfsId": "MARTA:99973633", + "lat": 33.742445, + "lon": -84.417692, + "name": "Joseph E Lowery Blvd at Lucile Ave SW", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4177, + 33.7424 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + } + ] + }, + { + "code": "113098", + "gtfsId": "MARTA:113098", + "lat": 33.739363, + "lon": -84.417743, + "name": "Joseph E Lowery Blvd at 577", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4177, + 33.7394 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + } + ] + }, + { + "code": "113122", + "gtfsId": "MARTA:113122", + "lat": 33.738201, + "lon": -84.415785, + "name": "Ralph David Abernath Blvd SW at Evans", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4158, + 33.7382 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "FF8080" + }, + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + } + ] + }, + { + "code": "114082", + "gtfsId": "MARTA:114082", + "lat": 33.738185, + "lon": -84.413155, + "name": "Ralph D Abernathy Blvd at W Whitehall St", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4132, + 33.7382 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "00FF00" + }, + { + "textColor": "000000", + "color": "FF8080" + }, + { + "textColor": "000000", + "color": "FFFF00" + }, + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + }, + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "00FFFF" + } + ] + }, + { + "code": "114900", + "gtfsId": "MARTA:114900", + "lat": 33.735899, + "lon": -84.413542, + "name": "West End Station", + "locationType": "STOP", + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4135, + 33.7359 + ] + } + }, + "routes": [ + { + "textColor": "000000", + "color": "008000" + }, + { + "textColor": "000000", + "color": "00FF00" + }, + { + "textColor": "000000", + "color": "FF8080" + }, + { + "textColor": "000000", + "color": "FFFF00" + }, + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "FF00FF" + }, + { + "textColor": "000000", + "color": "A6CAF0" + }, + { + "textColor": "000000", + "color": "00FF00" + }, + { + "textColor": "000000", + "color": "FF0000" + }, + { + "textColor": "000000", + "color": "00FFFF" + } + ] + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/percy/mocks/NearbyResponse.json b/percy/mocks/NearbyResponse.json new file mode 100644 index 000000000..607766394 --- /dev/null +++ b/percy/mocks/NearbyResponse.json @@ -0,0 +1,7201 @@ +{ + "data": { + "nearest": { + "edges": [ + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjAuMTk4O1UzUnZjRHBOUVZKVVFUb3hNREl4TlRJ", + "distance": 0, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQToxMDIxNTI", + "lat": 33.750043, + "lon": -84.388393, + "name": "Martin L King J Dr at Washington St SW", + "code": "803", + "gtfsId": "MARTA:803", + "stoptimesForPatterns": [ + { + "pattern": { + "headsign": "West Lake Station", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "813", + "type": 3, + "mode": "BUS", + "longName": "Atlanta University Center", + "color": "00FFFF", + "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, + "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", + "trip": { + "route": { + "shortName": "813" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "21", + "type": 3, + "mode": "BUS", + "longName": "Memorial Drive", + "color": "FF00FF", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80686, + "scheduledDeparture": 80686, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78886, + "scheduledDeparture": 78886, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "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", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80007, + "scheduledDeparture": 80007, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78207, + "scheduledDeparture": 78207, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "serviceDay": 1698638400, + "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", + "trip": { + "route": { + "shortName": "55" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjQ5LjA2NDAwMDAwMDAwMDAxO1UzUnZjRHBEYjJKaVRHbHVZem81Tnpj", + "distance": 49, + "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" + } + } + } + ] + }, + { + "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" + } + } + } + ] + } + ] + } + } + }, + { + "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" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73711, + "scheduledDeparture": 73711, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "42" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "21", + "type": 3, + "mode": "BUS", + "longName": "Memorial Drive", + "color": "FF00FF", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80735, + "scheduledDeparture": 80735, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78935, + "scheduledDeparture": 78935, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 77135, + "scheduledDeparture": 77135, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": -142, + "realtimeState": "UPDATED", + "realtimeDeparture": 75193, + "scheduledDeparture": 75335, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": -6, + "realtimeState": "UPDATED", + "realtimeDeparture": 73529, + "scheduledDeparture": 73535, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "21" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station via Amal Drive", + "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": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 35416, + "scheduledDeparture": 35416, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 30662, + "scheduledDeparture": 30662, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 27062, + "scheduledDeparture": 27062, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23462, + "scheduledDeparture": 23462, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 18571, + "scheduledDeparture": 18571, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station via Cooper Street", + "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": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 28921, + "scheduledDeparture": 28921, + "headsign": "Five Points Station via Cooper Street", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25321, + "scheduledDeparture": 25321, + "headsign": "Five Points Station via Cooper Street", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80040, + "scheduledDeparture": 80040, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78240, + "scheduledDeparture": 78240, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "serviceDay": 1698638400, + "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", + "trip": { + "route": { + "shortName": "55" + } + } + } + ] + } + ] + } + } + }, + { + "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", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "21", + "type": 3, + "mode": "BUS", + "longName": "Memorial Drive", + "color": "FF00FF", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 82025, + "scheduledDeparture": 82025, + "headsign": "Kensington Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80225, + "scheduledDeparture": 80225, + "headsign": "Kensington Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78425, + "scheduledDeparture": 78425, + "headsign": "Kensington Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76625, + "scheduledDeparture": 76625, + "headsign": "Kensington Station", + "trip": { + "route": { + "shortName": "21" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 283, + "realtimeState": "UPDATED", + "realtimeDeparture": 75108, + "scheduledDeparture": 74825, + "headsign": "Kensington Station", + "trip": { + "route": { + "shortName": "21" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Forest Park", + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 81107, + "scheduledDeparture": 81107, + "headsign": "Forest Park", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 79307, + "scheduledDeparture": 79307, + "headsign": "Forest Park", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "serviceDay": 1698638400, + "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", + "trip": { + "route": { + "shortName": "55" + } + } + }, + { + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 71100, + "scheduledDeparture": 71100, + "headsign": "Sweeper", + "trip": { + "route": { + "shortName": "SWPR" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 69300, + "scheduledDeparture": 69300, + "headsign": "Sweeper", + "trip": { + "route": { + "shortName": "SWPR" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 67500, + "scheduledDeparture": 67500, + "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": 57300, + "scheduledDeparture": 57300, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 56700, + "scheduledDeparture": 56700, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 56100, + "scheduledDeparture": 56100, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54900, + "scheduledDeparture": 54900, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 53700, + "scheduledDeparture": 53700, + "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": 61380, + "scheduledDeparture": 61380, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 59580, + "scheduledDeparture": 59580, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 57780, + "scheduledDeparture": 57780, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 55980, + "scheduledDeparture": 55980, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54180, + "scheduledDeparture": 54180, + "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": 63480, + "scheduledDeparture": 63480, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 61680, + "scheduledDeparture": 61680, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 59880, + "scheduledDeparture": 59880, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58080, + "scheduledDeparture": 58080, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54480, + "scheduledDeparture": 54480, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + } + ] + } + ] + } + } + }, + { + "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", + "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": 28770, + "scheduledDeparture": 28770, + "headsign": "453 Downtown / Midtown", + "trip": { + "route": { + "shortName": "453" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26969, + "scheduledDeparture": 26969, + "headsign": "453 Downtown / Midtown", + "trip": { + "route": { + "shortName": "453" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24932, + "scheduledDeparture": 24932, + "headsign": "453 Downtown / Midtown", + "trip": { + "route": { + "shortName": "453" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 22778, + "scheduledDeparture": 22778, + "headsign": "453 Downtown / Midtown", + "trip": { + "route": { + "shortName": "453" + } + } + } + ] + }, + { + "pattern": { + "headsign": "432 Downtown", + "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": 29970, + "scheduledDeparture": 29970, + "headsign": "432 Downtown", + "trip": { + "route": { + "shortName": "432" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 27989, + "scheduledDeparture": 27989, + "headsign": "432 Downtown", + "trip": { + "route": { + "shortName": "432" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25359, + "scheduledDeparture": 25359, + "headsign": "432 Downtown", + "trip": { + "route": { + "shortName": "432" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24155, + "scheduledDeparture": 24155, + "headsign": "432 Downtown", + "trip": { + "route": { + "shortName": "432" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21404, + "scheduledDeparture": 21404, + "headsign": "432 Downtown", + "trip": { + "route": { + "shortName": "432" + } + } + } + ] + }, + { + "pattern": { + "headsign": "440 Downtown / Midtown", + "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": 31710, + "scheduledDeparture": 31710, + "headsign": "440 Downtown / Midtown", + "trip": { + "route": { + "shortName": "440" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 28465, + "scheduledDeparture": 28465, + "headsign": "440 Downtown / Midtown", + "trip": { + "route": { + "shortName": "440" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24568, + "scheduledDeparture": 24568, + "headsign": "440 Downtown / Midtown", + "trip": { + "route": { + "shortName": "440" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21218, + "scheduledDeparture": 21218, + "headsign": "440 Downtown / Midtown", + "trip": { + "route": { + "shortName": "440" + } + } + } + ] + }, + { + "pattern": { + "headsign": "442 Downtown", + "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": 26487, + "scheduledDeparture": 26487, + "headsign": "442 Downtown", + "trip": { + "route": { + "shortName": "442" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 20923, + "scheduledDeparture": 20923, + "headsign": "442 Downtown", + "trip": { + "route": { + "shortName": "442" + } + } + } + ] + }, + { + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 27446, + "scheduledDeparture": 27446, + "headsign": "441 Downtown / Midtown", + "trip": { + "route": { + "shortName": "441" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25468, + "scheduledDeparture": 25468, + "headsign": "441 Downtown / Midtown", + "trip": { + "route": { + "shortName": "441" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21941, + "scheduledDeparture": 21941, + "headsign": "441 Downtown / Midtown", + "trip": { + "route": { + "shortName": "441" + } + } + } + ] + }, + { + "pattern": { + "headsign": "430 Downtown", + "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": 30093, + "scheduledDeparture": 30093, + "headsign": "430 Downtown", + "trip": { + "route": { + "shortName": "430" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 27396, + "scheduledDeparture": 27396, + "headsign": "430 Downtown", + "trip": { + "route": { + "shortName": "430" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26434, + "scheduledDeparture": 26434, + "headsign": "430 Downtown", + "trip": { + "route": { + "shortName": "430" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24520, + "scheduledDeparture": 24520, + "headsign": "430 Downtown", + "trip": { + "route": { + "shortName": "430" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 22960, + "scheduledDeparture": 22960, + "headsign": "430 Downtown", + "trip": { + "route": { + "shortName": "430" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjMwOS42NTA1O1UzUnZjRHBOUVZKVVFUb3hNREl3TkRR", + "distance": 309, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQToxMDIwNDQ", + "lat": 33.7523, + "lon": -84.386449, + "name": "Decatur St SE at Collins St SE", + "code": "102044", + "gtfsId": "MARTA:102044", + "stoptimesForPatterns": [ + { + "pattern": { + "headsign": "Five Points Station via East Side Drive", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "186", + "type": 3, + "mode": "BUS", + "longName": "Rainbow Drive / South Dekalb", + "color": "00FF00", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 82115, + "scheduledDeparture": 82115, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80315, + "scheduledDeparture": 80315, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78515, + "scheduledDeparture": 78515, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 83, + "realtimeState": "UPDATED", + "realtimeDeparture": 76798, + "scheduledDeparture": 76715, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": -310, + "realtimeState": "UPDATED", + "realtimeDeparture": 74605, + "scheduledDeparture": 74915, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "186", + "type": 3, + "mode": "BUS", + "longName": "Rainbow Drive / South Dekalb", + "color": "00FF00", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26885, + "scheduledDeparture": 26885, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25085, + "scheduledDeparture": 25085, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23285, + "scheduledDeparture": 23285, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21485, + "scheduledDeparture": 21485, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 19715, + "scheduledDeparture": 19715, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjMwOS43ODM7VTNSdmNEcE5RVkpVUVRveE1ESXdOakE", + "distance": 309, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQToxMDIwNjA", + "lat": 33.749512, + "lon": -84.390693, + "name": "Central Ave SW at Mitchell St SW", + "code": "600024", + "gtfsId": "MARTA:102060", + "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": 83271, + "scheduledDeparture": 83271, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80871, + "scheduledDeparture": 80871, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78471, + "scheduledDeparture": 78471, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": -151, + "realtimeState": "UPDATED", + "realtimeDeparture": 75920, + "scheduledDeparture": 76071, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73671, + "scheduledDeparture": 73671, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "42" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station via Amal Drive", + "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": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 35369, + "scheduledDeparture": 35369, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 30608, + "scheduledDeparture": 30608, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 27008, + "scheduledDeparture": 27008, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23408, + "scheduledDeparture": 23408, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 18531, + "scheduledDeparture": 18531, + "headsign": "Five Points Station via Amal Drive", + "trip": { + "route": { + "shortName": "42" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station via Cooper Street", + "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": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 28867, + "scheduledDeparture": 28867, + "headsign": "Five Points Station via Cooper Street", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25267, + "scheduledDeparture": 25267, + "headsign": "Five Points Station via Cooper Street", + "trip": { + "route": { + "shortName": "42" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 20984, + "scheduledDeparture": 20984, + "headsign": "Five Points Station via Cooper Street", + "trip": { + "route": { + "shortName": "42" + } + } + } + ] + } + ] + } + } + }, + { + "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", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "186", + "type": 3, + "mode": "BUS", + "longName": "Rainbow Drive / South Dekalb", + "color": "00FF00", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 80368, + "scheduledDeparture": 80368, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78568, + "scheduledDeparture": 78568, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 83, + "realtimeState": "UPDATED", + "realtimeDeparture": 76851, + "scheduledDeparture": 76768, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": -238, + "realtimeState": "UPDATED", + "realtimeDeparture": 74730, + "scheduledDeparture": 74968, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 138, + "realtimeState": "UPDATED", + "realtimeDeparture": 73306, + "scheduledDeparture": 73168, + "headsign": "Five Points Station via East Side Drive", + "trip": { + "route": { + "shortName": "186" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Five Points Station", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "186", + "type": 3, + "mode": "BUS", + "longName": "Rainbow Drive / South Dekalb", + "color": "00FF00", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26958, + "scheduledDeparture": 26958, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25158, + "scheduledDeparture": 25158, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23358, + "scheduledDeparture": 23358, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21558, + "scheduledDeparture": 21558, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 19768, + "scheduledDeparture": 19768, + "headsign": "Five Points Station", + "trip": { + "route": { + "shortName": "186" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjMyMi44OTQ1MDAwMDAwMDAwNTtVM1J2Y0RwSGQybHVibVYwZEVOdmRXNTBlVlJ5WVc1emFYUTZOVEl3", + "distance": 322, + "place": { + "__typename": "Stop", + "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6NTIw", + "lat": 33.749667, + "lon": -84.390799, + "name": "Mitchell Street Southwest at Central Avenue Southwest", + "code": "600037", + "gtfsId": "GwinnettCountyTransit:520", + "stoptimesForPatterns": [ + { + "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": 27720, + "scheduledDeparture": 27720, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26400, + "scheduledDeparture": 26400, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24600, + "scheduledDeparture": 24600, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23400, + "scheduledDeparture": 23400, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21900, + "scheduledDeparture": 21900, + "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": 31140, + "scheduledDeparture": 31140, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 29040, + "scheduledDeparture": 29040, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26700, + "scheduledDeparture": 26700, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24900, + "scheduledDeparture": 24900, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23100, + "scheduledDeparture": 23100, + "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": 30480, + "scheduledDeparture": 30480, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 28680, + "scheduledDeparture": 28680, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26700, + "scheduledDeparture": 26700, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24900, + "scheduledDeparture": 24900, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23100, + "scheduledDeparture": 23100, + "headsign": "Downtown Atlanta", + "trip": { + "route": { + "shortName": "102" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjMyNi4zODMwMDAwMDAwMDAxO1UzUnZjRHBOUVZKVVFUb3hPVGc", + "distance": 326, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQToxOTg", + "lat": 33.750161, + "lon": -84.385915, + "name": "Georgia State Station", + "code": "908618", + "gtfsId": "MARTA:198", + "stoptimesForPatterns": [ + { + "pattern": { + "headsign": "BANKHEAD STATION", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "Green", + "type": 1, + "mode": "SUBWAY", + "longName": "Green", + "color": "009D4B", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 18720, + "scheduledDeparture": 18720, + "headsign": "BANKHEAD STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 17520, + "scheduledDeparture": 17520, + "headsign": "BANKHEAD STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76320, + "scheduledDeparture": 76320, + "headsign": "BANKHEAD STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 75120, + "scheduledDeparture": 75120, + "headsign": "BANKHEAD STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73920, + "scheduledDeparture": 73920, + "headsign": "BANKHEAD STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + } + ] + }, + { + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 78120, + "scheduledDeparture": 78120, + "headsign": "H E HOLMES STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76920, + "scheduledDeparture": 76920, + "headsign": "H E HOLMES STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 75720, + "scheduledDeparture": 75720, + "headsign": "H E HOLMES STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 74520, + "scheduledDeparture": 74520, + "headsign": "H E HOLMES STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "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, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 91740, + "scheduledDeparture": 91740, + "headsign": "H E HOLMES STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjMzMC4wMDQwMDAwMDAwMDAxO1UzUnZjRHBOUVZKVVFUb3lNREU", + "distance": 330, + "place": { + "__typename": "Stop", + "id": "U3RvcDpNQVJUQToyMDE", + "lat": 33.750143, + "lon": -84.385882, + "name": "Georgia State Station", + "code": "908696", + "gtfsId": "MARTA:201", + "stoptimesForPatterns": [ + { + "pattern": { + "headsign": "CANDLER PARK STATION", + "route": { + "agency": { + "name": "Metropolitan Atlanta Rapid Transit Authority", + "gtfsId": "MARTA:MARTA" + }, + "shortName": "Green", + "type": 1, + "mode": "SUBWAY", + "longName": "Green", + "color": "009D4B", + "textColor": "000000" + } + }, + "stoptimes": [ + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 19380, + "scheduledDeparture": 19380, + "headsign": "CANDLER PARK STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 18180, + "scheduledDeparture": 18180, + "headsign": "CANDLER PARK STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 75780, + "scheduledDeparture": 75780, + "headsign": "CANDLER PARK STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 74580, + "scheduledDeparture": 74580, + "headsign": "CANDLER PARK STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73380, + "scheduledDeparture": 73380, + "headsign": "CANDLER PARK STATION", + "trip": { + "route": { + "shortName": "Green" + } + } + } + ] + }, + { + "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" + } + } + } + ] + }, + { + "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": 78720, + "scheduledDeparture": 78720, + "headsign": "INDIAN CREEK STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 77520, + "scheduledDeparture": 77520, + "headsign": "INDIAN CREEK STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 76320, + "scheduledDeparture": 76320, + "headsign": "INDIAN CREEK STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 75120, + "scheduledDeparture": 75120, + "headsign": "INDIAN CREEK STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + }, + { + "serviceDay": 1698638400, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 73920, + "scheduledDeparture": 73920, + "headsign": "INDIAN CREEK STATION", + "trip": { + "route": { + "shortName": "Blue" + } + } + } + ] + } + ] + } + } + }, + { + "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", + "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": 61507, + "scheduledDeparture": 61507, + "headsign": "485 Hickory Grove", + "trip": { + "route": { + "shortName": "485" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 59707, + "scheduledDeparture": 59707, + "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": 60307, + "scheduledDeparture": 60307, + "headsign": "490 Canton / Woodstock", + "trip": { + "route": { + "shortName": "490" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58507, + "scheduledDeparture": 58507, + "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": 27681, + "scheduledDeparture": 27681, + "headsign": "463 Downtown / Midtown", + "trip": { + "route": { + "shortName": "463" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26961, + "scheduledDeparture": 26961, + "headsign": "463 Downtown / Midtown", + "trip": { + "route": { + "shortName": "463" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25241, + "scheduledDeparture": 25241, + "headsign": "463 Downtown / Midtown", + "trip": { + "route": { + "shortName": "463" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 23021, + "scheduledDeparture": 23021, + "headsign": "463 Downtown / Midtown", + "trip": { + "route": { + "shortName": "463" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21600, + "scheduledDeparture": 21600, + "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": 61430, + "scheduledDeparture": 61430, + "headsign": "480 Acworth / Town Center", + "trip": { + "route": { + "shortName": "480" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 57792, + "scheduledDeparture": 57792, + "headsign": "480 Acworth / Town Center", + "trip": { + "route": { + "shortName": "480" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54192, + "scheduledDeparture": 54192, + "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": 29218, + "scheduledDeparture": 29218, + "headsign": "476 Downtown / Midtown", + "trip": { + "route": { + "shortName": "476" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 27138, + "scheduledDeparture": 27138, + "headsign": "476 Downtown / Midtown", + "trip": { + "route": { + "shortName": "476" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24978, + "scheduledDeparture": 24978, + "headsign": "476 Downtown / Midtown", + "trip": { + "route": { + "shortName": "476" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21619, + "scheduledDeparture": 21619, + "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": 62330, + "scheduledDeparture": 62330, + "headsign": "416 Dacula", + "trip": { + "route": { + "shortName": "416" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58692, + "scheduledDeparture": 58692, + "headsign": "416 Dacula", + "trip": { + "route": { + "shortName": "416" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 55092, + "scheduledDeparture": 55092, + "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": 62030, + "scheduledDeparture": 62030, + "headsign": "413 Hamilton Mill / Mall of Georgia", + "trip": { + "route": { + "shortName": "413" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58392, + "scheduledDeparture": 58392, + "headsign": "413 Hamilton Mill / Mall of Georgia", + "trip": { + "route": { + "shortName": "413" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54492, + "scheduledDeparture": 54492, + "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": 58623, + "scheduledDeparture": 58623, + "headsign": "400 Cumming", + "trip": { + "route": { + "shortName": "400" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 56823, + "scheduledDeparture": 56823, + "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": 28961, + "scheduledDeparture": 28961, + "headsign": "426 Downtown", + "trip": { + "route": { + "shortName": "426" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24021, + "scheduledDeparture": 24021, + "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": 26580, + "scheduledDeparture": 26580, + "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": 31401, + "scheduledDeparture": 31401, + "headsign": "426 Downtown", + "trip": { + "route": { + "shortName": "426" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 22500, + "scheduledDeparture": 22500, + "headsign": "426 Downtown", + "trip": { + "route": { + "shortName": "426" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 20600, + "scheduledDeparture": 20600, + "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": 28121, + "scheduledDeparture": 28121, + "headsign": "426 Downtown", + "trip": { + "route": { + "shortName": "426" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26581, + "scheduledDeparture": 26581, + "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": 29341, + "scheduledDeparture": 29341, + "headsign": "419 Downtown", + "trip": { + "route": { + "shortName": "419" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 28561, + "scheduledDeparture": 28561, + "headsign": "419 Downtown", + "trip": { + "route": { + "shortName": "419" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 26301, + "scheduledDeparture": 26301, + "headsign": "419 Downtown", + "trip": { + "route": { + "shortName": "419" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24701, + "scheduledDeparture": 24701, + "headsign": "419 Downtown", + "trip": { + "route": { + "shortName": "419" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 21300, + "scheduledDeparture": 21300, + "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": 28241, + "scheduledDeparture": 28241, + "headsign": "426 Downtown", + "trip": { + "route": { + "shortName": "426" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 24581, + "scheduledDeparture": 24581, + "headsign": "426 Downtown", + "trip": { + "route": { + "shortName": "426" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjM3Ny44MTk0OTk5OTk5OTk5O1UzUnZjRHBEYjJKaVRHbHVZem81Tmpn", + "distance": 377, + "place": { + "__typename": "Stop", + "id": "U3RvcDpDb2JiTGluYzo5Njg", + "lat": 33.752412, + "lon": -84.388429, + "name": "Central Ave at Wall St", + "code": "600002", + "gtfsId": "CobbLinc:968", + "stoptimesForPatterns": [ + { + "pattern": { + "headsign": "Marietta Transfer Center", + "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": 67885, + "scheduledDeparture": 67885, + "headsign": "Marietta Transfer Center", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 64968, + "scheduledDeparture": 64968, + "headsign": "Marietta Transfer Center", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 61668, + "scheduledDeparture": 61668, + "headsign": "Marietta Transfer Center", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 59508, + "scheduledDeparture": 59508, + "headsign": "Marietta Transfer Center", + "trip": { + "route": { + "shortName": "101" + } + } + } + ] + }, + { + "pattern": { + "headsign": "Busbee Park & Ride", + "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": 65864, + "scheduledDeparture": 65864, + "headsign": "Busbee Park & Ride", + "trip": { + "route": { + "shortName": "100" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 63164, + "scheduledDeparture": 63164, + "headsign": "Busbee Park & Ride", + "trip": { + "route": { + "shortName": "100" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 61364, + "scheduledDeparture": 61364, + "headsign": "Busbee Park & Ride", + "trip": { + "route": { + "shortName": "100" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58664, + "scheduledDeparture": 58664, + "headsign": "Busbee Park & Ride", + "trip": { + "route": { + "shortName": "100" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 55964, + "scheduledDeparture": 55964, + "headsign": "Busbee Park & Ride", + "trip": { + "route": { + "shortName": "100" + } + } + } + ] + } + ] + } + } + }, + { + "node": { + "id": "cGxhY2VBdERpc3RhbmNlOjM3Ny44MTk0OTk5OTk5OTk5O1UzUnZjRHBIZDJsdWJtVjBkRU52ZFc1MGVWUnlZVzV6YVhRNk1qZzE", + "distance": 377, + "place": { + "__typename": "Stop", + "id": "U3RvcDpHd2lubmV0dENvdW50eVRyYW5zaXQ6Mjg1", + "lat": 33.752412, + "lon": -84.388429, + "name": "Central Avenue at Wall Street", + "code": "600002", + "gtfsId": "GwinnettCountyTransit:285", + "stoptimesForPatterns": [ + { + "pattern": { + "headsign": "Sugarloaf Mills", + "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": 29427, + "scheduledDeparture": 29427, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103A" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 25473, + "scheduledDeparture": 25473, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103A" + } + } + } + ] + }, + { + "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": 71820, + "scheduledDeparture": 71820, + "headsign": "Sweeper", + "trip": { + "route": { + "shortName": "SWPR" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 70020, + "scheduledDeparture": 70020, + "headsign": "Sweeper", + "trip": { + "route": { + "shortName": "SWPR" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 68220, + "scheduledDeparture": 68220, + "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": 57993, + "scheduledDeparture": 57993, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 57393, + "scheduledDeparture": 57393, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 56793, + "scheduledDeparture": 56793, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 55593, + "scheduledDeparture": 55593, + "headsign": "Sugarloaf Mills", + "trip": { + "route": { + "shortName": "103" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54393, + "scheduledDeparture": 54393, + "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": 62013, + "scheduledDeparture": 62013, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 60213, + "scheduledDeparture": 60213, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58413, + "scheduledDeparture": 58413, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 56613, + "scheduledDeparture": 56613, + "headsign": "I-985 P&R", + "trip": { + "route": { + "shortName": "101" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 54813, + "scheduledDeparture": 54813, + "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": 64173, + "scheduledDeparture": 64173, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 62373, + "scheduledDeparture": 62373, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 60573, + "scheduledDeparture": 60573, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 58773, + "scheduledDeparture": 58773, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + }, + { + "serviceDay": 1698724800, + "departureDelay": 0, + "realtimeState": "SCHEDULED", + "realtimeDeparture": 55173, + "scheduledDeparture": 55173, + "headsign": "Indian Trail P&R", + "trip": { + "route": { + "shortName": "102" + } + } + } + ] + } + ] + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/percy/mocks/PlanResponseBike.json b/percy/mocks/PlanResponseBike.json new file mode 100644 index 000000000..f7b8a544e --- /dev/null +++ b/percy/mocks/PlanResponseBike.json @@ -0,0 +1,233 @@ +{ + "data": { + "plan": { + "itineraries": [ + { + "accessibilityScore": null, + "duration": 1229, + "endTime": 1691619389000, + "legs": [ + { + "accessibilityScore": null, + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 4724.02, + "dropoffType": "SCHEDULED", + "duration": 1229.0, + "endTime": 1691619389000, + "fareProducts": [], + "from": { + "lat": 33.7894621, + "lon": -84.3766341, + "name": "South Prado Northeast, Atlanta, GA, USA", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 261, + "points": "aofmE~x~aO@G@M@GTGBANCv@|@b@h@r@z@b@f@HF?@XZbA~@TNRFNDJBB@R@@?J??UBKLOJOHOHSJOLGJGHKBEDGDGGKl@Jp@NRBPBN?@?ZETEVG`@ITGJCB?NANAD?H@HBJDRNLNRVBFDBBBBLDPHVVa@TY`@e@Vc@Jg@Fi@AeCAuF@e@B[Ho@Li@Nq@t@yAVe@R[b@k@NIHELENABAD?F?b@?f@DF?D@?S?cE?aA?aI@{B?Q?_@AG?CCA?GAECCEC?C@M?K@C@K@G@CBEdD_C|@_AtAcAp@g@zBuA~@i@~@c@tAi@fBa@bFgAhK_B|Da@p@Kx@MrB ]`BYBAXIpBq@JAHBJ?p@SDCHODEHC`Ac@lAu@jCiBQ_@cAgAMM{AaBMeCoA?c@@O?@Y?eA@oA?uA?K?W? ]?KHA?OXAJ?L?^AXAFAFAHELGHGHCFCHCB?FAF?F@LADADAHGDGBCBEDK?I?O?IAOASAU?G@G?C@E@GVi@VSNELCLCh@ENETKDCDCHI@CBI?C@CBUDq@RaC?I@I?I?I?KAQAOCQAK?G?GAE?CAEACCCCMPEJHf@[FJd@DR@n@@hAAlBAh@?VJl@Tj@b@d@VRTLh@Hb@?zAGZGEACGAI?I@CBG" + }, + "mode": "BICYCLE", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691618160000, + "steps": [ + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 14.51, + "elevationProfile": [], + "lat": 33.7894509, + "lon": -84.3766376, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Walker Terrace Northeast" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 24.77, + "elevationProfile": [], + "lat": 33.7894264, + "lon": -84.3764835, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "South Prado Northeast" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 275.92, + "elevationProfile": [], + "lat": 33.7892125, + "lon": -84.3764105, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "Piedmont Avenue Northeast" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 1045.38, + "elevationProfile": [], + "lat": 33.7872529, + "lon": -84.378135, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 373.8, + "elevationProfile": [], + "lat": 33.7818372, + "lon": -84.3727976, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "bike path" + }, + { + "absoluteDirection": "NORTHEAST", + "alerts": [], + "area": false, + "distance": 6.34, + "elevationProfile": [], + "lat": 33.781866, + "lon": -84.3687653, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "bike path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 8.49, + "elevationProfile": [], + "lat": 33.7819129, + "lon": -84.3687297, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "Interim BeltLine Eastside Trail" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 1523.22, + "elevationProfile": [], + "lat": 33.7819055, + "lon": -84.3686383, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Atlanta BeltLine Eastside Trail" + }, + { + "absoluteDirection": "NORTHEAST", + "alerts": [], + "area": false, + "distance": 18.01, + "elevationProfile": [], + "lat": 33.7694207, + "lon": -84.3627561, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "bike path" + }, + { + "absoluteDirection": "NORTHEAST", + "alerts": [], + "area": false, + "distance": 191.5, + "elevationProfile": [], + "lat": 33.769513, + "lon": -84.362596, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Angier Springs Road Northeast" + }, + { + "absoluteDirection": "NORTH", + "alerts": [], + "area": false, + "distance": 73.62, + "elevationProfile": [], + "lat": 33.770456, + "lon": -84.361008, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "Bonaventure Avenue Northeast" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 157.25, + "elevationProfile": [], + "lat": 33.771118, + "lon": -84.361011, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "North Avenue Northeast" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 548.66, + "elevationProfile": [], + "lat": 33.7710927, + "lon": -84.3593107, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "Stone Mountain Trail" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 462.58, + "elevationProfile": [], + "lat": 33.7686363, + "lon": -84.3555896, + "relativeDirection": "RIGHT", + "stayOn": true, + "streetName": "bike path" + } + ], + "to": { + "lat": 33.7670607, + "lon": -84.3574939, + "name": "1 Copenhill Avenue NE, Atlanta, GA, USA", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "transitLeg": false, + "trip": null + } + ], + "startTime": 1691618160000, + "waitingTime": 0, + "walkTime": 1229 + } + ], + "routingErrors": [] + } + } +} \ No newline at end of file diff --git a/percy/mocks/PlanResponseBusSubwayTram.json b/percy/mocks/PlanResponseBusSubwayTram.json new file mode 100644 index 000000000..c50063993 --- /dev/null +++ b/percy/mocks/PlanResponseBusSubwayTram.json @@ -0,0 +1,1533 @@ +{ + "data": { + "plan": { + "itineraries": [ + { + "accessibilityScore": null, + "duration": 1340, + "endTime": 1691097871000, + "legs": [ + { + "alerts": [], + "accessibilityScore": null, + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 493.51, + "dropoffType": "SCHEDULED", + "duration": 409.0, + "endTime": 1691096940000, + "fareProducts": [], + "from": { + "lat": 33.77505, + "lon": -84.300178, + "name": "Opus Music Store, Decatur, GA", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 29, + "points": "aucmEdzoaO~AACc@?S?QAm@?q@?U?E?C?U?U?CRAAgD@s@BO?SDa@C]ESCA@OA_A?[AOAgA]aC??" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691096531000, + "steps": [ + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 53.03, + "elevationProfile": [], + "lat": 33.7750523, + "lon": -84.3000227, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Ponce de Leon Place" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 115.73, + "elevationProfile": [], + "lat": 33.7745754, + "lon": -84.3000126, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "Swanton Way" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 10.98, + "elevationProfile": [], + "lat": 33.774606, + "lon": -84.2987621, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 161.01, + "elevationProfile": [], + "lat": 33.7745073, + "lon": -84.2987593, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "sidewalk" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 49.88, + "elevationProfile": [], + "lat": 33.7745226, + "lon": -84.2970412, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": true, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 40.34, + "elevationProfile": [], + "lat": 33.7745217, + "lon": -84.2965016, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Sycamore Street" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": true, + "distance": 62.55, + "elevationProfile": [], + "lat": 33.7745401, + "lon": -84.2960662, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Decatur MARTA Plaza" + } + ], + "to": { + "lat": 33.774699, + "lon": -84.295417, + "name": "Decatur Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908475", + "gtfsId": "MARTA:193", + "id": "U3RvcDpNQVJUQToxOTM" + }, + "vertexType": "TRANSIT" + }, + "transitLeg": false, + "trip": null + }, + { + "alerts": [], + "accessibilityScore": null, + "agency": { + "alerts": [], + "id": "QWdlbmN5Ok1BUlRBOk1BUlRB", + "name": "Metropolitan Atlanta Rapid Transit Authority", + "timezone": "America/New_York", + "url": "https://www.itsmarta.com" + }, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 10171.43, + "dropoffType": "SCHEDULED", + "duration": 840.0, + "endTime": 1691097780000, + "fareProducts": [ + { + "id": "86068984-1c16-3b99-b5ee-559031c1a2f4", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicSpecial", + "medium": null, + "name": "electronicSpecial", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "b50b4e2d-9513-3784-8a91-7eee706858e0", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:regular", + "medium": null, + "name": "regular", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "ef6c662f-6a98-3569-bfbd-2bdecc243a01", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicSenior", + "medium": null, + "name": "electronicSenior", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "613adbaa-5544-3542-aa4d-2f7055a0e075", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicRegular", + "medium": null, + "name": "electronicRegular", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "df639350-d47a-398f-a4b7-e2e2f9d2d9d7", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:senior", + "medium": null, + "name": "senior", + "riderCategory": null, + "price": { + "amount": 0.0, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "d9fa8aca-cde6-3187-9023-89c596f602c4", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicYouth", + "medium": null, + "name": "electronicYouth", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "a0815882-6fd3-3f54-b62c-009ef82d5466", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:youth", + "medium": null, + "name": "youth", + "riderCategory": null, + "price": { + "amount": 0.0, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + } + ], + "from": { + "lat": 33.774699, + "lon": -84.295417, + "name": "Decatur Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908475", + "gtfsId": "MARTA:193", + "id": "U3RvcDpNQVJUQToxOTM" + }, + "vertexType": "TRANSIT" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": [ + { + "lat": 33.765196, + "locationType": "STOP", + "lon": -84.313426, + "name": "East Lake Station", + "stopCode": "908567", + "id": "U3RvcDpNQVJUQToxODY" + }, + { + "lat": 33.761803, + "locationType": "STOP", + "lon": -84.340825, + "name": "Edgewood-Candler Park Station", + "stopCode": "908476", + "id": "U3RvcDpNQVJUQToxOTU" + }, + { + "lat": 33.757227, + "locationType": "STOP", + "lon": -84.353066, + "name": "Inman Park-Reynoldstown Station", + "stopCode": "908692", + "id": "U3RvcDpNQVJUQTo4MDQ" + }, + { + "lat": 33.749853, + "locationType": "STOP", + "lon": -84.37599, + "name": "King Memorial Station", + "stopCode": "908693", + "id": "U3RvcDpNQVJUQTo4MDU" + }, + { + "lat": 33.750161, + "locationType": "STOP", + "lon": -84.385915, + "name": "Georgia State Station", + "stopCode": "908618", + "id": "U3RvcDpNQVJUQToxOTg" + } + ], + "legGeometry": { + "length": 8591, + "points": "{rcmEj}naO?D?`AA`A?`A?~@A`A?J???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@@@???@?@@??@@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@???@@@??@@?@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@??@@???@@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@@??@@??@@?@@??@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@???@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@??@@@??@??@@??@@@??@@@??@@??@@??@@??@@??@@??@@?@@??@@??@@?@@??@@??@@??@@??@@??@@??@@??@@@??@@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@???@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@?@@??@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@?@@??@??@@??@@?@@??@@??@?@@??@@??@@??@?@@??@@??@@@???@@??@@??@@@???@@??@@@??@@???@@@??@@???@@??@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@???@@@???@@??@@@???@@@???@@??@@@???@@??@?@@??@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@???@@@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@???@@@???@@??@?@@??@?@??@@???@@@???@@@???@@@???@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@?@??@@???@??@XJr@Xp@Xp@Xp@Xr@Xn@V@@??@??@@?@??@@?@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@@???@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@@@???@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@??@@?@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@?@??@@???@@@??@@???@@@??@@???@@@??@@???@@@??@@??@@???@@@??@@???@??@@??@@??@@?@??@@??@@??@@?@??@@??@@?@@??@@??@??@@?@@??@@??@@??@?@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@??@@?@@??@@??@@??FF@??@@??@@?@@??@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@??@@?@@DF@??@@??@@??@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@@?@@?@@??@@??@@??@@??@?@@??@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@??@@???@@@??@@??@@?@@??@@??@@@???@@??@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@??@@?@??@@??@@?@??@@?@??@??@@@???@@@??@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@?@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@???@@??@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@???@??@@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@@@?@???@@@?@??@@?@???@@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@???@?@@@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@Dx@B~@F`AD`AD`AD~@D`ABh@??@VD~@Bt@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@?????@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@B?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@????@@?@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@?@??@@?@@??@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@@@???@@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@???@Zn@^r@^t@^t@^t@^t@^t@t@^t@^t@^t@^r@t@^t@LVXh@LV?@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@??@@?@@??@?@@??@?@@??@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@@@???@@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@BF?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@A@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@A@???@?@?@?@???@A@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@?@A@?@???@?@A@?@???@?@A@???@?@?@A@???@?@???@A@???@?@A@???@?@?@A@???@?@A@???@?@?@A@???@?@?@A??@?@?@A@???@?@A@???@?@A@?@???@?@A@???@?@A@???@?@A@?@???@A@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@?@A??@?@A@???@?@A@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@Oh@Uz@Wz@Ux@Wz@Uz@EL?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@A@?@???@A@?@???@A@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@A@???@?@A@???@?@A@???@?@A@?@???@?@A@???@A@?@???@?@A@???@A@?@?@??A@?@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@?@???@A@?@???@A@?@?@???@?@A@?@???@A@?@???@???@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@?@A@???@?@?@?@???@A@?@?@???@?@?@?@A??@?@?@?@?@???@?@A@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@@@???@?@?@?@???@?@?@?@???@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@???@?@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@Fd@H~@H`AH~@H~@H`AH~@J~@B`@??BX?@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@J~@J~@@D?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@Fr@H~@H~@Ff@???@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@?????@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@???@@@?@???@@@?@??@@?@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@@???@@@???@@@??@@?@?@@??@?@@??@@@???@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@???@@??@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@??@@???@@@??@@?@@??@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@@@???@@@??@@?@@??@@??@@@???@@??@@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@TZd@n@b@p@d@n@d@n@b@n@d@n@HL??Z`@b@n@d@p@d@n@@B@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@??@@??@@?@@??@@??@@@???@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@@??@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@??@@@?@@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@???@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@@@???@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@?@@??@?@@@???@@@?@???@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@@???@?@??@@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@?@??@@?@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@@??@?@?@??@@?@?@@??@?@?@?@@??@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@??@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@?@@@???@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??Hv@H~@H~@J`AH~@BZ??@@?@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@?@@@?@???@@@?@?@???@?@@@?@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@???@@@?@?@??@@?@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@???@@@?@?@??@@?@?@?@???@@@?@???@@B?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@@@???@?@?@@@???@?@@@???@HP|@Rz@R|@P|@R|@R|@P|@Rz@P|@R|@R|@P|@Rz@R|@P|@R|@P|@Rz@R|@P|@R|@R|@Pz@R|@Nt@??BFP|@R|@P|@DJ?@???@@@?@???@?@@@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@???@@??@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@??@B`A@`AB`AB`A@`ABl@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@?@?@A@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@A@?@?@???@A@?@???@A@?@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@A@???@?@A@???@A@???@?@A@???@A@?@??A@?@?@A??@?@?@A??@?@A??@?@A@???@A@???@A@?@??A@?@??A@?@A@???@A@???@A@?@??A@?@??A@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@A@???@A@??A@?@??A@??A@?@A??@?@A??@A@??A@?@A??@??A@?@A??@?@A??@A??@A@??A@?@A??@?@A??@A??@A@??A@?@??A@??A@??A@c@p@c@p@a@p@CD??_@j@c@p@c@p@c@p@c@r@A@??A@?@A??@??A@?@A??@A@???@A??@A@??A@?@A??@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@???@A@?@A??@?@A??@A@???@CDYn@A??@?@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@A??@?@A??@A@???@A@??]n@QX???@A@??A@?@??A@?@A??@A@??A@?@??A@?@A??@??A@?@A??@A@???@A@??A@?@??A@?@A??@??A??@A@???@A@??A@?@A??@??A@?@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A??@A@??A@??A@?@A??@A@??A@??A@?@??A@??A@?@A??@A??@A??@A@??A@??A@?@A??@A??@A@??A@???@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@?@A?A@???@A??@??A@??A@?@A??@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A@??A@??A@?@A??@?@A??@A??@?@A??@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@??A@?@??A??@?@A??@ABA@??A@?@??A@?@A??@?@A@??A@?@??A@?@??A@?@A??@A@???@A@???@A?GN_@t@]t@_@t@_@t@EL" + }, + "mode": "SUBWAY", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": null, + "rideHailingEstimate": null, + "route": { + "alerts": [], + "color": "0075B2", + "id": "Um91dGU6TUFSVEE6MTk0NTU", + "gtfsId": "Um91dGU6TUFSVEE6MTk0NTU", + "longName": "Blue", + "shortName": "Blue", + "textColor": "000000", + "type": 1 + }, + "startTime": 1691096940000, + "steps": [], + "to": { + "lat": 33.754123, + "lon": -84.391876, + "name": "Five Points Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908990", + "gtfsId": "MARTA:806", + "id": "U3RvcDpNQVJUQTo4MDY" + }, + "vertexType": "TRANSIT" + }, + "transitLeg": true, + "trip": { + "arrivalStoptime": { + "stop": { + "gtfsId": "MARTA:40", + "id": "U3RvcDpNQVJUQTo0MA" + }, + "stopPosition": 15 + }, + "departureStoptime": { + "stop": { + "gtfsId": "MARTA:802", + "id": "U3RvcDpNQVJUQTo4MDI" + }, + "stopPosition": 1 + }, + "gtfsId": "MARTA:8063444", + "id": "VHJpcDpNQVJUQTo4MDYzNDQ0", + "tripHeadsign": "H E HOLMES STATION" + } + }, + { + "alerts": [], + "accessibilityScore": null, + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 93.79, + "dropoffType": "SCHEDULED", + "duration": 91.0, + "endTime": 1691097871000, + "fareProducts": [], + "from": { + "lat": 33.754123, + "lon": -84.391876, + "name": "Five Points Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908990", + "gtfsId": "MARTA:806", + "id": "U3RvcDpNQVJUQTo4MDY" + }, + "vertexType": "TRANSIT" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 8, + "points": "wp_mElvabOTcAHHc@IGEGLFDTP" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691097780000, + "steps": [ + { + "absoluteDirection": "EAST", + "alerts": [], + "area": true, + "distance": 33.73, + "elevationProfile": [], + "lat": 33.7538834, + "lon": -84.3915896, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Platform 908981;908990" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 6.86, + "elevationProfile": [], + "lat": 33.7537795, + "lon": -84.3912469, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "underpass" + }, + { + "absoluteDirection": "NORTH", + "alerts": [], + "area": false, + "distance": 19.89, + "elevationProfile": [], + "lat": 33.7537299, + "lon": -84.3912911, + "relativeDirection": "HARD_RIGHT", + "stayOn": true, + "streetName": "steps" + }, + { + "absoluteDirection": "NORTHEAST", + "alerts": [], + "area": true, + "distance": 5.65, + "elevationProfile": [], + "lat": 33.7539052, + "lon": -84.3912485, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": false, + "streetName": "Broad Street Plaza" + }, + { + "absoluteDirection": "NORTHWEST", + "alerts": [], + "area": false, + "distance": 27.66, + "elevationProfile": [], + "lat": 33.7539458, + "lon": -84.3912118, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "path" + } + ], + "to": { + "lat": 33.753837, + "lon": -84.391397, + "name": "Five Points Station (908981)", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "transitLeg": false, + "trip": null + } + ], + "startTime": 1691096531000, + "waitingTime": 0, + "walkTime": 500 + }, + { + "accessibilityScore": null, + "duration": 1340, + "endTime": 1691098771000, + "legs": [ + { + "accessibilityScore": null, + "alerts": [], + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 493.51, + "dropoffType": "SCHEDULED", + "duration": 409.0, + "endTime": 1691097840000, + "fareProducts": [], + "from": { + "lat": 33.77505, + "lon": -84.300178, + "name": "Opus Music Store, Decatur, GA", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 29, + "points": "aucmEdzoaO~AACc@?S?QAm@?q@?U?E?C?U?U?CRAAgD@s@BO?SDa@C]ESCA@OA_A?[AOAgA]aC??" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691097431000, + "steps": [ + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 53.03, + "elevationProfile": [], + "lat": 33.7750523, + "lon": -84.3000227, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Ponce de Leon Place" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 115.73, + "elevationProfile": [], + "lat": 33.7745754, + "lon": -84.3000126, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "Swanton Way" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 10.98, + "elevationProfile": [], + "lat": 33.774606, + "lon": -84.2987621, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 161.01, + "elevationProfile": [], + "lat": 33.7745073, + "lon": -84.2987593, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "sidewalk" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 49.88, + "elevationProfile": [], + "lat": 33.7745226, + "lon": -84.2970412, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": true, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 40.34, + "elevationProfile": [], + "lat": 33.7745217, + "lon": -84.2965016, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Sycamore Street" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": true, + "distance": 62.55, + "elevationProfile": [], + "lat": 33.7745401, + "lon": -84.2960662, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Decatur MARTA Plaza" + } + ], + "to": { + "lat": 33.774699, + "lon": -84.295417, + "name": "Decatur Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908475", + "gtfsId": "MARTA:193", + "id": "U3RvcDpNQVJUQToxOTM" + }, + "vertexType": "TRANSIT" + }, + "transitLeg": false, + "trip": null + }, + { + "accessibilityScore": null, + "alerts": [], + "agency": { + "alerts": [], + "id": "QWdlbmN5Ok1BUlRBOk1BUlRB", + "name": "Metropolitan Atlanta Rapid Transit Authority", + "timezone": "America/New_York", + "url": "https://www.itsmarta.com" + }, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 10171.43, + "dropoffType": "SCHEDULED", + "duration": 840.0, + "endTime": 1691098680000, + "fareProducts": [ + { + "id": "9149ab26-a1ab-321c-bc24-776c11f52abb", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicSpecial", + "medium": null, + "name": "electronicSpecial", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "ec2a111b-0263-3b34-a2b7-ef094b6c8f9e", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:regular", + "medium": null, + "name": "regular", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "f292705b-eea0-3f56-9034-cd77741b96d4", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicSenior", + "medium": null, + "name": "electronicSenior", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "bea3ecb3-56f2-3237-a04b-de9157fec8c6", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicRegular", + "medium": null, + "name": "electronicRegular", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "c76d9f97-c5e7-3041-8ce6-0bd938a47ac4", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:senior", + "medium": null, + "name": "senior", + "riderCategory": null, + "price": { + "amount": 0.0, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "8119e1f9-a770-320b-acad-bcda0676dab8", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicYouth", + "medium": null, + "name": "electronicYouth", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "da653567-98e2-3fe8-860d-3d5600b5f403", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:youth", + "medium": null, + "name": "youth", + "riderCategory": null, + "price": { + "amount": 0.0, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + } + ], + "from": { + "lat": 33.774699, + "lon": -84.295417, + "name": "Decatur Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908475", + "gtfsId": "MARTA:193", + "id": "U3RvcDpNQVJUQToxOTM" + }, + "vertexType": "TRANSIT" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": [ + { + "lat": 33.765196, + "locationType": "STOP", + "lon": -84.313426, + "name": "East Lake Station", + "stopCode": "908567", + "id": "U3RvcDpNQVJUQToxODY" + }, + { + "lat": 33.761803, + "locationType": "STOP", + "lon": -84.340825, + "name": "Edgewood-Candler Park Station", + "stopCode": "908476", + "id": "U3RvcDpNQVJUQToxOTU" + }, + { + "lat": 33.757227, + "locationType": "STOP", + "lon": -84.353066, + "name": "Inman Park-Reynoldstown Station", + "stopCode": "908692", + "id": "U3RvcDpNQVJUQTo4MDQ" + }, + { + "lat": 33.749853, + "locationType": "STOP", + "lon": -84.37599, + "name": "King Memorial Station", + "stopCode": "908693", + "id": "U3RvcDpNQVJUQTo4MDU" + }, + { + "lat": 33.750161, + "locationType": "STOP", + "lon": -84.385915, + "name": "Georgia State Station", + "stopCode": "908618", + "id": "U3RvcDpNQVJUQToxOTg" + } + ], + "legGeometry": { + "length": 8591, + "points": "{rcmEj}naO?D?`AA`A?`A?~@A`A?J???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@@@???@?@@??@@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@???@@@??@@?@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@??@@???@@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@@??@@??@@?@@??@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@???@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@??@@@??@??@@??@@@??@@@??@@??@@??@@??@@??@@??@@?@@??@@??@@?@@??@@??@@??@@??@@??@@??@@??@@@??@@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@???@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@?@@??@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@?@@??@??@@??@@?@@??@@??@?@@??@@??@@??@?@@??@@??@@@???@@??@@??@@@???@@??@@@??@@???@@@??@@???@@??@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@???@@@???@@??@@@???@@@???@@??@@@???@@??@?@@??@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@???@@@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@???@@@???@@??@?@@??@?@??@@???@@@???@@@???@@@???@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@?@??@@???@??@XJr@Xp@Xp@Xp@Xr@Xn@V@@??@??@@?@??@@?@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@@???@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@@@???@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@??@@?@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@?@??@@???@@@??@@???@@@??@@???@@@??@@???@@@??@@??@@???@@@??@@???@??@@??@@??@@?@??@@??@@??@@?@??@@??@@?@@??@@??@??@@?@@??@@??@@??@?@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@??@@?@@??@@??@@??FF@??@@??@@?@@??@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@??@@?@@DF@??@@??@@??@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@@?@@?@@??@@??@@??@@??@?@@??@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@??@@???@@@??@@??@@?@@??@@??@@@???@@??@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@??@@?@??@@??@@?@??@@?@??@??@@@???@@@??@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@?@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@???@@??@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@???@??@@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@@@?@???@@@?@??@@?@???@@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@???@?@@@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@Dx@B~@F`AD`AD`AD~@D`ABh@??@VD~@Bt@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@?????@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@B?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@????@@?@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@?@??@@?@@??@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@@@???@@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@???@Zn@^r@^t@^t@^t@^t@^t@t@^t@^t@^t@^r@t@^t@LVXh@LV?@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@??@@?@@??@?@@??@?@@??@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@@@???@@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@BF?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@A@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@A@???@?@?@?@???@A@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@?@A@?@???@?@A@?@???@?@A@???@?@?@A@???@?@???@A@???@?@A@???@?@?@A@???@?@A@???@?@?@A@???@?@?@A??@?@?@A@???@?@A@???@?@A@?@???@?@A@???@?@A@???@?@A@?@???@A@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@?@A??@?@A@???@?@A@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@Oh@Uz@Wz@Ux@Wz@Uz@EL?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@A@?@???@A@?@???@A@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@A@???@?@A@???@?@A@???@?@A@?@???@?@A@???@A@?@???@?@A@???@A@?@?@??A@?@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@?@???@A@?@???@A@?@?@???@?@A@?@???@A@?@???@???@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@?@A@???@?@?@?@???@A@?@?@???@?@?@?@A??@?@?@?@?@???@?@A@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@@@???@?@?@?@???@?@?@?@???@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@???@?@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@Fd@H~@H`AH~@H~@H`AH~@J~@B`@??BX?@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@J~@J~@@D?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@Fr@H~@H~@Ff@???@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@?????@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@???@@@?@???@@@?@??@@?@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@@???@@@???@@@??@@?@?@@??@?@@??@@@???@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@???@@??@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@??@@???@@@??@@?@@??@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@@@???@@@??@@?@@??@@??@@@???@@??@@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@TZd@n@b@p@d@n@d@n@b@n@d@n@HL??Z`@b@n@d@p@d@n@@B@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@??@@??@@?@@??@@??@@@???@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@@??@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@??@@@?@@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@???@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@@@???@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@?@@??@?@@@???@@@?@???@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@@???@?@??@@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@?@??@@?@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@@??@?@?@??@@?@?@@??@?@?@?@@??@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@??@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@?@@@???@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??Hv@H~@H~@J`AH~@BZ??@@?@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@?@@@?@???@@@?@?@???@?@@@?@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@???@@@?@?@??@@?@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@???@@@?@?@??@@?@?@?@???@@@?@???@@B?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@@@???@?@?@@@???@?@@@???@HP|@Rz@R|@P|@R|@R|@P|@Rz@P|@R|@R|@P|@Rz@R|@P|@R|@P|@Rz@R|@P|@R|@R|@Pz@R|@Nt@??BFP|@R|@P|@DJ?@???@@@?@???@?@@@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@???@@??@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@??@B`A@`AB`AB`A@`ABl@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@?@?@A@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@A@?@?@???@A@?@???@A@?@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@A@???@?@A@???@A@???@?@A@???@A@?@??A@?@?@A??@?@?@A??@?@A??@?@A@???@A@???@A@?@??A@?@??A@?@A@???@A@???@A@?@??A@?@??A@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@A@???@A@??A@?@??A@??A@?@A??@?@A??@A@??A@?@A??@??A@?@A??@?@A??@A??@A@??A@?@A??@?@A??@A??@A@??A@?@??A@??A@??A@c@p@c@p@a@p@CD??_@j@c@p@c@p@c@p@c@r@A@??A@?@A??@??A@?@A??@A@???@A??@A@??A@?@A??@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@???@A@?@A??@?@A??@A@???@CDYn@A??@?@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@A??@?@A??@A@???@A@??]n@QX???@A@??A@?@??A@?@A??@A@??A@?@??A@?@A??@??A@?@A??@A@???@A@??A@?@??A@?@A??@??A??@A@???@A@??A@?@A??@??A@?@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A??@A@??A@??A@?@A??@A@??A@??A@?@??A@??A@?@A??@A??@A??@A@??A@??A@?@A??@A??@A@??A@???@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@?@A?A@???@A??@??A@??A@?@A??@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A@??A@??A@?@A??@?@A??@A??@?@A??@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@??A@?@??A??@?@A??@ABA@??A@?@??A@?@A??@?@A@??A@?@??A@?@??A@?@A??@A@???@A@???@A?GN_@t@]t@_@t@_@t@EL" + }, + "mode": "SUBWAY", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": null, + "rideHailingEstimate": null, + "route": { + "alerts": [], + "color": "0075B2", + "id": "Um91dGU6TUFSVEE6MTk0NTU", + "gtfsId": "Um91dGU6TUFSVEE6MTk0NTU", + "longName": "Blue", + "shortName": "Blue", + "textColor": "000000", + "type": 1 + }, + "startTime": 1691097840000, + "steps": [], + "to": { + "lat": 33.754123, + "lon": -84.391876, + "name": "Five Points Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908990", + "gtfsId": "MARTA:806", + "id": "U3RvcDpNQVJUQTo4MDY" + }, + "vertexType": "TRANSIT" + }, + "transitLeg": true, + "trip": { + "arrivalStoptime": { + "stop": { + "gtfsId": "MARTA:40", + "id": "U3RvcDpNQVJUQTo0MA" + }, + "stopPosition": 15 + }, + "departureStoptime": { + "stop": { + "gtfsId": "MARTA:802", + "id": "U3RvcDpNQVJUQTo4MDI" + }, + "stopPosition": 1 + }, + "gtfsId": "MARTA:8063445", + "id": "VHJpcDpNQVJUQTo4MDYzNDQ1", + "tripHeadsign": "H E HOLMES STATION" + } + }, + { + "accessibilityScore": null, + "alerts": [], + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 93.79, + "dropoffType": "SCHEDULED", + "duration": 91.0, + "endTime": 1691098771000, + "fareProducts": [], + "from": { + "lat": 33.754123, + "lon": -84.391876, + "name": "Five Points Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908990", + "gtfsId": "MARTA:806", + "id": "U3RvcDpNQVJUQTo4MDY" + }, + "vertexType": "TRANSIT" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 8, + "points": "wp_mElvabOTcAHHc@IGEGLFDTP" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691098680000, + "steps": [ + { + "absoluteDirection": "EAST", + "alerts": [], + "area": true, + "distance": 33.73, + "elevationProfile": [], + "lat": 33.7538834, + "lon": -84.3915896, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Platform 908981;908990" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 6.86, + "elevationProfile": [], + "lat": 33.7537795, + "lon": -84.3912469, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "underpass" + }, + { + "absoluteDirection": "NORTH", + "alerts": [], + "area": false, + "distance": 19.89, + "elevationProfile": [], + "lat": 33.7537299, + "lon": -84.3912911, + "relativeDirection": "HARD_RIGHT", + "stayOn": true, + "streetName": "steps" + }, + { + "absoluteDirection": "NORTHEAST", + "alerts": [], + "area": true, + "distance": 5.65, + "elevationProfile": [], + "lat": 33.7539052, + "lon": -84.3912485, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": false, + "streetName": "Broad Street Plaza" + }, + { + "absoluteDirection": "NORTHWEST", + "alerts": [], + "area": false, + "distance": 27.66, + "elevationProfile": [], + "lat": 33.7539458, + "lon": -84.3912118, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "path" + } + ], + "to": { + "lat": 33.753837, + "lon": -84.391397, + "name": "Five Points Station (908981)", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "transitLeg": false, + "trip": null + } + ], + "startTime": 1691097431000, + "waitingTime": 0, + "walkTime": 500 + }, + { + "accessibilityScore": null, + "duration": 1340, + "endTime": 1691099671000, + "legs": [ + { + "accessibilityScore": null, + "alerts": [], + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 493.51, + "dropoffType": "SCHEDULED", + "duration": 409.0, + "endTime": 1691098740000, + "fareProducts": [], + "from": { + "lat": 33.77505, + "lon": -84.300178, + "name": "Opus Music Store, Decatur, GA", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 29, + "points": "aucmEdzoaO~AACc@?S?QAm@?q@?U?E?C?U?U?CRAAgD@s@BO?SDa@C]ESCA@OA_A?[AOAgA]aC??" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691098331000, + "steps": [ + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 53.03, + "elevationProfile": [], + "lat": 33.7750523, + "lon": -84.3000227, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Ponce de Leon Place" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 115.73, + "elevationProfile": [], + "lat": 33.7745754, + "lon": -84.3000126, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "Swanton Way" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 10.98, + "elevationProfile": [], + "lat": 33.774606, + "lon": -84.2987621, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 161.01, + "elevationProfile": [], + "lat": 33.7745073, + "lon": -84.2987593, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "sidewalk" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 49.88, + "elevationProfile": [], + "lat": 33.7745226, + "lon": -84.2970412, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": true, + "streetName": "path" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": false, + "distance": 40.34, + "elevationProfile": [], + "lat": 33.7745217, + "lon": -84.2965016, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Sycamore Street" + }, + { + "absoluteDirection": "EAST", + "alerts": [], + "area": true, + "distance": 62.55, + "elevationProfile": [], + "lat": 33.7745401, + "lon": -84.2960662, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Decatur MARTA Plaza" + } + ], + "to": { + "lat": 33.774699, + "lon": -84.295417, + "name": "Decatur Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908475", + "gtfsId": "MARTA:193", + "id": "U3RvcDpNQVJUQToxOTM" + }, + "vertexType": "TRANSIT" + }, + "transitLeg": false, + "trip": null + }, + { + "accessibilityScore": null, + "alerts": [], + "agency": { + "alerts": [], + "id": "QWdlbmN5Ok1BUlRBOk1BUlRB", + "name": "Metropolitan Atlanta Rapid Transit Authority", + "timezone": "America/New_York", + "url": "https://www.itsmarta.com" + }, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 10171.43, + "dropoffType": "SCHEDULED", + "duration": 840.0, + "endTime": 1691099580000, + "fareProducts": [ + { + "id": "92db3f41-acee-382c-83e6-1066c27fb2a5", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicSpecial", + "medium": null, + "name": "electronicSpecial", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "2c03a0af-5d78-3bc8-b866-ce8db65e16ef", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:regular", + "medium": null, + "name": "regular", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "da7a6039-acc8-3fd5-a9a2-ea3445c2470b", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicSenior", + "medium": null, + "name": "electronicSenior", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "c2893187-c0f2-3ec6-a694-6fb2674d5d44", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicRegular", + "medium": null, + "name": "electronicRegular", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "be9b3bce-31d7-3c52-99be-46f61341e6e7", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:senior", + "medium": null, + "name": "senior", + "riderCategory": null, + "price": { + "amount": 0.0, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "282abd01-1c14-300e-827b-d1c5a98c1abb", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:electronicYouth", + "medium": null, + "name": "electronicYouth", + "riderCategory": null, + "price": { + "amount": 2.5, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + }, + { + "id": "0e7fc790-21fe-3ef0-b1e3-02623f99bcf6", + "product": { + "__typename": "DefaultFareProduct", + "id": "atlanta:youth", + "medium": null, + "name": "youth", + "riderCategory": null, + "price": { + "amount": 0.0, + "currency": { + "code": "USD", + "digits": 2 + } + } + } + } + ], + "from": { + "lat": 33.774699, + "lon": -84.295417, + "name": "Decatur Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908475", + "gtfsId": "MARTA:193", + "id": "U3RvcDpNQVJUQToxOTM" + }, + "vertexType": "TRANSIT" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": [ + { + "lat": 33.765196, + "locationType": "STOP", + "lon": -84.313426, + "name": "East Lake Station", + "stopCode": "908567", + "id": "U3RvcDpNQVJUQToxODY" + }, + { + "lat": 33.761803, + "locationType": "STOP", + "lon": -84.340825, + "name": "Edgewood-Candler Park Station", + "stopCode": "908476", + "id": "U3RvcDpNQVJUQToxOTU" + }, + { + "lat": 33.757227, + "locationType": "STOP", + "lon": -84.353066, + "name": "Inman Park-Reynoldstown Station", + "stopCode": "908692", + "id": "U3RvcDpNQVJUQTo4MDQ" + }, + { + "lat": 33.749853, + "locationType": "STOP", + "lon": -84.37599, + "name": "King Memorial Station", + "stopCode": "908693", + "id": "U3RvcDpNQVJUQTo4MDU" + }, + { + "lat": 33.750161, + "locationType": "STOP", + "lon": -84.385915, + "name": "Georgia State Station", + "stopCode": "908618", + "id": "U3RvcDpNQVJUQToxOTg" + } + ], + "legGeometry": { + "length": 8591, + "points": "{rcmEj}naO?D?`AA`A?`A?~@A`A?J???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@@@???@?@@??@@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@???@@@??@@?@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@??@@???@@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@@??@@??@@?@@??@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@???@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@??@@@??@??@@??@@@??@@@??@@??@@??@@??@@??@@??@@?@@??@@??@@?@@??@@??@@??@@??@@??@@??@@??@@@??@@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@???@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@?@@??@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@?@@??@??@@??@@?@@??@@??@?@@??@@??@@??@?@@??@@??@@@???@@??@@??@@@???@@??@@@??@@???@@@??@@???@@??@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@???@@@???@@??@@@???@@@???@@??@@@???@@??@?@@??@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@???@@@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@???@@@???@@??@?@@??@?@??@@???@@@???@@@???@@@???@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@?@??@@???@??@XJr@Xp@Xp@Xp@Xr@Xn@V@@??@??@@?@??@@?@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@@???@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@@@???@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@??@@?@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@?@??@@???@@@??@@???@@@??@@???@@@??@@???@@@??@@??@@???@@@??@@???@??@@??@@??@@?@??@@??@@??@@?@??@@??@@?@@??@@??@??@@?@@??@@??@@??@?@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@??@@?@@??@@??@@??FF@??@@??@@?@@??@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@??@@?@@DF@??@@??@@??@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@@?@@?@@??@@??@@??@@??@?@@??@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@??@@???@@@??@@??@@?@@??@@??@@@???@@??@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@??@@?@??@@??@@?@??@@?@??@??@@@???@@@??@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@?@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@???@@??@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@???@??@@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@@@?@???@@@?@??@@?@???@@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@???@?@@@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@Dx@B~@F`AD`AD`AD~@D`ABh@??@VD~@Bt@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@?????@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@B?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@????@@?@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@?@??@@?@@??@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@@@???@@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@???@Zn@^r@^t@^t@^t@^t@^t@t@^t@^t@^t@^r@t@^t@LVXh@LV?@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@??@@?@@??@?@@??@?@@??@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@@@???@@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@BF?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@A@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@A@???@?@?@?@???@A@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@?@A@?@???@?@A@?@???@?@A@???@?@?@A@???@?@???@A@???@?@A@???@?@?@A@???@?@A@???@?@?@A@???@?@?@A??@?@?@A@???@?@A@???@?@A@?@???@?@A@???@?@A@???@?@A@?@???@A@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@?@A??@?@A@???@?@A@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@Oh@Uz@Wz@Ux@Wz@Uz@EL?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@A@?@???@A@?@???@A@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@A@???@?@A@???@?@A@???@?@A@?@???@?@A@???@A@?@???@?@A@???@A@?@?@??A@?@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@?@???@A@?@???@A@?@?@???@?@A@?@???@A@?@???@???@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@?@A@???@?@?@?@???@A@?@?@???@?@?@?@A??@?@?@?@?@???@?@A@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@@@???@?@?@?@???@?@?@?@???@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@???@?@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@Fd@H~@H`AH~@H~@H`AH~@J~@B`@??BX?@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@J~@J~@@D?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@Fr@H~@H~@Ff@???@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@?????@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@???@@@?@???@@@?@??@@?@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@@???@@@???@@@??@@?@?@@??@?@@??@@@???@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@???@@??@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@??@@???@@@??@@?@@??@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@@@???@@@??@@?@@??@@??@@@???@@??@@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@TZd@n@b@p@d@n@d@n@b@n@d@n@HL??Z`@b@n@d@p@d@n@@B@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@??@@??@@?@@??@@??@@@???@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@@??@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@??@@@?@@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@???@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@@@???@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@?@@??@?@@@???@@@?@???@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@@???@?@??@@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@?@??@@?@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@@??@?@?@??@@?@?@@??@?@?@?@@??@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@??@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@?@@@???@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??Hv@H~@H~@J`AH~@BZ??@@?@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@?@@@?@???@@@?@?@???@?@@@?@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@???@@@?@?@??@@?@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@???@@@?@?@??@@?@?@?@???@@@?@???@@B?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@@@???@?@?@@@???@?@@@???@HP|@Rz@R|@P|@R|@R|@P|@Rz@P|@R|@R|@P|@Rz@R|@P|@R|@P|@Rz@R|@P|@R|@R|@Pz@R|@Nt@??BFP|@R|@P|@DJ?@???@@@?@???@?@@@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@???@@??@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@??@B`A@`AB`AB`A@`ABl@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@?@?@A@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@A@?@?@???@A@?@???@A@?@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@A@???@?@A@???@A@???@?@A@???@A@?@??A@?@?@A??@?@?@A??@?@A??@?@A@???@A@???@A@?@??A@?@??A@?@A@???@A@???@A@?@??A@?@??A@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@A@???@A@??A@?@??A@??A@?@A??@?@A??@A@??A@?@A??@??A@?@A??@?@A??@A??@A@??A@?@A??@?@A??@A??@A@??A@?@??A@??A@??A@c@p@c@p@a@p@CD??_@j@c@p@c@p@c@p@c@r@A@??A@?@A??@??A@?@A??@A@???@A??@A@??A@?@A??@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@???@A@?@A??@?@A??@A@???@CDYn@A??@?@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@A??@?@A??@A@???@A@??]n@QX???@A@??A@?@??A@?@A??@A@??A@?@??A@?@A??@??A@?@A??@A@???@A@??A@?@??A@?@A??@??A??@A@???@A@??A@?@A??@??A@?@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A??@A@??A@??A@?@A??@A@??A@??A@?@??A@??A@?@A??@A??@A??@A@??A@??A@?@A??@A??@A@??A@???@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@?@A?A@???@A??@??A@??A@?@A??@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A@??A@??A@?@A??@?@A??@A??@?@A??@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@??A@?@??A??@?@A??@ABA@??A@?@??A@?@A??@?@A@??A@?@??A@?@??A@?@A??@A@???@A@???@A?GN_@t@]t@_@t@_@t@EL" + }, + "mode": "SUBWAY", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": null, + "rideHailingEstimate": null, + "route": { + "alerts": [], + "color": "0075B2", + "id": "Um91dGU6TUFSVEE6MTk0NTU", + "gtfsId": "Um91dGU6TUFSVEE6MTk0NTU", + "longName": "Blue", + "shortName": "Blue", + "textColor": "000000", + "type": 1 + }, + "startTime": 1691098740000, + "steps": [], + "to": { + "lat": 33.754123, + "lon": -84.391876, + "name": "Five Points Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908990", + "gtfsId": "MARTA:806", + "id": "U3RvcDpNQVJUQTo4MDY" + }, + "vertexType": "TRANSIT" + }, + "transitLeg": true, + "trip": { + "arrivalStoptime": { + "stop": { + "gtfsId": "MARTA:40", + "id": "U3RvcDpNQVJUQTo0MA" + }, + "stopPosition": 15 + }, + "departureStoptime": { + "stop": { + "gtfsId": "MARTA:802", + "id": "U3RvcDpNQVJUQTo4MDI" + }, + "stopPosition": 1 + }, + "gtfsId": "MARTA:8063446", + "id": "VHJpcDpNQVJUQTo4MDYzNDQ2", + "tripHeadsign": "H E HOLMES STATION" + } + }, + { + "accessibilityScore": null, + "agency": null, + "arrivalDelay": 0, + "alerts": [], + "departureDelay": 0, + "distance": 93.79, + "dropoffType": "SCHEDULED", + "duration": 91.0, + "endTime": 1691099671000, + "fareProducts": [], + "from": { + "lat": 33.754123, + "lon": -84.391876, + "name": "Five Points Station", + "rentalVehicle": null, + "stop": { + "alerts": [], + "code": "908990", + "gtfsId": "MARTA:806", + "id": "U3RvcDpNQVJUQTo4MDY" + }, + "vertexType": "TRANSIT" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 8, + "points": "wp_mElvabOTcAHHc@IGEGLFDTP" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691099580000, + "steps": [ + { + "absoluteDirection": "EAST", + "alerts": [], + "area": true, + "distance": 33.73, + "elevationProfile": [], + "lat": 33.7538834, + "lon": -84.3915896, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Platform 908981;908990" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 6.86, + "elevationProfile": [], + "lat": 33.7537795, + "lon": -84.3912469, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "underpass" + }, + { + "absoluteDirection": "NORTH", + "alerts": [], + "area": false, + "distance": 19.89, + "elevationProfile": [], + "lat": 33.7537299, + "lon": -84.3912911, + "relativeDirection": "HARD_RIGHT", + "stayOn": true, + "streetName": "steps" + }, + { + "absoluteDirection": "NORTHEAST", + "alerts": [], + "area": true, + "distance": 5.65, + "elevationProfile": [], + "lat": 33.7539052, + "lon": -84.3912485, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": false, + "streetName": "Broad Street Plaza" + }, + { + "absoluteDirection": "NORTHWEST", + "alerts": [], + "area": false, + "distance": 27.66, + "elevationProfile": [], + "lat": 33.7539458, + "lon": -84.3912118, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "path" + } + ], + "to": { + "lat": 33.753837, + "lon": -84.391397, + "name": "Five Points Station (908981)", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "transitLeg": false, + "trip": null + } + ], + "startTime": 1691098331000, + "waitingTime": 0, + "walkTime": 500 + } + ], + "routingErrors": [] + } + } +} \ No newline at end of file diff --git a/percy/mocks/PlanResponseWalk.json b/percy/mocks/PlanResponseWalk.json new file mode 100644 index 000000000..aea92139d --- /dev/null +++ b/percy/mocks/PlanResponseWalk.json @@ -0,0 +1,357 @@ +{ + "errors": [ + { + "message": "Exception while fetching data (/plan/itineraries[0]/legs[0]/steps[6]/alerts[0]/alertDescriptionText) : Cannot invoke \"org.opentripplanner.framework.i18n.I18NString.toString(java.util.Locale)\" because the return value of \"org.opentripplanner.routing.alertpatch.TransitAlert.descriptionText()\" is null", + "locations": [ + { + "line": 151, + "column": 13 + } + ], + "path": [ + "plan", + "itineraries", + 0, + "legs", + 0, + "steps", + 6, + "alerts", + 0, + "alertDescriptionText" + ], + "extensions": { + "classification": "DataFetchingException" + } + } + ], + "data": { + "plan": { + "itineraries": [ + { + "accessibilityScore": null, + "duration": 5246, + "endTime": 1691100986000, + "legs": [ + { + "accessibilityScore": null, + "agency": null, + "arrivalDelay": 0, + "departureDelay": 0, + "distance": 9789.56, + "dropoffType": "SCHEDULED", + "duration": 5246.0, + "endTime": 1691100986000, + "fareProducts": [], + "from": { + "lat": 33.77505, + "lon": -84.300178, + "name": "Opus Music Store, Decatur, GA", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "interlineWithPreviousLeg": false, + "intermediateStops": null, + "legGeometry": { + "length": 407, + "points": "aucmEdzoaO~AA@HBRJTJNPNRFb@FdA??J??XLBxE@`@?DDDJHDRED?|@?fBJ`AJn@Tp@pAbCZp@Nx@@AH?@@BDFJHRJRHL?HHXFRDPBNPh@HFPL@F@BPBNAJNFZMvB?~D?lBCpA@JAzBS`BOpD_@@HLA@DDVBPBNDVHZBHVdARx@H`@VdA|@nDJ^n@fCJf@H`@Fb@Fb@BBFpADhABf@?HBx@F~A?T@V??FrBFlBJnBFhANpAJ|@Nx@N~@VdALd@Nb@N`@Rd@R`@Td@v@`BzBrEtAlCrAjC^t@b@z@p@rAd@`ADJpAfCZp@r@~ATn@Vz@T`ARdAHl@Fh@Dt@Dx@@RDtA@jA@dA?r@Af@Ch@Cd@El@E`@Kn@Mx@IK^K^M^M`@_AlC[~@a@lAIXGRKSr@UbAUtAm@xC]pBIh@AFKx@Ix@En@Ev@Cr@Ad@A`@?@?r@?l@?F@l@?F@n@?RB^Bv@Dd@?BF`ADP`CHbANnBJrADj@Bf@PdCNbBJfABRDZFl@BJNhABLXvBVbBDBN@TDb@@HJlAFv@Ht@Fp@R~BLnALbAVtB@DJn@Nr@FXXnATx@BHJXFNPd@DJ@FLVZt@NZZl@Pf@z@n@bA|@zAb@r@jAjB^j@Xb@VIJe@n@AD?JFVTZ`@h@t@hA?THJBBz@|@RXNXBBLPd@Jd@BLDVBTXpBFb@j@xD@FBJDRp@xET~ANdANfA@JFDNfALz@ALHp@XlBF@LLx@F`@DZ~BBRBN`CPnA@FBPT~AVpB@DBRBf@Bz@@dE?zA??fA?`@?N?@`AAn@?J?V@lC?H?L?RArBAnA?jA?^A`B?X?L?P?d@ArA?fAAE|D?N?N?JAl@A|CAp@?NAv@?d@?D?l@?vB?FCR?d@?nA?V?P?@?ChBAvB?VIB?j@AlA?B?NAH@J?XArDAxCAR?L?hAAvC?X?nB?BA??PAJ?D?H?JA@@F@J?PCdHABCB@D@X?H?LBtEAHAJ?n@@xA?H?FB?@@BBBF?@?V?@?|@?bB?NHFTPJHJHDD`@Xp@d@CLERHFLNFJLVMXw@`BGLFDTP" + }, + "mode": "WALK", + "pickupBookingInfo": null, + "pickupType": "SCHEDULED", + "realTime": false, + "realtimeState": null, + "rentedBike": false, + "rideHailingEstimate": null, + "route": null, + "startTime": 1691095740000, + "steps": [ + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 53.03, + "elevationProfile": [], + "lat": 33.7750523, + "lon": -84.3000227, + "relativeDirection": "DEPART", + "stayOn": false, + "streetName": "Ponce de Leon Place" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 119.46, + "elevationProfile": [], + "lat": 33.7745754, + "lon": -84.3000126, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "Swanton Way" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 21.02, + "elevationProfile": [], + "lat": 33.7737069, + "lon": -84.3005124, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 118.84, + "elevationProfile": [], + "lat": 33.7735797, + "lon": -84.3006481, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "West Trinity Place" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 12.82, + "elevationProfile": [], + "lat": 33.7735453, + "lon": -84.3019331, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "Atlanta Avenue" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 302.72, + "elevationProfile": [], + "lat": 33.7734535, + "lon": -84.302017, + "relativeDirection": "SLIGHTLY_RIGHT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [ + null + ], + "area": false, + "distance": 717.65, + "elevationProfile": [], + "lat": 33.7725992, + "lon": -84.3049937, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "path" + }, + { + "absoluteDirection": "SOUTH", + "alerts": [], + "area": false, + "distance": 8.36, + "elevationProfile": [], + "lat": 33.7670373, + "lon": -84.3061657, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Adair Street" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 956.98, + "elevationProfile": [], + "lat": 33.766963, + "lon": -84.3061521, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "West Howard Avenue" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 3303.3, + "elevationProfile": [], + "lat": 33.7649115, + "lon": -84.3161165, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Dekalb Avenue Northeast" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 409.51, + "elevationProfile": [], + "lat": 33.7600691, + "lon": -84.3493108, + "relativeDirection": "CONTINUE", + "stayOn": false, + "streetName": "Dekalb Avenue" + }, + { + "absoluteDirection": "NORTHWEST", + "alerts": [], + "area": false, + "distance": 159.76, + "elevationProfile": [], + "lat": 33.7577824, + "lon": -84.3527742, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "service road" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 2422.63, + "elevationProfile": [], + "lat": 33.757447, + "lon": -84.354115, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "Edgewood Avenue Northeast" + }, + { + "absoluteDirection": "NORTH", + "alerts": [], + "area": false, + "distance": 5.62, + "elevationProfile": [], + "lat": 33.7544469, + "lon": -84.3795524, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 427.98, + "elevationProfile": [], + "lat": 33.7544938, + "lon": -84.3795752, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "sidewalk" + }, + { + "absoluteDirection": "NORTH", + "alerts": [], + "area": false, + "distance": 395.79, + "elevationProfile": [], + "lat": 33.7545466, + "lon": -84.3842028, + "relativeDirection": "RIGHT", + "stayOn": true, + "streetName": "sidewalk" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 10.95, + "elevationProfile": [], + "lat": 33.7545708, + "lon": -84.3884405, + "relativeDirection": "SLIGHTLY_LEFT", + "stayOn": true, + "streetName": "bike path" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 94.69, + "elevationProfile": [], + "lat": 33.7545008, + "lon": -84.3885188, + "relativeDirection": "RIGHT", + "stayOn": false, + "streetName": "Edgewood Avenue Northeast" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 97.55, + "elevationProfile": [], + "lat": 33.7545036, + "lon": -84.389543, + "relativeDirection": "LEFT", + "stayOn": false, + "streetName": "path" + }, + { + "absoluteDirection": "WEST", + "alerts": [], + "area": false, + "distance": 16.25, + "elevationProfile": [], + "lat": 33.7537736, + "lon": -84.3901275, + "relativeDirection": "RIGHT", + "stayOn": true, + "streetName": "path" + }, + { + "absoluteDirection": "SOUTHWEST", + "alerts": [], + "area": false, + "distance": 37.62, + "elevationProfile": [], + "lat": 33.7538203, + "lon": -84.3902941, + "relativeDirection": "LEFT", + "stayOn": true, + "streetName": "sidewalk" + }, + { + "absoluteDirection": "NORTHWEST", + "alerts": [], + "area": false, + "distance": 97.07, + "elevationProfile": [], + "lat": 33.7535935, + "lon": -84.3905922, + "relativeDirection": "RIGHT", + "stayOn": true, + "streetName": "path" + } + ], + "to": { + "lat": 33.753837, + "lon": -84.391397, + "name": "Five Points Station (908981)", + "rentalVehicle": null, + "stop": null, + "vertexType": "NORMAL" + }, + "transitLeg": false, + "trip": null + } + ], + "startTime": 1691095740000, + "waitingTime": 0, + "walkTime": 5246 + } + ], + "routingErrors": [] + } + } +} \ No newline at end of file diff --git a/percy/mocks/Routes.json b/percy/mocks/Routes.json new file mode 100644 index 000000000..dc7441e9b --- /dev/null +++ b/percy/mocks/Routes.json @@ -0,0 +1,2154 @@ +{ + "data": { + "routes": [ + { + "gtfsId": "GwinnettCountyTransit:40", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Lawrenceville - GTC - Sugarloaf Mills", + "shortName": "40", + "mode": "BUS", + "type": 3, + "color": "AB0634" + }, + { + "gtfsId": "CobbLinc:30", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Hamilton E. Holmes Station/MTC", + "shortName": "30", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "MARTA:19339", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "14th Street / Blandtown", + "shortName": "14", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19338", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Howell Mill Road / Cumberland", + "shortName": "12", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19335", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Clifton Road / Emory", + "shortName": "6", + "mode": "BUS", + "type": 3, + "color": "008080" + }, + { + "gtfsId": "MARTA:19456", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Gold", + "shortName": "Gold", + "mode": "SUBWAY", + "type": 1, + "color": "D4A723" + }, + { + "gtfsId": "MARTA:19852", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Clairmont Road / Howard Avenue", + "shortName": "19", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19334", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Piedmont Road / Sandy Springs", + "shortName": "5", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19455", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Blue", + "shortName": "Blue", + "mode": "SUBWAY", + "type": 1, + "color": "0075B2" + }, + { + "gtfsId": "MARTA:19337", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Boulevard / Tilson Road", + "shortName": "9", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19458", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Red", + "shortName": "Red", + "mode": "SUBWAY", + "type": 1, + "color": "CE242B" + }, + { + "gtfsId": "MARTA:19457", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Green", + "shortName": "Green", + "mode": "SUBWAY", + "type": 1, + "color": "009D4B" + }, + { + "gtfsId": "MARTA:19336", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "North Druid Hills Road", + "shortName": "8", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19331", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Ponce De Leon Avenue / Druid Hills", + "shortName": "2", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "Xpress:423", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "E Conyer/W Conyer/Panola - MT", + "shortName": "423", + "mode": "BUS", + "type": 3, + "color": "01925c" + }, + { + "gtfsId": "MARTA:19330", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Marietta Blvd/Joseph E Lowery Blvd", + "shortName": "1", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19451", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Old Fourth Ward", + "shortName": "899", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19333", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Moreland Avenue", + "shortName": "4", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19453", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Atlanta Streetcar", + "shortName": "Atlsc", + "mode": "TRAM", + "type": 0, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19332", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Martin Luther King Jr Dr/Auburn Ave", + "shortName": "3", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "Xpress:426", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "E Conyer/W Conyer/Panola - DT", + "shortName": "426", + "mode": "BUS", + "type": 3, + "color": "01925c" + }, + { + "gtfsId": "MARTA:19450", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peyton Forest / Dixie Hills", + "shortName": "867", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "Xpress:428", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "W Conyers/Panola - Perimeter", + "shortName": "428", + "mode": "BUS", + "type": 3, + "color": "01925c" + }, + { + "gtfsId": "CobbLinc:25", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Hamilton E. Holmes Station/CTC", + "shortName": "25", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "GwinnettCountyTransit:35", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Peachtree Pkwy - Doraville", + "shortName": "35", + "mode": "BUS", + "type": 3, + "color": "F15822" + }, + { + "gtfsId": "CobbLinc:BLUE", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Cumberland Transfer CTC/Battery", + "shortName": "BLUE", + "mode": "BUS", + "type": 3, + "color": "ffffff" + }, + { + "gtfsId": "GwinnettCountyTransit:30", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Lilburn - GTC", + "shortName": "30", + "mode": "BUS", + "type": 3, + "color": "FFEF00" + }, + { + "gtfsId": "CobbLinc:40", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "KSU-Kennesaw - MTC via Marietta", + "shortName": "40", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "CobbLinc:RAPID", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Arts Station/KSU-Kennesaw Rapid", + "shortName": "RAPID", + "mode": "BUS", + "type": 3, + "color": "ffffff" + }, + { + "gtfsId": "Xpress:490", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Woodstock - Downtown", + "shortName": "490", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19449", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Boulder Park Drive", + "shortName": "865", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19448", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Baker Hills / Wilson Mill Meadows", + "shortName": "856", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19445", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Grant Park", + "shortName": "832", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19444", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Johnson Ferry Road", + "shortName": "825", + "mode": "BUS", + "type": 3, + "color": "FF0000" + }, + { + "gtfsId": "MARTA:19447", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Center Hill", + "shortName": "853", + "mode": "BUS", + "type": 3, + "color": "A6CAF0" + }, + { + "gtfsId": "ConnectDouglas:37220", + "agency": { + "gtfsId": "ConnectDouglas:1661", + "name": "Connect Douglas" + }, + "longName": "Route 40", + "shortName": null, + "mode": "BUS", + "type": 3, + "color": "2CA02C" + }, + { + "gtfsId": "Xpress:410", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Sugarloaf Mills - Lindbergh Cent", + "shortName": "410", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19446", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Carroll Heights / Fairburn Heights", + "shortName": "850", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "Xpress:412", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Sugarloaf Mills - Midtown", + "shortName": "412", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19441", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Atlanta University Center", + "shortName": "813", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19440", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Monroe Drive / Boulevard", + "shortName": "809", + "mode": "BUS", + "type": 3, + "color": "FF0000" + }, + { + "gtfsId": "Xpress:411", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Hamilton Mill/Mall of GA - MT", + "shortName": "411", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19443", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Belvedere", + "shortName": "823", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "Xpress:414", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Ham Mill/Mall of GA/Sugarloaf-MT", + "shortName": "414", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19442", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "North Highland Avenue", + "shortName": "816", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "Xpress:413", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Hamilton Mill/Mall of GA - DT", + "shortName": "413", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "Xpress:416", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Dacula - Downtown", + "shortName": "416", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "CATS:87961", + "agency": { + "gtfsId": "CATS:CATS", + "name": "Cherokee Area Transportation System (CATS)" + }, + "longName": "Route 2", + "shortName": "RT 2", + "mode": "BUS", + "type": 3, + "color": "008a10" + }, + { + "gtfsId": "CATS:87960", + "agency": { + "gtfsId": "CATS:CATS", + "name": "Cherokee Area Transportation System (CATS)" + }, + "longName": "Route 1", + "shortName": "RT 1", + "mode": "BUS", + "type": 3, + "color": "1cabf2" + }, + { + "gtfsId": "Xpress:417", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Sugarloaf Mills - Perimeter", + "shortName": "417", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "Xpress:419", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Snellville/Hewatt/Stone Mtn - DT", + "shortName": "419", + "mode": "BUS", + "type": 3, + "color": "01925c" + }, + { + "gtfsId": "GwinnettCountyTransit:20", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Beaver Ruin - Doraville", + "shortName": "20", + "mode": "BUS", + "type": 3, + "color": "00BCF2" + }, + { + "gtfsId": "CobbLinc:10", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Arts Center Station/Marietta TC", + "shortName": "10", + "mode": "BUS", + "type": 3, + "color": "1d1b11" + }, + { + "gtfsId": "Xpress:480", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Acworth/Town Center - Downtown", + "shortName": "480", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "Xpress:483", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Woodstock/Town Center - Midtown", + "shortName": "483", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19357", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Donald Lee Hollowell Parkway", + "shortName": "50", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "Xpress:485", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Hickory Grove - Downtown", + "shortName": "485", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "Xpress:484", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Hickory Grove - Midtown", + "shortName": "484", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19356", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Mcdonough Boulevard", + "shortName": "49", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19359", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Jonesboro Road", + "shortName": "55", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "MARTA:19358", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Joseph E Boone Boulevard", + "shortName": "51", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "Xpress:401", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Cumming - Perimeter", + "shortName": "401", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19353", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peachtree Street / Downtown", + "shortName": "40", + "mode": "BUS", + "type": 3, + "color": "FFFF00" + }, + { + "gtfsId": "Xpress:400", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Cumming - Downtown", + "shortName": "400", + "mode": "BUS", + "type": 3, + "color": "0f78af" + }, + { + "gtfsId": "MARTA:19352", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Buford Highway", + "shortName": "39", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19355", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "I-85 Access Road", + "shortName": "47", + "mode": "BUS", + "type": 3, + "color": "FF8080" + }, + { + "gtfsId": "MARTA:19354", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Pryor Road", + "shortName": "42", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "ConnectDouglas:16390", + "agency": { + "gtfsId": "ConnectDouglas:1661", + "name": "Connect Douglas" + }, + "longName": "Route 10", + "shortName": null, + "mode": "BUS", + "type": 3, + "color": "1F77B4" + }, + { + "gtfsId": "MARTA:19351", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Defoors Ferry Road", + "shortName": "37", + "mode": "BUS", + "type": 3, + "color": "00FF80" + }, + { + "gtfsId": "MARTA:19350", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "N Decatur Road / Virginia Highland", + "shortName": "36", + "mode": "BUS", + "type": 3, + "color": "A6CAF0" + }, + { + "gtfsId": "GwinnettCountyTransit:10", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Sug - GTC - Dora via Satellite", + "shortName": "10A", + "mode": "BUS", + "type": 3, + "color": "5A3F99" + }, + { + "gtfsId": "CobbLinc:20", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "CTC - MTC via S. Cobb Drive", + "shortName": "20", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "MARTA:19349", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Gresham Road", + "shortName": "34", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "GwinnettCountyTransit:110", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Indian Trail P&R - Emory", + "shortName": "110", + "mode": "BUS", + "type": 3, + "color": "003971" + }, + { + "gtfsId": "MARTA:19346", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Cheshire Bridge Road", + "shortName": "27", + "mode": "BUS", + "type": 3, + "color": "FF0080" + }, + { + "gtfsId": "MARTA:19345", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Marietta Street / Perry Boulevard", + "shortName": "26", + "mode": "BUS", + "type": 3, + "color": "008080" + }, + { + "gtfsId": "Xpress:476", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Hiram/Powder Springs - DT/MT", + "shortName": "476", + "mode": "BUS", + "type": 3, + "color": "8e287e" + }, + { + "gtfsId": "ConnectDouglas:17130", + "agency": { + "gtfsId": "ConnectDouglas:1661", + "name": "Connect Douglas" + }, + "longName": "Route 20", + "shortName": null, + "mode": "BUS", + "type": 3, + "color": "FF7F0E" + }, + { + "gtfsId": "MARTA:19348", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Bouldercrest", + "shortName": "32", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19347", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Lavista Road", + "shortName": "30", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "ConnectDouglas:17131", + "agency": { + "gtfsId": "ConnectDouglas:1661", + "name": "Connect Douglas" + }, + "longName": "Route 30", + "shortName": null, + "mode": "BUS", + "type": 3, + "color": "D62728" + }, + { + "gtfsId": "MARTA:19342", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Memorial Drive", + "shortName": "21", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19344", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peachtree Boulevard", + "shortName": "25", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19343", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Mcafee / Hosea Williams", + "shortName": "24", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19340", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Candler Road", + "shortName": "15", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "CobbLinc:15", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "CTC - MTC via Windy Hill", + "shortName": "15", + "mode": "BUS", + "type": 3, + "color": "404040" + }, + { + "gtfsId": "MARTA:19419", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Riverdale / Atl Intl Terminal", + "shortName": "191", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "GwinnettCountyTransit:103", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Sugarloaf Mills P&R - Downtown Atlanta", + "shortName": "103", + "mode": "BUS", + "type": 3, + "color": "008852" + }, + { + "gtfsId": "GwinnettCountyTransit:102", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Indian Trail P&R - Downtown Atlanta", + "shortName": "102", + "mode": "BUS", + "type": 3, + "color": "A0CF67" + }, + { + "gtfsId": "MARTA:19416", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Rainbow Drive / South Dekalb", + "shortName": "186", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19415", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Alpharetta", + "shortName": "185", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "GwinnettCountyTransit:101", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "I-985 P&R - Downtown Atlanta", + "shortName": "101", + "mode": "BUS", + "type": 3, + "color": "E7A614" + }, + { + "gtfsId": "MARTA:19418", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Flat Shoals Road / Scofield Road", + "shortName": "189", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19417", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Oakley Industrial", + "shortName": "188", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19412", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Roosevelt Highway", + "shortName": "180", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19379", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Northside Drive", + "shortName": "94", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "Xpress:463", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "W Douglas/Douglas MMTC - DT/MT", + "shortName": "463", + "mode": "BUS", + "type": 3, + "color": "8e287e" + }, + { + "gtfsId": "MARTA:19378", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Headland Drive / Main Street", + "shortName": "93", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19411", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Empire Blvd / Southside Ind Park", + "shortName": "178", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19414", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Greenbriar", + "shortName": "183", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19413", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Washington Road / Fairburn", + "shortName": "181", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19375", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Fairington Road", + "shortName": "86", + "mode": "BUS", + "type": 3, + "color": "A6CAF0" + }, + { + "gtfsId": "MARTA:19374", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Roswell", + "shortName": "85", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19410", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Sylvan Road / Virginia Avenue", + "shortName": "172", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19377", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Old National Highway", + "shortName": "89", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19376", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Roswell Road / Sandy Springs", + "shortName": "87", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19371", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Camp Creek / South Fulton Parkway", + "shortName": "82", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19370", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Venetian Hills / Delowe Drive", + "shortName": "81", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19373", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Washington Rd/Camp Crk Marketplace", + "shortName": "84", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19372", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Campbellton Road", + "shortName": "83", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19409", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Fairburn Road", + "shortName": "165", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "CobbLinc:100", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Civic Center Station/Busbee P&R", + "shortName": "100", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "MARTA:19408", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Myrtle Drive / Alison Court", + "shortName": "162", + "mode": "BUS", + "type": 3, + "color": "008080" + }, + { + "gtfsId": "CobbLinc:101", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Civic Center/Five Points/MTC", + "shortName": "101", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "CobbLinc:102", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Arts Center Station/Acworth P&R", + "shortName": "102", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "MARTA:19405", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Dunwoody Village", + "shortName": "150", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19404", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Mount Vernon Highway", + "shortName": "148", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19407", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Pittsburgh", + "shortName": "155", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19406", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "James Jackson Parkway", + "shortName": "153", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "MARTA:19368", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Cleveland Avenue", + "shortName": "78", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19401", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Haynes Bridge Road / Milton", + "shortName": "141", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19400", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "North Point Parkway", + "shortName": "140", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "MARTA:19367", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Lawrenceville Highway", + "shortName": "75", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19403", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Windward Park & Ride", + "shortName": "143", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19402", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "East Holcomb Bridge Road", + "shortName": "142", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19369", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Sylvan Hills", + "shortName": "79", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "Xpress:453", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Newnan/Union City - DT/MT", + "shortName": "453", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "MARTA:19364", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Cascade Road", + "shortName": "71", + "mode": "BUS", + "type": 3, + "color": "FF8080" + }, + { + "gtfsId": "MARTA:19363", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Benjamin E Mays Drive", + "shortName": "68", + "mode": "BUS", + "type": 3, + "color": "FF0000" + }, + { + "gtfsId": "CobbLinc:GREEN", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "Battery/Windy Hill", + "shortName": "GREEN", + "mode": "BUS", + "type": 3, + "color": "ffffff" + }, + { + "gtfsId": "MARTA:19366", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Flat Shoals Road", + "shortName": "74", + "mode": "BUS", + "type": 3, + "color": "FF8000" + }, + { + "gtfsId": "MARTA:19365", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Fulton Industrial", + "shortName": "73", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19360", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Hollywood Road / Lucile Avenue", + "shortName": "58", + "mode": "BUS", + "type": 3, + "color": "A6CAF0" + }, + { + "gtfsId": "MARTA:19362", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Lynhurst Drive / Princeton Lakes", + "shortName": "66", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19361", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Hightower Road", + "shortName": "60", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "CobbLinc:50", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "CTC - MTC via Powers Ferry", + "shortName": "50", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "ConnectDouglas:37219", + "agency": { + "gtfsId": "ConnectDouglas:1661", + "name": "Connect Douglas" + }, + "longName": "Route 40A", + "shortName": null, + "mode": "BUS", + "type": 3, + "color": "2CA02C" + }, + { + "gtfsId": "GwinnettCountyTransit:203", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Rev Commute Atlanta - Sugarloaf Mills", + "shortName": "103A", + "mode": "BUS", + "type": 3, + "color": "6A737B" + }, + { + "gtfsId": "GwinnettCountyTransit:202", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Express PM Sweeper", + "shortName": "SWPR", + "mode": "BUS", + "type": 3, + "color": "0037ff" + }, + { + "gtfsId": "MARTA:19439", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Lovejoy", + "shortName": "800", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "Xpress:441", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Jonesboro - Downtown/Midtown", + "shortName": "441", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "Xpress:440", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Hampton/Jonesboro - DT/MT", + "shortName": "440", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "Xpress:442", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "Riverdale - Downtown", + "shortName": "442", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "MARTA:19397", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Embry Hills", + "shortName": "126", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19396", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Clarkston", + "shortName": "125", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19399", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Shallowford Road", + "shortName": "133", + "mode": "BUS", + "type": 3, + "color": "FFFF00" + }, + { + "gtfsId": "MARTA:19398", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Tilly Mill Road", + "shortName": "132", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19393", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Memorial Drive / N Hairston Road", + "shortName": "121", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "CobbLinc:45", + "agency": { + "gtfsId": "CobbLinc:1", + "name": "CobbLinc" + }, + "longName": "KSU-Kennesaw - MTC via US 41", + "shortName": "45", + "mode": "BUS", + "type": 3, + "color": "0d0d0d" + }, + { + "gtfsId": "MARTA:19392", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "East Ponce De Leon Avenue", + "shortName": "120", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19395", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Pleasantdale Road", + "shortName": "124", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19394", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Church Street", + "shortName": "123", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19391", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Hairston Road / Stone Mtn Village", + "shortName": "119", + "mode": "BUS", + "type": 3, + "color": "008080" + }, + { + "gtfsId": "MARTA:19390", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Rockbridge Road / Panola Road", + "shortName": "117", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "GwinnettCountyTransit:50", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "Sug - GTC - Dora via Remington", + "shortName": "10B", + "mode": "BUS", + "type": 3, + "color": "008B44" + }, + { + "gtfsId": "MARTA:19427", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Six Flags Over Georgia", + "shortName": "201", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19426", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Southlake Parkway", + "shortName": "198", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19429", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Metropolitan Campus Express", + "shortName": "295", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19428", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Memorial Drive Limited", + "shortName": "221", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "Xpress:430", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "McDonough - Downtown", + "shortName": "430", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "MARTA:19423", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Forest Parkway", + "shortName": "195", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "MARTA:19422", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Conley Road / Mt Zion", + "shortName": "194", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19389", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Redan Road", + "shortName": "116", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "Xpress:432", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "BrandsMart/Stockbridge - DT", + "shortName": "432", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "MARTA:19425", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Battle Creek Road", + "shortName": "197", + "mode": "BUS", + "type": 3, + "color": "FF00FF" + }, + { + "gtfsId": "Xpress:431", + "agency": { + "gtfsId": "Xpress:1", + "name": "Xpress" + }, + "longName": "BrandsMart/Stockbridge - MT", + "shortName": "431", + "mode": "BUS", + "type": 3, + "color": "f44d23" + }, + { + "gtfsId": "MARTA:19424", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Upper Riverdale", + "shortName": "196", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19386", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Snapfinger Woods", + "shortName": "111", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19385", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peachtree Road / Buckhead", + "shortName": "110", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19388", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Covington Highway", + "shortName": "115", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19421", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Morrow / Jonesboro", + "shortName": "193", + "mode": "BUS", + "type": 3, + "color": "008080" + }, + { + "gtfsId": "MARTA:19420", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Old Dixie / Tara Boulevard", + "shortName": "192", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19387", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Columbia Drive", + "shortName": "114", + "mode": "BUS", + "type": 3, + "color": "FF8040" + }, + { + "gtfsId": "MARTA:19382", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peeler Road", + "shortName": "103", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "MARTA:19381", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "North Avenue / Little Five Points", + "shortName": "102", + "mode": "BUS", + "type": 3, + "color": "00FF00" + }, + { + "gtfsId": "MARTA:19384", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Glenwood", + "shortName": "107", + "mode": "BUS", + "type": 3, + "color": "008000" + }, + { + "gtfsId": "MARTA:19383", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Winters Chapel Road", + "shortName": "104", + "mode": "BUS", + "type": 3, + "color": "00FFFF" + }, + { + "gtfsId": "GwinnettCountyTransit:45", + "agency": { + "gtfsId": "GwinnettCountyTransit:GCT", + "name": "Ride Gwinnett" + }, + "longName": "GGC", + "shortName": "45", + "mode": "BUS", + "type": 3, + "color": "005534" + }, + { + "gtfsId": "MARTA:19380", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Metropolitan Parkway", + "shortName": "95", + "mode": "BUS", + "type": 3, + "color": "FF0000" + } + ] + } +} \ No newline at end of file diff --git a/percy/mocks/ServiceTimeRangeResponse.json b/percy/mocks/ServiceTimeRangeResponse.json new file mode 100644 index 000000000..fe80097a6 --- /dev/null +++ b/percy/mocks/ServiceTimeRangeResponse.json @@ -0,0 +1,8 @@ +{ + "data": { + "serviceTimeRange": { + "start": 1661745600, + "end": 1735707600 + } + } +} \ No newline at end of file diff --git a/percy/mocks/Stop114900Response.json b/percy/mocks/Stop114900Response.json new file mode 100644 index 000000000..2ae8e734d --- /dev/null +++ b/percy/mocks/Stop114900Response.json @@ -0,0 +1,1863 @@ +{ + "data": { + "stop": { + "gtfsId": "MARTA:114900", + "code": "114900", + "lat": 33.735899, + "lon": -84.413542, + "locationType": "STOP", + "name": "West End Station", + "wheelchairBoarding": "POSSIBLE", + "zone": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4135, + 33.7359 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19379", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Northside Drive", + "mode": "BUS", + "color": "008000", + "textColor": "000000", + "shortName": "94" + }, + { + "gtfsId": "MARTA:19445", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Grant Park", + "mode": "BUS", + "color": "00FF00", + "textColor": "000000", + "shortName": "832" + }, + { + "gtfsId": "MARTA:19364", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Cascade Road", + "mode": "BUS", + "color": "FF8080", + "textColor": "000000", + "shortName": "71" + }, + { + "gtfsId": "MARTA:19353", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peachtree Street / Downtown", + "mode": "BUS", + "color": "FFFF00", + "textColor": "000000", + "shortName": "40" + }, + { + "gtfsId": "MARTA:19363", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Benjamin E Mays Drive", + "mode": "BUS", + "color": "FF0000", + "textColor": "000000", + "shortName": "68" + }, + { + "gtfsId": "MARTA:19330", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Marietta Blvd/Joseph E Lowery Blvd", + "mode": "BUS", + "color": "FF00FF", + "textColor": "000000", + "shortName": "1" + }, + { + "gtfsId": "MARTA:19360", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Hollywood Road / Lucile Avenue", + "mode": "BUS", + "color": "A6CAF0", + "textColor": "000000", + "shortName": "58" + }, + { + "gtfsId": "MARTA:19370", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Venetian Hills / Delowe Drive", + "mode": "BUS", + "color": "00FF00", + "textColor": "000000", + "shortName": "81" + }, + { + "gtfsId": "MARTA:19380", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Metropolitan Parkway", + "mode": "BUS", + "color": "FF0000", + "textColor": "000000", + "shortName": "95" + }, + { + "gtfsId": "MARTA:19407", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rap Transit Authority" + }, + "longName": "Pittsburgh", + "mode": "BUS", + "color": "00FFFF", + "textColor": "000000", + "shortName": "155" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "832 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19445:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 47220, + "realtimeDeparture": 47220, + "realtimeState": "SCHEDULED", + "scheduledArrival": 47220, + "scheduledDeparture": 47220, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTgw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 43620, + "realtimeDeparture": 43620, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43620, + "scheduledDeparture": 43620, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTgx" + } + }, + { + "arrivalDelay": 159, + "departureDelay": 159, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40179, + "realtimeDeparture": 40179, + "realtimeState": "UPDATED", + "scheduledArrival": 40020, + "scheduledDeparture": 40020, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTgy" + } + } + ] + }, + { + "pattern": { + "desc": "95 Hapeville", + "headsign": "Hapeville", + "gtfsId": "MARTA:19380:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hapeville", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTc1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hapeville", + "realtime": true, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTc2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hapeville", + "realtime": true, + "realtimeArrival": 39600, + "realtimeDeparture": 39600, + "realtimeState": "UPDATED", + "scheduledArrival": 39600, + "scheduledDeparture": 39600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTc3" + } + } + ] + }, + { + "pattern": { + "desc": "40 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19353:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 44820, + "realtimeDeparture": 44820, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44820, + "scheduledDeparture": 44820, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDg5" + } + }, + { + "arrivalDelay": -10, + "departureDelay": -10, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42110, + "realtimeDeparture": 42110, + "realtimeState": "UPDATED", + "scheduledArrival": 42120, + "scheduledDeparture": 42120, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDg4" + } + }, + { + "arrivalDelay": 457, + "departureDelay": 457, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 39877, + "realtimeDeparture": 39877, + "realtimeState": "UPDATED", + "scheduledArrival": 39420, + "scheduledDeparture": 39420, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDg3" + } + } + ] + }, + { + "pattern": { + "desc": "68 Ashby Station", + "headsign": "Ashby Station", + "gtfsId": "MARTA:19363:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Ashby Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTc0" + } + }, + { + "arrivalDelay": 100, + "departureDelay": 100, + "headsign": "Ashby Station", + "realtime": true, + "realtimeArrival": 43600, + "realtimeDeparture": 43600, + "realtimeState": "UPDATED", + "scheduledArrival": 43500, + "scheduledDeparture": 43500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Ashby Station", + "realtime": false, + "realtimeArrival": 41100, + "realtimeDeparture": 41100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTcy" + } + } + ] + }, + { + "pattern": { + "desc": "94 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19379:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45060, + "realtimeDeparture": 45060, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45060, + "scheduledDeparture": 45060, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNjAx" + } + }, + { + "arrivalDelay": 30, + "departureDelay": 30, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42690, + "realtimeDeparture": 42690, + "realtimeState": "UPDATED", + "scheduledArrival": 42660, + "scheduledDeparture": 42660, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNjAw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 40260, + "realtimeDeparture": 40260, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40260, + "scheduledDeparture": 40260, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTk5" + } + } + ] + }, + { + "pattern": { + "desc": "155 Swallow Circle", + "headsign": "Swallow Circle", + "gtfsId": "MARTA:19407:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Swallow Circle", + "realtime": false, + "realtimeArrival": 50100, + "realtimeDeparture": 50100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 50100, + "scheduledDeparture": 50100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Swallow Circle", + "realtime": false, + "realtimeArrival": 44700, + "realtimeDeparture": 44700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44700, + "scheduledDeparture": 44700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Swallow Circle", + "realtime": false, + "realtimeArrival": 39300, + "realtimeDeparture": 39300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 39300, + "scheduledDeparture": 39300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTE4" + } + } + ] + }, + { + "pattern": { + "desc": "71 to West End Station (MARTA:114900) from Boat Rock Rd SW at Reynolds Rd SW (MARTA:119002)", + "headsign": "West End Station", + "gtfsId": "MARTA:19364:0:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDg5" + } + }, + { + "arrivalDelay": 346, + "departureDelay": 346, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 43846, + "realtimeDeparture": 43846, + "realtimeState": "UPDATED", + "scheduledArrival": 43500, + "scheduledDeparture": 43500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDg4" + } + }, + { + "arrivalDelay": -147, + "departureDelay": -147, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40953, + "realtimeDeparture": 40953, + "realtimeState": "UPDATED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDg3" + } + } + ] + }, + { + "pattern": { + "desc": "71 to West End Station (MARTA:114900) from Kimberly Rd at Fairly Way (MARTA:999673)", + "headsign": "West End Station", + "gtfsId": "MARTA:19364:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 44700, + "realtimeDeparture": 44700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44700, + "scheduledDeparture": 44700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDcw" + } + }, + { + "arrivalDelay": -102, + "departureDelay": -102, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42198, + "realtimeDeparture": 42198, + "realtimeState": "UPDATED", + "scheduledArrival": 42300, + "scheduledDeparture": 42300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDY5" + } + }, + { + "arrivalDelay": -136, + "departureDelay": -136, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 39764, + "realtimeDeparture": 39764, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDY4" + } + } + ] + }, + { + "pattern": { + "desc": "155 Polar Rock Road", + "headsign": "Polar Rock Road", + "gtfsId": "MARTA:19407:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Polar Rock Road", + "realtime": false, + "realtimeArrival": 52800, + "realtimeDeparture": 52800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 52800, + "scheduledDeparture": 52800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Polar Rock Road", + "realtime": false, + "realtimeArrival": 47400, + "realtimeDeparture": 47400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 47400, + "scheduledDeparture": 47400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Polar Rock Road", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTE5" + } + } + ] + }, + { + "pattern": { + "desc": "1 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19330:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2MjQ2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 43500, + "realtimeDeparture": 43500, + "realtimeState": "UPDATED", + "scheduledArrival": 43500, + "scheduledDeparture": 43500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2MjQ1" + } + }, + { + "arrivalDelay": -162, + "departureDelay": -162, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40938, + "realtimeDeparture": 40938, + "realtimeState": "UPDATED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2MjQ0" + } + } + ] + }, + { + "pattern": { + "desc": "58 West Lake Station via Lincoln Homes", + "headsign": "West Lake Station via Lincoln Homes", + "gtfsId": "MARTA:19360:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West Lake Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 60300, + "realtimeDeparture": 60300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 60300, + "scheduledDeparture": 60300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDY4" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West Lake Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 57600, + "realtimeDeparture": 57600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 57600, + "scheduledDeparture": 57600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDY3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West Lake Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 54900, + "realtimeDeparture": 54900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 54900, + "scheduledDeparture": 54900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDY2" + } + } + ] + }, + { + "pattern": { + "desc": "81 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19370:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 46800, + "realtimeDeparture": 46800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 46800, + "scheduledDeparture": 46800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc5" + } + }, + { + "arrivalDelay": 62, + "departureDelay": 62, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 44162, + "realtimeDeparture": 44162, + "realtimeState": "UPDATED", + "scheduledArrival": 44100, + "scheduledDeparture": 44100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc4" + } + }, + { + "arrivalDelay": 11, + "departureDelay": 11, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 41411, + "realtimeDeparture": 41411, + "realtimeState": "UPDATED", + "scheduledArrival": 41400, + "scheduledDeparture": 41400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc3" + } + } + ] + }, + { + "pattern": { + "desc": "94 Arts Center Station", + "headsign": "Arts Center Station", + "gtfsId": "MARTA:19379:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 45600, + "realtimeDeparture": 45600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45600, + "scheduledDeparture": 45600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTcy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTcx" + } + } + ] + }, + { + "pattern": { + "desc": "95 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19380:0:01" + }, + "times": [ + { + "arrivalDelay": -36, + "departureDelay": -36, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42264, + "realtimeDeparture": 42264, + "realtimeState": "UPDATED", + "scheduledArrival": 42300, + "scheduledDeparture": 42300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTAw" + } + }, + { + "arrivalDelay": -2, + "departureDelay": -2, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 41098, + "realtimeDeparture": 41098, + "realtimeState": "UPDATED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTAx" + } + }, + { + "arrivalDelay": 211, + "departureDelay": 211, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40111, + "realtimeDeparture": 40111, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTAy" + } + } + ] + }, + { + "pattern": { + "desc": "58 Hollywood Road via West Lake Station", + "headsign": "Hollywood Road via West Lake Station", + "gtfsId": "MARTA:19360:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hollywood Road via West Lake Station", + "realtime": false, + "realtimeArrival": 46800, + "realtimeDeparture": 46800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 46800, + "scheduledDeparture": 46800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDYz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hollywood Road via West Lake Station", + "realtime": false, + "realtimeArrival": 44100, + "realtimeDeparture": 44100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44100, + "scheduledDeparture": 44100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDYy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hollywood Road via West Lake Station", + "realtime": true, + "realtimeArrival": 41400, + "realtimeDeparture": 41400, + "realtimeState": "UPDATED", + "scheduledArrival": 41400, + "scheduledDeparture": 41400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDYx" + } + } + ] + }, + { + "pattern": { + "desc": "68 H.E. Holmes Station", + "headsign": "H.E. Holmes Station", + "gtfsId": "MARTA:19363:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": false, + "realtimeArrival": 45600, + "realtimeDeparture": 45600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45600, + "scheduledDeparture": 45600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjA1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjA0" + } + }, + { + "arrivalDelay": -201, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": true, + "realtimeArrival": 40599, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjAz" + } + } + ] + }, + { + "pattern": { + "desc": "40 Arts Center Station", + "headsign": "Arts Center Station", + "gtfsId": "MARTA:19353:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 45300, + "realtimeDeparture": 45300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45300, + "scheduledDeparture": 45300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDY3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 42600, + "realtimeDeparture": 42600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42600, + "scheduledDeparture": 42600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDY2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 37, + "headsign": "Arts Center Station", + "realtime": true, + "realtimeArrival": 39900, + "realtimeDeparture": 39937, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDY1" + } + } + ] + }, + { + "pattern": { + "desc": "832 Woodland Avenue", + "headsign": "Woodland Avenue", + "gtfsId": "MARTA:19445:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Woodland Avenue", + "realtime": false, + "realtimeArrival": 48000, + "realtimeDeparture": 48000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 48000, + "scheduledDeparture": 48000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTYw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Woodland Avenue", + "realtime": false, + "realtimeArrival": 44400, + "realtimeDeparture": 44400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44400, + "scheduledDeparture": 44400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTYx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Woodland Avenue", + "realtime": true, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTYy" + } + } + ] + }, + { + "pattern": { + "desc": "71 Cascade - Kimberly Road", + "headsign": "Cascade - Kimberly Road", + "gtfsId": "MARTA:19364:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Kimberly Road", + "realtime": false, + "realtimeArrival": 44400, + "realtimeDeparture": 44400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44400, + "scheduledDeparture": 44400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTYx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Kimberly Road", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTYw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Kimberly Road", + "realtime": true, + "realtimeArrival": 39600, + "realtimeDeparture": 39600, + "realtimeState": "UPDATED", + "scheduledArrival": 39600, + "scheduledDeparture": 39600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTU5" + } + } + ] + }, + { + "pattern": { + "desc": "155 to West End Station (MARTA:114900) from Swallow Cir at Finch Dr (MARTA:99971007)", + "headsign": "West End Station", + "gtfsId": "MARTA:19407:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 53400, + "realtimeDeparture": 53400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 53400, + "scheduledDeparture": 53400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 48000, + "realtimeDeparture": 48000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 48000, + "scheduledDeparture": 48000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 42600, + "realtimeDeparture": 42600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42600, + "scheduledDeparture": 42600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDkz" + } + } + ] + }, + { + "pattern": { + "desc": "155 to West End Station (MARTA:114900) from Polar Rock Ter SW at Polar Rock Rd SW (MARTA:149044)", + "headsign": "West End Station", + "gtfsId": "MARTA:19407:0:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 50700, + "realtimeDeparture": 50700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 50700, + "scheduledDeparture": 50700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45300, + "realtimeDeparture": 45300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45300, + "scheduledDeparture": 45300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk0" + } + }, + { + "arrivalDelay": 109, + "departureDelay": 109, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40009, + "realtimeDeparture": 40009, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDky" + } + } + ] + }, + { + "pattern": { + "desc": "71 Cascade - Boat Rock", + "headsign": "Cascade - Boat Rock", + "gtfsId": "MARTA:19364:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Boat Rock", + "realtime": false, + "realtimeArrival": 45600, + "realtimeDeparture": 45600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45600, + "scheduledDeparture": 45600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTQy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Boat Rock", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTQx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Boat Rock", + "realtime": true, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTQw" + } + } + ] + }, + { + "pattern": { + "desc": "58 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19360:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDM3" + } + }, + { + "arrivalDelay": -74, + "departureDelay": -74, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 43126, + "realtimeDeparture": 43126, + "realtimeState": "UPDATED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDM2" + } + }, + { + "arrivalDelay": -140, + "departureDelay": -140, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40360, + "realtimeDeparture": 40360, + "realtimeState": "UPDATED", + "scheduledArrival": 40500, + "scheduledDeparture": 40500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDM1" + } + } + ] + }, + { + "pattern": { + "desc": "58 West End Station via Lincoln Homes", + "headsign": "West End Station via Lincoln Homes", + "gtfsId": "MARTA:19360:0:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 24300, + "realtimeDeparture": 24300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 24300, + "scheduledDeparture": 24300, + "serviceDay": 1691553600, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDI5" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 21600, + "realtimeDeparture": 21600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 21600, + "scheduledDeparture": 21600, + "serviceDay": 1691553600, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDI4" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 18900, + "realtimeDeparture": 18900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 18900, + "scheduledDeparture": 18900, + "serviceDay": 1691553600, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDI3" + } + } + ] + }, + { + "pattern": { + "desc": "1 Moores Mill Center", + "headsign": "Moores Mill Center", + "gtfsId": "MARTA:19330:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Moores Mill Center", + "realtime": false, + "realtimeArrival": 44400, + "realtimeDeparture": 44400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44400, + "scheduledDeparture": 44400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2Mjcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Moores Mill Center", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2Mjcy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Moores Mill Center", + "realtime": true, + "realtimeArrival": 39600, + "realtimeDeparture": 39600, + "realtimeState": "UPDATED", + "scheduledArrival": 39600, + "scheduledDeparture": 39600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2Mjcx" + } + } + ] + }, + { + "pattern": { + "desc": "81 East Point Station", + "headsign": "East Point Station", + "gtfsId": "MARTA:19370:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": true, + "realtimeArrival": 40500, + "realtimeDeparture": 40500, + "realtimeState": "UPDATED", + "scheduledArrival": 40500, + "scheduledDeparture": 40500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA1" + } + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/percy/mocks/Stop803Response.json b/percy/mocks/Stop803Response.json new file mode 100644 index 000000000..365664298 --- /dev/null +++ b/percy/mocks/Stop803Response.json @@ -0,0 +1,133 @@ + { + "data": { + "stop": { + "gtfsId": "MARTA:803", + "code": "908691", + "lat": 33.775214, + "lon": -84.282466, + "locationType": "STOP", + "name": "Avondale Station", + "wheelchairBoarding": "POSSIBLE", + "zoneId": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.2825, + 33.7752 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19455", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Blue", + "mode": "SUBWAY", + "color": "0075B2", + "textColor": "000000", + "shortName": "Blue" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "Blue to Hamilton E Holmes Station (MARTA:40) from Indian Creek Station (MARTA:802)", + "headsign": "H E HOLMES STATION", + "gtfsId": "MARTA:19455:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H E HOLMES STATION", + "realtime": false, + "realtimeArrival": 65100, + "realtimeDeparture": 65100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 65100, + "scheduledDeparture": 65100, + "serviceDay": 1691121600, + "stop": { + "gtfsId": "MARTA:803" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDYzNDQ4" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H E HOLMES STATION", + "realtime": false, + "realtimeArrival": 64200, + "realtimeDeparture": 64200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 64200, + "scheduledDeparture": 64200, + "serviceDay": 1691121600, + "stop": { + "gtfsId": "MARTA:803" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDYzNDQ3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H E HOLMES STATION", + "realtime": false, + "realtimeArrival": 63300, + "realtimeDeparture": 63300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 63300, + "scheduledDeparture": 63300, + "serviceDay": 1691121600, + "stop": { + "gtfsId": "MARTA:803" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDYzNDQ2" + } + } + ] + }, + { + "pattern": { + "desc": "Blue to Five Points Station (MARTA:806)", + "headsign": "H E HOLMES STATION", + "gtfsId": "MARTA:19455:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H E HOLMES STATION", + "realtime": false, + "realtimeArrival": 90300, + "realtimeDeparture": 90300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 90300, + "scheduledDeparture": 90300, + "serviceDay": 1691121600, + "stop": { + "gtfsId": "MARTA:803" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDYzMzky" + } + } + ] + } + ] + } + } + } \ No newline at end of file diff --git a/percy/mocks/StopsByRadiusResponse.json b/percy/mocks/StopsByRadiusResponse.json new file mode 100644 index 000000000..83b354a9a --- /dev/null +++ b/percy/mocks/StopsByRadiusResponse.json @@ -0,0 +1,2603 @@ +{ + "data": { + "stopsByRadius": { + "edges": [ + { + "node": { + "stop": { + "gtfsId": "MARTA:114900", + "code": "114900", + "lat": 33.735899, + "lon": -84.413542, + "locationType": "STOP", + "name": "West End Station", + "wheelchairBoarding": "POSSIBLE", + "zoneId": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4135, + 33.7359 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19379", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Northside Drive", + "mode": "BUS", + "color": "008000", + "textColor": "000000", + "shortName": "94" + }, + { + "gtfsId": "MARTA:19445", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Grant Park", + "mode": "BUS", + "color": "00FF00", + "textColor": "000000", + "shortName": "832" + }, + { + "gtfsId": "MARTA:19364", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Cascade Road", + "mode": "BUS", + "color": "FF8080", + "textColor": "000000", + "shortName": "71" + }, + { + "gtfsId": "MARTA:19353", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Peachtree Street / Downtown", + "mode": "BUS", + "color": "FFFF00", + "textColor": "000000", + "shortName": "40" + }, + { + "gtfsId": "MARTA:19363", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Benjamin E Mays Drive", + "mode": "BUS", + "color": "FF0000", + "textColor": "000000", + "shortName": "68" + }, + { + "gtfsId": "MARTA:19330", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Marietta Blvd/Joseph E Lowery Blvd", + "mode": "BUS", + "color": "FF00FF", + "textColor": "000000", + "shortName": "1" + }, + { + "gtfsId": "MARTA:19360", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Hollywood Road / Lucile Avenue", + "mode": "BUS", + "color": "A6CAF0", + "textColor": "000000", + "shortName": "58" + }, + { + "gtfsId": "MARTA:19370", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Venetian Hills / Delowe Drive", + "mode": "BUS", + "color": "00FF00", + "textColor": "000000", + "shortName": "81" + }, + { + "gtfsId": "MARTA:19380", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Metropolitan Parkway", + "mode": "BUS", + "color": "FF0000", + "textColor": "000000", + "shortName": "95" + }, + { + "gtfsId": "MARTA:19407", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Pittsburgh", + "mode": "BUS", + "color": "00FFFF", + "textColor": "000000", + "shortName": "155" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "832 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19445:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 47220, + "realtimeDeparture": 47220, + "realtimeState": "SCHEDULED", + "scheduledArrival": 47220, + "scheduledDeparture": 47220, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTgw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 43620, + "realtimeDeparture": 43620, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43620, + "scheduledDeparture": 43620, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTgx" + } + }, + { + "arrivalDelay": 150, + "departureDelay": 150, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40170, + "realtimeDeparture": 40170, + "realtimeState": "UPDATED", + "scheduledArrival": 40020, + "scheduledDeparture": 40020, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTgy" + } + } + ] + }, + { + "pattern": { + "desc": "95 Hapeville", + "headsign": "Hapeville", + "gtfsId": "MARTA:19380:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hapeville", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTc1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hapeville", + "realtime": true, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTc2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hapeville", + "realtime": true, + "realtimeArrival": 39600, + "realtimeDeparture": 39600, + "realtimeState": "UPDATED", + "scheduledArrival": 39600, + "scheduledDeparture": 39600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTc3" + } + } + ] + }, + { + "pattern": { + "desc": "40 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19353:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 44820, + "realtimeDeparture": 44820, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44820, + "scheduledDeparture": 44820, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDg5" + } + }, + { + "arrivalDelay": -10, + "departureDelay": -10, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42110, + "realtimeDeparture": 42110, + "realtimeState": "UPDATED", + "scheduledArrival": 42120, + "scheduledDeparture": 42120, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDg4" + } + }, + { + "arrivalDelay": 457, + "departureDelay": 457, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 39877, + "realtimeDeparture": 39877, + "realtimeState": "UPDATED", + "scheduledArrival": 39420, + "scheduledDeparture": 39420, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDg3" + } + } + ] + }, + { + "pattern": { + "desc": "68 Ashby Station", + "headsign": "Ashby Station", + "gtfsId": "MARTA:19363:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Ashby Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTc0" + } + }, + { + "arrivalDelay": 100, + "departureDelay": 100, + "headsign": "Ashby Station", + "realtime": true, + "realtimeArrival": 43600, + "realtimeDeparture": 43600, + "realtimeState": "UPDATED", + "scheduledArrival": 43500, + "scheduledDeparture": 43500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Ashby Station", + "realtime": false, + "realtimeArrival": 41100, + "realtimeDeparture": 41100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTcy" + } + } + ] + }, + { + "pattern": { + "desc": "94 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19379:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45060, + "realtimeDeparture": 45060, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45060, + "scheduledDeparture": 45060, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNjAx" + } + }, + { + "arrivalDelay": 65, + "departureDelay": 65, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42725, + "realtimeDeparture": 42725, + "realtimeState": "UPDATED", + "scheduledArrival": 42660, + "scheduledDeparture": 42660, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNjAw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 40260, + "realtimeDeparture": 40260, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40260, + "scheduledDeparture": 40260, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTk5" + } + } + ] + }, + { + "pattern": { + "desc": "155 Swallow Circle", + "headsign": "Swallow Circle", + "gtfsId": "MARTA:19407:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Swallow Circle", + "realtime": false, + "realtimeArrival": 50100, + "realtimeDeparture": 50100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 50100, + "scheduledDeparture": 50100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Swallow Circle", + "realtime": false, + "realtimeArrival": 44700, + "realtimeDeparture": 44700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44700, + "scheduledDeparture": 44700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Swallow Circle", + "realtime": false, + "realtimeArrival": 39300, + "realtimeDeparture": 39300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 39300, + "scheduledDeparture": 39300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTE4" + } + } + ] + }, + { + "pattern": { + "desc": "71 to West End Station (MARTA:114900) from Boat Rock Rd SW at Reynolds Rd SW (MARTA:119002)", + "headsign": "West End Station", + "gtfsId": "MARTA:19364:0:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDg5" + } + }, + { + "arrivalDelay": 346, + "departureDelay": 346, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 43846, + "realtimeDeparture": 43846, + "realtimeState": "UPDATED", + "scheduledArrival": 43500, + "scheduledDeparture": 43500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDg4" + } + }, + { + "arrivalDelay": -147, + "departureDelay": -147, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40953, + "realtimeDeparture": 40953, + "realtimeState": "UPDATED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDg3" + } + } + ] + }, + { + "pattern": { + "desc": "71 to West End Station (MARTA:114900) from Kimberly Rd at Fairly Way (MARTA:999673)", + "headsign": "West End Station", + "gtfsId": "MARTA:19364:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 44700, + "realtimeDeparture": 44700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44700, + "scheduledDeparture": 44700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDcw" + } + }, + { + "arrivalDelay": -102, + "departureDelay": -102, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42198, + "realtimeDeparture": 42198, + "realtimeState": "UPDATED", + "scheduledArrival": 42300, + "scheduledDeparture": 42300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDY5" + } + }, + { + "arrivalDelay": -136, + "departureDelay": -136, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 39764, + "realtimeDeparture": 39764, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNDY4" + } + } + ] + }, + { + "pattern": { + "desc": "155 Polar Rock Road", + "headsign": "Polar Rock Road", + "gtfsId": "MARTA:19407:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Polar Rock Road", + "realtime": false, + "realtimeArrival": 52800, + "realtimeDeparture": 52800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 52800, + "scheduledDeparture": 52800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Polar Rock Road", + "realtime": false, + "realtimeArrival": 47400, + "realtimeDeparture": 47400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 47400, + "scheduledDeparture": 47400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTIx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Polar Rock Road", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MTE5" + } + } + ] + }, + { + "pattern": { + "desc": "1 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19330:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2MjQ2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 43500, + "realtimeDeparture": 43500, + "realtimeState": "UPDATED", + "scheduledArrival": 43500, + "scheduledDeparture": 43500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2MjQ1" + } + }, + { + "arrivalDelay": -162, + "departureDelay": -162, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40938, + "realtimeDeparture": 40938, + "realtimeState": "UPDATED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2MjQ0" + } + } + ] + }, + { + "pattern": { + "desc": "58 West Lake Station via Lincoln Homes", + "headsign": "West Lake Station via Lincoln Homes", + "gtfsId": "MARTA:19360:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West Lake Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 60300, + "realtimeDeparture": 60300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 60300, + "scheduledDeparture": 60300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDY4" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West Lake Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 57600, + "realtimeDeparture": 57600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 57600, + "scheduledDeparture": 57600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDY3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West Lake Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 54900, + "realtimeDeparture": 54900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 54900, + "scheduledDeparture": 54900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDY2" + } + } + ] + }, + { + "pattern": { + "desc": "81 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19370:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 46800, + "realtimeDeparture": 46800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 46800, + "scheduledDeparture": 46800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc5" + } + }, + { + "arrivalDelay": 62, + "departureDelay": 62, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 44162, + "realtimeDeparture": 44162, + "realtimeState": "UPDATED", + "scheduledArrival": 44100, + "scheduledDeparture": 44100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc4" + } + }, + { + "arrivalDelay": 11, + "departureDelay": 11, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 41411, + "realtimeDeparture": 41411, + "realtimeState": "UPDATED", + "scheduledArrival": 41400, + "scheduledDeparture": 41400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc3" + } + } + ] + }, + { + "pattern": { + "desc": "94 Arts Center Station", + "headsign": "Arts Center Station", + "gtfsId": "MARTA:19379:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 45600, + "realtimeDeparture": 45600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45600, + "scheduledDeparture": 45600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTcy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDMyNTcx" + } + } + ] + }, + { + "pattern": { + "desc": "95 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19380:0:01" + }, + "times": [ + { + "arrivalDelay": -36, + "departureDelay": -36, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 42264, + "realtimeDeparture": 42264, + "realtimeState": "UPDATED", + "scheduledArrival": 42300, + "scheduledDeparture": 42300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTAw" + } + }, + { + "arrivalDelay": -2, + "departureDelay": -2, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 41098, + "realtimeDeparture": 41098, + "realtimeState": "UPDATED", + "scheduledArrival": 41100, + "scheduledDeparture": 41100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTAx" + } + }, + { + "arrivalDelay": 211, + "departureDelay": 211, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40111, + "realtimeDeparture": 40111, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MjUwNTAy" + } + } + ] + }, + { + "pattern": { + "desc": "58 Hollywood Road via West Lake Station", + "headsign": "Hollywood Road via West Lake Station", + "gtfsId": "MARTA:19360:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hollywood Road via West Lake Station", + "realtime": false, + "realtimeArrival": 46800, + "realtimeDeparture": 46800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 46800, + "scheduledDeparture": 46800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDYz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hollywood Road via West Lake Station", + "realtime": false, + "realtimeArrival": 44100, + "realtimeDeparture": 44100, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44100, + "scheduledDeparture": 44100, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDYy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Hollywood Road via West Lake Station", + "realtime": true, + "realtimeArrival": 41400, + "realtimeDeparture": 41400, + "realtimeState": "UPDATED", + "scheduledArrival": 41400, + "scheduledDeparture": 41400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDYx" + } + } + ] + }, + { + "pattern": { + "desc": "68 H.E. Holmes Station", + "headsign": "H.E. Holmes Station", + "gtfsId": "MARTA:19363:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": false, + "realtimeArrival": 45600, + "realtimeDeparture": 45600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45600, + "scheduledDeparture": 45600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjA1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjA0" + } + }, + { + "arrivalDelay": -201, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": true, + "realtimeArrival": 40599, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjAz" + } + } + ] + }, + { + "pattern": { + "desc": "40 Arts Center Station", + "headsign": "Arts Center Station", + "gtfsId": "MARTA:19353:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 45300, + "realtimeDeparture": 45300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45300, + "scheduledDeparture": 45300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDY3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Arts Center Station", + "realtime": false, + "realtimeArrival": 42600, + "realtimeDeparture": 42600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42600, + "scheduledDeparture": 42600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDY2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 37, + "headsign": "Arts Center Station", + "realtime": true, + "realtimeArrival": 39900, + "realtimeDeparture": 39937, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDE3NDY1" + } + } + ] + }, + { + "pattern": { + "desc": "832 Woodland Avenue", + "headsign": "Woodland Avenue", + "gtfsId": "MARTA:19445:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Woodland Avenue", + "realtime": false, + "realtimeArrival": 48000, + "realtimeDeparture": 48000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 48000, + "scheduledDeparture": 48000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTYw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Woodland Avenue", + "realtime": false, + "realtimeArrival": 44400, + "realtimeDeparture": 44400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44400, + "scheduledDeparture": 44400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTYx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Woodland Avenue", + "realtime": true, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDU5MTYy" + } + } + ] + }, + { + "pattern": { + "desc": "71 Cascade - Kimberly Road", + "headsign": "Cascade - Kimberly Road", + "gtfsId": "MARTA:19364:1:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Kimberly Road", + "realtime": false, + "realtimeArrival": 44400, + "realtimeDeparture": 44400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44400, + "scheduledDeparture": 44400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTYx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Kimberly Road", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTYw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Kimberly Road", + "realtime": true, + "realtimeArrival": 39600, + "realtimeDeparture": 39600, + "realtimeState": "UPDATED", + "scheduledArrival": 39600, + "scheduledDeparture": 39600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTU5" + } + } + ] + }, + { + "pattern": { + "desc": "155 to West End Station (MARTA:114900) from Swallow Cir at Finch Dr (MARTA:99971007)", + "headsign": "West End Station", + "gtfsId": "MARTA:19407:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 53400, + "realtimeDeparture": 53400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 53400, + "scheduledDeparture": 53400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 48000, + "realtimeDeparture": 48000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 48000, + "scheduledDeparture": 48000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 42600, + "realtimeDeparture": 42600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42600, + "scheduledDeparture": 42600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDkz" + } + } + ] + }, + { + "pattern": { + "desc": "155 to West End Station (MARTA:114900) from Polar Rock Ter SW at Polar Rock Rd SW (MARTA:149044)", + "headsign": "West End Station", + "gtfsId": "MARTA:19407:0:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 50700, + "realtimeDeparture": 50700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 50700, + "scheduledDeparture": 50700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45300, + "realtimeDeparture": 45300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45300, + "scheduledDeparture": 45300, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDk0" + } + }, + { + "arrivalDelay": 109, + "departureDelay": 109, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40009, + "realtimeDeparture": 40009, + "realtimeState": "UPDATED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDQ1MDky" + } + } + ] + }, + { + "pattern": { + "desc": "71 Cascade - Boat Rock", + "headsign": "Cascade - Boat Rock", + "gtfsId": "MARTA:19364:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Boat Rock", + "realtime": false, + "realtimeArrival": 45600, + "realtimeDeparture": 45600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45600, + "scheduledDeparture": 45600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTQy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Boat Rock", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTQx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Cascade - Boat Rock", + "realtime": true, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "UPDATED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIzNTQw" + } + } + ] + }, + { + "pattern": { + "desc": "58 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19360:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDM3" + } + }, + { + "arrivalDelay": -74, + "departureDelay": -74, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 43126, + "realtimeDeparture": 43126, + "realtimeState": "UPDATED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDM2" + } + }, + { + "arrivalDelay": -140, + "departureDelay": -140, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 40360, + "realtimeDeparture": 40360, + "realtimeState": "UPDATED", + "scheduledArrival": 40500, + "scheduledDeparture": 40500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDM1" + } + } + ] + }, + { + "pattern": { + "desc": "58 West End Station via Lincoln Homes", + "headsign": "West End Station via Lincoln Homes", + "gtfsId": "MARTA:19360:0:02" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 24300, + "realtimeDeparture": 24300, + "realtimeState": "SCHEDULED", + "scheduledArrival": 24300, + "scheduledDeparture": 24300, + "serviceDay": 1691553600, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDI5" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 21600, + "realtimeDeparture": 21600, + "realtimeState": "SCHEDULED", + "scheduledArrival": 21600, + "scheduledDeparture": 21600, + "serviceDay": 1691553600, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDI4" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station via Lincoln Homes", + "realtime": false, + "realtimeArrival": 18900, + "realtimeDeparture": 18900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 18900, + "scheduledDeparture": 18900, + "serviceDay": 1691553600, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIxMDI3" + } + } + ] + }, + { + "pattern": { + "desc": "1 Moores Mill Center", + "headsign": "Moores Mill Center", + "gtfsId": "MARTA:19330:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Moores Mill Center", + "realtime": false, + "realtimeArrival": 44400, + "realtimeDeparture": 44400, + "realtimeState": "SCHEDULED", + "scheduledArrival": 44400, + "scheduledDeparture": 44400, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2Mjcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Moores Mill Center", + "realtime": false, + "realtimeArrival": 42000, + "realtimeDeparture": 42000, + "realtimeState": "SCHEDULED", + "scheduledArrival": 42000, + "scheduledDeparture": 42000, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2Mjcy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Moores Mill Center", + "realtime": true, + "realtimeArrival": 39600, + "realtimeDeparture": 39600, + "realtimeState": "UPDATED", + "scheduledArrival": 39600, + "scheduledDeparture": 39600, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDA2Mjcx" + } + } + ] + }, + { + "pattern": { + "desc": "81 East Point Station", + "headsign": "East Point Station", + "gtfsId": "MARTA:19370:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": false, + "realtimeArrival": 45900, + "realtimeDeparture": 45900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45900, + "scheduledDeparture": 45900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": false, + "realtimeArrival": 43200, + "realtimeDeparture": 43200, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43200, + "scheduledDeparture": 43200, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": true, + "realtimeArrival": 40500, + "realtimeDeparture": 40500, + "realtimeState": "UPDATED", + "scheduledArrival": 40500, + "scheduledDeparture": 40500, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114900" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA1" + } + } + ] + } + ] + } + } + }, + { + "node": { + "stop": { + "gtfsId": "MARTA:220", + "code": "908705", + "lat": 33.735705, + "lon": -84.413663, + "locationType": "STOP", + "name": "West End Station", + "wheelchairBoarding": "POSSIBLE", + "zoneId": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4137, + 33.7357 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19456", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Gold", + "mode": "SUBWAY", + "color": "D4A723", + "textColor": "000000", + "shortName": "Gold" + }, + { + "gtfsId": "MARTA:19458", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Red", + "mode": "SUBWAY", + "color": "CE242B", + "textColor": "000000", + "shortName": "Red" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "Gold AIRPORT STATION", + "headsign": "AIRPORT STATION", + "gtfsId": "MARTA:19456:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "AIRPORT STATION", + "realtime": false, + "realtimeArrival": 40920, + "realtimeDeparture": 40920, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40920, + "scheduledDeparture": 40920, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:220" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY0NTU3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "AIRPORT STATION", + "realtime": false, + "realtimeArrival": 40020, + "realtimeDeparture": 40020, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40020, + "scheduledDeparture": 40020, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:220" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY0NTU2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "AIRPORT STATION", + "realtime": false, + "realtimeArrival": 39120, + "realtimeDeparture": 39120, + "realtimeState": "SCHEDULED", + "scheduledArrival": 39120, + "scheduledDeparture": 39120, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:220" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY0NTU1" + } + } + ] + }, + { + "pattern": { + "desc": "Red AIRPORT STATION", + "headsign": "AIRPORT STATION", + "gtfsId": "MARTA:19458:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "AIRPORT STATION", + "realtime": false, + "realtimeArrival": 41340, + "realtimeDeparture": 41340, + "realtimeState": "SCHEDULED", + "scheduledArrival": 41340, + "scheduledDeparture": 41340, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:220" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY2ODUx" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "AIRPORT STATION", + "realtime": false, + "realtimeArrival": 40440, + "realtimeDeparture": 40440, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40440, + "scheduledDeparture": 40440, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:220" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY2ODUw" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "AIRPORT STATION", + "realtime": false, + "realtimeArrival": 39540, + "realtimeDeparture": 39540, + "realtimeState": "SCHEDULED", + "scheduledArrival": 39540, + "scheduledDeparture": 39540, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:220" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY2ODQ5" + } + } + ] + } + ] + } + } + }, + { + "node": { + "stop": { + "gtfsId": "MARTA:219", + "code": "908704", + "lat": 33.736564, + "lon": -84.413653, + "locationType": "STOP", + "name": "West End Station", + "wheelchairBoarding": "POSSIBLE", + "zoneId": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4137, + 33.7366 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19456", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Gold", + "mode": "SUBWAY", + "color": "D4A723", + "textColor": "000000", + "shortName": "Gold" + }, + { + "gtfsId": "MARTA:19458", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Red", + "mode": "SUBWAY", + "color": "CE242B", + "textColor": "000000", + "shortName": "Red" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "Gold DORAVILLE STATION", + "headsign": "DORAVILLE STATION", + "gtfsId": "MARTA:19456:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "DORAVILLE STATION", + "realtime": false, + "realtimeArrival": 41220, + "realtimeDeparture": 41220, + "realtimeState": "SCHEDULED", + "scheduledArrival": 41220, + "scheduledDeparture": 41220, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:219" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY0NDgz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "DORAVILLE STATION", + "realtime": false, + "realtimeArrival": 40320, + "realtimeDeparture": 40320, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40320, + "scheduledDeparture": 40320, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:219" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY0NDgy" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "DORAVILLE STATION", + "realtime": false, + "realtimeArrival": 39420, + "realtimeDeparture": 39420, + "realtimeState": "SCHEDULED", + "scheduledArrival": 39420, + "scheduledDeparture": 39420, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:219" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY0NDgx" + } + } + ] + }, + { + "pattern": { + "desc": "Red to North Springs Station (MARTA:999544) from Airport Station (MARTA:808)", + "headsign": "NORTH SPRINGS STATION", + "gtfsId": "MARTA:19458:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "NORTH SPRINGS STATION", + "realtime": false, + "realtimeArrival": 41700, + "realtimeDeparture": 41700, + "realtimeState": "SCHEDULED", + "scheduledArrival": 41700, + "scheduledDeparture": 41700, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:219" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY2Nzc3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "NORTH SPRINGS STATION", + "realtime": false, + "realtimeArrival": 40800, + "realtimeDeparture": 40800, + "realtimeState": "SCHEDULED", + "scheduledArrival": 40800, + "scheduledDeparture": 40800, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:219" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY2Nzc2" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "NORTH SPRINGS STATION", + "realtime": false, + "realtimeArrival": 39900, + "realtimeDeparture": 39900, + "realtimeState": "SCHEDULED", + "scheduledArrival": 39900, + "scheduledDeparture": 39900, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:219" + }, + "timepoint": true, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDY2Nzc1" + } + } + ] + } + ] + } + } + }, + { + "node": { + "stop": { + "gtfsId": "MARTA:99971737", + "code": "211322", + "lat": 33.73591, + "lon": -84.414967, + "locationType": "STOP", + "name": "Oglethrope Ave SW at Evans St SW", + "wheelchairBoarding": "POSSIBLE", + "zoneId": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.415, + 33.7359 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19363", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Benjamin E Mays Drive", + "mode": "BUS", + "color": "FF0000", + "textColor": "000000", + "shortName": "68" + }, + { + "gtfsId": "MARTA:19370", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Venetian Hills / Delowe Drive", + "mode": "BUS", + "color": "00FF00", + "textColor": "000000", + "shortName": "81" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "68 H.E. Holmes Station", + "headsign": "H.E. Holmes Station", + "gtfsId": "MARTA:19363:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": false, + "realtimeArrival": 45643, + "realtimeDeparture": 45643, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45643, + "scheduledDeparture": 45643, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:99971737" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjA1" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "H.E. Holmes Station", + "realtime": false, + "realtimeArrival": 43243, + "realtimeDeparture": 43243, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43243, + "scheduledDeparture": 43243, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:99971737" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjA0" + } + }, + { + "arrivalDelay": 140, + "departureDelay": 140, + "headsign": "H.E. Holmes Station", + "realtime": true, + "realtimeArrival": 40983, + "realtimeDeparture": 40983, + "realtimeState": "UPDATED", + "scheduledArrival": 40843, + "scheduledDeparture": 40843, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:99971737" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNjAz" + } + } + ] + }, + { + "pattern": { + "desc": "81 East Point Station", + "headsign": "East Point Station", + "gtfsId": "MARTA:19370:1:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": false, + "realtimeArrival": 45970, + "realtimeDeparture": 45970, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45970, + "scheduledDeparture": 45970, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:99971737" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA3" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "East Point Station", + "realtime": false, + "realtimeArrival": 43270, + "realtimeDeparture": 43270, + "realtimeState": "SCHEDULED", + "scheduledArrival": 43270, + "scheduledDeparture": 43270, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:99971737" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA2" + } + }, + { + "arrivalDelay": 52, + "departureDelay": 52, + "headsign": "East Point Station", + "realtime": true, + "realtimeArrival": 40622, + "realtimeDeparture": 40622, + "realtimeState": "UPDATED", + "scheduledArrival": 40570, + "scheduledDeparture": 40570, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:99971737" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MTA1" + } + } + ] + } + ] + } + } + }, + { + "node": { + "stop": { + "gtfsId": "MARTA:114152", + "code": "114152", + "lat": 33.735793, + "lon": -84.415206, + "locationType": "STOP", + "name": "Oglethorpe Ave SW at Evans St SW", + "wheelchairBoarding": "POSSIBLE", + "zoneId": null, + "geometries": { + "geoJson": { + "type": "Point", + "coordinates": [ + -84.4152, + 33.7358 + ] + } + }, + "routes": [ + { + "gtfsId": "MARTA:19363", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Benjamin E Mays Drive", + "mode": "BUS", + "color": "FF0000", + "textColor": "000000", + "shortName": "68" + }, + { + "gtfsId": "MARTA:19370", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority" + }, + "longName": "Venetian Hills / Delowe Drive", + "mode": "BUS", + "color": "00FF00", + "textColor": "000000", + "shortName": "81" + } + ], + "stopTimes": [ + { + "pattern": { + "desc": "68 Ashby Station", + "headsign": "Ashby Station", + "gtfsId": "MARTA:19363:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Ashby Station", + "realtime": false, + "realtimeArrival": 45834, + "realtimeDeparture": 45834, + "realtimeState": "SCHEDULED", + "scheduledArrival": 45834, + "scheduledDeparture": 45834, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114152" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTc0" + } + }, + { + "arrivalDelay": 100, + "departureDelay": 100, + "headsign": "Ashby Station", + "realtime": true, + "realtimeArrival": 43534, + "realtimeDeparture": 43534, + "realtimeState": "UPDATED", + "scheduledArrival": 43434, + "scheduledDeparture": 43434, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114152" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTcz" + } + }, + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "Ashby Station", + "realtime": false, + "realtimeArrival": 41034, + "realtimeDeparture": 41034, + "realtimeState": "SCHEDULED", + "scheduledArrival": 41034, + "scheduledDeparture": 41034, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114152" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDIyNTcy" + } + } + ] + }, + { + "pattern": { + "desc": "81 West End Station", + "headsign": "West End Station", + "gtfsId": "MARTA:19370:0:01" + }, + "times": [ + { + "arrivalDelay": 0, + "departureDelay": 0, + "headsign": "West End Station", + "realtime": false, + "realtimeArrival": 46710, + "realtimeDeparture": 46710, + "realtimeState": "SCHEDULED", + "scheduledArrival": 46710, + "scheduledDeparture": 46710, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114152" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc5" + } + }, + { + "arrivalDelay": 62, + "departureDelay": 62, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 44072, + "realtimeDeparture": 44072, + "realtimeState": "UPDATED", + "scheduledArrival": 44010, + "scheduledDeparture": 44010, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114152" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc4" + } + }, + { + "arrivalDelay": 30, + "departureDelay": 30, + "headsign": "West End Station", + "realtime": true, + "realtimeArrival": 41340, + "realtimeDeparture": 41340, + "realtimeState": "UPDATED", + "scheduledArrival": 41310, + "scheduledDeparture": 41310, + "serviceDay": 1691467200, + "stop": { + "gtfsId": "MARTA:114152" + }, + "timepoint": false, + "trip": { + "gtfsId": "VHJpcDpNQVJUQTo4MDI3MDc3" + } + } + ] + } + ] + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/percy/mocks/TripResponse.json b/percy/mocks/TripResponse.json new file mode 100644 index 000000000..ae49b9134 --- /dev/null +++ b/percy/mocks/TripResponse.json @@ -0,0 +1,161 @@ +{ + "data": { + "trip": { + "gtfsId": "MARTA:8063444", + "route": { + "gtfsId": "MARTA:19455", + "agency": { + "gtfsId": "MARTA:MARTA", + "name": "Metropolitan Atlanta Rapid Transit Authority", + "url": "https://www.itsmarta.com", + "timezone": "America/New_York", + "lang": "en", + "phone": "404-848-5000", + "fareUrl": "https://www.itsmarta.com/fare-programs.aspx" + }, + "shortName": "Blue", + "longName": "Blue", + "type": 1, + "url": "https://itsmarta.com/Blue-Line.aspx", + "color": "0075B2", + "textColor": "000000", + "routeBikesAllowed": "NO_INFORMATION", + "bikesAllowed": "NO_INFORMATION" + }, + "serviceId": "MARTA:5", + "tripHeadsign": "H E HOLMES STATION", + "directionId": "1", + "blockId": "1111469", + "shapeId": "MARTA:109181", + "wheelchairAccessible": "POSSIBLE", + "bikesAllowed": "NO_INFORMATION", + "tripBikesAllowed": "NO_INFORMATION", + "stops": [ + { + "gtfsId": "MARTA:802", + "stopId": "MARTA:802", + "code": "908516", + "name": "Indian Creek Station", + "lat": 33.769893, + "lon": -84.229874 + }, + { + "gtfsId": "MARTA:224", + "stopId": "MARTA:224", + "code": "908709", + "name": "Kensington Station", + "lat": 33.772764, + "lon": -84.252151 + }, + { + "gtfsId": "MARTA:803", + "stopId": "MARTA:803", + "code": "908691", + "name": "Avondale Station", + "lat": 33.775214, + "lon": -84.282466 + }, + { + "gtfsId": "MARTA:193", + "stopId": "MARTA:193", + "code": "908475", + "name": "Decatur Station", + "lat": 33.774699, + "lon": -84.295417 + }, + { + "gtfsId": "MARTA:186", + "stopId": "MARTA:186", + "code": "908567", + "name": "East Lake Station", + "lat": 33.765196, + "lon": -84.313426 + }, + { + "gtfsId": "MARTA:195", + "stopId": "MARTA:195", + "code": "908476", + "name": "Edgewood-Candler Park Station", + "lat": 33.761803, + "lon": -84.340825 + }, + { + "gtfsId": "MARTA:804", + "stopId": "MARTA:804", + "code": "908692", + "name": "Inman Park-Reynoldstown Station", + "lat": 33.757227, + "lon": -84.353066 + }, + { + "gtfsId": "MARTA:805", + "stopId": "MARTA:805", + "code": "908693", + "name": "King Memorial Station", + "lat": 33.749853, + "lon": -84.37599 + }, + { + "gtfsId": "MARTA:198", + "stopId": "MARTA:198", + "code": "908618", + "name": "Georgia State Station", + "lat": 33.750161, + "lon": -84.385915 + }, + { + "gtfsId": "MARTA:806", + "stopId": "MARTA:806", + "code": "908990", + "name": "Five Points Station", + "lat": 33.754123, + "lon": -84.391876 + }, + { + "gtfsId": "MARTA:807", + "stopId": "MARTA:807", + "code": "908694", + "name": "Gwcc-Cnn Center Station", + "lat": 33.756187, + "lon": -84.397291 + }, + { + "gtfsId": "MARTA:471", + "stopId": "MARTA:471", + "code": "908959", + "name": "Vine City Station", + "lat": 33.756613, + "lon": -84.404021 + }, + { + "gtfsId": "MARTA:486", + "stopId": "MARTA:486", + "code": "908964", + "name": "Ashby Station", + "lat": 33.756477, + "lon": -84.417328 + }, + { + "gtfsId": "MARTA:39", + "stopId": "MARTA:39", + "code": "907906", + "name": "West Lake Station", + "lat": 33.753247, + "lon": -84.445568 + }, + { + "gtfsId": "MARTA:40", + "stopId": "MARTA:40", + "code": "907907", + "name": "Hamilton E Holmes Station", + "lat": 33.754517, + "lon": -84.469824 + } + ], + "tripGeometry": { + "length": 18784, + "points": "ytbmEvcbaO?TA`AA`AA`AA`AA`AA`A?^?TA`AA`AA`AA~@?F???@???@?@?@?@???@?@?@?@A@???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@????A@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@A??@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@???@?@AFAVE`AE`AE`AG~@E`AE`AE~@E`AE`AE~@G`AE`AE~@E`AE`AE~@???@??A@?@?@?@???@?@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@???@?@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@A@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@A@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@A@???@?@?@?@???@A@?@?@?@???@?@?@?@??A@?@?@?@???@?@?@A@???@?@?@?@?@??A@?@?@?@???@?@?@?@A??@?@?@?@?@???@A@?@?@???@?@?@?@A??@?@?@?@???@?@A@?@???@?@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@?@A??@?@?@?@???@A@?@?@?@???@?@A@?@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@A@?@???@?@?@A@???@?@?@?@???@A@?@?@???@A@?@?@???@?@?@A@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@???@?@A@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@?@???@A@?@???@?@A@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@???@A@?@?@???@?@A@?@???@A@?@?@???@?@A@AFKt@M~@O~@M~@O|@M~@M~@??O|@???@?@???@A@?@?@???@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@???@A@?@?@???@A@?@?@???@?@A@?@???@?@A@?@???@?@???@A@???@?@?@A@???@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@?@A@???@?@?@?@A??@?@?@?@???@A@?@?@??AN??A??@?@?@?@A??@?@?@?@???@A@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A@???@?@Il@YjCIr@K`AK~@K~@Gd@CXK~@K~@K~@M~@K~@K~@K~@?BK~@K~@K~@M~@K~@K~@K`ACV?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@A@?@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@?@???@A@?@?@???@A@?@???@?@?@A@???@?@?@A@???@?@?@A@???@?@?@A??@?@?@?@A??@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@A??@?@???@??A@?@?@?@A??@?@?@A??@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@A@?@???@A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@A@???@?@A@???@A@???@A@?@???@A@?@??A@?@?@A??@?@?@A??@?@A@???@A@???@?@A@??A@?@?@A??@?@??A@?@?@A??@?@A@???@A@???@A@?@??A@?@??A@?@A@???@A@???@A@???@A@?@??A@?@??A@?@?@A??@A@???@A@???@A@?@A??@?@A??@?@A??@A@???@A@???@A@?@A??@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@??A@?@??A@?@A??@?@A??@A??@?@A??@A@??A@?@A??@?@A??@A??@A@???@A@??A@?@A??@A??@?@A??@A@??A@??A@?@A??@?@A??@A??@A@??A@??A@?@??A@??A@?@A??@A??@A@??A@???@A@A??@??A@?@A??@A??@A@????A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@?@A?A@???@A?A@?@A??@A??@A??@A??@A@??A@??A@??A@??A@?@A??@A??@A??@A??@A??@A@??A@??A@??A@??A@A??@A??@A@??A@??A@??A@??A@??A@??A@??A@?@A?A@??A@??A@??A@??A@??A@??A@??A@??A@A??@A@??A@??A@??A@??A@??A@??A@A??@A??@A??@A??@A??@A??@A??@A?A@?@A??@A??@A??@A??@A??@A?A@??A@??A@??A@??A@??A@??A@A??@??A?i@h@k@f@i@h@k@f@YX??A@??A@A??@A??@A??@A??@A??@A??@A?A@??A@??A@??A@??A@?@A??@A?A@??A@??A@??A@??A@??A@??A@??A@A??@A??@A??@A??@A??@A??@A?A@?@A??@A??@A??@A??@A??@A??@A?A@??A@??A@??A@??A@??A@?@A??@A??@A?A@??A@??A@??A@??A@??A@?@A??@A??@A??@A?A@??A@??A@??A@??A@?@A??@A??@A??@A??@A??@A@??A@??A@A??@??A@A??@A??@A@??A@??A@??A@??A@?@A??@A??@A??@A??@A@??A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@???@A?ABIJA@?@A??@??A@?@A??@A??@A@??A@??A@?@A??@??A@?@A??@A??@A@???@A@??A@??A@?@A??@A??@A@???@A@??A@?@A??@??A@?@A??@A@??A@???@A@??A@?@A??@?@A??@A??@A@??A@?@??A@?@A??@A@???@A@??A@???@A@??A@?@??A@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@?@A??@?@A??@A@???@A@??A@?@??A@?@??A@?@A@???@A@???@A@???@A@?@A??@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@?@A??@?@A??@?@A@???@A??@?@A??@?@A@???@A@???@A@?@??A@?@??A@?@?@A??@?@A??@?@A@???@A@?@??A@?@???@A@?@??A@?@?@A??@?@A@???@A@???@?@A@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@A@?@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@?@A@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@???@A@?@?@??A@?@?@???@A@?@?@???@A@?@???@A@?@?@???@A@?@?@???@A@?@???@A@?@?@???@?@A@?@???@?@A@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@A@???@?@?@?@??A@?@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@A@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@???@@@?@?@??@@?@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@?@??@@?@?@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@@@???@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@??@@?@?@???@@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@?@@@???@@@?@???@@@?@???@@@?@???@@@?@?@??@@?@?@@??@?@?@@?DVTz@R|@Tz@HZ?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@??@@?@?@???@@@?@???@@@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@?@@@???@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@?@@@?@???@@@?@???@?@@??@?@???@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?B???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@?@@??@Bb@F|@@@?@???@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@??@@?@???@?@???@?@?@?@@@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@?@@@???@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@?@???@@@???@@@?@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@@@?@?????@@@???@@@?@??@@?@?@@??@?@@@???@@@???@?@@@??@@?@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@@@?@???@@@???@Vp@Zv@Vt@??@@?@??@@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@???@@??@?@@??@?@@@???@@@???@?@@@???@@@?@@??@?@??@@?@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@?@@??@?@@@???@?@@??@?@@@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@@@?@???@@@?@???@@@?@???@@@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@@@?@???@?@@@?@??Pt@@B^|A@BTz@R|@Rx@@@R|@Tz@R|@Rz@Tz@J`@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@@@???@?@?@@??@?@?@@??@?@?@@@???@?@@@?@???@@@?@???@?@@@?@???@@@?@???@?@@@?@???@@@?@???@?@@@?@???@@@?@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@?????@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?D???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@??Cj@E~@?BG|@En@??A@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@A@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@A@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@A??@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@???@?@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???L???FA`AA`AA`AA`AA`AA~@A`AA`A?D?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???H???@?@?@?@???@?@?@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?l@A`A?`A?z@?D?`AA`A?`A?~@A`A?J???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@@@???@?@@??@@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@???@@@??@@?@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@???@@@??@@?@@??@??@@?@@??@@@??@@???@@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@@??@@??@@?@@??@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@???@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@??@@@??@??@@??@@@??@@@??@@??@@??@@??@@??@@??@@?@@??@@??@@?@@??@@??@@??@@??@@??@@??@@??@@@??@@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@?@@??@@??@@??@@??@@??@@@???@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@?@@??@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@?@@??@??@@??@@?@@??@@??@?@@??@@??@@??@?@@??@@??@@@???@@??@@??@@@???@@??@@@??@@???@@@??@@???@@??@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@???@@@???@@??@@@???@@@???@@??@@@???@@??@?@@??@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@???@@@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@???@@@???@@??@?@@??@?@??@@???@@@???@@@???@@@???@@??@?@@??@?@@??@??@@?@??@@?@??@@?@??@@?@??@@???@??@XJr@Xp@Xp@Xp@Xr@Xn@V@@??@??@@?@??@@?@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@?@@??@?@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@@???@@??@?@@??@??@@?@??@@?@??@@???@@@???@@@???@@??@@@???@@@???@@??@?@@??@??@@?@@??@?@@??@??@@?@??@@??@@?@??@@?@??@@??@@?@??@@???@@@??@@???@@@??@@?@??@@???@@@??@@???@@@??@@???@@@??@@???@@@??@@??@@???@@@??@@???@??@@??@@??@@?@??@@??@@??@@?@??@@??@@?@@??@@??@??@@?@@??@@??@@??@?@@??@@??@@??@@@??@@??@@???@@@??@@??@@??@@??@@?@@??@@??@@??FF@??@@??@@?@@??@@??@@??@@??@@??@@??@@@??@@??@@??@@??@@??@@??@@?@@DF@??@@??@@??@@??@@??@@@??@@??@@??@@??@@?@@??@@??@@??@@?@@?@@??@@??@@??@@??@?@@??@@??@@??@@@??@@??@@?@@??@@??@@??@@@??@@??@@?@@??@@??@@@??@@???@@@??@@??@@?@@??@@??@@@???@@??@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@??@@?@??@@??@@?@??@@?@??@??@@@???@@@??@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@?@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@?@??@@?@@??@?@@??@?@@??@@@?@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@???@@??@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@???@??@@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@@@?@???@@@?@??@@?@???@@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@???@?@@@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@Dx@B~@F`AD`AD`AD~@D`ABh@@VD~@Bt@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@?????@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@??@B?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@??@?@?@@??@?@@@???@@@?@????@@?@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@???@@@???@@@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@?@??@@?@@??@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@@@???@@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@???@Zn@^r@^t@^t@^t@^t@^t@t@^t@^t@^t@^r@t@^t@LVXh@LV?@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@??@@?@??@@?@??@@?@@??@?@@??@?@@??@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@??@@?@@@???@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@??@@@???@@@?@??@@?@??@@?@?@@??@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@BF?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@A@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@A@???@?@?@?@???@A@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@?@A@?@???@?@A@?@???@?@A@???@?@?@A@???@?@???@A@???@?@A@???@?@?@A@???@?@A@???@?@?@A@???@?@?@A??@?@?@A@???@?@A@???@?@A@?@???@?@A@???@?@A@???@?@A@?@???@A@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@?@A??@?@A@???@?@A@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@Oh@Uz@Wz@Ux@Wz@Uz@EL?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@A@?@???@A@?@???@A@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@A@???@?@A@???@?@A@???@?@A@?@???@?@A@???@A@?@???@?@A@???@A@?@?@??A@?@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@??A@?@?@?@??A@?@?@?@???@A@?@???@A@?@?@???@?@A@?@???@A@?@???@???@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@?@?@A@???@?@?@?@???@A@?@?@???@?@?@?@A??@?@?@?@?@???@?@A@?@???@?@?@?@???@?@?@A@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@???@?@A@?@?@???@?@?@?@???@?@?@?@?@???@?@?@A@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@@@???@?@?@?@???@?@?@?@???@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@???@?@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@Fd@H~@H`AH~@H~@H`AH~@J~@B`@BX?@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@J~@J~@@D?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@@@???@?@?@Fr@H~@H~@Ff@???@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@?????@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@?@???@?@@@?@???@@@?@???@?@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@???@@@?@???@@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@?@???@@@?@??@@?@?@@??@?@?@@??@?@@@???@?@@@???@@@???@@@?@???@@@?@??@@?@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@?@??@@?@??@@?@?@@??@?@@@???@@@???@@@?@??@@?@?@@??@?@@??@?@@@???@@@???@?@@@???@@@?@??@@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@???@@@???@@@?@@??@?@@??@?@@@???@@@???@@@??@@?@?@@??@?@@??@@@???@@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@??@@?@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@??@@?@@??@?@@??@@@???@@@??@@?@??@@?@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@??@@?@??@@?@@??@?@@??@@@???@@??@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@@??@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@??@@???@@@??@@?@@??@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@??@@@??@@?@??@@??@@?@@??@@@@@???@@@??@@?@@??@@??@@@???@@??@@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@??@@?@@??@@??@?@@??@@??@@@??@@TZd@n@b@p@d@n@d@n@b@n@d@n@HLZ`@b@n@d@p@d@n@@B@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@@??@??@@?@@??@@??@@@??@@??@@?@@??@??@@?@@??@@@??@@??@@?@??@@??@@?@@??@@??@@@??@@?@??@@??@@?@@??@@??@@@???@@@??@@??@@?@@??@@??@?@@??@@@??@@??@@?@??@@?@@??@@??@@@???@@@??@@??@@?@@??@?@@??@@@??@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@??@@@?@@@??@@?@??@@?@@??@@@???@@??@@@??@@?@??@@?@@??@@@???@@@???@@@??@@?@@??@?@@??@@@???@@@??@@?@@??@?@@??@?@@??@@@???@@@??@@?@??@@?@@??@?@@??@@@???@@@???@@@??@@?@??@@?@@??@?@@@???@@@??@@?@??@@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@??@@?@@@???@@@???@@@??@@?@?@@??@?@@??@?@@??@?@@@??@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@??@@?@?@@??@?@@??@?@@@???@@@???@@@?@??@@?@??@@?@?@@??@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@@@???@?@@??@?@@@???@@@?@??@@?@???@@@?@??@@?@?@@??@?@@@???@@@?@???@@@???@@@?@???@@@?@??@@?@?@??@@?@?@@??@?@@@???@?@??@@???@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@@??@?@?@@??@?@@@???@?@@@???@?@@@?@??@@?@?@???@@@?@???@@@?@???@@@?@?@@??@?@?@@??@?@?@??@@?@?@@??@?@?@?@@??@?@@@???@?@?@@??@?@?@@@???@?@?@@??@?@?@@@???@?@??@@???@?@?@@@???@?@@@???@?@?@@@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@?@@@???@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??Hv@H~@H~@J`AH~@BZ??@@?@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@???@@@?@?@???@?@@@?@???@@@?@?@???@?@@@?@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@???@@@?@?@??@@?@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@??@?@?@@@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@@??@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@???@@@?@?@??@@?@?@?@???@@@?@???@@B?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@?@@??@?@@@???@?@?@@@???@?@@@???@HP|@Rz@R|@P|@R|@R|@P|@Rz@P|@R|@R|@P|@Rz@R|@P|@R|@P|@Rz@R|@P|@R|@R|@Pz@R|@Nt@BFP|@R|@P|@DJ?@???@@@?@???@?@@@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@???@@@?@?@??@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@?@@??@?@?@@@???@?@?@@??@?@?@?@@??@?@?@???@@??@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@??@B`A@`AB`AB`A@`ABl@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@???@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@???@A@?@?@?@???@?@?@?@???@?@?@A@?@???@?@?@?@??A@?@?@?@???@?@?@?@A@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@??A@?@?@?@??A@?@?@???@?@A@?@???@A@?@?@???@A@?@???@A@?@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@A@???@?@A@???@A@???@?@A@???@A@?@??A@?@?@A??@?@?@A??@?@A??@?@A@???@A@???@A@?@??A@?@??A@?@A@???@A@???@A@?@??A@?@??A@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@A@???@A@??A@?@??A@??A@?@A??@?@A??@A@??A@?@A??@??A@?@A??@?@A??@A??@A@??A@?@A??@?@A??@A??@A@??A@?@??A@??A@??A@c@p@c@p@a@p@CD_@j@c@p@c@p@c@p@c@r@A@??A@?@A??@??A@?@A??@A@???@A??@A@??A@?@A??@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@A??@?@A??@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@???@A@?@A??@?@A??@A@???@CDYn@A??@?@A@??A@?@??A@?@A??@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@A??@?@A??@A@???@A@??]n@QX???@A@??A@?@??A@?@A??@A@??A@?@??A@?@A??@??A@?@A??@A@???@A@??A@?@??A@?@A??@??A??@A@???@A@??A@?@A??@??A@?@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A??@A@??A@??A@?@A??@A@??A@??A@?@??A@??A@?@A??@A??@A??@A@??A@??A@?@A??@A??@A@??A@???@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@A@??A@??A@??A@?@A??@A??@A??@?@A?A@???@A??@??A@??A@?@A??@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@??A@??A@?@??A@?@A??@A??@A@???@A@??A@??A@?@A??@?@A??@A??@?@A??@A@??A@?@A??@?@A??@A@??A@???@A@??A@?@??A@?@??A??@?@A??@ABA@??A@?@??A@?@A??@?@A@??A@?@??A@?@??A@?@A??@A@???@A@???@A?GN_@t@]t@_@t@_@t@ELWh@_@t@]t@_@t@_@t@]t@_@t@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@A??@?@A??@A@???@A@??A@?@??A@?@A??@?@A@???@A@??A@?@??A@?@A??@?@A??@?@A@??A@?@??A@?@??A@?@??A@?@A@???@A@???@A@???@A@?@A??@?@A??@?@A??@?@A@?????@A@???@A@?@??A@?@??A@?@?@A??@?@A??@?@A@???@A@?@??A@?@??A@?@?@A??@?@?@A??@?@A@???@A@?@??A@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@A@???@?@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@?@???@A@?@?@???@A@?@?@???@A@?@???@?@?@?@A??@?@?@?@A??@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@?@??A@?@?@?@???@?@A@?@???@?@?@?@??A@?@?@??Gz@I~@I`AEf@CVI~@I`AI~@I~@G`AI~@I`AE???@?@???@?@?@?@A??@?@?@?@?@???@A@?@?@???@?@?@?@??A@?@?@?@???@?@?@A@?@???@?@?@?@???@A@?@?@???@?@?@?@?@A??@?@?@?@???@?@?@?@A??@?@?@?@?@???@???@?@A@???@?@?@?@???@?@?@?@?@A??@?@?@?@???@?@?@?@?@A??@?@?@?@???@?@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@?????@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@@j@@`AB`A@`A@`AB`A?L@r@B~@@`AB`A?D???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@???@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@?@???@?@?@@@???@?@???@???@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@?@?@@@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@A~@A`AA`AA~@A`AA`A?`AA`AA`AA`AA`AA`AA~@?`AA`AA`AAt@?JA`AA`AA`A?|@?BA~@A`AA`AA`AA`AA`A?`AA`AA~@A`A?T?@?@?@???@?@?@A@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@?B?@?@???@?@?@?@?@???@?@?@?@A@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@???@@@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@@@?@?@???@?@?@?@?@???@?@?@@@???@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@@@?@???@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@???@?@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@?@@??@?@?@?@???@@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@@@?@?@???@?@?@@@???B???@@@???@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@@@?@???@?@?@?@@??@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@@??@?@?@?@?@???@@B???@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@?@@??@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@@@?@???@?@?@?@???@@@?@?@?@???@?@?@?@??@@?@?@?@???@?@?@?@?@@??@?@?@?@???@?@?@@@???@?@?@?@?@???@?@@@?@???@?@?@?@???@?@@@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@???@@@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@@B?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@@??@?@?@?@???@?@?@?@@@???@?@?@?@???@?@?@@@?@???@?@?@?@???@?@@@???@???@?@?@?@?@??@@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@@@???@?@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@???@@@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@@@???@?@?@?@???@?@@@?@?@???@?@?@?@@??@?@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@@??@?@?@?@???@?@@@?@?@???@?@?@?@??@@?@?@?@???@?@?@@@?@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@?@?@@@?@???@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@?@??@@?@?@?@???@?@?@@@???@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@???@@@?@?@?@???@?@?@@@???@?@???@?@??@@?@?@?@???@?@?@@@???@?@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@?@@@?@???@?@?@?@@@???@?@?@??BVH~@J~@H`AJ~@H~@H~@J`AH~@Db@?@??@@?@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@?@@??@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@??@@?@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@???@?@@@?@???@?@@@?@???@?@@@?@???@?@?@@@???@?@?@@??@?@?@?@@??@?@?@?@??@@?@?@?@??@@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@?@@??@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@@@?@???@?@@@???@@@?@???@?@@@???@?@@@?@???@@@?@???@@@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@@@?@???@@@?@???@@@?@???@@@?@???@@@?@??@FTz@Rz@R|@Tz@Lf@DTTz@Rz@T|@Rz@R|@Tz@R|@Tz@R|@Rz@Tz@R|@HX?@??@@?@?@??@@?@?@??@@?@?@@??@?@?@??@@?@?@@@???@?@@@???@?@@@???@?@@@???@?@@@???@?@@@?@???@@@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@@??@?@?@@??@?@?@@??@?@?@@??@?@?@@@???@?@@@???@?@@@???@@@?@???@?@@@?@??@@?@?@??@@?@?@??@@?@?@??@@?@?@?@??@@?@?@??@@?@?@??@@?@?@@@???@?@?@@??@?@?@@??@?@?@@@???@?@@@???@?@@@???@?@@@?@???@?@@@???@?@@@???@?@@@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@???@@@?@???@@@?@?@??@@?@?@???@@@?@?@??@@?@?@???@@@?@?@???@@@?@???@?@@@?@???@?@@@?@???@@@?@???@?@@@?@???@?@@@???@?@?@@@???@?@?@@@???@?@?@@@???@?@?@??@@?@?@?@??@@?@?@?@??@@?@?@?@???@@@?@?@???@@@?@???@?@?@@@???@?@?@@@???@?@?@?@@??@?@?@?@??@@?@?@?@???@@@?@?@???@?@?@@@???@?@?@?@@??@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@@??@?@?@?@?@???@@@?@?@???@?@@@?@???@?@?@?@???@@@?@?@???@?@?@?@@@???@?@?@?@???@?@@@?@???@?@?@?@?@??@B???@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@@@?@?@?@???@?@?@?@???@?@@@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@?@???@?@?@?@@??@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@?@?@??A@?@?@?@???B?@?@?@???@?@?@?@A@???@?@?@?@???@?@?@?@?@A??@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@A??@?@?@?@?@???@?@?@A@???@?D???@A@?@?@???@?@?@?@?@A??@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@?@???@?@A@?@???@?@?@?@A??@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@?@???@A@?@?@???@A@?@???@?@A@?@???@?@?@A@???@?@?@A@???@?@?@?@A??@?@?@?@A??@?@?@??A@?@?@?@??A@?@?@?@???@A@?@???@A@?@?@???@?@A@?@???@A@?@???@?@A@?@???@?@A@?@???@A@?@???@?@A@?@???@?@A@???@?@?@A@???@?@A@???@?@?@A@???@?@A@???@?@A@?@???@A@?@???@?@A@?@???@A@?@???@A@?@?@???@A@?@???@A@?@???@?@A@?@??A@?@?@??A@?@?@???@A@?@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@?@A??@?@?@A??@?@?@A??@?@?@A@???@?@A@???@?@A@???@?@A@???@?@A@?@??A@?@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@?@A??@?@?@A??@?@A@???@?@A@???@?@A@???@?@A@?@???@A@?@??A@?@?@???@A@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@?@A@???@?@A@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@??ADA@???@?@A@??Sv@U|@Uz@Sz@Uz@U|@Uz@Sz@Uz@U|@Uz@Sz@U|@Uz@Uz@Uz@S|@Uz@Uz@ER??A@???@?@A@?@??A@?@?@??A@?@?@??A@?@?@??A@?@?@A??@?@?@A??@?@?@A??@?@?@A??@?@A@?@???@A@?@???@A@?@???@A@?@??A@?@?@??A@?@?@??A@?@?@?@A??@?@?@A??@?@?@A??@?@?@A??@?@?@A??@?@?@A@???@A@?@???@?@A@???@?@A@?@???@A@?@???@A@?@???@A@?@?@??A@?@?@??A@?@?@???@A@?@?@??A@?@?@??A@?@?@?@??A@?@?@???@A@?@?@??A@???B???@A@?@?@??A@?@?@?@??A@?B?????@A@?@?@???@A@?@?@???@A@?@???@?@A@?@???@?@A@?@???@?@?@A@???@?@?@?@A??@?@?@??A@?@?@?@???@A@?@?@???@?@A@?@???@?@?@A@???@?@?@?@??A@?@?@?@???@?@A@?@?@???@?@?@A@???@?@?@?@??A@?@?@?@???@?@?@A@???@?@?@?@???@A@?@?@?@???@?@?@A@???@?@?@?@???@?@A@?@?@???@?@?@?@???@A@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???@?@A@?@???@?@?@?@?@???@?@?@?@??A@?@?@?@?@???@?@?@?@???@?@?@?@?@??A@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@A@?@?@???@?@?@?@?@???B?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@???@?@?@?@??@@?@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@?@???@@@?@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@???@?@@@?@?@???@?@?@?@???@?@?@?@?@???@?@?@?@?@??@@?@?@?@???@?@?@?@?@???@?@?@?@???@?@?@?@@@???@?@?@?@???FB`AB~@Bf@?B?T" + } + } + } +} \ No newline at end of file diff --git a/percy/otpSchema.json b/percy/otpSchema.json new file mode 100644 index 000000000..bee17284d --- /dev/null +++ b/percy/otpSchema.json @@ -0,0 +1,13208 @@ +{ + "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": "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", + "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 + } + ], + "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": "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": "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": "startTime", + "description": "Time when the user leaves from the origin. Format: Unix timestamp in milliseconds.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Long", + "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": 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": "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": "fares", + "description": "Information about the fares for this itinerary. This is primarily a GTFS Fares V1 interface\nwill be removed in the future.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "fare", + "ofType": null + } + }, + "isDeprecated": true, + "deprecationReason": "Use the leg's `fareProducts`." + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Leg", + "description": null, + "fields": [ + { + "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": 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": false, + "deprecationReason": null + }, + { + "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": 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": 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 + } + ], + "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": "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": "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": 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": 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." + } + ], + "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": "filterByIds", + "description": "Only include places that match one of the given GTFS ids.", + "type": { + "kind": "INPUT_OBJECT", + "name": "InputFilters", + "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, realtime 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": "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": "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": "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 + } + ], + "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": 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": 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": null, + "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": "Component of the fare (i.e. ticket) for a part of the itinerary", + "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 diff --git a/percy/percy.test.js b/percy/percy.test.js index debdb34bd..23a1c1c91 100644 --- a/percy/percy.test.js +++ b/percy/percy.test.js @@ -5,7 +5,7 @@ import puppeteer from 'puppeteer' const percySnapshot = require('@percy/puppeteer') -const { OTP_RR_UI_MODE } = process.env +const OTP_RR_UI_MODE = process.env.OTP_RR_UI_MODE || 'normal' const MOCK_SERVER_PORT = 5486 @@ -50,7 +50,8 @@ beforeAll(async () => { }).stdout.pipe(process.stdout) // Launch mock OTP server - execa('yarn', ['percy-har-express', '-p', '9999', 'percy/mock.har'], { + execa('yarn', ['percy-mock-server'], { + env: { HAR: './percy/mock.har', PORT: '9999' }, signal: harAbortController.signal }).stdout.pipe(process.stdout) @@ -59,9 +60,9 @@ beforeAll(async () => { 'yarn', [ 'percy-har-express', + `percy/geocoder-mock-${OTP_RR_UI_MODE}.har`, '-p', - '9977', - `percy/geocoder-mock-${OTP_RR_UI_MODE}.har` + '9977' ], { signal: geocoderAbortController.signal @@ -71,7 +72,7 @@ beforeAll(async () => { // Web security is disabled to allow requests to the mock OTP server browser = await puppeteer.launch({ args: ['--disable-web-security'] - //, headless: false + // ,headless: false }) } catch (error) { console.log(error) diff --git a/yarn.lock b/yarn.lock index 91a72f4e8..a623b0cae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1643,6 +1643,39 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== +"@graphql-tools/merge@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.0.tgz#b0a3636c82716454bff88e9bb40108b0471db281" + integrity sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q== + dependencies: + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + +"@graphql-tools/schema@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" + integrity sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg== + dependencies: + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/utils@^10.0.0": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.8.tgz#c7b84275ec83dc42ad9f3d4ffc424ff682075759" + integrity sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + cross-inspect "1.0.0" + dset "^3.1.2" + tslib "^2.4.0" + +"@graphql-typed-document-node/core@^3.1.1": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -2485,10 +2518,10 @@ lodash.isequal "^4.5.0" qs "^6.9.1" -"@opentripplanner/core-utils@^12.0.0-alpha.4": - version "12.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-12.0.0-alpha.4.tgz#92fb8a1bf7334416101d220b3bd18f72dea9fc96" - integrity sha512-XkUCL7kBs888OStgbNlm7r8kA8Jinm9SJn/c40N4osGp6+YRVZn9neI4qSmX+HMTigyCW/xTrj1w4O6yiD7yMg== +"@opentripplanner/core-utils@^11.1.3": + version "11.1.3" + resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-11.1.3.tgz#6309e1298fbfc6dd01f16b22a5b2bc7ba5639454" + integrity sha512-O05TSCpzS9K9ery5Fjm+OalbpEpedV6SaCHjyIMqP5XW67lK+fJi4dYHlkr4/IBL7eDQ84op2vMeM/tBSJXsZg== dependencies: "@conveyal/lonlat" "^1.4.1" "@mapbox/polyline" "^1.1.0" @@ -2756,10 +2789,10 @@ "@turf/midpoint" "^6.5.0" lodash.isequal "^4.5.0" -"@opentripplanner/trip-details@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@opentripplanner/trip-details/-/trip-details-5.0.5.tgz#17e841ba9cfda9cddbe6cff2ffef964131d64049" - integrity sha512-EgxcWxAZNTZAS3ISDdeB5E0qEld/7rhj7wag4DQe9YKby9mPXo0ab28+j7MJ0ErQxqjUrsN/2JR2UBC3ybbxsQ== +"@opentripplanner/trip-details@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@opentripplanner/trip-details/-/trip-details-5.0.6.tgz#0f7043e0f112fddca4a10b15293298e7f1f5f421" + integrity sha512-t8CFJidFThQZ7zWKqDbilpctULAT/OfS17O14cSo1Ui4TgMfaMDoCWaRK66d93KffhMm4z6J+KLV5PGjtRZptA== dependencies: "@opentripplanner/core-utils" "^11.0.2" "@styled-icons/fa-solid" "^10.34.0" @@ -3631,6 +3664,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/lodash.memoize@^4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/lodash.memoize/-/lodash.memoize-4.1.8.tgz#a5bb773a4644de4ff10640e7a7f7f6152d5e5c5c" + integrity sha512-mf2QpcedTC4qXJxqgbmCuST3a/SNTuqz2kMtojazqeLhjXaLXgoSwAgVbAz6FINw90Ahg0y1m69pm+rhta3c8Q== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.200" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" + integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== + "@types/long@^3.0.32": version "3.0.32" resolved "https://registry.yarnpkg.com/@types/long/-/long-3.0.32.tgz#f4e5af31e9e9b196d8e5fca8a5e2e20aa3d60b69" @@ -3689,6 +3734,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/object-hash@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-3.0.5.tgz#f028398f9d918a4dcb57c50d16fc15023db6b244" + integrity sha512-WFGeSazfL5BWbEh5ACaAIs5RT6sbVIwBs1rgHUp+kZzX/gub41LEEYWTWbYnE/sKb7hDdPEsGa1Vmcaay2fS5g== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -6638,6 +6688,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-inspect@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cross-inspect/-/cross-inspect-1.0.0.tgz#5fda1af759a148594d2d58394a9e21364f6849af" + integrity sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ== + dependencies: + tslib "^2.4.0" + cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -7465,6 +7522,11 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dset@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2" + integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== + duplexer2@~0.1.0, duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -18189,6 +18251,11 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -18640,6 +18707,11 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== +value-or-promise@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" + integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"