We buried my father on a bitterly cold day in Washington, D.C., in 2010. As I followed his casket out of the church, I spotted journalist Michael Days in the crowd of mourners. I didn’t get to speak with him, but I was deeply touched, not to mention honored, that my editor at the Daily News was there.
He didn’t have to do that. But Days, who died suddenly on Saturday at the age of 72, was a deeply empathetic man who genuinely cared about people. As former Daily News columnist Howard Gensler wrote on Facebook recently: “He celebrated the wins and keenly felt the losses in his newsroom. He knew when to step in and when to step back and he could go Philly on you when he had to — and then later ask you how your parents were doing.”
I met the pioneering journalist when he was business editor for the Daily News, and I was applying for a job. During my interview, I got so excited at the prospect of earning twice my salary in D.C. at the time that I didn’t bother to negotiate. But Days kindly arranged for me to have two weeks’ vacation during my first year of employment instead of my having to work an entire year, as stipulated by the terms of the union contract.
That was my first experience with the kind of leader Days was. He was more than just a boss. He was an editor, mentor, and friend who looked out for his staffers, which engendered our intense loyalty. We used to joke that when Days said, “Jump,” our response was, “How high?”
This is how I’ll always remember Michael Days: sitting in his office with a smile on his face, always ready to talk or just listen.
As amazing as he was as a newsroom leader, Days was an even better person outside of work. A fellow Catholic, he was a man of great faith who not only attended Mass regularly but whose life exemplified his deeply held Christian beliefs. He and his wife, Angela Dodson — then an editor at the New York Times — adopted not one child, but four brothers all at the same time.
Once, I had the good fortune of being invited to a holiday party at his home in Trenton — a location picked because it was between his wife’s job in NYC and his own in Philly. Shortly after I arrived, I recall glancing outdoors and spotting four shiny, new bicycles in the backyard. I was in awe. His beautiful home was decorated with a huge tree. I watched as Days’ wife handed each boy a matching Christmas plate. Lunch was a warm, cozy affair with lots of Southern favorites.
Days’ career took off, as he went on to hold a number of leadership positions in the newsroom. The first time he was in line to make history — as the first African American managing editor of the Daily News — I felt for certain he would get the job. Days had grown up in North Philly and graduated from Roman Catholic High School. Not only did he know the city, he understood the paper’s operations inside and out, and was adept at dealing with its motley crew of reporters and photographers.
I was outraged when he was passed over for an outsider. But when I stuck my head in his office to check on him, I was startled when he met my gaze with a smile. Days was unflappable like that. Calm. Steady. No matter what happened, he always kept his cool. That’s not easy in a newsroom full of strong personalities, but Days did it.
Looking back, he had the right idea. Management eventually woke up and named him managing editor, and later executive editor, of the Daily News. Under his leadership, the Daily News excelled journalistically, winning a Pulitzer Prize in 2010 for a series exposing corruption in the Philadelphia Police Department.
The following year, Days was named managing editor of The Inquirer and left the Daily News for a brief time. When then-publisher Bob Hall announced his return, and Days strode back into the newsroom, we all stood and cheered. Some even cried. Time passed, the papers consolidated, and Days went on to hold other management roles at The Inquirer. Even as he became less involved in the day-to-day newsroom operations, we still streamed in and out of his office, seeking advice about stories we were working on or grabbing a piece of chocolate from his candy dish.
After he retired in 2020, we continued to seek him out. He would take our calls as if he were still on the clock.
The author (left) at a WDAS Women of Excellence Luncheon where she was being honored. The late Inquirer Vice President Michael Days is to her immediate right, and former Deputy News Editor Yvette Ousley is next to him.
Two years ago, a group of Black journalists decided to form a new local affiliate branch of the National Association of Black Journalists after the Philadelphia Association of Black Journalists broke off from the nationwide group. Days, then 70, graciously agreed to serve as NABJ-Philadelphia’s inaugural president, and helped the new group find its footing.
In September, the group hosted a reception at the Free Library of Philadelphia honoring NBC contributor Trymaine Lee, author of the new book, A Thousand Ways to Die: The True Cost of Violence on Black Life in America. When it was his turn to speak, Days praised Lee, who had been a Daily News intern, and told him, “You are a talent, and nobody is surprised that you have done so well.”
Afterward, former Daily News reporter Mister Mann Frisby posted on social media: “The way he spoke about Trymaine at his book signing, I have also heard him speak of me the same way. Always encouraging. That makes me know that he was CONSISTENT for decades in regards to how he supported and mentored journalists.”
When I woke up early Sunday and discovered numerous “call me” texts, I knew something really bad had happened. Days’ death sent a seismic jolt through journalism circles nationwide.
“He was kind and gentle,” recalled Inquirer columnist Elizabeth Wellington. “I lost my own father earlier this year. And this feels as if I’ve lost a second.”
I feel the same way. Before Days, I’d never met any man I considered anywhere close to being in the same league as my dad,who was a giant among men.
Inquirer reporter Melanie Burney, who will finish out Days’ term as president of NABJ-Philadelphia, told me she has found herself in the days after his death asking, “What would Michael do?”
That’s a question I’ve asked myself a few times recently, as well. Days had been just a quick phone call away. Going forward, we will have to rely on the many lessons he has already taught us.
Three large stand-alone parking garages have been proposed in Philadelphia this year, unusual projectsin a city where parking operators have long complained that high taxation makes it difficult to run a business.
The latest is a 372-unit garage near Fishtown and Northern Liberties at 53-67 E. Laurel St. near the Fillmore concert hall and the Rivers Casino.
“There’s been about 2,500 units that have come online within a 5- to 10-minute walk” of the planned garage, said Aris Kufasimes, director of operations with developer Bridge One Management. “When you’re building those on 7-1 [apartments to parking spaces] ratios, that leaves a massive hole. Where is everybody going to put their vehicles?”
Despite central Philadelphia’s walkability and high levels of transit access, two other developers have made similar calculations this year.
In the spring, Children’s Hospital of Philadelphia (CHOP) revealed plans for a 1,005-space parking garage in Grays Ferry along with a shuttle service to spirit employees to the main campus a mile away.
In August, University Place Associates unveiled plans for a 495-unit garage. About a fourth of it will be reserved for the use of the city’s new forensic lab, but the rest will be open to the public.
All three projects have baffled environmentalists and urbanists, who thought Philadelphia was moving away from car-centric patterns of late 20th-century development.
It’s also surprised parking operators in the city, who say national construction cost trends and high local taxation make it difficult to turn a profit.
Legacy parking companies in Philadelphia like E-Z Park and Parkway Corp. have been selling garages and surface lots for redevelopment as anything other than parking. They say the city has lost 10,000 publicly available spaces in the last 15 years, bringing the total to about 40,000 in Center City.
“I don’t think I’ll ever build another stand-alone parking facility,” said Robert Zuritsky, president of Parkway Corp. and board chair of the National Parking Association. “It doesn’t make any sense.”
Zuritsky and other parking companies have long noted that operators in Philadelphia, who often have unionized workforces, get hit with parking, wage, property, and the Use and Occupancy Tax.
When combined with the soaring cost of building new spaces across the nation, it’s difficult to turn a profit in Philadelphia.
A rendering of the Fishtown garage, looking towards the Delaware River.
Zuritsky says it costs $60,000-$70,000 a space to build an aboveground lot in today’s environment and $100,000 to $150,000 below ground.
“It’s like building a house for a car,” he said.
Depending on hyperlocal peculiarities, Zuritsky says that taxation in Center City can eat up to 60% of the money they bring in and that to profit from new construction, an operator would have to charge $3,000 per space a month.
“I wish people luck, the ones that are moving in,” said Harvey Spear, president of E-Z Park. “Between taxes, insurance, and labor, it comes to, like, 70-some percent of what we take in. We have more equipment now that does away with a lot of labor; we’re trying to compensate with that.”
Urbanist and environmental advocates, meanwhile, have condemned the new garage projects, arguing that they will add to carbon emissions, air pollution, and traffic congestion.
“A massive parking garage less than half a mile from the El [in Fishtown] is the wrong direction for any city that claims to take climate action seriously,” said Ashlei Tracy, deputy executive director with the Pennsylvania Bipartisan Climate Initiative. “SEPTA is already working to get more people out of cars and onto transit, but projects like this one and the one from CHOP only make that harder.”
Here are the parking projects in the pipeline.
Fishtown: 372 spaces
The garage, with architecture by Philadelphia-based Designblendz, doesn’t just contain parking. It includes close to 14,000 square feet of commercial space on the first floor, which the developer hopes to rent to a restaurant — or two — on the edges of one of Philadelphia’s hottest culinary scenes.
Another over 16,000-square-foot restaurant space is planned for the top floor, with views of the skyline and river. Both the top and bottom floors also could be used as event spaces.
Kufasimes says that this aspect of the project could partly offset the kinds of costs that parking veterans warn of.
“Our due diligence team went through those numbers and vetted them pretty thoroughly: The returns are what they needed to be,” Kufasimes said. “It’s got a multifunction of income streams, so we think that that really will help play a larger role.”
Kufasimes also said a parking garage made sense in an area that’s seen more development than almost any other corner of Philadelphia. When investors purchased the land at 53-67 E. Laurel St. and approached his company for ideas, they met with other stakeholders in the neighborhood and determined parking would be appreciated.
“It wasn’t necessarily all about the profit,” Kufasimes said. “A lot of people this day and age, that is their number-one goal. If this is a slightly lower return in the long run but can be better accepted by the community as a whole, we think that actually raises the value of the asset.”
An overhead-perspective rendering of the Fishtown garage.
At an October meeting of the Fishtown Neighbors Association, that argumentappeared to pay off. Unlike most community meetings where a large new development is proposed, there were no adamant opponents of the project. The project also includes a 20,000-square-foot outdoor space, a green roof, and a to-be-decided public art component. All of that helped, too.
“It’s nice seeing a parking garage, of all things, be as pedestrian-friendly and thoughtful as this,” one speaker said during the Zoom meeting.
Dubbed University Place 5.0, it largely exists because of a major expansion of the municipal bureaucracy west of the Schuylkill.
For years the city has sought a new location for its criminal forensics laboratory. The debate became heated in City Hall, with numerous Council members making the case for locations within their districts.
Councilmember Jamie Gauthier pushed for its location in University City Place 3.0, a newly built, state-of-the-art life sciences building that was coming online just as its intended industry was slowing down in the face of higher interest rates.
To get the crime lab, Mayor Cherelle L. Parker’s administration said the police department would need ample parking. That’s where the new garage comes in.
In June, Gauthier passed a zoning overlay that cleared away the regulatory hurdles to the project. Six weeks later, the developers revealed University City Place 5.0, which has 29 parking spaces on the ground floor reserved for official use by forensics vehicles and 100 spaces reserved for city employees.
A rendering of the proposed University City parking garage as seen from 42nd and Filbert Streets.
Designed by Philadelphia-based ISA Architects, the garage is also meant to serve University Place Associate’s other large developments in the area. Akin to the Fishtown garage, they have also sought to make the development pedestrian friendly, with a dog park, green space, and public art.
The local community group, West Powelton Saunders Park RCO, also embraced the proposal.
“The community met regarding this project back in August, and … they were all in support of this project,” Pamela Andrews, president of the West Powelton Saunders Park RCO, said at the city’s September Civic Design Review meeting. “We have a tremendous problem with parking, and the community members felt this was a much needed and welcome addition.”
Grays Ferry: 1,005 parking spaces
CHOP’s thousand-car parking garage by far has been the most controversial of the proposals. But it also makes the most economic sense for the owner. Unlike the other garages — or those owned by Parkway and E-Z Park — it will be owned by a nonprofit and exempted from many of the taxes that make it so expensive to own parking in Philadelphia.
A rendering of the new parking garage CHOP plans for Grays Ferry.
The hospital purchased the property at 3000 Grays Ferry Ave., next to the Donald Finnegan Playground, for almost $25 million last year.
The seven-story development, which, plans show, would have far fewer amenities than its University City and Fishtown counterparts, is meant to serve CHOP’s new research facilities in Fitler Square and the new patient tower set to open in 2028.
“We recently secured permits and have begun construction on the new parking garage at 3000 Grays Ferry Ave.,” a CHOP spokesperson said. “The full construction is expected to go through the fall of 2026. CHOP continues to engage with the community by providing support, timely updates and addressing feedback during construction.”
At the time of its unveiling, CHOP argued that the massive garage was needed as SEPTA threatened to become unreliable due to a political funding crisis in Harrisburg. But detractors appeared almost immediately to denounce the hospital for worsening air quality in a lower-income neighborhood that is already a hot spot for asthma.
There are no regulatory hurdles to the development, but changes in the political or economic landscape could make it difficult to embark on a large capital project. Notably, the University of Pennsylvania proposed an 858-space garage in 2023 for the nearby Pennovation Center and has never broken ground.
While the Phillies are poised for some roster changes in 2026, at the moment it doesn’t seem like those will occur in the infield.
The Phillies’ outfield has been a revolving door for the last few seasons, but the infield continues to run it back. And according to Dave Dombrowski, that seems to be the plan again. At least, for now.
“The infield is pretty well solidified,” the Phillies’ president of baseball operations said at his end-of-season news conference on Oct. 16.
And indeed, Trea Turner and Bryce Harper are under contract into the 2030s, while Bryson Stott, Edmundo Sosa, and Alec Bohm are arbitration eligible. Barring a trade, there isn’t much room for movement or change.
Here’s an overview of the Phillies’ infield outlook next season and beyond.
Trea Turner had his best overall season as a Phillie in 2025, winning the NL batting title with a .304 average and stealing 36 bases.
Turner’s improvement
This time last year, there were questions raised about Turner’s long-term future at shortstop after another below-average defensive season. But those questions have been all but put to rest after Turner made significant strides in 2025. His 17 outs above average were the highest of his career and tied for third among shortstops.
On the offensive side, Turner bought into the Phillies’ plan for him as their new leadoff hitter. Manager Rob Thomson wanted him to focus on using his athleticism and getting on base, rather than hitting homers. Turner did just that, stealing 36 bases and posting a .355 on-base percentage, his best since arriving in Philadelphia. With a .304 batting average, Turner also became the first Phillie to win the batting title since Richie Ashburn in 1958 and was named a Silver Slugger finalist.
He may have sacrificed some power to do it, hitting just 15 home runs compared to 21 last season. But overall, Turner did exactly what the Phillies wanted out of him in the regular season, both offensively and defensively.
“He’s tough on himself,” Dombrowski said. “He’s like one of these guys, if he doesn’t hit 40 home runs and 40 doubles and 40 stolen bases, and lead the league in hitting, he’s probably going to think that he needs to do more.
“That’s how he is, which is great. That’s a great quality and attribute, but he doesn’t have to hit with any more power for us. He really did a fine job.”
The Phillies plan to keep Bryce Harper, a Gold Glove finalist for a second straight season, at first base.
Harper to the outfield?
Don’t expect Harper to change positions, either, despite the first baseman expressing some willingness last offseason and ahead of the trade deadline to return to the outfield.
Harper, who earned his second straight Gold Glove nomination at first base this season, has said he would be open to making a position switch if needed for an offensive upgrade. But it doesn’t sound as if the Phillies will consider moving him back to the outfield to add, say, Pete Alonso, who plans to opt out of his contract with the Mets after a 38-homer season.
“I think Bryce is a first baseman at this time,” Dombrowski said. “I mean, that’s where we look at him as, and he has asked to go out into the outfield. He would be willing to do so, but I think it would be more for the short term if we had done something at the trading deadline, but it’s been a while since he’s been out [there].
“I’m sure he’d be fine, but he’s a really good first baseman, and I think for us, that’s the position we look at him playing for us.”
Harper finished the season with an OPS of .844. Though that still ranked 11th in the National League, it was his lowest since 2016 (.814).
Dombrowski seemed to lay down a challenge to Harper at his year-end news conference.
“He’s still an All-Star-caliber player. He didn’t have an elite season like he has had in the past. And I guess we only find out if he becomes elite or he continues to be good,” Dombrowski said. “… He’s the one that will dictate that more than anything else, and that’s what it comes down to.”
Bryson Stott hit .310 with an .880 OPS from Aug. 1 through the end of the regular season, but still struggled against lefties.
Second and third base
Stott continued to be elite defensively at second base, but had a roller-coaster offensive season. He struggled over the first half, but a midyear adjustment to his hand placement led to improved at-bats overall. Stott went from hitting .194 with a .637 OPS in July to a .307 batting average and .864 OPS in August.
However, Stott’s .575 OPS against lefties kept him in a platoon with Sosa. When called upon, the Phillies’ utility man provided a spark of energy and clutch hits, plus an .895 OPS against left-handers.
“I view Stott as an everyday player, but Sosa’s numbers are so good against left-handed pitching that you’ve got to fit him someplace, whether it’s at third base when Bohm was hurt or mixed in for Stott against the lefties,” Thomson said. “So I view Stott as an everyday hitter. I think if he played every single day against left-handed pitching, he’d get better and put up pretty good numbers.”
On the other hand, Bohm spent last offseason amid a tornado of trade rumors. He will reach free agency in 2027, and his name will likely be floating around this winter, too, as one of the few ways the Phillies can change up their infield. The third baseman was afflicted by injuries — a rib fracture in July and shoulder inflammation in August — and slashed .287/.331/.409.
While Bohm and Harper were on the injured list at different points this season, Otto Kemp was a key fill-in. He hit .234 with 28 RBIs in his first 62 major-league games, most of which he played through knee and shoulder injuries that he will address with offseason surgery.
Kemp, 26, saw the bulk of his playing time at third but also appeared at first and second and in left field.
The Phillies believe Aidan Miller can stick at shortstop, but that’s blocked by Trea Turner for now.
Down on the farm
The Phillies’ top infield prospect, Aidan Miller, is rising quickly. The 21-year-old posted an .825 OPS this year and stole 59 bases between double-A Reading and triple-A Lehigh Valley. But the question remains as to where he will play in the majors.
Miller, who finished the season in triple A after a September promotion, has played shortstop throughout his minor-league career. Similar to the situation with top outfield prospect Justin Crawford, the Phillies believe that when Miller reaches the major leagues, he will need to be an everyday player.
A Miller breakthrough next season would require some changes to the current infield configuration. And Turner, who is under contract through 2033, doesn’t appear to be on the move from shortstop anytime soon. Dombrowski said the Phillies are still having conversations about Miller’s long-term position.
“When I talked to people in our organization, they feel he can play shortstop. Of course, we have an All-Star shortstop at this point,” he said. “… [Miller has] played some second, he’s played some third, but he’s primarily been a shortstop, so we’d have to make sure that we properly prepare him to do that, and that’s still a discussion that we’ll have to have.”
Miller initially planned to participate in the Arizona Fall League, but the Phillies decided to prioritize rest instead.
Further down the pike, second baseman Aroon Escobar is the Phillies’ No. 5 prospect, according to MLB Pipeline. Escobar, 20, ascended three levels in 2025 to finish the season at double A. He hit 15 homers and had 62 RBIs in 120 games.
Also in double A to end the year is Phillies No. 13 prospect Carson DeMartini. In his first full professional season after being drafted in 2024 out of Virginia Tech, the third baseman posted a .707 OPS and stole 45 bases.
Kazuma Okamoto has slashed .277/.361/.521 with 248 homers over 11 seasons in Nippon Professional Baseball in Japan.
Free agency
The Phillies don’t have a pressing free-agent need to fill in the infield, though that could change if a trade is made. (The battery will be covered later in this series.)
Currently, one of the top available names on the market is righty third baseman Alex Bregman, who is set to opt out of his contract with the Red Sox after an All-Star season in which he slashed .273/.360/.462 with 18 homers.
Third baseman Eugenio Suárez was one of the most coveted offensive trade deadline acquisitions this year and was linked to the Phillies before ending up with the Mariners. Suárez saw a dip in production in the second half, but he still had some big postseason moments for Seattle, such as a game-winning grand slam in Game 5 of the American League Championship Series.
Gleyber Torres, 28, had an overall bounce-back year with the Tigers after the Yankees let him walk in 2024. The right-handed-hitting second baseman was named an All-Star for the first time since 2019. Torres saw diminished production later in the season, with a .812 first-half OPS compared to .659 in the second half, but revealed that he had been playing through a sports hernia late in the year.
There are also international options. In recent years, the Phillies have attempted to expand their outreach in Japan in the hopes of attracting top stars there, but have yet to break through.
The Yomiuri Giants of Nippon Professional Baseball have announced that they will be posting corner infielder Kazuma Okamoto. The right-handed 29-year-old has hit .277/.361/.521 with 248 homers over 11 seasons in NPB.
According to an MLB.com report, Munetaka Murakami is also expected to be posted this winter. Murakami, 25, is a left-handed-hitting corner infielder with a career .951 OPS across eight seasons in NPB. He was named Most Valuable Player of the Central League in 2021 and 2022.
For years, the Preservation Alliance for Greater Philadelphia has heard the same arguments: Preservation is a barrier to development. It reduces density. It restricts the housing supply.
“And we knew in our gut that that wasn’t true, but we didn’t have the data to support it,” said Paul Steinke, executive director of the Preservation Alliance, which works to protect historic properties from demolition. “Now, we do.”
In Philadelphia, $4 billion has been invested in historic rehabilitation projects, which have created thousands of jobs each year.
Steinke said the Preservation Alliance commissioned this study now because of current debates about Philadelphia’s growth and affordability, the need to increase the housing supply, and development policy as Mayor Cherelle L. Parker rolls out her Housing Opportunities Made Easy, or H.O.M.E., initiative to build or preserve 30,000 homes.
“We wanted to develop some data to demonstrate preservation’s role in those conversations,” said Steinke, who is on the H.O.M.E. advisory committee. “And the reality is the data show that historic preservation is a powerful engine … for investment, jobs, affordability, and inclusive growth.”
The study was completed by PlaceEconomics, a Washington-based firm that analyzes the economic impacts of historic preservation in cities across the country. The purpose of the analysis in Philadelphia was to understand the economics of the preservation of older properties in general and not only those properties that are historically designated, Steinke said.
Preservation debates
Historic designation is a divisive topic, and preservationists have found themselves clashing not only with developers who want to demolish properties but also with homeowners and pro-housing groups.
Historic designation shields properties from demolition and means owners have some restrictions on what they can do to the outside of their properties. Decisions about doors and windows, for example, are subject to the scrutiny of preservation officials. And owners who fight the designation of their properties argue that regulations can be a burden.
In response to the Preservation Alliance’s study, 5th Square, a Philadelphia-based urbanist political action committee, said it supports efforts to rehabilitate older buildings and that “Philadelphia’s dense, historic neighborhoods are a beloved feature of the city.”
“However, we remain concerned about the proliferation of historical preservation districts across the city,” Brennan Maragh, cochair of the group’s housing committee, said in an emailed statement. “These districts … impose real costs on families, small businesses, and owners attempting to maintain or improve their properties.”
Almost 5% of Philadelphia is historically designated
Almost 5% of the city’s land area is a historic district or is property individually designated as historic outside of historic districts, the study found.
The share of properties historically designated by the city has increased from 2.2% to 4.4% since 2016, when the city started ramping up its historic designations. Philadelphia has caught up with other large cities.
In 2023, about 56,000 residents lived in a local historic district.
Tax credits have created jobs and revenue
Between 2010 and 2024, 295 projects that used state and/or federal historic preservation tax credits were completed in Philadelphia, according to the study. This ranks Philadelphia first in the nation.
Projects that use historic tax credits have created an average of 1,777 direct jobs and 729 indirect jobs each year in Philadelphia over the last 15 years. Each year, they have created an average of about $95 million in direct income and about $47 million in indirect income.
If historic rehabilitation were a single industry, it would be the city’s 25th-largest employer.
Historic tax credit activity also has generated about $8 million in local tax revenue.
Two-thirds of Philadelphia’s residential buildings and half of the city’s housing units were built before 1950, according to the study. This older housing tends to be smaller in size and lower in cost.
So preserving older homes helps preserve housing affordability. The study did not consider the historic designation status of these homes.
“While it is true that Philadelphia’s older housing stock remains affordable compared to new construction,” said Maragh at 5th Square, “historic preservation districts can also have the unintended consequences of excluding low-income residents from large parts of the city, raising lifetime housing costs on owners and creating unnecessary regulations that slow down the process of adaptive reuse.”
The study found that the city’s historic districts have higher shares of high-income households and lower shares of low-income households compared to the rest of the city.
Outsize population growth in historic districts
Donovan Rypkema, principal and CEO at PlaceEconomics, said a “myth” of historic preservation is if “you create those historic districts, you just set neighborhoods in amber and nothing can ever change.”
The firm’s study found that population growth in historic districts outpaced growth in the rest of the city.
In historic districts created before 2010 — so before the recent push for more districts and ones that are more geographically and racially inclusive — the population grew by about 27% between 2010 and 2020. Over the same time, the rest of the city’s population grew by less than 5%.
More than 79% of the homes in historic districts are in buildings with two or more units, compared to 32% in the rest of Philadelphia. Historic districts also offer a wider range of housing types.
The densest areas of the city are in historic districts, according to the study. There are 10,000 more people per square mile in historic districts than in the rest of the city’s residential areas.
These statistics speak to the “inherent attractiveness” of historic districts and also that “they can accommodate that growth,” Rypkema said.
HBO's Task once again brought the Philadelphia region back into the spotlight over its seven-episode run, showcasing a slew of local spots from Ridley Township to Coatesville and beyond.
And with the series wrapped, we can say: Creator Brad Ingelsby did right by Delco, where the series is largely set.
Sure, the accents were pretty great — but as we look back at the show, it's clear that the Philadelphia region was integral to Task. Here, we've rounded up all the local spots — sans private homes — we could identify in Task. Check out the map below to see what locations wound up the show, and why the series takes us there:
Loading…
Aston Township
Mirenda Center at Neumann University
First seen in episode one
Courtesy of Neumann University
Tom (Mark Ruffalo) mans a table at a job fair here while temporarily working as a recruiter for the FBI. Next to his station, the distinctive pillars of the center’s atrium are visible.
Collingdale
Rita’s Italian Ice & Frozen Custard
First seen in episode one
Alejandro A. Alvarez / Staff Photographer
Emily (Silvia Dionicio), Tom’s daughter, works her part-time job here. In the scene where it is shown, Tom orders a black cherry water ice, a flavor choice of which we approve.
Philadelphia
Former Philadelphia Police Department Headquarters
First seen in episode one
Jessica Griffin / Staff Photographer
We get a brief glimpse of the exterior of the former Philadelphia police headquarters, colloquially known as the Roundhouse. Whether the interior is the same building is unclear, but in the show, this appears to be where the FBI’s Philly field office is located.
Bangor
Bangor Quarry
First seen in episode one
Robbie (Tom Pelphrey), Cliff (Raúl Castillo), and Peaches (Owen Teague) head here for a post-robbery swim. On a real-life note, you should not do the same — not only is it dangerous, but it’s also trespassing, according to the Bangor Borough Police Department.
Coatesville
Lincoln Highway and 2nd Avenue
First seen in episode two
TOM GRALISH / Staff Photographer
The Dark Hearts motorcycle gang rides through this intersection in formation, the giveaway being Presence Bank in the background in one shot.
Coatesville
Polish American Citizens Club
First seen in episode two
Courtesy of HBO
Done up as the so-called Lefty’s Taproom in the show, this location serves as the Dark Hearts’ clubhouse and watering hole. In real life, it’s just off Lincoln Highway, lending a bit of realism to the gang’s ride through downtown Coatesville.
Aston Township
Martin’s Taphouse
First seen in episode two
Martin's stands in as the exterior of the Tip Top Lounge in the series, which we see in this episode stacked with motorcycles parked outside the front door.
Sharon Hill
Dixon’s Lounge
First seen in episode two
Courtesy of HBO
While the exterior of the Tip Top Lounge is in Aston, the interior bears a striking resemblance to Delco’s own Dixon’s Lounge. Here, Robbie and Cliff are stood up by an, ahem, “business partner” before walking out on an order of crabfries.
Boothwyn
Willowbrook Shopping Center
First seen in episode two
Isaiah Vazquez / For The Inquirer
Maeve (Emilia Jones) takes Sam (Ben Lewis Doherty) to a fictional “Val-U Corner” store here with the intent of dropping him off for police to find before the plan goes awry. The store is located near the real Blue Cherry Ice Cream and Bakery, which is visible in the background.
Phoenixville
Phoenixville Area High School
First seen in episode two
During his search for his daughter, Emily (Silvia Dionicio), Tom (Mark Ruffalo) finds her in the dugout of a baseball field that, in real life, is at Phoenixville Area High School. Its distinctive backstop is visible from a bird's-eye view in the series.
Philadelphia
Ralph’s Italian Restaurant
First seen in episode three
MICHAEL KLEIN / Staff
Dark Hearts leaders Jayson (Sam Keeley) and Perry (Jamie McShane) walk through the kitchen here to meet with local drug kingpin Freddy Frias (Elvis Nolasco), but in the show, it doesn’t appear to be serving the Italian food we’re used to in real life.
Aston Township
Mount Hope Cemetery
First seen in episode three
Isaiah Vazquez / For The Inquirer
It’s a very quick shot, but it’s there just under four minutes into the episode. In the background, you can see the Commodore Barry Bridge, and graves on a hill in the cemetery in the foreground.
Union Township
Sixpenny Creek Quarry
First seen in episode three
Courtesy of HBO
Robbie (Tom Pelphrey) and Cliff (Raúl Castillo) finally get their meeting with Eryn (Margarita Levieva), their Dark Hearts insider, but it doesn’t go according to plan.
Upper Darby
Llanerch Diner
First seen in episode three
Tom Gralish / Staff Photographer
Taskforce members Aleah (Thuso Mbedu) and Lizzie (Alison Oliver) head to Upper Darby's famed Llanerch Diner for a tip on the drug house robberies they're investigating, and get a break in the case.
Lansdowne
Rosedon Plaza
First seen in episode three
Jose F. Moreno / Staff Photographer
In the background of one shot during the chase for Ray (Peter Patrikios), you can see the old Doc's Deli (Deli Green). That puts Ray in the corner of the Rosedon Plaza parking lot as Lizzie (Alison Oliver) makes the arrest.
Coatesville
Coatesville Police Department
First seen in episode three
Steven M. Falk / For The Inquirer
Whether the interior is the same station isn’t clear, but an exterior shot sets this spot up as the place where the Task team interrogates Ray (Peter Patrikios) and Shelley (Mickey Sumner). Out front, a police cruiser reads “Delaware County Sheriff,” which is a little far from home.
Holmes
The Ridley House
First seen in episode three
Isaiah Vazquez / For The Inquirer
Following the chase and interrogation, Lizzie (Alison Oliver) and Grasso (Fabien Frankel) head to this local bar to unwind. Grasso indicates it is a Barnaby’s, which, in real life, was true at one point – until the location became the Ridley House in 2019.
King of Prussia
Pennsylvania Turnpike on-ramp
First seen in episode four
TOM GRALISH / Staff Photographer
It’s a quick shot as Tom (Mark Ruffalo) drives around at the beginning of the episode, but you can just make out the LasikPlus building on Mall Boulevard in the background. That puts this Pennsylvania Turnpike entrance in King of Prussia.
Malvern
I-76 Exit 320
First seen in episode four
Tom (Mark Ruffalo) appears to take this exit as he is driving to meet his fellow taskforce members.
Marcus Hook
Marcus Hook Community Center
First seen in episode four
Erin Blewett / For The Inquirer
As County Chief Dorsey (Raphael Sbarge) exits the building, you can see a door tagged with “Delaware County Sheriff’s Office.” But the green awning above him is a dead giveaway — that’s the Marcus Hook Community Center.
Aston Township
Rockdale Industrial Center
First seen in episode four
It's disguised as a trucking depot in the series, but this is where Robbie (Tom Pelphrey) and Cliff (Raúl Castillo) travel with Sam (Ben Lewis Doherty) to arrange transportation for their escape into Canada before being confronted by a Good Samaritan.
Chester
Upland Diner
First seen in episode four
Erin Blewett / For The Inquirer
Upland Diner’s parking lot serves as Robbie’s (Tom Pelphrey) holding area during this episode’s drug deal. Unfortunately, we only get an exterior shot of the building, but the restaurant’s vintage-style sign is proudly on display. Great pancakes, for the record.
Newtown Square
Ridley Creek State Park entrance
First seen in episode four
JOSE F. MORENO / Staff Photographer
Cliff (Raúl Castillo) can be seen turning onto North Sandy Flash Drive from Gradyville Road as he heads to the drug deal meeting spot. If you look closely, you can just barely make out a sign for Ridley Creek State Park.
Wilmington, Del.
Beaver Creek
First seen in episode four
It's tough to spot, but the dam that Cliff (Raúl Castillo) parks his car next to during this episode's failed drug deal — or, more accurately, the Dark Hearts' setup — appears to be in Beaver Creek on the Delaware-Pennsylvania border.
Coatesville
City Clock Apartments
First seen in episode four
Steven M. Falk / For The Inquirer
Another brief shot, but the clock face on the tower of the City Clock Apartments is prominently featured. The building formerly was the National Bank of Coatesville, and has been on the National Register of Historic Places since 1977.
Downingtown
Coatesville-Downingtown Bypass
First seen in episode five
FBI Boss Kathleen McGinty (Martha Plimpton) and the rest of the task force swerve across traffic here while looking for Tom (Mark Ruffalo). In the background, you can just make out the sign for Pacer Pool Services & Supplies.
Downingtown
Marsh Creek State Park
First seen in episode five
After surviving his encounter with Robbie (Tom Pelphrey), Tom (Mark Ruffalo) emerges from the woods to see a beautiful summer scene of families enjoying the lake at Marsh Creek State Park.
Boothwyn
I-95 Pennsylvania Welcome Center
First seen in episode five
Erin Blewett / For The Inquirer
FBI boss Kathleen McGinty (Martha Plimpton) stuffs her face with fast food at the center's picnic tables as the task crew looks for their leader. As McGinty explains, she is “an emotional eater.”
Everett
Woy Bridge
First seen in episode five
In what is likely the farthest-flung filming location – at least in relation to the rest of the local spots – we get some shots of Everett’s Woy Bridge in Bedford County as the taskforce closes in on Robbie (Tom Pelphrey).
Milmont Park
Our Lady of Peace Parish
First seen in episode six
RON TARVER / Staff Photographer
Though disguised well as a juvenile detention facility in the show, this little Delco parish provides at least the exterior shots for where Tom (Mark Ruffalo) meets Sam (Ben Lewis Doherty) for the first time.
Coatesville
High Bridge
First seen in episode seven
This instantly recognizable Coatesville landmark serves as the location for where County Chief Dorsey (Raphael Sbarge) appears to seal Grasso's (Fabien Frankel) fate with the Dark Hearts.
Media
Delaware County Courthouse and Government Center
First seen in episode seven
Courtesy of Delaware County Government Center and Courthouse
Here, Tom (Mark Ruffalo) gives a touching family statement at a court hearing for his son, Ethan (Andrew Russel), in what is the emotional climax of the series. As The Inquirer reported last year, the production took over Courtroom 15 for filming.
story continues after advertisement
Explore the map of all locations at your own pace. Tap onHover overa pin to learn more.
That's it for Task. But rest assured, if HBO decides to focus on Philly again, we'll be back. Until then, see youse later.
Staff Contributors
Design and Development: Sam Morris
Reporting: Nick Vadala
Editing: Emily Babay
First seen in episode
(()=>{var fr=Object.create;var _e=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var vr=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var et=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var mr=(e,t,r,n)=>{if(t&&typeof t==”object”||typeof t==”function”)for(let i of pr(t))!gr.call(e,i)&&i!==r&&_e(e,i,{get:()=>t[i],enumerable:!(n=dr(t,i))||n.enumerable});return e};var yr=(e,t,r)=>(r=e!=null?fr(vr(e)):{},mr(t||!e||!e.__esModule?_e(r,”default”,{value:e,enumerable:!0}):r,e));var ft=et(I=>{var Sr={0:”Jan.”,1:”Feb.”,2:”March”,3:”April”,4:”May”,5:”June”,6:”July”,7:”Aug.”,8:”Sept.”,9:”Oct.”,10:”Nov.”,11:”Dec.”};function at(e){return e===void 0&&(e=new Date),Sr[e.getMonth()]}var xr={0:”Jan”,1:”Feb”,2:”Mar”,3:”Apr”,4:”May”,5:”Jun”,6:”Jul”,7:”Aug”,8:”Sep”,9:”Oct”,10:”Nov”,11:”Dec”};function lt(e){return e===void 0&&(e=new Date),xr[e.getMonth()]}function ne(e){return e==null}function ht(e){return typeof e==”number”&&isFinite(e)}function Se(e){return ht(e)&&Math.floor(e)===e}var Tr=[“one”,”two”,”three”,”four”,”five”,”six”,”seven”,”eight”,”nine”],Cr=[“million”,”billion”,”trillion”,”quadrillion”,”quintillion”,”sextillion”,”septillion”,”octillion”,”nonillion”,”decillion”],ut=[“th”,”st”,”nd”,”rd”,”th”,”th”,”th”,”th”,”th”,”th”],Lr=[11,12,13];function ct(e){if(ne(e))return””;var t=+e;return Se(t)?Lr.indexOf(t%100)>-1?ut[0]:ut[t%10]:””}var Pr=[“first”,”second”,”third”,”fourth”,”fifth”,”sixth”,”seventh”,”eighth”,”ninth”],Ar=new RegExp(/s+([^s]*)s*$/);I.apdate=function(e){return e===void 0&&(e=new Date),at(e)+” “+e.getDate()+”, “+e.getFullYear()},I.apdatetab=function(e){return e===void 0&&(e=new Date),lt(e)+” “+e.getDate()+”, “+e.getFullYear()},I.apmonth=at,I.apmonthtab=lt,I.apnumber=function(e){if(ne(e))return””;var t=+e;return Se(t)?t=10?e.toString():Tr[t-1]:e.toString()},I.aptime=function(e){e===void 0&&(e=new Date);var t,r,n=e.getHours(),i=e.getMinutes(),o=i===0;if(o){if(n===0)return”midnight”;if(n===12)return”noon”}return n0?n:12):(t=”p.m.”,r=n===12?n:n-12),o?r+” “+t:r+”:”+(i<10?"0"+i:i)+" "+t},I.capfirst=function(e){if(ne(e))return"";var t=String(e);return""+t.charAt(0).toUpperCase()+t.slice(1)},I.intcomma=function(e){if(ne(e))return"";var t,r=+e;return ht(r)?((t=r.toString().split("."))[0]=t[0].replace(/B(?=(d{3})+(?!d))/g,","),t.join(".")):e.toString()},I.intword=function(e){if(ne(e))return"";var t=+e;if(!Se(t))return e.toString();var r=Math.abs(t);if(r<1e6)return e.toString();var n=Math.ceil(Math.log(r+1)/Math.LN10)-1,i=n-n%3,o=t/Math.pow(10,i);return(o=Math.round(10*o)/10)+" "+Cr[Math.floor(i/3)-2]},I.ordinal=function(e,t){if(t===void 0&&(t=!1),ne(e))return"";var r=+e;return Se(r)?t&&r{(function(e,t){typeof We==”object”&&typeof je<"u"?je.exports=t():typeof define=="function"&&define.amd?define(t):(e=typeof globalThis=h?m:””+Array(h+1-p.length).join(u)+m},K={s:O,z:function(m){var h=-m.utcOffset(),u=Math.abs(h),p=Math.floor(u/60),c=u%60;return(h<=0?"+":"-")+O(p,2,"0")+":"+O(c,2,"0")},m:function m(h,u){if(h.date()<u.date())return-m(u,h);var p=12*(u.year()-h.year())+(u.month()-h.month()),c=h.clone().add(p,f),y=u-c<0,w=h.clone().add(p+(y?-1:1),f);return+(-(p+(u-c)/(y?c-w:w-c))||0)},a:function(m){return m1)return m(w[0])}else{var b=h.name;$[b]=h,c=b}return!p&&c&&(C=c),c||!p&&C},E=function(m,h){if(ie(m))return m.clone();var u=typeof h==”object”?h:{};return u.date=m,u.args=arguments,new te(u)},M=K;M.l=oe,M.i=ie,M.w=function(m,h){return E(m,{locale:h.$L,utc:h.$u,x:h.$x,$offset:h.$offset})};var te=function(){function m(u){this.$L=oe(u.locale,null,!0),this.parse(u),this.$x=this.$x||u.x||{},this[R]=!0}var h=m.prototype;return h.parse=function(u){this.$d=function(p){var c=p.date,y=p.utc;if(c===null)return new Date(NaN);if(M.u(c))return new Date;if(c instanceof Date)return new Date(c);if(typeof c==”string”&&!/Z$/i.test(c)){var w=c.match(F);if(w){var b=w[2]-1||0,A=(w[7]||”0″).substring(0,3);return y?new Date(Date.UTC(w[1],b,w[3]||1,w[4]||0,w[5]||0,w[6]||0,A)):new Date(w[1],b,w[3]||1,w[4]||0,w[5]||0,w[6]||0,A)}}return new Date(c)}(u),this.init()},h.init=function(){var u=this.$d;this.$y=u.getFullYear(),this.$M=u.getMonth(),this.$D=u.getDate(),this.$W=u.getDay(),this.$H=u.getHours(),this.$m=u.getMinutes(),this.$s=u.getSeconds(),this.$ms=u.getMilliseconds()},h.$utils=function(){return M},h.isValid=function(){return this.$d.toString()!==x},h.isSame=function(u,p){var c=E(u);return this.startOf(p)<=c&&c<=this.endOf(p)},h.isAfter=function(u,p){return E(u)<this.startOf(p)},h.isBefore=function(u,p){return this.endOf(p)<E(u)},h.$g=function(u,p,c){return M.u(u)?this[p]:this.set(c,u)},h.unix=function(){return Math.floor(this.valueOf()/1e3)},h.valueOf=function(){return this.$d.getTime()},h.startOf=function(u,p){var c=this,y=!!M.u(p)||p,w=M.p(u),b=function(j,H){var J=M.w(c.$u?Date.UTC(c.$y,H,j):new Date(c.$y,H,j),c);return y?J:J.endOf(a)},A=function(j,H){return M.w(c.toDate()[j].apply(c.toDate("s"),(y?[0,0,0,0]:[23,59,59,999]).slice(H)),c)},k=this.$W,D=this.$M,z=this.$D,X="set"+(this.$u?"UTC":"");switch(w){case l:return y?b(1,0):b(31,11);case f:return y?b(1,D):b(0,D+1);case d:var q=this.$locale().weekStart||0,Q=(k<q?k+7:k)-q;return b(y?z-Q:z+(6-Q),D);case a:case v:return A(X+"Hours",0);case s:return A(X+"Minutes",1);case o:return A(X+"Seconds",2);case i:return A(X+"Milliseconds",3);default:return this.clone()}},h.endOf=function(u){return this.startOf(u,!1)},h.$set=function(u,p){var c,y=M.p(u),w="set"+(this.$u?"UTC":""),b=(c={},c[a]=w+"Date",c[v]=w+"Date",c[f]=w+"Month",c[l]=w+"FullYear",c[s]=w+"Hours",c[o]=w+"Minutes",c[i]=w+"Seconds",c[n]=w+"Milliseconds",c)[y],A=y===a?this.$D+(p-this.$W):p;if(y===f||y===l){var k=this.clone().set(v,1);k.$d[b](A),k.init(),this.$d=k.set(v,Math.min(this.$D,k.daysInMonth())).$d}else b&&this.$d[b](A);return this.init(),this},h.set=function(u,p){return this.clone().$set(u,p)},h.get=function(u){return this[M.p(u)]()},h.add=function(u,p){var c,y=this;u=Number(u);var w=M.p(p),b=function(D){var z=E(y);return M.w(z.date(z.date()+Math.round(D*u)),y)};if(w===f)return this.set(f,this.$M+u);if(w===l)return this.set(l,this.$y+u);if(w===a)return b(1);if(w===d)return b(7);var A=(c={},c[o]=t,c[s]=r,c[i]=e,c)[w]||1,k=this.$d.getTime()+u*A;return M.w(k,this)},h.subtract=function(u,p){return this.add(-1*u,p)},h.format=function(u){var p=this,c=this.$locale();if(!this.isValid())return c.invalidDate||x;var y=u||"YYYY-MM-DDTHH:mm:ssZ",w=M.z(this),b=this.$H,A=this.$m,k=this.$M,D=c.weekdays,z=c.months,X=c.meridiem,q=function(H,J,se,ae){return H&&(H[J]||H(p,y))||se[J].slice(0,ae)},Q=function(H){return M.s(b%12||12,H,"0")},j=X||function(H,J,se){var ae=H{window.addEventListener(“resize”,()=>{rt(),$e()}),window.addEventListener(“scroll”,()=>{$e()})},rt=()=>{wr.setAttribute(“viewBox”,`0 0 ${window.innerWidth} ${window.innerHeight}`)},$e=()=>{let e=document.querySelector(“.js-steps”).dataset.current;re!==e&&(re=e,ot()),!re||re==”all”?it():nt()},nt=()=>{if(re){let e=document.querySelector(`.js-steps-step[data-step=”${re}”] .js-steps-pin`),t=document.querySelector(“.js-map-location.is-current .js-map-pin”);if(t){let r=e.getBoundingClientRect(),n=t.getBoundingClientRect(),o=document.querySelector(“.js-steps”).getBoundingClientRect(),s=o.top>0?o.top:0,a=r.width/2;ce.setAttribute(“y1”,r.top+a-s),ce.setAttribute(“x1”,r.left+a),ce.setAttribute(“y2”,n.top+a-s),ce.setAttribute(“x2”,n.left+a)}}},it=()=>{ce.classList.add(“is-hidden”)},Mr=()=>{ce.classList.remove(“is-hidden”)},ot=()=>{it(),clearTimeout(tt),tt=setTimeout(()=>{re!==void 0&&re!==”all”&&(nt(),Mr())},1200)},st={init:()=>{br(),rt(),$e()},onChange:()=>{ot()}};var Rn=ft();var ze=e=>{if(e)return e.trim().toLowerCase().normalize(“NFD”).replace(/[u0300-u036f]/g,””).replace(/[^A-Z0-9 ]/gi,””).trim().replace(/ /g,”-“)};var dt=()=>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);var pe=(e,t=null,r=null)=>{r||(r=document.querySelector(“head”));let n=document.createElement(“script”);n.type=”text/javascript”,n.src=e,t&&(n.onload=t),r.appendChild(n)},pt=()=>(window.PMNdataLayer?.[0]!==void 0&&window.PMNdataLayer[0])?.analytics?.user?.state===”Subscribed”,vt=()=>{let t=(window.PMNdataLayer?.[0]!==void 0&&window.PMNdataLayer[0])?.analytics?.user?.state;return window.location.host.includes(“zzz-systest”)||window.location.host.includes(“pmn.arcpublishing.com”)||window.location.host.includes(“stage.fusion.inquirer.com”)||typeof t>”u”},gt=()=>{let t=(window.PMNdataLayer?.[0]!==void 0&&window.PMNdataLayer[0])?.analytics?.user?.hasAdsFreeReading;return!!(t&&t==1)},Be=()=>window.location.host.includes(“localhost”),xe=(e,t=””)=>{let r=document.querySelector(`template#${e}`);if(!r||!(r instanceof HTMLTemplateElement))return console.log(`Couldn’t find .`),null;let n=r.content.cloneNode(!0).childNodes;if(n.length==0)return console.log(`Template ${r} has no children, returning null.`),null;n.length>1&&console.log(`Template ${r} has multiple children, only returning the first.`);let i=n[0];return i.setAttribute(“data-id”,t),i},Te=(e,t)=>{let r=[…e.querySelectorAll(“[data-populate]”)];e.dataset.populate&&r.unshift(e);let n=r.filter(i=>{let o=i.closest(“[data-populate-context]”);return!o||o==e});for(let i of n){let s=i.dataset.populate.trim().split(/s*,s*/).map(a=>a.split(/s*:s*/));for(let[a,d]of s){let g=a.split(“.”).reduce((x,F)=>x?.[F],t),l=g==null||g==null,v=d?.split(/s+/)||[“innerHTML”];for(let x of v)x.startsWith(“.”)&&i.classList.toggle(x.substring(1),l?!1:g),!l&&(x==”innerHTML”?i.innerHTML=g:x.startsWith(“@”)?i.setAttribute(x.substring(1),g):x.startsWith(“–“)&&i.style.setProperty(x,g))}}};var Er=()=>{gt()&&document.querySelectorAll(“.js-adbox”).forEach(t=>{t.classList.add(“is-hidden”)})},mt={init:()=>{Er()}};var le,yt,kr=()=>{le=document.getElementById(“js-inno-toast”)},Dr=e=>{if(!le)return;le.innerHTML=e,le.classList.add(“inno-toast–active”);let t=()=>{le.addEventListener(“transitionend”,$r,{once:!0}),le.classList.remove(“inno-toast–active”)};clearTimeout(yt),yt=setTimeout(t,5e3)},$r=()=>{le.innerHTML=””},ue={init:()=>{kr()},showToast:Dr};var Ce,wt=!1,zr=async()=>new Promise(e=>{setTimeout(()=>{console.log(“simulating createShareLink for localhost”),e(“https://inquirer.com/interactives”),Br()},100)}),Br=()=>{let e=document.querySelector(“.js-gift-toast-receiver”);!e||!(e instanceof HTMLElement)||setTimeout(()=>{let t=e?.querySelector(“span”);t&&(t.innerHTML=”Gift link copied to clipboard“)},20)},Fr=()=>{let e=window.services?.createShareLink;e&&(Ce=e),Be()&&(Ce=zr),Ce&&Or()},Hr=async e=>{let t=”text/plain”,r=async()=>{try{return await Ce(window.location.pathname)}catch{e.dataset.state=”error”,ue.showToast(“Hmm, we couldn’t generate a gift link…”)}},n=new ClipboardItem({[t]:r()});await navigator.clipboard.write([n]).catch(i=>{console.log(i),ue.showToast(“Couldn’t copy to clipboard, try again?”),e.dataset.state=”error”}),ue.showToast(“Gift link copied to clipboard!”),e.dataset.state=”complete”},Or=()=>{document.querySelectorAll(“.js-gift”).forEach(t=>{(pt()||Be()||vt())&&t.classList.add(“is-available”)}),document.querySelectorAll(“.js-gift-button”).forEach(t=>{t instanceof HTMLButtonElement&&t.addEventListener(“click”,()=>{t.classList.contains(“disabled”)||(t.dataset.state=”loading”,wt=!0,Hr(t),setTimeout(()=>{t.dataset.state=”ready”},2e3))})});let e=document.querySelector(“.js-gift-toast-receiver”);!e||!(e instanceof HTMLElement)||Rr(e)},Rr=e=>{new MutationObserver(r=>{for(let n of r){let i=[…n.addedNodes].at(0);if(!(i instanceof HTMLElement))return;wt&&ue.showToast(i.outerHTML)}}).observe(e,{subtree:!0,childList:!0})},bt={init:()=>{Fr()}};var Ur=()=>{window.addEventListener(“message”,e=>{if(e.data[“datawrapper-height”]){let t=e.data[“datawrapper-height”];for(let r in t)document.querySelector(`#datawrapper-chart-${r}`).setAttribute(“height”,t[r])}})},Ir=()=>{document.querySelectorAll(“.js-datawrapper-graphic”).forEach(e=>{pe(`https://datawrapper.dwcdn.net/${e.dataset.id}/embed.js`,null,e)})},qr=()=>{window.addEventListener(“message”,e=>{let t=e.data;document.querySelectorAll(`iframe[src*=”${t.id}”]`).forEach(n=>{n.style.height=`${t.height}px`})},!1)},Gr=()=>{document.querySelectorAll(“.js-pym-graphic”).forEach(e=>{if(typeof window{new window.pym.Parent(e.id,e.dataset.iframe)};typeof window.pym>”u”?pe(“https://pym.nprapps.org/pym.v1.min.js”,t):t()}})},Mt={init:()=>{Ur(),Ir(),Gr(),qr()}};var ve,Nr=()=>{document.querySelectorAll(“.js-hover”).forEach(e=>{e.addEventListener(“click”,()=>{St(e)}),e.addEventListener(“mouseenter”,()=>{St(e)}),e.addEventListener(“mouseout”,()=>{xt(e)})}),window.addEventListener(“scroll”,()=>{ve!==null&&Zr()})},Zr=()=>{(ve>window.scrollY+100||ve{xt(e)})},St=e=>{e.classList.add(“is-visible”),ve=window.scrollY},xt=e=>{e.classList.remove(“is-visible”),ve=null},Tt={init:()=>{Nr()}};var N=Uint8Array,he=Uint16Array,Wr=Int32Array,Ct=new N([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Lt=new N([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),jr=new N([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Pt=function(e,t){for(var r=new he(31),n=0;n<31;++n)r[n]=t+=1<<e[n-1];for(var i=new Wr(r[30]),n=1;n<30;++n)for(var o=r[n];o<r[n+1];++o)i[o]=o-r[n]<<5|n;return{b:r,r:i}},At=Pt(Ct,2),Et=At.b,Jr=At.r;Et[28]=258,Jr[258]=28;var kt=Pt(Lt,0),Yr=kt.b,Vn=kt.r,Oe=new he(32768);for(S=0;S>1|(S&21845)<>2|(_&13107)<>4|(_&3855)<>8|(_&255)<>1;var _,S,ge=function(e,t,r){for(var n=e.length,i=0,o=new he(t);i<n;++i)e[i]&&++o[e[i]-1];var s=new he(t);for(i=1;i<t;++i)s[i]=s[i-1]+o[i-1]<<1;var a;if(r){a=new he(1<<t);var d=15-t;for(i=0;i<n;++i)if(e[i])for(var f=i<<4|e[i],g=t-e[i],l=s[e[i]-1]++<<g,v=l|(1<<g)-1;l>d]=f}else for(a=new he(n),i=0;i>15-e[i]);return a},me=new N(288);for(S=0;S<144;++S)me[S]=8;var S;for(S=144;S<256;++S)me[S]=9;var S;for(S=256;S<280;++S)me[S]=7;var S;for(S=280;S<288;++S)me[S]=8;var S,Dt=new N(32);for(S=0;S<32;++S)Dt[S]=5;var S;var Vr=ge(me,9,1);var Kr=ge(Dt,5,1),Fe=function(e){for(var t=e[0],r=1;rt&&(t=e[r]);return t},Y=function(e,t,r){var n=t/8|0;return(e[n]|e[n+1]<>(t&7)&r},He=function(e,t){var r=t/8|0;return(e[r]|e[r+1]<<8|e[r+2]<>(t&7)},Xr=function(e){return(e+7)/8|0},Qr=function(e,t,r){return(t==null||te.length)&&(r=e.length),new N(e.subarray(t,r))};var _r=[“unexpected EOF”,”invalid block type”,”invalid length/literal”,”invalid distance”,”stream finished”,”no stream handler”,,”no callback”,”invalid UTF-8 data”,”extra field too long”,”date not in range 1980-2099″,”filename too long”,”stream finishing”,”invalid zip data”],G=function(e,t,r){var n=new Error(t||_r[e]);if(n.code=e,Error.captureStackTrace&&Error.captureStackTrace(n,G),!r)throw n;return n},Re=function(e,t,r,n){var i=e.length,o=n?n.length:0;if(!i||t.f&&!t.l)return r||new N(0);var s=!r,a=s||t.i!=2,d=t.i;s&&(r=new N(i*3));var f=function(ae){var Xe=r.length;if(ae>Xe){var Qe=new N(Math.max(Xe*2,ae));Qe.set(r),r=Qe}},g=t.f||0,l=t.p||0,v=t.b||0,x=t.l,F=t.d,P=t.m,V=t.n,O=i*8;do{if(!x){g=Y(e,l,1);var K=Y(e,l+1,3);if(l+=3,K)if(K==1)x=Vr,F=Kr,P=9,V=5;else if(K==2){var ie=Y(e,l,31)+257,oe=Y(e,l+10,15)+4,E=ie+Y(e,l+5,31)+1;l+=14;for(var M=new N(E),te=new N(19),U=0;U<oe;++U)te[jr[U]]=Y(e,l+U*3,7);l+=oe*3;for(var m=Fe(te),h=(1<<m)-1,u=ge(te,m,1),U=0;U>4;if(C<16)M[U++]=C;else{var c=0,y=0;for(C==16?(y=3+Y(e,l,3),l+=2,c=M[U-1]):C==17?(y=3+Y(e,l,7),l+=3):C==18&&(y=11+Y(e,l,127),l+=7);y–;)M[U++]=c}}var w=M.subarray(0,ie),b=M.subarray(ie);P=Fe(w),V=Fe(b),x=ge(w,P,1),F=ge(b,V,1)}else G(1);else{var C=Xr(l)+4,$=e[C-4]|e[C-3]<i){d&&G(0);break}a&&f(v+$),r.set(e.subarray(C,R),v),t.b=v+=$,t.p=l=R*8,t.f=g;continue}if(l>O){d&&G(0);break}}a&&f(v+131072);for(var A=(1<<P)-1,k=(1<>4;if(l+=c&15,l>O){d&&G(0);break}if(c||G(2),z264){var U=z-257,q=Ct[U];X=Y(e,l,(1<>4;Q||G(3),l+=Q&15;var b=Yr[j];if(j>3){var q=Lt[j];b+=He(e,l)&(1<O){d&&G(0);break}a&&f(v+131072);var H=v+X;if(v<b){var J=o-b,se=Math.min(b,H);for(J+v<0&&G(3);v<se;++v)r[v]=n[J+v]}for(;v<H;++v)r[v]=r[v-b]}}t.l=x,t.p=D,t.b=v,t.f=g,x&&(g=1,t.m=P,t.d=F,t.n=V)}while(!g);return v!=r.length&&s?Qr(r,0,v):r.subarray(0,v)};var en=new N(0);var tn=function(e){(e[0]!=31||e[1]!=139||e[2]!=8)&&G(6,"invalid gzip data");var t=e[3],r=10;t&4&&(r+=(e[10]|e[11]<>3&1)+(t>>4&1);n>0;n-=!e[r++]);return r+(t&2)},rn=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<>>0};var nn=function(e,t){return((e[0]&15)!=8||e[0]>>4>7||(e[0]<>5&1)==+!t&&G(6,”invalid zlib data: “+(e[1]&32?”need”:”unexpected”)+” dictionary”),(e[1]>>3&4)+2};function on(e,t){return Re(e,{i:2},t&&t.out,t&&t.dictionary)}function sn(e,t){var r=tn(e);return r+8>e.length&&G(6,”invalid gzip data”),Re(e.subarray(r,-8),{i:2},t&&t.out||new N(rn(e)),t&&t.dictionary)}function an(e,t){return Re(e.subarray(nn(e,t&&t.dictionary),-4),{i:2},t&&t.out,t&&t.dictionary)}function $t(e,t){return e[0]==31&&e[1]==139&&e[2]==8?sn(e,t):(e[0]&15)!=8||e[0]>>4>7||(e[0]<<8|e[1])%31?on(e,t):an(e,t)}var ln=typeof TextDecodercn(e,”name”,{value:t,configurable:!0}),B=(e,t,r)=>new Promise((n,i)=>{var o=d=>{try{a(r.next(d))}catch(f){i(f)}},s=d=>{try{a(r.throw(d))}catch(f){i(f)}},a=d=>d.done?n(d.value):Promise.resolve(d.value).then(o,s);a((r=r.apply(e,t)).next())}),Qn=T((e,t)=>{let r=!1,n=””,i=L.GridLayer.extend({createTile:T((o,s)=>{let a=document.createElement(“img”),d=new AbortController,f=d.signal;return a.cancel=()=>{d.abort()},r||(e.getHeader().then(g=>{g.tileType===1?console.error(“Error: archive contains MVT vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details.”):g.tileType===2?n=”image/png”:g.tileType===3?n=”image/jpeg”:g.tileType===4?n=”image/webp”:g.tileType===5&&(n=”image/avif”)}),r=!0),e.getZxy(o.z,o.x,o.y,f).then(g=>{if(g){let l=new Blob([g.data],{type:n}),v=window.URL.createObjectURL(l);a.src=v,a.cancel=void 0,s(void 0,a)}}).catch(g=>{if(g.name!==”AbortError”)throw g}),a},”createTile”),_removeTile:T(function(o){let s=this._tiles[o];s&&(s.el.cancel&&s.el.cancel(),s.el.width=0,s.el.height=0,s.el.deleted=!0,L.DomUtil.remove(s.el),delete this._tiles[o],this.fire(“tileunload”,{tile:s.el,coords:this._keyToTileCoords(o)}))},”_removeTile”)});return new i(t)},”leafletRasterLayer”),hn=T(e=>(t,r)=>{if(r instanceof AbortController)return e(t,r);let n=new AbortController;return e(t,n).then(i=>r(void 0,i.data,i.cacheControl||””,i.expires||””),i=>r(i)).catch(i=>r(i)),{cancel:T(()=>n.abort(),”cancel”)}},”v3compat”),zt=class{constructor(t){this.tilev4=T((r,n)=>B(this,null,function*(){if(r.type===”json”){let x=r.url.substr(10),F=this.tiles.get(x);if(F||(F=new Le(x),this.tiles.set(x,F)),this.metadata)return{data:yield F.getTileJson(r.url)};let P=yield F.getHeader();return(P.minLon>=P.maxLon||P.minLat>=P.maxLat)&&console.error(`Bounds of PMTiles archive ${P.minLon},${P.minLat},${P.maxLon},${P.maxLat} are not valid.`),{data:{tiles:[`${r.url}/{z}/{x}/{y}`],minzoom:P.minZoom,maxzoom:P.maxZoom,bounds:[P.minLon,P.minLat,P.maxLon,P.maxLat]}}}let i=new RegExp(/pmtiles://(.+)/(d+)/(d+)/(d+)/),o=r.url.match(i);if(!o)throw new Error(“Invalid PMTiles protocol URL”);let s=o[1],a=this.tiles.get(s);a||(a=new Le(s),this.tiles.set(s,a));let d=o[2],f=o[3],g=o[4],l=yield a.getHeader(),v=yield a?.getZxy(+d,+f,+g,n.signal);if(v)return{data:new Uint8Array(v.data),cacheControl:v.cacheControl,expires:v.expires};if(l.tileType===1){if(this.errorOnMissingTile)throw new Error(“Tile not found.”);return{data:new Uint8Array}}return{data:null}}),”tilev4″),this.tile=hn(this.tilev4),this.tiles=new Map,this.metadata=t?.metadata||!1,this.errorOnMissingTile=t?.errorOnMissingTile||!1}add(t){this.tiles.set(t.source.getKey(),t)}get(t){return this.tiles.get(t)}};T(zt,”Protocol”);var Bt=zt;function Ft(e,t){return(t>>>0)*4294967296+(e>>>0)}T(Ft,”toNum”);function Ht(e,t){let r=t.buf,n=r[t.pos++],i=(n&112)>>4;if(n<128||(n=r[t.pos++],i|=(n&127)<<3,n<128)||(n=r[t.pos++],i|=(n&127)<<10,n<128)||(n=r[t.pos++],i|=(n&127)<<17,n<128)||(n=r[t.pos++],i|=(n&127)<<24,n<128)||(n=r[t.pos++],i|=(n&1)<<31,n<128))return Ft(e,i);throw new Error("Expected varint not more than 10 bytes")}T(Ht,"readVarintRemainder");function fe(e){let t=e.buf,r=t[e.pos++],n=r&127;return r<128||(r=t[e.pos++],n|=(r&127)<<7,r<128)||(r=t[e.pos++],n|=(r&127)<<14,r<128)||(r=t[e.pos++],n|=(r&127)<<21,r<128)?n:(r=t[e.pos],n|=(r&15)<<28,Ht(n,e))}T(fe,"readVarint");function Ie(e,t,r,n){if(n===0){r===1&&(t[0]=e-1-t[0],t[1]=e-1-t[1]);let i=t[0];t[0]=t[1],t[1]=i}}T(Ie,"rotate");function Ot(e,t){let r=ye(2,e),n=t,i=t,o=t,s=[0,0],a=1;for(;a26)throw new Error(“Tile zoom level exceeds max safe number limit (26)”);if(t>ye(2,e)-1||r>ye(2,e)-1)throw new Error(“tile x/y outside zoom level bounds”);let n=fn[e],i=ye(2,e),o=0,s=0,a=0,d=[t,r],f=i/2;for(;f>0;)o=(d[0]&f)>0?1:0,s=(d[1]&f)>0?1:0,a+=f*f*(3*o^s),Ie(f,d,o,s),f=f/2;return n+a}T(Rt,”zxyToTileId”);function dn(e){let t=0,r=0;for(let n=0;n<27;n++){let i=(1<<n)*(1<e)return Ot(n,e-t);t+=i}throw new Error(“Tile zoom level exceeds max safe number limit (26)”)}T(dn,”tileIdToZxy”);var pn=(e=>(e[e.Unknown=0]=”Unknown”,e[e.None=1]=”None”,e[e.Gzip=2]=”Gzip”,e[e.Brotli=3]=”Brotli”,e[e.Zstd=4]=”Zstd”,e))(pn||{});function Pe(e,t){return B(this,null,function*(){if(t===1||t===0)return e;if(t===2){if(typeof globalThis.DecompressionStream>”u”)return $t(new Uint8Array(e));let r=new Response(e).body;if(!r)throw new Error(“Failed to read response stream”);let n=r.pipeThrough(new globalThis.DecompressionStream(“gzip”));return new Response(n).arrayBuffer()}throw new Error(“Compression method not supported”)})}T(Pe,”defaultDecompress”);var vn=(e=>(e[e.Unknown=0]=”Unknown”,e[e.Mvt=1]=”Mvt”,e[e.Png=2]=”Png”,e[e.Jpeg=3]=”Jpeg”,e[e.Webp=4]=”Webp”,e[e.Avif=5]=”Avif”,e))(vn||{});function Ut(e){return e===1?”.mvt”:e===2?”.png”:e===3?”.jpg”:e===4?”.webp”:e===5?”.avif”:””}T(Ut,”tileTypeExt”);var gn=127;function It(e,t){let r=0,n=e.length-1;for(;r>1,o=t-e[i].tileId;if(o>0)r=i+1;else if(o=0&&(e[n].runLength===0||t-e[n].tileId-1,o=/Chrome|Chromium|Edg|OPR|Brave/.test(n);this.chromeWindowsNoCache=!1,i&&o&&(this.chromeWindowsNoCache=!0)}getKey(){return this.url}setHeaders(t){this.customHeaders=t}getBytes(t,r,n,i){return B(this,null,function*(){let o,s;n?s=n:(o=new AbortController,s=o.signal);let a=new Headers(this.customHeaders);a.set(“range”,`bytes=${t}-${t+r-1}`);let d;this.mustReload?d=”reload”:this.chromeWindowsNoCache&&(d=”no-store”);let f=yield fetch(this.url,{signal:s,cache:d,headers:a});if(t===0&&f.status===416){let v=f.headers.get(“Content-Range”);if(!v||!v.startsWith(“bytes */”))throw new Error(“Missing content-length on 416 response”);let x=+v.substr(8);f=yield fetch(this.url,{signal:s,cache:”reload”,headers:{range:`bytes=0-${x-1}`}})}let g=f.headers.get(“Etag”);if(g!=null&&g.startsWith(“W/”)&&(g=null),f.status===416||i&&g&&g!==i)throw this.mustReload=!0,new Ue(`Server returned non-matching ETag ${i} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`);if(f.status>=300)throw new Error(`Bad response code: ${f.status}`);let l=f.headers.get(“Content-Length”);if(f.status===200&&(!l||+l>r))throw o&&o.abort(),new Error(“Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving.”);return{data:yield f.arrayBuffer(),etag:g||void 0,cacheControl:f.headers.get(“Cache-Control”)||void 0,expires:f.headers.get(“Expires”)||void 0}})}};T(qt,”FetchSource”);var yn=qt;function W(e,t){let r=e.getUint32(t+4,!0),n=e.getUint32(t+0,!0);return r*ye(2,32)+n}T(W,”getUint64″);function Gt(e,t){let r=new DataView(e),n=r.getUint8(7);if(n>3)throw new Error(`Archive is spec version ${n} but this library supports up to spec version 3`);return{specVersion:n,rootDirectoryOffset:W(r,8),rootDirectoryLength:W(r,16),jsonMetadataOffset:W(r,24),jsonMetadataLength:W(r,32),leafDirectoryOffset:W(r,40),leafDirectoryLength:W(r,48),tileDataOffset:W(r,56),tileDataLength:W(r,64),numAddressedTiles:W(r,72),numTileEntries:W(r,80),numTileContents:W(r,88),clustered:r.getUint8(96)===1,internalCompression:r.getUint8(97),tileCompression:r.getUint8(98),tileType:r.getUint8(99),minZoom:r.getUint8(100),maxZoom:r.getUint8(101),minLon:r.getInt32(102,!0)/1e7,minLat:r.getInt32(106,!0)/1e7,maxLon:r.getInt32(110,!0)/1e7,maxLat:r.getInt32(114,!0)/1e7,centerZoom:r.getUint8(118),centerLon:r.getInt32(119,!0)/1e7,centerLat:r.getInt32(123,!0)/1e7,etag:t}}T(Gt,”bytesToHeader”);function qe(e){let t={buf:new Uint8Array(e),pos:0},r=fe(t),n=[],i=0;for(let o=0;o<r;o++){let s=fe(t);n.push({tileId:i+s,offset:0,length:0,runLength:1}),i+=s}for(let o=0;o<r;o++)n[o].runLength=fe(t);for(let o=0;o<r;o++)n[o].length=fe(t);for(let o=0;o0?n[o].offset=n[o-1].offset+n[o-1].length:n[o].offset=s-1}return n}T(qe,”deserializeIndex”);var Nt=class extends Error{};T(Nt,”EtagMismatch”);var Ue=Nt;function Ge(e,t){return B(this,null,function*(){let r=yield e.getBytes(0,16384);if(new DataView(r.data).getUint16(0,!0)!==19792)throw new Error(“Wrong magic number for PMTiles archive”);let n=r.data.slice(0,gn),i=Gt(n,r.etag),o=r.data.slice(i.rootDirectoryOffset,i.rootDirectoryOffset+i.rootDirectoryLength),s=`${e.getKey()}|${i.etag||””}|${i.rootDirectoryOffset}|${i.rootDirectoryLength}`,a=qe(yield t(o,i.internalCompression));return[i,[s,a.length,a]]})}T(Ge,”getHeaderAndRoot”);function Ne(e,t,r,n,i){return B(this,null,function*(){let o=yield e.getBytes(r,n,void 0,i.etag),s=yield t(o.data,i.internalCompression),a=qe(s);if(a.length===0)throw new Error(“Empty directory is invalid”);return a})}T(Ne,”getDirectory”);var wn=class{constructor(t=100,r=!0,n=Pe){this.cache=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=n}getHeader(t){return B(this,null,function*(){let r=t.getKey(),n=this.cache.get(r);if(n)return n.lastUsed=this.counter++,n.data;let i=yield Ge(t,this.decompress);return i[1]&&this.cache.set(i[1][0],{lastUsed:this.counter++,data:i[1][2]}),this.cache.set(r,{lastUsed:this.counter++,data:i[0]}),this.prune(),i[0]})}getDirectory(t,r,n,i){return B(this,null,function*(){let o=`${t.getKey()}|${i.etag||””}|${r}|${n}`,s=this.cache.get(o);if(s)return s.lastUsed=this.counter++,s.data;let a=yield Ne(t,this.decompress,r,n,i);return this.cache.set(o,{lastUsed:this.counter++,data:a}),this.prune(),a})}prune(){if(this.cache.size>this.maxCacheEntries){let t=1/0,r;this.cache.forEach((n,i)=>{n.lastUsed{Ge(t,this.decompress).then(a=>{a[1]&&this.cache.set(a[1][0],{lastUsed:this.counter++,data:Promise.resolve(a[1][2])}),o(a[0]),this.prune()}).catch(a=>{s(a)})});return this.cache.set(r,{lastUsed:this.counter++,data:i}),i})}getDirectory(t,r,n,i){return B(this,null,function*(){let o=`${t.getKey()}|${i.etag||””}|${r}|${n}`,s=this.cache.get(o);if(s)return s.lastUsed=this.counter++,yield s.data;let a=new Promise((d,f)=>{Ne(t,this.decompress,r,n,i).then(g=>{d(g),this.prune()}).catch(g=>{f(g)})});return this.cache.set(o,{lastUsed:this.counter++,data:a}),a})}prune(){if(this.cache.size>=this.maxCacheEntries){let t=1/0,r;this.cache.forEach((n,i)=>{n.lastUsed{this.getHeader(t).then(s=>{i(),this.invalidations.delete(r)}).catch(s=>{o(s)})});this.invalidations.set(r,n)})}};T(Zt,”SharedPromiseCache”);var bn=Zt,Wt=class{constructor(t,r,n){typeof t==”string”?this.source=new yn(t):this.source=t,n?this.decompress=n:this.decompress=Pe,r?this.cache=r:this.cache=new bn}getHeader(){return B(this,null,function*(){return yield this.cache.getHeader(this.source)})}getZxyAttempt(t,r,n,i){return B(this,null,function*(){let o=Rt(t,r,n),s=yield this.cache.getHeader(this.source);if(ts.maxZoom)return;let a=s.rootDirectoryOffset,d=s.rootDirectoryLength;for(let f=0;f0){let v=yield this.source.getBytes(s.tileDataOffset+l.offset,l.length,i,s.etag);return{data:yield this.decompress(v.data,s.tileCompression),cacheControl:v.cacheControl,expires:v.expires}}a=s.leafDirectoryOffset+l.offset,d=l.length}else return}throw new Error(“Maximum directory depth exceeded”)})}getZxy(t,r,n,i){return B(this,null,function*(){try{return yield this.getZxyAttempt(t,r,n,i)}catch(o){if(o instanceof Ue)return this.cache.invalidate(this.source),yield this.getZxyAttempt(t,r,n,i);throw o}})}getMetadataAttempt(){return B(this,null,function*(){let t=yield this.cache.getHeader(this.source),r=yield this.source.getBytes(t.jsonMetadataOffset,t.jsonMetadataLength,void 0,t.etag),n=yield this.decompress(r.data,t.internalCompression),i=new TextDecoder(“utf-8″);return JSON.parse(i.decode(n))})}getMetadata(){return B(this,null,function*(){try{return yield this.getMetadataAttempt()}catch(t){if(t instanceof Ue)return this.cache.invalidate(this.source),yield this.getMetadataAttempt();throw t}})}getTileJson(t){return B(this,null,function*(){let r=yield this.getHeader(),n=yield this.getMetadata(),i=Ut(r.tileType);return{tilejson:”3.0.0″,scheme:”xyz”,tiles:[`${t}/{z}/{x}/{y}${i}`],vector_layers:n.vector_layers,attribution:n.attribution,description:n.description,name:n.name,version:n.version,bounds:[r.minLon,r.minLat,r.maxLon,r.maxLat],center:[r.centerLon,r.centerLat,r.centerZoom],minzoom:r.minZoom,maxzoom:r.maxZoom}})}};T(Wt,”PMTiles”);var Le=Wt;var we=[{name:”Mirenda Center at Neumann University”,town:”Aston Township”,coordinates:”39.87518295957942, -75.44287264018742″,photo:”CUFT75EQJFCNXF6TBJWB47IZBE”,description:”Tom (Mark Ruffalo) mans a table at a job fair here while temporarily working as a recruiter for the FBI. Next to his station, the distinctive pillars of the centeru2019s atrium are visible.”,episode:”1″},{name:”Rita’s Italian Ice & Frozen Custard”,town:”Collingdale”,coordinates:”39.91438144966683, -75.27198755476991″,photo:”PVN6FY7AZVH57NJJ5QZMPSORVQ”,description:”Emily (Silvia Dionicio), Tomu2019s daughter, works her part-time job here. In the scene where it is shown, Tom orders a black cherry water ice, a flavor choice of which we approve.”,episode:”1″},{name:”Former Philadelphia Police Department Headquarters”,town:”Philadelphia”,coordinates:”39.95454212611587, -75.15196309318775″,photo:”L7RTCVGETVB6BGP3OI6FGI75II”,description:”We get a brief glimpse of the exterior of the former Philadelphia police headquarters, colloquially known as the Roundhouse. Whether the interior is the same building is unclear, but in the show, this appears to be where the FBIu2019s Philly field office is located.”,episode:”1″},{name:”Bangor Quarry”,town:”Bangor”,coordinates:”40.870304770450126, -75.20395382209078″,photo:””,description:”Robbie (Tom Pelphrey), Cliff (RaxFAl Castillo), and Peaches (Owen Teague) head here for a post-robbery swim. On a real-life note, you should not do the same u2014 not only is it dangerous, but itu2019s also trespassing, according to the Bangor Borough Police Department.”,episode:”1″},{name:”Lincoln Highway and 2nd Avenue”,town:”Coatesville”,coordinates:”39.98367030794463, -75.82206085300957″,photo:”DKXFYZ5EGBEHJJKLSUGLQQDAR4″,description:”The Dark Hearts motorcycle gang rides through this intersection in formation, the giveaway being Presence Bank in the background in one shot.”,episode:”2″},{name:”Polish American Citizens Club”,town:”Coatesville”,coordinates:”39.98079295642107, -75.83090353169075″,photo:”WICMTOVTBFE3HANVTH2PSHED5M”,description:”Done up as the so-called Leftyu2019s Taproom in the show, this location serves as the Dark Heartsu2019 clubhouse and watering hole. In real life, itu2019s just off Lincoln Highway, lending a bit of realism to the gangu2019s ride through downtown Coatesville.”,episode:”2″},{name:”Martin’s Taphouse”,town:”Aston Township”,coordinates:”39.89042265129427, -75.43449503510138″,photo:””,description:”Martin’s stands in as the exterior of the Tip Top Lounge in the series, which we see in this episode stacked with motorcycles parked outside the front door.”,episode:”2″},{name:”Dixon’s Lounge”,town:”Sharon Hill”,coordinates:”39.897139107273794, -75.27191565278125″,photo:”BHMNCU4FFJGOBPUKYCZBB2XEOA”,description:”While the exterior of the Tip Top Lounge is in Aston, the interior bears a striking resemblance to Delcou2019s own Dixonu2019s Lounge. Here, Robbie and Cliff are stood up by an, ahem, u201Cbusiness partneru201D before walking out on an order of crabfries.”,episode:”2″},{name:”Willowbrook Shopping Center”,town:”Boothwyn”,coordinates:”39.83646391291799, -75.44319408140227″,photo:”ZU5QXUIDONETHIPPADUJYMAKCY”,description:”Maeve (Emilia Jones) takes Sam (Ben Lewis Doherty) to a fictional u201CVal-U Corneru201D store here with the intent of dropping him off for police to find before the plan goes awry. The store is located near the real Blue Cherry Ice Cream and Bakery, which is visible in the background.”,episode:”2″},{name:”Phoenixville Area High School”,town:”Phoenixville”,coordinates:”40.11868357112564, -75.51793551723154″,photo:””,description:”During his search for his daughter, Emily (Silvia Dionicio), Tom (Mark Ruffalo) finds her in the dugout of a baseball field that, in real life, is at Phoenixville Area High School. Its distinctive backstop is visible from a bird’s-eye view in the series.”,episode:”2″},{name:”Ralph’s Italian Restaurant”,town:”Philadelphia”,coordinates:”39.94006065749021, -75.15774535245488″,photo:”GMDZYMAHRNFGPBTYLRABBDJYHM”,description:”Dark Hearts leaders Jayson (Sam Keeley) and Perry (Jamie McShane) walk through the kitchen here to meet with local drug kingpin Freddy Frias (Elvis Nolasco), but in the show, it doesnu2019t appear to be serving the Italian food weu2019re used to in real life.”,episode:”3″},{name:”Mount Hope Cemetery”,town:”Aston Township”,coordinates:”39.871593701306836, -75.4390865914003″,photo:”4PCNSW4SPBAW7L2WFSJ2STJ3IM”,description:”Itu2019s a very quick shot, but itu2019s there just under four minutes into the episode. In the background, you can see the Commodore Barry Bridge, and graves on a hill in the cemetery in the foreground.”,episode:”3″},{name:”Sixpenny Creek Quarry”,town:”Union Township”,coordinates:”40.23700358370588, -75.78650582204335″,photo:”PLM34YOMIRCPPDVCGTFXM5FGME”,description:”Robbie (Tom Pelphrey) and Cliff (RaxFAl Castillo) finally get their meeting with Eryn (Margarita Levieva), their Dark Hearts insider, but it doesnu2019t go according to plan.”,episode:”3″},{name:”Llanerch Diner”,town:”Upper Darby”,coordinates:”39.96894828437008, -75.29301814827437″,photo:”6QXQDIMGKVDR5J64W4PVS3WP3E”,description:”Taskforce members Aleah (Thuso Mbedu) and Lizzie (Alison Oliver) head to Upper Darby’s famed Llanerch Diner for a tip on the drug house robberies they’re investigating, and get a break in the case.”,episode:”3″},{name:”Rosedon Plaza”,town:”Lansdowne”,coordinates:”39.94225704587108, -75.26528827286353″,photo:”SCB2N67GLFACZO33OOA7CLXQMM”,description:”In the background of one shot during the chase for Ray (Peter Patrikios), you can see the old Doc’s Deli (Deli Green). That puts Ray in the corner of the Rosedon Plaza parking lot as Lizzie (Alison Oliver) makes the arrest.”,episode:”3″},{name:”Coatesville Police Department”,town:”Coatesville”,coordinates:”39.982144078230384, -75.82033869646108″,photo:”XTADWTS6UNEDHOJGNIMWPBBOLE”,description:”Whether the interior is the same station isnu2019t clear, but an exterior shot sets this spot up as the place where the Task team interrogates Ray (Peter Patrikios) and Shelley (Mickey Sumner). Out front, a police cruiser reads u201CDelaware County Sheriff,u201D which is a little far from home.”,episode:”3″},{name:”The Ridley House”,town:”Holmes”,coordinates:”39.89753600427107, -75.31137880453917″,photo:”F2JJYIIZWFA3FFTHDPSXFI5M5A”,description:”Following the chase and interrogation, Lizzie (Alison Oliver) and Grasso (Fabien Frankel) head to this local bar to unwind. Grasso indicates it is a Barnabyu2019s, which, in real life, was true at one point u2013 until the location became the Ridley House in 2019.”,episode:”3″},{name:”Pennsylvania Turnpike on-ramp”,town:”King of Prussia”,coordinates:”40.08960425823238, -75.39689126886788″,photo:”BURLUGM6TRDX3CE46XSFYGJK7M”,description:”Itu2019s a quick shot as Tom (Mark Ruffalo) drives around at the beginning of the episode, but you can just make out the LasikPlus building on Mall Boulevard in the background. That puts this Pennsylvania Turnpike entrance in King of Prussia.”,episode:”4″},{name:”I-76 Exit 320″,town:”Malvern”,coordinates:”40.073716457225665, -75.52365668680957″,photo:””,description:”Tom (Mark Ruffalo) appears to take this exit as he is driving to meet his fellow taskforce members.”,episode:”4″},{name:”Marcus Hook Community Center”,town:”Marcus Hook”,coordinates:”39.81198192114949, -75.41200706776057″,photo:”B76EM6PKTFEB7KFWEUWGOWYDL4″,description:”As County Chief Dorsey (Raphael Sbarge) exits the building, you can see a door tagged with u201CDelaware County Sheriffu2019s Office.u201D But the green awning above him is a dead giveaway u2014 thatu2019s the Marcus Hook Community Center.”,episode:”4″},{name:”Rockdale Industrial Center”,town:”Aston Township “,coordinates:”39.885281970146785, -75.44479191780039″,photo:””,description:”It’s disguised as a trucking depot in the series, but this is where Robbie (Tom Pelphrey) and Cliff (RaxFAl Castillo) travel with Sam (Ben Lewis Doherty) to arrange transportation for their escape into Canada before being confronted by a Good Samaritan. “,episode:”4″},{name:”Upland Diner”,town:”Chester”,coordinates:”39.85816357241053, -75.37189095611281″,photo:”PVJMMBSI2ZBGJNQO46VYY5P6GQ”,description:”Upland Dineru2019s parking lot serves as Robbieu2019s (Tom Pelphrey) holding area during this episodeu2019s drug deal. Unfortunately, we only get an exterior shot of the building, but the restaurantu2019s vintage-style sign is proudly on display. Great pancakes, for the record.”,episode:”4″},{name:”Ridley Creek State Park entrance”,town:”Newtown Square”,coordinates:”39.95853496065017, -75.43948479664033″,photo:”KOSWCMRRHRAB7MLGNLQIF535UM”,description:”Cliff (RaxFAl Castillo) can be seen turning onto North Sandy Flash Drive from Gradyville Road as he heads to the drug deal meeting spot. If you look closely, you can just barely make out a sign for Ridley Creek State Park.”,episode:”4″},{name:”Beaver Creek”,town:”Wilmington, Del.”,coordinates:”39.839261612846315, -75.57139152554225″,photo:””,description:”It’s tough to spot, but the dam that Cliff (RaxFAl Castillo) parks his car next to during this episode’s failed drug deal u2014 or, more accurately, the Dark Hearts’ setup u2014 appears to be in Beaver Creek on the Delaware-Pennsylvania border.”,episode:”4″},{name:”City Clock Apartments”,town:”Coatesville”,coordinates:”39.98382540387415, -75.8211284189516″,photo:”3BYXFXCYUFFRZBUSN5UAPYVYOA”,description:”Another brief shot, but the clock face on the tower of the City Clock Apartments is prominently featured. The building formerly was the National Bank of Coatesville, and has been on the National Register of Historic Places since 1977.”,episode:”4″},{name:”Coatesville-Downingtown Bypass”,town:”Downingtown”,coordinates:”40.01895444780408, -75.70181027552258″,photo:””,description:”FBI Boss Kathleen McGinty (Martha Plimpton) and the rest of the task force swerve across traffic here while looking for Tom (Mark Ruffalo). In the background, you can just make out the sign for Pacer Pool Services & Supplies.”,episode:”5″},{name:”Marsh Creek State Park”,town:”Downingtown”,coordinates:”40.06782560219195, -75.72000193749815″,photo:”NT5JGVMLZFDJTGHC6M7BZFI7Y4″,description:”After surviving his encounter with Robbie (Tom Pelphrey), Tom (Mark Ruffalo) emerges from the woods to see a beautiful summer scene of families enjoying the lake at Marsh Creek State Park.”,episode:”5″},{name:”I-95 Pennsylvania Welcome Center”,town:”Boothwyn”,coordinates:”39.82418322018552, -75.43745107822149″,photo:”5HPTTXFG3ZA2HGAW54OXM4D5ZY”,description:”FBI boss Kathleen McGinty (Martha Plimpton) stuffs her face with fast food at the center’s picnic tables as the task crew looks for their leader. As McGinty explains, she is u201Can emotional eater.u201D”,episode:”5″},{name:”Woy Bridge”,town:”Everett”,coordinates:”40.0150517796881, -78.304498566625″,photo:””,description:”In what is likely the farthest-flung filming location u2013 at least in relation to the rest of the local spots u2013 we get some shots of Everettu2019s Woy Bridge in Bedford County as the taskforce closes in on Robbie (Tom Pelphrey).”,episode:”5″},{name:”Our Lady of Peace Parish”,town:”Milmont Park”,coordinates:”39.88193514095659, -75.33589782814482″,photo:”HGPPGXLRFZFUFE5WBNNXP3DXFM”,description:”Though disguised well as a juvenile detention facility in the show, this little Delco parish provides at least the exterior shots for where Tom (Mark Ruffalo) meets Sam (Ben Lewis Doherty) for the first time.”,episode:”6″},{name:”High Bridge”,town:”Coatesville”,coordinates:”39.98390784773821, -75.82749681114403″,photo:””,description:”This instantly recognizable Coatesville landmark serves as the location for where County Chief Dorsey (Raphael Sbarge) appears to seal Grasso’s (Fabien Frankel) fate with the Dark Hearts.”,episode:”7″},{name:”Delaware County Courthouse and Government Center”,town:”Media”,coordinates:”39.92029464476607, -75.39155431097433″,photo:”NWW6JA6A4FBAJHW7ZIXSIPZ2YA”,description:”Here, Tom (Mark Ruffalo) gives a touching family statement at a court hearing for his son, Ethan (Andrew Russel), in what is the emotional climax of the series. As The Inquirer reported last year, the production took over Courtroom 15 for filming.”,episode:”7″}];var Z=63710088e-1,ai={centimeters:Z*100,centimetres:Z*100,degrees:360/(2*Math.PI),feet:Z*3.28084,inches:Z*39.37,kilometers:Z/1e3,kilometres:Z/1e3,meters:Z,metres:Z,miles:Z/1609.344,millimeters:Z*1e3,millimetres:Z*1e3,nauticalmiles:Z/1852,radians:1,yards:Z*1.0936};function xn(e,t,r={}){let n={type:”Feature”};return(r.id===0||r.id)&&(n.id=r.id),r.bbox&&(n.bbox=r.bbox),n.properties=t||{},n.geometry=e,n}function jt(e,t,r={}){return xn({type:”MultiPoint”,coordinates:e},t,r)}function Ze(e,t,r){if(e!==null)for(var n,i,o,s,a,d,f,g=0,l=0,v,x=e.type,F=x===”FeatureCollection”,P=x===”Feature”,V=F?e.features.length:1,O=0;O<V;O++){f=F?e.features[O].geometry:P?e.geometry:e,v=f?f.type==="GeometryCollection":!1,a=v?f.geometries.length:1;for(var K=0;K<a;K++){var C=0,$=0;if(s=v?f.geometries[K]:f,s!==null){d=s.coordinates;var R=s.type;switch(g=r&&(R==="Polygon"||R==="MultiPolygon")?1:0,R){case null:break;case"Point":if(t(d,l,O,C,$)===!1)return!1;l++,C++;break;case"LineString":case"MultiPoint":for(n=0;n<d.length;n++){if(t(d[n],l,O,C,$)===!1)return!1;l++,R==="MultiPoint"&&C++}R==="LineString"&&C++;break;case"Polygon":case"MultiLineString":for(n=0;n<d.length;n++){for(i=0;i<d[n].length-g;i++){if(t(d[n][i],l,O,C,$)===!1)return!1;l++}R==="MultiLineString"&&C++,R==="Polygon"&&$++}R==="Polygon"&&C++;break;case"MultiPolygon":for(n=0;n<d.length;n++){for($=0,i=0;i<d[n].length;i++){for(o=0;o<d[n][i].length-g;o++){if(t(d[n][i][o],l,O,C,$)===!1)return!1;l++}$++}C++}break;case"GeometryCollection":for(n=0;n{r[0]>n[0]&&(r[0]=n[0]),r[1]>n[1]&&(r[1]=n[1]),r[2]<n[0]&&(r[2]=n[0]),r[3]{pe(“https://interactives.inquirer.com/storage/dependencies/maplibre/5.3.0/maplibre-gl.js”,()=>{let e=new Bt;be=window.maplibregl,be.addProtocol(“pmtiles”,e.tile);let t=”https://interactives.inquirer.com/melish/1.2″,r=`${t}/us-latest.pmtiles`,n=new Le(r);e.add(n),n.getHeader().then(async()=>{let o=await(await fetch(`${t}/styles/neutral.json`)).json();ee=new be.Map({container:”map”,zoom:13,center:[-75.165222,39.952583],cooperativeGestures:!0,attributionControl:!1,padding,style:{…o,sources:{openmaptiles:{type:”vector”,url:`pmtiles://${r}`}}}}),ee.scrollZoom.disable(),ee.touchPitch.disable(),ee.addControl(new be.NavigationControl({showCompass:!1,showZoom:!0,visualizePitch:!1}),”bottom-right”),ee.on(“load”,()=>{Cn(),Ee!==”all”?Ae=we.filter(s=>parseInt(s.episode)parseFloat(d)).reverse(),s.id=ze(s.name),s.photo&&(s.imageSrc=`https://interactives.inquirer.com/secondbank/arc/${s.photo}/650.webp`);let a=xe(“js-map-stub”);Te(a,s),a.addEventListener(“click”,()=>{Yt(a)}),a.addEventListener(“mouseover”,()=>{Yt(a)}),a.addEventListener(“mouseout”,()=>{Xt()}),new be.Marker({element:a}).setLngLat(s.coordinates).addTo(ee)}document.querySelector(“.js-map”).classList.add(“is-loaded”),Kt=!0,Me!=””&&(er(Me),_t(Me))})})})},Yt=e=>{Xt(),e.classList.add(“is-highlight”)},Xt=()=>{document.querySelectorAll(“.js-map-location”).forEach(e=>{e.classList.remove(“is-highlight”)})},Cn=()=>{Ee=document.querySelector(“.js-steps”).dataset.episodeForPage},Qt=()=>{let e=window.innerWidth>960;padding={top:50,bottom:e?50:window.innerHeight/2,left:e?window.innerWidth/2+50:50,right:50}},Ln=()=>{window.addEventListener(“resize”,()=>{Qt()})},_t=e=>{if(Me=null,e==null){let t=we.filter(r=>r.episode==Ee);ee.fitBounds(Vt(t),{animate:!0})}else if(e.step==”all”)ee.fitBounds(Vt(Ae),{animate:!0});else{let t=we.filter(r=>ze(r.name)==e.step);t.length>0&&ee.flyTo({center:t[0].coordinates,padding,zoom:13,animate:!0,duration:1e3})}},er=e=>{document.querySelectorAll(“.js-map-location”).forEach(t=>{t.classList.remove(“is-current”)}),e&&e.step!==”all”&&document.querySelector(`.js-map-location[data-id=”${e.step}”]`).classList.add(“is-current”)},Vt=e=>{let t=jt(e.map(n=>n.coordinates));return Jt(t)},ke={init:()=>{Tn(),Qt(),Ln()},update:e=>{Kt?(_t(e),er(e)):Me=e}};var Je=yr(tr());var Pn=async()=>{let t=await(await fetch(“https://interactives.inquirer.com/pepper/2025-task-locations/data.json”)).json();t=t.nav,console.log(t);let r=(0,Je.default)();t=t.filter(i=>r.isAfter((0,Je.default)(`${i.date} 22:00`))),t=t.filter(i=>i.link);let n=document.querySelector(“.js-nav-links”);for(let i of t){i.text=`Episode ${i.episode}`;let o=xe(“js-nav-link-stub”);Te(o,i),n.appendChild(o)}},rr={init:()=>{Pn()}};var De,An=(e,t)=>{De=De||window.PMNdataLayer,De?De.push({event:”misc_event”,eventAction:e,eventLabel:t}):window.location.hostname.includes(“localhost”)?console.log(“Analytics event:”,e,t,”(not actually being sent due to localhost)”):console.log(“Failed to push analytics event”,e,t)},nr={event:(e,t)=>{An(e,t)}};var ir=1,Ye=class{constructor(t){this.el=t,this.contentPosition=”default”,this.possibleSteps=new Array,this.currentStep=null,this.offset=window.innerHeight*.5,this.instanceOfSteps=ir,this.hasMap=!!t.dataset.map,ir++,this.setOffset(),this.setPossibleSteps(),this.updateContent(),this.bindings()}setPossibleSteps(){this.el.querySelectorAll(“.js-steps-step”).forEach(t=>{t.dataset.step&&this.possibleSteps.push(t.dataset.step)})}bindings(){window.addEventListener(“scroll”,()=>{this.updateContent()}),window.addEventListener(“resize”,()=>{this.updateContent(),this.setOffset()})}setOffset(){window.innerWidth>960?this.offset=window.innerHeight*.5:this.offset=window.innerHeight*.8}updateContent(){this.updateCurrentStep()}updateCurrentStep(){let t,r;if(this.el.querySelectorAll(“.js-steps-step”).forEach((i,o)=>{i.getBoundingClientRect().top{let a=”is-“+o,d=”is-“+s;this.possibleSteps.indexOf(o){document.querySelectorAll(“.js-steps”).forEach(e=>{new Ye(e)})}};var En=()=>{},sr={init:()=>{En()}};var de,Ve,Ke=!0,kn=()=>{de=document.querySelectorAll(“.js-video-autoplay”)},Dn=()=>{window.addEventListener(“resize”,()=>{ar()}),window.addEventListener(“scroll”,()=>{ar()}),de.forEach(e=>{e.addEventListener(“volumechange”,t=>{e.muted!==Ke&&!dt()&&(Ke=e.muted,$n())})})},ar=()=>{let e;de.forEach((t,r)=>{let n=t.getBoundingClientRect(),i=n.height/2;n.y-i&&(e=t)}),e!==Ve&&(Ve=e,de.forEach(t=>{t.pause()}),e?e.play():Ve=null)},$n=()=>{de.forEach(e=>{e.muted=Ke})},lr={init:()=>{kn(),de&&Dn()}};var ur={init:()=>{st.init?.(),mt.init?.(),bt.init?.(),Mt.init?.(),Tt.init?.(),ke.init?.(),rr.init?.(),or.init?.(),sr.init?.(),lr.init?.(),ue.init?.()}};var zn=()=>{},cr={init:()=>{zn()}};var Bn=document.querySelector(“.js-inno”),hr=()=>{ur.init(),cr.init()};Bn?hr():new MutationObserver((t,r)=>{if(document.querySelector(“.js-inno”)){r.disconnect(),hr();return}}).observe(document,{attributes:!0,childList:!0,subtree:!0});})();
More than 30 years ago, Philadelphia was the battleground in a brutal mob war as a group of young mafia upstarts challenged the rule of the established La Cosa Nostra leadership.
Known as the Young Turks, that group consisted mostly of younger men who were the sons, brothers, and nephews of former crime family members who were dead or in prison, and was purportedly led by Joseph “Skinny Joey” Merlino and Michael “Mikey Chang” Ciancaglini. They believed that mob boss John Stanfa, a Sicilian immigrant who preferred to keep a low profile, was an outsider who was not fit to lead. Instead, their bloodlines and connections gave them the right to rule their hometown neighborhoods.
Now, a new docuseries from Netflix, Mob War: Philadelphia vs. The Mafia, examines that conflict, complete with interviews from the law enforcement agents and former mobsters who were there, vintage 1990s Philly TV news footage, and the perspective of a hitman-turned-informant who made headlines. The goal, said director Raïssa Botterman, is to show the human element behind the violence.
“They’ve committed crimes, but they’re still humans, and understanding who they were and having their versions of events” is important, she said. “Whether it’s fighting against crime or it’s committing crimes, [we’re] trying to get a more holistic picture of what’s going on.”
Notably missing from the series is Merlino, who Botterman said declined to participate. Merlino has long denied having been behind a faction of the city’s mob and has never been convicted of mob-related violence.
Likewise, Merlino declined through a representative to comment about Mob Wars.
Throughout the ’90s, mob violence regularly dominated Inquirer and Daily News headlines, and resulted in several high-profile deaths and criminal trials, and a new mob leader in the city.
By most accounts, the first strike in the brewing mob war happened in January 1992 with the killing of Felix “Tom Mix” Bocchino, a Stanfa loyalist, on the 1200 block of Mifflin Street. Bocchino, 73, was shot four times in his 1977 Buick, and authorities believed he was targeted by members of the Young Turks faction, according to an Inquirer report from the time.
Retaliation was swift. Two months later, gunmen attempted to assassinate Michael Ciancaglini at his home near 12th and McKean Streets — just steps south of where Bocchino was killed. In that incident, the Daily News reported, Ciancaglini was returning home from a basketball game when two men carrying shotguns began chasing him. He made it inside, and the gunmen fired shotgun blasts through the front door and window.
Ciancaglini was not injured, and neither were his wife and two children, who were inside the house. Law enforcement sources told the People Paper that Ciancaglini “had something to do with Bocchino’s death,” but Ciancaglini’s attorney maintained his client was in the dark about the attempt on his life.
“He don’t know why. He don’t know who. And he don’t know what,” attorney Joseph C. Santaguida told The Inquirer following the shooting.
In March 1993, almost exactly a year after the attempt on Michael Ciancaglini’s life, older brother Joseph Ciancaglini, 35, was shot at the Warfield Breakfast and Lunch Express in Grays Ferry. The attempted hit on Stanfa’s underboss was captured on FBI surveillance video.
Though he survived, Joseph Ciancaglini became permanently paralyzed.
On Aug. 5, 1993, the warfare arrived on the 600 block of Catharine Street with an afternoon shooting that injured Merlino and killed Michael Ciancaglini. The pair were walking down the block when two gunmen began firing, striking Merlino in the leg and buttocks, and Ciancaglini in the heart, reports from the time indicate. Ciancaglini died at Thomas Jefferson University Hospital, while Merlino was placed in stable condition at the Hospital of the University of Pennsylvania.
window.addEventListener(“message”,function(a){if(void 0!==a.data[“datawrapper-height”]){var e=document.querySelectorAll(“iframe”);for(var t in a.data[“datawrapper-height”])for(var r,i=0;r=e[i];i++)if(r.contentWindow===a.source){var d=a.data[“datawrapper-height”][t]+”px”;r.style.height=d}}});
The car used in the shooting, meanwhile, was found some 35 blocks away, burned to a crisp. It had been leased to Philip Colletti, a mob associate who later admitted his role in the crime.
Hundreds attended Ciancaglini’s viewing at the Carto Funeral Home at Broad and Jackson days later; some neighborhood residents were not surprised by his killing, The Inquirer reported.
“Why’d he get killed? The same reason the rest of these hoods in South Philly do,” said one South Philly hairdresser. “Most Italians are good, hard-working people, and these people give us a bad name.”
By the end of August 1993, the Young Turks struck back — this time with a botched assassination attempt on Stanfa himself that ended up wounding the mob boss’ son, Joseph, who was 23 and not involved with mafia activities.
That attempt took place during the morning rush hour as Stanfa and his son traveled from their home in Medford to their food importing business in South Philadelphia. As they drove toward the Vare Avenue off-ramp on the Schuylkill Expressway, gunmen ambushed them from a van that had been modified with makeshift gunports, allowing the assailants to fire from concealment.
The attackers, police later learned, had not cut eye holes in the van, and fired on the Stanfas wildly, missing their intended target. The younger Stanfa, however, was struck in the face, leaving a bullet lodged in his neck though he survived.
The van was found near 29th and Mifflin Streets as police attempted to reconstruct possible escape routes. It was littered with spent cartridges, and had “a number of punctures in it,” leading police to believe that a shooter lost control of his weapon, tearing bullet holes into the vehicle.
Stanfa’s vehicle, meanwhile, was heavily damaged, with at least 10 bullet holes running from the front hood to the right rear fender. A tire was shredded, and a window panel in the rear-passenger side — where Joseph had been sitting — was shattered. Stanfa, The Inquirer reported at the time, had his driver hide the car in the garage of the restaurant where Joseph Ciancaglini had been shot, requiring police to obtain a warrant to examine it.
“You’ve got to understand: This is an all-out mob war,” said Col. Justin J. Dintino, superintendent of the New Jersey State Police. ”They’re going to take their shot whenever the opportunity presents itself.”
In September 1993, the opportunity presented itself at the Melrose Diner, where Frank Baldino Sr., a reportedly low-level associate of the Young Turks, was shot to death in his car. His last meal was a $6.95 chopped steak dinner, the Daily News reported.
Gunmen approached Baldino’s vehicle, investigators said, and “pumped several bullets” through its closed window, striking him in the head and torso. The assailants fled west on Passyunk Avenue in a rainstorm, and Baldino died while en route to the hospital.
Baldino was not considered to be a major player in the local mob. His killing, friends and investigators said, was something of a shock — even former mobster Nicholas “Nicky Crow” Caramandi, who was in hiding at the time, denounced it.
“This guy was not a gangster,” Caramandi told The Inquirer. “He wouldn’t hurt anybody. He was not a threat. It should never have happened.”
Though mob violence cooled as 1993 wore on, it didn’t fully stop, and late one Friday in January 1994, police found John Veasey near Sixth and Sigel Streets, grievously injured.
He had three bullet wounds to his head, one to his chest, and seven stab wounds, having fought off his attackers in an assassination attempt in the apartment above a nearby meat store. Somehow Veasey, then 28, had survived, and was placed in critical but stable condition at Jefferson Hospital.
“He’s a tough kid,” one underworld source told The Inquirer. “He knows a lot, and what he knows can hurt a lot of people.”
Veasey, it turned out, had gone to the FBI days before and copped to the Ciancaglini and Baldino killings at the behest of his brother, William “Billy” Veasey, who had told him there was a contract out on John Veasey’s life.
His assailants, Veasey told police, were Stanfa loyalists Frank Martines and Vincent “Al Pajamas” Pagano, both of which later surrendered.
The pair, John Veasey said, had lured him to a mob-run “numbers house” under the guise of protecting him. But once inside, Martines pulled a gun and shot him in the head and chest, telling him, “Bye, John-John.” When that failed to kill Veasey, a battle ensued in which Veasey wrestled a knife away from Pagano, and used it to slash Martines in the eye.
“I have a real powerful neck, real, real big,” Veasey later said of his survival, according to a Daily News report. “I was not knocked out. It wasn’t sending any messages to the brain.”
Following the attack on Veasey, Stanfa and 23 associates were indicted on federal racketeering charges and imprisoned by March 1994. As the legal proceedings wore on, mob violence in the city trickled almost to a stop — with one notable exception.
On Oct. 5, 1995, just hours before Veasey was set to take the witness stand against Stanfa and his codefendants, his brother Billy was shot and killed on the 1700 block of Oregon Avenue.
Veasey was distraught, but his resolve to testify was hardened by the killing, law enforcement sources said. Five days later, he did just that.
Delivering his testimony in what The Inquirer called “South Philadelphia tough-guy jargon,” Veasey made the federal government’s case clear — in some cases, graphically so — for jurors. Calling himself a triggerman for Stanfa, he testified that the mob boss had given orders in 1993 to kill anyone who was aligned with Merlino and the Young Turks faction, and that a hit list with more than a dozen names had been circulated to mob members.
“A couple of [defense] lawyers tried to catch him up in semantics,” one federal source told The Inquirer of Veasey. “John doesn’t even know what semantics means.”
By November 1995, Stanfa and his associates were convicted on all counts, including murder, extortion, gambling, and kidnapping. Stanfa received five life sentences, and, at 84, remains in prison.
With that, the Young Turks had officially won the war. According to Inquirer and Daily News reports from the time, Ralph Natale had been installed as the head of the Philadelphia mob but focused his efforts on South Jersey, allegedly leaving Merlino and his cohorts to run South Philadelphia.
Following Natale’s arrest on a parole violation in 1998, Daily News and Inquirer reports from the time indicate, Merlino purportedly took over as acting mob boss, and later cut out Natale completely. Merlino himself was arrested on drug conspiracy charges in 1999, and Natale served as a government witness against him.
Ultimately, Merlino received a 14-year sentence after being convicted of racketeering. He was acquitted of drug trafficking and murder charges, the latter for which prosecutors initially considered pursuing the death penalty. With credit for two and a half years served, he was to spend nine more years in prison.
“It ain’t bad,” Merlino said of the verdict, according to an Inquirer report. “Nine’s better than a death penalty.”
“Mob Wars” is a three-part series on Netflix. Its release date is Wednesday, Oct. 22.
Hit man-turned-government informant John Veasey, whose testimony helped bring down mob boss John Stanfa and a dozen of his top associates in the 1990s, says he’s on the road to redemption.
The new Netflix docuseries Mob War: Philadelphia vs. The Mafia, now streaming, chronicles a violent 1990s power struggle in the local La Cosa Nostra through the eyes of investigators and former crime family members who were there.
Veasey, a South Philly native, was a central figure in the ’90s Philly mob, having admitted to participating in two high-profile murders. He went on to serve nearly 11 years in prison after becoming a government witness against Stanfa and other top mob associates in a federal racketeering trial, and was released in 2005. He has since denounced the mob life, and, in the Netflix series, calls joining the mafia the “worst decision” he ever made.
While he became a feared killer, Veasey was also something of a folk hero after Stanfa’s 1995 trial. The jury, according to Inquirer and Daily News reports from the time, was enamored with his frank and sometimes graphic testimony, which was a key component of federal prosecutors’ case against Stanfa and others.
Veasey agreed to become an FBI informant in January 1994 after his brother, William “Billy” Veasey, told him Stanfa had taken a contract out on his life, reports from the time indicate. In agreeing to work with federal authorities, Veasey admitted to being one of the shooters behind two then-recent mob killings: Michael “Mikey Chang” Ciancaglini and Frank Baldino Sr.
Ciancaglini was killed in August 1993 in a shooting that also wounded Joseph “Skinny Joey” Merlino. The pair were the purported leaders of the so-called “Young Turks” faction who opposed the rule of Stanfa, reports indicated. Merlino has long denied having been behind a faction of the city’s mob and has never been convicted of mob violence.
Ahead of that shooting, Veasey testified, Stanfa had given orders to “kill anybody aligned with Merlino” and circulated a list of about a dozen people who were to be killed. Veasey undertook the hit with fellow mob enforcer Philip Colletti in a white Ford Taurus that, shockingly, was leased in Colletti’s name.
Veasey also admitted to burning the vehicle, badly burning his hand in the process. Knowing he needed an explanation to have his injury treated, Veasey returned to his house and poured lighter fluid into a barbecue grill, and intentionally lit his injured hand on fire.
“I screamed and told the neighbors I had burned it trying to light the grill,” he told jurors during the Stanfa trial. The cover, he says in the Netflix docuseries, wasn’t a great one — the grill he used was electric, arousing the suspicion of police.
Likewise, Veasey was the triggerman in the killing of Frank Baldino Sr., a then-suspected low-level mob associate who was killed outside the Melrose Diner in September 1993.
Baldino was shot multiple times in his car in the diner’s parking lot, and died en route to Thomas Jefferson University Hospital. Veasey later tipped off authorities to the location of the murder weapons, which divers found in a pond at FDR Park in April 1994, reports from the time indicate.
The attempted murder of John Veasey
In January 1994, police found Veasey grievously injured near Sixth and Sigel Streets, having somehow survived a brutal assassination attempt in which he was shot four times and stabbed seven. The attempted murder, he later testified, was undertaken by Stanfa associates Frank Martines and Vincent “Al Pajamas” Pagano in an apartment above a meat store near where Veasey was found.
“One bullet fragmented in the back of my head. One went in the back and out through my forehead,” Veasey later said of the shooting. ”One hit the back of my head and bounced into my neck. And one is still in my chest, in my rib cage.”
His assailants, Veasey said, had targeted him because they believed he was working with the FBI — which he had been for a few days by the time the attack happened.
The shots failed to kill Veasey, who in the struggle wrestled a knife away from Pagano and used it to stab Martines near the eye. The ordeal lasted about 18 minutes, according to a Daily News report, and ended with Martines and Pagano letting Veasey go in exchange for their lives.
After he escaped, Veasey attempted to stop a car for help. But because of the way he looked, he said, no one would help him.
Eventually, police arrived but believed Veasey would die.
“I could hear them talking, saying I was DOA,” Veasey said. “I’m saying, ‘I’m alive, I’m alive. Everyone is giving up on me tonight.’”
Veasey later said he left the mob that night, putting his time in the mafia at just over five months, the Daily News reported. He had been recruited in August 1993, days before the Ciancaglini murder, after landing a job at a construction company owned by Stanfa’s brother-in-law.
“I wouldn’t recommend this life to an enemy,” he later said of the mob.
Hours before Veasey was set to take the stand for Stanfa’s trial in October 1995, his brother, Billy, was shot and killed on the 1700 block of Oregon Avenue. The killing, authorities speculated, could have been ordered by Stanfa as a way to silence Veasey, or by suspected Young Turks leader Merlino as revenge for the Ciancaglini and Baldino murders.
Ultimately, it only delayed Veasey’s testimony by five days.
From the stand, Veasey referred to himself as a triggerman and divulged his involvement with the murders of Ciancaglini and Baldino.
Veasey’s testimony at trial
In total, Veasey testified for about two and a half days, which he wrapped up with two pieces of information: That he refused to kill kids, and he did not like gambling. He also mocked Sergio Battaglia, a would-be Stanfa hit man who, despite going on a number of hits, never actually killed anyone, according to an Inquirer report.
Battaglia “went on a hundred hits and didn’t shoot nobody,” Veasey said.
He quickly became well-liked by the jury, who seemed to hang on his every word, The Inquirer reported. Among his more graphic accounts from the witness stand was the “drilling” of Joseph “Joe Fudge” DeSimone, a mob associate who had wanted to kill Veasey, to which Veasey took less-than-kindly.
Veasey testified that he had warned Stanfa of a coming altercation with DeSimone, and at one point persuaded another mob associate to bring DeSimone over to Veasey’s house to settle their dispute. Veasey was on house arrest at the time.
DeSimone arrived, kicking off a violent encounter with an electric drill.
“I smacked him in the face with the drill. I stuck the drill in his chest and in his legs. I stuck it in his head, and from the rotation of the drill, clumps of hair was going out,” Veasey testified. “Then I hit him in the knee with a baseball bat. I chambered the gun … gave it to him and asked, ‘Do you still want to kill me?’”
Veasey said that DeSimone declined.
The testimony was not only well received by jurors, but it was considered a success by prosecutors. Though violent, Veasey appeared relatable to the jury and seemed to have a secret weapon against the defense.
Former mob hit man John Veasey’s biography details his work for one of the city’s mob organizations, the hits he carried out, the attempt on his life, and more.
The reformed hit man
Stanfa was ultimately found guilty and sentenced to five consecutive life terms. Veasey, meanwhile, spent almost 11 years in prison, and was released in 2005. By 2012, he was back in the news, this time for a detailed account of his story in The Hit Man: A True Story of Murder, Redemption and the Melrose Diner, a book by former Inquirer reporter Ralph Cipriano.
By then, Veasey was working as a car salesman in the Midwest, and claimed to have turned over a new leaf.
“I never respected the Mafia or what it stood for,” Veasey said in an interview with The Inquirer in 2012. “My only regret was being dumb enough to join … I always said they either rat or kill each other.”
Amid persistently higher costs, three Philadelphia-area health systems have cut expenses over the last two years by changing how they account for investments in facilities and equipment. The change significantly boosted operating income in all three cases.
ChristianaCare and Main Line Health are now spreading the cost of buildings and building improvements over as many as 80 years, they said in their fiscal 2025 audited financial statements. That is double the maximum number of years they previously used to calculate what accountants call depreciation expense. Thomas Jefferson University made a similar change last year.
All three health systems use PricewaterhouseCoopers LLP as their auditor. The firm, which did not respond to a request for comment, also has Philadelphia health-system clients that have not extended their depreciation schedules.
The term depreciation expense refers to the way hospitals and other businesses allocate the cost of a building, a piece of equipment such as an MRI machine, or even software to manage patient records across the number of years the asset is likely to be used.
It’s a noncash expense because the money used to make the purchase is recorded elsewhere in the financial statements. Several financial and accounting experts said the change could be seen as cosmetic.
“It’s not affecting operations. It’s not increasing their revenues. It’s not decreasing their cash expenditures. It is purely a bookkeeping entry,” said Steven Balsam, a professor of accounting at Temple University’s Fox School of Business.
Main Line Health
At Main Line, the extended depreciation schedule reduced the expense by an estimated $37.5 million. That helped the system achieve a small, $4 million operating profit for the first time since fiscal 2021, when federal COVID-19 aid buoyed hospitals.
Without the depreciation savings, Main Line would have had an operating loss of $33.5 million in the year that ended June 30, compared to a $61 million operating loss in fiscal 2024.
Asked for comment, Main Line’s chief financial officer Leigh Ehrlich noted that the system’s financial performance had improved, thanks to “increased patient volumes and continued focus on expense management.”
Excluding noncash depreciation and amortization in each of the last two years, Main Line’s operating income improved to $127.8 million from $96.7 million.
ChristianaCare
ChristianaCare reviewed the depreciation schedules of fixed assets “as part of our ongoing commitment to maintain accurate and reliable financial reporting,” the nonprofit’s chief financial officer Rob McMurray said in an email. The result was a $24.4 million reduction in depreciation expense.
The review also resulted in a $9 million write-off of unspecified assets, which meant that in fiscal 2025 the benefit to operating income was $15 million, McMurray said.
ChristianaCare’s operating income in the year that ended June 30 was $35.5 million, or $20.5 million without the accounting change. The organization had $126.2 million in operating income in fiscal 2024.
Thomas Jefferson University
Last year, Thomas Jefferson University opened its $762 million Honickman Center in Philadelphia. Normally, taking a building like that into service would increase depreciation expense.
Instead, Jefferson’s depreciation expense fell by $68 million, according to its audited financial statement for the year that ended June 30, 2024. The decline happened after Jefferson opted to spread the cost of all buildings and building improvements over as many as 70 years, according to the depreciation schedule in its financial statement.
Even with the depreciation change, Jefferson’s operating income in fiscal 2024 was extremely narrow, at $1.34 million on nearly $10 billion in revenue that year.
The benefit of lower depreciation expense continued in fiscal 2025, as it will in future years for ChristianaCare and Main Line.
Depreciation expense at other local systems
Most Philadelphia-area health systems use a schedule for depreciating buildings and building improvements that maxes out at 40 years, an Inquirer review of financial statements found.
“You’re constantly modernizing your facilities to allow for the delivery of medicine based on current times,” Temple University Health System chief financial officer Jerry Oetzel said in an interview. “Who knows 15 years from now? We don’t have clear insight, but it’s probably going to be more home care.”
That’s why Temple hasn’t adopted a longer depreciation schedule. “It’s just a savings in operating expenses without the benefit of any cash behind it,” Oetzel said.
Editor’s note: This article has been updated to remove a reference to American Hospital Association guidelines.
An antiquated industrial building at 142-144 N. Broad St. is being converted to 99 apartments and over 4,000 square feet in restaurant space.
The seven-story building previously served as a car showroom with vehicle elevators and a factory. It has been empty for years.
“It’s gone through a couple of owners,” said Carolina Pena, principal at Parallel Architecture Studio, which is working on the project. “We’re doing an interior renovation. There are no additions proposed. We’re trying to retrofit the existing garage into apartments.”
The building’s previous owner, John Wei, has been selling off property across the Callowhill area in recent years in the face of mounting financial difficulties. He purchased 142-144 N. Broad in 2022 for $7 million.
The property sold in August for $6.2 million to a company called Penn Hall Investment LLC.
In zoning applications filed with the city earlier this month, the owners are listed as Qiaozhen Huang and Yizhou Li with their business address as 300 E. Allegheny Ave. in Kensington.
Philadelphia-based Parallel Architecture Studio, which is designing the project for the latest developers, also served as the architect for an earlier iteration of the property, when Wei sought to use it to house a 115-room hotel.
Pre-pandemic permits show a proposal for an even larger hotel from another developer and architect.
“It’s more stable financially this way,” said Pena, of Parallel Architecture. “It’s harder to get financing for hotels than to get financing for apartments.”
Pena projects a construction timeline of 18 to 24 months. The apartments will be designed for single-person households.
“We have some studios, some one-bedrooms,” Pena said. “They’ll be around 600 square feet.”
A view of 142-44 N. Broad St. (black PARK sign). Zoning permits have been pulled for a conversion of the long-vacant tower to residential and restaurant use.
The current Penn Hall project does not require any action from the zoning board because 142 N. Broad St. is in the most flexible zoning district in the city.
Bicycle parking and four automobile spaces will be available in the tower’s existing small underground parking facility.
In 2017, the city issued an “unsafe structure” violation for the building, but the owners at the time shored it up. No violation of that magnitude has been issued since.
The development along North Broad Street has been advancing at a slow but steady pace since the Great Recession.
Philadelphia developer Eric Blumenfeld’s string of popular projects along the thoroughfare, including The Met and the Divine Lorraine, started the redevelopment trend.
Other developers such as Alterra Property Group have added hundreds of new apartments to the area, and the Philadelphia Ballet’s new building is opening soon. Closer to City Hall at the shuttered Hahnemann University Hospital, Dwight City Group plans 288 apartments.
We’ve all been there. The game is finished, now it’s time for you to run your own play: Escape the Linc. So what’s the fastest way out of the sports complex? Naturally we decided to settle this age-old debate with a race.
On Sunday, Oct. 5, Inquirer staffers braved the post-Eagles game crowds to test five ways to beat the rush. They began on foot at Xfinity Gate and their destination was a neutral location far enough to test postgame traffic across the city – Dalessandro’s in Roxborough, where they would be rewarded with a bracket-winning cheesesteak.
story continues after advertisement
Meet our racers and their modes of transportation:
ARIEL SIMPSON
Ariel grabbed a rideshare.
HENRY SAVAGE
Henry parked in Lot Q.
JASEN LO
Jasen hopped on his bike.
JULIE ZEGLEN
Julie parked in FDR Park.
JOHN DUCHNESKIE
John rode SEPTA.
Loading…
TIME ELAPSED
ARIEL
HENRY
JASEN
JOHN
JULIE
ARIEL
HENRY
JASEN
JOHN
JULIE
Five minutes after the conclusion of the Eagles’ 21-17 loss to the Denver Broncos, fans rush out of Lincoln Financial Field and it’s time to Escape the Linc. The race is on and our competitors head their separate ways.
JASEN
Bicycle
I strategically locked my bike to a street sign just a few feet away from the starting point. I’m motivated by my stinging defeat two years ago in the Race to the Shore, when I finished last despite a two-hour head start. I’m feeling good about my chances today though.
ARIEL
Rideshare
Weaving my way through fans, I order an Uber at the corner of the rideshare lot and quickly receive a call from my Uber driver. “I’m across the street, can you just meet me here?” the driver asks.
Of course, I agree. First place is starting to feel more achievable. Skipping the rideshare lot entirely, I am in his car four minutes later. I have never been this lucky getting an Uber after a game.
JOHN
SEPTA
I scurry to NRG Station, along with some of the 15,000 to 17,000 fans who use the Broad Street Line to get home after Eagles games. I make it to the station in 10 minutes. The intercom is announcing that one of the 10 Sports Express trains is now boarding. The express train is packed. There’s a single standing-room spot by one of the train doors, and I snag it. The doors close, and a sweaty mass of disappointed Eagles fans is off.
HENRY
Car from Q Lot
I parked in Lot Q specifically due to its distance from the major traffic chaos, and if you can beat the rush, you can get out of the direct stadium traffic. But I’m taking a car on I-95, so getting out of stadium traffic is only the beginning.
story continues after advertisement
JULIE
Car from FDR Park
I’m a pretty fast walker, but it takes me 17 minutes to get back to FDR Park, where I’d paid $50 to park. Henry has probably already left Lot Q! Though I’m not-so-secretly rooting for John and public transportation to win it all, I’d like to beat the other driver, for the sake of my pride.
Also, something I hope other competitors aren’t contending with: angry drivers, like the guy behind me who appears to be screaming as he pounds on his steering wheel. But let’s be real, they probably are. That game sucked.
ARIEL
Rideshare
It’s never gone this smoothly leaving an event at the South Philadelphia Sports Complex. Because of the speed and location of my Uber pickup, at the end of the normal pickup area, I am able to avoid most of the Eagles traffic. We made it onto I-95 less than 15 minutes after the race started and now we’re quickly making our way north toward the Vine Street Expressway.
It’s been 20 minutes since our racers set off from Xfinity Gate and the contestants are spread across the city. Jasen is out ahead, but Ariel is close behind. John is already at City Hall and about to transfer to Regional Rail. But our drivers, Julie and Henry, are still making their way toward I-76 and I-95, respectively.
JOHN
SEPTA
Feeling good about my chances, I stroll into Jefferson Station, look up at the board for the train schedules, and see that the 5:10 p.m. Regional Rail train on the Manayunk-Norristown Line is canceled. My heart sinks. It’s all over. I’ll be the biggest loser.
The Route 32 bus could be my lifeline, but it’s scheduled to leave City Hall in two minutes. I rush outside onto Market Street, and then, to my surprise, I’m doing something I’ve tried to avoid my entire life. I’m running.
JASEN
Bicycle
I bypass the Schuylkill River Trail in favor of MLK Drive, which is closed to motorized traffic on the weekends during the warm-weather months. Instead of having to pass pedestrians and slower cyclists on the trail, I can safely speed as fast as I can in pursuit of cheesesteak victory. My plan is only made possible thanks to the timely opening of the MLK Bridge, which reopened to the public in September, after three years of refurbishment.
ARIEL
Rideshare
We hit some traffic as we get onto I-76, and I take in the scenes of the Philadelphia Art Museum as we slow to a crawl on the Schuylkill Expressway. The slowdown hardly matters though, and we are already approaching Manayunk.
JOHN
SEPTA
Why does it seem that the only time a SEPTA bus is on time is when you need it to be late?
I miss the 4:56 p.m. bus leaving City Hall, and my options are dwindling. My best bet is to stay where I am and wait for the next Route 32 bus to roll around in about a half hour. That would get me to Dalessandro’s after 6 p.m., when I presume my fellow contestants will be polishing off their cheesesteaks.
JULIE
Car from FDR Park
It takes about 15 minutes to get from Pattison Avenue to Penrose Avenue to 26th Street. From there, my co-pilot, Ben, and I make our way to I-76 fairly easily, albeit slowly. This is not fun! There’s definitely residual game traffic, even farther out. But at least we’re moving.
HENRY
Car from Q Lot
The ride – or wait – along Oregon Avenue takes nearly 20 solid minutes of standstill traffic. Drivers are constantly speeding past lines of cars only to try and nudge their way back into the lane farther down the road. It takes seven minutes just to traverse the exit from Front Street onto I-95.
JULIE
Car from FDR Park
We pass the University City exit and I briefly fantasize about ditching the competition and heading home to West Philly. The will to beat Henry wins out. I really should have eaten before embarking on this trek. I start to feel carsick.
Meanwhile, SEPTA is causing its own chaos for John. And farther north, Ariel and Jasen are leading the pack.
ARIEL
Rideshare
I arrive at Dalessandro’s in just 48 minutes. The ride cost $73.47, before tip. Despite an Eagles loss, the cheesesteak sure did taste sweet after the win.
JASEN
Bicycle
I can’t help but think that the race planners chose Dalessandro’s just because it sits on a steep hill range, the same one that cycling legends have climbed in the storied Philadelphia International Cycling Classic. I’m only less than a mile away, but climbing up Ridge Avenue is tough going given the roughly 250 feet of elevation gain.
JASEN
Bicycle
Coming down Walnut Lane, I wait to cross Henry Avenue at a stoplight — for what feels like an eternity, thanks to the ridiculous configuration of this four-lane highway. As soon as the light turns green, I zip across and catch my first glimpse of our photographer. Mistakenly thinking my legs had won the day, I hoot and holler — only to spot Ariel taking a video of me. Private equity takes the crown today. I’ll settle for second. My ride took 56 minutes.
JOHN
SEPTA
At 5:32 p.m. — and right on time, despite my low expectations — my chariot arrives.
story continues after advertisement
JULIE
Car from FDR Park
Henry and I are neck-and-neck, according to the Slack chat where we’re sharing updates, and Dalessandro’s is in view. Ben and I hit a red light at the intersection of Walnut Lane and Henry Avenue and have a quick decision to make: turn left onto Henry, or stay straight for another block. I’m seized by a sudden, urgent, competitive rush. I will roll out of this car to get third place! The light changes. Ben follows Google Maps and says it’ll be easier to find parking on Wendover Street. He’s right, but we waste precious seconds making two (!) left turns.
JULIE
Car from FDR Park
We park halfway down the block. I throw open the car door and sprint up Wendover. I round the corner and see Jasen, Ariel — and no Henry. Victory is mine! That’s bronze, baby.
HENRY
Car from Q Lot
It’s the final leg and the final boss of this race in a car — finding a parking spot near one of the top cheesesteak tourist traps. I pass the restaurant and am lucky to find a spot across the street. Little did I know that right as I passed the restaurant, Julie was making her final sprint up Wendover Street.
Henry arrives at Dalessandro’s 1 hour and 14 minutes after leaving the Linc.
While the other racers celebrate with cheesesteaks (in Henry’s case, a vegan cheesesteak he picked up from Triangle Tavern), John steadily brings up the rear on the bus.
JOHN
SEPTA
Finally. After a smooth and uneventful 36-minute ride, I hop off the bus, steps away from Dalessandro’s. My fellow contestants have been waiting for me, with a curious mix of relief and pity. I realize that if I had gone straight to the bus stop after getting off the subway, I would have come in third — behind Ariel with her expensive Uber trip and Jasen on his bicycle, but ahead of Julie and Henry with their cars.
In a shocking upset, at least in the mind of trending sports reporter ARIEL SIMPSON, the rideshare won. She was in her rideshare within 10 minutes of the start of the race. She finished in first place, making it to Dalessandro’s in just 48 minutes. All for the low price of $73.47, before tip … one way.
Riding his bike, JASEN LO was close behind, finishing in 56 minutes. If you’re able to bike to the game, you’ll avoid pedestrian and vehicle traffic. Although some hills in Philly can prove to be a serious workout.
JULIE ZEGLEN and HENRY SAVAGE both drove and paid $50 to park. Julie walked about a mile to her car and had to deal with less stop-and-go traffic than Henry. Henry was parked closer to the stadium, but spent half of his trip crawling through traffic. The difference was marginal, though. Julie’s trip took 1 hour and 12 minutes and Henry’s trip took 1 hour and 14 minutes.
John Duchneskie regales his competition with tales from his journey on SEPTA.Bastiaan Slabbers
After a strong start on the Broad Street Express, a canceled train stalled JOHN DUCHNESKIE and he had to wait 30 minutes for the next bus to take him north to Manayunk. His trip took 1 hour and 43 minutes.
After this completely scientific test, how should you Escape the Linc? You’re going to need some combination of luck, money, or physical exertion. For everyone else, there are traffic jams and the seemingly endless wait for the Route 32 bus.
Staff Contributors
Design and Development: Aileen Clarke
Reporting: Ariel Simpson, Henry Savage, Jasen Lo, John Duchneskie, Julie Zeglen
Editing: Sam Morris, Aileen Clarke, and Matt Mullin
Photography: Bastiaan Slabbers
Photo Editing: David Maialetti
Copy Editing: Jim Swan
Subscribe to The Philadelphia Inquirer
Our reporting is directly supported by reader subscriptions. If you want more journalism like this story, please subscribe today
“;if(e)return Promise.resolve(i);if(t){t(null,i);return}return i}if(e)return Promise.reject(n);if(t){t(n);return}throw n}}function yn(r,e){return(t,n,i)=>{typeof n==”function”&&(i=n,n=null);let s={…n};n={…m.defaults,…s};let o=pi(n.silent,n.async,i);if(typeof t>”u”||t===null)return o(new Error(“marked(): input parameter is undefined or null”));if(typeof t!=”string”)return o(new Error(“marked(): input parameter is of type “+Object.prototype.toString.call(t)+”, string expected”));if(ui(n),n.hooks&&(n.hooks.options=n),i){let a=n.highlight,l;try{n.hooks&&(t=n.hooks.preprocess(t)),l=r(t,n)}catch(c){return o(c)}let u=function(c){let f;if(!c)try{n.walkTokens&&m.walkTokens(l,n.walkTokens),f=e(l,n),n.hooks&&(f=n.hooks.postprocess(f))}catch(p){c=p}return n.highlight=a,c?o(c):i(null,f)};if(!a||a.length{a(c.text,c.lang,function(f,p){if(f)return u(f);p!=null&&p!==c.text&&(c.text=p,c.escaped=!0),h–,h===0&&u()})},0))}),h===0&&u();return}if(n.async)return Promise.resolve(n.hooks?n.hooks.preprocess(t):t).then(a=>r(a,n)).then(a=>n.walkTokens?Promise.all(m.walkTokens(a,n.walkTokens)).then(()=>a):a).then(a=>e(a,n)).then(a=>n.hooks?n.hooks.postprocess(a):a).catch(o);try{n.hooks&&(t=n.hooks.preprocess(t));let a=r(t,n);n.walkTokens&&m.walkTokens(a,n.walkTokens);let l=e(a,n);return n.hooks&&(l=n.hooks.postprocess(l)),l}catch(a){return o(a)}}}function m(r,e,t){return yn(Z.lex,N.parse)(r,e,t)}m.options=m.setOptions=function(r){return m.defaults={…m.defaults,…r},Vr(m.defaults),m};m.getDefaults=gn;m.defaults=ee;m.use=function(…r){let e=m.defaults.extensions||{renderers:{},childTokens:{}};r.forEach(t=>{let n={…t};if(n.async=m.defaults.async||n.async||!1,t.extensions&&(t.extensions.forEach(i=>{if(!i.name)throw new Error(“extension name required”);if(i.renderer){let s=e.renderers[i.name];s?e.renderers[i.name]=function(…o){let a=i.renderer.apply(this,o);return a===!1&&(a=s.apply(this,o)),a}:e.renderers[i.name]=i.renderer}if(i.tokenizer){if(!i.level||i.level!==”block”&&i.level!==”inline”)throw new Error(“extension level must be ‘block’ or ‘inline’”);e[i.level]?e[i.level].unshift(i.tokenizer):e[i.level]=[i.tokenizer],i.start&&(i.level===”block”?e.startBlock?e.startBlock.push(i.start):e.startBlock=[i.start]:i.level===”inline”&&(e.startInline?e.startInline.push(i.start):e.startInline=[i.start]))}i.childTokens&&(e.childTokens[i.name]=i.childTokens)}),n.extensions=e),t.renderer){let i=m.defaults.renderer||new ye;for(let s in t.renderer){let o=i[s];i[s]=(…a)=>{let l=t.renderer[s].apply(i,a);return l===!1&&(l=o.apply(i,a)),l}}n.renderer=i}if(t.tokenizer){let i=m.defaults.tokenizer||new ve;for(let s in t.tokenizer){let o=i[s];i[s]=(…a)=>{let l=t.tokenizer[s].apply(i,a);return l===!1&&(l=o.apply(i,a)),l}}n.tokenizer=i}if(t.hooks){let i=m.defaults.hooks||new le;for(let s in t.hooks){let o=i[s];le.passThroughHooks.has(s)?i[s]=a=>{if(m.defaults.async)return Promise.resolve(t.hooks[s].call(i,a)).then(u=>o.call(i,u));let l=t.hooks[s].call(i,a);return o.call(i,l)}:i[s]=(…a)=>{let l=t.hooks[s].apply(i,a);return l===!1&&(l=o.apply(i,a)),l}}n.hooks=i}if(t.walkTokens){let i=m.defaults.walkTokens;n.walkTokens=function(s){let o=[];return o.push(t.walkTokens.call(this,s)),i&&(o=o.concat(i.call(this,s))),o}}m.setOptions(n)})};m.walkTokens=function(r,e){let t=[];for(let n of r)switch(t=t.concat(e.call(m,n)),n.type){case”table”:{for(let i of n.header)t=t.concat(m.walkTokens(i.tokens,e));for(let i of n.rows)for(let s of i)t=t.concat(m.walkTokens(s.tokens,e));break}case”list”:{t=t.concat(m.walkTokens(n.items,e));break}default:m.defaults.extensions&&m.defaults.extensions.childTokens&&m.defaults.extensions.childTokens[n.type]?m.defaults.extensions.childTokens[n.type].forEach(function(i){t=t.concat(m.walkTokens(n[i],e))}):n.tokens&&(t=t.concat(m.walkTokens(n.tokens,e)))}return t};m.parseInline=yn(Z.lexInline,N.parseInline);m.Parser=N;m.parser=N.parse;m.Renderer=ye;m.TextRenderer=Pe;m.Lexer=Z;m.lexer=Z.lex;m.Tokenizer=ve;m.Slugger=Re;m.Hooks=le;m.parse=m;var vs=m.options,ys=m.setOptions,ws=m.use,xs=m.walkTokens,bs=m.parseInline;var ks=N.parse,Ss=Z.lex;var wn=1,Xe=class{constructor(e){this.el=e,this.contentPosition=”default”,this.possibleSteps=new Array,this.currentStep=null,this.offset=window.innerHeight*.9,this.focus={},this.zoom={},this.instanceOfSteps=wn,wn++,this.setPossibleSteps(),this.updateContent(),this.bindings()}setPossibleSteps(){this.el.querySelectorAll(“.js-steps-step”).forEach(e=>{e.dataset.step&&(this.possibleSteps.push(e.dataset.step),this.focus[“is-“+e.dataset.step]=e.dataset.focus.split(“,”).map(t=>t.trim()),this.zoom[“is-“+e.dataset.step]=e.dataset.zoom)})}bindings(){window.addEventListener(“scroll”,()=>{this.updateContent()}),window.addEventListener(“resize”,()=>{this.updateContent()})}updateContent(){this.updateCurrentStep(),this.findExactTime()}updateCurrentStep(){let e;if(this.el.querySelectorAll(“.js-steps-step”).forEach((n,i)=>{n.getBoundingClientRect().top{let o=”is-“+i,a=”is-“+s;this.possibleSteps.indexOf(i)s.dataset.step==this.currentStep.replace(“is-“,””)),n=e[t],i=e[t+1];if(i){let s=n.getBoundingClientRect().top,o=i.getBoundingClientRect().top,a=o-s,u=1-(o-this.offset)/a,h=parseInt(n.dataset.time),f=parseInt(i.dataset.time)-h,p=Math.round(f*u),b=h+p;Q.updateTime(b)}else{let s=parseInt(n.dataset.time);Q.updateTime(s)}}else{let e=this.el.querySelector(“.js-steps-step”),t=parseInt(e.dataset.time);Q.updateTime(t)}}},xn={init:()=>{document.querySelectorAll(“.js-steps”).forEach(r=>{new Xe(r)})}};var gi=(r,e,t)=>{document.querySelectorAll(“.js-subscribe”).forEach(n=>{n.classList.toggle(“is-unsubscribed”,!r),n.classList.toggle(“is-preview”,e),n.classList.toggle(“is-dev”,t)})},bn={init:()=>{gi(ke(),Se(),ue())}};var di=()=>{},kn={init:()=>{di()}};var Sn={init:()=>{ct.init?.(),ie.init?.(),yt.init?.(),bt.init?.(),Tt.init?.(),Q.init?.(),xn.init?.(),bn.init?.(),kn.init?.(),X.init?.()}};var mi=()=>{},Tn={init:()=>{mi()}};var vi=document.querySelector(“.js-inno”),zn=()=>{Sn.init(),Tn.init()};vi?zn():new MutationObserver((e,t)=>{if(document.querySelector(“.js-inno”)){t.disconnect(),zn();return}}).observe(document,{attributes:!0,childList:!0,subtree:!0});})();