{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./ts/helpers/icon.tsx","webpack:///./static/images/icon-search-reverse-default.svg","webpack:///./static/images/icon-crowding.svg","webpack:///./ts/components/Alerts.tsx","webpack:///./ts/models/route.ts","webpack:///./ts/helpers/prediction-helpers.tsx","webpack:///./ts/models/alert.ts","webpack:///./static/images/icon-shuttle-default.svg","webpack:///./static/images/icon-cancelled-default.svg","webpack:///./static/images/icon-snow-default.svg","webpack:///./ts/stop/components/RoutePillList.tsx","webpack:///./ts/schedule/store/ScheduleStore.tsx","webpack:///./ts/schedule/components/direction/reducer.ts","webpack:///./ts/schedule/components/line-diagram/CrowdingPill.tsx","webpack:///./ts/schedule/components/schedule-finder/ScheduleFinderModal.tsx","webpack:///./ts/helpers/fetch.ts","webpack:///./ts/components/Loading.tsx","webpack:///./ts/schedule/components/line-diagram/StopCard.tsx","webpack:////root/deps/phoenix/priv/static/phoenix.js","webpack:///./ts/models/vehicle.ts","webpack:///./ts/schedule/components/ScheduleNote.tsx","webpack:///./static/images/icon-down-arrow.svg","webpack:///./static/images/icon-checkmark.svg","webpack:///./ts/helpers/service.ts","webpack:///./ts/helpers/use-fetch.ts","webpack:///./ts/schedule/components/line-diagram/LineDiagramWithStops.tsx","webpack:///./ts/helpers/keyboard-events.ts","webpack:///./ts/schedule/components/Map.tsx","webpack:///./static/images/icon-schedule-finder.svg","webpack:///./ts/schedule/components/ScheduleFinder.tsx","webpack:///./ts/schedule/components/schedule-finder/ScheduleFinderForm.tsx","webpack:///./ts/schedule/components/schedule-finder/SelectContainer.tsx","webpack:///./ts/components/SearchBox.tsx","webpack:///./ts/schedule/components/line-diagram/LiveCrowdingIcon.tsx","webpack:///./ts/helpers/render-svg.tsx","webpack:///./ts/schedule/components/direction/menu-helpers.ts","webpack:///./ts/schedule/components/line-diagram/graphics/Line.tsx","webpack:///./ts/leaflet/bounds.ts","webpack:///./ts/leaflet/icon.ts","webpack:///./static/images/icon-green-line-small.svg","webpack:///./ts/leaflet/components/Map.tsx","webpack:///./ts/helpers/css.ts","webpack:///./ts/components/ExpandableBlock.tsx","webpack:///./static/images/icon-red-line-small.svg","webpack:///./static/images/icon-orange-line-small.svg","webpack:///./static/images/icon-mattapan-line-small.svg","webpack:///./static/images/icon-mode-commuter-rail-small.svg","webpack:///./static/images/icon-mode-bus-small.svg","webpack:///./static/images/icon-mode-ferry-small.svg","webpack:///./ts/schedule-entry.ts","webpack:///./ts/schedule/schedule-loader.tsx","webpack:///./static/images/icon-alerts-triangle.svg","webpack:///./ts/schedule/components/Channel.ts","webpack:///./ts/schedule/components/ScheduleLoader.tsx","webpack:///./ts/schedule/components/SchedulePage.tsx","webpack:///./ts/models/prediction.ts","webpack:///./ts/schedule/components/PDFSchedules.tsx","webpack:///./static/images/icon-pdf-default.svg","webpack:///./ts/schedule/components/Connections.tsx","webpack:///./ts/schedule/components/ContentTeasers.tsx","webpack:///./ts/schedule/components/HoursOfOperation.tsx","webpack:///./ts/schedule/components/Fares.tsx","webpack:///./ts/schedule/components/UpcomingHolidays.tsx","webpack:///./ts/components/Modal.tsx","webpack:///./ts/helpers/text.ts","webpack:///./ts/helpers/aria-props.ts","webpack:///./ts/schedule/components/schedule-finder/OriginModalContent.tsx","webpack:///./ts/schedule/components/schedule-finder/OriginListItem.tsx","webpack:///./ts/schedule/components/schedule-finder/ScheduleModalContent.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/DailySchedule.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/ScheduleTable.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/TableRow.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/AccordionRow.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/TripDetails.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/TripStop.tsx","webpack:///./ts/schedule/components/schedule-finder/daily-schedule/ServiceOptGroup.tsx","webpack:///./ts/schedule/components/schedule-finder/upcoming-departures/UpcomingDepartures.tsx","webpack:///./static/images/icon-live-clock.svg","webpack:///./ts/schedule/components/schedule-finder/upcoming-departures/LazyAccordion.tsx","webpack:///./ts/schedule/components/schedule-finder/upcoming-departures/TripDetails.tsx","webpack:///./ts/schedule/components/schedule-finder/upcoming-departures/TripStop.tsx","webpack:///./ts/schedule/components/ScheduleDirection.tsx","webpack:///./ts/schedule/components/direction/ScheduleDirectionMenu.tsx","webpack:///./ts/schedule/components/direction/GreenLineMenu.tsx","webpack:///./ts/schedule/components/direction/BusMenu.tsx","webpack:///./ts/schedule/components/direction/ScheduleDirectionButton.tsx","webpack:///./static/images/icon-change-direction.svg","webpack:///./ts/schedule/components/line-diagram/LineDiagram.tsx","webpack:///./ts/hooks/useFilteredList.ts","webpack:///./ts/schedule/components/line-diagram/reducer.ts","webpack:///./ts/schedule/components/line-diagram/StopConnections.tsx","webpack:///./ts/schedule/components/line-diagram/StopPredictions.tsx","webpack:///./ts/components/MatchHighlight.tsx","webpack:///./ts/schedule/components/line-diagram/StopFeatures.tsx","webpack:///./ts/schedule/components/line-diagram/graphics/Diagram.tsx","webpack:///./ts/schedule/components/line-diagram/graphics/Merge.tsx","webpack:///./ts/schedule/components/line-diagram/graphics/Stop.tsx","webpack:///./ts/schedule/components/line-diagram/VehicleIcons.tsx","webpack:///./ts/schedule/components/line-diagram/StopListWithBranches.tsx","webpack:///./ts/schedule/components/line-diagram/ExpandableBranch.tsx","webpack:///./ts/schedule/components/line-diagram/graphics/useStopPositions.ts","webpack:///./ts/helpers/date.ts","webpack:///./ts/schedule/components/line-diagram/graphics/graphic-helpers.tsx","webpack:///./static/images/icon-green-line-b-small.svg","webpack:///./static/images/icon-green-line-c-small.svg","webpack:///./static/images/icon-green-line-d-small.svg","webpack:///./static/images/icon-green-line-e-small.svg","webpack:///./ts/schedule/components/line-diagram/line-diagram-helpers.ts","webpack:///./static/images/icon-accessible-small.svg","webpack:///./static/images/icon-blue-line-default.svg","webpack:///./static/images/icon-mode-subway-default.svg","webpack:///./static/images/icon-parking-small.svg","webpack:///./static/images/icon-silver-line-small.svg","webpack:///./static/images/icon-vehicle-bordered-expanded.svg"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","7","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","accessibleIcon","className","alertIcon","blueLineIcon","busIcon","commuterRailIcon","ferryIcon","genericSubwayIcon","greenLineIcon","greenBLineIcon","greenCLineIcon","greenDLineIcon","greenELineIcon","mattapanLineIcon","orangeLineIcon","parkingIcon","redLineIcon","silverLineIcon","vehicleArrowIcon","searchIcon","modeIcon","routeId","startsWith","isASilverLineRoute","caret","expanded","unicodeCharacter","dangerouslySetInnerHTML","__html","defaultTooltipOptions","animation","html","placement","trigger","TooltipWrapper","children","tooltipText","tooltipOptions","href","options","assign","Tag","title","crowdingIcon","alertClassNames","classNames","iconForAlert","priority","effect","humanLifecycle","lifecycle","humanLabelForAlert","severity","alertLabel","alert","alertClasses","join","effectNameForAlert","split","map","word","charAt","toUpperCase","alertDescription","tabIndex","role","id","ref","panel","description","Alert","useState","toggleExpanded","onClick","strippedAlertUrl","url","replace","headerContent","header","onKeyPress","e","handleReactEnterKeyPress","noDescription","caretIcon","alerts","isABusRoute","isCommuterRailRouteType","type","isACommuterRailRoute","routeOrType","isAGreenLineRoute","routeOrRouteId","includes","timeForCommuterRail","delay","prediction","scheduledTime","scheduled_time","time","delayForCommuterRail","statusForCommuterRail","status","isSkippedOrCancelled","trackForCommuterRail","track","isHighSeverityOrHighPriority","isDiversion","alertsByStop","stopId","filter","entities","stop","some","uniqueByEffect","index","findIndex","a","withLeadingZero","isCurrentAlert","currentDate","Date","active_period","isInARange","ap","datePattern","match","exec","year","rawMonth","rawDay","rawHour","min","range","start","end","modeBgClass","route","routeToCSSClass","busName","modeNameForBg","RoutePill","breakTextAtSlash","routes","showGroupName","typedRoute","group_name","routeWithDirections","scheduleStoreReducer","state","action","newState","selectedDirection","undefined","selectedOrigin","modalOpen","modalMode","newStoreValues","createScheduleStore","directionId","createStore","store","getCurrentState","storeHandler","newValues","dispatch","mapStateToProps","toggleDirectionAction","setRoutePatternAction","routePattern","payload","toggleRoutePatternMenuAction","closeRoutePatternMenuAction","showAllRoutePatternsAction","updateDirectionAndVariantInURL","routePatternId","query","toString","newLoc","updateInLocation","location","history","replaceState","pathname","search","menuReducer","nextDirection","possibleNextRoutePattern","defaultRoutePatternForDirection","routePatternsByDirection","find","element","shape","shapesById","shape_id","itemFocus","toggleDirection","routePatternMenuOpen","toggleRoutePatternMenu","routePatternMenuAll","showAllRoutePatterns","newRoutePattern","setRoutePattern","crowding","crowdingDescriptions","scheduleOrigin","closeModal","directionChanged","initialMode","initialDirection","initialOrigin","originChanged","scheduleNote","services","stops","today","updateURL","handleOriginSelectClick","handleChangeDirection","newDirection","handleChangeOrigin","newOrigin","direction","origin","focusElementId","ariaLabel","label","direction_names","originModalContent","reducer","isLoading","error","props","liveData","searchQuery","stopData","routeStop","stopAlerts","isOrigin","isTerminus","isDestination","width","isMergeStop","diagramWidth","refs","useContext","StopRefContext","diversionAlert","hasLivePredictions","headsigns","hasPredictionTime","showPrediction","showDiversion","style","paddingLeft","route_stop","branch","hasBranchLabel","lineName","text","matchQuery","connections","isCommuterRail","Phoenix","this","Function","eval","iterator","constructor","TypeError","configurable","writable","b","R","w","C","S","u","self","h","f","v","y","g","k","channel","event","receivedResp","timeout","timeoutTimer","recHooks","sent","reset","send","hasReceived","startTimeout","socket","topic","join_ref","joinRef","response","callback","cancelRefEvent","refEvent","forEach","off","clearTimeout","cancelTimeout","makeRef","replyEventName","on","matchReceive","setTimeout","params","bindings","bindingRef","joinedOnce","joinPush","pushBuffer","rejoinTimer","T","rejoinUntilConnected","reconnectAfterMs","receive","onClose","hasLogger","log","concat","remove","onError","isLeaving","isClosed","scheduleTimeout","isJoining","isConnected","rejoin","arguments","Error","isJoined","canPush","indexOf","isLifecycleEvent","resend","sendJoin","onMessage","JSON","stringify","Array","isArray","next","done","parse","stateChangeCallbacks","open","close","message","channels","sendBuffer","transport","WebSocket","defaultEncoder","defaultDecoder","encode","decode","heartbeatIntervalMs","logger","longpollerTimeout","endPoint","heartbeatTimer","pendingHeartbeatRef","reconnectTimer","teardown","connect","protocol","appendParams","vsn","host","console","conn","endPointURL","onopen","onConnOpen","onerror","onConnError","onmessage","onConnMessage","onclose","onConnClose","flushSendBuffer","resetHeartbeat","skipHeartbeat","clearInterval","setInterval","sendHeartbeat","triggerChanError","code","readyState","connectionState","isMember","token","pollEndpoint","normalizeEndpoint","poll","RegExp","closeAndRetry","request","endpointURL","ontimeout","messages","XDomainRequest","xdomainRequest","XMLHttpRequest","ActiveXObject","xhrRequest","onload","parseJSON","responseText","onprogress","setRequestHeader","onreadystatechange","states","complete","serialize","encodeURIComponent","keys","events","diff","pendingDiffs","caller","onJoin","onLeave","onSync","syncState","syncDiff","inPendingSyncState","list","clone","metas","phx_ref","joins","leaves","unshift","from","getOwnPropertyNames","timerCalc","timer","tries","define","vehicleName","routeType","0","1","2","3","4","vehicleRealtimeStatusText","in_transit","incoming","stopped","not_crowded","some_crowding","crowded","service","serviceTime","peakOffPeakTimes","peakService","offpeakService","exceptions","offpeak","except","offPeak","exception","alternateText","alternateNote","ServiceGroupNames","serviceStartDateComparator","service1","service2","stringToDateObject","start_date","getTime","isInCurrentService","serviceStartDate","serviceEndDate","end_date","isInCurrentRating","rating_start_date","ratingStartDate","rating_end_date","ratingEndDate","isCurrentValidService","added_dates","dateObjectToString","isInAddedDates","removed_dates","isInRemovedDates","currentDay","getDay","valid_days","isOnValidDay","startToEnd","startDateObject","endDateObject","shortDate","isInFutureService","isInFutureRating","areSimilarServices","every","isEqual","dedupeServices","uniqWith","groupServicesByDateRating","groupBy","typicality","HOLIDAY","OTHER","CURRENT","FUTURE","rating_description","optGroupOrder","serviceTypeOrder","weekday","saturday","sunday","other","serviceTypicalityOrder","unplanned_disruption","planned_disruption","holiday_service","extra_service","typical_service","unknown","serviceComparator","type1","validDays1","typicality1","date1","type2","validDays2","typicality2","date2","optGroupComparator","groupA","groupB","optGroupNames","values","hasMultipleWeekdaySchedules","dayIntegerToString","day","serviceDays","validDays","daysAreConsecutive","days","nextDay","rest","FetchStatus","isNotStarted","NotStarted","Loading","hasData","Data","gotError","parseJsonResponse","ok","json","statusText","fetch","fetcher","parser","then","useReducer","createContext","handleStopClick","stopRefsMap","updateAllStopCoords","anyCrowding","Provider","lineDiagram","hasBranchLines","isEnter","isEscape","handleNativeEnterKeyPress","cb","keyCode","handleNativeEscapeKeyPress","handleReactExitKeyPress","iconOpts","icon","icon_size","icon_anchor","updateMarker","marker","tooltip","vehicle_crowding","tooltip_text","icon_opts","z_index","shouldVehicleDisplay","shapeIdsInDirection","shapeId","actionWithChannel","shapeIds","markers","isVehicleMarker","idHash","shouldRemoveMarker","reduce","acc","bounds","useRef","useEffect","initChannel","setupChannels","stopChannel","stopChannels","stopMarkers","stop_markers","mapData","current","changeDirection","changeOrigin","onDirectionChange","onOriginChange","onOriginSelectClick","onSubmit","modalIsOpen","stopsByDirection","directionInfo","directionNames","directionDestinations","originError","setOriginError","preventDefault","onChange","parseInt","target","dir","handleClick","onKeyUp","labelText","placeholder","setQuery","htmlFor","toLowerCase","svgText","ariaHide","routePatternIds","targetElId","shiftKey","nextIndex","currentId","nextRoutePatternIndex","nextElId","document","getElementById","focus","prevIndex","prevRoutePatternIndex","prevElId","to","fromCoords","useSelector","toCoords","stop_data","x1","y1","y2","areOnDifferentBranchLines","lineProps","strokeWidth","BASE_LINE_WIDTH","x2","sd","stroke","branchLine","branchIndex","isBranchTerminusStop","BRANCH_LINE_WIDTH","BRANCH_SPACING","points","latLng","latitude","latLngBounds","defaultIconOpts","iconAnchor","iconSize","popupAnchor","opts","popup_anchor","Icon","iconUrl","iconRetinaUrl","defaultZoomOpts","maxZoom","minZoom","scrollWheelZoom","touchAction","memo","boundsByMarkers","defaultCenter","polylines","tileServerUrl","zoom","leaflet","FullscreenControl","getBounds","TileLayer","boundsOrByMarkers","position","longitude","mapCenter","nonNullZoom","center","attribution","polyline","Math","floor","random","positions","color","weight","dashArray","lineCap","lineJoin","markerEl","angle","setRotationAngle","rotateMarker","leafletElement","zIndexOffset","keyboard","maxHeight","busClass","routeToModeName","routeBgClass","iconSvgText","notifyExpanded","initiallyExpanded","initiallyFocused","panelClassName","preventScroll","initialState","focused","hookedState","headerId","panelId","newQuery","renderSchedulePage","schedulePageData","render","component","scheduleFinderRoot","renderDirectionOrMap","root","currentState","renderDirectionAndMap","mapDataEl","getAttribute","mapEl","innerHTML","renderMap","schedulePageDataEl","routePatterns","isEmpty","doInitChannel","Socket","reason","route_id","direction_id","channelId","onData","ScheduleLoader","useQueryParams","StringParam","initialSelectedRoutePatternId","currentDirection","readjustedDirectionId","staticMapData","staticDataEl","pdfs","teasers","hours","fares","holidays","fareLink","schedule_relationship","timeDataList","time_data","pdf","rel","link","fare","holiday","date","ModalContent","closeText","bodyPadding","scrollBarPadding","asideRef","scrollRef","scrollTo","top","useLayoutEffect","trap","initialFocus","clickOutsideDeactivates","activate","htmlElement","getElementsByTagName","bodyWrapper","setAttribute","classList","add","paddingRight","deactivate","createPortal","labelOrDescribedBy","onKeyDown","onClickAway","body","Modal","priorPadding","innerWidth","clientWidth","str","isLabel","elementId","originSearch","setOriginSearch","trim","cleanSearch","regExp","stopListSearchFilter","lastStop","isDisabled","is_closed","zone","fetchData","serviceToday","input","formattedDate","fetchJourneys","selectedService","isCurrent","parseResults","SchedulesSelect","sortedServices","todayServiceId","defaultSelectedServiceId","todayDate","onSelectService","servicesByOptGroup","defaultValue","sort","group","groupedServices","multipleWeekdays","DailySchedule","fetchState","currentServices","defaultSelectedService","setSelectedService","getJourneysForSelectedService","chosenService","journeys","isSchoolTrip","routePatternsById","time_desc","accumulator","anySchoolTrips","firstTrip","lastTrip","departure","scope","colSpan","journey","trip","route_pattern_id","fetchTripInfo","tripId","BusTableRow","backgroundClass","RouteIcon","headsign","CrTableRow","Accordion","contentComponent","setExpanded","toggle","showFare","TripSummary","tripInfo","times","duration","price","fare_link","ErrorLoadingTrip","TripDetailsTable","vehicle","allTimesHaveSchedule","route_type","schedule","formattedDepartureTimes","isMultipleWeekday","startDate","endDate","optionText","added_dates_notes","entries","entry","addedDate","addedNote","RoutePillSmall","crowdingInformation","showCrowding","trip_id","realtime","statusWithTrain","x","adjustedState","AccordionRow","TableRow","UpcomingDeparturesHeader","Promise","all","adjustedRoute","res","upcomingDeparturesTable","journeysWithTripInfo","someCrowdingInfoExists","idx","UpcomingDepartures","stateFromProps","retrievedJourneysWithTripInfo","filteredJourneysWithTripInfo","hasAPrediction","errorLoadingTrip","departures","fetchMapData","currentRoutePatternIdForData","baseURL","fetchLineData","routePatternsInCurrentDirection","defaultRoutePattern","reverseDirection","directionIsChangeable","mapState","dispatchMapData","currentShapeId","lineState","dispatchLineData","selectedRoutePatternId","menuOpen","src","img_src","alt","pdf_url","clickToClose","closest","keyToClose","addEventListener","removeEventListener","BusMenuSelect","GreenLineSelect","direction_destinations","ExpandedBusMenu","ExpandedGreenMenu","greenRoutes","GreenLineItem","routeIds","selected","selectedClass","item","greenRoute","RoutePatternItem","duplicated","UncommonDestinationsItem","hasMoreRoutePatterns","isDuplicateHeadsign","compareRoutePattern","filterRule","focusIndex","determineFocusIndex","toggleButtonIds","isMenuClickable","linkClass","routePatternNameById","stationsOrStops","lineDiagramReducer","lineDiagramCoordStore","createLineDiagramCoordStore","useCallback","isBeginning","reversedDirectionId","stopQuery","setStopQuery","filteredStops","refreshInterval","filteredList","setFilteredList","listQuery","setListQuery","results","string","firstCRIndex","connection","firstFerryIndex","filteredConnections","connectingRoute","predictions","liveHeadsigns","enhancedTimeData","time_data_with_crowding_list","predictedOrScheduledTime","predictionTimeClass","predicted_schedule","texts","train_number","predictionTexts","capitalize","childNodes","setChildNodes","matched","precedingText","subsequentText","createElement","stop_features","LiveVehicleIconSet","vehicleData","vehicles","max","ld","xmlns","height","left","destinations","names","diagramDescription","mergeStop","branchingDescription","DiagonalHatchPattern","branchingOutward","getTreeDirection","stopGaps","lineDiagramIndexes","isStopOnMainLine","last","lineDiagramCoords","mergeBends","mergeStopIndex","mergeStopCoords","downBranch","first","nextStop","terminus","mX","mY","dx","abs","MERGE_RADIUS","dy","arc","pathProps","coords","CIRC_RADIUS","cx","cy","stopName","baseText","trip_name","CrowdingIconString","renderToString","tooltips","Branch","branchedDiagram","toggledStopIndices","lineDiagramWithBranches","isOnBranchLine","stopOrStops","BranchToggle","isExpanded","maxBranches","transform","CIRC_DIAMETER","rx","setIsExpanded","blockIsExpanded","useStopRef","prev","dispatchStopCoords","useDispatch","updateAllStops","stopById","coordinates","unformatted","part","Number","month","getFullYear","getMonth","getDate","toLocaleDateString","timeZone","coordReducer","allCoordinates","initialCoordState","__REDUX_DEVTOOLS_EXTENSION__","patternTransform","patternUnits","isOnBranch","isTerminusStop","subsetFn"],"mappings":"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","file":"./schedule-8653ec7755e731d8e3786fb911acfa10.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t7: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([567,0,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import React, { ReactElement } from \"react\";\nimport renderSvg from \"./render-svg\";\nimport { isASilverLineRoute } from \"../models/route\";\nimport accessibleIconSvg from \"../../static/images/icon-accessible-small.svg\";\nimport alertIconSvg from \"../../static/images/icon-alerts-triangle.svg\";\nimport blueLineIconSvg from \"../../static/images/icon-blue-line-default.svg\";\nimport busIconSvg from \"../../static/images/icon-mode-bus-small.svg\";\nimport commuterRailIconSvg from \"../../static/images/icon-mode-commuter-rail-small.svg\";\nimport ferryIconSvg from \"../../static/images/icon-mode-ferry-small.svg\";\nimport genericSubwayIconSvg from \"../../static/images/icon-mode-subway-default.svg\";\nimport greenLineIconSvg from \"../../static/images/icon-green-line-small.svg\";\nimport greenBLineIconSvg from \"../../static/images/icon-green-line-b-small.svg\";\nimport greenCLineIconSvg from \"../../static/images/icon-green-line-c-small.svg\";\nimport greenDLineIconSvg from \"../../static/images/icon-green-line-d-small.svg\";\nimport greenELineIconSvg from \"../../static/images/icon-green-line-e-small.svg\";\nimport mattapanLineIconSvg from \"../../static/images/icon-mattapan-line-small.svg\";\nimport orangeLineIconSvg from \"../../static/images/icon-orange-line-small.svg\";\nimport parkingIconSvg from \"../../static/images/icon-parking-small.svg\";\nimport redLineIconSvg from \"../../static/images/icon-red-line-small.svg\";\nimport silverLineIconSvg from \"../../static/images/icon-silver-line-small.svg\";\nimport vehicleArrowSvg from \"../../static/images/icon-vehicle-bordered-expanded.svg\";\nimport searchIconSvg from \"../../static/images/icon-search-reverse-default.svg\";\nimport crowdingIconSvg from \"../../static/images/icon-crowding.svg\";\n\nexport const accessibleIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, accessibleIconSvg, false);\n\nexport const alertIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, alertIconSvg, false);\n\nexport const blueLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, blueLineIconSvg, false);\n\nexport const busIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, busIconSvg, false);\n\nexport const commuterRailIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, commuterRailIconSvg, false);\n\nexport const ferryIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, ferryIconSvg, false);\n\nexport const genericSubwayIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, genericSubwayIconSvg, false);\n\nexport const greenLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenLineIconSvg, false);\n\nexport const greenBLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenBLineIconSvg, false);\n\nexport const greenCLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenCLineIconSvg, false);\n\nexport const greenDLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenDLineIconSvg, false);\n\nexport const greenELineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenELineIconSvg, false);\n\nexport const mattapanLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, mattapanLineIconSvg, false);\n\nexport const orangeLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, orangeLineIconSvg, false);\n\nexport const parkingIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, parkingIconSvg, false);\n\nexport const redLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, redLineIconSvg, false);\n\nexport const silverLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, silverLineIconSvg, false);\n\nexport const vehicleArrowIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, vehicleArrowSvg, false);\n\nexport const searchIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, searchIconSvg, false);\n\nexport const modeIcon = (routeId: string): JSX.Element | undefined => {\n  if (routeId.startsWith(\"CR-\")) return commuterRailIcon(\"c-svg__icon\");\n  if (routeId.startsWith(\"Boat-\")) return ferryIcon(\"c-svg__icon\");\n  if (routeId === \"Blue\") return blueLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green\") return greenLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-B\") return greenBLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-C\") return greenCLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-D\") return greenDLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-E\") return greenELineIcon(\"c-svg__icon\");\n  if (routeId === \"Mattapan\") return mattapanLineIcon(\"c-svg__icon\");\n  if (routeId === \"Orange\") return orangeLineIcon(\"c-svg__icon\");\n  if (routeId === \"Red\") return redLineIcon(\"c-svg__icon\");\n  if (isASilverLineRoute(routeId)) return silverLineIcon(\"c-svg__icon\");\n\n  return busIcon(\"c-svg__icon-bus-small\");\n};\n\nexport const caret = (\n  className: string,\n  expanded: boolean\n): ReactElement<HTMLElement> => {\n  const unicodeCharacter = expanded ? \"&#xF106;\" : \"&#xF107;\";\n  return (\n    <span\n      className={className}\n      // eslint-disable-next-line react/no-danger\n      dangerouslySetInnerHTML={{ __html: unicodeCharacter }}\n    />\n  );\n};\n\n/*\nA minimal component that gives its child component\na basic tooltip containing the specified text. Has no\nvisual appearance itself.\n\nNote: data-selector=\"true\" and data-original-title are\nspecified here in order to preserve `title` text post-trigger\n*/\n\n// Corresponds to Bootstrap's tooltip options\ninterface TooltipOptions {\n  animation?: boolean;\n  container?: string | HTMLElement | false;\n  delay?: number | object;\n  html?: boolean;\n  placement?: string | Function;\n  selector?: string;\n  template?: string;\n  title?: string | HTMLElement | Function;\n  trigger?: string;\n  constraints?: [];\n  offset?: string;\n}\n\nconst defaultTooltipOptions: TooltipOptions = {\n  animation: true,\n  html: false,\n  placement: \"top\",\n  trigger: \"hover focus\"\n};\n\nexport const TooltipWrapper: React.FC<{\n  children: JSX.Element;\n  tooltipText: string;\n  tooltipOptions?: TooltipOptions;\n  href?: string;\n}> = ({ children, tooltipText, tooltipOptions, href }): JSX.Element => {\n  const options = Object.assign({}, defaultTooltipOptions, tooltipOptions);\n\n  const Tag = href ? \"a\" : \"span\";\n\n  return (\n    <Tag\n      href={href}\n      data-toggle=\"tooltip\"\n      data-trigger={options.trigger}\n      data-placement={options.placement}\n      data-animation={options.animation}\n      data-html={options.html}\n      data-selector=\"true\"\n      data-original-title={tooltipText}\n      title={tooltipText}\n    >\n      {children}\n    </Tag>\n  );\n};\n\nexport const crowdingIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(`c-svg__icon c-icon__crowding ${className}`, crowdingIconSvg, true);\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>search</title><path fill=\\\"#fff\\\" d=\\\"M27.92 1.002a19.07 19.07 0 11-10.851 34.702L6.754 45.999a3.366 3.366 0 01-4.77-4.75l10.315-10.315A18.899 18.899 0 018.86 20.062a19.115 19.115 0 0119.06-19.06zm0 6.718a12.342 12.342 0 1012.342 12.342A12.287 12.287 0 0027.92 7.72z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>vehicle crowding status</title><path class=\\\"person person-left\\\" d=\\\"M6.86 16.05A6.86 6.86 0 000 22.91v17.77a3.43 3.43 0 003.43 3.42h6.86a3.42 3.42 0 003.42-3.42V22.91a6.86 6.86 0 00-6.85-6.86zM6.9 13.23A4.93 4.93 0 102 8.3a4.93 4.93 0 004.9 4.93z\\\"></path><path class=\\\"person person-middle\\\" d=\\\"M24 16.05a6.86 6.86 0 00-6.86 6.86v17.77a3.43 3.43 0 003.43 3.42h6.86a3.43 3.43 0 003.43-3.42V22.91A6.86 6.86 0 0024 16.05zM24.05 13.23a4.93 4.93 0 10-4.93-4.93 4.93 4.93 0 004.93 4.93z\\\"></path><path class=\\\"person person-right\\\" d=\\\"M41.14 16.05a6.86 6.86 0 00-6.85 6.86v17.77a3.42 3.42 0 003.42 3.42h6.86A3.43 3.43 0 0048 40.68V22.91a6.86 6.86 0 00-6.86-6.86zM41.19 13.23a4.93 4.93 0 10-4.93-4.93 4.93 4.93 0 004.93 4.93z\\\"></path></svg>\"","import React, { ReactElement, useState } from \"react\";\nimport { Alert as AlertType, Lifecycle } from \"../__v3api\";\nimport { handleReactEnterKeyPress } from \"../helpers/keyboard-events\";\nimport { caret } from \"../helpers/icon\";\nimport renderSVG from \"../helpers/render-svg\";\nimport shuttleIcon from \"../../static/images/icon-shuttle-default.svg\";\nimport cancelIcon from \"../../static/images/icon-cancelled-default.svg\";\nimport snowIcon from \"../../static/images/icon-snow-default.svg\";\nimport alertIcon from \"../../static/images/icon-alerts-triangle.svg\";\n\ninterface Props {\n  alerts: AlertType[];\n}\n\nconst alertClassNames = (\n  { priority, description }: AlertType,\n  expanded: boolean\n): string => {\n  const classNames = `c-alert-item c-alert-item--${priority}`;\n  if (description) {\n    if (expanded) {\n      return `${classNames} c-alert-item--expandable c-alert-item--open`;\n    }\n    return `${classNames} c-alert-item--expandable c-alert-item--closed`;\n  }\n  return classNames;\n};\n\nexport const iconForAlert = ({\n  priority,\n  effect\n}: AlertType): ReactElement<HTMLElement> | null => {\n  if (priority === \"low\") return null;\n  if (priority === \"system\")\n    return renderSVG(\"c-svg__icon-alerts-triangle\", alertIcon);\n  switch (effect) {\n    case \"suspension\":\n    case \"cancellation\":\n      return renderSVG(\"c-svg__icon-cancelled-default\", cancelIcon);\n    case \"snow_route\":\n      return renderSVG(\"c-svg__icon-snow-default\", snowIcon);\n    case \"shuttle\":\n      return renderSVG(\"c-svg__icon-shuttle-default\", shuttleIcon);\n    default:\n      return renderSVG(\"c-svg__icon-alerts-triangle\", alertIcon);\n  }\n};\n\nconst humanLifecycle = (lifecycle: Lifecycle): string | null => {\n  switch (lifecycle) {\n    case \"new\":\n    case \"unknown\":\n      return null;\n    case \"upcoming\":\n    case \"ongoing_upcoming\":\n      return \"Upcoming\";\n    case \"ongoing\":\n      return \"Ongoing\";\n    default:\n      return null;\n  }\n};\n\nexport const humanLabelForAlert = ({\n  effect,\n  severity,\n  lifecycle\n}: AlertType): string | null => {\n  if (effect === \"delay\") {\n    switch (severity) {\n      case 0:\n      case 1:\n      case 2:\n        return null;\n      case 3:\n        return \"up to 10 minutes\";\n      case 4:\n        return \"up to 15 minutes\";\n      case 5:\n        return \"up to 20 minutes\";\n      case 6:\n        return \"up to 25 minutes\";\n      case 7:\n        return \"up to 30 minutes\";\n      case 8:\n        return \"30+ minutes\";\n      case 9:\n        return \"more than an hour\";\n      default:\n        return humanLifecycle(lifecycle);\n    }\n  }\n  return humanLifecycle(lifecycle);\n};\n\nexport const alertLabel = (alert: AlertType): ReactElement<HTMLElement> => {\n  const alertClasses = [\"u-small-caps\", \"c-alert-item__badge\"];\n  if (alert.priority === \"system\") {\n    alertClasses.push(\"c-alert-item__badge--system\");\n  }\n  if (\n    alert.lifecycle === \"upcoming\" ||\n    alert.lifecycle === \"ongoing_upcoming\"\n  ) {\n    alertClasses.push(\"c-alert-item__badge--upcoming\");\n  }\n  return (\n    <span className={alertClasses.join(\" \")}>{humanLabelForAlert(alert)}</span>\n  );\n};\n\nexport const effectNameForAlert = (alert: AlertType): string =>\n  alert.effect\n    .split(\"_\")\n    .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n    .join(\" \");\n\nconst caretIcon = (\n  noDescription: boolean,\n  expanded: boolean\n): ReactElement<HTMLElement> | null => {\n  if (noDescription) return null;\n  return caret(\"c-expandable-block__header-caret--black\", expanded);\n};\n\nconst alertDescription = (alert: AlertType): ReactElement<HTMLElement> => (\n  <div\n    className={`c-alert-item__bottom c-alert-item__buttom--${alert.priority}`}\n    // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n    tabIndex={0}\n    role=\"region\"\n    aria-labelledby={`alert-${alert.id}`}\n    ref={panel => panel && panel.focus()}\n  >\n    <div className=\"c-alert-item__description\">\n      <div\n        // eslint-disable-next-line react/no-danger\n        dangerouslySetInnerHTML={{\n          __html: alert.description\n        }}\n      />\n      <div className=\"c-alert-item__updated\">{alert.updated_at}</div>\n    </div>\n  </div>\n);\n\nconst Alert = ({ alert }: { alert: AlertType }): ReactElement<HTMLElement> => {\n  const [expanded, toggleExpanded] = useState(false);\n  const onClick = (): void => toggleExpanded(!expanded);\n\n  const alertUrl = alert.url ? alert.url : \"\";\n\n  // remove [http:// | https:// | www.] from alert URL:\n  let strippedAlertUrl = alertUrl.replace(/(https?:\\/\\/)?(www\\.)?/i, \"\");\n\n  // capitalize 'mbta' (special case):\n  strippedAlertUrl = strippedAlertUrl.replace(/mbta/gi, \"MBTA\");\n\n  const headerContent = alert.url\n    ? `${alert.header}<span>&nbsp;</span><a href=\"${\n        alert.url\n      }\" target=\"_blank\">${strippedAlertUrl}</a>`\n    : alert.header;\n\n  return (\n    <li\n      id={`alert-${alert.id}`}\n      tabIndex={0}\n      className={alertClassNames(alert, expanded)}\n      onClick={onClick}\n      onKeyPress={e => handleReactEnterKeyPress(e, onClick)}\n      aria-expanded={expanded}\n      // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n      role=\"button\"\n    >\n      <div className=\"c-alert-item__icon\">{iconForAlert(alert)}</div>\n      <div className=\"c-alert-item__top\">\n        <div className=\"c-alert-item__top-text-container\">\n          <div className=\"c-alert-item__effect\">\n            {`${effectNameForAlert(alert)} `}\n            {humanLabelForAlert(alert) ? alertLabel(alert) : null}\n          </div>\n          {/* eslint-disable-next-line react/no-danger */}\n          <div dangerouslySetInnerHTML={{ __html: headerContent }} />\n        </div>\n        <div className=\"c-alert-item__top-caret-container\">\n          {caretIcon(alert.description === \"\", expanded)}\n        </div>\n      </div>\n      {expanded && alert.description ? alertDescription(alert) : null}\n      {/* No javascript support */}\n      {alert.description ? (\n        <noscript>{alertDescription(alert)}</noscript>\n      ) : null}\n    </li>\n  );\n};\n\nconst Alerts = ({ alerts }: Props): ReactElement<HTMLElement> => (\n  <div className=\"container\">\n    <div className=\"page-section\">\n      <ul className=\"c-alert-group\">\n        {alerts.map((alert: AlertType) => (\n          <Alert key={alert.id} alert={alert} />\n        ))}\n      </ul>\n    </div>\n  </div>\n);\n\nexport default Alerts;\n","import { Route, RouteType } from \"../__v3api\";\n\nconst isRouteType = (obj: Route | RouteType): obj is RouteType =>\n  typeof obj === \"number\";\n\nexport const isABusRoute = ({ type }: Route): boolean => type === 3;\n\nconst isCommuterRailRouteType = (type: RouteType): boolean => type === 2;\n\nexport const isACommuterRailRoute = (routeOrType: Route | RouteType): boolean =>\n  isRouteType(routeOrType)\n    ? isCommuterRailRouteType(routeOrType)\n    : isCommuterRailRouteType(routeOrType.type);\n\nexport const isAGreenLineRoute = ({ id }: Route): boolean =>\n  id.startsWith(\"Green\");\n\nexport const isASilverLineRoute = (routeOrRouteId: Route | string): boolean => {\n  const id =\n    typeof routeOrRouteId === \"string\" ? routeOrRouteId : routeOrRouteId.id;\n  return [\"741\", \"742\", \"743\", \"746\", \"749\", \"751\"].includes(id);\n};\n","import React, { ReactElement } from \"react\";\nimport { PredictedOrScheduledTime } from \"../__v3api\";\nimport { isSkippedOrCancelled } from \"../models/prediction\";\nimport { TripPrediction } from \"../schedule/components/__trips\";\n\nconst delayForCommuterRail = (\n  data: PredictedOrScheduledTime,\n  className = \"\"\n): ReactElement<HTMLElement> => (\n  <>\n    <div className={`${className ? `${className}--delayed` : \"\"}`}>\n      {data.scheduled_time!.join(\"\")}\n    </div>\n    <div className={className}>\n      {data.prediction && data.prediction.time.join(\"\")}\n    </div>\n  </>\n);\n\nexport const timeForCommuterRail = (\n  data: PredictedOrScheduledTime,\n  className = \"\"\n): ReactElement<HTMLElement> => {\n  const { delay, prediction, scheduled_time: scheduledTime } = data;\n\n  if (delay >= 5 && prediction) {\n    return delayForCommuterRail(data, className);\n  }\n\n  const time = prediction ? prediction.time : scheduledTime;\n\n  return <div className={className}>{time!.join(\"\")}</div>;\n};\n\nexport const statusForCommuterRail = ({\n  delay,\n  scheduled_time: scheduledTime,\n  prediction\n}: PredictedOrScheduledTime): string | null => {\n  // If there is a human-entered status string, prioritize that\n  if (prediction && prediction.status) return prediction.status;\n\n  if (isSkippedOrCancelled((prediction as unknown) as TripPrediction))\n    return \"Canceled\";\n\n  // Indicate \"Delayed\" if train is delayed 5+ minutes\n  if (delay >= 5) return `Delayed ${delay} min`;\n\n  // Indicate \"On time\" if train otherwise has a prediction\n  // Indicate \"Scheduled\" if train is not \"Delayed\" and we have a scheduled time\n  // (even if there is no real-time prediction)\n  if (scheduledTime && prediction) return \"On time\";\n  if (scheduledTime) return \"Scheduled\";\n\n  // We have just a prediction with no scheduled time, so we can't say whether\n  // the train is on time, delayed, etc.\n  return null;\n};\n\nexport const trackForCommuterRail = ({\n  prediction\n}: PredictedOrScheduledTime): string =>\n  prediction && prediction.track ? ` track ${prediction.track}` : \"\";\n","import { Alert, TimePeriodPairs } from \"../__v3api\";\n\nexport const isHighSeverityOrHighPriority = ({\n  priority,\n  severity\n}: Alert): boolean => priority === \"high\" || severity >= 7;\n\nexport const isDiversion = ({ effect }: Alert): boolean =>\n  effect === \"shuttle\" ||\n  effect === \"stop_closure\" ||\n  effect === \"station_closure\" ||\n  effect === \"detour\";\n\nexport const alertsByStop = (alerts: Alert[], stopId: string): Alert[] =>\n  alerts.filter(\n    ({ informed_entity: entities }: Alert): boolean =>\n      !!entities.stop && entities.stop!.some((id: string) => id === stopId)\n  );\n\nexport const uniqueByEffect = (\n  alert: Alert,\n  index: number,\n  alerts: Alert[]\n): boolean => alerts.findIndex(a => a.effect === alert.effect) === index;\n\nconst withLeadingZero = (n: string): string => `0${n}`.slice(-2);\n\nconst activePeriodToDates = (\n  activePeriod: TimePeriodPairs\n): (Date | null)[] => {\n  const datePattern = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})\\s(\\d{1,2}):(\\d{2})$/;\n\n  return activePeriod.map(\n    (d: string): Date | null => {\n      const match = datePattern.exec(d);\n      if (match) {\n        const [, year, rawMonth, rawDay, rawHour, min] = match;\n        return new Date(\n          `${year}-${withLeadingZero(rawMonth)}-${withLeadingZero(\n            rawDay\n          )}T${withLeadingZero(rawHour)}:${min}:00`\n        );\n      }\n      return null;\n    }\n  );\n};\n\nconst isCurrentLifecycle = ({ lifecycle }: Alert): boolean =>\n  lifecycle === \"new\" ||\n  lifecycle === \"ongoing\" ||\n  lifecycle === \"ongoing_upcoming\";\n\nexport const isCurrentAlert = (\n  alert: Alert,\n  currentDate: Date = new Date()\n): boolean => {\n  if (!alert.active_period) return false;\n  const dateRanges = alert.active_period.map(ap => activePeriodToDates(ap));\n  const isInARange = dateRanges.some(\n    (range): boolean => {\n      const [start, end] = range;\n      if (!start) return false; // end might be null for ongoing alerts\n      return currentDate >= start && (end ? currentDate <= end : true);\n    }\n  );\n  return isCurrentLifecycle(alert) && isInARange;\n};\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>shuttle</title><path fill=\\\"#1c1e23\\\" d=\\\"M42.95 21.61L41.108 6.98c-.468-2.64-2.115-3.67-4.566-4.75A39.044 39.044 0 0024.015-.09a39.217 39.217 0 00-12.548 2.32C9.047 3.29 7.4 4.34 6.902 6.98L5.05 21.61v20.24H8.3v3.525A2.655 2.655 0 0010.969 48a2.655 2.655 0 002.67-2.625V41.85h20.82v3.525a2.67 2.67 0 005.338 0V41.85h3.152zm-26.734-18h15.66a1.18 1.18 0 110 2.36h-15.66a1.18 1.18 0 110-2.36zm-7.8 17.57L9.943 9.63a1.524 1.524 0 011.525-1.25h25.29a1.513 1.513 0 011.515 1.25l1.525 11.55a1.318 1.318 0 010 .4v.08a1.496 1.496 0 01-1.525 1.49H9.87a1.51 1.51 0 01-1.454-1.57 1.318 1.318 0 010-.4zm2.553 14.41a2.795 2.795 0 112.837-2.8 2.817 2.817 0 01-2.837 2.8zm26.153 0a2.795 2.795 0 112.848-2.8 2.817 2.817 0 01-2.848 2.8z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>cancelled</title><path fill=\\\"#1c1e23\\\" d=\\\"M14.29 0h19.43a1.05 1.05 0 01.71.29l13.28 13.28a1.05 1.05 0 01.29.71V33.2a1 1 0 01-.28.69l-13.29 13.8a1 1 0 01-.72.31H14.28a1.05 1.05 0 01-.71-.29L.29 34.43a1.05 1.05 0 01-.29-.71V14.8a1 1 0 01.28-.69L13.57.31a1 1 0 01.72-.31z\\\"></path><path fill=\\\"#fff\\\" d=\\\"M12.28 15.76l3.43-3.47a1 1 0 011.39 0l6.9 6.84 6.89-6.84a1 1 0 011.4 0l3.43 3.47a1 1 0 010 1.39L28.81 24l6.9 7a1 1 0 010 1.4l-3.4 3.33a1 1 0 01-1.39 0l-6.91-7-6.91 7a1 1 0 01-1.39 0l-3.4-3.33a1 1 0 010-1.4l6.9-7-6.9-6.85a1 1 0 01-.03-1.39z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>snow</title><path fill=\\\"#1c1e23\\\" d=\\\"M20.27 16.87l-6.54-3.81-1.56-5.86A1 1 0 0011 6.5L5.92 7.87a1 1 0 00-.69 1.21l1 3.95-3.89 1.06a1 1 0 00-.69 1.22L3 20.4a1 1 0 001.2.7l6.12-1.66 6.35 3.7-5.78 3.37-7.19-1.94a1 1 0 00-1.2.7l-1.35 5.09a1 1 0 00.69 1.21l4.44 1.2-1.22 4.6a1 1 0 00.69 1.21L10.8 40a1 1 0 001.2-.7l1.58-5.94 6.69-3.89v7.71l-5.33 5.32a1 1 0 000 1.4l3.7 3.73a1 1 0 001.39 0L23.61 44l3.67 3.7a1 1 0 001.39 0l3.7-3.7a1 1 0 000-1.39l-4.92-5v-8.19l7.29 4.24 1.49 5.59a1 1 0 001.2.7l5-1.37a1 1 0 00.7-1.21l-1.24-4.66 4.23-1.14a1 1 0 00.7-1.21l-1.32-5.09a1 1 0 00-1.2-.7l-7.38 2-5.87-3.42 6.63-3.86 6.73 1.82a1 1 0 001.2-.7l1.39-5.1a1 1 0 00-.7-1.22l-4-1.07 1.05-3.94a1 1 0 00-.69-1.21l-5-1.37a1 1 0 00-1.2.7L35 12.47l-7.55 4.4V10.7l4.92-4.95a1 1 0 000-1.4L28.67.63a1 1 0 00-1.39 0l-3.52 3.55L20 .41a1 1 0 00-1.39 0l-3.7 3.73a1 1 0 000 1.39l5.33 5.37z\\\"></path></svg>\"","import React, { ReactElement } from \"react\";\nimport { EnhancedRoute, Route } from \"../../__v3api\";\nimport { TypedRoutes } from \"./__stop\";\nimport { breakTextAtSlash } from \"../../helpers/text\";\nimport { routeToCSSClass } from \"../../helpers/css\";\n\ninterface RoutePillListProps {\n  routes: TypedRoutes[];\n  showGroupName?: boolean;\n}\n\ninterface RoutePillProps {\n  route: Route | EnhancedRoute;\n}\n\nconst busName = (name: string): string =>\n  name.startsWith(\"SL\") ? \"silver-line\" : \"bus\";\n\nconst modeNameForBg = ({ name, type }: EnhancedRoute | Route): string => {\n  switch (type) {\n    case 0:\n    case 1:\n      return routeToCSSClass(name);\n    case 2:\n      return \"commuter-rail\";\n    case 4:\n      return \"ferry\";\n    default:\n      return busName(name);\n  }\n};\n\nexport const modeBgClass = (route: EnhancedRoute | Route): string =>\n  `u-bg--${modeNameForBg(route)}`;\n\nconst RoutePill = ({ route }: RoutePillProps): ReactElement<HTMLElement> => (\n  <a\n    href={`/schedules/${route.id}`}\n    className={`\n      m-stop-page__header-feature\n      m-stop-page__header-description\n      u-small-caps\n      ${modeBgClass(route)}\n    `}\n  >\n    {breakTextAtSlash(route.name)}\n  </a>\n);\n\nconst RoutePillList = ({\n  routes,\n  showGroupName\n}: RoutePillListProps): ReactElement<HTMLElement> => (\n  <div className=\"m-route-pills\">\n    {routes.map(typedRoute => (\n      <div\n        key={typedRoute.group_name}\n        className={`m-route-pills--${typedRoute.group_name}`}\n      >\n        {showGroupName && <h4 className=\"h4\">{typedRoute.group_name}</h4>}\n        {typedRoute.routes.map(routeWithDirections => (\n          <RoutePill\n            key={routeWithDirections.route.id}\n            route={routeWithDirections.route}\n          />\n        ))}\n      </div>\n    ))}\n  </div>\n);\n\nexport default RoutePillList;\n","import { Reducer, createStore, Store } from \"redux\";\nimport { StoreAction, SelectedOrigin } from \"../components/__schedule\";\nimport { DirectionId } from \"../../__v3api\";\nimport { Mode as ModalMode } from \"../components/schedule-finder/ScheduleFinderModal\";\n\nexport interface StoreProps {\n  selectedDirection: DirectionId;\n  selectedOrigin: SelectedOrigin | \"\";\n  modalOpen: boolean;\n  modalMode: ModalMode;\n}\n\ninterface ActionData {\n  selectedDirection?: DirectionId;\n  selectedOrigin?: SelectedOrigin | \"\";\n  modalOpen?: boolean;\n  modalMode?: ModalMode;\n}\n\nexport interface Action {\n  type: StoreAction;\n  newStoreValues: ActionData;\n}\n\nexport const scheduleStoreReducer: Reducer<StoreProps, Action> = (\n  state: StoreProps | undefined,\n  action: Action\n): StoreProps => {\n  const newState: StoreProps = Object.assign(\n    {\n      selectedDirection: undefined,\n      selectedOrigin: undefined,\n      modalOpen: false,\n      modalMode: \"schedule\"\n    },\n    state\n  );\n\n  switch (action.type) {\n    case \"INITIALIZE\":\n      return { ...newState, ...action.newStoreValues };\n    case \"CHANGE_DIRECTION\":\n      return {\n        ...newState,\n        selectedDirection: action.newStoreValues.selectedDirection!,\n        selectedOrigin: action.newStoreValues.selectedOrigin!\n      };\n    case \"CHANGE_ORIGIN\":\n      return {\n        ...newState,\n        selectedOrigin: action.newStoreValues.selectedOrigin!\n      };\n    case \"OPEN_MODAL\":\n      return {\n        ...newState,\n        modalMode: action.newStoreValues.modalMode!,\n        modalOpen: true\n      };\n    case \"CLOSE_MODAL\":\n      return {\n        ...newState,\n        modalOpen: false\n      };\n    default:\n      return newState;\n  }\n};\n\nexport const createScheduleStore = (directionId: DirectionId): Store =>\n  // create store with preloadedState:\n  createStore(scheduleStoreReducer, {\n    selectedDirection: directionId,\n    selectedOrigin: \"\",\n    modalOpen: false,\n    modalMode: \"schedule\"\n  });\n\n// initial 'dummy' value (will be overwritten when schedule-loader loads)\nexport const store: Store = createScheduleStore(0);\n\nexport const getCurrentState = (): StoreProps => store.getState();\n\nexport const storeHandler = (newValues: Action): void => {\n  store.dispatch(newValues);\n};\n\nexport const mapStateToProps = (state: StoreProps): StoreProps => ({\n  ...state\n});\n\nexport default mapStateToProps;\n","import { updateInLocation } from \"use-query-params\";\nimport { DirectionId, Shape } from \"../../../__v3api\";\nimport {\n  ShapesById,\n  RoutePatternsByDirection,\n  EnhancedRoutePattern\n} from \"../__schedule\";\nimport { MapData } from \"../../../leaflet/components/__mapdata\";\n\nexport interface State {\n  routePattern: EnhancedRoutePattern;\n  shape: Shape;\n  directionId: DirectionId;\n  shapesById: ShapesById;\n  routePatternsByDirection: RoutePatternsByDirection;\n  routePatternMenuOpen: boolean;\n  routePatternMenuAll: boolean;\n  itemFocus: string | null;\n}\n\nexport interface Payload {\n  routePattern?: EnhancedRoutePattern;\n}\n\nexport const toggleDirectionAction = (): MenuAction => ({\n  type: \"toggleDirection\"\n});\n\nexport const setRoutePatternAction = (\n  routePattern: EnhancedRoutePattern\n): MenuAction => ({\n  type: \"setRoutePattern\",\n  payload: { routePattern }\n});\n\nexport const toggleRoutePatternMenuAction = (): MenuAction => ({\n  type: \"toggleRoutePatternMenu\"\n});\n\nexport const closeRoutePatternMenuAction = (): MenuAction => ({\n  type: \"closeRoutePatternMenu\"\n});\n\nexport const showAllRoutePatternsAction = (): MenuAction => ({\n  type: \"showAllRoutePatterns\"\n});\n\nexport interface MenuAction {\n  type:\n    | \"toggleDirection\"\n    | \"setRoutePattern\"\n    | \"toggleRoutePatternMenu\"\n    | \"closeRoutePatternMenu\"\n    | \"showAllRoutePatterns\";\n  payload?: Payload;\n}\n\nexport type FetchAction =\n  | { type: \"FETCH_COMPLETE\"; payload: MapData[] }\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\nconst updateDirectionAndVariantInURL = (\n  directionId: DirectionId,\n  routePatternId: string\n): void => {\n  const query = {\n    // eslint-disable-next-line camelcase\n    \"schedule_direction[direction_id]\": directionId.toString(),\n    \"schedule_direction[variant]\": routePatternId\n  };\n  const newLoc = updateInLocation(query, window.location);\n  // newLoc is not a true Location, so toString doesn't work\n  window.history.replaceState({}, \"\", `${newLoc.pathname}${newLoc.search}`);\n};\n\nconst toggleDirection = (state: State): State => {\n  const nextDirection = state.directionId === 0 ? 1 : 0;\n\n  // attempt to find the same route pattern for the opposite direction\n  const possibleNextRoutePattern = `${state.routePattern.id.slice(\n    0,\n    -1\n  )}${nextDirection}`;\n\n  const nextRoutePattern = state.routePatternsByDirection[nextDirection].find(\n    element => element.id === possibleNextRoutePattern\n  );\n\n  const defaultRoutePatternForDirection =\n    nextRoutePattern || state.routePatternsByDirection[nextDirection][0];\n\n  updateDirectionAndVariantInURL(\n    nextDirection,\n    defaultRoutePatternForDirection.id\n  );\n  return {\n    ...state,\n    directionId: nextDirection,\n    routePattern: defaultRoutePatternForDirection,\n    shape: state.shapesById[defaultRoutePatternForDirection.shape_id],\n    itemFocus: \"first\"\n  };\n};\n\nconst toggleRoutePatternMenu = (state: State): State => ({\n  ...state,\n  routePatternMenuOpen: !state.routePatternMenuOpen,\n  itemFocus: \"first\"\n});\n\nconst setRoutePattern = (state: State, data: Payload): State => {\n  const newRoutePattern = data!.routePattern!;\n  updateDirectionAndVariantInURL(state.directionId, newRoutePattern.id);\n  return {\n    ...state,\n    routePattern: newRoutePattern,\n    shape: state.shapesById[newRoutePattern.shape_id],\n    routePatternMenuOpen: false,\n    itemFocus: null\n  };\n};\n\nconst showAllRoutePatterns = (state: State): State => ({\n  ...state,\n  routePatternMenuAll: true,\n  itemFocus: \"first-uncommon\"\n});\n\nexport const menuReducer = (state: State, action: MenuAction): State => {\n  switch (action.type) {\n    case \"toggleDirection\":\n      return toggleDirection(state);\n\n    case \"toggleRoutePatternMenu\":\n      return toggleRoutePatternMenu(state);\n\n    case \"showAllRoutePatterns\":\n      return showAllRoutePatterns(state);\n\n    case \"closeRoutePatternMenu\":\n      return {\n        ...state,\n        routePatternMenuOpen: false,\n        itemFocus: null\n      };\n\n    case \"setRoutePattern\":\n      return setRoutePattern(state, action.payload!);\n\n    /* istanbul ignore next */\n    default:\n      return state;\n  }\n};\n","import React from \"react\";\nimport { CrowdingType } from \"../__schedule\";\nimport { crowdingIcon } from \"../../../helpers/icon\";\nimport { crowdingDescriptions } from \"../../../models/vehicle\";\n\nconst CrowdingPill = ({\n  crowding\n}: {\n  crowding: CrowdingType;\n}): JSX.Element | null => {\n  if (!crowding) return null;\n\n  return (\n    <div\n      className={`u-small-caps u-bold c-crowding-pill c-crowding-pill--${crowding}`}\n    >\n      {crowdingIcon(`c-icon__crowding--${crowding}`)}\n      <span className=\"c-crowding-pill__label\">\n        {crowdingDescriptions(crowding)}\n      </span>\n    </div>\n  );\n};\n\nexport default CrowdingPill;\n","import React, { ReactElement } from \"react\";\nimport { DirectionId, Route } from \"../../../__v3api\";\nimport {\n  SimpleStopMap,\n  RoutePatternsByDirection,\n  ServiceInSelector,\n  ScheduleNote as ScheduleNoteType,\n  SelectedOrigin\n} from \"../__schedule\";\nimport Modal from \"../../../components/Modal\";\nimport OriginModalContent from \"./OriginModalContent\";\nimport ScheduleModalContent from \"./ScheduleModalContent\";\n\nexport type Mode = \"origin\" | \"schedule\";\n\ninterface Props {\n  closeModal: () => void;\n  directionChanged?: (direction: DirectionId) => void;\n  initialMode: Mode;\n  initialDirection: DirectionId;\n  initialOrigin: SelectedOrigin;\n  originChanged?: (origin: SelectedOrigin) => void;\n  route: Route;\n  routePatternsByDirection: RoutePatternsByDirection;\n  scheduleNote: ScheduleNoteType | null;\n  services: ServiceInSelector[];\n  stops: SimpleStopMap;\n  today: string;\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n  handleOriginSelectClick: () => void;\n}\n\nexport default ({\n  closeModal,\n  directionChanged,\n  initialMode,\n  initialDirection,\n  initialOrigin,\n  originChanged,\n  route,\n  routePatternsByDirection,\n  scheduleNote,\n  services,\n  stops,\n  today,\n  updateURL,\n  handleOriginSelectClick\n}: Props): ReactElement => {\n  const handleChangeDirection = (newDirection: DirectionId): void => {\n    if (directionChanged) directionChanged(newDirection);\n    if (originChanged) originChanged(null);\n    updateURL(initialOrigin, newDirection);\n  };\n\n  const handleChangeOrigin = (newOrigin: SelectedOrigin): void => {\n    if (originChanged) originChanged(newOrigin);\n    updateURL(newOrigin, initialDirection);\n  };\n\n  const originModalContent = (): ReactElement => {\n    const origin = initialOrigin;\n    const direction = initialDirection;\n    return (\n      <OriginModalContent\n        handleChangeOrigin={handleChangeOrigin}\n        selectedOrigin={origin}\n        stops={stops[direction] || []}\n      />\n    );\n  };\n\n  const scheduleModalContent = (scheduleOrigin: string): ReactElement => (\n    <ScheduleModalContent\n      handleChangeDirection={handleChangeDirection}\n      handleChangeOrigin={handleChangeOrigin}\n      handleOriginSelectClick={handleOriginSelectClick}\n      route={route}\n      routePatternsByDirection={routePatternsByDirection}\n      scheduleNote={scheduleNote}\n      selectedDirection={initialDirection}\n      selectedOrigin={scheduleOrigin}\n      services={services}\n      stops={stops}\n      today={today}\n    />\n  );\n\n  const direction = initialDirection;\n  const origin = initialOrigin;\n\n  return (\n    <Modal\n      focusElementId={\n        initialMode === \"origin\" ? \"origin-filter\" : \"modal-close\"\n      }\n      ariaLabel={{\n        label:\n          initialMode === \"origin\"\n            ? \"Choose Origin Stop\"\n            : `Schedules to ${route.direction_names[direction]}`\n      }}\n      className={\n        initialMode === \"origin\" ? \"schedule-finder__origin-modal\" : \"\"\n      }\n      closeModal={closeModal}\n    >\n      {initialMode === \"origin\" && originModalContent()}\n      {initialMode === \"schedule\" &&\n        origin !== null &&\n        scheduleModalContent(origin)}\n    </Modal>\n  );\n};\n","export type fetchAction =\n  // @ts-ignore should add a generic here\n  | { type: \"FETCH_COMPLETE\"; payload: any } // eslint-disable-line\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\nexport interface State {\n  // @ts-ignore should add a generic\n  data: any | null; // eslint-disable-line\n  isLoading: boolean;\n  error: boolean;\n}\n\nexport const reducer = (state: State, action: fetchAction): State => {\n  switch (action.type) {\n    case \"FETCH_STARTED\":\n      return { ...state, isLoading: true, error: false, data: null };\n    case \"FETCH_COMPLETE\":\n      return { ...state, data: action.payload, isLoading: false, error: false };\n    case \"FETCH_ERROR\":\n      return { ...state, error: true, isLoading: false };\n    default:\n      return state;\n  }\n};\n","import React, { ReactElement } from \"react\";\n\nconst Loading = (): ReactElement<HTMLElement> => (\n  <div className=\"c-spinner__container\">\n    <div className=\"c-spinner\">Loading...</div>\n  </div>\n);\n\nexport default Loading;\n","import React, { ReactElement, useContext } from \"react\";\nimport { LineDiagramStop, RouteStop } from \"../__schedule\";\nimport { isACommuterRailRoute, isAGreenLineRoute } from \"../../../models/route\";\nimport { LiveData } from \"./__line-diagram\";\nimport { isMergeStop, diagramWidth } from \"./line-diagram-helpers\";\nimport StopConnections from \"./StopConnections\";\nimport StopPredictions from \"./StopPredictions\";\nimport { hasPredictionTime } from \"../../../models/prediction\";\nimport { alertIcon } from \"../../../helpers/icon\";\nimport {\n  isHighSeverityOrHighPriority,\n  isDiversion,\n  isCurrentAlert\n} from \"../../../models/alert\";\nimport { Alert, Route } from \"../../../__v3api\";\nimport MatchHighlight from \"../../../components/MatchHighlight\";\nimport StopFeatures from \"./StopFeatures\";\nimport { StopRefContext } from \"./LineDiagramWithStops\";\nimport { effectNameForAlert } from \"../../../components/Alerts\";\n\ninterface StopCardProps {\n  stop: LineDiagramStop;\n  onClick: (stop: RouteStop) => void;\n  liveData?: LiveData;\n  searchQuery?: string;\n}\n\nconst hasBranchLabel = (stop: LineDiagramStop): boolean =>\n  stop.route_stop[\"is_terminus?\"] &&\n  !!stop.route_stop.branch &&\n  !!stop.route_stop.route;\n\nconst lineName = ({ name, route: routeStopRoute }: RouteStop): string => {\n  const route = routeStopRoute as Route;\n  const title = isAGreenLineRoute(route)\n    ? `Green Line ${route.id.split(\"-\")[1]}`\n    : name;\n  const lineOrBranch = isACommuterRailRoute(route) ? \"Line\" : \"Branch\";\n  return `${title} ${lineOrBranch}`;\n};\n\nconst MaybeAlert = (alerts: Alert[]): JSX.Element | null => {\n  const highPriorityAlerts = alerts.filter(isHighSeverityOrHighPriority);\n  if (highPriorityAlerts.length === 0) return null;\n  return (\n    <>\n      {alertIcon(\"c-svg__icon-alerts-triangle\")}\n      <span className=\"sr-only\">Service alert or delay</span>\n      &nbsp;\n    </>\n  );\n};\n\nconst StopCard = (props: StopCardProps): ReactElement<HTMLElement> => {\n  const { stop, onClick, liveData, searchQuery } = props;\n  const {\n    stop_data: stopData,\n    route_stop: routeStop,\n    alerts: stopAlerts,\n    route_stop: { \"is_beginning?\": isOrigin, \"is_terminus?\": isTerminus }\n  } = stop;\n\n  const isDestination = !isOrigin && isTerminus;\n  const width = isMergeStop(stop)\n    ? diagramWidth(1)\n    : diagramWidth(stopData.length);\n  const refs = useContext(StopRefContext)[0];\n\n  const diversionAlert = stopAlerts.find(\n    alert => isDiversion(alert) && isCurrentAlert(alert)\n  );\n  const hasLivePredictions =\n    liveData &&\n    liveData.headsigns.length &&\n    liveData.headsigns.some(hasPredictionTime);\n  const showPrediction = hasLivePredictions && !isDestination;\n  const showDiversion =\n    diversionAlert && !(hasLivePredictions && isDestination);\n\n  return (\n    <li\n      className=\"m-schedule-diagram__stop\"\n      style={{ paddingLeft: searchQuery ? \"0.5rem\" : `${width}px` }}\n    >\n      <section className=\"m-schedule-diagram__content\">\n        {hasBranchLabel(stop) && (\n          <div className=\"u-bold u-small-caps\">{lineName(routeStop)}</div>\n        )}\n        <header\n          className=\"m-schedule-diagram__stop-heading\"\n          ref={refs[routeStop.id]}\n        >\n          <h4 className=\"m-schedule-diagram__stop-link\">\n            <a href={`/stops/${routeStop.id}`}>\n              {MaybeAlert(stopAlerts)}\n              <MatchHighlight text={routeStop.name} matchQuery={searchQuery} />\n            </a>\n          </h4>\n          {StopFeatures(routeStop)}\n        </header>\n\n        <div className=\"m-schedule-diagram__stop-details\">\n          {StopConnections(routeStop.connections)}\n          {showPrediction ? (\n            <StopPredictions\n              headsigns={liveData!.headsigns}\n              isCommuterRail={\n                !!routeStop.route && isACommuterRailRoute(routeStop.route)\n              }\n            />\n          ) : (\n            showDiversion && (\n              <div\n                key={diversionAlert!.id}\n                className=\"m-schedule-diagram__alert\"\n              >\n                {effectNameForAlert(diversionAlert!)}\n              </div>\n            )\n          )}\n        </div>\n\n        <footer className=\"m-schedule-diagram__footer\">\n          <button\n            className=\"btn btn-link\"\n            type=\"button\"\n            onClick={() => onClick(routeStop)}\n          >\n            View schedule\n          </button>\n        </footer>\n      </section>\n    </li>\n  );\n};\n\nexport default StopCard;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Phoenix=t():e.Phoenix=t()}(this,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=0)}([function(e,t,n){(function(t){e.exports=t.Phoenix=n(2)}).call(this,n(1))},function(e,t){var n;n=function(){return this}();try{n=n||Function(\"return this\")()||(0,eval)(\"this\")}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){\"use strict\";function i(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}function o(e){return(o=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,o=!1,r=void 0;try{for(var s,a=e[Symbol.iterator]();!(i=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){o=!0,r=e}finally{try{i||null==a.return||a.return()}finally{if(o)throw r}}return n}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}()}function s(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function c(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}n.r(t),n.d(t,\"Channel\",function(){return b}),n.d(t,\"Socket\",function(){return R}),n.d(t,\"LongPoll\",function(){return w}),n.d(t,\"Ajax\",function(){return C}),n.d(t,\"Presence\",function(){return S});var u=\"undefined\"!=typeof self?self:null,h=\"undefined\"!=typeof window?window:null,l=u||h||void 0,f={connecting:0,open:1,closing:2,closed:3},p=1e4,d={closed:\"closed\",errored:\"errored\",joined:\"joined\",joining:\"joining\",leaving:\"leaving\"},v={close:\"phx_close\",error:\"phx_error\",join:\"phx_join\",reply:\"phx_reply\",leave:\"phx_leave\"},y=[v.close,v.error,v.join,v.reply,v.leave],g={longpoll:\"longpoll\",websocket:\"websocket\"},m=function(e){if(\"function\"==typeof e)return e;return function(){return e}},k=function(){function e(t,n,i,o){s(this,e),this.channel=t,this.event=n,this.payload=i||function(){return{}},this.receivedResp=null,this.timeout=o,this.timeoutTimer=null,this.recHooks=[],this.sent=!1}return c(e,[{key:\"resend\",value:function(e){this.timeout=e,this.reset(),this.send()}},{key:\"send\",value:function(){this.hasReceived(\"timeout\")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}},{key:\"receive\",value:function(e,t){return this.hasReceived(e)&&t(this.receivedResp.response),this.recHooks.push({status:e,callback:t}),this}},{key:\"reset\",value:function(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}},{key:\"matchReceive\",value:function(e){var t=e.status,n=e.response;e.ref;this.recHooks.filter(function(e){return e.status===t}).forEach(function(e){return e.callback(n)})}},{key:\"cancelRefEvent\",value:function(){this.refEvent&&this.channel.off(this.refEvent)}},{key:\"cancelTimeout\",value:function(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}},{key:\"startTimeout\",value:function(){var e=this;this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,function(t){e.cancelRefEvent(),e.cancelTimeout(),e.receivedResp=t,e.matchReceive(t)}),this.timeoutTimer=setTimeout(function(){e.trigger(\"timeout\",{})},this.timeout)}},{key:\"hasReceived\",value:function(e){return this.receivedResp&&this.receivedResp.status===e}},{key:\"trigger\",value:function(e,t){this.channel.trigger(this.refEvent,{status:e,response:t})}}]),e}(),b=function(){function e(t,n,i){var o=this;s(this,e),this.state=d.closed,this.topic=t,this.params=m(n||{}),this.socket=i,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new k(this,v.join,this.params,this.timeout),this.pushBuffer=[],this.rejoinTimer=new T(function(){return o.rejoinUntilConnected()},this.socket.reconnectAfterMs),this.joinPush.receive(\"ok\",function(){o.state=d.joined,o.rejoinTimer.reset(),o.pushBuffer.forEach(function(e){return e.send()}),o.pushBuffer=[]}),this.onClose(function(){o.rejoinTimer.reset(),o.socket.hasLogger()&&o.socket.log(\"channel\",\"close \".concat(o.topic,\" \").concat(o.joinRef())),o.state=d.closed,o.socket.remove(o)}),this.onError(function(e){o.isLeaving()||o.isClosed()||(o.socket.hasLogger()&&o.socket.log(\"channel\",\"error \".concat(o.topic),e),o.state=d.errored,o.rejoinTimer.scheduleTimeout())}),this.joinPush.receive(\"timeout\",function(){o.isJoining()&&(o.socket.hasLogger()&&o.socket.log(\"channel\",\"timeout \".concat(o.topic,\" (\").concat(o.joinRef(),\")\"),o.joinPush.timeout),new k(o,v.leave,m({}),o.timeout).send(),o.state=d.errored,o.joinPush.reset(),o.rejoinTimer.scheduleTimeout())}),this.on(v.reply,function(e,t){o.trigger(o.replyEventName(t),e)})}return c(e,[{key:\"rejoinUntilConnected\",value:function(){this.rejoinTimer.scheduleTimeout(),this.socket.isConnected()&&this.rejoin()}},{key:\"join\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;if(this.joinedOnce)throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");return this.joinedOnce=!0,this.rejoin(e),this.joinPush}},{key:\"onClose\",value:function(e){this.on(v.close,e)}},{key:\"onError\",value:function(e){return this.on(v.error,function(t){return e(t)})}},{key:\"on\",value:function(e,t){var n=this.bindingRef++;return this.bindings.push({event:e,ref:n,callback:t}),n}},{key:\"off\",value:function(e,t){this.bindings=this.bindings.filter(function(n){return!(n.event===e&&(void 0===t||t===n.ref))})}},{key:\"canPush\",value:function(){return this.socket.isConnected()&&this.isJoined()}},{key:\"push\",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.timeout;if(!this.joinedOnce)throw new Error(\"tried to push '\".concat(e,\"' to '\").concat(this.topic,\"' before joining. Use channel.join() before pushing events\"));var i=new k(this,e,function(){return t},n);return this.canPush()?i.send():(i.startTimeout(),this.pushBuffer.push(i)),i}},{key:\"leave\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.state=d.leaving;var n=function(){e.socket.hasLogger()&&e.socket.log(\"channel\",\"leave \".concat(e.topic)),e.trigger(v.close,\"leave\")},i=new k(this,v.leave,m({}),t);return i.receive(\"ok\",function(){return n()}).receive(\"timeout\",function(){return n()}),i.send(),this.canPush()||i.trigger(\"ok\",{}),i}},{key:\"onMessage\",value:function(e,t,n){return t}},{key:\"isLifecycleEvent\",value:function(e){return y.indexOf(e)>=0}},{key:\"isMember\",value:function(e,t,n,i){return this.topic===e&&(!i||i===this.joinRef()||!this.isLifecycleEvent(t)||(this.socket.hasLogger()&&this.socket.log(\"channel\",\"dropping outdated message\",{topic:e,event:t,payload:n,joinRef:i}),!1))}},{key:\"joinRef\",value:function(){return this.joinPush.ref}},{key:\"sendJoin\",value:function(e){this.state=d.joining,this.joinPush.resend(e)}},{key:\"rejoin\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.isLeaving()||this.sendJoin(e)}},{key:\"trigger\",value:function(e,t,n,i){var o=this.onMessage(e,t,n,i);if(t&&!o)throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");for(var r=0;r<this.bindings.length;r++){var s=this.bindings[r];s.event===e&&s.callback(o,n,i||this.joinRef())}}},{key:\"replyEventName\",value:function(e){return\"chan_reply_\".concat(e)}},{key:\"isClosed\",value:function(){return this.state===d.closed}},{key:\"isErrored\",value:function(){return this.state===d.errored}},{key:\"isJoined\",value:function(){return this.state===d.joined}},{key:\"isJoining\",value:function(){return this.state===d.joining}},{key:\"isLeaving\",value:function(){return this.state===d.leaving}}]),e}(),j={encode:function(e,t){var n=[e.join_ref,e.ref,e.topic,e.event,e.payload];return t(JSON.stringify(n))},decode:function(e,t){var n=r(JSON.parse(e),5);return t({join_ref:n[0],ref:n[1],topic:n[2],event:n[3],payload:n[4]})}},R=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e),this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.timeout=i.timeout||p,this.transport=i.transport||l.WebSocket||w,this.defaultEncoder=j.encode,this.defaultDecoder=j.decode,this.transport!==w?(this.encode=i.encode||this.defaultEncoder,this.decode=i.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder),this.heartbeatIntervalMs=i.heartbeatIntervalMs||3e4,this.reconnectAfterMs=i.reconnectAfterMs||function(e){return[1e3,2e3,5e3,1e4][e-1]||1e4},this.logger=i.logger||null,this.longpollerTimeout=i.longpollerTimeout||2e4,this.params=m(i.params||{}),this.endPoint=\"\".concat(t,\"/\").concat(g.websocket),this.heartbeatTimer=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new T(function(){n.teardown(function(){return n.connect()})},this.reconnectAfterMs)}return c(e,[{key:\"protocol\",value:function(){return location.protocol.match(/^https/)?\"wss\":\"ws\"}},{key:\"endPointURL\",value:function(){var e=C.appendParams(C.appendParams(this.endPoint,this.params()),{vsn:\"2.0.0\"});return\"/\"!==e.charAt(0)?e:\"/\"===e.charAt(1)?\"\".concat(this.protocol(),\":\").concat(e):\"\".concat(this.protocol(),\"://\").concat(location.host).concat(e)}},{key:\"disconnect\",value:function(e,t,n){this.reconnectTimer.reset(),this.teardown(e,t,n)}},{key:\"connect\",value:function(e){var t=this;e&&(console&&console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\"),this.params=m(e)),this.conn||(this.conn=new this.transport(this.endPointURL()),this.conn.timeout=this.longpollerTimeout,this.conn.onopen=function(){return t.onConnOpen()},this.conn.onerror=function(e){return t.onConnError(e)},this.conn.onmessage=function(e){return t.onConnMessage(e)},this.conn.onclose=function(e){return t.onConnClose(e)})}},{key:\"log\",value:function(e,t,n){this.logger(e,t,n)}},{key:\"hasLogger\",value:function(){return null!==this.logger}},{key:\"onOpen\",value:function(e){this.stateChangeCallbacks.open.push(e)}},{key:\"onClose\",value:function(e){this.stateChangeCallbacks.close.push(e)}},{key:\"onError\",value:function(e){this.stateChangeCallbacks.error.push(e)}},{key:\"onMessage\",value:function(e){this.stateChangeCallbacks.message.push(e)}},{key:\"onConnOpen\",value:function(){this.hasLogger()&&this.log(\"transport\",\"connected to \".concat(this.endPointURL())),this.flushSendBuffer(),this.reconnectTimer.reset(),this.resetHeartbeat(),this.stateChangeCallbacks.open.forEach(function(e){return e()})}},{key:\"resetHeartbeat\",value:function(){var e=this;this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(function(){return e.sendHeartbeat()},this.heartbeatIntervalMs))}},{key:\"teardown\",value:function(e,t,n){this.conn&&(this.conn.onclose=function(){},t?this.conn.close(t,n||\"\"):this.conn.close(),this.conn=null),e&&e()}},{key:\"onConnClose\",value:function(e){this.hasLogger()&&this.log(\"transport\",\"close\",e),this.triggerChanError(),clearInterval(this.heartbeatTimer),e&&1e3!==e.code&&this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(function(t){return t(e)})}},{key:\"onConnError\",value:function(e){this.hasLogger()&&this.log(\"transport\",e),this.triggerChanError(),this.stateChangeCallbacks.error.forEach(function(t){return t(e)})}},{key:\"triggerChanError\",value:function(){this.channels.forEach(function(e){return e.trigger(v.error)})}},{key:\"connectionState\",value:function(){switch(this.conn&&this.conn.readyState){case f.connecting:return\"connecting\";case f.open:return\"open\";case f.closing:return\"closing\";default:return\"closed\"}}},{key:\"isConnected\",value:function(){return\"open\"===this.connectionState()}},{key:\"remove\",value:function(e){this.channels=this.channels.filter(function(t){return t.joinRef()!==e.joinRef()})}},{key:\"channel\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new b(e,t,this);return this.channels.push(n),n}},{key:\"push\",value:function(e){var t=this;if(this.hasLogger()){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;this.log(\"push\",\"\".concat(n,\" \").concat(i,\" (\").concat(s,\", \").concat(r,\")\"),o)}this.isConnected()?this.encode(e,function(e){return t.conn.send(e)}):this.sendBuffer.push(function(){return t.encode(e,function(e){return t.conn.send(e)})})}},{key:\"makeRef\",value:function(){var e=this.ref+1;return e===this.ref?this.ref=0:this.ref=e,this.ref.toString()}},{key:\"sendHeartbeat\",value:function(){if(this.isConnected()){if(this.pendingHeartbeatRef)return this.pendingHeartbeatRef=null,this.hasLogger()&&this.log(\"transport\",\"heartbeat timeout. Attempting to re-establish connection\"),void this.conn.close(1e3,\"hearbeat timeout\");this.pendingHeartbeatRef=this.makeRef(),this.push({topic:\"phoenix\",event:\"heartbeat\",payload:{},ref:this.pendingHeartbeatRef})}}},{key:\"flushSendBuffer\",value:function(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(function(e){return e()}),this.sendBuffer=[])}},{key:\"onConnMessage\",value:function(e){var t=this;this.decode(e.data,function(e){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;r&&r===t.pendingHeartbeatRef&&(t.pendingHeartbeatRef=null),t.hasLogger()&&t.log(\"receive\",\"\".concat(o.status||\"\",\" \").concat(n,\" \").concat(i,\" \").concat(r&&\"(\"+r+\")\"||\"\"),o);for(var a=0;a<t.channels.length;a++){var c=t.channels[a];c.isMember(n,i,o,s)&&c.trigger(i,o,r,s)}for(var u=0;u<t.stateChangeCallbacks.message.length;u++)t.stateChangeCallbacks.message[u](e)})}}]),e}(),w=function(){function e(t){s(this,e),this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=f.connecting,this.poll()}return c(e,[{key:\"normalizeEndpoint\",value:function(e){return e.replace(\"ws://\",\"http://\").replace(\"wss://\",\"https://\").replace(new RegExp(\"(.*)/\"+g.websocket),\"$1/\"+g.longpoll)}},{key:\"endpointURL\",value:function(){return C.appendParams(this.pollEndpoint,{token:this.token})}},{key:\"closeAndRetry\",value:function(){this.close(),this.readyState=f.connecting}},{key:\"ontimeout\",value:function(){this.onerror(\"timeout\"),this.closeAndRetry()}},{key:\"poll\",value:function(){var e=this;this.readyState!==f.open&&this.readyState!==f.connecting||C.request(\"GET\",this.endpointURL(),\"application/json\",null,this.timeout,this.ontimeout.bind(this),function(t){if(t){var n=t.status,i=t.token,o=t.messages;e.token=i}else n=0;switch(n){case 200:o.forEach(function(t){return e.onmessage({data:t})}),e.poll();break;case 204:e.poll();break;case 410:e.readyState=f.open,e.onopen(),e.poll();break;case 0:case 500:e.onerror(),e.closeAndRetry();break;default:throw new Error(\"unhandled poll status \".concat(n))}})}},{key:\"send\",value:function(e){var t=this;C.request(\"POST\",this.endpointURL(),\"application/json\",e,this.timeout,this.onerror.bind(this,\"timeout\"),function(e){e&&200===e.status||(t.onerror(e&&e.status),t.closeAndRetry())})}},{key:\"close\",value:function(e,t){this.readyState=f.closed,this.onclose()}}]),e}(),C=function(){function e(){s(this,e)}return c(e,null,[{key:\"request\",value:function(e,t,n,i,o,r,s){if(l.XDomainRequest){var a=new XDomainRequest;this.xdomainRequest(a,e,t,i,o,r,s)}else{var c=l.XMLHttpRequest?new l.XMLHttpRequest:new ActiveXObject(\"Microsoft.XMLHTTP\");this.xhrRequest(c,e,t,n,i,o,r,s)}}},{key:\"xdomainRequest\",value:function(e,t,n,i,o,r,s){var a=this;e.timeout=o,e.open(t,n),e.onload=function(){var t=a.parseJSON(e.responseText);s&&s(t)},r&&(e.ontimeout=r),e.onprogress=function(){},e.send(i)}},{key:\"xhrRequest\",value:function(e,t,n,i,o,r,s,a){var c=this;e.open(t,n,!0),e.timeout=r,e.setRequestHeader(\"Content-Type\",i),e.onerror=function(){a&&a(null)},e.onreadystatechange=function(){if(e.readyState===c.states.complete&&a){var t=c.parseJSON(e.responseText);a(t)}},s&&(e.ontimeout=s),e.send(o)}},{key:\"parseJSON\",value:function(e){if(!e||\"\"===e)return null;try{return JSON.parse(e)}catch(t){return console&&console.log(\"failed to parse JSON response\",e),null}}},{key:\"serialize\",value:function(e,t){var n=[];for(var i in e)if(e.hasOwnProperty(i)){var r=t?\"\".concat(t,\"[\").concat(i,\"]\"):i,s=e[i];\"object\"===o(s)?n.push(this.serialize(s,r)):n.push(encodeURIComponent(r)+\"=\"+encodeURIComponent(s))}return n.join(\"&\")}},{key:\"appendParams\",value:function(e,t){if(0===Object.keys(t).length)return e;var n=e.match(/\\?/)?\"&\":\"?\";return\"\".concat(e).concat(n).concat(this.serialize(t))}}]),e}();C.states={complete:4};var S=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e);var o=i.events||{state:\"presence_state\",diff:\"presence_diff\"};this.state={},this.pendingDiffs=[],this.channel=t,this.joinRef=null,this.caller={onJoin:function(){},onLeave:function(){},onSync:function(){}},this.channel.on(o.state,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.joinRef=n.channel.joinRef(),n.state=e.syncState(n.state,t,o,r),n.pendingDiffs.forEach(function(t){n.state=e.syncDiff(n.state,t,o,r)}),n.pendingDiffs=[],s()}),this.channel.on(o.diff,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.inPendingSyncState()?n.pendingDiffs.push(t):(n.state=e.syncDiff(n.state,t,o,r),s())})}return c(e,[{key:\"onJoin\",value:function(e){this.caller.onJoin=e}},{key:\"onLeave\",value:function(e){this.caller.onLeave=e}},{key:\"onSync\",value:function(e){this.caller.onSync=e}},{key:\"list\",value:function(t){return e.list(this.state,t)}},{key:\"inPendingSyncState\",value:function(){return!this.joinRef||this.joinRef!==this.channel.joinRef()}}],[{key:\"syncState\",value:function(e,t,n,i){var o=this,r=this.clone(e),s={},a={};return this.map(r,function(e,n){t[e]||(a[e]=n)}),this.map(t,function(e,t){var n=r[e];if(n){var i=t.metas.map(function(e){return e.phx_ref}),c=n.metas.map(function(e){return e.phx_ref}),u=t.metas.filter(function(e){return c.indexOf(e.phx_ref)<0}),h=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0});u.length>0&&(s[e]=t,s[e].metas=u),h.length>0&&(a[e]=o.clone(n),a[e].metas=h)}else s[e]=t}),this.syncDiff(r,{joins:s,leaves:a},n,i)}},{key:\"syncDiff\",value:function(e,t,n,o){var r=t.joins,s=t.leaves,a=this.clone(e);return n||(n=function(){}),o||(o=function(){}),this.map(r,function(e,t){var o=a[e];if(a[e]=t,o){var r,s=a[e].metas.map(function(e){return e.phx_ref}),c=o.metas.filter(function(e){return s.indexOf(e.phx_ref)<0});(r=a[e].metas).unshift.apply(r,i(c))}n(e,o,t)}),this.map(s,function(e,t){var n=a[e];if(n){var i=t.metas.map(function(e){return e.phx_ref});n.metas=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0}),o(e,n,t),0===n.metas.length&&delete a[e]}}),a}},{key:\"list\",value:function(e,t){return t||(t=function(e,t){return t}),this.map(e,function(e,n){return t(e,n)})}},{key:\"map\",value:function(e,t){return Object.getOwnPropertyNames(e).map(function(n){return t(n,e[n])})}},{key:\"clone\",value:function(e){return JSON.parse(JSON.stringify(e))}}]),e}(),T=function(){function e(t,n){s(this,e),this.callback=t,this.timerCalc=n,this.timer=null,this.tries=0}return c(e,[{key:\"reset\",value:function(){this.tries=0,clearTimeout(this.timer)}},{key:\"scheduleTimeout\",value:function(){var e=this;clearTimeout(this.timer),this.timer=setTimeout(function(){e.tries=e.tries+1,e.callback()},this.timerCalc(this.tries+1))}}]),e}()}])});","import {\n  LineDiagramVehicle,\n  CrowdingType\n} from \"../schedule/components/__schedule\";\nimport { RouteType } from \"../__v3api\";\n\n// See also Routes.Route.vehicle_name/1\nexport const vehicleName = (routeType: RouteType): string =>\n  ({\n    0: \"Train\",\n    1: \"Train\",\n    2: \"Train\",\n    3: \"Bus\",\n    4: \"Ferry\"\n  }[routeType]);\n\n// See also VehicleHelpers.realtime_status_text/1\nexport const vehicleRealtimeStatusText = ({\n  status\n}: LineDiagramVehicle): string =>\n  ({\n    // eslint-disable-next-line camelcase\n    in_transit: \"is on the way to\",\n    incoming: \"is arriving at\",\n    stopped: \"has arrived at\"\n  }[status]);\n\nexport const crowdingDescriptions = (crowding: CrowdingType): string =>\n  crowding\n    ? {\n        // eslint-disable-next-line camelcase\n        not_crowded: \"Not crowded\",\n        // eslint-disable-next-line camelcase\n        some_crowding: \"Some crowding\",\n        crowded: \"Crowded\"\n      }[crowding]\n    : \"\";\n","import React, { ReactElement } from \"react\";\nimport {\n  ScheduleNote as ScheduleNoteType,\n  ServiceException\n} from \"./__schedule\";\nimport scheduleIcon from \"../../../static/images/icon-schedule-finder.svg\";\n\nconst service = (serviceTime: string): ReactElement<HTMLElement> => (\n  <p className=\"m-schedule-page__service-note-time\" key={serviceTime}>\n    Trains arrive every {serviceTime}\n  </p>\n);\n\nconst offPeak = (\n  offpeak: string,\n  exceptions: ServiceException[]\n): ReactElement<HTMLElement> => {\n  const except =\n    exceptions.length > 0\n      ? `except ${exceptions.map(e => e.type).join(\", \")}`\n      : \"\";\n  return service(`${offpeak} ${except}`);\n};\n\nconst alternateNote = (alternateText: string): ReactElement<HTMLElement> => (\n  /* eslint-disable react/no-danger */\n  <div className=\"m-schedule-page__schedule-note m-schedule-page__schedule-note--alternate\">\n    <div dangerouslySetInnerHTML={{ __html: alternateText }} />\n  </div> /* eslint-enable react/no-danger */\n);\n\nconst peakOffPeakTimes = ({\n  peakService,\n  offpeakService,\n  exceptions\n}: {\n  peakService: string;\n  offpeakService: string;\n  exceptions: ServiceException[];\n}): ReactElement<HTMLElement> => (\n  <>\n    <div className=\"m-schedule-page__schedule-note\">\n      <h4 className=\"m-schedule-page__service\">Peak Service</h4>\n      <div className=\"m-schedule-page__service-subheading\">\n        Weekdays 7 AM - 9 AM, 4 PM - 6:30 PM\n      </div>\n      {service(peakService)}\n    </div>\n    <div className=\"m-schedule-page__schedule-note\">\n      <h4 className=\"m-schedule-page__service\">Off Peak / Weekends</h4>\n      {offPeak(offpeakService, exceptions)}\n      {exceptions.map(exception =>\n        service(`${exception.service} ${exception.type}`)\n      )}\n    </div>\n    <div className=\"m-schedule-page__note-footer\">\n      Schedules subject to change\n    </div>\n  </>\n);\n\ninterface Props {\n  scheduleNote: ScheduleNoteType;\n  className: string;\n}\n\nconst ScheduleNote = ({\n  scheduleNote: {\n    peak_service: peakService,\n    offpeak_service: offpeakService,\n    exceptions,\n    alternate_text: alternateText\n  },\n  className\n}: Props): ReactElement<HTMLElement> => (\n  <div className={`m-schedule-page__schedule-notes ${className}`}>\n    <h3 className=\"m-schedule-page__schedule-note-title\">\n      <div\n        className=\"m-schedule-page__schedule-note-icon\"\n        dangerouslySetInnerHTML={{ __html: scheduleIcon }} // eslint-disable-line react/no-danger\n      />\n      Schedule Note\n    </h3>\n    {alternateText\n      ? alternateNote(alternateText)\n      : peakOffPeakTimes({ peakService, offpeakService, exceptions })}\n  </div>\n);\n\nexport default ScheduleNote;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" data-name=\\\"Layer 1\\\" viewBox=\\\"0 0 48 48\\\"><title>down arrow</title><defs><clipPath><path d=\\\"M80.17-26.74q19.32-18 19.32-28.68a19.32 19.32 0 00-19.32-19.32 19.32 19.32 0 00-19.32 19.32q0 10.67 19.32 28.68z\\\" class=\\\"cls-1\\\"></path></clipPath><clipPath><path d=\\\"M25-26.74q19.32-18 19.32-28.68A19.32 19.32 0 0025-74.74 19.32 19.32 0 005.64-55.42q0 10.67 19.36 28.68z\\\" class=\\\"cls-1\\\"></path></clipPath><clipPath><path d=\\\"M-42.62-26.74q19.32-18 19.32-28.68a19.32 19.32 0 00-19.32-19.32 19.32 19.32 0 00-19.32 19.32q0 10.67 19.32 28.68z\\\" class=\\\"cls-1\\\"></path></clipPath><style>.cls-1{fill:none;clip-rule:evenodd}</style></defs><title>icon-small-arrow-down</title><path d=\\\"M35.55 19.8l-10.5 10.5a1.45 1.45 0 01-2.1 0l-10.5-10.5a1.44 1.44 0 01-.45-1.05 1.51 1.51 0 011.5-1.5h21a1.51 1.51 0 011.5 1.5 1.44 1.44 0 01-.45 1.05z\\\" fill=\\\"#1c1e23\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>checkmark</title><path d=\\\"M47.13 14.89L24.71 37.32l-4.21 4.21a3 3 0 01-4.21 0l-4.21-4.21L.87 26.11a3 3 0 010-4.22l4.21-4.21a3 3 0 014.21 0l9.11 9.14L38.71 6.47a3 3 0 014.21 0l4.21 4.21a3 3 0 01.87 2.11 3 3 0 01-.87 2.1z\\\"></path></svg>\"","import _, { Dictionary } from \"lodash\";\nimport {\n  Service,\n  DayInteger,\n  ServiceType,\n  ServiceTypicality\n} from \"../__v3api\";\nimport { shortDate, stringToDateObject, dateObjectToString } from \"./date\";\n\nexport enum ServiceGroupNames {\n  HOLIDAY = \"Holiday Schedules\",\n  CURRENT = \"Current Schedules\",\n  FUTURE = \"Future Schedules\",\n  OTHER = \"Other Schedules\"\n}\n\nexport const serviceStartDateComparator = (\n  service1: Service,\n  service2: Service\n): number =>\n  stringToDateObject(service1.start_date).getTime() -\n  stringToDateObject(service2.start_date).getTime();\n\nconst isInRemovedDates = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => service.removed_dates.includes(dateObjectToString(currentDate));\n\nconst isInAddedDates = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => service.added_dates.includes(dateObjectToString(currentDate));\n\nconst isOnValidDay = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => {\n  let currentDay = currentDate.getDay();\n  // different numbering from valid_days for sunday\n  currentDay = currentDay === 0 ? 7 : currentDay;\n  return service.valid_days.includes(currentDay as DayInteger);\n};\n\nexport const isInCurrentService = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => {\n  const serviceStartDate = stringToDateObject(service.start_date);\n  const serviceEndDate = stringToDateObject(service.end_date);\n  return currentDate >= serviceStartDate && currentDate <= serviceEndDate;\n};\n\nexport const isInCurrentRating = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => {\n  if (!service.rating_start_date) {\n    return false;\n  }\n  const ratingStartDate = stringToDateObject(service.rating_start_date!);\n  if (!service.rating_end_date) {\n    // this might be a commuter rail or ferry. treat null rating end as infinite?\n    return currentDate >= ratingStartDate;\n  }\n  const ratingEndDate = stringToDateObject(service.rating_end_date!);\n  return currentDate >= ratingStartDate && currentDate <= ratingEndDate;\n};\n\nexport const isCurrentValidService = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => {\n  // check against added dates\n  if (isInAddedDates(service, currentDate)) {\n    return true;\n  }\n\n  // check against removed dates\n  if (isInRemovedDates(service, currentDate)) {\n    return false;\n  }\n\n  // check on valid_days\n  if (!isOnValidDay(service, currentDate)) {\n    return false;\n  }\n\n  // check within rating dates\n  return (\n    isInCurrentRating(service, currentDate) &&\n    isInCurrentService(service, currentDate)\n  );\n};\n\nexport const startToEnd = (\n  startDateObject: Date,\n  endDateObject: Date\n): string => `${shortDate(startDateObject)} to ${shortDate(endDateObject)}`;\n\nexport const isInFutureService = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => {\n  const serviceStartDate = stringToDateObject(service.start_date);\n  const serviceEndDate = stringToDateObject(service.end_date);\n  return currentDate < serviceStartDate && currentDate < serviceEndDate;\n};\n\nexport const isInFutureRating = (\n  service: Service,\n  currentDate: Date = new Date()\n): boolean => {\n  if (!service.rating_end_date) {\n    if (service.rating_start_date) {\n      return currentDate < stringToDateObject(service.rating_start_date!);\n    }\n    return false;\n  }\n\n  const ratingStartDate = stringToDateObject(service.rating_start_date!);\n  const ratingEndDate = stringToDateObject(service.rating_end_date!);\n  return currentDate < ratingStartDate && currentDate < ratingEndDate;\n};\n\nconst areSimilarServices = (service1: Service, service2: Service): boolean => {\n  const properties = [\n    \"valid_days\",\n    \"typicality\",\n    \"type\",\n    \"rating_start_date\",\n    \"rating_end_date\",\n    \"name\",\n    \"description\"\n  ];\n  return _.every(properties, (p: keyof Service) =>\n    _.isEqual(service2[p], service1[p])\n  );\n};\n\n// If two similar services are present, show only one. Choose the first\n// sequentially (this depends on the input list already being sorted by\n// start_date).\nexport const dedupeServices = (services: Service[]): Service[] =>\n  _.uniqWith(services, areSimilarServices);\n\nexport const groupServicesByDateRating = (\n  services: Service[],\n  currentDate: Date = new Date()\n): Dictionary<Service[]> =>\n  _.groupBy(services, (service: Service) => {\n    if (service.typicality === \"holiday_service\") {\n      return ServiceGroupNames.HOLIDAY;\n    }\n\n    if (service.type === \"other\") {\n      return ServiceGroupNames.OTHER;\n    }\n\n    // if there's no rating end date, this is probably a CR or Ferry\n    // don't use the rating dates in the returned text in that case.\n    // additionally, prioritize current service/rating in grouping\n    if (!service.rating_end_date) {\n      if (\n        isInCurrentService(service, currentDate) ||\n        isInCurrentRating(service, currentDate)\n      ) {\n        return ServiceGroupNames.CURRENT;\n      }\n      if (isInFutureRating(service, currentDate)) {\n        return ServiceGroupNames.FUTURE;\n      }\n    }\n\n    const ratingStartDate = stringToDateObject(service.rating_start_date!);\n    const ratingEndDate = stringToDateObject(service.rating_end_date!);\n\n    if (isInCurrentRating(service, currentDate)) {\n      return `${ServiceGroupNames.CURRENT} (${\n        service.rating_description\n      }, ends ${shortDate(ratingEndDate)})`;\n    }\n\n    if (isInFutureRating(service, currentDate)) {\n      return `${ServiceGroupNames.FUTURE} (${\n        service.rating_description\n      }, starts ${shortDate(ratingStartDate)})`;\n    }\n\n    return ServiceGroupNames.OTHER;\n  });\n\n// sort the option groups\nconst optGroupOrder: { [key: string]: number } = {\n  [ServiceGroupNames.CURRENT]: 4,\n  [ServiceGroupNames.HOLIDAY]: 3,\n  [ServiceGroupNames.FUTURE]: 2,\n  [ServiceGroupNames.OTHER]: 1\n};\n\n// sort the service types\nconst serviceTypeOrder: { [key in ServiceType]: number } = {\n  weekday: 4,\n  saturday: 3,\n  sunday: 2,\n  other: 1\n};\n\n/* eslint-disable camelcase */\n// sort the service typicalities\nconst serviceTypicalityOrder: { [key in ServiceTypicality]: number } = {\n  unplanned_disruption: 4,\n  planned_disruption: 3,\n  holiday_service: 2,\n  extra_service: 1,\n  typical_service: 0,\n  unknown: 0\n};\n/* eslint-enable camelcase */\n\n// enable sorting of services by rating dates,\n// service type, service typicality, and service dates\nexport const serviceComparator = (\n  {\n    type: type1,\n    valid_days: validDays1,\n    typicality: typicality1,\n    start_date: date1\n  }: Service,\n  {\n    type: type2,\n    valid_days: validDays2,\n    typicality: typicality2,\n    start_date: date2\n  }: Service\n): number =>\n  serviceTypeOrder[type2] - serviceTypeOrder[type1] ||\n  validDays1[0] - validDays2[0] ||\n  serviceTypicalityOrder[typicality2] - serviceTypicalityOrder[typicality1] ||\n  stringToDateObject(date1).getTime() - stringToDateObject(date2).getTime();\n\n// group names may have extra verbiage\nexport const optGroupComparator = (groupA: string, groupB: string): number => {\n  const optGroupNames = Object.values(ServiceGroupNames);\n  const a = optGroupNames.find(name => groupA.includes(name));\n  const b = optGroupNames.find(name => groupB.includes(name));\n  return optGroupOrder[b!] - optGroupOrder[a!];\n};\n\nexport const hasMultipleWeekdaySchedules = (services: Service[]): boolean =>\n  services.filter(\n    service =>\n      service.type === \"weekday\" && service.typicality !== \"holiday_service\"\n  ).length > 1;\n\nconst dayIntegerToString = (day: DayInteger): string =>\n  [\n    \"Monday\",\n    \"Tuesday\",\n    \"Wednesday\",\n    \"Thursday\",\n    \"Friday\",\n    \"Saturday\",\n    \"Sunday\"\n  ][day - 1];\n\nconst daysAreConsecutive = (days: DayInteger[]): boolean => {\n  const [day, nextDay, ...rest] = days;\n  if (rest.length === 0) return day + 1 === nextDay;\n  if (day + 1 !== nextDay) return false;\n  return daysAreConsecutive([nextDay, ...rest]);\n};\n\nexport const serviceDays = ({\n  type,\n  valid_days: validDays\n}: Service): string => {\n  if (type === \"saturday\" || type === \"sunday\") return \"\";\n\n  if (validDays.length === 1) return `${dayIntegerToString(validDays[0])}`;\n\n  if (daysAreConsecutive(validDays)) {\n    return validDays[0] === 1 && validDays[validDays.length - 1] === 5\n      ? \"Weekday\"\n      : `${dayIntegerToString(validDays[0])} - ${dayIntegerToString(\n          validDays[validDays.length - 1]\n        )}`;\n  }\n\n  return `${validDays.map(dayIntegerToString).join(\", \")}`;\n};\n","import { useReducer } from \"react\";\n\n/**\n * Fetching comprises a simple state machine flow:\n *\n * NotStarted → Loading → Data\n *                      ↳ Error\n */\n// Exported just for testing\nexport enum FetchStatus {\n  NotStarted = 1,\n  Loading,\n  Data,\n  Error\n}\n\ninterface StartFetchAction {\n  type: \"FETCH_STARTED\";\n}\n\nconst startFetch = (): StartFetchAction => ({ type: \"FETCH_STARTED\" });\n\ninterface CompleteFetchAction<T> {\n  type: \"FETCH_COMPLETE\";\n  payload: T;\n}\n\nconst completeFetch = <T>(payload: T): CompleteFetchAction<T> => ({\n  type: \"FETCH_COMPLETE\",\n  payload\n});\n\ninterface ErrorFetchAction {\n  type: \"FETCH_ERROR\";\n}\n\nconst errorFetch = (): ErrorFetchAction => ({ type: \"FETCH_ERROR\" });\n\nexport type FetchAction<T> =\n  | StartFetchAction\n  | CompleteFetchAction<T>\n  | ErrorFetchAction;\n\nexport interface FetchState<T> {\n  status: FetchStatus;\n  data?: T;\n}\n\nconst createInitialState = <T>(): FetchState<T> => ({\n  status: FetchStatus.NotStarted,\n  data: undefined\n});\n\nexport const isNotStarted = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.NotStarted;\n\nexport const isLoading = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.Loading;\n\nexport const hasData = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.Data;\n\nexport const gotError = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.Error;\n\ntype Reducer<T> = (\n  state: FetchState<T>,\n  action: FetchAction<T>\n) => FetchState<T>;\n\nconst createFetchReducer = <T>(): Reducer<T> => (state, action) => {\n  switch (action.type) {\n    case \"FETCH_STARTED\":\n      return { ...state, status: FetchStatus.Loading, data: undefined };\n    case \"FETCH_COMPLETE\":\n      return { ...state, status: FetchStatus.Data, data: action.payload };\n    case \"FETCH_ERROR\":\n      return { ...state, status: FetchStatus.Error };\n    default:\n      return state;\n  }\n};\n\nexport type Fetcher = () => Promise<Response>;\n\nexport type Parser<T> = (json: JSON) => T;\n\ninterface FetchProps<T> {\n  fetcher: Fetcher;\n  parser: Parser<T>;\n}\n\nexport type Fetch<T> = ({ fetcher, parser }: FetchProps<T>) => Promise<void>;\n\nconst parseJsonResponse = (response: Response): Promise<JSON> => {\n  if (response.ok) return response.json();\n  throw new Error(response.statusText);\n};\n\nexport const fetch = <T>(\n  dispatch: (action: FetchAction<T>) => void\n): Fetch<T> => ({ fetcher, parser }) => {\n  dispatch(startFetch());\n\n  return fetcher()\n    .then(parseJsonResponse)\n    .then((json: JSON) => dispatch(completeFetch<T>(parser(json))))\n    .catch(() => dispatch(errorFetch()));\n};\n\nconst useFetch = <T>(): [FetchState<T>, Fetch<T>] => {\n  const [state, dispatch] = useReducer(\n    createFetchReducer<T>(),\n    createInitialState<T>()\n  );\n\n  return [state, fetch<T>(dispatch)];\n};\n\nexport default useFetch;\n","import React, { ReactElement } from \"react\";\nimport { hasBranchLines } from \"./line-diagram-helpers\";\nimport Diagram from \"./graphics/Diagram\";\nimport StopListWithBranches from \"./StopListWithBranches\";\nimport { CommonLineDiagramProps } from \"./__line-diagram\";\nimport useStopPositions, { RefList } from \"./graphics/useStopPositions\";\nimport StopCard from \"./StopCard\";\nimport { hasPredictionTime } from \"../../../models/prediction\";\n\nexport const StopRefContext = React.createContext<[RefList, () => void]>([\n  {},\n  () => {}\n]);\n\nconst LineDiagramWithStops = (\n  props: CommonLineDiagramProps\n): ReactElement<HTMLElement> => {\n  const { stops, handleStopClick, liveData } = props;\n\n  // create a ref for each stop - we will use this to track the location of the stop so we can place the line diagram bubbles\n  const [stopRefsMap, updateAllStopCoords] = useStopPositions(stops);\n\n  const anyCrowding = Object.values(liveData).some(\n    ({ headsigns }): boolean =>\n      headsigns\n        ? headsigns\n            .filter(hasPredictionTime)\n            .some(\n              ({ time_data_with_crowding_list: timeData }): boolean =>\n                !!timeData[0].crowding\n            )\n        : false\n  );\n\n  return (\n    <StopRefContext.Provider value={[stopRefsMap, updateAllStopCoords]}>\n      <div\n        className={`m-schedule-diagram ${\n          !anyCrowding ? \"u-no-crowding-data\" : \"\"\n        }`}\n      >\n        <Diagram lineDiagram={stops} liveData={liveData} />\n        {hasBranchLines(stops) ? (\n          <StopListWithBranches {...props} />\n        ) : (\n          <ol>\n            {stops.map(stop => (\n              <StopCard\n                key={stop.route_stop.id}\n                stop={stop}\n                onClick={handleStopClick}\n                liveData={liveData[stop.route_stop.id]}\n              />\n            ))}\n          </ol>\n        )}\n      </div>\n    </StopRefContext.Provider>\n  );\n};\n\nexport default LineDiagramWithStops;\n","import { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nexport const isEnter = (key: number | string): boolean =>\n  key === \"Enter\" || key === 13;\n\nexport const isEscape = (key: number | string): boolean =>\n  key === \"Escape\" || key === 27;\n\n// for vanilla JS\nexport const handleNativeEnterKeyPress = (\n  e: KeyboardEvent,\n  cb: Function\n): void => (isEnter(e.key || e.keyCode) ? cb(e) : () => {});\n\nexport const handleNativeEscapeKeyPress = (\n  e: KeyboardEvent,\n  cb: Function\n): void => (isEscape(e.key || e.keyCode) ? cb(e) : () => {});\n\n// for React\nexport const handleReactEnterKeyPress = (\n  e: ReactKeyboardEvent,\n  onClick: Function\n): void => {\n  if (e.key === \"Enter\") {\n    onClick();\n  }\n};\n\nexport const handleReactExitKeyPress = (\n  e: ReactKeyboardEvent,\n  onClick: Function\n): void => {\n  if (e.key === \"Escape\") {\n    onClick();\n  }\n};\n","import React, {\n  ReactElement,\n  useReducer,\n  useEffect,\n  Dispatch,\n  useRef\n} from \"react\";\nimport { initChannel, stopChannel, SocketEvent } from \"./Channel\";\nimport Map from \"../../leaflet/components/Map\";\nimport getBounds from \"../../leaflet/bounds\";\nimport {\n  MapData,\n  MapMarker as Marker\n} from \"../../leaflet/components/__mapdata\";\nimport CrowdingPill from \"./line-diagram/CrowdingPill\";\n\ninterface Props {\n  channel: string;\n  data: MapData;\n  shapeIds: string[];\n}\n\ninterface EventData {\n  marker: Marker;\n}\n\ntype Action = SocketEvent<EventData[]>;\n\ninterface ActionWithChannel {\n  action: Action;\n  channel: string;\n}\n\nconst setupChannels = (\n  channel: string,\n  dispatch: Dispatch<ActionWithChannel>\n): void => {\n  dispatch({ action: { event: \"setChannel\", data: [] }, channel });\n  /* istanbul ignore next */\n  initChannel<EventData[]>(channel, (action: Action) =>\n    dispatch({ action, channel })\n  );\n  /* istanbul ignore next */\n  initChannel<EventData[]>(\"vehicles:remove\", (action: Action) =>\n    dispatch({ action, channel })\n  );\n};\n\nconst stopChannels = (channel: string): void => {\n  stopChannel(channel);\n  stopChannel(\"vehicles:remove\");\n};\n\nexport const iconOpts = (\n  icon: string | null\n): {\n  icon_size?: [number, number];\n  icon_anchor?: [number, number];\n} => {\n  switch (icon) {\n    case null:\n      return {};\n\n    case \"vehicle-bordered-expanded\":\n      return {\n        icon_size: [18, 18], // eslint-disable-line camelcase\n        icon_anchor: [6, 6] // eslint-disable-line camelcase\n      };\n\n    case \"stop-circle-bordered-expanded\":\n      return {\n        icon_size: [12, 12], // eslint-disable-line camelcase\n        icon_anchor: [6, 6] // eslint-disable-line camelcase\n      };\n\n    default:\n      throw new Error(`unexpected icon type: ${icon}`);\n  }\n};\n\nconst zIndex = (icon: string | null): number | undefined =>\n  icon === \"vehicle-bordered-expanded\" ? 1000 : undefined;\n\nconst updateMarker = (marker: Marker): Marker => ({\n  ...marker,\n  tooltip: (\n    <div>\n      {marker.vehicle_crowding && (\n        <>\n          <CrowdingPill crowding={marker.vehicle_crowding} />\n          <br />\n        </>\n      )}\n      {marker.tooltip_text}\n    </div>\n  ),\n  icon_opts: iconOpts(marker.icon), // eslint-disable-line camelcase\n  z_index: zIndex(marker.icon) // eslint-disable-line camelcase\n});\n\nconst isVehicleMarker = (marker: Marker): boolean =>\n  marker.icon ? marker.icon.includes(\"vehicle\") : false;\n\nconst shouldVehicleDisplay = (\n  marker: Marker,\n  shapeIdsInDirection: string[]\n): boolean => {\n  if (marker.shape_id) {\n    return shapeIdsInDirection.some(shapeId => shapeId === marker.shape_id);\n  }\n  return true;\n};\n\ninterface IdHash {\n  [id: string]: true;\n}\n\nconst shouldRemoveMarker = (id: string | null, idHash: IdHash): boolean =>\n  id !== null && idHash[id] === true;\n\ninterface State {\n  channel: string;\n  markers: Marker[];\n  shapeIds: string[];\n}\n\nexport const reducer = (\n  state: State,\n  actionWithChannel: ActionWithChannel\n): State => {\n  const { action, channel } = actionWithChannel;\n  const { shapeIds } = state;\n  if (channel !== state.channel && action.event !== \"setChannel\") return state;\n  switch (action.event) {\n    case \"setChannel\":\n      return { ...state, channel, markers: [] };\n    case \"reset\":\n      return {\n        ...state,\n        markers: state.markers\n          .filter(marker => !isVehicleMarker(marker))\n          .concat(\n            action.data\n              .filter(({ marker }: EventData) =>\n                shouldVehicleDisplay(marker, shapeIds)\n              )\n              .map(({ marker }: EventData) => updateMarker(marker))\n          )\n      };\n\n    case \"add\":\n      return {\n        ...state,\n        markers: state.markers.concat(\n          action.data\n            .filter(({ marker }) => shouldVehicleDisplay(marker, shapeIds))\n            .map(({ marker }) => updateMarker(marker))\n        )\n      };\n\n    case \"update\":\n      if (action.data.length === 0) {\n        return state;\n      }\n      if (!shouldVehicleDisplay(action.data[0].marker, shapeIds)) return state;\n      // Filter out the existing marker if necessary, always add new marker\n      return {\n        ...state,\n        markers: [\n          updateMarker(action.data[0].marker),\n          ...state.markers.filter(\n            marker => marker.id !== action.data[0].marker.id\n          )\n        ]\n      };\n    case \"remove\":\n      return {\n        ...state,\n        markers: state.markers.filter(\n          marker =>\n            !shouldRemoveMarker(\n              marker.id,\n              action.data.reduce((acc: IdHash, id: string) => {\n                acc[id] = true;\n                return acc;\n              }, {})\n            )\n        )\n      };\n    default:\n      /* istanbul ignore next */\n      throw new Error(`unexpected event: ${action}`);\n  }\n};\n\nexport default ({\n  data,\n  channel,\n  shapeIds\n}: Props): ReactElement<HTMLElement> | null => {\n  const bounds = useRef(getBounds(data.markers));\n  const [state, dispatch] = useReducer(reducer, {\n    channel,\n    markers: data.markers,\n    shapeIds\n  });\n  useEffect(\n    () => {\n      setupChannels(channel, dispatch);\n      return () => stopChannels(channel);\n    },\n    [channel, dispatch]\n  );\n  const stopMarkers = data.stop_markers\n    ? data.stop_markers.map(marker => updateMarker(marker))\n    : [];\n  const mapData = {\n    ...data,\n    markers: state.markers.concat(stopMarkers)\n  };\n  return (\n    <div className=\"m-schedule__map\">\n      <Map bounds={bounds.current} mapData={mapData} />\n    </div>\n  );\n};\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>calendar</title><g fill=\\\"none\\\"><path d=\\\"M36.65 32.47h6.09v6.8h-6.09zM28.53 23.41h6.77v7.55h-6.77zM35.3 11.33h1.35a.75.75 0 00.68-.76V3.78a.74.74 0 00-.68-.78H35.3a.74.74 0 00-.68.76v6.79a.75.75 0 00.68.78zM36.65 15.1h6.09v6.8h-6.09zM36.65 23.41h6.09v7.55h-6.09zM20.41 23.41h6.77v7.55h-6.77zM21.55 39.26h5.63v-6.79h-6.51a10.82 10.82 0 01.88 6.79zM19.05 30v-6.59H13v3.13A10.82 10.82 0 0119.05 30zM28.53 32.47h6.77v6.8h-6.77zM28.53 15.1h6.77v6.8h-6.77zM12.96 15.1h6.09v6.8h-6.09zM19.05 11.33h1.36a.74.74 0 00.67-.76V3.78a.73.73 0 00-.67-.78h-1.36a.73.73 0 00-.67.76v6.79a.74.74 0 00.67.78zM20.41 15.1h6.77v6.8h-6.77z\\\"></path></g><path fill=\\\"#165c96\\\" d=\\\"M42.75 6H40V3.78A3.61 3.61 0 0036.65 0H35.3a3.61 3.61 0 00-3.38 3.78V6h-8.13V3.78A3.61 3.61 0 0020.41 0h-1.36a3.61 3.61 0 00-3.38 3.78V6H13a2.9 2.9 0 00-2.71 3v17.38a10.82 10.82 0 102 21.54 11 11 0 008.21-5.63h22.25a2.9 2.9 0 002.71-3V9.06A2.9 2.9 0 0042.75 6zM18.3 39.26a7.64 7.64 0 01-1.67 3 7.67 7.67 0 111.67-3zm.75-9.26A10.82 10.82 0 0013 26.54v-3.13h6.09zm0-8.13H13V15.1h6.09zm-.67-11.33V3.78a.73.73 0 01.67-.78h1.36a.73.73 0 01.67.76v6.79a.74.74 0 01-.67.76h-1.36a.74.74 0 01-.67-.74zm8.8 28.69h-5.63a10.82 10.82 0 00-.88-6.79h6.51zm0-8.3h-6.77v-7.52h6.77zm0-9.06h-6.77V15.1h6.77zm8.12 17.39h-6.77v-6.79h6.77zm0-8.3h-6.77v-7.55h6.77zm0-9.06h-6.77v-6.8h6.77zm-.68-11.33V3.78A.74.74 0 0135.3 3h1.35a.74.74 0 01.68.76v6.79a.75.75 0 01-.68.76H35.3a.75.75 0 01-.68-.74zm8.13 28.69h-6.1v-6.79h6.1zm0-8.3h-6.1v-7.55h6.1zm0-9.06h-6.1v-6.8h6.1z\\\"></path><path fill=\\\"#165c96\\\" d=\\\"M12.28 31.76h-.9a.45.45 0 00-.45.45v5H7.77a.45.45 0 00-.45.45v.91a.45.45 0 00.45.45h4.51a.44.44 0 00.45-.45v-6.36a.44.44 0 00-.45-.45z\\\"></path></svg>\"","import React, { ReactElement } from \"react\";\nimport { Route, DirectionId } from \"../../__v3api\";\nimport {\n  SimpleStopMap,\n  RoutePatternsByDirection,\n  ServiceInSelector,\n  ScheduleNote as ScheduleNoteType,\n  SelectedOrigin\n} from \"./__schedule\";\nimport ScheduleFinderForm from \"./schedule-finder/ScheduleFinderForm\";\nimport ScheduleFinderModal, {\n  Mode as ModalMode\n} from \"./schedule-finder/ScheduleFinderModal\";\nimport { getCurrentState, storeHandler } from \"../store/ScheduleStore\";\n\ninterface Props {\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n  services: ServiceInSelector[];\n  directionId: DirectionId;\n  route: Route;\n  stops: SimpleStopMap;\n  routePatternsByDirection: RoutePatternsByDirection;\n  today: string;\n  scheduleNote: ScheduleNoteType | null;\n  changeDirection: (direction: DirectionId) => void;\n  selectedOrigin: SelectedOrigin;\n  changeOrigin: (origin: SelectedOrigin) => void;\n  closeModal: () => void;\n  modalMode: ModalMode;\n  modalOpen: boolean;\n}\n\nconst ScheduleFinder = ({\n  updateURL,\n  directionId,\n  route,\n  services,\n  stops,\n  routePatternsByDirection,\n  today,\n  scheduleNote,\n  modalMode,\n  selectedOrigin,\n  changeDirection,\n  changeOrigin,\n  modalOpen,\n  closeModal\n}: Props): ReactElement<HTMLElement> => {\n  const openOriginModal = (): void => {\n    const currentState = getCurrentState();\n    const { modalOpen: modalIsOpen } = currentState;\n    if (!modalIsOpen) {\n      storeHandler({\n        type: \"OPEN_MODAL\",\n        newStoreValues: {\n          modalMode: \"origin\"\n        }\n      });\n    }\n  };\n\n  const openScheduleModal = (): void => {\n    const currentState = getCurrentState();\n    const { modalOpen: modalIsOpen } = currentState;\n    if (selectedOrigin !== undefined && !modalIsOpen) {\n      storeHandler({\n        type: \"OPEN_MODAL\",\n        newStoreValues: {\n          modalMode: \"schedule\"\n        }\n      });\n    }\n  };\n\n  const handleOriginSelectClick = (): void => {\n    storeHandler({\n      type: \"OPEN_MODAL\",\n      newStoreValues: {\n        modalMode: \"origin\"\n      }\n    });\n  };\n\n  return (\n    <div className=\"schedule-finder\">\n      <ScheduleFinderForm\n        onDirectionChange={changeDirection}\n        onOriginChange={changeOrigin}\n        onOriginSelectClick={openOriginModal}\n        onSubmit={openScheduleModal}\n        route={route}\n        selectedDirection={directionId}\n        selectedOrigin={selectedOrigin}\n        stopsByDirection={stops}\n      />\n\n      {modalOpen && (\n        <ScheduleFinderModal\n          closeModal={closeModal}\n          directionChanged={changeDirection}\n          initialMode={modalMode}\n          initialDirection={directionId}\n          initialOrigin={selectedOrigin}\n          handleOriginSelectClick={handleOriginSelectClick}\n          originChanged={changeOrigin}\n          route={route}\n          routePatternsByDirection={routePatternsByDirection}\n          scheduleNote={scheduleNote}\n          services={services}\n          stops={stops}\n          today={today}\n          updateURL={updateURL}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default ScheduleFinder;\n","import React, { FormEvent, ReactElement, useState } from \"react\";\nimport { DirectionId, DirectionInfo, Route } from \"../../../__v3api\";\nimport { SimpleStopMap, SelectedOrigin } from \"../__schedule\";\nimport icon from \"../../../../static/images/icon-schedule-finder.svg\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport SelectContainer from \"./SelectContainer\";\n\nconst validDirections = (directionInfo: DirectionInfo): DirectionId[] =>\n  ([0, 1] as DirectionId[]).filter(dir => directionInfo[dir] !== null);\n\ninterface Props {\n  onDirectionChange: (direction: DirectionId) => void;\n  onOriginChange: (origin: SelectedOrigin) => void;\n  onOriginSelectClick: () => void;\n  onSubmit?: () => void;\n  route: Route;\n  selectedDirection: DirectionId;\n  selectedOrigin: SelectedOrigin;\n  stopsByDirection: SimpleStopMap;\n}\n\nexport default ({\n  onDirectionChange,\n  onOriginChange,\n  onSubmit = () => {},\n  onOriginSelectClick,\n  route,\n  selectedDirection,\n  selectedOrigin,\n  stopsByDirection\n}: Props): ReactElement => {\n  const {\n    direction_names: directionNames,\n    direction_destinations: directionDestinations\n  } = route;\n\n  const [originError, setOriginError] = useState(false);\n\n  const handleOriginClick = (): void => {\n    setOriginError(false);\n    onOriginSelectClick();\n  };\n\n  const handleSubmit = (event: FormEvent): void => {\n    event.preventDefault();\n\n    if (!selectedOrigin) {\n      setOriginError(true);\n    } else {\n      setOriginError(false);\n      onSubmit();\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <h2 className=\"h3 schedule-finder__heading\">\n        {renderSvg(\"c-svg__icon\", icon)} Schedule Finder\n      </h2>\n\n      <div className=\"schedule-finder__prompt\">\n        Choose a stop to get schedule information and real-time departure\n        predictions.\n      </div>\n\n      {originError && (\n        <div className=\"error-container\">\n          <span role=\"alert\">Please provide an origin</span>\n        </div>\n      )}\n\n      <div className=\"schedule-finder__inputs\">\n        <label className=\"schedule-finder__label\">\n          Choose a direction\n          <SelectContainer>\n            <select\n              className=\"c-select-custom\"\n              value={selectedDirection}\n              onChange={e =>\n                onDirectionChange(parseInt(e.target.value, 10) as DirectionId)\n              }\n            >\n              {validDirections(directionNames).map(direction => (\n                <option key={direction} value={direction}>\n                  {directionNames[direction]!.toUpperCase()}{\" \"}\n                  {directionDestinations[direction]!}\n                </option>\n              ))}\n            </select>\n          </SelectContainer>\n        </label>\n\n        <label className=\"schedule-finder__label\">\n          Choose an origin stop\n          <SelectContainer error={originError} handleClick={handleOriginClick}>\n            <select\n              className=\"c-select-custom c-select-custom--noclick\"\n              value={selectedOrigin || \"\"}\n              onChange={e => onOriginChange(e.target.value || null)}\n            >\n              <option value=\"\">Select</option>\n              {stopsByDirection[selectedDirection].map(({ id, name }) => (\n                <option key={id} value={id}>\n                  {name}\n                </option>\n              ))}\n            </select>\n          </SelectContainer>\n        </label>\n      </div>\n\n      <div className=\"schedule-finder__submit text-right\">\n        <input\n          className=\"btn btn-primary\"\n          type=\"submit\"\n          value=\"Get schedules\"\n        />\n      </div>\n    </form>\n  );\n};\n","import React, { ReactElement, ReactNode } from \"react\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport arrowIcon from \"../../../../static/images/icon-down-arrow.svg\";\n\ninterface SelectContainerProps {\n  children: ReactNode;\n  error?: boolean;\n  handleClick?: Function;\n}\n\nconst SelectContainer = ({\n  children,\n  error = false,\n  handleClick\n}: SelectContainerProps): ReactElement<HTMLElement> => (\n  <div\n    tabIndex={0}\n    className={`c-select-custom__container ${error ? \"error\" : \"\"}`}\n    role=\"button\"\n    onClick={e => {\n      if (handleClick) {\n        handleClick(e);\n      }\n    }}\n    onKeyUp={e =>\n      handleReactEnterKeyPress(e, () => {\n        if (handleClick) {\n          handleClick(e);\n        }\n      })\n    }\n  >\n    {children}\n    {renderSvg(\"c-svg__icon c-select-custom__arrow\", arrowIcon)}\n  </div>\n);\n\nexport default SelectContainer;\n","import React, { ReactElement, useState, useEffect } from \"react\";\nimport { searchIcon } from \"../helpers/icon\";\n\ninterface Props {\n  id: string;\n  labelText: string;\n  onChange: (q: string) => void;\n  placeholder?: string;\n  className?: string;\n}\n\nconst SearchBox = ({\n  id,\n  labelText,\n  onChange,\n  placeholder,\n  className\n}: Props): ReactElement<HTMLElement> | null => {\n  const [query, setQuery] = useState(\"\");\n\n  useEffect(\n    () => {\n      onChange(query);\n    },\n    [query, onChange]\n  );\n\n  return (\n    <div className={`${className} c-form__input-container`}>\n      <label htmlFor={id} className=\"sr-only\">\n        {labelText}\n      </label>\n      <input\n        className=\"c-form__input\"\n        id={id}\n        type=\"text\"\n        onChange={event => {\n          setQuery(event.target.value);\n        }}\n        value={query}\n        placeholder={placeholder || labelText}\n      />\n      {query !== \"\" && (\n        <button\n          className=\"c-form__reset-btn btn-link\"\n          aria-label=\"reset\"\n          type=\"button\"\n          onClick={() => {\n            setQuery(\"\");\n          }}\n        >\n          <i\n            aria-hidden=\"true\"\n            className=\"c-form__reset-icon fa fa-times-circle\"\n          />\n        </button>\n      )}\n      <button\n        className=\"c-form__submit-btn\"\n        aria-label=\"search\"\n        type=\"button\"\n        onClick={() => {\n          setQuery(query);\n        }}\n      >\n        {searchIcon(\"c-svg__icon-search-reverse-default\")}\n      </button>\n    </div>\n  );\n};\n\nexport default SearchBox;\n","import React from \"react\";\nimport { TooltipWrapper, crowdingIcon } from \"../../../helpers/icon\";\nimport { crowdingDescriptions } from \"../../../models/vehicle\";\nimport { CrowdingType } from \"../__schedule\";\n\ninterface LiveCrowdingIconProps {\n  crowding: CrowdingType;\n}\n\nconst LiveCrowdingIcon = ({ crowding }: LiveCrowdingIconProps): JSX.Element => (\n  <div className=\"m-schedule-diagram__prediction-crowding\">\n    {crowding ? (\n      <TooltipWrapper\n        tooltipText={`Currently <strong>${crowdingDescriptions(\n          crowding\n        ).toLowerCase()}</strong>`}\n        tooltipOptions={{\n          placement: \"left\",\n          animation: false,\n          html: true\n        }}\n      >\n        {crowdingIcon(`c-icon__crowding--${crowding}`)}\n      </TooltipWrapper>\n    ) : (\n      crowdingIcon(\"c-icon__crowding--crowding_unavailable\")\n    )}\n  </div>\n);\n\nexport default LiveCrowdingIcon;\n","import React from \"react\";\n\nexport default (\n  className: string,\n  svgText: string,\n  ariaHide: boolean = true\n): JSX.Element => (\n  <span\n    className={className ? `notranslate ${className}` : \"notranslate\"}\n    aria-hidden={ariaHide ? \"true\" : \"false\"}\n    // eslint-disable-next-line react/no-danger\n    dangerouslySetInnerHTML={{ __html: svgText }}\n  />\n);\n","import { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nconst nextRoutePatternIndex = (\n  currentId: string,\n  routePatternIds: string[]\n): number => {\n  const index = routePatternIds.indexOf(currentId);\n  return index === routePatternIds.length - 1 ? 0 : index + 1;\n};\n\nconst prevRoutePatternIndex = (\n  currentId: string,\n  routePatternIds: string[]\n): number => {\n  const index = routePatternIds.indexOf(currentId);\n  return index === 0 ? routePatternIds.length - 1 : index - 1;\n};\n\nexport default (e: ReactKeyboardEvent, routePatternIds: string[]): void => {\n  if (\n    e.key !== \"Tab\" &&\n    e.key !== \"ArrowRight\" &&\n    e.key !== \"ArrowLeft\" &&\n    e.key !== \"ArrowDown\" &&\n    e.key !== \"ArrowUp\"\n  )\n    return;\n\n  e.preventDefault();\n\n  const targetEl = e.target as HTMLDivElement;\n  const targetElId = targetEl.id.replace(\"route-pattern_\", \"\");\n\n  // forward\n  if (\n    (e.key === \"Tab\" && !e.shiftKey) ||\n    e.key === \"ArrowRight\" ||\n    e.key === \"ArrowDown\"\n  ) {\n    const nextIndex = nextRoutePatternIndex(targetElId, routePatternIds);\n    const nextElId = `route-pattern_${routePatternIds[nextIndex]}`;\n    // eslint-disable-next-line no-unused-expressions\n    document.getElementById(nextElId) &&\n      /* istanbul ignore next */\n      document.getElementById(nextElId)!.focus();\n  }\n\n  // backwards\n  if (\n    (e.key === \"Tab\" && e.shiftKey) ||\n    e.key === \"ArrowLeft\" ||\n    e.key === \"ArrowUp\"\n  ) {\n    const prevIndex = prevRoutePatternIndex(targetElId, routePatternIds);\n    const prevElId = `route-pattern_${routePatternIds[prevIndex]}`;\n    // eslint-disable-next-line no-unused-expressions\n    document.getElementById(prevElId) &&\n      /* istanbul ignore next */\n      document.getElementById(prevElId)!.focus();\n  }\n};\n","import React, { ReactElement } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { LineDiagramStop } from \"../../__schedule\";\nimport {\n  areOnDifferentBranchLines,\n  isMergeStop,\n  isBranchTerminusStop\n} from \"../line-diagram-helpers\";\nimport {\n  StopCoord,\n  CoordState,\n  BRANCH_LINE_WIDTH,\n  BASE_LINE_WIDTH,\n  BRANCH_SPACING\n} from \"./graphic-helpers\";\n\ninterface PathGraphicsProps {\n  from: LineDiagramStop;\n  to: LineDiagramStop;\n}\nconst Line = ({ from, to }: PathGraphicsProps): ReactElement | null => {\n  const fromCoords: StopCoord | null = useSelector(\n    (state: CoordState) => state[from.route_stop.id]\n  );\n  const toCoords: StopCoord | null = useSelector(\n    (state: CoordState) => state[to.route_stop.id]\n  );\n  if (!fromCoords || !toCoords) return null;\n  if (isMergeStop(to) && from.stop_data.length === to.stop_data.length) {\n    return null;\n  }\n\n  const [x1, y1] = fromCoords;\n  const y2 = toCoords[1];\n\n  if (isMergeStop(from) && !areOnDifferentBranchLines(from, to)) {\n    // just draw one line.\n    const lineProps: React.SVGProps<SVGLineElement> = {\n      key: `${from.route_stop.id}-${to.route_stop.id}`\n    };\n    lineProps.strokeWidth = `${BASE_LINE_WIDTH}px`;\n    lineProps.x1 = `${x1}px`;\n    lineProps.x2 = lineProps.x1;\n    lineProps.y1 = `${y1}px`;\n    lineProps.y2 = `${y2}px`;\n    if (\n      from.stop_data.some(sd => sd[\"has_disruption?\"]) &&\n      to.stop_data.some(sd => sd[\"has_disruption?\"])\n    ) {\n      lineProps.stroke = \"url(#diagonalHatch)\";\n    }\n    return <line className=\"line-diagram-svg__line\" {...lineProps} />;\n  }\n\n  // otherwise let's just show all the lines...\n  return (\n    <>\n      {from.stop_data.map((branchLine, branchIndex) => {\n        const lineProps: React.SVGProps<SVGLineElement> = {\n          key: `${from.route_stop.id}-${to.route_stop.id}-${\n            branchLine.type\n          }-${branchIndex}`\n        };\n        lineProps.strokeWidth = `${\n          branchIndex >= 1 &&\n          !(isBranchTerminusStop(from) || isBranchTerminusStop(to)) &&\n          (branchLine.type === \"stop\" ||\n            to.stop_data[branchIndex].type === \"stop\")\n            ? BRANCH_LINE_WIDTH\n            : BASE_LINE_WIDTH\n        }px`;\n        lineProps.x1 = `${BRANCH_SPACING * branchIndex +\n          BASE_LINE_WIDTH +\n          1}px`;\n        lineProps.x2 = lineProps.x1;\n        lineProps.y1 = `${y1}px`;\n        lineProps.y2 = `${y2}px`;\n        if (branchLine[\"has_disruption?\"]) {\n          lineProps.stroke = \"url(#diagonalHatch)\";\n        }\n        return <line className=\"line-diagram-svg__line\" {...lineProps} />;\n      })}\n    </>\n  );\n};\n\nexport default Line;\n","import { LatLng, latLng, LatLngBounds, latLngBounds } from \"leaflet\";\nimport { MapMarker as Marker } from \"./components/__mapdata\";\n\nconst getBounds = (markers: Marker[]): LatLngBounds => {\n  const points: LatLng[] = markers.map(m => latLng(m.latitude, m.longitude));\n  return latLngBounds(points);\n};\n\nexport default getBounds;\n","import { Icon } from \"leaflet\";\nimport { IconOpts } from \"../leaflet/components/__mapdata\";\n\nexport type IconType = (\n  icon: string | null,\n  opts: IconOpts | undefined\n) => Icon | undefined;\n\ninterface LeafletOpts {\n  iconSize: [number, number];\n  iconAnchor: [number, number];\n  popupAnchor: [number, number];\n}\n\nexport const defaultIconOpts: LeafletOpts = {\n  iconAnchor: [22, 55],\n  iconSize: [45, 75],\n  popupAnchor: [0, -37]\n};\n\nexport default (\n  icon: string | null,\n  opts?: IconOpts | null\n): Icon | undefined => {\n  const iconOpts =\n    opts !== null && opts\n      ? {\n          iconAnchor: opts.icon_anchor || defaultIconOpts.iconAnchor,\n          iconSize: opts.icon_size || defaultIconOpts.iconSize,\n          popupAnchor: opts.popup_anchor || defaultIconOpts.popupAnchor\n        }\n      : defaultIconOpts;\n  return icon === null\n    ? undefined\n    : new Icon({\n        ...iconOpts,\n        iconUrl: `/images/icon-${icon}.svg`,\n        iconRetinaUrl: `/images/icon-${icon}.svg`\n      });\n};\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>green line</title><path fill=\\\"#00843d\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M6.083 11.534a2.638 2.638 0 01-1.034.216 3.677 3.677 0 01-1.48-.286 3.181 3.181 0 01-1.11-.789 3.488 3.488 0 01-.693-1.18 4.327 4.327 0 01-.241-1.46 4.474 4.474 0 01.241-1.49 3.592 3.592 0 01.692-1.2 3.18 3.18 0 011.11-.804 3.62 3.62 0 011.48-.291 3.49 3.49 0 011.07.166 3.037 3.037 0 01.934.486 2.631 2.631 0 011.02 1.878H6.564a1.51 1.51 0 00-.542-.903 1.578 1.578 0 00-.974-.302 1.84 1.84 0 00-.903.206 1.706 1.706 0 00-.603.552 2.428 2.428 0 00-.337.788 3.96 3.96 0 00-.105.914 3.683 3.683 0 00.105.879 2.378 2.378 0 00.337.768 1.723 1.723 0 00.603.547 1.835 1.835 0 00.903.206 1.711 1.711 0 001.21-.397 1.725 1.725 0 00.497-1.15H5.169V7.715h3.012v3.875H7.177l-.16-.813a2.357 2.357 0 01-.934.758zM11.032 4.42v5.844h3.495v1.325h-5.07V4.421z\\\"></path></g></svg>\"","import React, { ReactElement } from \"react\";\nimport deepEqual from \"fast-deep-equal\";\nimport {\n  Icon,\n  LatLngBounds,\n  Marker as LeafletMarker,\n  MarkerOptions\n} from \"leaflet\";\nimport Leaflet from \"react-leaflet\";\nimport { MapData, MapMarker, IconOpts } from \"./__mapdata\";\n\nexport interface ZoomOpts {\n  maxZoom: number;\n  minZoom: number;\n  scrollWheelZoom: boolean;\n  style: object;\n}\n\nexport const defaultZoomOpts: ZoomOpts = {\n  maxZoom: 18,\n  minZoom: 9,\n  scrollWheelZoom: false,\n  style: { touchAction: \"none\" } // fix for chrome-android to prevent zooming page\n};\n\ninterface Props {\n  bounds?: LatLngBounds;\n  boundsByMarkers?: boolean;\n  mapData: MapData;\n}\n\nconst mapCenter = (\n  markers: MapMarker[],\n  { latitude, longitude }: { latitude: number; longitude: number }\n): [number, number] | undefined => {\n  if (markers.length === 1) return [markers[0].latitude, markers[0].longitude];\n  return [latitude, longitude];\n};\n\nconst rotateMarker = (\n  markerEl: LeafletMarker<MarkerOptions>,\n  { rotation_angle: angle }: MapMarker\n): void => {\n  // TS does not recognize setRotationAngle, which\n  // is added by the leaflet-rotatedmarker plugin\n  // @ts-ignore\n  markerEl.setRotationAngle(angle);\n};\n\nconst Component = ({\n  bounds,\n  boundsByMarkers,\n  mapData: {\n    default_center: defaultCenter,\n    markers,\n    polylines,\n    tile_server_url: tileServerUrl,\n    zoom\n  }\n}: Props): ReactElement<HTMLElement> | null => {\n  if (typeof window !== \"undefined\" && tileServerUrl !== \"\") {\n    /* eslint-disable */\n    const leaflet: typeof Leaflet = require(\"react-leaflet\");\n    const buildIcon: (\n      icon: string | null,\n      opts?: IconOpts\n    ) => Icon | undefined = require(\"../icon\").default;\n    require(\"leaflet-rotatedmarker\");\n    const FullscreenControl = require(\"react-leaflet-fullscreen\");\n    const getBounds = require(\"../bounds\").default;\n    /* eslint-enable */\n    const { Map, Marker, Polyline, Popup, TileLayer } = leaflet;\n    /* istanbul ignore next */\n    const boundsOrByMarkers = bounds || (boundsByMarkers && getBounds(markers));\n    const position = mapCenter(markers, defaultCenter);\n    const nonNullZoom = zoom === null ? undefined : zoom;\n    return (\n      <Map\n        bounds={boundsOrByMarkers}\n        center={position}\n        zoom={nonNullZoom}\n        {...defaultZoomOpts}\n      >\n        <TileLayer\n          attribution='&amp;copy <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n          url={`${tileServerUrl}/osm_tiles/{z}/{x}/{y}.png`}\n        />\n        {polylines.map(\n          /* istanbul ignore next */\n          polyline => (\n            <Polyline\n              key={\n                polyline.id || `polyline-${Math.floor(Math.random() * 1000)}`\n              }\n              positions={polyline.positions}\n              color={polyline.color}\n              weight={polyline.weight}\n              dashArray={polyline[\"dotted?\"] ? \"4px 8px\" : \"none\"}\n              lineCap={polyline[\"dotted?\"] ? \"butt\" : \"round\"}\n              lineJoin={polyline[\"dotted?\"] ? \"miter\" : \"round\"}\n            />\n          )\n        )}\n        {markers.map(marker => (\n          <Marker\n            icon={buildIcon(marker.icon, marker.icon_opts)}\n            key={\n              marker.id ||\n              /* istanbul ignore next */ `marker-${Math.floor(\n                Math.random() * 1000\n              )}`\n            }\n            position={[marker.latitude, marker.longitude]}\n            ref={ref => ref && rotateMarker(ref.leafletElement, marker)}\n            zIndexOffset={marker.z_index}\n            keyboard={false}\n          >\n            {marker.tooltip && <Popup maxHeight={175}>{marker.tooltip}</Popup>}\n          </Marker>\n        ))}\n        <FullscreenControl />\n      </Map>\n    );\n  }\n  return null;\n};\n\nexport default React.memo(Component, deepEqual);\n","import {\n  isABusRoute,\n  isACommuterRailRoute,\n  isAGreenLineRoute,\n  isASilverLineRoute\n} from \"../models/route\";\nimport { Route } from \"../__v3api\";\n\nexport const routeToCSSClass = (route: string): string =>\n  route.toLowerCase().replace(/[ _]/g, \"-\");\n\nexport const busClass = (route: Route): string =>\n  isABusRoute(route) && !isASilverLineRoute(route) ? \"bus-route-sign\" : \"\";\n\nexport const routeToModeName = (route: Route): string => {\n  if (isACommuterRailRoute(route)) return \"commuter-rail\";\n  if (route.type === 4) return \"ferry\";\n  if (route.id === \"Red\" || route.id === \"Mattapan\") return \"red-line\";\n  if (route.id === \"Orange\") return \"orange-line\";\n  if (route.id === \"Blue\") return \"blue-line\";\n  if (isAGreenLineRoute(route)) return \"green-line\";\n  if (isASilverLineRoute(route)) return \"silver-line\";\n  if (isABusRoute(route)) return \"bus\";\n  return \"unknown\";\n};\n\nexport const routeBgClass = (route: Route): string =>\n  `u-bg--${routeToModeName(route)}`;\n","import React, { ReactElement, useState } from \"react\";\nimport { handleReactEnterKeyPress } from \"../helpers/keyboard-events\";\nimport renderSvg from \"../helpers/render-svg\";\nimport { caret } from \"../helpers/icon\";\n\nexport interface ExpandableBlockHeader {\n  text: string | ReactElement<HTMLElement>;\n  iconSvgText: string | null;\n}\n\n// If dispatch is provided in Props, the block will not\n// track its own state -- the parent is fully responsible\n// for tracking the expanded/collapsed state.\n// If dispatch is not provided, the block will\n// track its own state.\ninterface Props {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  dispatch?: React.Dispatch<any>;\n  notifyExpanded?: (isExpanded: boolean) => void;\n  initiallyExpanded: boolean;\n  initiallyFocused?: boolean;\n  header: ExpandableBlockHeader;\n  children: ReactElement<HTMLElement>;\n  id: string;\n  panelClassName?: string;\n  preventScroll?: boolean;\n}\n\ninterface State {\n  expanded: boolean;\n  focused?: boolean;\n}\n\nexport interface ClickExpandableBlockAction {\n  type: \"CLICK_EXPANDABLE_BLOCK\";\n  payload: {\n    expanded: boolean;\n    focused: boolean;\n    id: string;\n  };\n}\n\nconst ExpandableBlock = (props: Props): ReactElement<HTMLElement> => {\n  const {\n    header: { text, iconSvgText },\n    dispatch,\n    notifyExpanded,\n    initiallyExpanded,\n    initiallyFocused,\n    children,\n    id,\n    panelClassName,\n    preventScroll\n  } = props;\n\n  const initialState = {\n    expanded: initiallyExpanded,\n    focused: initiallyFocused\n  };\n\n  const action: ClickExpandableBlockAction = {\n    type: \"CLICK_EXPANDABLE_BLOCK\",\n    payload: {\n      expanded: initiallyExpanded === true,\n      focused: initiallyFocused === true,\n      id\n    }\n  };\n\n  const [hookedState, toggleExpanded] = useState(initialState);\n  const { state, onClick } = dispatch\n    ? {\n        state: initialState,\n        onClick: () => dispatch(action)\n      }\n    : {\n        state: hookedState,\n        onClick: () => {\n          const expanded = !hookedState.expanded;\n          toggleExpanded({ expanded, focused: true });\n          if (notifyExpanded) notifyExpanded(expanded);\n        }\n      };\n  const { expanded, focused }: State = state;\n  const headerId = `header-${id}`;\n  const panelId = `panel-${id}`;\n\n  return (\n    <>\n      <h3\n        className=\"c-expandable-block__header\"\n        tabIndex={0}\n        id={headerId}\n        aria-expanded={expanded}\n        aria-controls={panelId}\n        // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n        role=\"button\"\n        onClick={onClick}\n        onKeyPress={e => handleReactEnterKeyPress(e, onClick)}\n      >\n        {iconSvgText\n          ? renderSvg(\"c-expandable-block__header-icon\", iconSvgText)\n          : null}\n        <div className=\"c-expandable-block__header-text\">\n          {text}\n          {caret(\"c-expandable-block__header-caret\", expanded)}\n        </div>\n      </h3>\n      {expanded ? (\n        <div\n          className={`c-expandable-block__panel ${panelClassName || \"\"}`}\n          // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n          tabIndex={0}\n          role=\"region\"\n          id={panelId}\n          aria-labelledby={headerId}\n          ref={panel =>\n            panel &&\n            focused &&\n            panel.focus({\n              preventScroll: !!preventScroll\n            })\n          }\n        >\n          {children}\n        </div>\n      ) : null}\n      {/* No javascript support */}\n      <noscript>\n        <style>{`#${headerId} { display: none; }`}</style>\n        <h3 className=\"c-expandable-block__header\">\n          {iconSvgText\n            ? renderSvg(\"c-expandable-block__header-icon\", iconSvgText)\n            : null}\n          {text}\n          {caret(\"c-expandable-block__header-caret\", true)}\n        </h3>\n        <div className=\"c-expandable-block__panel\" role=\"region\">\n          {children}\n        </div>\n      </noscript>\n    </>\n  );\n};\n\nexport default ExpandableBlock;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>red line</title><path fill=\\\"#da291c\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M6.015 4.25a2.397 2.397 0 01.909.163 2.097 2.097 0 01.694.446 1.935 1.935 0 01.44.657 2.098 2.098 0 01.153.803 2.262 2.262 0 01-.278 1.145 1.747 1.747 0 01-.91.735v.022a1.265 1.265 0 01.505.257 1.421 1.421 0 01.325.41 1.912 1.912 0 01.184.52 4.563 4.563 0 01.08.567l.02.42c.007.161.02.326.037.493a3.412 3.412 0 00.084.478 1.113 1.113 0 00.174.384h-1.65a2.914 2.914 0 01-.168-.851 12.616 12.616 0 00-.095-.945 1.5 1.5 0 00-.356-.862 1.233 1.233 0 00-.893-.273H3.62v2.931H1.971v-7.5zm-.587 3.392a1.247 1.247 0 00.85-.251 1.045 1.045 0 00.284-.82.998.998 0 00-.284-.793 1.264 1.264 0 00-.85-.246H3.62v2.11zM11.204 4.25v6.113h3.656v1.387H9.555v-7.5z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>orange line</title><path fill=\\\"#ed8b00\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M1.818 6.544a3.592 3.592 0 01.693-1.2 3.18 3.18 0 011.11-.803A3.62 3.62 0 015.1 4.25a3.613 3.613 0 011.486.291 3.175 3.175 0 011.104.803 3.594 3.594 0 01.693 1.2 4.474 4.474 0 01.242 1.491 4.327 4.327 0 01-.242 1.46 3.49 3.49 0 01-.693 1.18 3.176 3.176 0 01-1.104.789 3.67 3.67 0 01-1.486.286 3.677 3.677 0 01-1.48-.286 3.181 3.181 0 01-1.11-.789 3.488 3.488 0 01-.693-1.18 4.327 4.327 0 01-.24-1.46 4.474 4.474 0 01.24-1.49zm1.44 2.37a2.377 2.377 0 00.337.768 1.723 1.723 0 00.603.547 1.835 1.835 0 00.903.206 1.842 1.842 0 00.904-.206 1.729 1.729 0 00.602-.547 2.357 2.357 0 00.336-.768 3.634 3.634 0 00.106-.879 3.907 3.907 0 00-.106-.914 2.407 2.407 0 00-.336-.788 1.711 1.711 0 00-.602-.552 1.847 1.847 0 00-.904-.206 1.84 1.84 0 00-.903.206 1.706 1.706 0 00-.603.552 2.428 2.428 0 00-.336.788 3.96 3.96 0 00-.105.914 3.683 3.683 0 00.105.879zM11.276 4.42v5.844h3.494v1.325H9.7V4.421z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>mattapan line</title><path fill=\\\"#da291c\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"M6.168 4L8.04 9.501h.022L9.831 4h2.477v8H10.66V6.33h-.023L8.678 12H7.321L5.36 6.387h-.022V12H3.692V4z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>commuter rail</title><path fill=\\\"#80276c\\\" d=\\\"M6.212 11.848l3.627.145-.04 1-3.628-.146z\\\"></path><path fill=\\\"#80276c\\\" d=\\\"M8 0A8.021 8.021 0 00.342 10.376a7.784 7.784 0 005.282 5.282A8.008 8.008 0 108 0\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M10.33 11.75l1.15-.85a1.47 1.47 0 00.52-.84V5.24a.889.889 0 00-.3-.66.793.793 0 01-.31-.6l-.01-1.19a.82.82 0 00-.65-.79 20.918 20.918 0 00-2.5-.52 1.065 1.065 0 00-.47 0c-.7.15-1.55.3-2.24.48-.42.12-.85.35-.85.85v1.18a.803.803 0 01-.33.61.851.851 0 00-.31.66v4.8a1.41 1.41 0 00.48.84l1.1.81-1.74 2.84H5l.24-.39h5.53l.13.22.02.03.08.14h1.05zm.95-2.3a.73.73 0 11-.73-.73.728.728 0 01.73.73zM9.84 12.6H6.19l.41-.68h2.84l.03.06.35.58zM8.7 2.95a.245.245 0 01.3-.24l1.21.25a.254.254 0 01.2.24v.73a.25.25 0 01-.3.24L8.9 3.93a.238.238 0 01-.2-.24zm-.72 2.26a.82.82 0 11-.82.82.824.824 0 01.82-.82zM5.66 3.2a.254.254 0 01.2-.24l1.21-.25a.249.249 0 01.3.24v.74a.247.247 0 01-.2.24l-1.22.24a.246.246 0 01-.29-.24zm-.2 6.98a.73.73 0 11.73-.73.728.728 0 01-.73.73zm0 3.61l.5-.82h4.1l.49.82z\\\"></path><path d=\\\"M11 14.55h-.01l-.07-.14z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>bus</title><path fill=\\\"#ffc72c\\\" d=\\\"M8.035 0a8.04 8.04 0 00-8 8 8 8 0 108-8\\\"></path><path fill=\\\"#1c1e23\\\" d=\\\"M12.552 6.955l-.44-3.298c-.115-.594-.506-.83-1.088-1.074a9.948 9.948 0 00-2.993-.52 9.941 9.941 0 00-2.987.52c-.575.243-.973.48-1.095 1.074l-.433 3.298v4.555h.808v.777a.567.567 0 00.297.487c.04.02.081.04.115.054a.689.689 0 00.095.027.576.576 0 00.155.02h.23a.636.636 0 00.669-.588v-.777h4.363v.777a.567.567 0 00.297.487c.04.02.081.04.115.054a.689.689 0 00.095.027.576.576 0 00.155.02h.23a.636.636 0 00.669-.588v-.777h.743zm-6.643-3.94h4.25c.203 0 .372.231.372.508s-.169.508-.372.508H5.91c-.203 0-.372-.23-.372-.508s.169-.507.372-.507zM4.869 7.57l.3-2.334a.314.314 0 01.323-.267h5.125a.318.318 0 01.322.267l.344 2.334v.104A.326.326 0 0110.96 8H5.179a.332.332 0 01-.31-.339.233.233 0 010-.091zm.647 2.753a.829.829 0 11-.037-1.654.831.831 0 11.037 1.654zm5.015 0a.829.829 0 11-.037-1.654.831.831 0 11.037 1.654z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>ferry</title><path fill=\\\"#008eaa\\\" d=\\\"M14.14 13.11v-2.78H12.6v4.21a.01.01 0 01-.01.01 7.967 7.967 0 01-9.18-.01c-.08-.06-.16-.11-.24-.18l-1.53-1.52A7.916 7.916 0 010 8a8 8 0 0116 0 7.895 7.895 0 01-1.86 5.11z\\\"></path><path fill=\\\"#008eaa\\\" d=\\\"M14.14 10.33v2.78a2.338 2.338 0 01-.29.35 7.576 7.576 0 01-1.25 1.08v-4.21z\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M12.6 13.07v1.1a.817.817 0 01-.19-.09 1.085 1.085 0 00-1.15-.03 1.327 1.327 0 01-1.36.03 1.113 1.113 0 00-1.19-.04 1.457 1.457 0 01-1.43 0 1.093 1.093 0 00-1.19.04 1.305 1.305 0 01-1.36-.04 1.125 1.125 0 00-1.16.04.25.25 0 00-.07.04v-1.09a.076.076 0 00.04-.02 1.229 1.229 0 011.4.08 1.38 1.38 0 001.19-.07 1.186 1.186 0 011.29.04 1.314 1.314 0 001.16 0 1.186 1.186 0 011.29-.04 1.383 1.383 0 001.19.07 1.247 1.247 0 011.4-.08.351.351 0 00.14.06zM11.06 10.98a.878.878 0 01-.15.05 3.517 3.517 0 01-.16-1.49 10.814 10.814 0 011.85-2.66l-.6-.24V3h-1V2H9.01v.01H9V2h.01v-.99h-2V2H5v1H4v3.64l-.59.24a10.467 10.467 0 011.83 2.64 3.75 3.75 0 01-.15 1.5.418.418 0 01-.15-.04 1.226 1.226 0 00-1.4-.07c-.01.01-.03.01-.04.02v1.08c.02-.01.05-.03.07-.04a1.102 1.102 0 011.16-.03 1.327 1.327 0 001.36.03 1.092 1.092 0 011.19-.03 1.457 1.457 0 001.43 0 1.093 1.093 0 011.19.04 1.328 1.328 0 001.36-.04 1.129 1.129 0 011.15.03 1.737 1.737 0 00.19.1v-1.1a.423.423 0 01-.14-.06 1.262 1.262 0 00-1.4.07zM8 2h.01v.01H8zm2.01 3.84V5H9V4H7v1H6v.84l-1 .4V4h1V3h4v1h1v2.24z\\\"></path><path d=\\\"M8 2h.01v.01H8zM9 2h.01v.01H9z\\\"></path><path d=\\\"M8 2h.01v.01H8zM9 2h.01v.01H9z\\\"></path></g></svg>\"","import schedule from \"./schedule/schedule-loader\";\n\nschedule();\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Provider } from \"react-redux\";\nimport { isEmpty } from \"lodash\";\nimport { updateInLocation } from \"use-query-params\";\nimport Map from \"./components/Map\";\nimport { SchedulePageData, SelectedOrigin } from \"./components/__schedule\";\nimport { MapData } from \"../leaflet/components/__mapdata\";\nimport { DirectionId } from \"../__v3api\";\nimport ScheduleLoader from \"./components/ScheduleLoader\";\nimport {\n  store,\n  createScheduleStore,\n  getCurrentState\n} from \"./store/ScheduleStore\";\n\nconst renderMap = ({\n  route_patterns: routePatternsByDirection,\n  direction_id: directionId\n}: SchedulePageData): void => {\n  const routePatterns = routePatternsByDirection[directionId];\n  const shapeIds = routePatterns.map(routePattern => routePattern.shape_id);\n  const mapDataEl = document.getElementById(\"js-map-data\");\n  if (!mapDataEl) return;\n  const channel = mapDataEl.getAttribute(\"data-channel-id\");\n  if (!channel) throw new Error(\"data-channel-id attribute not set\");\n  const mapEl = document.getElementById(\"map-root\");\n  if (!mapEl) throw new Error(\"cannot find #map-root\");\n  const mapData: MapData = JSON.parse(mapDataEl.innerHTML);\n  ReactDOM.render(\n    <Map data={mapData} channel={channel} shapeIds={shapeIds} />,\n    mapEl\n  );\n};\n\nconst updateURL = (origin: SelectedOrigin, direction?: DirectionId): void => {\n  if (window) {\n    // eslint-disable-next-line camelcase\n    const newQuery = {\n      \"schedule_finder[direction_id]\":\n        direction !== undefined ? direction.toString() : \"\",\n      \"schedule_finder[origin]\": origin\n    };\n    const newLoc = updateInLocation(newQuery, window.location);\n    // newLoc is not a true Location, so toString doesn't work\n    window.history.replaceState({}, \"\", `${newLoc.pathname}${newLoc.search}`);\n  }\n};\n\nexport const renderSchedulePage = (\n  schedulePageData: SchedulePageData\n): void => {\n  const { schedule_note: scheduleNote } = schedulePageData;\n\n  ReactDOM.render(\n    <Provider store={store}>\n      <ScheduleLoader\n        component=\"MAIN\"\n        schedulePageData={schedulePageData}\n        updateURL={updateURL}\n      />\n    </Provider>,\n    document.getElementById(\"react-root\")\n  );\n  // Now we (conditionally) render \"secondary\" widgets:\n  // (only one will be shown at a time, depending on whether mobile or desktop)\n  if (scheduleNote) {\n    ReactDOM.render(\n      <Provider store={store}>\n        <ScheduleLoader\n          component=\"SCHEDULE_NOTE\"\n          schedulePageData={schedulePageData}\n          updateURL={updateURL}\n        />\n      </Provider>,\n      document.getElementById(\"react-schedule-note-root\")\n    );\n  } else {\n    const scheduleFinderRoot = document.getElementById(\n      \"react-schedule-finder-root\"\n    );\n    if (scheduleFinderRoot) {\n      ReactDOM.render(\n        <Provider store={store}>\n          <ScheduleLoader\n            component=\"SCHEDULE_FINDER\"\n            schedulePageData={schedulePageData}\n            updateURL={updateURL}\n          />\n        </Provider>,\n        scheduleFinderRoot\n      );\n    }\n  }\n};\n\nconst renderDirectionAndMap = (\n  schedulePageData: SchedulePageData,\n  root: HTMLElement\n): void => {\n  const currentState = getCurrentState();\n  if (!!currentState && Object.keys(currentState).length !== 0) {\n    ReactDOM.render(\n      <Provider store={store}>\n        <ScheduleLoader\n          component=\"SCHEDULE_DIRECTION\"\n          schedulePageData={schedulePageData}\n          updateURL={updateURL}\n        />\n      </Provider>,\n      root\n    );\n  }\n};\n\nexport const renderDirectionOrMap = (\n  schedulePageData: SchedulePageData\n): void => {\n  const root = document.getElementById(\"react-schedule-direction-root\");\n  if (!root) {\n    renderMap(schedulePageData);\n    return;\n  }\n  renderDirectionAndMap(schedulePageData, root);\n};\n\nconst render = (): void => {\n  const schedulePageDataEl = document.getElementById(\"js-schedule-page-data\");\n  if (!schedulePageDataEl) return;\n  const schedulePageData = JSON.parse(\n    schedulePageDataEl.innerHTML\n  ) as SchedulePageData;\n  const {\n    direction_id: directionId,\n    route_patterns: routePatterns\n  } = schedulePageData;\n  createScheduleStore(directionId);\n\n  if (!isEmpty(routePatterns)) {\n    renderSchedulePage(schedulePageData);\n    renderDirectionOrMap(schedulePageData);\n  }\n};\n\nconst onLoad = (): void => {\n  render();\n};\n\nexport default onLoad;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>alert</title><path fill=\\\"#1c1e23\\\" d=\\\"M47.55 42.537L27.01 1.934a3.61 3.61 0 00-1.27-1.4 3.083 3.083 0 00-3.47 0 3.572 3.572 0 00-1.253 1.4L.477 42.537a3.715 3.715 0 000 3.642 3.473 3.473 0 001.252 1.323A3.217 3.217 0 003.436 48h41.118a3.161 3.161 0 001.688-.498 3.472 3.472 0 001.252-1.323 3.715 3.715 0 00.057-3.642z\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M27.043 39.223a.713.713 0 01-.22.544.733.733 0 01-.54.233h-4.568a.733.733 0 01-.54-.233.772.772 0 01-.218-.544v-4.446a.772.772 0 01.219-.544.733.733 0 01.54-.233h4.568a.734.734 0 01.54.233.714.714 0 01.22.544zM26.738 30.359a.625.625 0 01-.235.457.706.706 0 01-.516.183H21.86a.734.734 0 01-.516-.183.535.535 0 01-.219-.457l-1.121-14.482a.71.71 0 01.218-.585.76.76 0 01.516-.292h6.512a.814.814 0 01.532.292.704.704 0 01.219.53z\\\"></path></g></svg>\"","import { Socket, Channel } from \"phoenix\";\n\ndeclare global {\n  interface Window {\n    channels: { [id: string]: Channel };\n    socket?: Socket;\n  }\n}\n\ntype UpdateEventName = \"reset\" | \"add\" | \"update\" | \"setChannel\";\n\ninterface UpdateEvent<T> {\n  event: UpdateEventName;\n  data: T;\n}\n\ninterface RemoveEvent {\n  event: \"remove\";\n  data: string[];\n}\n\nexport type SocketEvent<T> = UpdateEvent<T> | RemoveEvent;\n\nexport const doInitChannel = (id: string): Channel => {\n  if (!window.socket) {\n    window.socket = new Socket(\"/socket\", {});\n    window.socket.connect();\n  }\n\n  if (!window.channels) {\n    window.channels = {};\n  }\n\n  if (window.channels[id]) return window.channels[id];\n\n  const channel = window.socket.channel(id, {});\n  window.channels[id] = channel;\n\n  channel\n    .join()\n    .receive(\"error\", ({ reason }) =>\n      // eslint-disable-next-line no-console\n      console.error(`failed to join ${id}`, reason)\n    )\n    // eslint-disable-next-line no-console\n    .receive(\"timeout\", () => console.error(`timeout joining ${id}`))\n    .receive(\"ok\", () => {\n      if (id !== \"vehicles:remove\") {\n        const route = id.split(\":\");\n        channel.push(\"init\", {\n          // eslint-disable-next-line camelcase\n          route_id: route[1],\n          // eslint-disable-next-line camelcase\n          direction_id: route[2]\n        });\n      }\n    });\n\n  return channel;\n};\n\nexport const initChannel = <T>(\n  channelId: string,\n  onData: (data: SocketEvent<T>) => void\n): void => {\n  const channel = doInitChannel(channelId);\n  channel.on(\"data\", onData);\n};\n\n// NB: this removes *all* handlers from the channel. We're currently throwing\n// away the reference returned by `channel.on`, so we can't remove a specific\n// handler, but we don't have a use case for that yet.\nexport const stopChannel = (id: string): void => {\n  if (window.channels && window.channels[id]) {\n    window.channels[id].off(\"data\");\n  }\n};\n","import React, { ReactElement } from \"react\";\nimport { connect } from \"react-redux\";\nimport { useQueryParams, StringParam } from \"use-query-params\";\nimport SchedulePage from \"../components/SchedulePage\";\nimport ScheduleNote from \"../components/ScheduleNote\";\nimport ScheduleDirection from \"../components/ScheduleDirection\";\nimport {\n  SchedulePageData,\n  SelectedOrigin,\n  ComponentToRender\n} from \"../components/__schedule\";\nimport { MapData, StaticMapData } from \"../../leaflet/components/__mapdata\";\nimport ScheduleFinder from \"../components/ScheduleFinder\";\nimport ScheduleFinderModal from \"../components/schedule-finder/ScheduleFinderModal\";\nimport { DirectionId } from \"../../__v3api\";\nimport {\n  mapStateToProps,\n  getCurrentState,\n  storeHandler\n} from \"../store/ScheduleStore\";\n\ninterface Props {\n  schedulePageData: SchedulePageData;\n  component: ComponentToRender;\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n}\n\nexport const ScheduleLoader = ({\n  component,\n  schedulePageData,\n  updateURL\n}: Props): ReactElement<HTMLElement> => {\n  const [query] = useQueryParams({\n    // eslint-disable-next-line camelcase\n    \"schedule_finder[direction_id]\": StringParam,\n    \"schedule_finder[origin]\": StringParam\n  });\n\n  const changeDirection = (direction: DirectionId): void => {\n    storeHandler({\n      type: \"CHANGE_DIRECTION\",\n      newStoreValues: {\n        selectedDirection: direction,\n        selectedOrigin: null\n      }\n    });\n  };\n\n  const changeOrigin = (origin: SelectedOrigin): void => {\n    storeHandler({\n      type: \"CHANGE_ORIGIN\",\n      newStoreValues: {\n        selectedOrigin: origin\n      }\n    });\n    // reopen modal depending on choice:\n    storeHandler({\n      type: \"OPEN_MODAL\",\n      newStoreValues: {\n        modalMode: origin ? \"schedule\" : \"origin\"\n      }\n    });\n  };\n\n  const closeModal = (): void => {\n    storeHandler({\n      type: \"CLOSE_MODAL\",\n      newStoreValues: {}\n    });\n    // clear parameters from URL when closing the modal:\n    updateURL(\"\");\n  };\n\n  React.useEffect(() => {\n    // get initial values from the store:\n    const currentState = getCurrentState();\n    const { selectedDirection, selectedOrigin } = currentState;\n    let { modalOpen, modalMode } = currentState;\n\n    let newDirection: DirectionId | undefined;\n    let newOrigin: SelectedOrigin | undefined;\n\n    // modify the store values in case URL has parameters:\n    if (query[\"schedule_finder[direction_id]\"] !== undefined) {\n      newDirection = query[\"schedule_finder[direction_id]\"] === \"0\" ? 0 : 1;\n    }\n    if (query[\"schedule_finder[origin]\"] !== undefined) {\n      newOrigin = query[\"schedule_finder[origin]\"];\n    }\n\n    if (newDirection !== undefined && newOrigin !== undefined) {\n      modalMode = \"schedule\";\n      modalOpen = true;\n    }\n\n    storeHandler({\n      type: \"INITIALIZE\",\n      newStoreValues: {\n        selectedDirection: newDirection || selectedDirection,\n        selectedOrigin: newOrigin || selectedOrigin,\n        modalMode,\n        modalOpen\n      }\n    });\n    // we disable linting in this next line because we DO want to specify an empty array since we want this piece to run only once\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const handleOriginSelectClick = (): void => {\n    storeHandler({\n      type: \"OPEN_MODAL\",\n      newStoreValues: {\n        modalMode: \"origin\"\n      }\n    });\n  };\n\n  const {\n    route,\n    stops,\n    services,\n    route_patterns: routePatternsByDirection,\n    schedule_note: scheduleNote,\n    today,\n    line_diagram: lineDiagram,\n    shape_map: shapesById,\n    variant: initialSelectedRoutePatternId\n  } = schedulePageData;\n\n  const currentState = getCurrentState();\n  if (!!currentState && Object.keys(currentState).length !== 0) {\n    const {\n      selectedDirection: currentDirection,\n      selectedOrigin,\n      modalOpen,\n      modalMode\n    } = currentState;\n\n    // check first if this is a unidirectional route:\n    let readjustedDirectionId: DirectionId = currentDirection;\n    if (\n      !Object.keys(routePatternsByDirection).includes(\n        currentDirection.toString()\n      )\n    ) {\n      // This route doesn't have this direction, so pick first existing direction\n      readjustedDirectionId = parseInt(\n        Object.keys(routePatternsByDirection)[0],\n        10\n      ) as DirectionId;\n      changeDirection(readjustedDirectionId);\n      updateURL(selectedOrigin, readjustedDirectionId);\n    }\n\n    if (component === \"MAIN\") {\n      return (\n        <SchedulePage\n          updateURL={updateURL}\n          schedulePageData={schedulePageData}\n          closeModal={closeModal}\n          selectedDirection={readjustedDirectionId}\n          changeDirection={changeDirection}\n          selectedOrigin={selectedOrigin}\n          changeOrigin={changeOrigin}\n          modalOpen={modalOpen}\n          modalMode={modalMode}\n        />\n      );\n    }\n\n    if (component === \"SCHEDULE_NOTE\" && scheduleNote) {\n      return (\n        <>\n          <ScheduleNote\n            className=\"m-schedule-page__schedule-notes--mobile\"\n            scheduleNote={scheduleNote}\n          />\n          {modalOpen && (\n            <ScheduleFinderModal\n              closeModal={closeModal}\n              directionChanged={changeDirection}\n              initialMode={modalMode}\n              initialDirection={readjustedDirectionId}\n              initialOrigin={selectedOrigin}\n              handleOriginSelectClick={handleOriginSelectClick}\n              originChanged={changeOrigin}\n              route={route}\n              routePatternsByDirection={routePatternsByDirection}\n              scheduleNote={scheduleNote}\n              services={services}\n              stops={stops}\n              today={today}\n              updateURL={updateURL}\n            />\n          )}\n        </>\n      );\n    }\n\n    if (component === \"SCHEDULE_FINDER\") {\n      return (\n        <ScheduleFinder\n          updateURL={updateURL}\n          route={route}\n          stops={stops}\n          services={services}\n          routePatternsByDirection={routePatternsByDirection}\n          today={today}\n          scheduleNote={null}\n          modalMode={modalMode}\n          modalOpen={modalOpen}\n          directionId={readjustedDirectionId}\n          changeDirection={changeDirection}\n          selectedOrigin={selectedOrigin}\n          changeOrigin={changeOrigin}\n          closeModal={closeModal}\n        />\n      );\n    }\n\n    if (component === \"SCHEDULE_DIRECTION\") {\n      let mapData: MapData | undefined;\n      const mapDataEl = document.getElementById(\"js-map-data\");\n      if (mapDataEl) {\n        mapData = JSON.parse(mapDataEl.innerHTML);\n      }\n\n      let staticMapData: StaticMapData | undefined;\n      const staticDataEl = document.getElementById(\"static-map-data\");\n      if (staticDataEl) {\n        staticMapData = JSON.parse(staticDataEl.innerHTML);\n      }\n\n      return (\n        <ScheduleDirection\n          directionId={readjustedDirectionId}\n          route={route}\n          routePatternsByDirection={routePatternsByDirection}\n          shapesById={shapesById}\n          mapData={mapData}\n          staticMapData={staticMapData}\n          lineDiagram={lineDiagram}\n          services={services}\n          stops={stops}\n          today={today}\n          scheduleNote={scheduleNote}\n          initialSelectedRoutePatternId={initialSelectedRoutePatternId}\n        />\n      );\n    }\n  }\n  return <></>;\n};\n\nexport default connect(mapStateToProps)(ScheduleLoader);\n","import React, { ReactElement } from \"react\";\nimport { SchedulePageData, SelectedOrigin } from \"./__schedule\";\nimport { DirectionId } from \"../../__v3api\";\nimport PDFSchedules from \"./PDFSchedules\";\nimport Connections from \"./Connections\";\nimport ContentTeasers from \"./ContentTeasers\";\nimport HoursOfOperation from \"./HoursOfOperation\";\nimport Fares from \"./Fares\";\nimport UpcomingHolidays from \"./UpcomingHolidays\";\nimport ScheduleNote from \"./ScheduleNote\";\nimport ScheduleFinder from \"./ScheduleFinder\";\nimport ScheduleFinderModal, {\n  Mode as ModalMode\n} from \"./schedule-finder/ScheduleFinderModal\";\nimport { storeHandler } from \"../store/ScheduleStore\";\n\ninterface Props {\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n  schedulePageData: SchedulePageData;\n  modalOpen: boolean;\n  modalMode: ModalMode;\n  closeModal: () => void;\n  changeDirection: (direction: DirectionId) => void;\n  selectedDirection: DirectionId;\n  selectedOrigin: SelectedOrigin;\n  changeOrigin: (origin: SelectedOrigin) => void;\n}\n\n// don't show Schedule Finder for subway\nconst SchedulePage = ({\n  schedulePageData: {\n    connections,\n    pdfs,\n    teasers,\n    hours,\n    fares,\n    holidays,\n    fare_link: fareLink,\n    route,\n    schedule_note: scheduleNote,\n    services,\n    stops,\n    route_patterns: routePatternsByDirection,\n    today\n  },\n  updateURL,\n  closeModal,\n  changeDirection,\n  changeOrigin,\n  modalOpen,\n  modalMode,\n  selectedDirection,\n  selectedOrigin\n}: Props): ReactElement<HTMLElement> => {\n  const handleOriginSelectClick = (): void => {\n    storeHandler({\n      type: \"OPEN_MODAL\",\n      newStoreValues: {\n        modalMode: \"origin\"\n      }\n    });\n  };\n  return (\n    <>\n      {scheduleNote ? (\n        <>\n          <ScheduleNote\n            className=\"m-schedule-page__schedule-notes--desktop\"\n            scheduleNote={scheduleNote}\n          />\n          {modalOpen && (\n            <ScheduleFinderModal\n              closeModal={closeModal}\n              directionChanged={changeDirection}\n              initialMode={modalMode}\n              initialDirection={selectedDirection}\n              initialOrigin={selectedOrigin}\n              handleOriginSelectClick={handleOriginSelectClick}\n              originChanged={changeOrigin}\n              route={route}\n              routePatternsByDirection={routePatternsByDirection}\n              scheduleNote={scheduleNote}\n              services={services}\n              stops={stops}\n              today={today}\n              updateURL={updateURL}\n            />\n          )}\n        </>\n      ) : (\n        <ScheduleFinder\n          updateURL={updateURL}\n          route={route}\n          services={services}\n          stops={stops}\n          routePatternsByDirection={routePatternsByDirection}\n          today={today}\n          scheduleNote={null}\n          directionId={selectedDirection}\n          selectedOrigin={selectedOrigin}\n          changeDirection={changeDirection}\n          changeOrigin={changeOrigin}\n          closeModal={closeModal}\n          modalMode={modalMode}\n          modalOpen={modalOpen}\n        />\n      )}\n      <ContentTeasers teasers={teasers} />\n      <PDFSchedules pdfs={pdfs} />\n      <Connections connections={connections} />\n      <Fares fares={fares} fareLink={fareLink} routeType={route.type} />\n      <HoursOfOperation hours={hours} />\n      <UpcomingHolidays holidays={holidays} />\n    </>\n  );\n};\nexport default SchedulePage;\n","import { TripPrediction } from \"../schedule/components/__trips\";\nimport { HeadsignWithCrowding } from \"../__v3api\";\n\n// eslint-disable-next-line import/prefer-default-export\nexport const isSkippedOrCancelled = (\n  prediction: TripPrediction | null\n): boolean =>\n  prediction\n    ? prediction.schedule_relationship === \"skipped\" ||\n      prediction.schedule_relationship === \"cancelled\"\n    : false;\n\nexport const hasPredictionTime = ({\n  time_data_with_crowding_list: timeDataList\n}: HeadsignWithCrowding): boolean =>\n  !!(\n    timeDataList &&\n    timeDataList[0] &&\n    timeDataList[0].time_data &&\n    timeDataList[0].time_data.prediction &&\n    timeDataList[0].time_data.prediction.time\n  );\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { SchedulePDF } from \"./__schedule\";\nimport renderSvg from \"../../helpers/render-svg\";\nimport pdfIcon from \"../../../static/images/icon-pdf-default.svg\";\n\nconst link = (pdf: SchedulePDF): ReactElement<HTMLElement> => (\n  <a\n    key={pdf.url}\n    href={pdf.url}\n    rel=\"noopener noreferrer\"\n    target=\"_blank\"\n    className=\"m-schedule-page__sidebar-pdfs\"\n  >\n    {renderSvg(\"c-svg__icon-pdf\", pdfIcon)}\n    {pdf.title}\n  </a>\n);\n\ninterface Props {\n  pdfs: SchedulePDF[];\n}\n\nconst PDFSchedules = ({ pdfs }: Props): ReactElement<HTMLElement> | null =>\n  pdfs.length > 0 ? (\n    <ExpandableBlock\n      header={{ text: \"PDF Schedules\", iconSvgText: null }}\n      initiallyExpanded\n      id=\"pdfs\"\n    >\n      <>{pdfs.map(pdf => link(pdf))}</>\n    </ExpandableBlock>\n  ) : null;\n\nexport default PDFSchedules;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>pdf</title><path d=\\\"M40.82 11.75L29.71.63A2.18 2.18 0 0028.19 0H10.55a4 4 0 00-4 4v40a4 4 0 004 4h26.9a4 4 0 004-4V13.27a2.12 2.12 0 00-.63-1.52zM29.08 4.47L37 12.38h-6.94a1 1 0 01-1-1zM38.45 44a1 1 0 01-1 1h-26.9a1 1 0 01-1-1V4a1 1 0 011-1h15.53v8.39a4 4 0 004 4h8.39z\\\"></path><path d=\\\"M16.31 21.05h-3.7v8.64h1.79v-3.11h1.8a3.27 3.27 0 002.16-.58 2.66 2.66 0 00.76-2.16 2.59 2.59 0 00-.76-2.07 3 3 0 00-2.05-.72zm.69 3.73a1.37 1.37 0 01-1 .31h-1.6v-2.54H16a1.47 1.47 0 011 .29 1.21 1.21 0 01.34 1 1.28 1.28 0 01-.34.94zM27.1 22.33a2.81 2.81 0 00-1.47-1.09 4.54 4.54 0 00-1.34-.19h-3.72v8.64h3.72a3.13 3.13 0 002.9-1.61 5.76 5.76 0 00.69-2.92 6.6 6.6 0 00-.16-1.43 3.91 3.91 0 00-.62-1.4zm-1.33 4.6A1.79 1.79 0 0124 28.19h-1.68v-5.64H24a1.73 1.73 0 011.64.71 4 4 0 01.42 2 4.32 4.32 0 01-.29 1.67zM29.23 29.69h1.8v-3.62h3.82v-1.5h-3.82v-1.99h4.36v-1.52h-6.16z\\\"></path></svg>\"","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport RoutePillList from \"../../stop/components/RoutePillList\";\nimport { TypedRoutes } from \"../../stop/components/__stop\";\n\ninterface Props {\n  connections: TypedRoutes[];\n}\n\nconst Connections = ({\n  connections\n}: Props): ReactElement<HTMLDivElement> | null =>\n  connections.length ? (\n    <ExpandableBlock\n      header={{ text: \"Connections\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"connections\"\n    >\n      <RoutePillList routes={connections} showGroupName />\n    </ExpandableBlock>\n  ) : null;\n\nexport default Connections;\n","import React, { ReactElement } from \"react\";\n\ninterface Props {\n  teasers: string | null;\n}\n\nconst ContentTeasers = ({ teasers }: Props): ReactElement<HTMLElement> | null =>\n  // eslint-disable-next-line react/no-danger\n  teasers ? <div dangerouslySetInnerHTML={{ __html: teasers }} /> : null;\n\nexport default ContentTeasers;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\n\nconst HoursOfOperation = ({\n  hours\n}: {\n  hours: string;\n}): ReactElement<HTMLElement> | null =>\n  hours ? (\n    <ExpandableBlock\n      header={{ text: \"Hours of Operation\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"hours\"\n    >\n      <div\n        className=\"m-schedule-page__sidebar-hours\"\n        // eslint-disable-next-line react/no-danger\n        dangerouslySetInnerHTML={{ __html: hours }}\n      />\n    </ExpandableBlock>\n  ) : null;\n\nexport default HoursOfOperation;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { Fare } from \"./__schedule\";\nimport { RouteType } from \"../../__v3api\";\n\nconst fareItem = (fare: Fare): ReactElement<HTMLElement> => (\n  <p key={fare.title} className=\"m-schedule-page__fare\">\n    <span>{fare.title}</span>\n    <span>{fare.price}</span>\n  </p>\n);\n\ninterface Props {\n  fares: Fare[];\n  fareLink: string;\n  routeType: RouteType;\n}\n\nconst Fares = ({\n  fares,\n  fareLink,\n  routeType\n}: Props): ReactElement<HTMLElement> | null =>\n  fares.length > 0 ? (\n    <ExpandableBlock\n      header={{ text: \"Fares\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"fares\"\n    >\n      <>\n        {fares.map(f => fareItem(f))}\n        {routeType === 2 && (\n          <p>\n            <a className=\"c-call-to-action\" href=\"/fares/commuter-rail-fares\">\n              Commuter Rail Fares\n            </a>\n          </p>\n        )}\n        <p className=\"m-schedule-page__link\">\n          <a className=\"c-call-to-action\" href={fareLink}>\n            More about fares\n          </a>\n        </p>\n      </>\n    </ExpandableBlock>\n  ) : null;\n\nexport default Fares;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { Holiday } from \"./__schedule\";\n\ninterface Props {\n  holidays: Holiday[];\n}\n\nconst UpcomingHolidays = ({\n  holidays\n}: Props): ReactElement<HTMLElement> | null =>\n  holidays.length > 0 ? (\n    <ExpandableBlock\n      header={{ text: \"Upcoming Holidays\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"holidays\"\n    >\n      <>\n        <ul className=\"c-unordered-list m-schedule-page__sidebar-list\">\n          {holidays.map(\n            (holiday: Holiday): ReactElement<HTMLElement> => (\n              <li key={holiday.date} className=\"c-unordered-list-item\">\n                {holiday.name} ({holiday.date})\n              </li>\n            )\n          )}\n        </ul>\n        <a className=\"c-call-to-action\" href=\"/holiday\">\n          View holiday schedules\n        </a>\n      </>\n    </ExpandableBlock>\n  ) : null;\n\nexport default UpcomingHolidays;\n","import React, {\n  MouseEvent,\n  ReactElement,\n  ReactNode,\n  useEffect,\n  useLayoutEffect,\n  useRef\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport createFocusTrap from \"focus-trap\";\nimport { handleReactExitKeyPress } from \"../helpers/keyboard-events\";\nimport {\n  AriaLabel,\n  AriaLabelledBy,\n  labelOrDescribedBy\n} from \"../helpers/aria-props\";\n\ninterface Props {\n  children: ReactNode;\n  closeText?: string | ReactElement<HTMLElement>;\n  role?: \"dialog\" | \"alertdialog\";\n  ariaLabel: AriaLabel | AriaLabelledBy;\n  focusElementId?: string; // a selector string to the DOM node that will receive focus when the model is first opened\n  className?: string;\n  closeModal: Function;\n}\n\ninterface ModalContentProps {\n  children: ReactNode;\n  closeText: string | ReactElement<HTMLElement>;\n  role: string;\n  ariaLabel: AriaLabel | AriaLabelledBy;\n  closeModal: Function;\n  focusElementId: string;\n  bodyPadding: string;\n  scrollBarPadding: number;\n  className?: string;\n}\n\nconst ModalContent = ({\n  children,\n  closeText,\n  closeModal,\n  role,\n  ariaLabel,\n  focusElementId,\n  bodyPadding,\n  scrollBarPadding,\n  className = \"\"\n}: ModalContentProps): ReactElement<HTMLElement> => {\n  const asideRef = useRef<HTMLElement>(null);\n  const onClickAway = (e: MouseEvent): void => {\n    if (e.target === asideRef.current) closeModal();\n  };\n\n  // In Chrome (and others?), swapping out the modal content doesn't reset the\n  // scroll position. Here we reset it manually whenever the content changes.\n  const scrollRef = useRef<HTMLDivElement>(null);\n  useEffect(\n    () => {\n      if (scrollRef.current && scrollRef.current.scrollTo) {\n        scrollRef.current.scrollTo({ top: 0 });\n      }\n    },\n    [children]\n  );\n\n  useLayoutEffect(() => {\n    // Activate trap and disable scroll on background body\n    const trap = createFocusTrap(\"#modal-cover\", {\n      initialFocus: `#${focusElementId}`,\n      clickOutsideDeactivates: true\n    });\n    trap.activate();\n\n    const htmlElement = document.getElementsByTagName(\"html\")[0];\n    const bodyWrapper = document.getElementById(\"body-wrapper\");\n    if (bodyWrapper) {\n      // aria-hidden for mobile devices where we want to emulate \"focus\" behavior\n      bodyWrapper.setAttribute(\"aria-hidden\", \"true\");\n      htmlElement.classList.add(\"modal-open\");\n      bodyWrapper.style.paddingRight = `${scrollBarPadding}px`;\n    }\n\n    // Deactivate\n    return () => {\n      if (bodyWrapper) {\n        bodyWrapper.setAttribute(\"aria-hidden\", \"false\");\n        htmlElement.classList.remove(\"modal-open\");\n        bodyWrapper.style.paddingRight = bodyPadding;\n      }\n      trap.deactivate();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return createPortal(\n    // This does have a role\n    // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n    <aside\n      ref={asideRef}\n      aria-modal\n      {...labelOrDescribedBy(ariaLabel)}\n      role={role}\n      id=\"modal-cover\"\n      className=\"c-modal__cover\"\n      tabIndex={-1}\n      onKeyDown={e => handleReactExitKeyPress(e, closeModal)}\n      onClick={e => onClickAway(e)}\n    >\n      <div ref={scrollRef} className={`c-modal ${className}`}>\n        <button\n          id=\"modal-close\"\n          className=\"btn btn-secondary c-modal__close\"\n          onClick={() => closeModal()}\n          type=\"button\"\n        >\n          {closeText}\n        </button>\n        <div className=\"c-modal__content\">{children}</div>\n      </div>\n    </aside>,\n    document.body\n  );\n};\n\ninterface ModalWithNoScrollProps extends Props {\n  priorPadding: string;\n  paddingRight: number;\n}\n\nconst Modal = ({\n  children,\n  closeText = \"Close\",\n  role = \"dialog\",\n  ariaLabel,\n  focusElementId = \"modal-close\",\n  priorPadding,\n  paddingRight,\n  className,\n  closeModal\n}: ModalWithNoScrollProps): ReactElement<HTMLElement> | null => (\n  <ModalContent\n    bodyPadding={priorPadding}\n    scrollBarPadding={paddingRight}\n    closeText={closeText}\n    role={role}\n    ariaLabel={ariaLabel}\n    focusElementId={focusElementId}\n    className={className}\n    closeModal={closeModal}\n  >\n    {children}\n  </ModalContent>\n);\n\n// Wrap modal to account for disabling scroll bar on background body\nconst WrappedModal = (props: Props): ReactElement<HTMLElement> | null => {\n  if (typeof document !== \"undefined\") {\n    const bodyWrapper = document.getElementById(\"body-wrapper\");\n    const priorPadding =\n      (bodyWrapper && bodyWrapper.style.paddingRight) || \"0px\";\n    const paddingRight = bodyWrapper\n      ? window.innerWidth - bodyWrapper.clientWidth\n      : 0;\n    return (\n      <Modal\n        {...props}\n        priorPadding={priorPadding}\n        paddingRight={paddingRight}\n      />\n    );\n  }\n  return null;\n};\n\nexport default WrappedModal;\n","/**\n * Replaces slashes in a given string with a slash + ZERO_WIDTH_SPACE.\n * It's visually the same, but allows browsers to break the text into multiple lines.\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const breakTextAtSlash = (str: string): string =>\n  str.replace(/\\//g, \"/​\");\n","export type AriaLabelling = AriaLabel | AriaLabelledBy;\n\nexport interface AriaLabel {\n  label: string;\n}\n\nexport interface AriaLabelledBy {\n  elementId: string;\n}\n\ninterface AriaLabelProp {\n  \"aria-label\": string;\n}\n\ninterface AriaLabelledByProp {\n  \"aria-labelledby\": string;\n}\n\nconst isLabel = (label: AriaLabelling): label is AriaLabel =>\n  (label as AriaLabel).label !== undefined;\n\nexport const labelOrDescribedBy = (\n  label: AriaLabel | AriaLabelledBy\n): AriaLabelProp | AriaLabelledByProp => {\n  if (isLabel(label)) {\n    return { \"aria-label\": label.label };\n  }\n  return { \"aria-labelledby\": label.elementId };\n};\n","import React, { ReactElement, useState } from \"react\";\nimport { SimpleStop, SelectedOrigin } from \"../__schedule\";\nimport OriginListItem from \"./OriginListItem\";\nimport SearchBox from \"../../../components/SearchBox\";\n\nconst stopListSearchFilter = (\n  stops: SimpleStop[],\n  originSearch: string\n): SimpleStop[] => {\n  if (originSearch.trim() === \"\") {\n    return stops;\n  }\n\n  const streetSuffixRegExp = /( s| st| | st\\.| str| stre| stree| street)$/gi;\n  const cleanSearch = originSearch.trim().replace(streetSuffixRegExp, \"\");\n\n  const regExp = new RegExp(cleanSearch, \"gi\");\n  return stops.filter(stop => (stop.name.match(regExp) || []).length > 0);\n};\n\ninterface Props {\n  selectedOrigin: SelectedOrigin;\n  stops: SimpleStop[];\n  handleChangeOrigin: Function;\n}\n\nconst OriginModalContent = ({\n  selectedOrigin,\n  stops,\n  handleChangeOrigin\n}: Props): ReactElement<HTMLElement> => {\n  const [originSearch, setOriginSearch] = useState(\"\");\n\n  return (\n    <>\n      <br />\n      <h3 className=\"schedule-finder__origin-text\">Choose an origin stop</h3>\n      <SearchBox\n        id=\"origin-filter\"\n        labelText=\"Choose an origin stop\"\n        className=\"schedule-finder__origin-search-container\"\n        placeholder=\"Filter stops and stations\"\n        onChange={setOriginSearch}\n      />\n      <p className=\"schedule-finder__origin-text\">\n        Select from the list below.\n      </p>\n      <div className=\"schedule-finder__origin-list\">\n        {stopListSearchFilter(stops, originSearch).map((stop: SimpleStop) => (\n          <OriginListItem\n            key={stop.id}\n            stop={stop}\n            changeOrigin={handleChangeOrigin}\n            selectedOrigin={selectedOrigin}\n            lastStop={stops[stops.length - 1]}\n          />\n        ))}\n      </div>\n    </>\n  );\n};\n\nexport default OriginModalContent;\n","import React, { ReactElement } from \"react\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport checkIcon from \"../../../../static/images/icon-checkmark.svg\";\nimport { SimpleStop, SelectedOrigin } from \"../__schedule\";\n\ninterface OriginListItemProps {\n  changeOrigin: Function;\n  stop: SimpleStop;\n  selectedOrigin: SelectedOrigin;\n  lastStop: SimpleStop;\n}\n\nconst OriginListItem = ({\n  changeOrigin,\n  stop,\n  selectedOrigin,\n  lastStop\n}: OriginListItemProps): ReactElement<HTMLElement> => {\n  const isDisabled = stop.is_closed || stop.id === lastStop.id;\n  const handleClick = (): void => {\n    if (isDisabled) return;\n    changeOrigin(stop.id);\n  };\n\n  return (\n    <div\n      tabIndex={0}\n      role=\"button\"\n      className={`schedule-finder__origin-list-item ${\n        stop.id === selectedOrigin ? \"active\" : \"\"\n      } ${isDisabled ? \"disabled\" : \"\"}`}\n      onClick={() => {\n        handleClick();\n      }}\n      onKeyUp={e =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n    >\n      <div className=\"schedule-finder__origin-list-leftpad\">\n        {stop.id === selectedOrigin\n          ? renderSvg(\"schedule-finder__check\", checkIcon)\n          : \"\"}{\" \"}\n      </div>\n      {stop.name}{\" \"}\n      {stop.zone && (\n        <span className=\"schedule-finder__zone\">Zone {stop.zone}</span>\n      )}\n    </div>\n  );\n};\n\nexport default OriginListItem;\n","import React, { ReactElement, useReducer, useEffect } from \"react\";\nimport { DirectionId, Route } from \"../../../__v3api\";\nimport { formattedDate } from \"../../../helpers/date\";\nimport { reducer } from \"../../../helpers/fetch\";\nimport { isInCurrentService } from \"../../../helpers/service\";\nimport {\n  SimpleStopMap,\n  RoutePatternsByDirection,\n  ServiceInSelector,\n  ScheduleNote as ScheduleNoteType,\n  SelectedOrigin,\n  UserInput\n} from \"../__schedule\";\nimport { EnhancedJourney } from \"../__trips\";\nimport ScheduleNote from \"../ScheduleNote\";\nimport ScheduleFinderForm from \"./ScheduleFinderForm\";\nimport DailySchedule from \"./daily-schedule/DailySchedule\";\nimport UpcomingDepartures from \"./upcoming-departures/UpcomingDepartures\";\n\ntype fetchAction =\n  | { type: \"FETCH_COMPLETE\"; payload: EnhancedJourney[] }\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\nexport const fetchData = (\n  routeId: string,\n  selectedOrigin: string,\n  selectedDirection: DirectionId,\n  dispatch: (action: fetchAction) => void\n): Promise<void> => {\n  dispatch({ type: \"FETCH_STARTED\" });\n  return (\n    window.fetch &&\n    window\n      .fetch(\n        `/schedules/finder_api/departures?id=${routeId}&stop=${selectedOrigin}&direction=${selectedDirection}`\n      )\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(json => dispatch({ type: \"FETCH_COMPLETE\", payload: json }))\n      // @ts-ignore\n      .catch(() => dispatch({ type: \"FETCH_ERROR\" }))\n  );\n};\n\ninterface Props {\n  handleChangeDirection: (direction: DirectionId) => void;\n  handleChangeOrigin: (origin: SelectedOrigin) => void;\n  handleOriginSelectClick: () => void;\n  route: Route;\n  selectedDirection: DirectionId;\n  selectedOrigin: string;\n  services: ServiceInSelector[];\n  stops: SimpleStopMap;\n  routePatternsByDirection: RoutePatternsByDirection;\n  today: string;\n  scheduleNote: ScheduleNoteType | null;\n}\n\nconst ScheduleModalContent = ({\n  handleChangeDirection,\n  handleChangeOrigin,\n  handleOriginSelectClick,\n  route,\n  selectedDirection,\n  selectedOrigin,\n  services,\n  stops,\n  routePatternsByDirection,\n  today,\n  scheduleNote\n}: Props): ReactElement<HTMLElement> | null => {\n  const { id: routeId } = route;\n\n  const [state, dispatch] = useReducer(reducer, {\n    data: null,\n    isLoading: true,\n    error: false\n  });\n\n  useEffect(\n    () => {\n      if (\n        routeId !== undefined &&\n        selectedOrigin !== undefined &&\n        selectedDirection !== undefined\n      ) {\n        fetchData(routeId, selectedOrigin, selectedDirection, dispatch);\n      }\n    },\n    [routeId, selectedDirection, selectedOrigin]\n  );\n\n  const serviceToday = services.some(service =>\n    isInCurrentService(service, new Date(today))\n  );\n\n  const input: UserInput = {\n    route: routeId,\n    origin: selectedOrigin,\n    date: today,\n    direction: selectedDirection\n  };\n\n  return (\n    <>\n      <div className=\"schedule-finder schedule-finder--modal\">\n        <ScheduleFinderForm\n          onDirectionChange={handleChangeDirection}\n          onOriginChange={handleChangeOrigin}\n          onOriginSelectClick={handleOriginSelectClick}\n          route={route}\n          selectedDirection={selectedDirection}\n          selectedOrigin={selectedOrigin}\n          stopsByDirection={stops}\n        />\n      </div>\n\n      {serviceToday ? (\n        <UpcomingDepartures state={state} input={input} />\n      ) : (\n        <div className=\"callout text-center u-bold\">\n          There are no scheduled trips for {formattedDate(today)}.\n        </div>\n      )}\n\n      {scheduleNote ? (\n        <ScheduleNote\n          className=\"m-schedule-page__schedule-notes--modal\"\n          scheduleNote={scheduleNote}\n        />\n      ) : (\n        <DailySchedule\n          stopId={selectedOrigin}\n          services={services}\n          routeId={routeId}\n          directionId={selectedDirection}\n          routePatterns={routePatternsByDirection[selectedDirection]}\n          today={today}\n        />\n      )}\n    </>\n  );\n};\n\nexport default ScheduleModalContent;\n","import React, { ReactElement, useEffect, useState } from \"react\";\nimport { Dictionary } from \"lodash\";\nimport { DirectionId, Service } from \"../../../../__v3api\";\nimport Loading from \"../../../../components/Loading\";\nimport { stringToDateObject } from \"../../../../helpers/date\";\nimport {\n  hasMultipleWeekdaySchedules,\n  groupServicesByDateRating,\n  isCurrentValidService,\n  serviceStartDateComparator,\n  optGroupComparator,\n  serviceComparator\n} from \"../../../../helpers/service\";\nimport useFetch, {\n  isLoading,\n  isNotStarted\n} from \"../../../../helpers/use-fetch\";\nimport { EnhancedRoutePattern, ServiceInSelector } from \"../../__schedule\";\nimport { Journey } from \"../../__trips\";\nimport SelectContainer from \"../SelectContainer\";\nimport ScheduleTable from \"./ScheduleTable\";\nimport ServiceOptGroup from \"./ServiceOptGroup\";\n\n// until we come up with a good integration test for async with loading\n// some lines in this file have been ignored from codecov\n\ninterface Props {\n  stopId: string;\n  services: ServiceInSelector[];\n  routeId: string;\n  directionId: DirectionId;\n  routePatterns: EnhancedRoutePattern[];\n  today: string;\n}\n\n// Exported solely for testing\nexport const fetchJourneys = (\n  routeId: string,\n  stopId: string,\n  selectedService: Service,\n  selectedDirection: DirectionId,\n  isCurrent: boolean\n): (() => Promise<Response>) => () =>\n  window.fetch &&\n  window.fetch(\n    `/schedules/finder_api/journeys?id=${routeId}&date=${\n      selectedService.end_date\n    }&direction=${selectedDirection}&stop=${stopId}&is_current=${isCurrent}`\n  );\n\n// Exported solely for testing\nexport const parseResults = (json: JSON): Journey[] =>\n  (json as unknown) as Journey[];\n\nconst SchedulesSelect = ({\n  sortedServices,\n  todayServiceId,\n  defaultSelectedServiceId,\n  todayDate,\n  onSelectService\n}: {\n  sortedServices: ServiceInSelector[];\n  defaultSelectedServiceId: string;\n  todayServiceId: string;\n  todayDate: Date;\n  onSelectService: (service: ServiceInSelector | undefined) => void;\n}): ReactElement<HTMLElement> => {\n  const servicesByOptGroup: Dictionary<Service[]> = groupServicesByDateRating(\n    sortedServices,\n    todayDate\n  );\n\n  return (\n    <div className=\"schedule-finder__service-selector\">\n      <label htmlFor=\"service_selector\" className=\"sr-only\">\n        Schedules\n      </label>\n      <SelectContainer>\n        <select\n          id=\"service_selector\"\n          className=\"c-select-custom text-center u-bold\"\n          defaultValue={defaultSelectedServiceId}\n          onChange={e =>\n            onSelectService(sortedServices.find(s => s.id === e.target.value))\n          }\n        >\n          {Object.keys(servicesByOptGroup)\n            .sort(optGroupComparator)\n            .map((group: string) => {\n              const groupedServices = servicesByOptGroup[group];\n              /* istanbul ignore next */\n              if (groupedServices.length <= 0) return null;\n\n              return (\n                <ServiceOptGroup\n                  key={group}\n                  label={group}\n                  services={groupedServices.sort(serviceComparator)}\n                  multipleWeekdays={hasMultipleWeekdaySchedules(\n                    groupedServices\n                  )}\n                  todayServiceId={todayServiceId}\n                />\n              );\n            })}\n        </select>\n      </SelectContainer>\n    </div>\n  );\n};\n\nexport const DailySchedule = ({\n  stopId,\n  services,\n  routeId,\n  directionId,\n  routePatterns,\n  today\n}: Props): ReactElement<HTMLElement> | null => {\n  const [fetchState, fetch] = useFetch<Journey[]>();\n\n  const todayDate = stringToDateObject(today);\n\n  // By default, show the current day's service\n  const sortedServices = services.sort(serviceStartDateComparator);\n  const currentServices = sortedServices.filter(service =>\n    isCurrentValidService(service, todayDate)\n  );\n  const todayServiceId =\n    currentServices.length > 0 ? currentServices[0].id : \"\";\n  const [defaultSelectedService] = currentServices.length\n    ? currentServices\n    : sortedServices;\n\n  const [selectedService, setSelectedService] = useState(\n    defaultSelectedService\n  );\n\n  const getJourneysForSelectedService = (service: Service): void => {\n    fetch({\n      fetcher: fetchJourneys(routeId, stopId, service, directionId, false),\n      parser: parseResults\n    });\n  };\n\n  useEffect(\n    () => {\n      /* istanbul ignore next */\n      if (selectedService && isNotStarted(fetchState)) {\n        getJourneysForSelectedService(selectedService);\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    []\n  );\n\n  if (services.length <= 0) return null;\n\n  return (\n    <>\n      <h3>Daily Schedule</h3>\n\n      <SchedulesSelect\n        sortedServices={sortedServices}\n        todayServiceId={todayServiceId}\n        defaultSelectedServiceId={defaultSelectedService.id}\n        todayDate={todayDate}\n        onSelectService={chosenService => {\n          if (chosenService) {\n            setSelectedService(chosenService);\n            getJourneysForSelectedService(chosenService);\n          }\n        }}\n      />\n\n      {isLoading(fetchState) && <Loading />}\n\n      {/* istanbul ignore next */ !isLoading(fetchState) &&\n        /* istanbul ignore next */ fetchState.data && (\n          /* istanbul ignore next */ <ScheduleTable\n            journeys={fetchState.data}\n            routePatterns={routePatterns}\n            input={{\n              route: routeId,\n              origin: stopId,\n              direction: directionId,\n              date: selectedService!.end_date\n            }}\n          />\n        )}\n    </>\n  );\n};\n\nexport default DailySchedule;\n","import React, { ReactElement } from \"react\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { EnhancedRoutePattern, UserInput } from \"../../__schedule\";\nimport { Journey } from \"../../__trips\";\nimport TableRow from \"./TableRow\";\n\ninterface Props {\n  journeys: Journey[];\n  routePatterns: EnhancedRoutePattern[];\n  input: UserInput;\n}\n\ninterface RoutePatternsById {\n  [key: string]: EnhancedRoutePattern;\n}\n\nconst isSchoolTrip = (\n  routePatternsById: RoutePatternsById,\n  routePatternId: string\n): boolean =>\n  (\n    (routePatternsById[routePatternId] &&\n      routePatternsById[routePatternId].time_desc) ||\n    \"\"\n  ).match(/school/gi) !== null;\n\nconst ScheduleTable = ({\n  journeys,\n  routePatterns,\n  input\n}: Props): ReactElement<HTMLElement> => {\n  if (journeys.length === 0) {\n    return (\n      <div className=\"callout u-bold text-center\">\n        There is no scheduled service for this time period.\n      </div>\n    );\n  }\n\n  const routePatternsById = routePatterns.reduce(\n    (accumulator, routePattern) => ({\n      ...accumulator,\n      [routePattern.id]: routePattern\n    }),\n    {}\n  ) as RoutePatternsById;\n  const anySchoolTrips = Object.values(journeys).some(\n    ({ trip: { route_pattern_id: routePatternId } }) =>\n      isSchoolTrip(routePatternsById, routePatternId)\n  );\n\n  const firstTrip = journeys[0];\n  const lastTrip = journeys.length > 1 ? journeys[journeys.length - 1] : null;\n\n  return (\n    <>\n      <div className=\"schedule-finder__first-last-trip\">\n        <div className=\"u-small-caps u-bold\">First Trip</div>\n        {firstTrip.departure.time}\n        {lastTrip && (\n          <>\n            <div className=\"u-small-caps u-bold\">Last Trip</div>\n            {lastTrip.departure.time}\n          </>\n        )}\n      </div>\n\n      {anySchoolTrips && (\n        <p className=\"text-center\">\n          <strong>S</strong> - Does NOT run on school vacation\n        </p>\n      )}\n\n      <table className=\"schedule-table\">\n        <thead className=\"schedule-table__header\">\n          <tr>\n            {anySchoolTrips && <td className=\"schedule-table__cell\" />}\n            <th scope=\"col\" className=\"schedule-table__cell\">\n              Departs\n            </th>\n            {isACommuterRailRoute(firstTrip.route) && (\n              <th scope=\"col\" className=\"schedule-table__cell\">\n                Train\n              </th>\n            )}\n            <th scope=\"col\" colSpan={2} className=\"schedule-table__cell\">\n              <span className=\"pull-left\">Destination</span>\n              Trip Details\n            </th>\n          </tr>\n        </thead>\n        <tbody>\n          {journeys.map((journey: Journey) => (\n            <TableRow\n              key={journey.trip.id}\n              input={input}\n              journey={journey}\n              isSchoolTrip={isSchoolTrip(\n                routePatternsById,\n                journey.trip.route_pattern_id\n              )}\n              anySchoolTrips={anySchoolTrips}\n            />\n          ))}\n        </tbody>\n      </table>\n    </>\n  );\n};\n\nexport default ScheduleTable;\n","import React, { useEffect, useState, ReactElement } from \"react\";\nimport { modeIcon } from \"../../../../helpers/icon\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport useFetch, { isNotStarted } from \"../../../../helpers/use-fetch\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { UserInput } from \"../../__schedule\";\nimport { Journey, TripInfo } from \"../../__trips\";\nimport AccordionRow from \"./AccordionRow\";\nimport TripDetails from \"./TripDetails\";\n\ninterface TableRowProps {\n  input: UserInput;\n  journey: Journey;\n  isSchoolTrip: boolean;\n  anySchoolTrips: boolean;\n}\n\ninterface AccordionProps {\n  input: UserInput;\n  journey: Journey;\n  anySchoolTrips: boolean;\n  contentComponent: () => ReactElement<HTMLElement>;\n}\n\n// Exported solely for testing\nexport const fetchTripInfo = (\n  tripId: string,\n  { route, direction, date, origin }: UserInput\n): (() => Promise<Response>) => () =>\n  window.fetch &&\n  window.fetch(\n    `/schedules/finder_api/trip?id=${tripId}&route=${route}&date=${date}&direction=${direction}&stop=${origin}`\n  );\n\n// Exported solely for testing\nexport const parseResults = (json: JSON): TripInfo =>\n  (json as unknown) as TripInfo;\n\nconst RouteIcon = ({\n  route: { type, name, id }\n}: Journey): ReactElement<HTMLElement> | undefined => {\n  if (type !== 3) {\n    return modeIcon(id);\n  }\n\n  const backgroundClass = name.startsWith(\"SL\")\n    ? \"u-bg--silver-line\"\n    : \"u-bg--bus\";\n  return (\n    <span className={`c-icon__bus-pill--small ${backgroundClass}`}>{name}</span>\n  );\n};\n\nconst BusTableRow = ({\n  journey,\n  anySchoolTrips,\n  isSchoolTrip\n}: {\n  journey: Journey;\n  anySchoolTrips: boolean;\n  isSchoolTrip: boolean;\n}): ReactElement<HTMLElement> => (\n  <>\n    {anySchoolTrips && (\n      <td className=\"schedule-table__cell schedule-table__cell--tiny\">\n        {isSchoolTrip && <strong>S</strong>}\n      </td>\n    )}\n    <td className=\"schedule-table__cell schedule-table__cell--time u-nowrap u-tabular-nums\">\n      {journey.departure.time}\n    </td>\n    <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n      <span className=\"schedule-table__route-pill m-route-pills\">\n        {RouteIcon(journey)}\n      </span>\n      {breakTextAtSlash(journey.trip.headsign)}\n    </td>\n  </>\n);\n\nconst CrTableRow = ({\n  journey\n}: {\n  journey: Journey;\n}): ReactElement<HTMLElement> => (\n  <>\n    <td className=\"schedule-table__cell schedule-table__cell--time u-nowrap u-tabular-nums\">\n      {journey.departure.time}\n    </td>\n    {journey.trip.name && (\n      <td className=\"schedule-table__cell u-tabular-nums\">\n        {journey.trip.name}\n      </td>\n    )}\n    <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n      {modeIcon(journey.route.id)} {breakTextAtSlash(journey.trip.headsign)}\n    </td>\n  </>\n);\n\nconst Accordion = ({\n  input,\n  journey,\n  anySchoolTrips,\n  contentComponent\n}: AccordionProps): ReactElement<HTMLElement> => {\n  const [expanded, setExpanded] = useState(false);\n  const [fetchState, fetch] = useFetch<TripInfo>();\n\n  const toggle = (): void => setExpanded(!expanded);\n  const tripId = journey.trip.id;\n\n  useEffect(\n    () => {\n      if (expanded && isNotStarted(fetchState)) {\n        fetch({\n          fetcher: fetchTripInfo(tripId, input),\n          parser: parseResults\n        });\n      }\n    },\n    [tripId, input, expanded, fetchState, fetch]\n  );\n\n  const isCommuterRail = isACommuterRailRoute(journey.route);\n\n  return (\n    <AccordionRow\n      id={`trip-${tripId}`}\n      colSpan={isCommuterRail || anySchoolTrips ? 4 : 3}\n      contentComponent={contentComponent}\n      expanded={expanded}\n      toggle={toggle}\n    >\n      <TripDetails fetchState={fetchState} showFare={isCommuterRail} />\n    </AccordionRow>\n  );\n};\n\nconst TableRow = ({\n  input,\n  journey,\n  anySchoolTrips,\n  isSchoolTrip\n}: TableRowProps): ReactElement<HTMLElement> | null => {\n  const contentComponent =\n    journey.route.type !== 2 &&\n    journey.route.description !== \"rail_replacement_bus\"\n      ? () => (\n          <BusTableRow\n            journey={journey}\n            anySchoolTrips={anySchoolTrips}\n            isSchoolTrip={isSchoolTrip}\n          />\n        )\n      : () => <CrTableRow journey={journey} />;\n\n  return (\n    <Accordion\n      input={input}\n      journey={journey}\n      anySchoolTrips={anySchoolTrips}\n      contentComponent={contentComponent}\n    />\n  );\n};\n\nexport default TableRow;\n","import React, { ReactElement, ReactNode } from \"react\";\nimport { caret } from \"../../../../helpers/icon\";\nimport { handleReactEnterKeyPress } from \"../../../../helpers/keyboard-events\";\n\ninterface Props {\n  id: string;\n  colSpan: number;\n  contentComponent: () => ReactElement<HTMLElement>;\n  expanded: boolean;\n  toggle: () => void;\n  children: ReactNode;\n}\n\nconst AccordionRow = ({\n  id,\n  colSpan,\n  contentComponent,\n  expanded,\n  toggle,\n  children\n}: Props): ReactElement<HTMLElement> => (\n  <>\n    <tr\n      className={\n        expanded ? \"schedule-table__row--expanded\" : \"schedule-table__row\"\n      }\n      aria-controls={id}\n      aria-expanded={expanded}\n      role=\"button\"\n      onClick={toggle}\n      onKeyPress={e => handleReactEnterKeyPress(e, toggle)}\n      tabIndex={0}\n    >\n      {contentComponent()}\n      <td className=\"schedule-table__cell schedule-table__cell--tiny\">\n        {expanded\n          ? caret(\"c-expandable-block__header-caret--white\", expanded)\n          : caret(\"c-expandable-block__header-caret\", expanded)}\n      </td>\n    </tr>\n    {expanded && (\n      <tr id={`${id}-expanded`}>\n        <td\n          colSpan={colSpan}\n          className=\"schedule-table__cell schedule-table__cell--expanded\"\n        >\n          {children}\n        </td>\n      </tr>\n    )}\n  </>\n);\n\nexport default AccordionRow;\n","import React, { ReactElement } from \"react\";\nimport Loading from \"../../../../components/Loading\";\nimport { FetchState, hasData, isLoading } from \"../../../../helpers/use-fetch\";\nimport { TripInfo } from \"../../__trips\";\nimport CrowdingPill from \"../../line-diagram/CrowdingPill\";\nimport TripStop from \"./TripStop\";\n\ninterface Props {\n  fetchState: FetchState<TripInfo>;\n  showFare: boolean;\n}\n\nconst TripSummary = ({\n  tripInfo\n}: {\n  tripInfo: TripInfo;\n}): ReactElement<HTMLElement> => (\n  <tr className=\"trip-details-table__summary\">\n    <td colSpan={3} className=\"schedule-table__cell\">\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Trip length\n        </span>\n        {tripInfo.times.length} stops, {tripInfo.duration} minutes total\n      </div>\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Fare\n        </span>\n\n        {tripInfo.fare && tripInfo.fare.price}\n        <a className=\"trip-details-table__link\" href={tripInfo.fare.fare_link}>\n          View fares\n        </a>\n      </div>\n    </td>\n  </tr>\n);\n\nconst allTimesHaveSchedule = (tripInfo: TripInfo): boolean =>\n  tripInfo.times.every(time => !!time.schedule);\n\nconst ErrorLoadingTrip = (): ReactElement<HTMLElement> => (\n  <p>\n    <em>Error loading trip details. Please try again later.</em>\n  </p>\n);\n\nconst TripDetailsTable = ({\n  tripInfo,\n  showFare\n}: {\n  tripInfo: TripInfo;\n  showFare: boolean;\n}): ReactElement<HTMLElement> => {\n  const crowding = tripInfo.vehicle ? tripInfo.vehicle.crowding : null;\n\n  return (\n    <table className=\"trip-details-table\">\n      <thead>\n        {crowding && (\n          <tr>\n            <th>\n              <CrowdingPill crowding={crowding} />\n            </th>\n          </tr>\n        )}\n        <TripSummary tripInfo={tripInfo} />\n        <tr>\n          <th scope=\"col\" className=\"schedule-table__cell\">\n            Stops\n          </th>\n          {showFare && (\n            <th\n              scope=\"col\"\n              className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n            >\n              Fare\n            </th>\n          )}\n          <th\n            scope=\"col\"\n            className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n          >\n            Arrival\n          </th>\n        </tr>\n      </thead>\n      <tbody>\n        {allTimesHaveSchedule(tripInfo) ? (\n          tripInfo.times.map((departure, index: number) => (\n            <TripStop\n              departure={departure}\n              index={index}\n              showFare={showFare}\n              routeType={tripInfo.route_type}\n              key={departure.schedule.stop.id}\n            />\n          ))\n        ) : (\n          <ErrorLoadingTrip />\n        )}\n      </tbody>\n    </table>\n  );\n};\n\nconst TripDetails = ({\n  fetchState,\n  showFare\n}: Props): ReactElement<HTMLElement> => {\n  if (hasData(fetchState) && !!fetchState.data) {\n    return <TripDetailsTable tripInfo={fetchState.data} showFare={showFare} />;\n  }\n\n  if (isLoading(fetchState)) {\n    return <Loading />;\n  }\n\n  return <ErrorLoadingTrip />;\n};\n\nexport default TripDetails;\n","import React, { ReactElement } from \"react\";\nimport { RouteType } from \"../../../../__v3api\";\nimport { alertIcon } from \"../../../../helpers/icon\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport { isSkippedOrCancelled } from \"../../../../models/prediction\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { TripDeparture } from \"../../__trips\";\n\ninterface Props {\n  departure: TripDeparture;\n  index: number;\n  showFare: boolean;\n  routeType: RouteType;\n}\n\nconst formattedDepartureTimes = (\n  departure: TripDeparture,\n  routeType: RouteType\n): ReactElement<HTMLElement> => {\n  const { schedule, prediction, delay } = departure;\n\n  if (isACommuterRailRoute(routeType)) {\n    if (delay && delay >= 300 && prediction && prediction.time) {\n      return (\n        <>\n          <span className=\"schedule-table__times--delayed schedule-table__times--delayed-future_stop\">\n            {schedule.time}\n          </span>\n          <br className=\"hidden-sm-up\" />\n          {prediction.time}\n        </>\n      );\n    }\n\n    return <>{schedule.time}</>;\n  }\n\n  return <>{prediction && prediction.time ? prediction.time : schedule.time}</>;\n};\n\nconst TripStop = ({\n  departure,\n  index,\n  showFare,\n  routeType\n}: Props): ReactElement<HTMLElement> | null => {\n  const { schedule } = departure;\n\n  /* istanbul ignore next */\n  if (!schedule || !schedule.stop) return null;\n\n  return (\n    <tr key={`${schedule.stop.id}`}>\n      <th className=\"schedule-table__cell\" scope=\"row\">\n        <a\n          href={`/stops/${schedule.stop.id}`}\n          className={\n            isSkippedOrCancelled(departure.prediction) ? \"strikethrough\" : \"\"\n          }\n        >\n          {isSkippedOrCancelled(departure.prediction) && (\n            <>\n              {alertIcon(\"c-svg__icon-alerts-triangle\")}\n              <span className=\"sr-only\">This trip skips this stop at</span>\n            </>\n          )}\n          {breakTextAtSlash(schedule.stop.name)}\n        </a>\n      </th>\n      {showFare && (\n        <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n          {index === 0 ? \"\" : schedule.fare.price}\n        </td>\n      )}\n      <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n        {formattedDepartureTimes(departure, routeType)}\n      </td>\n    </tr>\n  );\n};\n\nexport default TripStop;\n","import React, { ReactElement } from \"react\";\nimport { Service } from \"../../../../__v3api\";\nimport { shortDate } from \"../../../../helpers/date\";\nimport {\n  ServiceGroupNames,\n  serviceDays,\n  dedupeServices\n} from \"../../../../helpers/service\";\n\ninterface Props {\n  label: string;\n  services: Service[];\n  multipleWeekdays: boolean;\n  todayServiceId: string;\n}\n\nconst ServiceOptGroup = ({\n  label,\n  services,\n  multipleWeekdays,\n  todayServiceId\n}: Props): ReactElement<HTMLElement> | null =>\n  services.length === 0 ? null : (\n    <optgroup label={label}>\n      {dedupeServices(services).map(service => {\n        const isMultipleWeekday =\n          multipleWeekdays &&\n          service.type === \"weekday\" &&\n          service.typicality !== \"holiday_service\";\n\n        const startDate = new Date(service.start_date);\n        const endDate = new Date(service.end_date);\n        let optionText = \"\";\n\n        if (\n          service.typicality === \"unplanned_disruption\" ||\n          service.typicality === \"planned_disruption\"\n        ) {\n          optionText = service.description;\n        } else if (\n          service.typicality === \"holiday_service\" &&\n          service.added_dates_notes\n        ) {\n          optionText = Object.entries(service.added_dates_notes)\n            .map(entry => {\n              const [addedDate, addedNote] = entry;\n              if (addedNote === \"\") {\n                return `${shortDate(new Date(addedDate))}`;\n              }\n              return `${addedNote}, ${shortDate(new Date(addedDate))}`;\n            })\n            .join(\", \");\n        } else if (label === ServiceGroupNames.OTHER) {\n          optionText = isMultipleWeekday\n            ? `${serviceDays(service)} schedule`\n            : service.description;\n          optionText += `, ${shortDate(startDate)} to ${shortDate(endDate)}`;\n        } else {\n          optionText = isMultipleWeekday\n            ? `${serviceDays(service)} schedule`\n            : service.description;\n          if (service.rating_description) {\n            optionText += `, ${service.rating_description}`;\n          }\n        }\n\n        return (\n          <option key={service.id} value={service.id}>\n            {optionText}\n            {service.id === todayServiceId && \" (now)\"}\n          </option>\n        );\n      })}\n    </optgroup>\n  );\n\nexport default ServiceOptGroup;\n","import React, { ReactElement, useEffect, useReducer, useState } from \"react\";\nimport { get, isEmpty } from \"lodash\";\nimport { Route } from \"../../../../__v3api\";\nimport Loading from \"../../../../components/Loading\";\nimport { reducer } from \"../../../../helpers/fetch\";\nimport { modeIcon } from \"../../../../helpers/icon\";\nimport {\n  timeForCommuterRail,\n  trackForCommuterRail,\n  statusForCommuterRail\n} from \"../../../../helpers/prediction-helpers\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport { isABusRoute } from \"../../../../models/route\";\nimport liveClockSvg from \"../../../../../static/images/icon-live-clock.svg\";\nimport { modeBgClass } from \"../../../../stop/components/RoutePillList\";\nimport { UserInput } from \"../../__schedule\";\nimport { EnhancedJourney } from \"../../__trips\";\nimport LazyAccordion, { AccordionRow } from \"./LazyAccordion\";\nimport LiveCrowdingIcon from \"../../line-diagram/LiveCrowdingIcon\";\n\ninterface State {\n  data: EnhancedJourney[] | null;\n  isLoading: boolean;\n  error: boolean;\n}\n\ninterface Props {\n  state: State;\n  input: UserInput;\n}\n\ninterface AccordionProps {\n  state: State;\n  journey: EnhancedJourney;\n  contentComponent: () => ReactElement<HTMLElement>;\n}\n\ntype FetchAction =\n  | { type: \"FETCH_COMPLETE\"; payload: EnhancedJourney[] }\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\n// Predictions are nil unless they have a time. This helps\n// prevent far-future trips from appearing in Upcoming Departures.\nconst hasPredictions = (journeys: EnhancedJourney[]): boolean =>\n  journeys.filter(journey => journey.realtime.prediction !== null).length > 0;\n\nconst RoutePillSmall = ({\n  route\n}: {\n  route: Route;\n}): ReactElement<HTMLElement> | null => (\n  <span className=\"schedule-table__route-pill m-route-pills\">\n    <span className={`c-icon__bus-pill--small ${modeBgClass(route)}`}>\n      {route.name}\n    </span>\n  </span>\n);\n\nexport const crowdingInformation = (\n  journey: EnhancedJourney,\n  tripId: string\n): ReactElement<HTMLElement> | null => {\n  const { tripInfo } = journey;\n  if (tripInfo) {\n    // Only display the crowding information if the trip ID of the vehicle matches the trip ID of the prediction being displayed.\n    const showCrowding =\n      !!tripInfo.vehicle &&\n      !!tripInfo.vehicle.crowding &&\n      tripInfo.vehicle.trip_id === tripId;\n\n    return (\n      <LiveCrowdingIcon\n        crowding={showCrowding ? tripInfo!.vehicle!.crowding! : null}\n      />\n    );\n  }\n\n  return null;\n};\n\nexport const BusTableRow = ({\n  journey\n}: {\n  journey: EnhancedJourney;\n}): ReactElement<HTMLElement> | null => {\n  const { trip, route, realtime } = journey;\n\n  return (\n    <>\n      <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n        {isABusRoute(route) ? (\n          <RoutePillSmall route={route} />\n        ) : (\n          <span className=\"schedule-table__row-route-pill m-route-pills\">\n            {modeIcon(route.id)}\n          </span>\n        )}\n        {trip.headsign}\n      </td>\n      <td className=\"schedule-table__cell schedule-table__cell--time u-nowrap u-bold text-right\">\n        {realtime.prediction!.time}\n        {crowdingInformation(journey, trip.id)}\n      </td>\n    </>\n  );\n};\n\nexport const CrTableRow = ({\n  journey\n}: {\n  journey: EnhancedJourney;\n}): ReactElement<HTMLElement> | null => {\n  const { trip, route, realtime } = journey;\n\n  if (realtime.prediction === null) return null;\n\n  const status = statusForCommuterRail(realtime);\n  const track = trackForCommuterRail(realtime);\n  const trainNumber = trip.name ? `Train ${trip.name}` : null;\n\n  const statusWithTrain = [trainNumber, status].filter(x => x).join(\" · \");\n\n  return (\n    <>\n      <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n        {modeIcon(route.id)} {breakTextAtSlash(trip.headsign)}\n      </td>\n      <td className=\"schedule-table__cell text-right\">\n        {timeForCommuterRail(\n          realtime,\n          \"u-tabular-nums u-nowrap schedule-table__times\"\n        )}\n        <div className=\"u-nowrap\">\n          {statusWithTrain}\n          {track && (\n            <span className=\"schedule-table__track\">{` · ${track}`}</span>\n          )}\n        </div>\n      </td>\n    </>\n  );\n};\n\nconst Accordion = ({\n  state,\n  journey,\n  contentComponent\n}: AccordionProps): ReactElement<HTMLElement> => {\n  const adjustedState = {\n    data: journey.tripInfo,\n    isLoading: state.isLoading,\n    error: state.error\n  };\n\n  const [expanded, setExpanded] = useState(false);\n  const toggle = (): void => setExpanded(!expanded);\n\n  return (\n    <AccordionRow\n      state={adjustedState}\n      journey={journey}\n      contentComponent={contentComponent}\n      expanded={expanded}\n      toggle={toggle}\n    />\n  );\n};\n\nconst TableRow = ({\n  state,\n  input,\n  journey\n}: {\n  state: State;\n  input: UserInput;\n  journey: EnhancedJourney;\n}): ReactElement<HTMLElement> | null => {\n  const { realtime } = journey;\n\n  if (realtime.prediction === null) return null;\n\n  const contentComponent =\n    journey.route.type !== 2\n      ? () => <BusTableRow journey={journey} />\n      : () => <CrTableRow journey={journey} />;\n\n  if (isABusRoute(journey.route)) {\n    return (\n      <Accordion\n        state={state}\n        journey={journey}\n        contentComponent={contentComponent}\n      />\n    );\n  }\n\n  return (\n    <LazyAccordion\n      input={input}\n      journey={journey}\n      contentComponent={contentComponent}\n    />\n  );\n};\n\nconst UpcomingDeparturesHeader = (\n  <div className=\"schedule-table__upcoming-departures-header\">\n    <h3>Upcoming Departures</h3>\n    <span className=\"schedule-table__live-clock\" aria-hidden>\n      <span className=\"icon-realtime animate notranslate\">\n        <span\n          className=\"c-svg__icon-live-clock\"\n          // eslint-disable-next-line react/no-danger\n          dangerouslySetInnerHTML={{ __html: liveClockSvg }}\n        />\n        <span className=\"icon-realtime-text\">live</span>\n      </span>\n    </span>\n  </div>\n);\n\nexport const fetchData = async (\n  input: UserInput,\n  journeys: EnhancedJourney[],\n  dispatch: (action: FetchAction) => void\n): Promise<EnhancedJourney[]> => {\n  const { route, origin, direction, date } = input;\n\n  dispatch({ type: \"FETCH_STARTED\" });\n\n  return Promise.all(\n    journeys\n      .filter(journey => journey.realtime.prediction !== null)\n      .map(async journey => {\n        // Sometimes using the route.id from the journey is desired over the route.id\n        // from input (e.g. so we can get trips for \"Green-D\" instead of \"Green\")\n        const adjustedRoute = journey.route.id;\n\n        const tripId = journey.trip.id;\n\n        const tripInfo = await await fetch(\n          `/schedules/finder_api/trip?id=${tripId}&route=${adjustedRoute ||\n            route}&date=${date}&direction=${direction}&stop=${origin}`\n        )\n          .then(res => res.json())\n          .catch(() => {\n            dispatch({ type: \"FETCH_ERROR\" });\n          });\n\n        return { ...journey, tripInfo };\n      })\n  );\n};\n\nexport const upcomingDeparturesTable = (\n  journeysWithTripInfo: EnhancedJourney[],\n  state: State,\n  input: UserInput\n): ReactElement<HTMLElement> => {\n  const headerLabel = \"Trip Details\";\n\n  // We use this condition for cosmetic purposes: if there's no crowding information for _any_ of the upcoming departures, we don't want to show a gap/empty column.\n  const someCrowdingInfoExists =\n    !isEmpty(journeysWithTripInfo) && isABusRoute(journeysWithTripInfo[0].route)\n      ? journeysWithTripInfo.some(journey => {\n          const { tripInfo } = journey;\n          if (!tripInfo) return false;\n          const crowding = get(tripInfo, \"vehicle.crowding\", null);\n          return crowding !== null;\n        })\n      : false;\n\n  return (\n    <>\n      {UpcomingDeparturesHeader}\n      {journeysWithTripInfo !== null && hasPredictions(journeysWithTripInfo) ? (\n        <table\n          className={`schedule-table schedule-table--upcoming ${\n            !someCrowdingInfoExists ? \"u-no-crowding-data\" : \"\"\n          }`}\n        >\n          <thead className=\"schedule-table__header\">\n            <tr className=\"schedule-table__row-header\">\n              <th scope=\"col\" className=\"schedule-table__cell\">\n                Destinations\n              </th>\n              <th scope=\"col\" colSpan={2} className=\"schedule-table__cell\">\n                {someCrowdingInfoExists ? (\n                  <span className=\"trip-details-table__title\">\n                    {headerLabel}\n                  </span>\n                ) : (\n                  headerLabel\n                )}\n              </th>\n            </tr>\n          </thead>\n          <tbody>\n            {journeysWithTripInfo.map(\n              (journey: EnhancedJourney, idx: number) => (\n                <TableRow\n                  state={state}\n                  input={input}\n                  journey={journey}\n                  // eslint-disable-next-line react/no-array-index-key\n                  key={idx}\n                />\n              )\n            )}\n          </tbody>\n        </table>\n      ) : (\n        <div className=\"callout text-center u-bold\">\n          There are currently no realtime departures available.\n        </div>\n      )}\n    </>\n  );\n};\n\nexport const UpcomingDepartures = ({\n  state: stateFromProps,\n  input\n}: Props): ReactElement<HTMLElement> | null => {\n  const [state, dispatch] = useReducer(reducer, {\n    data: null,\n    isLoading: false,\n    error: false\n  });\n\n  const { error, isLoading } = stateFromProps;\n\n  useEffect(\n    () => {\n      if (\n        stateFromProps.data !== null &&\n        !stateFromProps.isLoading &&\n        !stateFromProps.error &&\n        (state.data === null && !state.isLoading && !state.error)\n      ) {\n        const journeys = stateFromProps.data;\n\n        const { route, origin, direction, date } = input;\n\n        if (\n          journeys.length > 0 &&\n          isABusRoute(journeys[0].route) &&\n          (route !== undefined &&\n            origin !== undefined &&\n            direction !== undefined &&\n            date !== undefined)\n        ) {\n          fetchData(input, journeys, dispatch)\n            .then((retrievedJourneysWithTripInfo: EnhancedJourney[]) => {\n              const filteredJourneysWithTripInfo = retrievedJourneysWithTripInfo.filter(\n                journey => journey.tripInfo !== null\n              );\n\n              dispatch({\n                type: \"FETCH_COMPLETE\",\n                payload: filteredJourneysWithTripInfo\n              });\n            })\n            .catch(() => dispatch({ type: \"FETCH_ERROR\" }));\n        } else {\n          dispatch({\n            type: \"FETCH_COMPLETE\",\n            payload: journeys\n          });\n        }\n      }\n    },\n    // including 'input' will call 'fetch' again so it should not be included\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      state.data,\n      state.error,\n      state.isLoading,\n      stateFromProps.data,\n      stateFromProps.error,\n      stateFromProps.isLoading\n    ]\n  );\n\n  if (error || isLoading || state.error) return null;\n\n  if (state.isLoading) return <Loading />;\n\n  const journeysWithTripInfo = state.data;\n\n  return <>{upcomingDeparturesTable(journeysWithTripInfo, state, input)}</>;\n};\n\nexport default UpcomingDepartures;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"><title>clock</title><path fill-rule=\\\"evenodd\\\" d=\\\"M5 4V1.5a.5.5 0 00-1 0v3a.498.498 0 00.5.5h2a.5.5 0 000-1H5zm-.5 5a4.5 4.5 0 110-9 4.5 4.5 0 010 9z\\\"></path></svg>\"","import React, { ReactElement, useEffect, useReducer, useState } from \"react\";\nimport { reducer } from \"../../../../helpers/fetch\";\nimport { caret } from \"../../../../helpers/icon\";\nimport { handleReactEnterKeyPress } from \"../../../../helpers/keyboard-events\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { UserInput } from \"../../__schedule\";\nimport { EnhancedJourney, Journey, TripInfo } from \"../../__trips\";\nimport TripDetails, { State } from \"./TripDetails\";\n\ninterface Props {\n  input: UserInput;\n  journey: Journey | EnhancedJourney;\n  contentComponent: () => ReactElement<HTMLElement>;\n}\n\ntype fetchAction =\n  | { type: \"FETCH_COMPLETE\"; payload: TripInfo }\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\nexport const fetchData = (\n  tripId: string,\n  { route, direction, date, origin }: UserInput,\n  dispatch: (action: fetchAction) => void\n): Promise<void> => {\n  dispatch({ type: \"FETCH_STARTED\" });\n  return (\n    window.fetch &&\n    window\n      .fetch(\n        `/schedules/finder_api/trip?id=${tripId}&route=${route}&date=${date}&direction=${direction}&stop=${origin}`\n      )\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(json => dispatch({ type: \"FETCH_COMPLETE\", payload: json }))\n      // @ts-ignore\n      .catch(() => dispatch({ type: \"FETCH_ERROR\" }))\n  );\n};\n\nexport const AccordionRow = ({\n  state,\n  journey,\n  contentComponent,\n  expanded,\n  toggle\n}: {\n  state: State;\n  journey: Journey | EnhancedJourney;\n  contentComponent: () => ReactElement<HTMLElement>;\n  expanded: boolean;\n  toggle: () => void;\n}): ReactElement<HTMLElement> => {\n  const tripId = journey.trip.id;\n  const isCommuterRail = isACommuterRailRoute(journey.route);\n\n  return (\n    <>\n      <tr\n        className={\n          expanded ? \"schedule-table__row--expanded\" : \"schedule-table__row\"\n        }\n        aria-controls={`trip-${tripId}`}\n        aria-expanded={expanded}\n        role=\"button\"\n        onClick={toggle}\n        onKeyPress={e => handleReactEnterKeyPress(e, toggle)}\n        tabIndex={0}\n      >\n        {contentComponent()}\n        <td className=\"schedule-table__cell schedule-table__cell--tiny\">\n          {expanded\n            ? caret(\"c-expandable-block__header-caret--white\", expanded)\n            : caret(\"c-expandable-block__header-caret\", expanded)}\n        </td>\n      </tr>\n      {expanded && (\n        <tr id={`trip-${tripId}-expanded`}>\n          <td\n            colSpan={isCommuterRail ? 4 : 3}\n            className=\"schedule-table__cell schedule-table__cell--expanded\"\n          >\n            <TripDetails state={state} showFare={isCommuterRail} />\n          </td>\n        </tr>\n      )}\n    </>\n  );\n};\n\nconst LazyAccordion = ({\n  input,\n  journey,\n  contentComponent\n}: Props): ReactElement<HTMLElement> => {\n  const [expanded, setExpanded] = useState(false);\n  const [state, dispatch] = useReducer(reducer, {\n    data: null,\n    isLoading: false,\n    error: false\n  });\n\n  const toggle = (): void => setExpanded(!expanded);\n  const tripId = journey.trip.id;\n\n  useEffect(\n    () => {\n      if (expanded && state.data === null && !state.isLoading && !state.error) {\n        fetchData(tripId, input, dispatch);\n      }\n    },\n    [tripId, input, expanded, state]\n  );\n\n  return (\n    <AccordionRow\n      state={state}\n      journey={journey}\n      contentComponent={contentComponent}\n      expanded={expanded}\n      toggle={toggle}\n    />\n  );\n};\n\nexport default LazyAccordion;\n","import React, { ReactElement } from \"react\";\nimport {\n  TripDeparture,\n  TripDepartureWithPrediction,\n  TripInfo\n} from \"../../__trips\";\nimport Loading from \"../../../../components/Loading\";\nimport CrowdingPill from \"../../line-diagram/CrowdingPill\";\nimport TripStop from \"./TripStop\";\n\nexport interface State {\n  data: TripInfo | null;\n  isLoading: boolean;\n  error: boolean;\n}\n\ninterface Props {\n  state: State;\n  showFare: boolean;\n}\n\nconst hasAPrediction = (\n  departure: TripDeparture\n): departure is TripDepartureWithPrediction => departure.prediction !== null;\n\nconst departuresWithPredictions = (\n  departures: TripDeparture[]\n): TripDepartureWithPrediction[] => departures.filter(hasAPrediction);\n\nconst TripSummary = ({\n  tripInfo\n}: {\n  tripInfo: TripInfo;\n}): ReactElement<HTMLElement> => (\n  <tr className=\"trip-details-table__summary\">\n    <td colSpan={3} className=\"schedule-table__cell\">\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Trip length\n        </span>\n        {tripInfo.times.length} stops, {tripInfo.duration} minutes total\n      </div>\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Fare\n        </span>\n\n        {tripInfo.fare && tripInfo.fare.price}\n        <a className=\"trip-details-table__link\" href={tripInfo.fare.fare_link}>\n          View fares\n        </a>\n      </div>\n    </td>\n  </tr>\n);\n\nconst TripDetails = ({\n  state,\n  showFare\n}: Props): ReactElement<HTMLElement> | null => {\n  const { data: tripInfo, error, isLoading } = state;\n\n  if (isLoading) {\n    return <Loading />;\n  }\n\n  const errorLoadingTrip = (\n    <p>\n      <em>Error loading trip details. Please try again later.</em>\n    </p>\n  );\n\n  if (error) {\n    return errorLoadingTrip;\n  }\n\n  if (!tripInfo) return null;\n\n  const crowding = tripInfo.vehicle ? tripInfo.vehicle.crowding : null;\n\n  return (\n    <table className=\"trip-details-table\">\n      <thead>\n        {crowding && (\n          <tr>\n            <th>\n              <CrowdingPill crowding={crowding} />\n            </th>\n          </tr>\n        )}\n        <TripSummary tripInfo={tripInfo} />\n        <tr>\n          <th scope=\"col\" className=\"schedule-table__cell\">\n            Stops\n          </th>\n          {showFare && (\n            <th\n              scope=\"col\"\n              className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n            >\n              Fare\n            </th>\n          )}\n          <th\n            scope=\"col\"\n            className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n          >\n            Arrival\n          </th>\n        </tr>\n      </thead>\n      <tbody>\n        {departuresWithPredictions(tripInfo.times).map(\n          (departure, index: number) => (\n            <TripStop\n              departure={departure}\n              index={index}\n              showFare={showFare}\n              routeType={tripInfo.route_type}\n              key={\n                (departure.prediction.stop && departure.prediction.stop.id) ||\n                departure.schedule.stop.id\n              }\n            />\n          )\n        )}\n      </tbody>\n    </table>\n  );\n};\n\nexport default TripDetails;\n","import React, { ReactElement } from \"react\";\nimport { RouteType } from \"../../../../__v3api\";\nimport { alertIcon } from \"../../../../helpers/icon\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport { isSkippedOrCancelled } from \"../../../../models/prediction\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { TripDepartureWithPrediction } from \"../../__trips\";\n\ninterface Props {\n  departure: TripDepartureWithPrediction;\n  index: number;\n  showFare: boolean;\n  routeType: RouteType;\n}\n\nconst formattedDepartureTimes = (\n  departure: TripDepartureWithPrediction,\n  routeType: RouteType\n): ReactElement<HTMLElement> => {\n  const { schedule, prediction, delay } = departure;\n  if (isACommuterRailRoute(routeType)) {\n    if (delay && delay >= 300 && prediction && prediction.time) {\n      return (\n        <>\n          <span className=\"schedule-table__times--delayed schedule-table__times--delayed-future_stop\">\n            {schedule.time}\n          </span>\n          <br className=\"hidden-sm-up\" />\n          {prediction.time}\n        </>\n      );\n    }\n\n    return <>{schedule.time}</>;\n  }\n\n  return <>{prediction && prediction.time ? prediction.time : schedule.time}</>;\n};\n\nconst TripStop = ({\n  departure,\n  index,\n  showFare,\n  routeType\n}: Props): ReactElement<HTMLElement> | null => {\n  const { prediction, schedule } = departure;\n\n  /* istanbul ignore next */\n  if (!prediction.stop) return null;\n\n  return (\n    <tr key={`${prediction.stop.id}`}>\n      <th className=\"schedule-table__cell\" scope=\"row\">\n        <a\n          href={`/stops/${prediction.stop.id}`}\n          className={isSkippedOrCancelled(prediction) ? \"strikethrough\" : \"\"}\n        >\n          {isSkippedOrCancelled(prediction) && (\n            <>\n              {alertIcon(\"c-svg__icon-alerts-triangle\")}\n              <span className=\"sr-only\">This trip skips this stop at</span>\n            </>\n          )}\n          {breakTextAtSlash(prediction.stop.name)}\n        </a>\n      </th>\n      {showFare && (\n        <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n          {index === 0 ? \"\" : schedule.fare.price}\n        </td>\n      )}\n      <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n        {formattedDepartureTimes(departure, routeType)}\n      </td>\n    </tr>\n  );\n};\n\nexport default TripStop;\n","import React, { ReactElement, useReducer, useEffect, Dispatch } from \"react\";\nimport { DirectionId, EnhancedRoute } from \"../../__v3api\";\nimport {\n  ShapesById,\n  RoutePatternsByDirection,\n  LineDiagramStop,\n  SimpleStopMap,\n  ServiceInSelector,\n  ScheduleNote as ScheduleNoteType\n} from \"./__schedule\";\nimport ScheduleDirectionMenu from \"./direction/ScheduleDirectionMenu\";\nimport ScheduleDirectionButton from \"./direction/ScheduleDirectionButton\";\nimport { reducer as fetchReducer } from \"../../helpers/fetch\";\nimport { menuReducer, FetchAction } from \"./direction/reducer\";\nimport { MapData, StaticMapData } from \"../../leaflet/components/__mapdata\";\nimport Map from \"../components/Map\";\nimport LineDiagramAndStopListPage from \"../components/line-diagram/LineDiagram\";\nimport { isABusRoute } from \"../../models/route\";\n\nexport interface Props {\n  route: EnhancedRoute;\n  directionId: DirectionId;\n  shapesById: ShapesById;\n  routePatternsByDirection: RoutePatternsByDirection;\n  mapData?: MapData;\n  staticMapData?: StaticMapData;\n  lineDiagram: LineDiagramStop[];\n  services: ServiceInSelector[];\n  stops: SimpleStopMap;\n  today: string;\n  scheduleNote: ScheduleNoteType | null;\n  initialSelectedRoutePatternId: string | null;\n}\n\nexport const fetchMapData = (\n  routeId: string,\n  directionId: DirectionId,\n  currentRoutePatternIdForData: string | undefined,\n  dispatch: Dispatch<FetchAction>\n): Promise<void> => {\n  dispatch({ type: \"FETCH_STARTED\" });\n  const baseURL = `/schedules/map_api?id=${routeId}&direction_id=${directionId}`;\n  const url = currentRoutePatternIdForData\n    ? `${baseURL}&shape_id=${currentRoutePatternIdForData}`\n    : baseURL;\n\n  return (\n    window.fetch &&\n    window\n      .fetch(url)\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(json => dispatch({ type: \"FETCH_COMPLETE\", payload: json }))\n      // @ts-ignore\n      .catch(() => dispatch({ type: \"FETCH_ERROR\" }))\n  );\n};\n\nexport const fetchLineData = (\n  routeId: string,\n  directionId: DirectionId,\n  currentRoutePatternIdForData: string | undefined,\n  dispatch: Dispatch<FetchAction>\n): Promise<void> => {\n  dispatch({ type: \"FETCH_STARTED\" });\n\n  const baseURL = `/schedules/line_api?id=${routeId}&direction_id=${directionId}`;\n  const url = currentRoutePatternIdForData\n    ? `${baseURL}&route_pattern=${currentRoutePatternIdForData}`\n    : baseURL;\n\n  return (\n    window.fetch &&\n    window\n      .fetch(url)\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(json => dispatch({ type: \"FETCH_COMPLETE\", payload: json }))\n      // @ts-ignore\n      .catch(() => dispatch({ type: \"FETCH_ERROR\" }))\n  );\n};\n\nconst ScheduleDirection = ({\n  route,\n  directionId,\n  shapesById,\n  routePatternsByDirection,\n  mapData,\n  staticMapData,\n  lineDiagram,\n  services,\n  stops,\n  today,\n  scheduleNote,\n  initialSelectedRoutePatternId\n}: Props): ReactElement<HTMLElement> => {\n  const routePatternsInCurrentDirection = routePatternsByDirection[directionId];\n  const defaultRoutePattern =\n    routePatternsInCurrentDirection.find(\n      routePattern => routePattern.id === initialSelectedRoutePatternId\n    ) || routePatternsInCurrentDirection.slice(0, 1)[0];\n\n  const reverseDirection = directionId === 0 ? 1 : 0;\n  const directionIsChangeable = route.direction_names[reverseDirection] != null;\n\n  const [state, dispatch] = useReducer(menuReducer, {\n    routePattern: defaultRoutePattern,\n    shape: shapesById[defaultRoutePattern.shape_id],\n    directionId,\n    shapesById,\n    routePatternsByDirection,\n    routePatternMenuOpen: false,\n    routePatternMenuAll: false,\n    itemFocus: null\n  });\n\n  const [mapState, dispatchMapData] = useReducer(fetchReducer, {\n    data: mapData,\n    isLoading: false,\n    error: false\n  });\n\n  const currentShapeId = state.shape\n    ? state.shape.id\n    : defaultRoutePattern.shape_id;\n  const shapeIds = state.routePatternsByDirection[state.directionId].map(\n    routePattern => routePattern.shape_id\n  );\n  const currentRoutePatternIdForData =\n    isABusRoute(route) && routePatternsInCurrentDirection.length > 1\n      ? state.routePattern.id\n      : undefined;\n\n  useEffect(\n    () => {\n      if (!staticMapData) {\n        fetchMapData(\n          route.id,\n          state.directionId,\n          currentRoutePatternIdForData,\n          dispatchMapData\n        );\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [route, state.directionId, currentShapeId, staticMapData]\n  );\n\n  const [lineState, dispatchLineData] = useReducer(fetchReducer, {\n    data: lineDiagram,\n    isLoading: false,\n    error: false\n  });\n\n  useEffect(\n    () => {\n      fetchLineData(\n        route.id,\n        state.directionId,\n        currentRoutePatternIdForData,\n        dispatchLineData\n      );\n    },\n    [route, state.directionId, currentShapeId, currentRoutePatternIdForData]\n  );\n\n  return (\n    <>\n      <div className=\"m-schedule-direction\">\n        <div id=\"direction-name\" className=\"m-schedule-direction__direction\">\n          {route.direction_names[state.directionId]}\n        </div>\n        <ScheduleDirectionMenu\n          route={route}\n          directionId={state.directionId}\n          routePatternsByDirection={routePatternsByDirection}\n          selectedRoutePatternId={state.routePattern.id}\n          menuOpen={state.routePatternMenuOpen}\n          showAllRoutePatterns={state.routePatternMenuAll}\n          itemFocus={state.itemFocus}\n          dispatch={dispatch}\n        />\n        {directionIsChangeable ? (\n          <ScheduleDirectionButton dispatch={dispatch} />\n        ) : null}\n      </div>\n      {!staticMapData && mapState.data && (\n        <Map\n          channel={`vehicles:${route.id}:${state.directionId}`}\n          data={mapState.data}\n          shapeIds={shapeIds}\n        />\n      )}\n      {staticMapData && (\n        <>\n          <img\n            src={staticMapData.img_src}\n            alt={`${route.name} route map`}\n            className=\"img-fluid\"\n          />\n          <a\n            href={staticMapData.pdf_url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            <i className=\"fa fa-search-plus\" aria-hidden=\"true\" />\n            View map as a PDF\n          </a>\n        </>\n      )}\n      {lineState.data && (\n        <LineDiagramAndStopListPage\n          lineDiagram={lineState.data}\n          route={route}\n          directionId={state.directionId}\n          routePatternsByDirection={routePatternsByDirection}\n          services={services}\n          stops={stops}\n          today={today}\n          scheduleNote={scheduleNote}\n        />\n      )}\n    </>\n  );\n};\n\nexport default ScheduleDirection;\n","import React, { ReactElement, Dispatch, useEffect } from \"react\";\nimport { DirectionId, EnhancedRoute } from \"../../../__v3api\";\nimport { RoutePatternsByDirection } from \"../__schedule\";\nimport { MenuAction, closeRoutePatternMenuAction } from \"./reducer\";\nimport { GreenLineSelect, ExpandedGreenMenu } from \"./GreenLineMenu\";\nimport { BusMenuSelect, ExpandedBusMenu } from \"./BusMenu\";\nimport { handleNativeEscapeKeyPress } from \"../../../helpers/keyboard-events\";\nimport { isABusRoute, isAGreenLineRoute } from \"../../../models/route\";\n\ninterface Props {\n  route: EnhancedRoute;\n  routePatternsByDirection: RoutePatternsByDirection;\n  directionId: DirectionId;\n  selectedRoutePatternId: string;\n  menuOpen: boolean;\n  showAllRoutePatterns: boolean;\n  itemFocus: string | null;\n  dispatch: Dispatch<MenuAction>;\n}\n\nconst ScheduleDirectionMenu = ({\n  route,\n  routePatternsByDirection,\n  directionId,\n  selectedRoutePatternId,\n  menuOpen,\n  showAllRoutePatterns,\n  itemFocus,\n  dispatch\n}: Props): ReactElement<HTMLElement> => {\n  const routePatterns = routePatternsByDirection[directionId];\n\n  useEffect(\n    () => {\n      if (!menuOpen) return () => {};\n      // if the menu is open, add event listeners to enable closing the menu by\n      // clicking outside the menu or with keypress\n      const clickToClose = (event: Event): void => {\n        if (!event.target) return;\n        const element = event.target as HTMLElement;\n        if (element.closest(\".js-m-schedule-click-boundary\")) return;\n        dispatch(closeRoutePatternMenuAction());\n      };\n\n      const keyToClose = (event: KeyboardEvent): void => {\n        handleNativeEscapeKeyPress(event, () => {\n          dispatch(closeRoutePatternMenuAction());\n        });\n      };\n\n      document.addEventListener(\"click\", clickToClose, true);\n      document.addEventListener(\"keydown\", keyToClose);\n\n      return () => {\n        // remove the event listeners\n        document.removeEventListener(\"click\", clickToClose, true);\n        document.removeEventListener(\"keydown\", keyToClose);\n      };\n    },\n    [menuOpen, dispatch]\n  );\n\n  return (\n    <div className=\"js-m-schedule-click-boundary\">\n      {// bus mode\n      isABusRoute(route) && (\n        <BusMenuSelect\n          routePatterns={routePatternsByDirection[directionId]}\n          selectedRoutePatternId={selectedRoutePatternId}\n          dispatch={dispatch}\n        />\n      )}\n      {// Green Line\n      isAGreenLineRoute(route) && (\n        <GreenLineSelect\n          routeId={route.id}\n          dispatch={dispatch}\n          directionId={directionId}\n        />\n      )}\n      {// Mattapan Trolley\n      route.id === \"Mattapan\" && (\n        <div className=\"m-schedule-direction__route-pattern\">\n          {route.direction_destinations[directionId]}\n        </div>\n      )}\n      {// Subway, CR, Ferry\n      [1, 2, 4].indexOf(route.type) !== -1 && (\n        <div className=\"m-schedule-direction__route-pattern\">\n          {route.direction_destinations[directionId]}\n        </div>\n      )}\n      {menuOpen && isABusRoute(route) && (\n        <ExpandedBusMenu\n          routePatterns={routePatterns}\n          selectedRoutePatternId={selectedRoutePatternId}\n          showAllRoutePatterns={showAllRoutePatterns}\n          itemFocus={itemFocus}\n          dispatch={dispatch}\n        />\n      )}\n      {menuOpen && isAGreenLineRoute(route) && (\n        <ExpandedGreenMenu directionId={directionId} route={route} />\n      )}\n    </div>\n  );\n};\n\nexport default ScheduleDirectionMenu;\n","import React, {\n  ReactElement,\n  Dispatch,\n  KeyboardEvent as ReactKeyboardEvent\n} from \"react\";\nimport { DirectionId, EnhancedRoute } from \"../../../__v3api\";\nimport { MenuAction, toggleRoutePatternMenuAction } from \"./reducer\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport handleNavigation from \"./menu-helpers\";\nimport arrowIcon from \"../../../../static/images/icon-down-arrow.svg\";\nimport checkIcon from \"../../../../static/images/icon-checkmark.svg\";\nimport iconGreenB from \"../../../../static/images/icon-green-line-b-small.svg\";\nimport iconGreenC from \"../../../../static/images/icon-green-line-c-small.svg\";\nimport iconGreenD from \"../../../../static/images/icon-green-line-d-small.svg\";\nimport iconGreenE from \"../../../../static/images/icon-green-line-e-small.svg\";\nimport iconGreen from \"../../../../static/images/icon-green-line-small.svg\";\n\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events\";\n\ninterface GreenLineSelectProps {\n  routeId: string;\n  dispatch: Dispatch<MenuAction>;\n  directionId: DirectionId;\n}\n\ninterface ExpandedGreenMenuProps {\n  route: EnhancedRoute;\n  directionId: DirectionId;\n}\n\ninterface GreenRoute {\n  id: string;\n  name: string;\n  direction_destinations: string[];\n  icon: string;\n}\n\ninterface GreenLineItem {\n  routeIds: string[];\n  route: GreenRoute;\n  selected: boolean;\n  focused: boolean;\n  directionId: DirectionId;\n}\n\n/* eslint-disable camelcase */\nconst greenRoutes: GreenRoute[] = [\n  {\n    id: \"Green\",\n    name: \"Green Line\",\n    direction_destinations: [\"All branches\", \"All branches\"],\n    icon: iconGreen\n  },\n  {\n    id: \"Green-B\",\n    name: \"Green Line B\",\n    direction_destinations: [\"Boston College\", \"Park Street\"],\n    icon: iconGreenB\n  },\n  {\n    id: \"Green-C\",\n    name: \"Green Line C\",\n    direction_destinations: [\"Cleveland Circle\", \"North Station\"],\n    icon: iconGreenC\n  },\n  {\n    id: \"Green-D\",\n    name: \"Green Line D\",\n    direction_destinations: [\"Riverside\", \"Government Center\"],\n    icon: iconGreenD\n  },\n  {\n    id: \"Green-E\",\n    name: \"Green Line E\",\n    direction_destinations: [\"Heath Street\", \"Lechmere\"],\n    icon: iconGreenE\n  }\n];\n\nexport const GreenLineItem = ({\n  directionId,\n  routeIds,\n  route,\n  selected,\n  focused\n}: GreenLineItem): ReactElement<HTMLElement> => {\n  const selectedClass = selected ? \" m-schedule-direction__menu--selected\" : \"\";\n  const icon = selected ? (\n    <div className=\"m-schedule-direction__checkmark\">\n      {renderSvg(\"c-svg__icon\", checkIcon)}\n    </div>\n  ) : null;\n  const handleClick = (): void => {\n    window.location.assign(\n      `/schedules/${route.id}?direction_id=${directionId}`\n    );\n  };\n\n  return (\n    <div\n      aria-current={selected ? \"page\" : undefined}\n      id={`route-pattern_${route.id}`}\n      tabIndex={0}\n      role=\"menuitem\"\n      className={`m-schedule-direction__menu-item${selectedClass}`}\n      onClick={handleClick}\n      onKeyUp={(e: ReactKeyboardEvent) => {\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        });\n      }}\n      onKeyDown={(e: ReactKeyboardEvent) => {\n        handleNavigation(e, routeIds);\n      }}\n      ref={item => item && focused && item.focus()}\n    >\n      <div className=\"m-schedule-direction__menu-item-headsign\">\n        {icon}\n        {renderSvg(\n          \"c-svg__icon m-schedule-direction__menu-item-icon\",\n          route.icon\n        )}\n        <span className=\"sr-only\">{route.name}</span>\n        {route.direction_destinations[directionId]}\n      </div>\n    </div>\n  );\n};\n\nexport const ExpandedGreenMenu = ({\n  route,\n  directionId\n}: ExpandedGreenMenuProps): ReactElement<HTMLElement> => {\n  const routeIds = greenRoutes.map(greenRoute => greenRoute.id);\n  return (\n    <div className=\"m-schedule-direction__menu\" role=\"menu\">\n      {greenRoutes.map((greenRoute: GreenRoute, index: number) => (\n        <GreenLineItem\n          directionId={directionId}\n          key={greenRoute.id}\n          routeIds={routeIds}\n          route={greenRoute}\n          selected={route.id === greenRoute.id}\n          focused={index === 0}\n        />\n      ))}\n    </div>\n  );\n};\n\nexport const GreenLineSelect = ({\n  routeId,\n  dispatch,\n  directionId\n}: GreenLineSelectProps): ReactElement<HTMLElement> => {\n  const handleClick = (): void => {\n    dispatch(toggleRoutePatternMenuAction());\n  };\n\n  const route = greenRoutes.find(greenRoute => greenRoute.id === routeId)!;\n\n  return (\n    // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n    <div\n      // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n      tabIndex={0}\n      role=\"button\"\n      className=\"m-schedule-direction__route-pattern m-schedule-direction__route-pattern--clickable\"\n      onClick={handleClick}\n      onKeyUp={e =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n    >\n      {route.direction_destinations[directionId]}{\" \"}\n      {renderSvg(\n        \"c-svg__icon m-schedule-direction__route-pattern-arrow\",\n        arrowIcon\n      )}\n    </div>\n  );\n};\n","import React, {\n  ReactElement,\n  Dispatch,\n  KeyboardEvent as ReactKeyboardEvent\n} from \"react\";\nimport {\n  MenuAction,\n  setRoutePatternAction,\n  showAllRoutePatternsAction,\n  toggleRoutePatternMenuAction\n} from \"./reducer\";\nimport { EnhancedRoutePattern } from \"../__schedule\";\nimport handleNavigation from \"./menu-helpers\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport arrowIcon from \"../../../../static/images/icon-down-arrow.svg\";\nimport checkIcon from \"../../../../static/images/icon-checkmark.svg\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events\";\n\ninterface ExpandedBusMenuProps {\n  routePatterns: EnhancedRoutePattern[];\n  selectedRoutePatternId: string;\n  showAllRoutePatterns: boolean;\n  itemFocus: string | null;\n  dispatch: Dispatch<MenuAction>;\n}\n\ninterface RoutePatternItem {\n  routePatternIds: string[];\n  routePattern: EnhancedRoutePattern;\n  selected: boolean;\n  focused: boolean;\n  duplicated: boolean;\n  dispatch: Dispatch<MenuAction>;\n}\n\ninterface UncommonDestinationsItem {\n  routePatternIds: string[];\n  dispatch: Dispatch<MenuAction>;\n}\n\ninterface BusMenuSelectProps {\n  routePatterns: EnhancedRoutePattern[];\n  selectedRoutePatternId: string;\n  dispatch: Dispatch<MenuAction>;\n}\n\nconst typicalityDefaultText = (typicality: number): string => {\n  if (typicality === 1) return \"typical route\";\n  if (typicality === 2) return \"less common route\";\n  return \"\";\n};\n\nconst RoutePatternItem = ({\n  routePatternIds,\n  routePattern,\n  selected,\n  focused,\n  duplicated,\n  dispatch\n}: RoutePatternItem): ReactElement<HTMLElement> => {\n  const selectedClass = selected ? \" m-schedule-direction__menu--selected\" : \"\";\n\n  const icon = selected ? (\n    <div className=\"m-schedule-direction__checkmark\">\n      {renderSvg(\"c-svg__icon\", checkIcon)}\n    </div>\n  ) : null;\n\n  const handleClick = (): void => dispatch(setRoutePatternAction(routePattern));\n\n  return (\n    <div\n      aria-current={selected ? \"page\" : undefined}\n      id={`route-pattern_${routePattern.id}`}\n      tabIndex={0}\n      role=\"menuitem\"\n      className={`m-schedule-direction__menu-item${selectedClass}`}\n      onClick={handleClick}\n      ref={item => item && focused && item.focus()}\n      onKeyUp={(e: ReactKeyboardEvent) => {\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        });\n      }}\n      onKeyDown={(e: ReactKeyboardEvent) => {\n        handleNavigation(e, routePatternIds);\n      }}\n    >\n      <div className=\"m-schedule-direction__menu-item-headsign\">\n        {icon}\n        {routePattern.headsign}\n      </div>\n      <div className=\"m-schedule-direction__menu-item-description\">\n        {duplicated && `from ${routePattern.name.split(\" - \")[0]}, `}\n        {routePattern.time_desc ||\n          typicalityDefaultText(routePattern.typicality)}\n      </div>\n    </div>\n  );\n};\n\nconst UncommonDestinationsItem = ({\n  routePatternIds,\n  dispatch\n}: UncommonDestinationsItem): ReactElement<HTMLElement> => {\n  const handleClick = (): void => dispatch(showAllRoutePatternsAction());\n\n  return (\n    <div\n      id=\"route-pattern_uncommon\"\n      role=\"menuitem\"\n      tabIndex={0}\n      aria-label=\"click for additional routes\"\n      className=\"m-schedule-direction__menu-item\"\n      onClick={handleClick}\n      onKeyUp={(e: ReactKeyboardEvent) =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n      onKeyDown={(e: ReactKeyboardEvent) => {\n        handleNavigation(e, routePatternIds);\n      }}\n    >\n      <div className=\"m-schedule-direction__menu-item-more\">\n        Uncommon destinations{\" \"}\n        {renderSvg(\n          \"c-svg__icon m-schedule-direction__route-pattern-arrow\",\n          arrowIcon\n        )}\n      </div>\n    </div>\n  );\n};\n\nconst hasMoreRoutePatterns = (routePatterns: EnhancedRoutePattern[]): boolean =>\n  routePatterns.some(\n    (routePattern: EnhancedRoutePattern) => routePattern.typicality > 2\n  );\n\nconst determineFocusIndex = (\n  itemFocus: string | null,\n  routePatterns: EnhancedRoutePattern[]\n): number => {\n  if (itemFocus === \"first\") return 0;\n  return routePatterns.findIndex(\n    (routePattern: EnhancedRoutePattern) => routePattern.typicality > 2\n  );\n};\n\nconst isDuplicateHeadsign = (\n  compareRoutePattern: EnhancedRoutePattern,\n  routePatterns: EnhancedRoutePattern[]\n): boolean =>\n  routePatterns.filter(\n    (routePattern: EnhancedRoutePattern) =>\n      routePattern.id !== compareRoutePattern.id &&\n      routePattern.headsign === compareRoutePattern.headsign\n  ).length > 0;\n\nexport const ExpandedBusMenu = ({\n  routePatterns,\n  selectedRoutePatternId,\n  showAllRoutePatterns,\n  itemFocus,\n  dispatch\n}: ExpandedBusMenuProps): ReactElement<HTMLElement> => {\n  const filterRule = (routePattern: EnhancedRoutePattern): boolean =>\n    showAllRoutePatterns ? true : routePattern.typicality < 3;\n\n  const focusIndex = determineFocusIndex(itemFocus, routePatterns);\n\n  const toggleButtonIds =\n    hasMoreRoutePatterns(routePatterns) && showAllRoutePatterns === false\n      ? [\"uncommon\"]\n      : [];\n\n  const routePatternIds = routePatterns\n    .filter(filterRule)\n    .map((routePattern: EnhancedRoutePattern) => routePattern.id)\n    .concat(toggleButtonIds);\n\n  return (\n    <div className=\"m-schedule-direction__menu\" role=\"menu\">\n      {routePatterns\n        .filter(filterRule)\n        .map((routePattern: EnhancedRoutePattern, index: number) => (\n          <RoutePatternItem\n            key={routePattern.id}\n            routePatternIds={routePatternIds}\n            routePattern={routePattern}\n            selected={selectedRoutePatternId === routePattern.id}\n            focused={index === focusIndex}\n            duplicated={isDuplicateHeadsign(routePattern, routePatterns)}\n            dispatch={dispatch}\n          />\n        ))}\n      {hasMoreRoutePatterns(routePatterns) &&\n        showAllRoutePatterns === false && (\n          <UncommonDestinationsItem\n            routePatternIds={routePatternIds}\n            dispatch={dispatch}\n          />\n        )}\n    </div>\n  );\n};\n\nconst routePatternNameById = (\n  routePatterns: EnhancedRoutePattern[],\n  selectedRoutePatternId: string\n): string =>\n  routePatterns.find(\n    (routePattern: EnhancedRoutePattern) =>\n      routePattern.id === selectedRoutePatternId\n  )!.headsign;\n\nexport const BusMenuSelect = ({\n  routePatterns,\n  selectedRoutePatternId,\n  dispatch\n}: BusMenuSelectProps): ReactElement<HTMLElement> => {\n  const isMenuClickable = routePatterns.length > 1;\n\n  const handleClick = isMenuClickable\n    ? () => {\n        dispatch(toggleRoutePatternMenuAction());\n      }\n    : /* istanbul ignore next */\n      () => {};\n\n  const linkClass = isMenuClickable\n    ? \" m-schedule-direction__route-pattern--clickable\"\n    : \"\";\n\n  return (\n    // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n    <div\n      // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n      tabIndex={isMenuClickable ? 0 : undefined}\n      role={isMenuClickable ? \"button\" : undefined}\n      className={`m-schedule-direction__route-pattern${linkClass}`}\n      onClick={handleClick}\n      onKeyUp={e =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n    >\n      {routePatternNameById(routePatterns, selectedRoutePatternId)}{\" \"}\n      {isMenuClickable &&\n        renderSvg(\n          \"c-svg__icon m-schedule-direction__route-pattern-arrow\",\n          arrowIcon\n        )}\n    </div>\n  );\n};\n","import React, { ReactElement, Dispatch } from \"react\";\nimport renderSVG from \"../../../helpers/render-svg\";\nimport icon from \"../../../../static/images/icon-change-direction.svg\";\nimport { MenuAction, toggleDirectionAction } from \"./reducer\";\n\ninterface Props {\n  dispatch: Dispatch<MenuAction>;\n}\n\nconst ScheduleDirectionButton = ({\n  dispatch\n}: Props): ReactElement<HTMLElement> => (\n  <button\n    type=\"button\"\n    className=\"m-schedule-direction__button btn btn-primary\"\n    onClick={() => {\n      dispatch(toggleDirectionAction());\n    }}\n  >\n    {renderSVG(\"m-schedule-direction__icon\", icon)}Change Direction\n  </button>\n);\n\nexport default ScheduleDirectionButton;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>change direction</title><path d=\\\"M31.93 7.28H17.54l1.2-5.87A1.37 1.37 0 0016.63.23L1.77 10.11a1.44 1.44 0 000 2.38l14.86 9.88a1.37 1.37 0 002.11-1.19l-1.2-5.86h14.39c3.94 0 7.14 2.82 7.14 6.3v12c0 3.48-3.2 6.3-7.14 6.3h-8.2v8h8.2c8.23 0 14.93-6.43 14.93-14.34v-12c0-7.91-6.7-14.34-14.93-14.34\\\"></path></svg>\"","import React, { ReactElement, useReducer, useCallback } from \"react\";\nimport { Provider } from \"react-redux\";\nimport {\n  useQueryParams,\n  StringParam,\n  updateInLocation\n} from \"use-query-params\";\nimport useSWR from \"swr\";\nimport useFilteredList from \"../../../hooks/useFilteredList\";\nimport SearchBox from \"../../../components/SearchBox\";\nimport {\n  LineDiagramStop,\n  RoutePatternsByDirection,\n  ScheduleNote as ScheduleNoteType,\n  ServiceInSelector,\n  SimpleStopMap,\n  SelectedOrigin,\n  RouteStop\n} from \"../__schedule\";\nimport { DirectionId, Route } from \"../../../__v3api\";\nimport { createLineDiagramCoordStore } from \"./graphics/graphic-helpers\";\nimport { lineDiagramReducer } from \"./reducer\";\nimport { LiveDataByStop } from \"./__line-diagram\";\nimport ScheduleFinderModal from \"../schedule-finder/ScheduleFinderModal\";\nimport StopCard from \"./StopCard\";\nimport LineDiagramWithStops from \"./LineDiagramWithStops\";\n\ninterface LineDiagramProps {\n  lineDiagram: LineDiagramStop[];\n  route: Route;\n  directionId: DirectionId;\n  routePatternsByDirection: RoutePatternsByDirection;\n  services: ServiceInSelector[];\n  stops: SimpleStopMap;\n  today: string;\n  scheduleNote: ScheduleNoteType | null;\n}\n\nconst stationsOrStops = (routeType: number): string =>\n  [0, 1, 2].includes(routeType) ? \"Stations\" : \"Stops\";\n\nconst directionIdToNumber = (direction: string): DirectionId =>\n  direction === \"0\" ? 0 : 1;\n\nconst reversedDirectionId = (direction: DirectionId): DirectionId =>\n  direction === 0 ? 1 : 0;\n\nconst LineDiagramAndStopListPage = ({\n  lineDiagram,\n  route,\n  directionId,\n  routePatternsByDirection,\n  services,\n  stops,\n  today,\n  scheduleNote\n}: LineDiagramProps): ReactElement<HTMLElement> | null => {\n  /**\n   * Setup state handling etc\n   */\n  const [state, dispatch] = useReducer(lineDiagramReducer, {\n    direction: directionId,\n    origin: lineDiagram[0].route_stop.id,\n    modalMode: \"schedule\",\n    modalOpen: false\n  });\n\n  // also track the location of text to align the diagram points to\n  const lineDiagramCoordStore = createLineDiagramCoordStore(lineDiagram);\n\n  /**\n   * Handle URL params\n   */\n  const [query] = useQueryParams({\n    // eslint-disable-next-line camelcase\n    \"schedule_direction[direction_id]\": StringParam,\n    \"schedule_direction[origin]\": StringParam\n  });\n\n  React.useEffect(\n    () => {\n      const newDirection = query[\"schedule_direction[direction_id]\"];\n      const newOrigin = query[\"schedule_direction[origin]\"];\n      // modify values in case URL either parameters:\n      if (newDirection !== undefined && newOrigin !== undefined) {\n        dispatch({\n          type: \"initialize\",\n          origin: newOrigin,\n          direction: directionIdToNumber(newDirection)\n        });\n      }\n    },\n    [query]\n  );\n  const updateURL = (origin: SelectedOrigin, direction?: DirectionId): void => {\n    if (window) {\n      // eslint-disable-next-line camelcase\n      const newQuery = {\n        \"schedule_direction[direction_id]\":\n          direction !== undefined ? direction.toString() : \"\",\n        \"schedule_direction[origin]\": origin\n      };\n      const newLoc = updateInLocation(newQuery, window.location);\n      // newLoc is not a true Location, so toString doesn't work\n      window.history.replaceState({}, \"\", `${newLoc.pathname}${newLoc.search}`);\n    }\n  };\n\n  /**\n   * Events - clicking a stop, changing various params for the resulting modal\n   */\n  const handleStopClick = useCallback(\n    (stop: RouteStop): void => {\n      const { \"is_beginning?\": isBeginning, \"is_terminus?\": isTerminus } = stop;\n      const isDestination = isTerminus && !isBeginning;\n      const direction = isDestination\n        ? reversedDirectionId(directionId)\n        : directionId;\n      dispatch({ type: \"initialize\", origin: stop.id, direction });\n      // modify URL:\n      updateURL(stop.id, directionId);\n    },\n    [directionId]\n  ); // only update function when stop or directionId changes\n  const handleOriginSelectClick = (): void => {\n    dispatch({ type: \"set_origin\", origin: null });\n    dispatch({ type: \"toggle_modal\", modalOpen: true });\n  };\n  const directionChanged = (direction: DirectionId): void => {\n    dispatch({ type: \"set_direction\", direction });\n  };\n  const originChanged = (origin: SelectedOrigin): void => {\n    dispatch({ type: \"set_origin\", origin });\n  };\n  const closeModal = (): void => {\n    dispatch({ type: \"toggle_modal\", modalOpen: false });\n    // clear parameters from URL when closing the modal:\n    updateURL(\"\");\n  };\n\n  /**\n   * Provide a search box for filtering stops\n   */\n  const [stopQuery, setStopQuery, filteredStops] = useFilteredList(\n    lineDiagram,\n    \"route_stop.name\"\n  );\n\n  /**\n   * Live data, including realtime vehicle locations and predictions\n   */\n  const { data: maybeLiveData } = useSWR(\n    `/schedules/line_api/realtime?id=${route.id}&direction_id=${directionId}`,\n    url => fetch(url).then(response => response.json()),\n    { refreshInterval: 15000 }\n  );\n  const liveData = (maybeLiveData || {}) as LiveDataByStop;\n\n  /**\n   * Putting it all together\n   */\n  return (\n    <>\n      <h3 className=\"m-schedule-diagram__heading\">\n        {stationsOrStops(route.type)}\n      </h3>\n      <SearchBox\n        id=\"stop-search\"\n        labelText={`Search for a ${stationsOrStops(route.type)\n          .toLowerCase()\n          .slice(0, -1)}`}\n        onChange={setStopQuery}\n        className=\"m-schedule-diagram__filter\"\n      />\n      {stopQuery !== \"\" ? (\n        <ol className=\"m-schedule-diagram m-schedule-diagram--searched\">\n          {filteredStops.length ? (\n            (filteredStops as LineDiagramStop[]).map(\n              (stop: LineDiagramStop) => (\n                <StopCard\n                  key={stop.route_stop.id}\n                  stop={stop}\n                  onClick={handleStopClick}\n                  liveData={liveData[stop.route_stop.id]}\n                  searchQuery={stopQuery}\n                />\n              )\n            )\n          ) : (\n            <div className=\"c-alert-item c-alert-item--low c-alert-item__top-text-container\">\n              No stops {route.direction_names[directionId]} to{\" \"}\n              {route.direction_destinations[directionId]} matching{\" \"}\n              <b className=\"u-highlight\">{stopQuery}</b>. Try changing your\n              direction or adjusting your search.\n            </div>\n          )}\n        </ol>\n      ) : (\n        <Provider store={lineDiagramCoordStore}>\n          <LineDiagramWithStops\n            stops={lineDiagram}\n            handleStopClick={handleStopClick}\n            liveData={liveData}\n          />\n        </Provider>\n      )}\n\n      {state.modalOpen && (\n        <ScheduleFinderModal\n          closeModal={closeModal}\n          initialMode={state.modalMode}\n          initialDirection={state.direction}\n          initialOrigin={state.origin}\n          handleOriginSelectClick={handleOriginSelectClick}\n          directionChanged={directionChanged}\n          originChanged={originChanged}\n          route={route}\n          routePatternsByDirection={routePatternsByDirection}\n          scheduleNote={scheduleNote}\n          services={services}\n          stops={stops}\n          today={today}\n          updateURL={updateURL}\n        />\n      )}\n    </>\n  );\n};\n\nexport default LineDiagramAndStopListPage;\n","import { get } from \"lodash\";\nimport { useState, useEffect } from \"react\";\n\n// React hook for filtering lists via case-insensitive text matching. takes a\n// list and a key. Key can use any path supported by\n// https://lodash.com/docs/4.17.15#get e.g. 'route_stop.name'\nconst useFilteredList = (\n  list: (string | object)[],\n  key: string = \"\"\n): [\n  string,\n  React.Dispatch<React.SetStateAction<string>>,\n  (string | object)[]\n] => {\n  const [filteredList, setFilteredList] = useState([...list]);\n  const [listQuery, setListQuery] = useState(\"\");\n\n  useEffect(\n    () => {\n      const results = [...list].filter(item => {\n        const string = get(item, key, item);\n        if (typeof string !== \"string\") {\n          return true;\n        }\n        return string.toLowerCase().includes(listQuery.toLowerCase());\n      });\n      setFilteredList(results);\n    },\n    [list, key, listQuery, setFilteredList]\n  );\n\n  return [listQuery, setListQuery, filteredList];\n};\n\nexport default useFilteredList;\n","import { DirectionId } from \"../../../__v3api\";\nimport { SelectedOrigin } from \"../__schedule\";\nimport { Mode as ModalMode } from \"../schedule-finder/ScheduleFinderModal\";\n\nexport interface LineDiagramState {\n  direction: DirectionId;\n  origin: SelectedOrigin;\n  modalMode: ModalMode;\n  modalOpen: boolean;\n}\n\nexport type LineDiagramStateAction =\n  | { type: \"initialize\"; direction: DirectionId; origin: SelectedOrigin }\n  | { type: \"toggle_modal\"; modalOpen: boolean }\n  | { type: \"set_direction\"; direction: DirectionId }\n  | { type: \"set_origin\"; origin: SelectedOrigin };\n\nexport const lineDiagramReducer = (\n  state: LineDiagramState,\n  action: LineDiagramStateAction\n): LineDiagramState => {\n  switch (action.type) {\n    case \"initialize\":\n      return {\n        ...state,\n        direction: action.direction,\n        origin: action.origin,\n        modalMode: \"schedule\",\n        modalOpen: true\n      };\n    case \"set_direction\":\n      return {\n        ...state,\n        direction: action.direction\n      };\n    case \"set_origin\":\n      if (action.origin) {\n        // back to schedule modal\n        return {\n          ...state,\n          origin: action.origin,\n          modalMode: \"schedule\"\n        };\n      }\n      // origin modal (but don't overwrite current origin)\n      return {\n        ...state,\n        modalMode: \"origin\"\n      };\n    case \"toggle_modal\":\n      return {\n        ...state,\n        modalOpen: action.modalOpen\n      };\n    default:\n      return state;\n  }\n};\n","import React from \"react\";\nimport { RouteStopRoute } from \"../__schedule\";\nimport { TooltipWrapper, modeIcon } from \"../../../helpers/icon\";\nimport { isABusRoute, isACommuterRailRoute } from \"../../../models/route\";\nimport { routeBgClass } from \"../../../helpers/css\";\nimport { Route } from \"../../../__v3api\";\n\nconst filteredConnections = (\n  connections: RouteStopRoute[]\n): RouteStopRoute[] => {\n  const firstCRIndex = connections.findIndex(\n    connection => connection.type === 2\n  );\n  const firstFerryIndex = connections.findIndex(\n    connection => connection.type === 4\n  );\n\n  return connections.filter(\n    (connection, index) =>\n      (connection.type !== 2 && connection.type !== 4) ||\n      (connection.type === 2 && index === firstCRIndex) ||\n      (connection.type === 4 && index === firstFerryIndex)\n  );\n};\n\nconst connectionName = (connection: Route): string => {\n  if (isABusRoute(connection)) {\n    return connection.name.startsWith(\"SL\")\n      ? `Silver Line ${connection.name}`\n      : `Route ${connection.name}`;\n  }\n\n  if (isACommuterRailRoute(connection)) {\n    return \"Commuter Rail\";\n  }\n\n  return connection.name;\n};\n\nconst StopConnections = (connections: RouteStopRoute[]): JSX.Element => (\n  <div className=\"m-schedule-diagram__connections\">\n    {filteredConnections(connections).map((connectingRoute: Route) => (\n      <TooltipWrapper\n        key={connectingRoute.id}\n        href={`/schedules/${connectingRoute.id}/line`}\n        tooltipText={connectionName(connectingRoute)}\n        tooltipOptions={{\n          placement: \"bottom\",\n          animation: false\n        }}\n      >\n        {isABusRoute(connectingRoute) ? (\n          <span\n            key={connectingRoute.id}\n            className={`c-icon__bus-pill--small m-schedule-diagram__connection ${routeBgClass(\n              connectingRoute\n            )}`}\n          >\n            {connectingRoute.name}\n          </span>\n        ) : (\n          <span\n            key={connectingRoute.id}\n            className=\"m-schedule-diagram__connection\"\n          >\n            {modeIcon(connectingRoute.id)}\n          </span>\n        )}\n      </TooltipWrapper>\n    ))}\n  </div>\n);\n\nexport default StopConnections;\n","import React from \"react\";\nimport { capitalize } from \"lodash\";\nimport { HeadsignWithCrowding } from \"../../../__v3api\";\nimport {\n  timeForCommuterRail,\n  statusForCommuterRail\n} from \"../../../helpers/prediction-helpers\";\nimport {\n  isSkippedOrCancelled,\n  hasPredictionTime\n} from \"../../../models/prediction\";\nimport LiveCrowdingIcon from \"./LiveCrowdingIcon\";\n\ninterface StopPredictions {\n  headsigns: HeadsignWithCrowding[];\n  isCommuterRail: boolean;\n}\n\nconst predictionTexts = (headsign: HeadsignWithCrowding): string[] => {\n  const texts = [headsign.name];\n  if (headsign.train_number) {\n    texts.push(` · Train ${headsign.train_number}`);\n  }\n\n  const predictedOrScheduledTime =\n    headsign.time_data_with_crowding_list[0].time_data;\n  const { prediction } = predictedOrScheduledTime;\n\n  if (prediction && prediction.track) {\n    texts.push(` · Track ${prediction.track}`);\n  }\n\n  const status = statusForCommuterRail(predictedOrScheduledTime);\n  if (status) {\n    texts.push(` · ${status}`);\n  }\n  return texts;\n};\n\nconst StopPredictions = ({\n  headsigns,\n  isCommuterRail\n}: StopPredictions): JSX.Element => {\n  let predictions: JSX.Element[];\n  const liveHeadsigns = headsigns.filter(hasPredictionTime);\n\n  if (isCommuterRail) {\n    // Display at most 1 prediction for Commuter Rail\n    predictions = liveHeadsigns.slice(0, 1).map(headsign => {\n      const enhancedTimeData = headsign.time_data_with_crowding_list[0];\n      const predictedOrScheduledTime = enhancedTimeData.time_data;\n      const predictionTimeClass = isSkippedOrCancelled(\n        enhancedTimeData.predicted_schedule.prediction\n      )\n        ? \"m-schedule-diagram__cr-prediction-time strikethrough\"\n        : \"m-schedule-diagram__cr-prediction-time\";\n\n      return (\n        <div key={`${headsign.name}-cr`}>\n          <div className=\"m-schedule-diagram__cr-prediction\">\n            {timeForCommuterRail(predictedOrScheduledTime, predictionTimeClass)}\n          </div>\n          <div className=\"m-schedule-diagram__cr-prediction-details\">\n            {predictionTexts(headsign).map((text: string) => (\n              <span key={text}>{text}</span>\n            ))}\n          </div>\n        </div>\n      );\n    });\n  } else {\n    predictions = liveHeadsigns.map((headsign, index) => {\n      const { crowding } = headsign.time_data_with_crowding_list[0];\n      return (\n        <div\n          // eslint-disable-next-line react/no-array-index-key\n          key={`headsign.name-${index}`}\n          className=\"m-schedule-diagram__prediction\"\n        >\n          <div>{headsign.name}</div>\n          <div className=\"m-schedule-diagram__prediction-time\">\n            {capitalize(\n              headsign.time_data_with_crowding_list[0].time_data.prediction!.time.join(\n                \" \"\n              )\n            )}\n          </div>\n          <LiveCrowdingIcon crowding={crowding} />\n        </div>\n      );\n    });\n  }\n\n  return <div className=\"m-schedule-diagram__predictions\">{predictions}</div>;\n};\n\nexport default StopPredictions;\n","import React, { DetailedReactHTMLElement, useEffect, useState } from \"react\";\n\n// React.createElement is used as opposed to the dangerouslySetInnerHTML prop to\n// make the component contents easier to parse in testing\n\ninterface Props {\n  text: string;\n  matchQuery?: string;\n}\n\n// React component for highlighting matching text will wrap the first substring\n// matching the matchQuery in a <b></b> and return the HTML result\nconst MatchHighlight = ({\n  text,\n  matchQuery\n}: Props): DetailedReactHTMLElement<{}, HTMLElement> => {\n  const [childNodes, setChildNodes] = useState<\n    (DetailedReactHTMLElement<{}, HTMLElement> | string)[]\n  >([text]);\n\n  useEffect(\n    () => {\n      if (matchQuery && matchQuery !== \"\") {\n        const matched = text.match(new RegExp(matchQuery, \"i\"));\n        if (matched && matched[0]) {\n          // split text on first instance of match only\n          const [precedingText, ...moreTexts] = text.split(matched[0]);\n          const subsequentText = moreTexts.join(matched[0]);\n          setChildNodes([\n            precedingText,\n            React.createElement(\"b\", { className: \"u-highlight\" }, matched[0]),\n            subsequentText\n          ]);\n        }\n      } else {\n        setChildNodes([text]);\n      }\n    },\n    [text, matchQuery, setChildNodes]\n  );\n\n  return React.createElement(\"span\", {}, ...childNodes);\n};\n\nexport default MatchHighlight;\n","import React from \"react\";\nimport { RouteStop } from \"../__schedule\";\nimport {\n  TooltipWrapper,\n  parkingIcon,\n  accessibleIcon\n} from \"../../../helpers/icon\";\nimport { isACommuterRailRoute } from \"../../../models/route\";\n\nconst StopFeatures = (routeStop: RouteStop): JSX.Element => (\n  <div className=\"m-schedule-diagram__features\">\n    {routeStop.stop_features.includes(\"parking_lot\") ? (\n      <TooltipWrapper\n        tooltipText=\"Parking\"\n        tooltipOptions={{ placement: \"bottom\" }}\n      >\n        {parkingIcon(\n          \"c-svg__icon-parking-default m-schedule-diagram__feature-icon\"\n        )}\n      </TooltipWrapper>\n    ) : null}\n    {routeStop.stop_features.includes(\"access\") ? (\n      <TooltipWrapper\n        tooltipText=\"Accessible\"\n        tooltipOptions={{ placement: \"bottom\" }}\n      >\n        {accessibleIcon(\n          \"c-svg__icon-acessible-default m-schedule-diagram__feature-icon\"\n        )}\n      </TooltipWrapper>\n    ) : null}\n    {routeStop.zone &&\n      routeStop.route &&\n      isACommuterRailRoute(routeStop.route) && (\n        <span className=\"c-icon__cr-zone m-schedule-diagram__feature-icon\">{`Zone ${\n          routeStop.zone\n        }`}</span>\n      )}\n  </div>\n);\n\nexport default StopFeatures;\n","import { max } from \"lodash\";\nimport React, { ReactElement } from \"react\";\nimport { LineDiagramStop } from \"../../__schedule\";\nimport {\n  hasBranchLines,\n  isBranchTerminusStop,\n  areOnDifferentBranchLines,\n  diagramWidth,\n  isMergeStop\n} from \"../line-diagram-helpers\";\nimport Line from \"./Line\";\nimport Merges from \"./Merge\";\nimport Stop from \"./Stop\";\nimport { routeToModeName } from \"../../../../helpers/css\";\nimport { LiveDataByStop } from \"../__line-diagram\";\nimport VehicleIcons from \"../VehicleIcons\";\nimport { getCurrentState } from \"../../../store/ScheduleStore\";\nimport { DirectionId } from \"../../../../__v3api\";\nimport { isAGreenLineRoute } from \"../../../../models/route\";\nimport { BASE_LINE_WIDTH, DiagonalHatchPattern } from \"./graphic-helpers\";\n\ninterface DiagramProps {\n  lineDiagram: LineDiagramStop[];\n  liveData: LiveDataByStop | null;\n}\n\nconst branchingDescription = (lineDiagram: LineDiagramStop[]): string => {\n  const mergeStops = lineDiagram.filter(isMergeStop);\n  const branchText = mergeStops.map(mergeStop => {\n    const mergeStopName = mergeStop.route_stop.name;\n    const branchNames = mergeStop.stop_data\n      .filter(sd => sd.branch)\n      .map(sd => sd.branch);\n    return `Use ${mergeStopName} to transfer to trains on ${branchNames.join(\n      \" or \"\n    )} branches. `;\n  });\n  return branchText.join(\"\");\n};\nconst diagramDescription = (\n  lineDiagram: LineDiagramStop[],\n  direction: DirectionId\n): string => {\n  const text = `${lineDiagram.length} stops`;\n  const {\n    direction_destinations: destinations,\n    direction_names: names\n  } = lineDiagram[0].route_stop.route!;\n  if (destinations) {\n    return `${text} going ${names[direction]} to ${destinations[direction]}`;\n  }\n  return text;\n};\n\ninterface VehicleIconSetProps {\n  stop: LineDiagramStop;\n  liveData: LiveDataByStop | null;\n}\n\nconst LiveVehicleIconSet = ({\n  stop,\n  liveData\n}: VehicleIconSetProps): ReactElement<HTMLElement> | null => {\n  const stopId = stop.route_stop.id;\n  if (!liveData || !liveData[stopId]) return null;\n  // Hide vehicles arriving to the origin from 'off the line'\n  const vehicleData = stop.route_stop[\"is_beginning?\"]\n    ? liveData[stopId].vehicles.filter(vehicle => vehicle.status === \"stopped\")\n    : liveData[stopId].vehicles;\n  return (\n    <VehicleIcons\n      key={`${stopId}-vehicles`}\n      stop={stop.route_stop}\n      vehicles={vehicleData}\n    />\n  );\n};\n\nconst Diagram = (props: DiagramProps): ReactElement<HTMLElement> | null => {\n  const { lineDiagram, liveData } = props;\n  const { selectedDirection } = getCurrentState();\n  const width = diagramWidth(\n    max(lineDiagram.map(ld => ld.stop_data.length)) || 1\n  );\n\n  return (\n    <>\n      {lineDiagram.map(stop => (\n        <LiveVehicleIconSet\n          key={stop.route_stop.id}\n          stop={stop}\n          liveData={liveData}\n        />\n      ))}\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        role=\"img\"\n        aria-labelledby=\"diagram-title diagram-desc\"\n        className={`line-diagram-svg ${routeToModeName(\n          lineDiagram[0].route_stop.route!\n        )}`}\n        width={`${width + 4}px`}\n        height=\"100%\"\n        style={{ left: BASE_LINE_WIDTH / 2 }}\n      >\n        <title id=\"diagram-title\">\n          Line diagram for{\" \"}\n          {isAGreenLineRoute(lineDiagram[0].route_stop.route!)\n            ? \"Green Line\"\n            : lineDiagram[0].route_stop.route!.name}\n        </title>\n        <desc id=\"diagram-desc\">\n          {diagramDescription(lineDiagram, selectedDirection)}\n          {hasBranchLines(lineDiagram) && branchingDescription(lineDiagram)}\n        </desc>\n\n        <defs>{DiagonalHatchPattern}</defs>\n        {/* If there are multiple branches, draw the lines and curves for those */\n        hasBranchLines(lineDiagram) && <Merges lineDiagram={lineDiagram} />}\n\n        {/* Draw lines between stops */\n        lineDiagram.map((current, idx, self) => {\n          if (self[idx + 1]) {\n            if (\n              isBranchTerminusStop(current) &&\n              areOnDifferentBranchLines(current, self[idx + 1])\n            )\n              return null; // don't draw a line from a branch end to the main line\n\n            return (\n              <Line\n                key={`${current.route_stop.id}-${self[idx + 1].route_stop.id}`}\n                from={current}\n                to={self[idx + 1]}\n              />\n            );\n          }\n          return null; // this is the end of the line, nothing to draw a line to\n        })}\n\n        {/* Draw circles for each stop */\n        lineDiagram.map(stop => (\n          <Stop key={stop.route_stop.id} stop={stop} />\n        ))}\n      </svg>\n    </>\n  );\n};\n\nexport default Diagram;\n","import { first, last } from \"lodash\";\nimport React, { ReactElement } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { LineDiagramStop } from \"../../__schedule\";\nimport {\n  getTreeDirection,\n  isBranchTerminusStop,\n  isMergeStop,\n  lineDiagramIndexes,\n  isStopOnMainLine\n} from \"../line-diagram-helpers\";\nimport {\n  CoordState,\n  StopCoord,\n  BASE_LINE_WIDTH,\n  MERGE_RADIUS\n} from \"./graphic-helpers\";\nimport Line from \"./Line\";\n\ninterface MergeGraphicsProps {\n  lineDiagram: LineDiagramStop[];\n}\nconst Merges = ({ lineDiagram }: MergeGraphicsProps): ReactElement | null => {\n  const branchingOutward = getTreeDirection(lineDiagram) === \"outward\";\n  const mergeIndices = lineDiagramIndexes(lineDiagram, isMergeStop);\n  // walk through the diagram to find where all the merges go.\n  const stopGaps = mergeIndices.map(i => {\n    let from: LineDiagramStop;\n    let to: LineDiagramStop;\n    if (branchingOutward) {\n      from = lineDiagram[i];\n      [to] = lineDiagram.slice(i).filter(isStopOnMainLine);\n    } else {\n      to = lineDiagram[i];\n      from = last(lineDiagram.slice(0, i - 1).filter(isStopOnMainLine))!;\n    }\n\n    return [from, to];\n  });\n\n  const lineDiagramCoords: CoordState = useSelector(\n    (state: CoordState) => state\n  );\n  if (!lineDiagramCoords) return null;\n\n  const mergeBends = stopGaps.map(([from, to]) => {\n    // if outward, start with from and construct array of tos\n    // if inward, start with to and construct array of froms\n    const mergeStop = branchingOutward ? from : to;\n    const mergeStopIndex = lineDiagram.indexOf(mergeStop);\n    const mergeStopCoords = lineDiagramCoords[mergeStop.route_stop.id];\n    if (!mergeStopCoords) return null;\n\n    // usually there's just one terminus to draw the merge to... except for the GL at Kenmore.\n    const mergeEnds = mergeStop.stop_data.slice(1).map(({ branch }) => {\n      // along the branch might be subsequent stops or prior stops\n      const downBranch = (branchingOutward\n        ? lineDiagram.slice(mergeStopIndex)\n        : lineDiagram.slice(0, mergeStopIndex)\n      ).filter(stop => stop.route_stop.branch === branch);\n      const nextStopOnBranch = branchingOutward\n        ? first(downBranch)\n        : last(downBranch);\n      const terminusOnBranch = branchingOutward\n        ? first(downBranch.filter(isBranchTerminusStop))\n        : last(downBranch.filter(isBranchTerminusStop));\n      return [nextStopOnBranch, terminusOnBranch];\n    });\n\n    return mergeEnds.map(([nextStop, terminus]) => {\n      if (!nextStop && !terminus) return null;\n      // try the next stop on the branch first. if the branch is collapsed the\n      // coordinates will be null as the next stop is hidden, so use terminus\n      const nextStopVisible = !!lineDiagramCoords[nextStop!.route_stop.id];\n      const nextStopCoords = nextStopVisible\n        ? lineDiagramCoords[nextStop!.route_stop.id]\n        : lineDiagramCoords[terminus!.route_stop.id];\n\n      const [x, y] = nextStopCoords as StopCoord;\n      const [mX, mY] = mergeStopCoords;\n      const dx = (Math.abs(mX - x) - MERGE_RADIUS) * -1;\n      const dy =\n        (Math.abs(mY - y) - MERGE_RADIUS - (branchingOutward ? 60 : 20)) *\n        (branchingOutward ? -1 : 1);\n      const arc = branchingOutward\n        ? `-${MERGE_RADIUS},-${MERGE_RADIUS} 0 0 0 -${MERGE_RADIUS},-${MERGE_RADIUS}`\n        : `-${MERGE_RADIUS},${MERGE_RADIUS} 0 0 1 -${MERGE_RADIUS},${MERGE_RADIUS}`;\n      const pathProps: React.SVGProps<SVGPathElement> = {\n        key: `${mergeStop.route_stop.id}-${terminus!.route_stop.id}-merge`,\n        strokeWidth: `${BASE_LINE_WIDTH}px`,\n        d: `M${x},${y} v${dy} a${arc} h${dx}`\n      };\n      if (nextStop!.stop_data.some(sd => sd[\"has_disruption?\"])) {\n        pathProps.stroke = \"url(#diagonalHatch)\";\n      }\n      return <path {...pathProps} />;\n    });\n  });\n\n  if (!stopGaps.length && !mergeBends.length) return null;\n\n  return (\n    <g className=\"line-diagram-svg__merge\">\n      {stopGaps.map(\n        ([from, to]) =>\n          from &&\n          to && (\n            <Line\n              key={`${from.route_stop.id}-${to.route_stop.id}-line`}\n              from={from}\n              to={to}\n            />\n          )\n      )}\n      {mergeBends}\n    </g>\n  );\n};\n\nexport default Merges;\n","import React, { ReactElement } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { LineDiagramStop } from \"../../__schedule\";\nimport { StopCoord, CoordState, CIRC_RADIUS } from \"./graphic-helpers\";\n\nconst Stop = ({\n  stop\n}: {\n  stop: LineDiagramStop;\n}): ReactElement<SVGCircleElement> | null => {\n  const coords: StopCoord | null = useSelector(\n    (state: CoordState) => state[stop.route_stop.id]\n  );\n  if (!coords) return null;\n  const [x, y] = coords;\n  return (\n    <circle\n      className=\"line-diagram-svg__stop\"\n      r={`${CIRC_RADIUS}px`}\n      cx={`${x}px`}\n      cy={`${y}px`}\n    />\n  );\n};\n\nexport default Stop;\n","import React from \"react\";\nimport { renderToString } from \"react-dom/server\";\nimport { useSelector } from \"react-redux\";\nimport { RouteStop, LineDiagramVehicle } from \"../__schedule\";\nimport CrowdingPill from \"./CrowdingPill\";\nimport { TooltipWrapper, vehicleArrowIcon } from \"../../../helpers/icon\";\nimport { StopCoord, CoordState, CIRC_RADIUS } from \"./graphics/graphic-helpers\";\nimport { RouteType } from \"../../../__v3api\";\nimport {\n  vehicleRealtimeStatusText,\n  vehicleName\n} from \"../../../models/vehicle\";\n\ninterface VehicleIconsProps {\n  stop: RouteStop;\n  vehicles: LineDiagramVehicle[] | null;\n}\n\nconst tooltipText = (\n  routeType: RouteType | null,\n  stopName: string | null,\n  vehicle: LineDiagramVehicle\n): string => {\n  const status =\n    stopName && stopName.length\n      ? `${vehicleRealtimeStatusText(vehicle)} ${stopName}`\n      : \"\";\n\n  if (routeType !== null) {\n    let baseText = vehicleName(routeType);\n    if (routeType === 2) baseText += ` ${vehicle.trip_name}`;\n\n    if (vehicle.headsign) {\n      return `${vehicle.headsign} ${baseText.toLowerCase()} ${status}`;\n    }\n\n    return `${baseText} ${status}`;\n  }\n\n  return `Vehicle ${status}`;\n};\n\nconst CrowdingIconString = (vehicle: LineDiagramVehicle): string =>\n  renderToString(<CrowdingPill crowding={vehicle.crowding} />);\n\nconst VehicleIcons = ({\n  stop,\n  vehicles\n}: VehicleIconsProps): JSX.Element | null => {\n  const coords: StopCoord | null = useSelector(\n    (state: CoordState) => state[stop.id]\n  );\n  if (!vehicles || !coords) return null;\n  const [x, y] = coords;\n  const left = `${x - CIRC_RADIUS}px`;\n  const routeType = stop.route ? stop.route.type : null;\n  const tooltips = vehicles.map(vehicle => {\n    const top = `${{\n      // eslint-disable-next-line camelcase\n      in_transit: y - 50,\n      incoming: y - 25,\n      stopped: y - 10\n    }[vehicle.status] || y}px`;\n\n    return (\n      <div\n        key={vehicle.id}\n        className=\"m-schedule-diagram__vehicle\"\n        style={{ top, left }}\n      >\n        <TooltipWrapper\n          tooltipText={`<div class=\"m-schedule-diagram__vehicle-tooltip\">${\n            vehicle.crowding ? `${CrowdingIconString(vehicle)}<br/>` : \"\"\n          }${tooltipText(routeType, stop.name, vehicle)}</div>`}\n          tooltipOptions={{ placement: \"right\", animation: false, html: true }}\n        >\n          {vehicleArrowIcon(\"m-schedule-diagram__vehicle--icon\")}\n        </TooltipWrapper>\n      </div>\n    );\n  });\n\n  return <>{tooltips}</>;\n};\n\nexport default VehicleIcons;\n","import { isArray, last } from \"lodash\";\nimport React from \"react\";\nimport StopCard from \"./StopCard\";\nimport ExpandableBranch from \"./ExpandableBranch\";\nimport { CommonLineDiagramProps } from \"./__line-diagram\";\nimport { LineDiagramStop } from \"../__schedule\";\nimport { lineDiagramIndexes, isOnBranchLine } from \"./line-diagram-helpers\";\n\n// build branched diagram structure\nconst buildBranchedLineDiagram = (\n  lineDiagram: LineDiagramStop[]\n): (LineDiagramStop | LineDiagramStop[])[] => {\n  const branchedDiagram: (LineDiagramStop | LineDiagramStop[])[] = [];\n  // determine if the diagram will collect branches (\"inward\")\n  // or split into branches (\"outward\") going down the page\n  // const direction = getTreeDirection(lineDiagram);\n\n  // identify where in the list to branch out or in, e.g.\n  // [stop, stop, stop, stop, stop, #, stop, stop]\n  // # = on an \"inward\" direction tree, join the branch to the main line\n  // [stop, stop, ^, stop, stop, stop, stop, stop]\n  // ^ = on an \"outward\" direction tree, split the branch from the main line\n  const toggledStopIndices = lineDiagramIndexes(\n    lineDiagram,\n    (stop: LineDiagramStop): boolean =>\n      isOnBranchLine(stop) && last(stop.stop_data)!.type === \"stop\"\n  );\n\n  // iterate through the list, constructing branches as needed\n  // branches will be grouped together, e.g.:\n  // [stop, stop, [stop#, stop, stop], stop, stop]\n  // # = branch terminus for a tree with \"inward\" direction\n  // [stop, stop, [stop, stop, stop^], stop, stop]\n  // ^ = branch terminus for a tree with \"outward\" direction\n  lineDiagram.forEach((ld, i) => {\n    if (toggledStopIndices.includes(i)) {\n      // either place on branch or initialize new branch\n      if (isArray(last(branchedDiagram))) {\n        (last(branchedDiagram) as LineDiagramStop[]).push(ld);\n      } else {\n        branchedDiagram.push([ld]);\n      }\n    } else {\n      branchedDiagram.push(ld);\n    }\n  });\n\n  return branchedDiagram;\n};\n\nexport const Branch = (props: CommonLineDiagramProps): React.ReactElement => {\n  const { stops, handleStopClick, liveData } = props;\n  return (\n    <li>\n      {stops.length > 2 ? (\n        <ExpandableBranch key={`${stops[0].route_stop.id}-branch`} {...props} />\n      ) : (\n        <ol>\n          {stops.map(stop => (\n            <StopCard\n              key={stop.route_stop.id}\n              stop={stop}\n              onClick={handleStopClick}\n              liveData={liveData[stop.route_stop.id]}\n            />\n          ))}\n        </ol>\n      )}\n    </li>\n  );\n};\n\nconst StopListWithBranches = (\n  props: CommonLineDiagramProps\n): React.ReactElement => {\n  const { stops, ...other } = props;\n  const lineDiagramWithBranches = buildBranchedLineDiagram(stops);\n  return (\n    <ol>\n      {lineDiagramWithBranches.map(stopOrStops => {\n        if (isArray(stopOrStops)) {\n          return (\n            <Branch\n              key={stopOrStops[0].route_stop.id}\n              stops={stopOrStops}\n              {...other}\n            />\n          );\n        }\n\n        // it's a stop, just render it\n        return (\n          <StopCard\n            key={stopOrStops.route_stop.id}\n            stop={stopOrStops}\n            onClick={props.handleStopClick}\n            liveData={props.liveData[stopOrStops.route_stop.id]}\n          />\n        );\n      })}\n    </ol>\n  );\n};\n\nexport default StopListWithBranches;\n","import { max, times } from \"lodash\";\nimport React, { ReactElement, useState, useContext } from \"react\";\nimport ExpandableBlock from \"../../../components/ExpandableBlock\";\nimport { LineDiagramStop } from \"../__schedule\";\nimport { CommonLineDiagramProps } from \"./__line-diagram\";\nimport { StopRefContext } from \"./LineDiagramWithStops\";\nimport { diagramWidth } from \"./line-diagram-helpers\";\nimport {\n  CIRC_DIAMETER,\n  CIRC_RADIUS,\n  BRANCH_LINE_WIDTH\n} from \"./graphics/graphic-helpers\";\nimport { routeToModeName } from \"../../../helpers/css\";\nimport StopCard from \"./StopCard\";\n\nconst BranchToggle = (\n  stops: LineDiagramStop[],\n  isExpanded: boolean\n): JSX.Element => {\n  const maxBranches = max(stops.map(ld => ld.stop_data.length - 1)) || 1;\n  const width = diagramWidth(maxBranches) + 2;\n  return (\n    <div className=\"m-schedule-diagram__expander-header\">\n      <div style={{ width }}>\n        {!isExpanded && (\n          <svg\n            className={`line-diagram-svg__toggle ${routeToModeName(\n              stops[0].route_stop.route!\n            )}`}\n            width={width}\n            height=\"100%\"\n          >\n            <g\n              transform={`translate(${maxBranches * BRANCH_LINE_WIDTH - 1}, 1)`}\n            >\n              <rect width={CIRC_DIAMETER * 2} height=\"42\" rx={CIRC_DIAMETER} />\n              {times(3, i => (\n                <circle\n                  key={i}\n                  cx={CIRC_DIAMETER}\n                  cy={10 * (i + 1) + 1}\n                  r={CIRC_RADIUS}\n                />\n              ))}\n            </g>\n          </svg>\n        )}\n      </div>\n      <button className=\"btn btn-link m-schedule-diagram__toggle\" type=\"button\">\n        {stops.length} stops\n      </button>\n    </div>\n  );\n};\n\nconst ExpandableBranch = (\n  props: CommonLineDiagramProps\n): ReactElement<HTMLElement> => {\n  const { stops, handleStopClick, liveData } = props;\n  const [isExpanded, setIsExpanded] = useState(false);\n  const updateAllStopCoords = useContext(StopRefContext)[1];\n\n  // reset all the coordinates.\n  React.useEffect(\n    () => {\n      updateAllStopCoords();\n    },\n    [isExpanded, updateAllStopCoords]\n  );\n\n  return (\n    <div className=\"m-schedule-diagram__expander\">\n      <ExpandableBlock\n        header={{\n          iconSvgText: null,\n          text: BranchToggle(stops, isExpanded)\n        }}\n        initiallyExpanded={isExpanded}\n        notifyExpanded={(blockIsExpanded: boolean) => {\n          setIsExpanded(blockIsExpanded);\n        }}\n        preventScroll\n        id={`${stops[0].route_stop.branch}`}\n      >\n        <>\n          {stops.map(stop => (\n            <StopCard\n              key={stop.route_stop.id}\n              stop={stop}\n              onClick={handleStopClick}\n              liveData={liveData[stop.route_stop.id]}\n            />\n          ))}\n        </>\n      </ExpandableBlock>\n    </div>\n  );\n};\n\nexport default ExpandableBranch;\n","import { useDispatch } from \"react-redux\";\nimport { useRef, useEffect, useCallback } from \"react\";\nimport { LineDiagramStop } from \"../../__schedule\";\nimport { isMergeStop } from \"../line-diagram-helpers\";\nimport { BASE_LINE_WIDTH, BRANCH_SPACING } from \"./graphic-helpers\";\n\nexport interface RefList {\n  [key: string]: React.MutableRefObject<HTMLElement | null>;\n}\n\nfunction useStopRef(prev: RefList, stop: LineDiagramStop): RefList {\n  return {\n    ...prev,\n    [stop.route_stop.id]: useRef<HTMLElement>(null)\n  };\n}\n\nconst stopById = (stopId: string): ((stop: LineDiagramStop) => boolean) =>\n  // eslint-disable-next-line camelcase\n  ({ route_stop }) => stopId === route_stop.id;\n\nconst xCoordForStop = (stop: LineDiagramStop): number => {\n  if (isMergeStop(stop)) {\n    return BASE_LINE_WIDTH + 1;\n  }\n  // usually just a function of stop_data length\n  return BRANCH_SPACING * (stop.stop_data.length - 1) + BASE_LINE_WIDTH + 1;\n};\n\nexport default function useStopPositions(\n  stops: LineDiagramStop[]\n): [RefList, () => void] {\n  const stopRefsMap: RefList = stops.reduce(useStopRef, {});\n  const dispatchStopCoords = useDispatch();\n  const updateAllStops = useCallback(\n    (): void => {\n      Object.entries(stopRefsMap).forEach(([stopId, ref]) => {\n        const x = xCoordForStop(stops.find(stopById(stopId))!);\n        let coordinates = null;\n        if (ref && ref.current) {\n          const { offsetTop, offsetHeight } = ref.current;\n          const y = offsetTop + offsetHeight / 2;\n          coordinates = [x, y];\n        }\n        dispatchStopCoords({\n          type: \"set\",\n          stop: stopId,\n          coords: coordinates\n        });\n      });\n    },\n    [dispatchStopCoords, stopRefsMap, stops]\n  );\n\n  useEffect(\n    () => {\n      updateAllStops();\n      window.addEventListener(\"resize\", updateAllStops);\n      return () => window.removeEventListener(\"resize\", updateAllStops);\n    },\n    [updateAllStops]\n  );\n\n  return [stopRefsMap, updateAllStops];\n}\n","export const stringToDateObject = (unformatted: string): Date => {\n  const [year, month, day] = unformatted\n    .split(/-/)\n    .map(part => Number.parseInt(part, 10));\n\n  // Remember that months in JS are 0-indexed for some reason, hence \"month - 1\".\n  const parsedDate = new Date(year, month - 1, day);\n  return parsedDate;\n};\n\n// Returns a date in the form of \"2019-08-07\"\nexport const dateObjectToString = (date: Date): string =>\n  [\n    date.getFullYear(),\n    `0${date.getMonth() + 1}`.slice(-2),\n    `0${date.getDate()}`.slice(-2)\n  ].join(\"-\");\n\n// Returns a date in the form of \"August 7, 2019\"\nexport const formattedDate = (unformatted: string): string => {\n  const parsedDate = stringToDateObject(unformatted);\n  return parsedDate.toLocaleDateString(\"en-US\", {\n    year: \"numeric\",\n    month: \"long\",\n    day: \"numeric\",\n    timeZone: \"UTC\"\n  });\n};\n\n// Returns a date in the form of \"Aug 7\"\nexport const shortDate = (date: Date): string =>\n  date.toLocaleDateString(\"en-US\", {\n    month: \"short\",\n    day: \"numeric\",\n    timeZone: \"UTC\"\n  });\n\nexport default formattedDate;\n","import React from \"react\";\nimport { AnyAction, Reducer, Store, createStore } from \"redux\";\nimport { LineDiagramStop } from \"../../__schedule\";\n\nexport const CIRC_RADIUS = 4;\nexport const CIRC_DIAMETER = CIRC_RADIUS * 2;\nexport const BASE_LINE_WIDTH = CIRC_DIAMETER + 2;\nexport const BRANCH_LINE_WIDTH = BASE_LINE_WIDTH + 6;\nexport const BRANCH_SPACING = 16;\nexport const MERGE_RADIUS = 6;\n\nexport type StopCoord = [number, number];\nexport interface CoordState {\n  [key: string]: StopCoord | null;\n}\n\nexport interface CoordAction extends AnyAction {\n  stop: string;\n  coords: StopCoord | null;\n}\n\nexport const coordReducer: Reducer<CoordState, CoordAction> = (\n  allCoordinates: CoordState | undefined,\n  action: CoordAction\n): CoordState => {\n  const { stop, coords } = action;\n  return {\n    ...allCoordinates,\n    [stop]: coords\n  };\n};\n\nexport const createLineDiagramCoordStore = (\n  lineDiagram: LineDiagramStop[]\n): Store<CoordState, CoordAction> => {\n  const stopIds = lineDiagram.map(ld => ld.route_stop.id);\n  const initialCoordState: CoordState = stopIds.reduce(\n    (state, id) => ({ ...state, [id]: null }),\n    {}\n  );\n  const store = createStore(\n    coordReducer,\n    initialCoordState,\n    /* eslint-disable no-underscore-dangle, @typescript-eslint/no-explicit-any */\n    (window as any).__REDUX_DEVTOOLS_EXTENSION__ &&\n      (window as any).__REDUX_DEVTOOLS_EXTENSION__()\n    /* eslint-enable no-underscore-dangle, @typescript-eslint/no-explicit-any */\n  );\n\n  return store;\n};\n\nexport const DiagonalHatchPattern = (\n  <pattern\n    id=\"diagonalHatch\"\n    width=\"10\"\n    height=\"10\"\n    patternTransform=\"rotate(45 0 0)\"\n    patternUnits=\"userSpaceOnUse\"\n  >\n    <line\n      className=\"line-diagram-svg__line\"\n      y2={CIRC_DIAMETER}\n      strokeWidth={`${BRANCH_LINE_WIDTH}px`}\n    />\n  </pattern>\n);\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>green line B</title><path fill=\\\"#00843d\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"M8.59 4a5.398 5.398 0 011.086.101 2.392 2.392 0 01.84.33 1.558 1.558 0 01.542.611 2.068 2.068 0 01.192.941 1.701 1.701 0 01-.286 1.008 2.06 2.06 0 01-.845.662 2.004 2.004 0 011.148.745 2.152 2.152 0 01.38 1.283 2.137 2.137 0 01-.245 1.048 2.058 2.058 0 01-.66.722 2.957 2.957 0 01-.944.414 4.423 4.423 0 01-1.09.135H4.672V4zm-.233 3.238a1.352 1.352 0 00.805-.224.832.832 0 00.315-.728.892.892 0 00-.105-.46.752.752 0 00-.28-.28 1.224 1.224 0 00-.402-.14 2.757 2.757 0 00-.472-.039H6.502v1.871zm.106 3.395a2.51 2.51 0 00.512-.05 1.29 1.29 0 00.432-.168.86.86 0 00.297-.32 1.06 1.06 0 00.111-.515 1.017 1.017 0 00-.361-.88 1.59 1.59 0 00-.957-.263H6.502v2.196z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>green line C</title><path fill=\\\"#00843d\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"M9.912 6.222a1.685 1.685 0 00-.374-.423 1.754 1.754 0 00-1.103-.386 1.963 1.963 0 00-.964.22 1.82 1.82 0 00-.643.59 2.59 2.59 0 00-.358.84 4.224 4.224 0 00-.112.974 3.928 3.928 0 00.112.937 2.536 2.536 0 00.358.82 1.838 1.838 0 00.643.583 1.957 1.957 0 00.964.22 1.554 1.554 0 001.204-.471 2.174 2.174 0 00.53-1.243h1.629a3.878 3.878 0 01-.333 1.296 3.088 3.088 0 01-.707.985 2.998 2.998 0 01-1.028.622A3.764 3.764 0 018.435 12a3.922 3.922 0 01-1.58-.305 3.393 3.393 0 01-1.183-.841 3.72 3.72 0 01-.739-1.258 4.615 4.615 0 01-.257-1.559 4.773 4.773 0 01.257-1.59 3.831 3.831 0 01.739-1.28 3.391 3.391 0 011.183-.856A3.862 3.862 0 018.435 4a3.853 3.853 0 011.194.182 3.254 3.254 0 011.007.53 2.862 2.862 0 01.733.863 3.09 3.09 0 01.364 1.177h-1.627a1.378 1.378 0 00-.194-.53z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>green line D</title><path fill=\\\"#00843d\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"M7.91 4a4.12 4.12 0 011.44.247 3.124 3.124 0 011.154.74 3.404 3.404 0 01.762 1.231 4.968 4.968 0 01.274 1.737 5.524 5.524 0 01-.224 1.614 3.552 3.552 0 01-.677 1.277 3.186 3.186 0 01-1.132.846A3.837 3.837 0 017.91 12H4.46V4zm-.123 6.521a2.252 2.252 0 00.74-.123 1.622 1.622 0 00.638-.41 2.043 2.043 0 00.448-.744 3.287 3.287 0 00.169-1.12 4.647 4.647 0 00-.118-1.093 2.185 2.185 0 00-.387-.835 1.718 1.718 0 00-.71-.532 2.837 2.837 0 00-1.094-.185H6.218v5.042z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>green line E</title><path fill=\\\"#00843d\\\" d=\\\"M8 0a8 8 0 108 8 8 8 0 00-8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"M11.184 4v1.48H6.959v1.713h3.877V8.56H6.959v1.961h4.314V12H5.201V4z\\\"></path></svg>\"","import { BranchDirection } from \"./__line-diagram\";\nimport { LineDiagramStop } from \"../__schedule\";\nimport { BRANCH_SPACING, BASE_LINE_WIDTH } from \"./graphics/graphic-helpers\";\n\nexport const isMergeStop = (stop: LineDiagramStop): boolean =>\n  stop.stop_data.some(sd => sd.type === \"merge\"); // always on branch\n\nexport const isOnBranchLine = (stop: LineDiagramStop): boolean =>\n  stop.stop_data.length > 1 && !isMergeStop(stop); // merge stops show on main line, not branch line\n\nexport const hasBranchLines = (lineDiagram: LineDiagramStop[]): boolean =>\n  lineDiagram.some(isOnBranchLine);\n\nconst isOnBranch = (stop: LineDiagramStop): boolean =>\n  isOnBranchLine(stop) || !!stop.route_stop.branch;\n\nexport const areOnDifferentBranchLines = (\n  from: LineDiagramStop,\n  to: LineDiagramStop\n): boolean =>\n  !isMergeStop(from) &&\n  !isMergeStop(to) &&\n  from.stop_data.length !== to.stop_data.length &&\n  from.route_stop.branch !== to.route_stop.branch;\n\nconst isTerminusStop = (stop: LineDiagramStop): boolean =>\n  stop.route_stop[\"is_terminus?\"];\n\nexport const isBranchTerminusStop = (stop: LineDiagramStop): boolean =>\n  isOnBranch(stop) && isTerminusStop(stop);\n\nexport const lineDiagramIndexes = (\n  lineDiagram: LineDiagramStop[],\n  subsetFn: (stop: LineDiagramStop) => boolean\n): number[] => {\n  const subset = lineDiagram.filter(subsetFn);\n  return subset.map(s => lineDiagram.indexOf(s));\n};\n\nexport const getTreeDirection = (\n  lineDiagram: LineDiagramStop[]\n): BranchDirection => {\n  // determines if tree should fan out or collect branches as we go down the page\n  // use the position of the merge stop to find this. assume default of outward\n  let direction: BranchDirection = \"outward\";\n  if (lineDiagram.some(isMergeStop)) {\n    const mergeIndices = lineDiagramIndexes(lineDiagram, isMergeStop);\n    const branchTerminiIndices = lineDiagramIndexes(\n      lineDiagram,\n      isBranchTerminusStop\n    );\n    direction = branchTerminiIndices.some(i => mergeIndices[0] > i)\n      ? \"inward\"\n      : \"outward\";\n  }\n\n  return direction;\n};\n\n// eslint-disable-next-line camelcase\nexport const isStopOnMainLine = ({ stop_data }: LineDiagramStop): boolean =>\n  // eslint-disable-next-line camelcase\n  stop_data[0].type === \"stop\" || stop_data[0].type === \"terminus\";\n\nexport const diagramWidth = (maxBranches: number): number =>\n  BASE_LINE_WIDTH + maxBranches * BRANCH_SPACING + BASE_LINE_WIDTH;\n","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>accessible</title><rect width=\\\"16\\\" height=\\\"16\\\" fill=\\\"#165c96\\\" rx=\\\"3.748\\\"></rect><g fill=\\\"#fff\\\"><path d=\\\"M6.906 13a3.28 3.28 0 01-1.367-6.264l.074.971A2.385 2.385 0 109.264 10l.582 1.19A3.331 3.331 0 016.906 13z\\\"></path><path d=\\\"M10.62 11.938L9.278 8.794l-3.271-.001-.318-4.47a.926.926 0 01-.111-.432.891.891 0 11.978.888l.094 1.668h2.293l.007.72H6.73l.053.81 3.042-.021 1.298 2.997.986-.356.273.65z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>blue line</title><path fill=\\\"#003da5\\\" d=\\\"M24 0a24 24 0 1024 24A24 24 0 0024 0\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M16.213 13.647a12.878 12.878 0 012.698.261 5.83 5.83 0 012.088.856 3.983 3.983 0 011.348 1.58 5.562 5.562 0 01.479 2.436 4.537 4.537 0 01-.711 2.61 5.161 5.161 0 01-2.103 1.711 4.977 4.977 0 012.857 1.928 5.744 5.744 0 01.942 3.321 5.707 5.707 0 01-.608 2.712 5.287 5.287 0 01-1.639 1.87 7.25 7.25 0 01-2.35 1.073 10.589 10.589 0 01-2.71.348H6.468V13.647zm-.58 8.38a3.275 3.275 0 002.001-.579 2.19 2.19 0 00.783-1.885 2.41 2.41 0 00-.26-1.189 1.942 1.942 0 00-.697-.725 2.945 2.945 0 00-1-.362 6.663 6.663 0 00-1.174-.102h-4.264v4.843zm.261 8.788a6.09 6.09 0 001.276-.13 3.128 3.128 0 001.074-.435 2.202 2.202 0 00.739-.827 2.846 2.846 0 00.275-1.334 2.677 2.677 0 00-.9-2.276 3.836 3.836 0 00-2.377-.682h-4.959v5.684zM31.438 13.647v16.878h10.093v3.828H26.885V13.647z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>subway</title><path fill=\\\"#494f5b\\\" d=\\\"M24 0a24 24 0 1024 24A24 24 0 0024 0\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M25.889 5.822a1.411 1.411 0 10-1.411-1.41 1.411 1.411 0 001.41 1.41zM31.456 34.211a4.978 4.978 0 003.889-4.822V11.244a5.011 5.011 0 00-5.078-4.91H17.733a5.011 5.011 0 00-5.1 4.9v18.155a4.978 4.978 0 003.89 4.822L10.666 43h3.4l4.189-6.144H29.81L34 43h3.333zM20.7 8.222a.845.845 0 01.845-.81H26.5a.844.844 0 01.833.81v1.479a.833.833 0 01-.866.799l-4.922-.011a.833.833 0 01-.845-.822zm-3.111 23.334a2.222 2.222 0 112.222-2.223 2.222 2.222 0 01-2.222 2.223zm.289-11.812a2.4 2.4 0 01-.228 0 2.422 2.422 0 01-2.305-2.533v-3.267a2.41 2.41 0 012.533-2.544H30.1a2.411 2.411 0 012.533 2.544v3.267q.006.114 0 .228a2.422 2.422 0 01-2.533 2.305zM30.31 31.556a2.233 2.233 0 11.022 0zM22.145 5.822h-.034.034a1.411 1.411 0 10-1.412-1.411 1.411 1.411 0 001.412 1.412z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>parking</title><rect width=\\\"16\\\" height=\\\"16\\\" rx=\\\"3.748\\\" ry=\\\"3.748\\\" fill=\\\"#788093\\\"></rect><path d=\\\"M8.719 3.5h-4.4v9h1.763V9.544h2.54a2.843 2.843 0 003.058-2.986A2.81 2.81 0 008.72 3.5zm-.14 4.39H6.11V5.17h2.498c.81-.002 1.208.582 1.208 1.371 0 .79-.342 1.347-1.236 1.35z\\\" fill=\\\"#fff\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\"><title>silver line</title><path fill=\\\"#1c1e23\\\" d=\\\"M14.245 6.955l-.439-3.298c-.115-.594-.507-.83-1.088-1.074a9.948 9.948 0 00-2.994-.52 9.942 9.942 0 00-2.987.52c-.574.243-.973.48-1.094 1.074L5.21 6.955v4.555h.807v.777a.567.567 0 00.298.487c.04.02.081.04.115.054a.69.69 0 00.094.027.576.576 0 00.156.02h.23a.636.636 0 00.669-.588v-.777h4.363v.777a.567.567 0 00.297.487c.04.02.081.04.115.054a.689.689 0 00.095.027.577.577 0 00.155.02h.23a.636.636 0 00.67-.588v-.777h.742zm-6.643-3.94h4.251c.203 0 .372.231.372.508s-.17.508-.372.508h-4.25c-.203 0-.372-.23-.372-.508s.169-.507.371-.507zM6.562 7.57l.301-2.334a.314.314 0 01.323-.267h5.124a.318.318 0 01.322.267l.344 2.334v.104a.326.326 0 01-.322.326h-5.78a.332.332 0 01-.31-.339.233.233 0 01-.001-.091zm.647 2.753a.829.829 0 11-.037-1.654.831.831 0 11.037 1.654zm5.016 0a.829.829 0 11-.037-1.654.831.831 0 11.037 1.654z\\\"></path><path fill=\\\"#7c878e\\\" d=\\\"M8 0A8.04 8.04 0 00.003 8 8 8 0 108 0\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"M3.638 9.822a1.14 1.14 0 00.346.407 1.493 1.493 0 00.507.23 2.397 2.397 0 00.603.076 3.116 3.116 0 00.451-.035 1.571 1.571 0 00.452-.135.992.992 0 00.352-.277.694.694 0 00.14-.446.629.629 0 00-.186-.472 1.472 1.472 0 00-.486-.301 4.88 4.88 0 00-.683-.211q-.382-.09-.773-.2a6.8 6.8 0 01-.783-.247 2.688 2.688 0 01-.683-.376 1.775 1.775 0 01-.487-.578 1.753 1.753 0 01-.186-.838 1.876 1.876 0 01.236-.959 2.136 2.136 0 01.618-.678 2.69 2.69 0 01.863-.401 3.684 3.684 0 01.964-.13 4.568 4.568 0 011.08.125 2.699 2.699 0 01.918.407 2.062 2.062 0 01.638.717 2.204 2.204 0 01.235 1.06H6.248a1.27 1.27 0 00-.135-.533.888.888 0 00-.307-.331 1.297 1.297 0 00-.436-.17 2.696 2.696 0 00-.537-.05 1.86 1.86 0 00-.382.04 1.022 1.022 0 00-.346.14.868.868 0 00-.256.25.675.675 0 00-.1.382.644.644 0 00.08.341.714.714 0 00.316.241 4.025 4.025 0 00.653.22q.416.111 1.089.282.2.04.557.145a2.677 2.677 0 01.708.337 2.14 2.14 0 01.607.617 1.757 1.757 0 01.256.99 2.191 2.191 0 01-.19.913 1.986 1.986 0 01-.568.728 2.725 2.725 0 01-.933.477 4.415 4.415 0 01-1.29.17 4.531 4.531 0 01-1.15-.145 2.887 2.887 0 01-.984-.456 2.253 2.253 0 01-.678-.794 2.367 2.367 0 01-.24-1.144h1.525a1.314 1.314 0 00.13.612zM10.525 4.42v5.844h3.494v1.325H8.95V4.421z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><title>vehicle</title><path fill=\\\"#fff\\\" d=\\\"M42.88 45.83a2.1 2.1 0 01-.87-.19l-15.92-7.17A5.23 5.23 0 0024 38a5.14 5.14 0 00-2.08.44L6 45.64a2.1 2.1 0 01-.87.19 2.14 2.14 0 01-1.76-1 2 2 0 01-.12-2L22.11 2a2.08 2.08 0 013.78 0l18.87 40.87a2 2 0 01-.12 2 2.14 2.14 0 01-1.76.96z\\\"></path><path d=\\\"M24 2.34a.55.55 0 01.53.33L43.39 43.5a.49.49 0 010 .53.61.61 0 01-.49.3.65.65 0 01-.25-.06L26.7 37.11a6.57 6.57 0 00-5.4 0L5.37 44.27a.65.65 0 01-.25.06.61.61 0 01-.49-.3.49.49 0 010-.53L23.47 2.67a.55.55 0 01.53-.33m0-3a3.53 3.53 0 00-3.25 2.07L1.88 42.24a3.59 3.59 0 003.24 5.09A3.74 3.74 0 006.61 47l15.92-7.17a3.64 3.64 0 012.94 0L41.39 47a3.74 3.74 0 001.49.32 3.59 3.59 0 003.24-5.09L27.25 1.41A3.53 3.53 0 0024-.66z\\\"></path></svg>\""],"sourceRoot":""}