キング・クリムゾンのセットリストを分析する

動機

2021年最大の出来事といえばキング・クリムゾン(以下KC)の来日公演です。
2014年に現体制(公式の区分でいうところのKCVII)が結成されてから3回目の来日となりました。そして、これが最後の来日公演ともいわれています。
コロナ禍のために来日が危ぶまれていましたが、緊急事態宣言解除とオミクロン株による渡航制限発動の狭間で、奇跡の来日が実現しました。
本当に感謝しかありません。

私も東京の5公演に参加しましたが、本当に素晴らしいステージでした。

さて、現体制のKCの特徴として、公演ごとにころころと変わるセットリストがあります。
普通のミュージシャンであればツアー中に曲目や曲順を変えることはほとんどないと思いますが、KCは曲目も曲順も毎公演で変わります。
しかし、完全にランダムというわけではなく、ほぼ必ず演奏される曲があったり、この曲の後にはこの曲が演奏されやすい、といった
法則が見られます。

この点に注目されて2015年の来日公演時に id:nisshan_X さんがセットリストの分析をされていました。
nisshan-x.hatenablog.com

今回は現体制KCによる来日公演を含む以下の3回のツアーについて、同じようにR言語を用いて分析をしてみたいと思います。

  • The Elements of King Crimson Tour (以下2015)
  • Uncertain Times Tour (以下2018)
  • Music Is Our Friend Tour (以下2021)

分析結果

楽曲の登場頻度

まずはツアー毎にどんな曲が多く演奏されているかを見てみます。
ただし、ツアー毎に公演回数が異なるので、公演回数に対する演奏割合で見てみます。

Starlessが不動の一位。まあ、そうですよね。Level Fiveもずっと上位にいます。
Indiscipleneが2018,2021と上位に入っているのも注目です。80年代の曲ですが、現行体制を代表する1曲です。最もいまのクリムゾンらしい曲といっていいでしょう。

f:id:bob3:20211226171523p:plain
楽曲の登場頻度

どの曲とどの曲が同じ日に演奏されやすいか

曲と曲の組み合わせで、色が濃く円が大きい組み合わせがよく一緒に演奏される曲です。
これを見ると、2014はばらつきが大きく本当にどの曲が演奏されるか分からなかったのが、2018、2021ではある程度ほぼ決まって演奏される楽曲群とそれ以外のレア曲に明確に分かれるようになったのが分かりますj。

f:id:bob3:20211226173902p:plain
共起2015
f:id:bob3:20211226173929p:plain
共起2018
f:id:bob3:20211226173950p:plain
共起2021

曲順分析

最後に曲順の分析です。
ある曲の次にある曲が演奏される割合を矢印の上にパーセントで書いています。
都合上、20%以下のつながりは割愛しています。
曲名の背景がピンクは定番曲(演奏割合66%以上)、青はレア曲(同33%以下)、黄色はその中間(33%~66%)です。

2021の Picture of a city (冷たい街の情景)がハブになっている感じが面白いですね。

2015

f:id:bob3:20211226191830p:plain
曲順2015

2018

f:id:bob3:20211226191909p:plain
曲順2018

2021

f:id:bob3:20211226191945p:plain
曲順2021

まとめ

最後の来日公演なんて言わないでまた来てよー。

80年代~00年代の曲ももっと聴きたいよー!

分析過程

以下、R言語のコードを含む分析の過程です。

データの取得

まずはセットリストのデータの取得です。
ありがたいことに setlist.fm に有志が投稿したセットリストが載っていますので、ここから分析のためのデータを取得したいと思います。
APIも用意されているようですが、うまく情報の取得ができなかったため、ここではウェブスクレイピングを行います。

# パッケージの読み込み
library(tidyverse) # データ操作用
library(rvest) # ウェブスクレイピング
library(polite) # お行儀よくウェブスクレイピングするため

### setlist.fmからセットリストを抽出する関数を定義。

setlist_fm_scraping <- function(search_list) {
  scrape_fun <- function(x) {
    scrape(bow(x, user_agent = "King Crimson Tour Setlist Analysis"))
  }

  html_list <- map(search_list, scrape_fun)

  link_vec <- unlist(map(html_list, ~ {
    html_attr(html_nodes(., css = "a[href *= 'setlist/king-crimson/']"), "href")
  }))

  extract_setlist <- function(x) {
    html_text(html_nodes(scrape(bow(
      paste0("https://www.setlist.fm/", x), 
      user_agent = "King Crimson Tour Setlist Analysis"
    )), xpath = "//a[@class = 'songLabel']"))
  }

  setlists <- map(link_vec, extract_setlist)

  return(setlists)
}

### 各ツアー毎の検索結果ページを設定
pages <- 1:4
search_list_2021 <- map_chr(pages, ~ {
  paste0(
    "https://www.setlist.fm/search?page=",
    .,
    "&query=tour:%28Music+Is+Our+Friend+2021")
})

pages <- 1:6
search_list_2018 <- map_chr(pages, ~ {
  paste0(
    "https://www.setlist.fm/search?page=", 
    ., 
    "&query=king+crimson+Uncertain+Times+Tour")
})

pages <- 1:11
search_list_2014 <- map_chr(pages, ~ {
  paste0(
    "https://www.setlist.fm/search?page=", 
    ., 
    "&query=tour:%28the+elements+of+king+crimson%29")
})

### 各ツアーのセットリストを抽出
# 1ページ当たり5秒間隔なのでちょっと時間がかかります
setlist_2021 <- setlist_fm_scraping(search_list_2021)
setlist_2018 <- setlist_fm_scraping(search_list_2018)
setlist_2014 <- setlist_fm_scraping(search_list_2014)

### スクレイピングを繰り返さないでいいようにオブジェクトを保存しておく。
save(setlist_2021, setlist_2018, setlist_2014, file = "kc_setlist.RData")

前処理

分析を進める前に、見やすさのために長い曲名を短縮形にします。

library(tidyverse)

load("kc_setlist.RData")

# 長い曲名を短縮形に置換する関数。
song_name_shorten <- function(setlists) {
  res <- setlists %>%
    map(~ {str_replace_all(., pattern = "Larks' Tongues in Aspic, Part One", replacement = "LTIA1")}) %>%
    map(~ {str_replace_all(., pattern = "Larks' Tongues in Aspic, Part Two", replacement = "LTIA2")}) %>%
    map(~ {str_replace_all(., pattern = "21st Century Schizoid Man", replacement = "21CSM")}) %>%
    map(~ {str_replace_all(., pattern = "Devil Dogs of Tessellation Row", replacement = "Devil Dogs")}) %>%
    map(~ {str_replace_all(., pattern = "Hell Hounds of Krim", replacement = "Hell Hounds")}) %>%
    map(~ {str_replace_all(., pattern = "Fairy Dust of the Drumsons", replacement = "Fairy Dust")}) %>%
    map(~ {str_replace_all(., pattern = "One More Red Nightmare", replacement = "OMRN")}) %>%
    map(~ {str_replace_all(., pattern = "Suitable Grounds for the Blues", replacement = "Suitable")}) %>%
    map(~ {str_replace_all(., pattern = "The ConstruKction of Light", replacement = "TCOL")}) %>%
    map(~ {str_replace_all(., pattern = "The Court of the Crimson King", replacement = "ITCOTCK")}) %>%
    map(~ {str_replace_all(., pattern = "Radical Action III", replacement = "RA3")}) %>%
    map(~ {str_replace_all(., pattern = "Radical Action II", replacement = "RA2")}) %>%
    map(~ {str_replace_all(., pattern = "Radical Action \\(To Unseat the Hold of Monkey Mind\\)", replacement = "RA1")}) %>%
    map(~ {str_replace_all(., pattern = "Tony's Cadenza", replacement = "Tonys Cadenza")}) %>%
    map(~ {str_replace_all(., pattern = "Larks' Tongues in Aspic \\(Part IV\\)", replacement = "LTIA4")}) %>%
    map(~ {str_replace_all(., pattern = "Banshee Legs Bell Hassle", replacement = "Banshee Legs")}) %>%
    map(~ {str_replace_all(., pattern = "A Scarcity of Miracles", replacement = "Miracles")}) %>%
    map(~ {str_replace_all(., pattern = "Sailor's Tale", replacement = "Sailors Tale")}) %>%
    map(~ {str_remove_all(., '"')})
  return(res)
}

setlist_2021 <- song_name_shorten(setlist_2021)
setlist_2018 <- song_name_shorten(setlist_2018)
setlist_2014 <- song_name_shorten(setlist_2014)

これで準備万端です。

ツアー毎に多く演奏された曲Top20

集計して割り算して棒グラフに。

song_table <- function(setlist) {
  t1 <- bind_rows(
    as_tibble(table(unlist(setlist)), .name_repair = ~ c("song_name", "freq")),
    tibble(song_name = c("START", "END"), freq = length(setlist))
    )
  t1$per <- t1$freq / length(setlist)
  return(t1)
}

table_2021 <- song_table(setlist_2021)
table_2018 <- song_table(setlist_2018)
table_2014 <- song_table(setlist_2014)

all_table <- bind_rows(
  list("2021" = table_2021,
       "2018" = table_2018,
       "2014" = table_2014),
  .id = "year") %>%
  pivot_wider(names_from = year, values_from = freq, values_fill = 0) %>%
  pivot_longer(names_to = "year", cols=matches("\\d{4}"), values_to = "freq")

top20 <- all_table %>%
  filter(!song_name %in% c("START", "END")) %>%
  group_by(year) %>%
  arrange(desc(per)) %>%
  top_n(20)

g2014 <- top20 %>%
  filter(year == 2014) %>%
  ggplot(aes(x = reorder(song_name, per), y = per)) + 
  geom_bar(stat = "identity", position = "dodge", color="black", fill="red") +
  coord_flip() +
  labs(title="2014", x="曲目", y="演奏割合")

g2018 <- top20 %>%
  filter(year == 2018) %>%
  ggplot(aes(x = reorder(song_name, per), y = per)) + 
  geom_bar(stat = "identity", position = "dodge", color="black", fill="green") +
  coord_flip() +
  labs(title="2018", x="曲目", y="演奏割合")

g2021 <- top20 %>%
  filter(year == 2021) %>%
  ggplot(aes(x = reorder(song_name, per), y = per)) + 
  geom_bar(stat = "identity", position = "dodge", color="black", fill="blue") +
  coord_flip() +
  labs(title="2021", x="曲目", y="演奏割合")

library(gridExtra)
grid.arrange(g2014, g2018, g2021, nrow = 1)

楽曲の共起分析

どの曲とどの曲が同じ日に演奏されやすいか。
ここではコサイン類似度で一緒に演奏されやすさを見ている。

exaxt_cor <- function(setlist) {
  ref <- unique(reduce(setlist, c))
  res <- as.matrix(map_dfr(setlist, ~{setNames(as.integer(ref %in% .), ref)}))
  return(res)
  }
  
cor_2014 <- exaxt_cor(setlist_2014)
cor_2018 <- exaxt_cor(setlist_2018)
cor_2021 <- exaxt_cor(setlist_2021)

# コサイン類似度マトリクスで
library(lsa)
cm2014 <- cosine(cor_2014)
cm2018 <- cosine(cor_2018)
cm2021 <- cosine(cor_2021)

library(corrplot)
corrplot(cm2014, order="hclust", hclust.method="ward.D", addrect = 6)
corrplot(cm2018, order="hclust", hclust.method="ward.D", addrect = 7)
corrplot(cm2021, order="hclust", hclust.method="ward.D", addrect = 6)

曲順分析

ここはコードがだいぶ汚い……
セットリストからグラフのノードとエッジを設定しDOT言語のコードを吐き出す。

# セットリストのグラフ化
vec2graph <- function(x) {
  LEN <- length(x)
  data.frame(
    from = c("START", x),
    to = c(x, "END")
  )
}

# どのツアーか設定する
setlists <- setlist_2014
tb <- table_2014

# setlists <- setlist_2018
# tb <- table_2018

# setlists <- setlist_2021
# tb <- table_2021

setlist_df <- setlists %>%
  map_dfr(vec2graph) %>%
  group_by(from, to) %>%
  summarise(n = n()) %>%
  mutate(m = sum(n)) %>%
  ungroup() %>%
  mutate(per = round(n / m * 100, 0)) %>%
  select(from, to, per)

library(DiagrammeR)

nodes_df <- create_node_df(
  n = nrow(tb),
  type = "song",
  label = tb$song_name,
  shape = "ellipse",
  value = tb$per
)

for_edges_df <- setlist_df %>%
  left_join(nodes_df, by = c("from" = "label")) %>%
  left_join(nodes_df, by = c("to" = "label")) %>%
  select(id.x, id.y, per)

edges_df <- create_edge_df(
  from = for_edges_df$id.x,
  to = for_edges_df$id.y,
  rel = "a",
  width = for_edges_df$per
) %>%
  filter(width > 20) #ここでエッジの足切り

graph <- create_graph(
  nodes_df = nodes_df,
  edges_df = edges_df
) %>%
  set_edge_attrs(
    edge_attr = color,
    values = "blue"
  ) %>%
  set_edge_attrs(
    edge_attr = label,
    values = edges_df$width
  ) %>%
  set_edge_attrs(
    edge_attr = penwidth,
    values = edges_df$width / 10
  ) %>%
  set_edge_attrs(
    edge_attr = fontsize,
    values = 14) %>%
  set_node_attrs(
    node_attr = color,
    values = "blue"
  ) %>% 
  set_node_attrs(
    node_attr = fillcolor,
    values = case_when(
      nodes_df$value > 66 ~ "lightpink",
      nodes_df$value > 33 ~ "yellow",
      nodes_df$value > 0 ~ "lightblue",
      TRUE ~ "black"
    ) 
    ) %>%
  set_node_attrs(
    node_attr = fontcolor,
    values = "black") %>%
  set_node_attrs(
    node_attr = fontsize,
    values = 14) %>%
  set_node_attrs(
    node_attr = fixedsize,
    values = "false")

graph %>%
  render_graph()

graph %>%
  generate_dot() %>%
  cat()

ツアー毎にDOT言語で微調整し描画する。

2015
#2014
grViz(
  diagram = "
digraph {

graph [rankdir = TB,
       outputorder = 'edgesfirst',
       bgcolor = 'white']

node [fontname = 'Helvetica',
      fontsize = '10',
      shape = 'circle',
      fixedsize = 'true',
      width = '0.5',
      style = 'filled',
      fillcolor = 'aliceblue',
      color = 'gray70',
      fontcolor = 'gray50']

edge [fontname = 'Helvetica',
     fontsize = '8',
     len = '1.5',
     color = 'gray80',
     arrowsize = '0.5']

  '1' [label = '21CSM', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '2' [label = 'Banshee Legs', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '3' [label = 'Cirkus', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '4' [label = 'Coda: Marine 475', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '5' [label = 'Devil Dogs', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '6' [label = 'Easy Money', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '7' [label = 'Epitaph', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '8' [label = 'Fairy Dust', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '9' [label = 'Fracture', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '10' [label = 'Hell Hounds', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '11' [label = 'Heroes', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '12' [label = 'Hoodoo', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '13' [label = 'Indiscipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '14' [label = 'Interlude', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '15' [label = 'ITCOTCK', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '16' [label = 'Level Five', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '17' [label = 'Lizard', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '18' [label = 'LTIA1', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '19' [label = 'LTIA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '20' [label = 'Magic Sprinkles', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '21' [label = 'Meltdown', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '22' [label = 'Miracles', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '23' [label = 'OMRN', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '24' [label = 'Peace: An End', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '25' [label = 'Pictures of a City', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '26' [label = 'RA1', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '27' [label = 'RA2', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '28' [label = 'Red', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '29' [label = 'Sailors Tale', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '30' [label = 'Starless', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '31' [label = 'Suitable', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '32' [label = 'TCOL', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '33' [label = 'The Letters', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '34' [label = 'The Light of Day', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '35' [label = 'The Talking Drum', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '36' [label = 'VROOOM', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '37' [label = 'START', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false', style = 'bold,filled'] 
  '38' [label = 'END', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false', style = 'bold,filled'] 
'1'->'38' [color = 'blue', label = '95', penwidth = '9.5', fontsize = '14'] 
'2'->'6' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'3'->'9' [color = 'blue', label = '52', penwidth = '5.2', fontsize = '14'] 
'4'->'2' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] 
'4'->'22' [color = 'blue', label = '36', penwidth = '3.6', fontsize = '14'] 
'4'->'34' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] 
'5'->'15' [color = 'blue', label = '40', penwidth = '4', fontsize = '14'] 
'6'->'33' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'7'->'2' [color = 'blue', label = '28', penwidth = '2.8', fontsize = '14'] 
'8'->'17' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'8'->'24' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'9'->'33' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
'10'->'32' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] 
'11'->'1' [color = 'blue', label = '94', penwidth = '9.4', fontsize = '14'] 
'12'->'1' [color = 'blue', label = '75', penwidth = '7.5', fontsize = '14'] 
'13'->'15' [color = 'blue', label = '43', penwidth = '4.3', fontsize = '14'] 
'14'->'33' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] 
'15'->'1' [color = 'blue', label = '45', penwidth = '4.5', fontsize = '14'] 
'16'->'7' [color = 'blue', label = '26', penwidth = '2.6', fontsize = '14'] 
'17'->'27' [color = 'blue', label = '46', penwidth = '4.6', fontsize = '14'] 
'18'->'25' [color = 'blue', label = '71', penwidth = '7.1', fontsize = '14'] 
'19'->'30' [color = 'blue', label = '58', penwidth = '5.8', fontsize = '14'] 
'20'->'17' [color = 'blue', label = '29', penwidth = '2.9', fontsize = '14'] 
'21'->'10' [color = 'blue', label = '27', penwidth = '2.7', fontsize = '14'] 
'21'->'27' [color = 'blue', label = '23', penwidth = '2.3', fontsize = '14'] 
'23'->'30' [color = 'blue', label = '39', penwidth = '3.9', fontsize = '14'] 
'24'->'26' [color = 'blue', label = '26', penwidth = '2.6', fontsize = '14'] 
'25'->'3' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
'26'->'21' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] 
'27'->'16' [color = 'blue', label = '85', penwidth = '8.5', fontsize = '14'] 
'30'->'2' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] 
'30'->'5' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
'37'->'10' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] 
'37'->'18' [color = 'blue', label = '60', penwidth = '6', fontsize = '14'] 
'32'->'16' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
'33'->'29' [color = 'blue', label = '61', penwidth = '6.1', fontsize = '14'] 
'34'->'35' [color = 'blue', label = '48', penwidth = '4.8', fontsize = '14'] 
'35'->'19' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] 
'36'->'4' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] 

  {rank = min; 37;}
  {rank = same; 17; 24; 18; 28; 31;}
  {rank = same; 25; 26; 36;}
  {rank = same; 4; 21; 3;}
  {rank = same; 22; 34; 27; 10; 9;}
  {rank = same; 35; 32;}
  {rank = max; 38;}
}
  "
)
2018
grViz(
  diagram = "
digraph {

graph [rankdir = TB,
       outputorder = 'edgesfirst',
       bgcolor = 'white']

node [fontname = 'Helvetica',
      fontsize = '10',
      shape = 'circle',
      fixedsize = 'true',
      width = '0.5',
      style = 'filled',
      fillcolor = 'aliceblue',
      color = 'gray70',
      fontcolor = 'gray50']

edge [fontname = 'Helvetica',
     fontsize = '8',
     len = '1.5',
     color = 'gray80',
     arrowsize = '0.5']

  '1' [label = '21CSM', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '2' [label = 'Banshee Legs', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '3' [label = 'Breathless', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '4' [label = 'Cadence and Cascade', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '5' [label = 'CatalytiKc No. 9', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '6' [label = 'Cirkus', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '7' [label = 'Devil Dogs', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '8' [label = 'Discipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '9' [label = 'Drumsons', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '10' [label = 'Easy Money', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '11' [label = 'Epitaph', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '12' [label = 'Fairy Dust', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '13' [label = 'Fallen Angel', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '14' [label = 'Fracture', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '15' [label = 'Hell Hounds', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '16' [label = 'Indiscipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '17' [label = 'Interlude', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '18' [label = 'Islands', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '19' [label = 'ITCOTCK', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '20' [label = 'Level Five', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '21' [label = 'Lizard', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '22' [label = 'LTIA1', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '23' [label = 'LTIA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '24' [label = 'LTIA4', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '25' [label = 'Meltdown', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '26' [label = 'Moonchild', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '27' [label = 'Neurotica', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '28' [label = 'OMRN', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '29' [label = 'Peace: An End', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '30' [label = 'Pictures of a City', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '31' [label = 'RA1', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '32' [label = 'RA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '33' [label = 'RA3', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '34' [label = 'Red', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '35' [label = 'Sailors Tale', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '36' [label = 'Starless', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '37' [label = 'Suitable', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '38' [label = 'TCOL', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '39' [label = 'The Errors', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '40' [label = 'The Letters', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '41' [label = 'START', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] 
  '42' [label = 'END', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] 
'1'->'42' [color = 'blue', label = '95', penwidth = '9.5', fontsize = '14'] 
'2'->'6' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'2'->'16' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'3'->'1' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'3'->'11' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'3'->'13' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'5'->'29' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'5'->'38' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'6'->'21' [color = 'blue', label = '92', penwidth = '9.2', fontsize = '14'] 
'7'->'8' [color = 'blue', label = '23', penwidth = '2.3', fontsize = '14'] 
'8'->'16' [color = 'blue', label = '37', penwidth = '3.7', fontsize = '14'] 
'9'->'8' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
'9'->'29' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
'9'->'37' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'10'->'23' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'11'->'10' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'12'->'16' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'12'->'28' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'12'->'33' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'12'->'36' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'13'->'34' [color = 'blue', label = '38', penwidth = '3.8', fontsize = '14'] 
'14'->'16' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'14'->'18' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'15'->'8' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
'15'->'27' [color = 'blue', label = '41', penwidth = '4.1', fontsize = '14'] 
'17'->'4' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'17'->'11' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'20'->'18' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
'20'->'36' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'21'->'11' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] 
'22'->'27' [color = 'blue', label = '37', penwidth = '3.7', fontsize = '14'] 
'22'->'29' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
'23'->'36' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
'24'->'18' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] 
'25'->'32' [color = 'blue', label = '92', penwidth = '9.2', fontsize = '14'] 
'26'->'19' [color = 'blue', label = '96', penwidth = '9.6', fontsize = '14'] 
'28'->'34' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
'29'->'30' [color = 'blue', label = '48', penwidth = '4.8', fontsize = '14'] 
'30'->'4' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] 
'31'->'25' [color = 'blue', label = '42', penwidth = '4.2', fontsize = '14'] 
'31'->'33' [color = 'blue', label = '53', penwidth = '5.3', fontsize = '14'] 
'32'->'20' [color = 'blue', label = '98', penwidth = '9.8', fontsize = '14'] 
'33'->'25' [color = 'blue', label = '80', penwidth = '8', fontsize = '14'] 
'34'->'28' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
'35'->'26' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] 
'36'->'1' [color = 'blue', label = '63', penwidth = '6.3', fontsize = '14'] 
'36'->'42' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
'41'->'15' [color = 'blue', label = '53', penwidth = '5.3', fontsize = '14'] 
'41'->'22' [color = 'blue', label = '45', penwidth = '4.5', fontsize = '14'] 
'39'->'33' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
'39'->'34' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 

  {rank = min; 41;}
  {rank = same; 37; 38;}
  {rank = same; 2; 8; 14; 27; 29;}
  {rank = same; 35; 32;}
  {rank = max; 42;}
}

  "
)
2021
grViz(
  diagram = "
digraph {
  
  graph [rankdir=TB,
         outputorder = 'edgesfirst',
         bgcolor = 'white']
  
  node [fontname = 'Helvetica',
        fontsize = '10',
        shape = 'circle',
        fixedsize = 'true',
        width = '0.5',
        style = 'filled',
        fillcolor = 'aliceblue',
        color = 'gray70',
        fontcolor = 'gray50']
  
  edge [fontname = 'Helvetica',
        fontsize = '8',
        len = '1.5',
        color = 'gray80',
        arrowsize = '0.5']
  
  '1' [label = '21CSM', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '2' [label = 'Cirkus', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '3' [label = 'Devil Dogs', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '4' [label = 'Discipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '5' [label = 'Drumsons', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '6' [label = 'Drumzilla', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '7' [label = 'Epitaph', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '8' [label = 'Fairy Dust', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '9' [label = 'Hell Hounds', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '10' [label = 'Indiscipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '11' [label = 'Islands', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '12' [label = 'ITCOTCK', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '13' [label = 'Level Five', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '14' [label = 'Lizard', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '15' [label = 'LTIA1', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '16' [label = 'LTIA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '17' [label = 'Moonchild', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '18' [label = 'Neurotica', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '19' [label = 'OMRN', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '20' [label = 'Peace: A Beginning', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '21' [label = 'Peace: An End', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '22' [label = 'Pictures of a City', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '23' [label = 'RA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '24' [label = 'Red', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '25' [label = 'Starless', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '26' [label = 'Suitable', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '27' [label = 'TCOL', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '28' [label = 'Tonys Cadenza', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] 
  '29' [label = 'START', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] 
  '30' [label = 'END', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] 
  '1'->'30' [color = 'blue', label = '88', penwidth = '8.8', fontsize = '14'] 
  '2'->'7' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
  '2'->'14' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
  '2'->'23' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
  '2'->'24' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
  '3'->'15' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '3'->'22' [color = 'blue', label = '56', penwidth = '5.6', fontsize = '14'] 
  '4'->'10' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '4'->'16' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
  '5'->'22' [color = 'blue', label = '80', penwidth = '8', fontsize = '14'] 
  '6'->'22' [color = 'blue', label = '47', penwidth = '4.7', fontsize = '14'] 
  '7'->'19' [color = 'blue', label = '27', penwidth = '2.7', fontsize = '14'] 
  '8'->'22' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] 
  '9'->'15' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] 
  '9'->'22' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
  '10'->'11' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
  '10'->'25' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
  '11'->'10' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] 
  '11'->'23' [color = 'blue', label = '28', penwidth = '2.8', fontsize = '14'] 
  '12'->'23' [color = 'blue', label = '23', penwidth = '2.3', fontsize = '14'] 
  '13'->'25' [color = 'blue', label = '49', penwidth = '4.9', fontsize = '14'] 
  '14'->'11' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '14'->'23' [color = 'blue', label = '67', penwidth = '6.7', fontsize = '14'] 
  '15'->'22' [color = 'blue', label = '31', penwidth = '3.1', fontsize = '14'] 
  '16'->'11' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
  '17'->'1' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '17'->'23' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '17'->'28' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '18'->'10' [color = 'blue', label = '28', penwidth = '2.8', fontsize = '14'] 
  '18'->'24' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
  '19'->'10' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] 
  '19'->'28' [color = 'blue', label = '59', penwidth = '5.9', fontsize = '14'] 
  '20'->'19' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
  '20'->'22' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] 
  '21'->'16' [color = 'blue', label = '29', penwidth = '2.9', fontsize = '14'] 
  '21'->'22' [color = 'blue', label = '43', penwidth = '4.3', fontsize = '14'] 
  '22'->'7' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] 
  '22'->'12' [color = 'blue', label = '39', penwidth = '3.9', fontsize = '14'] 
  '23'->'13' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] 
  '24'->'7' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] 
  '24'->'19' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] 
  '25'->'1' [color = 'blue', label = '81', penwidth = '8.1', fontsize = '14'] 
  '29'->'3' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] 
  '29'->'6' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] 
  '29'->'9' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] 
  '26'->'12' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '26'->'19' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '26'->'24' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] 
  '27'->'23' [color = 'blue', label = '27', penwidth = '2.7', fontsize = '14'] 
  {rank = min; 29;}

  {rank = max; 30;}
}

")