Across many sports there has been lots of research into home-field advantage. It’s clear that it exists, that it is more prevalent in some sports compared to others and that it has been declining over time. In soccer, this fall away in home-field advantage appears tied to the fall in total goals scored per game. Oliver Roeder and I discussed this in this fivethirtyeight piece. I also chatted about home-field advantage across more soccer leagues in this NPR interview.

Given this historical trend, the results of Burnley Football Club in England’s Premier League appear to be extraordinary. At the time of writing (Jan 17 2017) Burnley have played 21 games and have 26 points - but only 1 point came away from home. Just how extraordinary is this?

Fortunately (or unfortunately depending on your perspective) I have collected every single English soccer league game result in history and put them into an R package -engsoccerdata. And if you’re going to go to that trouble, you may as well make use of it.

It turns out that this question is a nice exercise in using the tidyverse suite of packages (dplyr, tidyr and ggplot in particular) to find out. So, I wrote up how I did it as a mini-tutorial. If you want to flex your tidyverse skills, then there are a couple of exercises at the bottom.


Is Burnley’s 2016 home record exceptional?

The engsoccerdata package contains several datasets. We’ll use england that contains every result from the 1888/89 season to the 2015/16 season. This package is on CRAN. If you use the latest version on GitHub then you can also use the england_current() function to automatically bring in data from the most current (2016/17) season.

We use rbind to bind these two datasets together and then only keep the top-tier results. Next, we use the homeaway() function that is in engsoccerdata to reshape the dataset to list the home and away results of every team in the same dataframe.


library(tidyverse)
library(engsoccerdata)
df <- rbind(england, england_current()) %>%  
        filter(tier==1) %>%
        homeaway()
df$Date <-  as.Date(as.character(df$Date))
head(df)
        Date Season            team                     opp gf ga division tier venue
1 1888-09-08   1888 Accrington F.C.                 Everton  1  2        1    1  away
2 1888-09-15   1888 Accrington F.C.        Blackburn Rovers  5  5        1    1  away
3 1888-09-22   1888 Accrington F.C.            Derby County  1  1        1    1  away
4 1888-09-29   1888 Accrington F.C.              Stoke City  4  2        1    1  away
5 1888-10-06   1888 Accrington F.C. Wolverhampton Wanderers  4  4        1    1  home
6 1888-10-13   1888 Accrington F.C.            Derby County  6  2        1    1  home
tail(df)
            Date Season                    team             opp gf ga division tier venue
95475 2012-04-11   2011 Wolverhampton Wanderers         Arsenal  0  3        1    1  home
95476 2012-04-14   2011 Wolverhampton Wanderers      Sunderland  0  0        1    1  away
95477 2012-04-22   2011 Wolverhampton Wanderers Manchester City  0  2        1    1  home
95478 2012-04-28   2011 Wolverhampton Wanderers    Swansea City  4  4        1    1  away
95479 2012-05-06   2011 Wolverhampton Wanderers         Everton  0  0        1    1  home
95480 2012-05-13   2011 Wolverhampton Wanderers  Wigan Athletic  2  3        1    1  away


Now we do the bulk of the data analysis. We first want to add a column that has the ‘game number’ for each team in each season - i.e. is it the 1st, 2nd, 3rd, 4th game etc. We do this because we want to know if teams up to the 21st game of the season have a more extreme home record in terms of points than 2016/17 Burnley.

After we keep all games for each team up to their 21stgame, we then calculate the home and away points for each team in each season up to that point. Here, we assume 3 points for a win to make sure all seasons can be compared. The next task is to reshape the data so each row is a team/Season combination and the away and home points are in separate columns. We use spread from tidyr. It’s then very trivial to calculate the total points and the percent of points gained at home by each team in each season. Finally, we ungroup and arrange the dataframe to show us the top 10 results.

df1 <- df %>% 
  group_by(team,Season) %>% 
  arrange(Date) %>% 
  mutate(gameno = row_number()) %>% 
  filter(gameno<=21) %>%
  group_by(team,venue,Season) %>% 
  summarise(totalpts = 3*sum(gf>ga)+sum(gf==ga)) %>%
  spread(venue,totalpts) %>%
  mutate(totalpts = away+home, pcthome = home/totalpts) %>%
  ungroup() %>%
  arrange(-pcthome)
head(df1,10)
# A tibble: 10 C 6
                      team Season  away  home totalpts   pcthome
                    <fctr>  <dbl> <dbl> <dbl>    <dbl>     <dbl>
1             Derby County   1926     0    25       25 1.0000000
2                Liverpool   1953     0    20       20 1.0000000
3        Manchester United   1930     0     8        8 1.0000000
4        Manchester United   1936     0    17       17 1.0000000
5      Queens Park Rangers   2014     0    19       19 1.0000000
6                  Burnley   2016     1    25       26 0.9615385
7        Nottingham Forest   1895     1    25       26 0.9615385
8               Stoke City   1893     1    25       26 0.9615385
9  Wolverhampton Wanderers   1894     1    24       25 0.9600000
10            Notts County   1901     1    22       23 0.9565217


Interestingly, Burnely in 2016/17 are up there - but they aren’t the most extreme. Derby County in 1926/27 had 25 points from 21 games with all of them coming at home. They did win their next away game though and ended up winning 3 games and drawing 3 games.

I checked this using this code: england %>% filter(Season==1926) %>% homeaway() %>% filter(team=="Derby County").

To get an idea of how exceptional all of these home records are, let’s make a histogram of “percent points at home” across all teams in all seasons:

ggplot(df1, aes(pcthome)) +
  geom_histogram(binwidth = 0.01, fill="dodgerblue", color='blue4') +
  geom_vline(xintercept=0.5, color="red", lty=2)+
  xlab("Percent") +
  ggtitle("Percent of total points coming at home after 21 games")


This is pretty much what we expected. The majority of teams get most of their points at home. However, there are some very intriguing teams that have woeful home records - who are these teams? We can find out by simply arranging the pcthome variable in the reverse order.

df1 %>% 
  arrange(pcthome) %>% 
  head(10)
# A tibble: 10 C 6
               team Season  away  home totalpts   pcthome
             <fctr>  <dbl> <dbl> <dbl>    <dbl>     <dbl>
1    Crystal Palace   1997    19     4       23 0.1739130
2  Bolton Wanderers   2011    12     4       16 0.2500000
3        Sunderland   1981    12     5       17 0.2941176
4   West Ham United   2002    11     5       16 0.3125000
5           Chelsea   1986    13     6       19 0.3157895
6       Aston Villa   2013    15     8       23 0.3478261
7           Chelsea   1965    22    12       34 0.3529412
8      Norwich City   1993    22    12       34 0.3529412
9        Portsmouth   2007    22    12       34 0.3529412
10  West Ham United   1988    11     6       17 0.3529412


The most notable thing about this table is that all of these occurrences are relatively recent.


EXERCISES:

If you want to try out your data munging skills, try this:


To get in touch with me please use twitter or email: jc3181 AT columbia DOT edu.

LS0tDQp0aXRsZTogIkhvdyBFeHRyYW9yZGluYXJ5IGlzIEJ1cm5sZXkncyBIb21lIHZzIEF3YXkgUmVjb3JkIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6IEphbWVzIFAuIEN1cmxleQ0KZGF0ZTogMTcgSmFuIDIwMTcNCi0tLQ0KDQpBY3Jvc3MgbWFueSBzcG9ydHMgdGhlcmUgaGFzIGJlZW4gbG90cyBvZiByZXNlYXJjaCBpbnRvIGhvbWUtZmllbGQgYWR2YW50YWdlLiBJdCdzIGNsZWFyIHRoYXQgaXQgZXhpc3RzLCB0aGF0IGl0IGlzIG1vcmUgcHJldmFsZW50IGluIHNvbWUgc3BvcnRzIGNvbXBhcmVkIHRvIG90aGVycyBhbmQgdGhhdCBpdCBoYXMgYmVlbiBkZWNsaW5pbmcgb3ZlciB0aW1lLiBJbiBzb2NjZXIsIHRoaXMgZmFsbCBhd2F5IGluIGhvbWUtZmllbGQgYWR2YW50YWdlIGFwcGVhcnMgdGllZCB0byB0aGUgZmFsbCBpbiB0b3RhbCBnb2FscyBzY29yZWQgcGVyIGdhbWUuICBPbGl2ZXIgUm9lZGVyIGFuZCBJIGRpc2N1c3NlZCB0aGlzIFtpbiB0aGlzIGZpdmV0aGlydHllaWdodCBwaWVjZV0oaHR0cHM6Ly9maXZldGhpcnR5ZWlnaHQuY29tL2ZlYXR1cmVzL2hvbWUtZmllbGQtYWR2YW50YWdlLWVuZ2xpc2gtcHJlbWllci1sZWFndWUvKS4gSSBhbHNvIGNoYXR0ZWQgYWJvdXQgaG9tZS1maWVsZCBhZHZhbnRhZ2UgYWNyb3NzIG1vcmUgc29jY2VyIGxlYWd1ZXMgaW4gW3RoaXMgTlBSIGludGVydmlld10oaHR0cDovL3d3dy53YnVyLm9yZy9vbmx5YWdhbWUvMjAxNS8xMS8yOC9ob21lLWZpZWxkLWFkdmFudGFnZS1lcGwtY3VybGV5KS4NCg0KR2l2ZW4gdGhpcyBoaXN0b3JpY2FsIHRyZW5kLCB0aGUgcmVzdWx0cyBvZiBCdXJubGV5IEZvb3RiYWxsIENsdWIgaW4gRW5nbGFuZCdzIFByZW1pZXIgTGVhZ3VlIGFwcGVhciB0byBiZSBleHRyYW9yZGluYXJ5LiBBdCB0aGUgdGltZSBvZiB3cml0aW5nIChKYW4gMTcgMjAxNykgQnVybmxleSBoYXZlIHBsYXllZCAyMSBnYW1lcyBhbmQgaGF2ZSAyNiBwb2ludHMgLSBidXQgb25seSAxIHBvaW50IGNhbWUgYXdheSBmcm9tIGhvbWUuICBKdXN0IGhvdyBleHRyYW9yZGluYXJ5IGlzIHRoaXM/DQoNCkZvcnR1bmF0ZWx5IChvciB1bmZvcnR1bmF0ZWx5IGRlcGVuZGluZyBvbiB5b3VyIHBlcnNwZWN0aXZlKSBJIGhhdmUgY29sbGVjdGVkIGV2ZXJ5IHNpbmdsZSBFbmdsaXNoIHNvY2NlciBsZWFndWUgZ2FtZSByZXN1bHQgaW4gaGlzdG9yeSBhbmQgcHV0IHRoZW0gaW50byBhbiBSIHBhY2thZ2UgLVtgZW5nc29jY2VyZGF0YWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYWxhcGljL2VuZ3NvY2NlcmRhdGEpLiBBbmQgaWYgeW91J3JlIGdvaW5nIHRvIGdvIHRvIHRoYXQgdHJvdWJsZSwgeW91IG1heSBhcyB3ZWxsIG1ha2UgdXNlIG9mIGl0Lg0KDQpJdCB0dXJucyBvdXQgdGhhdCB0aGlzIHF1ZXN0aW9uIGlzIGEgbmljZSBleGVyY2lzZSBpbiB1c2luZyB0aGUgYHRpZHl2ZXJzZWAgc3VpdGUgb2YgcGFja2FnZXMgKGBkcGx5cmAsIGB0aWR5cmAgYW5kIGBnZ3Bsb3RgIGluIHBhcnRpY3VsYXIpIHRvIGZpbmQgb3V0LiAgU28sIEkgd3JvdGUgdXAgaG93IEkgZGlkIGl0IGFzIGEgbWluaS10dXRvcmlhbC4gIElmIHlvdSB3YW50IHRvIGZsZXggeW91ciB0aWR5dmVyc2Ugc2tpbGxzLCB0aGVuIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBleGVyY2lzZXMgYXQgdGhlIGJvdHRvbS4NCg0KPGJyPg0KDQojIyMgSXMgQnVybmxleSdzIDIwMTYgaG9tZSByZWNvcmQgZXhjZXB0aW9uYWw/DQoNClRoZSBgZW5nc29jY2VyZGF0YWAgcGFja2FnZSBjb250YWlucyBzZXZlcmFsIGRhdGFzZXRzLiBXZSdsbCB1c2UgYGVuZ2xhbmRgIHRoYXQgY29udGFpbnMgZXZlcnkgcmVzdWx0IGZyb20gdGhlIDE4ODgvODkgc2Vhc29uIHRvIHRoZSAyMDE1LzE2IHNlYXNvbi4gVGhpcyBwYWNrYWdlIGlzIG9uIENSQU4uIElmIHlvdSB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9uIFtHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYWxhcGljL2VuZ3NvY2NlcmRhdGEpIHRoZW4geW91IGNhbiBhbHNvIHVzZSB0aGUgYGVuZ2xhbmRfY3VycmVudCgpYCBmdW5jdGlvbiB0byBhdXRvbWF0aWNhbGx5IGJyaW5nIGluIGRhdGEgZnJvbSB0aGUgbW9zdCBjdXJyZW50ICgyMDE2LzE3KSBzZWFzb24uDQoNCldlIHVzZSBgcmJpbmRgIHRvIGJpbmQgdGhlc2UgdHdvIGRhdGFzZXRzIHRvZ2V0aGVyIGFuZCB0aGVuIG9ubHkga2VlcCB0aGUgdG9wLXRpZXIgcmVzdWx0cy4gIE5leHQsIHdlIHVzZSB0aGUgYGhvbWVhd2F5KClgIGZ1bmN0aW9uIHRoYXQgaXMgaW4gYGVuZ3NvY2NlcmRhdGFgIHRvIHJlc2hhcGUgdGhlIGRhdGFzZXQgdG8gbGlzdCB0aGUgaG9tZSBhbmQgYXdheSByZXN1bHRzIG9mIGV2ZXJ5IHRlYW0gaW4gdGhlIHNhbWUgZGF0YWZyYW1lLg0KDQo8YnI+DQpgYGB7ciwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQoNCiMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJqYWxhcGljL2VuZ3NvY2NlcmRhdGEiKSAgIyBpZiB5b3UgZG9uJ3QgaGF2ZSBlbmdzb2NjZXJkYXRhIGluc3RhbGxlZA0KDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShlbmdzb2NjZXJkYXRhKQ0KDQoNCmRmIDwtIHJiaW5kKGVuZ2xhbmQsIGVuZ2xhbmRfY3VycmVudCgpKSAlPiUgIA0KICAgICAgICBmaWx0ZXIodGllcj09MSkgJT4lDQogICAgICAgIGhvbWVhd2F5KCkNCg0KZGYkRGF0ZSA8LSAgYXMuRGF0ZShhcy5jaGFyYWN0ZXIoZGYkRGF0ZSkpICNqdXN0IHRvIG1ha2Ugc3VyZSBpbiBjb3JyZWN0IERhdGUgZm9ybWF0DQoNCmhlYWQoZGYpDQp0YWlsKGRmKQ0KYGBgDQoNCjxicj4NCk5vdyB3ZSBkbyB0aGUgYnVsayBvZiB0aGUgZGF0YSBhbmFseXNpcy4gIFdlIGZpcnN0IHdhbnQgdG8gYWRkIGEgY29sdW1uIHRoYXQgaGFzIHRoZSAnZ2FtZSBudW1iZXInIGZvciBlYWNoIHRlYW0gaW4gZWFjaCBzZWFzb24gLSBpLmUuIGlzIGl0IHRoZSAxc3QsIDJuZCwgM3JkLCA0dGggZ2FtZSBldGMuICBXZSBkbyB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBrbm93IGlmIHRlYW1zIHVwIHRvIHRoZSAyMXN0IGdhbWUgb2YgdGhlIHNlYXNvbiBoYXZlIGEgbW9yZSBleHRyZW1lIGhvbWUgcmVjb3JkIGluIHRlcm1zIG9mIHBvaW50cyB0aGFuIDIwMTYvMTcgQnVybmxleS4gDQoNCkFmdGVyIHdlIGtlZXAgYWxsIGdhbWVzIGZvciBlYWNoIHRlYW0gdXAgdG8gdGhlaXIgMjFzdGdhbWUsIHdlIHRoZW4gY2FsY3VsYXRlIHRoZSBob21lIGFuZCBhd2F5IHBvaW50cyBmb3IgZWFjaCB0ZWFtIGluIGVhY2ggc2Vhc29uIHVwIHRvIHRoYXQgcG9pbnQuIEhlcmUsIHdlIGFzc3VtZSAzIHBvaW50cyBmb3IgYSB3aW4gdG8gbWFrZSBzdXJlIGFsbCBzZWFzb25zIGNhbiBiZSBjb21wYXJlZC4gIFRoZSBuZXh0IHRhc2sgaXMgdG8gcmVzaGFwZSB0aGUgZGF0YSBzbyBlYWNoIHJvdyBpcyBhIHRlYW0vU2Vhc29uIGNvbWJpbmF0aW9uIGFuZCB0aGUgYXdheSBhbmQgaG9tZSBwb2ludHMgYXJlIGluIHNlcGFyYXRlIGNvbHVtbnMuIFdlIHVzZSBgc3ByZWFkYCBmcm9tIGB0aWR5cmAuIEl0J3MgdGhlbiB2ZXJ5IHRyaXZpYWwgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBwb2ludHMgYW5kIHRoZSBwZXJjZW50IG9mIHBvaW50cyBnYWluZWQgYXQgaG9tZSBieSBlYWNoIHRlYW0gaW4gZWFjaCBzZWFzb24uIEZpbmFsbHksIHdlIHVuZ3JvdXAgYW5kIGFycmFuZ2UgdGhlIGRhdGFmcmFtZSB0byBzaG93IHVzIHRoZSB0b3AgMTAgcmVzdWx0cy4NCg0KDQpgYGB7cn0NCmRmMSA8LSBkZiAlPiUgDQogIGdyb3VwX2J5KHRlYW0sU2Vhc29uKSAlPiUgDQogIGFycmFuZ2UoRGF0ZSkgJT4lIA0KICBtdXRhdGUoZ2FtZW5vID0gcm93X251bWJlcigpKSAlPiUgDQogIGZpbHRlcihnYW1lbm88PTIxKSAlPiUNCiAgZ3JvdXBfYnkodGVhbSx2ZW51ZSxTZWFzb24pICU+JSANCiAgc3VtbWFyaXNlKHRvdGFscHRzID0gMypzdW0oZ2Y+Z2EpK3N1bShnZj09Z2EpKSAlPiUNCiAgc3ByZWFkKHZlbnVlLHRvdGFscHRzKSAlPiUNCiAgbXV0YXRlKHRvdGFscHRzID0gYXdheStob21lLCBwY3Rob21lID0gaG9tZS90b3RhbHB0cykgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgYXJyYW5nZSgtcGN0aG9tZSkNCg0KICBoZWFkKGRmMSwxMCkNCmBgYA0KPGJyPg0KDQpJbnRlcmVzdGluZ2x5LCBCdXJuZWx5IGluIDIwMTYvMTcgYXJlIHVwIHRoZXJlIC0gYnV0IHRoZXkgYXJlbid0IHRoZSBtb3N0IGV4dHJlbWUuIERlcmJ5IENvdW50eSBpbiAxOTI2LzI3IGhhZCAyNSBwb2ludHMgZnJvbSAyMSBnYW1lcyB3aXRoIGFsbCBvZiB0aGVtIGNvbWluZyBhdCBob21lLiBUaGV5IGRpZCB3aW4gdGhlaXIgbmV4dCBhd2F5IGdhbWUgdGhvdWdoIGFuZCBlbmRlZCB1cCB3aW5uaW5nIDMgZ2FtZXMgYW5kIGRyYXdpbmcgMyBnYW1lcy4NCg0KSSBjaGVja2VkIHRoaXMgdXNpbmcgdGhpcyBjb2RlOiBgZW5nbGFuZCAlPiUgZmlsdGVyKFNlYXNvbj09MTkyNikgJT4lIGhvbWVhd2F5KCkgJT4lIGZpbHRlcih0ZWFtPT0iRGVyYnkgQ291bnR5IilgLg0KDQpUbyBnZXQgYW4gaWRlYSBvZiBob3cgZXhjZXB0aW9uYWwgYWxsIG9mIHRoZXNlIGhvbWUgcmVjb3JkcyBhcmUsIGxldCdzIG1ha2UgYSBoaXN0b2dyYW0gb2YgInBlcmNlbnQgcG9pbnRzIGF0IGhvbWUiIGFjcm9zcyBhbGwgdGVhbXMgaW4gYWxsIHNlYXNvbnM6DQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGYxLCBhZXMocGN0aG9tZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAxLCBmaWxsPSJkb2RnZXJibHVlIiwgY29sb3I9J2JsdWU0JykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MC41LCBjb2xvcj0icmVkIiwgbHR5PTIpKw0KICB4bGFiKCJQZXJjZW50IikgKw0KICBnZ3RpdGxlKCJQZXJjZW50IG9mIHRvdGFsIHBvaW50cyBjb21pbmcgYXQgaG9tZSBhZnRlciAyMSBnYW1lcyIpDQoNCmBgYA0KPGJyPg0KDQpUaGlzIGlzIHByZXR0eSBtdWNoIHdoYXQgd2UgZXhwZWN0ZWQuIFRoZSBtYWpvcml0eSBvZiB0ZWFtcyBnZXQgbW9zdCBvZiB0aGVpciBwb2ludHMgYXQgaG9tZS4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdmVyeSBpbnRyaWd1aW5nIHRlYW1zIHRoYXQgaGF2ZSB3b2VmdWwgaG9tZSByZWNvcmRzIC0gd2hvIGFyZSB0aGVzZSB0ZWFtcz8gIFdlIGNhbiBmaW5kIG91dCBieSBzaW1wbHkgYXJyYW5naW5nIHRoZSBgcGN0aG9tZWAgdmFyaWFibGUgaW4gdGhlIHJldmVyc2Ugb3JkZXIuDQoNCmBgYHtyfQ0KZGYxICU+JSANCiAgYXJyYW5nZShwY3Rob21lKSAlPiUgDQogIGhlYWQoMTApDQpgYGANCg0KPGJyPg0KVGhlIG1vc3Qgbm90YWJsZSB0aGluZyBhYm91dCB0aGlzIHRhYmxlIGlzIHRoYXQgYWxsIG9mIHRoZXNlIG9jY3VycmVuY2VzIGFyZSByZWxhdGl2ZWx5IHJlY2VudC4NCg0KPGJyPg0KDQpfRVhFUkNJU0VTOl8NCg0KSWYgeW91IHdhbnQgdG8gdHJ5IG91dCB5b3VyIGRhdGEgbXVuZ2luZyBza2lsbHMsIHRyeSB0aGlzOg0KDQotIFdoaWNoIHRlYW1zIGluIHdoaWNoIHllYXJzIGhhdmUgdGhlIG1vc3QgZXh0cmVtZSBob21lIHZzIGF3YXkgcmVjb3JkcyBpbiBvdGhlciBsZWFndWVzIHN1Y2ggYXMgU3BhaW4sIEZyYW5jZSwgSXRhbHksIEhvbGxhbmQsIEdlcm1hbnk/IFdoYXQgYWJvdXQgb3RoZXIgdGllcnMgb2YgdGhlIEVuZ2xpc2ggbGVhZ3VlPw0KDQotIFdoaWNoIHRlYW1zIGluIHdoaWNoIHllYXJzIGhhdmUgdGhlIG1vc3Qgc2tld2VkIGhvbWUgcmVjb3JkIG92ZXIgYSB3aG9sZSBzZWFzb24/DQoNCg0KPGhyPg0KVG8gZ2V0IGluIHRvdWNoIHdpdGggbWUgcGxlYXNlIHVzZSBbdHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9qYWxhcGljKSBvciBlbWFpbDogamMzMTgxIEFUIGNvbHVtYmlhIERPVCBlZHUuDQoNCg0KDQo=