
#NEXT # Load necessary libraries
library(dplyr)
library(readr)
print(top_performers)
write.csv(top_performers, "top_2025_PIT_performers.csv", row.names = FALSE)
data$weight <- as.numeric(data$weight)
Warning: NAs introduced by coercion
# Filter uncommitted players and ensure position is valid
PITdata <- data %>%
filter(!is.na(position)) %>%
mutate(position = toupper(position)) # Normalize positions
names(PITdata)
[1] "player_name" "school" "height" "position"
[5] "weight" "rk" "class" "height_2"
[9] "team" "conf" "g" "min"
[13] "prpg" "bpm" "ortg" "drtg"
[17] "usg" "efg" "ts" "or"
[21] "dr" "ast" "to" "a_to"
[25] "blk" "stl" "ftr" "dunks_m"
[29] "dunks_a" "ft_m" "ft_a" "x2p_m"
[33] "x2p_a" "x3p_m" "x3p_a" "x3p_100"
[37] "ft" "x2p" "x3p" "ppg"
[41] "total_rebounds"
ggplot(PITdata, aes(x = drtg, y = ortg, size = ts, color = ast, label = paste(player_name))) +
geom_point(alpha = 0.8) +
scale_color_gradient(low = "orange", high = "blue") +
scale_size_continuous(range = c(3, 10)) +
geom_text(size = 3, vjust = -1, check_overlap = TRUE) +
labs(title = "Top PIT Players: All-Around Performance by Cyro Asseo",
x = "Defensive Rating (↓ Better)",
y = "Offensive Rating (↑ Better)",
size = "True Shooting %",
color = "Assists") +
theme_minimal()
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_text()`).

ggplot(PITdata, aes(x = x3p, y = drtg, label = paste(player_name)) +
geom_point(color = "blue", size = 3) +
geom_text(size = 3, vjust = -0.7, check_overlap = TRUE) +
labs(title = "3PM vs Defensive Rating (DRTG)",
x = "3-Pointers Made (3PM)",
y = "Defensive Rating (↓ Better)") +
theme_minimal()
Error: Incomplete expression: ggplot(PITdata, aes(x = x3p, y = drtg, label = paste(player_name)) +
geom_point(color = "blue", size = 3) +
geom_text(size = 3, vjust = -0.7, check_overlap = TRUE) +
labs(title = "3PM vs Defensive Rating (DRTG)",
x = "3-Pointers Made (3PM)",
y = "Defensive Rating (↓ Better)") +
theme_minimal()
ggsave("3pm_vs_drtg.png", plot = p1, width = 8, height = 6, dpi = 300)
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_text()`).
ggsave("ppg_vs_drtg.png", plot = p2, width = 8, height = 6, dpi = 300)
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_text()`).
ggsave("min_vs_drtg.png", plot = p3, width = 8, height = 6, dpi = 300)
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_text()`).
ggsave("drtg_vs_ortg.png", plot = p4, width = 8, height = 6, dpi = 300)
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_text()`).
ggsave("all_around_performance.png", plot = p5, width = 8, height = 6, dpi = 300)
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_point()`).
Warning: Removed 971 rows containing missing values or values outside the scale range
(`geom_text()`).
NEXT
top_fga <- PITdata %>%
arrange(desc(x2p + x3p)) %>%
slice_head(n = 20) %>%
dplyr::select(player_name, school, x2p, x3p, drtg)
gt_fga <- gt(top_fga) %>%
tab_header(title = "Top PIT Players by Field Goal Attempts (FGA) by Cyro Asseo")
gtsave(gt_fga, "top_PIT_fga_table.png")
file:////var/folders/n4/y37zz1ss7ql7x6z33jc88mmw0000gn/T//RtmpzEX3L9/file2e7a400f046d.html screenshot completed
gt_top_performers <- gt(top_performers) %>%
tab_header(
title = "Top PIT Defenders & All‑Around Impact by Cyro Asseo"
) %>%
cols_label(
player_name = "Player",
school = "School",
position = "Pos",
drtg = "DRTG",
ortg = "ORTG",
ast = "AST",
stl = "STL",
blk = "BLK",
efg = "eFG %",
ts = "TS %"
) %>%
fmt_number(
columns = c(drtg, ortg, ast, stl, blk, efg, ts),
decimals = 1)
gtsave(
gt_top_performers,
"top_PIT_performers_table.png",
vwidth = 2600, # viewport width in px
vheight = 1900, # viewport height in px
zoom = 2 # scale factor
)
file:////var/folders/n4/y37zz1ss7ql7x6z33jc88mmw0000gn/T//RtmpzEX3L9/file2e7a50ba102f.html screenshot completed
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQojIFNldCB3b3JraW5nIGRpcmVjdG9yeQpzZXR3ZCgiL1VzZXJzL2N5cm9hc3Nlb2RlY2hvY2gvRG9jdW1lbnRzIikKZ2V0d2QoKQoKIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShkcGx5cikKCmRhdGEgPC0gcmVhZC5jc3YoIlBJVF93aXRoX1RvcnZpa19TdGF0czQuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKY29sbmFtZXMoZGF0YSkKIyBDbGVhbiBjb2x1bW4gbmFtZXMgdG8gc3RhbmRhcmQgZm9ybWF0CmRhdGEgPC0gY2xlYW5fbmFtZXMoZGF0YSkgICMgVGhpcyB0dXJucyAiTUlOJSIgaW50byAibWluX3BlcmNlbnQiLCBldGMuCgojIFZpZXcgdGhlIGNsZWFuZWQgbmFtZXMKbmFtZXMoZGF0YSkKCgpkYXRhIDwtIGRhdGEgJT4lCiAgIyBtYWtlIHN1cmUgdGhlc2UgYXJlIG51bWVyaWMKICBtdXRhdGVfYXQodmFycyhmdF9tLCB4MnBfbSwgeDNwX20sIGcpLCBhcy5udW1lcmljKSAlPiUKICAjIHRvdGFsIHBvaW50cyA9IDHCoMOXwqBGVCArIDLCoMOXwqAyUCArIDPCoMOXwqAzUDsgdGhlbiBkaXZpZGUgYnkgZ2FtZXMgcGxheWVkCiAgbXV0YXRlKHBwZyA9IChmdF9tICsgMiAqIHgycF9tICsgMyAqIHgzcF9tKSAvIGcpCgoKIyBDb252ZXJ0IG5lY2Vzc2FyeSBjb2x1bW5zIHRvIG51bWVyaWMKbnVtZXJpY19jb2xzIDwtIGMoIm1pbiIsICJlZmciLCAicHBnIiwgIngycCIsICJ4M3AiLCAiZnQiLCAib3IiLCAiZHIiLCAiYXN0IiwgInN0bCIsICJibGsiLCAidG8iLCAidHMiLCAidXNnIiwgImJwbSIpCgojIERyb3Agcm93cyB3aXRoIE5BIGluIGtleSBwZXJmb3JtYW5jZSBpbmRpY2F0b3JzCmRhdGFfY2xlYW4gPC0gbmEub21pdChkYXRhW251bWVyaWNfY29sc10pCgojIEVuc3VyZSB0aGV5IGFyZSBudW1lcmljCmRhdGFbbnVtZXJpY19jb2xzXSA8LSBsYXBwbHkoZGF0YVtudW1lcmljX2NvbHNdLCBhcy5udW1lcmljKQoKIyBDcmVhdGUgdG90YWwgcmVib3VuZHMgY29sdW1uCmRhdGEkdG90YWxfcmVib3VuZHMgPC0gZGF0YSRvciArIGRhdGEkZHIKCiMgUmVuYW1lIGNvbHVtbnMgZm9yIGVhc2llciBtb2RlbGluZwpjb2xuYW1lcyhkYXRhX2NsZWFuKSA8LSBtYWtlLm5hbWVzKGNvbG5hbWVzKGRhdGFfY2xlYW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgMS4gT0xTIFJlZ3Jlc3Npb246IFdoYXQgY29udHJpYnV0ZXMgdG8gQm94IFBsdXMtTWludXMgKEJQTSk/Cm1vZGVsMSA8LSBsbShicG0gfiBtaW4gKyBlZmcgKyB4MnAgKyB4M3AgKyBmdCArIG9yICsgZHIgKwogICAgICAgICAgICAgICBhc3QgKyBzdGwgKyBibGsgKyB0byArIHRzICsgdXNnLCBkYXRhID0gZGF0YSkKc3VtbWFyeShtb2RlbDEpCgojIDIuIFN0ZXB3aXNlIFJlZ3Jlc3Npb24gZm9yIEJQTSAoYmFzZWQgb24gQUlDKQpzdGVwX21vZGVsIDwtIHN0ZXBBSUMobW9kZWwxLCBkaXJlY3Rpb24gPSAiYm90aCIpCnN1bW1hcnkoc3RlcF9tb2RlbCkKCiMgMy4gTXVsdGljb2xsaW5lYXJpdHkgQ2hlY2sgKFZJRikKdmlmX3ZhbHVlcyA8LSB2aWYobW9kZWwxKQpwcmludCh2aWZfdmFsdWVzKQoKIyA0LiBEaWFnbm9zdGljIFBsb3RzCnBhcihtZnJvdyA9IGMoMiwgMikpCnBsb3QobW9kZWwxKQpgYGAKCiNORVhUCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWRyKQpgYGAKCgoKYGBge3J9Cm5hbWVzKGRhdGEpCiMgRW5zdXJlICdwb3NpdGlvbicgY29sdW1uIGV4aXN0cyBhbmQgaXMgY2xlYW4KZGF0YTEgPC0gZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvc2l0aW9uKSkgJT4lCiAgbXV0YXRlKHBvc2l0aW9uID0gdG91cHBlcihwb3NpdGlvbikpICMgTm9ybWFsaXplCgojIFNlbGVjdCByZWxldmFudCB2YXJpYWJsZXMgKG1hdGNoIGV4YWN0IGNvbHVtbiBuYW1lcyBmcm9tIGRhdGFzZXQpCnBvc2l0aW9uX3N0YXRzIDwtIGRhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChwb3NpdGlvbiwKICAgICAgICAgYXN0LCBzdGwsIGJsaywKICAgICAgICAgZWZnLCB0cywKICAgICAgICAgeDJwLCB4M3AsCiAgICAgICAgIG9yLCBkciwKICAgICAgICAgcHBnLCBtaW4sCiAgICAgICAgIGZ0LCB0bywKICAgICAgICAgdXNnLCBkcnRnLCBvcnRnLCBwbGF5ZXJfbmFtZSwgc2Nob29sLCBoZWlnaHQsIHdlaWdodCkKCgojIFN1bW1hcml6ZSBieSBwb3NpdGlvbgpwb3NpdGlvbl9zdW1tYXJ5IDwtIHBvc2l0aW9uX3N0YXRzICU+JQogIGdyb3VwX2J5KHBvc2l0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBhc3QgPSBtZWFuKGFzdCwgbmEucm0gPSBUUlVFKSwKICAgIHN0bCA9IG1lYW4oc3RsLCBuYS5ybSA9IFRSVUUpLAogICAgYmxrID0gbWVhbihibGssIG5hLnJtID0gVFJVRSksCiAgICBlZmcgPSBtZWFuKGVmZywgbmEucm0gPSBUUlVFKSwKICAgIHRzID0gbWVhbih0cywgbmEucm0gPSBUUlVFKSwKICAgIHgycCA9IG1lYW4oeDJwLCBuYS5ybSA9IFRSVUUpLAogICAgeDNwID0gbWVhbih4M3AsIG5hLnJtID0gVFJVRSksCiAgICBvciA9IG1lYW4ob3IsIG5hLnJtID0gVFJVRSksCiAgICBkciA9IG1lYW4oZHIsIG5hLnJtID0gVFJVRSksCiAgICBwcGcgPSBtZWFuKHBwZywgbmEucm0gPSBUUlVFKSwKICAgIG1pbiA9IG1lYW4obWluLCBuYS5ybSA9IFRSVUUpLAogICAgZnQgPSBtZWFuKGZ0LCBuYS5ybSA9IFRSVUUpLAogICAgdG8gPSBtZWFuKHRvLCBuYS5ybSA9IFRSVUUpLAogICAgdXNnID0gbWVhbih1c2csIG5hLnJtID0gVFJVRSksCiAgICBkcnRnID0gbWVhbihkcnRnLCBuYS5ybSA9IFRSVUUpLAogICAgb3J0ZyA9IG1lYW4ob3J0ZywgbmEucm0gPSBUUlVFKSwKICAgIHBsYXllcl9uYW1lID0gbigpCiAgKSAlPiUKICBhcnJhbmdlKHBvc2l0aW9uKQoKIyBWaWV3IHN1bW1hcnkgdGFibGUKcHJpbnQocG9zaXRpb25fc3VtbWFyeSkKYGBgCgpgYGB7cn0KIyBGaWx0ZXI6IHRvcCAyNXRoIHBlcmNlbnRpbGUgZm9yIEFTVCUsIFNUTCUsIEJMSyUsIGFuZCBib3R0b20gMjUlIGZvciBEUlRHIChpLmUuLCBiZXR0ZXIgZGVmZW5kZXJzKQpxdWFudGlsZXMgPC0gbGlzdCgKICBhc3QgPSBxdWFudGlsZShkYXRhJGFzdCwgcHJvYnMgPSAwLjc1LCBuYS5ybSA9IFRSVUUpLAogIHN0bCA9IHF1YW50aWxlKGRhdGEkc3RsLCBwcm9icyA9IDAuNzUsIG5hLnJtID0gVFJVRSksCiAgYmxrID0gcXVhbnRpbGUoZGF0YSRibGssIHByb2JzID0gMC43NSwgbmEucm0gPSBUUlVFKSwKICBwcGcgPSBxdWFudGlsZShkYXRhJHBwZywgcHJvYnMgPSAwLjc1LCBuYS5ybSA9IFRSVUUpLAogIHRzID0gcXVhbnRpbGUoZGF0YSR0cywgcHJvYnMgPSAwLjc1LCBuYS5ybSA9IFRSVUUpLAogIGVmZyA9IHF1YW50aWxlKGRhdGEkZWZnLCBwcm9icyA9IDAuNzUsIG5hLnJtID0gVFJVRSksCiAgbWluID0gcXVhbnRpbGUoZGF0YSRtaW4sIHByb2JzID0gMC43NSwgbmEucm0gPSBUUlVFKQopCiAgCgojIEFwcGx5IGZpbHRlcmluZwp0b3BfcGVyZm9ybWVycyA8LSBkYXRhICU+JQogIGZpbHRlcigKICAgIChhc3QgPj0gcXVhbnRpbGVzJGFzdCB8CiAgICAgc3RsID49IHF1YW50aWxlcyRzdGwgfAogICAgIGJsayA+PSBxdWFudGlsZXMkYmxrIHwKICAgICBwcGcgPj0gcXVhbnRpbGVzJHBwZyB8CiAgICAgdHMgPj0gcXVhbnRpbGVzJHRzKSAmCiAgICAoZWZnID49IHF1YW50aWxlcyRlZmcgfAogICAgIG1pbiA+PSBxdWFudGlsZXMkbWluKQogICkKCgojIFByZXZpZXcgdG9wIHBlcmZvcm1lcnMKcHJpbnQodG9wX3BlcmZvcm1lcnMpCndyaXRlLmNzdih0b3BfcGVyZm9ybWVycywgInRvcF8yMDI1X1BJVF9wZXJmb3JtZXJzLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCgpgYGB7cn0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gY29ycmVjdCB0eXBlcwpkYXRhJHdlaWdodCA8LSBhcy5udW1lcmljKGRhdGEkd2VpZ2h0KQpgYGAKCmBgYHtyfQojIEZpbHRlciB1bmNvbW1pdHRlZCBwbGF5ZXJzIGFuZCBlbnN1cmUgcG9zaXRpb24gaXMgdmFsaWQKUElUZGF0YSA8LSBkYXRhICU+JQogIGZpbHRlcighaXMubmEocG9zaXRpb24pKSAlPiUKICBtdXRhdGUocG9zaXRpb24gPSB0b3VwcGVyKHBvc2l0aW9uKSkgIyBOb3JtYWxpemUgcG9zaXRpb25zCmBgYAoKCmBgYHtyfQpuYW1lcyhQSVRkYXRhKQpgYGAKCgoKYGBge3J9CiMgTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHNjYWxlcykKCgojIDEuIFNjYXR0ZXIgUGxvdDogRkdBIHZzIERSVEcKZ2dwbG90KFBJVGRhdGEsIGFlcyh4ID0geDNwLCB5ID0gZHJ0ZywgbGFiZWwgPSBwYXN0ZShwbGF5ZXJfbmFtZSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiLCBzaXplID0gMykgKwogIGdlb21fdGV4dChzaXplID0gMywgdmp1c3QgPSAtMC43LCBjaGVja19vdmVybGFwID0gVFJVRSkgKwogIGxhYnModGl0bGUgPSAiM1BNIHZzIERlZmVuc2l2ZSBSYXRpbmcgKERSVEcpIGJ5IEN5cm8gQXNzZW8iLAogICAgICAgeCA9ICIzLVBvaW50ZXJzIE1hZGUgKDNQTSkiLAogICAgICAgeSA9ICJEZWZlbnNpdmUgUmF0aW5nICjihpMgQmV0dGVyKSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgMi4gU2NhdHRlciBQbG90OiBQUEcgdnMgRFJURwpnZ3Bsb3QoUElUZGF0YSwgYWVzKHggPSBwcGcsIHkgPSBkcnRnLCBsYWJlbCA9IHBhc3RlKHBsYXllcl9uYW1lKSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzLCB2anVzdCA9IC0wLjcsIGNoZWNrX292ZXJsYXAgPSBUUlVFKSArCiAgbGFicyh0aXRsZSA9ICJQUEcgdnMgRGVmZW5zaXZlIFJhdGluZyAoRFJURykgYnkgQ3lybyBBc3NlbyIsCiAgICAgICB4ID0gIlBvaW50cyBQZXIgR2FtZSAoUFBHKSIsCiAgICAgICB5ID0gIkRlZmVuc2l2ZSBSYXRpbmcgKOKGkyBCZXR0ZXIpIikgKwogIHRoZW1lX21pbmltYWwoKQoKIyAzLiBTY2F0dGVyIFBsb3Q6IE1QIHZzIERSVEcKZ2dwbG90KFBJVGRhdGEsIGFlcyh4ID0gbWluLCB5ID0gZHJ0ZywgbGFiZWwgPSBwYXN0ZShwbGF5ZXJfbmFtZSkpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiLCBzaXplID0gMykgKwogIGdlb21fdGV4dChzaXplID0gMywgdmp1c3QgPSAtMC43LCBjaGVja19vdmVybGFwID0gVFJVRSkgKwogIGxhYnModGl0bGUgPSAiTWludXRlcyBQbGF5ZWQgdnMgRGVmZW5zaXZlIFJhdGluZyAoRFJURykgYnkgQ3lybyBBc3NlbyIsCiAgICAgICB4ID0gIlRvdGFsIE1pbnV0ZXMgUGxheWVkIiwKICAgICAgIHkgPSAiRGVmZW5zaXZlIFJhdGluZyAo4oaTIEJldHRlcikiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIDQuIFNjYXR0ZXIgUGxvdDogRFJURyB2cyBPUlRHCmdncGxvdChQSVRkYXRhLCBhZXMoeCA9IGRydGcsIHkgPSBvcnRnLCBsYWJlbCA9IHBhc3RlKHBsYXllcl9uYW1lKSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzLCB2anVzdCA9IC0wLjcsIGNoZWNrX292ZXJsYXAgPSBUUlVFKSArCiAgbGFicyh0aXRsZSA9ICJEZWZlbnNpdmUgdnMgT2ZmZW5zaXZlIFJhdGluZyBieSBDeXJvIEFzc2VvIiwKICAgICAgIHggPSAiRGVmZW5zaXZlIFJhdGluZyAo4oaTIEJldHRlcikiLAogICAgICAgeSA9ICJPZmZlbnNpdmUgUmF0aW5nICjihpEgQmV0dGVyKSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgNS4gSGVhdG1hcC1zdHlsZSBzY2F0dGVyIChidWJibGUgY2hhcnQpOiBEUlRHIHZzIE9SVEcgd2l0aCBidWJibGUgc2l6ZSA9IFRTJSwgY29sb3IgPSBBU1QlCmdncGxvdChQSVRkYXRhLCBhZXMoeCA9IGRydGcsIHkgPSBvcnRnLCBzaXplID0gdHMsIGNvbG9yID0gYXN0LCBsYWJlbCA9IHBhc3RlKHBsYXllcl9uYW1lKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44KSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gIm9yYW5nZSIsIGhpZ2ggPSAiYmx1ZSIpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDMsIDEwKSkgKwogIGdlb21fdGV4dChzaXplID0gMywgdmp1c3QgPSAtMSwgY2hlY2tfb3ZlcmxhcCA9IFRSVUUpICsKICBsYWJzKHRpdGxlID0gIlRvcCBQSVQgUGxheWVyczogQWxsLUFyb3VuZCBQZXJmb3JtYW5jZSBieSBDeXJvIEFzc2VvIiwKICAgICAgIHggPSAiRGVmZW5zaXZlIFJhdGluZyAo4oaTIEJldHRlcikiLAogICAgICAgeSA9ICJPZmZlbnNpdmUgUmF0aW5nICjihpEgQmV0dGVyKSIsCiAgICAgICBzaXplID0gIlRydWUgU2hvb3RpbmcgJSIsCiAgICAgICBjb2xvciA9ICJBc3Npc3RzIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoUElUZGF0YSwgYWVzKHggPSB4M3AsIHkgPSBkcnRnLCBsYWJlbCA9IHBhc3RlKHBsYXllcl9uYW1lKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzLCB2anVzdCA9IC0wLjcsIGNoZWNrX292ZXJsYXAgPSBUUlVFKSArCiAgbGFicyh0aXRsZSA9ICIzUE0gdnMgRGVmZW5zaXZlIFJhdGluZyAoRFJURykgYnkgQ3lybyBBc3NlbyIsCiAgICAgICB4ID0gIjMtUG9pbnRlcnMgTWFkZSAoM1BNKSIsCiAgICAgICB5ID0gIkRlZmVuc2l2ZSBSYXRpbmcgKOKGkyBCZXR0ZXIpIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgoKCgpgYGB7cn0KIyAxLiBDcmVhdGUgYW5kIG5hbWUgeW91ciBwbG90cwpwMSA8LSBnZ3Bsb3QoUElUZGF0YSwgYWVzKHggPSB4M3AsIHkgPSBkcnRnLCBsYWJlbCA9IHBsYXllcl9uYW1lKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzLCB2anVzdCA9IC0wLjcsIGNoZWNrX292ZXJsYXAgPSBUUlVFKSArCiAgbGFicygKICAgIHRpdGxlID0gIjNQTSB2cyBEZWZlbnNpdmUgUmF0aW5nIChEUlRHKSBieSBDeXJvIEFzc2VvIiwKICAgIHggICAgID0gIjPigJFQb2ludGVycyBNYWRlICgzUE0pIiwKICAgIHkgICAgID0gIkRlZmVuc2l2ZSBSYXRpbmcgKOKGkyBCZXR0ZXIpIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKcDIgPC0gZ2dwbG90KFBJVGRhdGEsIGFlcyh4ID0gcHBnLCB5ID0gZHJ0ZywgbGFiZWwgPSBwbGF5ZXJfbmFtZSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzLCB2anVzdCA9IC0wLjcsIGNoZWNrX292ZXJsYXAgPSBUUlVFKSArCiAgbGFicygKICAgIHRpdGxlID0gIlBQRyB2cyBEZWZlbnNpdmUgUmF0aW5nIChEUlRHKSBieSBDeXJvIEFzc2VvIiwKICAgIHggICAgID0gIlBvaW50cyBQZXIgR2FtZSAoUFBHKSIsCiAgICB5ICAgICA9ICJEZWZlbnNpdmUgUmF0aW5nICjihpMgQmV0dGVyKSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCnAzIDwtIGdncGxvdChQSVRkYXRhLCBhZXMoeCA9IG1pbiwgeSA9IGRydGcsIGxhYmVsID0gcGxheWVyX25hbWUpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiLCBzaXplID0gMykgKwogIGdlb21fdGV4dChzaXplID0gMywgdmp1c3QgPSAtMC43LCBjaGVja19vdmVybGFwID0gVFJVRSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJNaW51dGVzIFBsYXllZCB2cyBEZWZlbnNpdmUgUmF0aW5nIChEUlRHKSBieSBDeXJvIEFzc2VvIiwKICAgIHggICAgID0gIlRvdGFsIE1pbnV0ZXMgUGxheWVkIiwKICAgIHkgICAgID0gIkRlZmVuc2l2ZSBSYXRpbmcgKOKGkyBCZXR0ZXIpIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKcDQgPC0gZ2dwbG90KFBJVGRhdGEsIGFlcyh4ID0gZHJ0ZywgeSA9IG9ydGcsIGxhYmVsID0gcGxheWVyX25hbWUpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyZWQiLCBzaXplID0gMykgKwogIGdlb21fdGV4dChzaXplID0gMywgdmp1c3QgPSAtMC43LCBjaGVja19vdmVybGFwID0gVFJVRSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEZWZlbnNpdmUgdnMgT2ZmZW5zaXZlIFJhdGluZyBieSBDeXJvIEFzc2VvIiwKICAgIHggICAgID0gIkRlZmVuc2l2ZSBSYXRpbmcgKOKGkyBCZXR0ZXIpIiwKICAgIHkgICAgID0gIk9mZmVuc2l2ZSBSYXRpbmcgKOKGkSBCZXR0ZXIpIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKcDUgPC0gZ2dwbG90KFBJVGRhdGEsIGFlcyh4ID0gZHJ0ZywgeSA9IG9ydGcsIHNpemUgPSB0cywgY29sb3IgPSBhc3QsIGxhYmVsID0gcGxheWVyX25hbWUpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOCkgKwogIGdlb21fdGV4dChzaXplID0gMywgdmp1c3QgPSAtMSwgY2hlY2tfb3ZlcmxhcCA9IFRSVUUpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAib3JhbmdlIiwgaGlnaCA9ICJibHVlIikgKwogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMywgMTApKSArCiAgbGFicygKICAgIHRpdGxlID0gIlRvcCBQSVQgUGxheWVyczogQWxs4oCRQXJvdW5kIFBlcmZvcm1hbmNlIGJ5IEN5cm8gQXNzZW8iLAogICAgeCAgICAgPSAiRGVmZW5zaXZlIFJhdGluZyAo4oaTIEJldHRlcikiLAogICAgeSAgICAgPSAiT2ZmZW5zaXZlIFJhdGluZyAo4oaRIEJldHRlcikiLAogICAgc2l6ZSAgPSAiVHJ1ZSBTaG9vdGluZyAlIiwKICAgIGNvbG9yID0gIkFzc2lzdHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIDIuIFNhdmUgZWFjaCBwbG90IHdpdGggZ2dzYXZlKCkKZ2dzYXZlKCIzcG1fdnNfZHJ0Zy5wbmciLCBwbG90ID0gcDEsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwKQpnZ3NhdmUoInBwZ192c19kcnRnLnBuZyIsIHBsb3QgPSBwMiwgd2lkdGggPSA4LCBoZWlnaHQgPSA2LCBkcGkgPSAzMDApCmdnc2F2ZSgibWluX3ZzX2RydGcucG5nIiwgcGxvdCA9IHAzLCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCkKZ2dzYXZlKCJkcnRnX3ZzX29ydGcucG5nIiwgcGxvdCA9IHA0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCkKZ2dzYXZlKCJhbGxfYXJvdW5kX3BlcmZvcm1hbmNlLnBuZyIsIHBsb3QgPSBwNSwgd2lkdGggPSA4LCBoZWlnaHQgPSA2LCBkcGkgPSAzMDApCmBgYAoKIyBORVhUCgpgYGB7cn0KCmxpYnJhcnkoZ3QpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkod2Vic2hvdDIpCgoKIyBDcmVhdGUgYW5kIHNhdmU6IFRvcCBGR0EKdG9wX2ZnYSA8LSBQSVRkYXRhICU+JQogIGFycmFuZ2UoZGVzYyh4MnAgKyB4M3ApKSAlPiUKICBzbGljZV9oZWFkKG4gPSAyMCkgJT4lCiAgZHBseXI6OnNlbGVjdChwbGF5ZXJfbmFtZSwgc2Nob29sLCB4MnAsIHgzcCwgZHJ0ZykKCmd0X2ZnYSA8LSBndCh0b3BfZmdhKSAlPiUKICB0YWJfaGVhZGVyKHRpdGxlID0gIlRvcCBQSVQgUGxheWVycyBieSBGaWVsZCBHb2FsIEF0dGVtcHRzIChGR0EpIGJ5IEN5cm8gQXNzZW8iKQoKZ3RzYXZlKGd0X2ZnYSwgInRvcF9QSVRfZmdhX3RhYmxlLnBuZyIpCgojIENyZWF0ZSBhbmQgc2F2ZTogVG9wIFBQRwp0b3BfcHBnIDwtIFBJVGRhdGEgJT4lCiAgYXJyYW5nZShkZXNjKHBwZykpICU+JQogIHNsaWNlX2hlYWQobiA9IDIwKSAlPiUKICBkcGx5cjo6c2VsZWN0KHBsYXllcl9uYW1lLCBzY2hvb2wsIHBwZywgZHJ0ZykKCmd0X3BwZyA8LSBndCh0b3BfcHBnKSAlPiUKICB0YWJfaGVhZGVyKHRpdGxlID0gIlRvcCBQSVQgUGxheWVycyBieSBQb2ludHMgUGVyIEdhbWUgKFBQRykgYnkgQ3lybyBBc3NlbyIpCgpndHNhdmUoZ3RfcHBnLCAidG9wX3BwZ190YWJsZS5wbmciKQoKIyBDcmVhdGUgYW5kIHNhdmU6IFRvcCBNUAp0b3BfbXAgPC0gUElUZGF0YSAlPiUKICBhcnJhbmdlKGRlc2MobWluKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMjApICU+JQogIGRwbHlyOjpzZWxlY3QocGxheWVyX25hbWUsIHNjaG9vbCwgbWluLCBkcnRnKQoKZ3RfbXAgPC0gZ3QodG9wX21wKSAlPiUKICB0YWJfaGVhZGVyKHRpdGxlID0gIlRvcCBQSVQgUGxheWVycyBieSBNaW51dGVzIFBsYXllZCB4IERSVEcgYnkgQ3lybyBBc3NlbyIpCgpndHNhdmUoZ3RfbXAsICJ0b3BfbXBfdGFibGUucG5nIikKCiMgQ3JlYXRlIGFuZCBzYXZlOiBUb3AgRFJURwp0b3BfZHJ0ZyA8LSBQSVRkYXRhICU+JQogIGFycmFuZ2UoZHJ0ZykgJT4lCiAgc2xpY2VfaGVhZChuID0gMjApICU+JQogIGRwbHlyOjpzZWxlY3QocGxheWVyX25hbWUsIHNjaG9vbCwgZHJ0Zywgb3J0ZykKCmd0X2RydGcgPC0gZ3QodG9wX2RydGcpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiVG9wIFBJVCBQbGF5ZXJzIGJ5IERlZmVuc2l2ZSBSYXRpbmcgKERSVEcpIGJ5IEN5cm8gQXNzZW8iKQoKZ3RzYXZlKGd0X2RydGcsICJ0b3BfZHJ0Z190YWJsZS5wbmciKQoKIyBDcmVhdGUgYW5kIHNhdmU6IFRvcCBCdWJibGUgKEFTVCUpCnRvcF9idWJibGUgPC0gUElUZGF0YSAlPiUKICBhcnJhbmdlKGRlc2MoYXN0KSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMjApICU+JQogIGRwbHlyOjpzZWxlY3QocGxheWVyX25hbWUsIHNjaG9vbCwgZHJ0Zywgb3J0ZywgdHMsIGFzdCkKCmd0X2J1YmJsZSA8LSBndCh0b3BfYnViYmxlKSAlPiUKICB0YWJfaGVhZGVyKHRpdGxlID0gIlRvcCBBbGwtQXJvdW5kIFBJVCBQbGF5ZXJzIChBU1QsIFRTJSkgYnkgQ3lybyBBc3NlbyIpCgpndHNhdmUoZ3RfYnViYmxlLCAidG9wX2J1YmJsZV90YWJsZS5wbmciKQpgYGAKYGBge3J9CiMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeShkcGx5cikKbGlicmFyeShndCkKCiMgMS4gQ29tcHV0ZSBjdXRvZmZzIGZvciDigJx0b3DigJ0gcGVyZm9ybWVycwpxdWFudGlsZXMgPC0gUElUZGF0YSAlPiUKICBzdW1tYXJpc2UoCiAgICBhc3RfcSA9IHF1YW50aWxlKGFzdCwgMC43NSwgbmEucm0gPSBUUlVFKSwKICAgIHN0bF9xID0gcXVhbnRpbGUoc3RsLCAwLjc1LCBuYS5ybSA9IFRSVUUpLAogICAgYmxrX3EgPSBxdWFudGlsZShibGssIDAuNzUsIG5hLnJtID0gVFJVRSksCiAgICBkcnRnX3EgPSBxdWFudGlsZShkcnRnLCAwLjI1LCBuYS5ybSA9IFRSVUUpLCAgIyBsb3dlciBEUlRHIGlzIGJldHRlcgogICAgcHBnX3EgPSBxdWFudGlsZShkYXRhJHBwZywgcHJvYnMgPSAwLjc1LCBuYS5ybSA9IFRSVUUpCgp0b3BfcGVyZm9ybWVycyA8LSBQSVRkYXRhICU+JQogIGZpbHRlcigKICAgIChhc3RfcSA+PSBxdWFudGlsZXMkYXN0IHwKICAgICBzdGxfcSA+PSBxdWFudGlsZXMkc3RsIHwKICAgICBibGtfcSA+PSBxdWFudGlsZXMkYmxrIHwKICAgICBkcnRnX3EgPD0gcXVhbnRpbGVzJGRydGdfcSB8CiAgICAgcHBnX3EgPj0gcXVhbnRpbGVzJHBwZykKICAgIAoKZ3RfdG9wX3BlcmZvcm1lcnMgPC0gZ3QodG9wX3BlcmZvcm1lcnMpICU+JQogIHRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUb3AgUElUIERlZmVuZGVycyAmIEFsbOKAkUFyb3VuZCBJbXBhY3QgYnkgQ3lybyBBc3NlbyIKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBwbGF5ZXJfbmFtZSA9ICJQbGF5ZXIiLAogICAgc2Nob29sICAgICAgPSAiU2Nob29sIiwKICAgIHBvc2l0aW9uICAgID0gIlBvcyIsCiAgICBkcnRnICAgICAgICA9ICJEUlRHIiwKICAgIG9ydGcgICAgICAgID0gIk9SVEciLAogICAgYXN0ICAgICAgICAgPSAiQVNUIiwKICAgIHN0bCAgICAgICAgID0gIlNUTCIsCiAgICBibGsgICAgICAgICA9ICJCTEsiLAogICAgZWZnICAgICAgICAgPSAiZUZHwqAlIiwKICAgIHRzICAgICAgICAgID0gIlRTwqAlIgogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSBjKGRydGcsIG9ydGcsIGFzdCwgc3RsLCBibGssIGVmZywgdHMpLAogICAgZGVjaW1hbHMgPSAxKQoKZ3RzYXZlKAogIGd0X3RvcF9wZXJmb3JtZXJzLAogICJ0b3BfUElUX3BlcmZvcm1lcnNfdGFibGUucG5nIiwKICB2d2lkdGggID0gMjYwMCwgICAjIHZpZXdwb3J0IHdpZHRoIGluIHB4CiAgdmhlaWdodCA9IDE5MDAsICAgICMgdmlld3BvcnQgaGVpZ2h0IGluIHB4CiAgem9vbSAgICA9IDIgICAgICAgIyBzY2FsZSBmYWN0b3IKKQpgYGAKCg==