Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
notconfusing committed Jun 11, 2013
0 parents commit 3c513e5
Show file tree
Hide file tree
Showing 7 changed files with 705 additions and 0 deletions.
258 changes: 258 additions & 0 deletions ItemsByLangPlot.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
require(rjson)
require(reshape)
require(ggplot2)
library(scales)
library(nlstools)
library(stringr)
library(gridExtra)
setwd("~/workspace/venn-analysis")
filter1 <- fromJSON(file='filter1.json')
filter2 <- fromJSON(file='filter2.json')
filter3 <- fromJSON(file='filter3.json')
alln <- fromJSON(file='alln.json')
langtot <- fromJSON(file='langtotals_1.json')

filter1m <- melt(filter1)
filter2m <- melt(filter2)
filter3m <- melt(filter3)
allnm <- melt(alln)


langtotm <-melt(langtot)
langtotm <- langtotm[order(langtotm$value),]


a <- data.frame(matrix(ncol = 0, nrow = length(filter1m$value)))
a["langs"] <- filter1m[c(order(filter1m$L1,filter1m$value)),"L1"]
a["uniqs"] <- filter1m[c(order(filter1m$L1,filter1m$value)),"value"]
a["tots"] <- langtotm[c(order(langtotm$L1,langtotm$value)),"value"]
b <- subset(a, tots > 1000)

c <- b[-63,]
#linear scale
p1 <- ggplot(b, aes(x=tots, y=uniqs), geom="line")+ geom_point(stat="identity") +
geom_text(data=b, aes(x=tots,y=uniqs,label=langs,colour=factor(langs),alpha=.9),
position=position_dodge(width=0.8,height=0.8),vjust=0, angle = 0, size = 8, guide = FALSE) +
scale_x_continuous(labels=comma) + scale_y_continuous(labels=comma) +
geom_smooth(method="loess", se=FALSE) +
labs(x="Total Language Links ", y="Unique Language Links", title="Comparison of Languages in Wikidata, by Language Links \n Minimum 1,000 Items \n Linear Scale") +
theme(legend.position="none")
p1

#log-log plot
p2 <- ggplot(b, aes(x=tots, y=uniqs), geom="line")+ geom_point(stat="identity") +
geom_text(data=b, aes(x=tots,y=uniqs,label=langs,colour=factor(langs),alpha=.9), position=position_dodge(width=0.8,height=0.8),vjust=0, angle = 0, size = 5, guide = FALSE) +
scale_x_log10(labels=comma) + scale_y_log10(labels=comma) +
geom_smooth(method="auto", se=FALSE) +
labs(x="Total Language Links ", y="Unique Language Links", title="Comparison of Languages in Wikidata, by Language Links \n Minimum 1,000 Items \n Log-Log Scale") +
theme(legend.position="none")
p2


#lets try this with a insstead of filter1m
q <- data.frame(matrix(ncol = 0, nrow = length(a$tots)))
q["langs"] <- a[c(order(a$tots,a$langs)),"langs"]
q["uniqs"] <- a[c(order(a$tots,a$langs)),"uniqs"]
q["tots"] <- a[c(order(a$tots,a$langs)),"tots"]
#q["resid"] <- a[c(order(a$uniqs,a$langs)),"resid"]
q["rat"] <- q[,"uniqs"] / q[,"tots"]

q.1 <- subset(q, q[,"tots"]>=100000)
q.2 <- subset(q, q[,"tots"]>=10000 & q[,"tots"]<100000)

totordplot1 <- ggplot(q.1, aes(x=langs, y=rat, fill=tots/max(tots)*100))+
geom_bar(stat="identity", width = .9) +
#geom_bar(stat="identity", width = .5, alpha = .5, colour='red', aes(x=langs, y=resid), data=q.1)+
scale_x_discrete(limits=q.1$langs) +
scale_y_continuous(labels=percent)+
scale_fill_gradient(low=muted("darkgreen"), high=muted("purple"),
limits=c(0,40), "Total Language Links \n as % of English")+
geom_text(aes(x=langs,y=0,label=paste(round(100*rat,2), '%', sep='')),hjust=0, angle = 90, colour='grey', data=q.1) +
labs(title="More than 100,000 Language Links")+
theme_bw()+
theme(axis.title.x=element_blank(), axis.title.y=element_blank())
totordplot1

totordplot2 <- ggplot(q.2, aes(x=langs, y=rat, fill=tots/max(q.1$tots)*100))+
geom_bar(stat="identity", width = .95) +
#geom_bar(stat="identity", width = .5, alpha = .5, colour='red', aes(x=langs, y=resid), data=q.1)+
scale_x_discrete(limits=q.2$langs) +
scale_y_continuous(labels=percent)+
scale_fill_gradient(low=muted("lightblue"), high=muted("lightgreen"), "Total Language Links \n as % of English")+
geom_text(aes(x=langs,y=0,
label=paste(round(100*rat,1), '%', sep='')),
hjust=0, angle = 90, colour='grey')+
labs(title="10,000 to 100,000 Language Links")+
theme_bw()+
theme(axis.title.x=element_blank(), axis.title.y=element_blank())
totordplot2

grid.arrange(totordplot2, totordplot1,
left="Percentage of Unique Items", main="Wikipedia Unique Article Percentage by Wikipedia Size (size as % of English)" )

oq <- data.frame(matrix(ncol = 0, nrow = length(filter1m$value)))
oq["langs"] <- q[c(order(q$rat,q$langs)),"langs]"
oq["rat"] <- q[c(order(q$rat,q$langs)),"rat"]
oq["tots"] <- q[c(order(q$rat,q$langs)),"tots"]
#oq["resid"] <- q[c(order(q$rat,q$langs)),"resid"]

oq.1 <- subset(oq, oq[,"tots"]>=100000)
oq.2 <- subset(oq, oq[,"tots"]>=10000 & oq[,"tots"]<100000)
p6 <- ggplot(oq.1, aes(x=langs, y=rat))+
geom_bar(stat="identity", width = .75, alpha = .5, colour='blue') +
#geom_bar(stat="identity", width = .5, alpha = .5, colour='red', aes(x=langs, y=resid), data=oq.1)+
scale_x_discrete(limits=oq.1$langs) +
scale_y_continuous(labels=comma)+
geom_text(aes(x=langs,y=0,label=paste(round(100*rat,2), '%', sep='')),hjust=0, angle = 90, colour='black', data=oq.1) +
labs(y="Red difference from expected Unique articles. Blue percentage of articles Unique", title="Wikipedia article uniqueness percentage and difference in expected Uniqueness \n Minimum 100,000 articles")
p6


p7 <- ggplot(oq.2, aes(x=langs, y=rat))+
geom_bar(stat="identity", width = .75, alpha = oq.2$tots/max(oq.2$tots), colour='blue') +
scale_x_discrete(limits=oq.2$langs) +
scale_y_continuous(labels=comma)+
geom_text(aes(x=langs,y=0,label=paste(round(100*rat,2), '%', sep='')),hjust=0, angle = 90, colour='black', data=oq.2) +
labs(y="Red difference from expected Unique articles. Blue percentage of articles Unique", title="Wikipedia article uniqueness percentage and difference in expected Uniqueness \n Maximum 100,000 articles")
p7


#on to the pairs
#i'd like to make an upper triangular heatmap
filter2m.5k <- subset(filter2m, value > 5000)
pairs <- data.frame(matrix(ncol = 0, nrow = length(filter2m.5k$value)))
pairs["langs"] <- filter2m.5k[order(-filter2m.5k$value),"L1"]
pairs["tots"] <- filter2m.5k[order(-filter2m.5k$value),"value"]
pairs["hasEN"] <- grepl('en', pairs[,"langs"])
pairs["isP"] <- rep(TRUE, nrow(pairs))
#triples

filter3m.1k <- subset(filter3m, value > 1000)
trips <- data.frame(matrix(ncol = 0, nrow = length(filter3m.1k$value)))
trips["langs"] <- filter3m.1k[order(-filter3m.1k$value),"L1"]
trips["tots"] <- filter3m.1k[order(-filter3m.1k$value),"value"]
trips["hasEN"] <- grepl('en', trips[,"langs"])
trips["isP"] <- rep(FALSE, nrow(trips))

pairsplot <- ggplot(pairs[1:20,], aes(x=langs, y=tots, fill=factor(! hasEN)))+
geom_bar(stat="identity", width=.75, size=3, alpha=1)+
scale_x_discrete(limits=pairs[1:20,]$langs,labels=rep('',20))+
scale_y_continuous(label=comma)+
scale_fill_brewer("English in cluster?", labels=c('Yes', 'No'), palette="Set2")+
geom_text(aes(x=langs,y=0,
label=paste(langs, ' ', prettyNum(tots, big.mark=","))),
hjust=0, angle = 90, colour=muted('pink'))+
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(x="Pair",y='')
pairsplot



tripsplot <- ggplot(trips[1:20,], aes(x=langs, y=tots, fill=factor(! hasEN)))+
geom_bar(stat="identity", width=.75, size=3, alpha=1)+
scale_x_discrete(limits=trips[1:20,]$langs,labels=rep('',20))+
scale_y_continuous(label=comma)+
scale_fill_brewer("English in cluster?", labels=c('Yes', 'No'), palette="Set2")+
geom_text(aes(x=langs,y=0,
label=paste(langs, ' ', prettyNum(tots, big.mark=","))),
hjust=0, angle = 90, colour=muted('pink'))+
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(x="Triple",y='')
tripsplot



tmp <- ggplot_gtable(ggplot_build(tripsplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]

grid.arrange(arrangeGrob(pairsplot + theme(legend.position="none"),
tripsplot + theme(legend.position="none"),
main ="Comparison of Highest Co-occurring Languge Clusters \n Pairs and Triples",
left ="Number of Wikidata Items in Cluster"), legend,
widths=unit.c(unit(.85, "npc"), legend$width), nrow=1)

tap <- rbind(pairs[1:20,], trips[1:20,])
tapo <-data.frame(matrix(ncol = 0, nrow = length(tap$tots)))
tapo["ordr"] <- order(tap$tots)
tapo["tots"]<- tap[order(tap$tots),"tots"]
tapo["langs"]<- tap[order(tap$tots),"langs"]
tapo["isP"]<- tap[order(tap$tots),"isP"]
tapo["hasEN"]<- tap[order(tap$tots),"hasEN"]

tapplot <- ggplot(tapo, aes(x=langs, y=tots, fill=factor(! isP), colour=factor(! hasEN)))+
geom_bar(stat="identity", width=.5, size=3, alpha=.7)+
scale_x_discrete(limits=tapo$langs)+
scale_y_continuous(label=comma)+
scale_colour_brewer("English in cluster?", labels=c('Yes', 'No'), palette="Set1")+
scale_fill_brewer("Cluster type", labels=c('Pair', 'Triple'), palette="Set2")+
#scale_fill_hue("Cluster type", labels=c('Pair', 'Triple'), l=50, h=c(315,135), c=80)+
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(y="Number of Wikidata Items in Cluster", x="Cluster",
title="Comparison of Highest Co-occurring Languges Clusters")



tapplot

#alln



allnm["univgroup"] <- rep(1,length(allnm[,0]))
allnm["ninecol"] <- as.numeric(allnm[,"L1"]) %% 8
allnm["rat"] <- allnm[,"value"] / sum(allnm[,"value"])
allnm["sumsupto"] <- cumsum(allnm$rat)



allnplot1 <- ggplot(allnm, aes(x=factor(univgroup), y=rat, fill=factor(ninecol))) +
scale_y_continuous(breaks=subset(allnm$sumsupto, allnm$sumsupto <0.971),
labels=paste(round(100*subset(allnm$sumsupto, allnm$sumsupto <0.971),2), '%', sep=''))+
scale_x_discrete(breaks="none",label="none")+
geom_bar(stat ="identity" ,position = "stack") +
geom_text(aes(y=sumsupto-(rat/2),
label=allnm$L1),
size=(1/as.numeric(allnm$L1)) *15 ) +
scale_fill_brewer(type = "seq", palette = 3,guide='none')+
coord_cartesian(ylim=c(0, 1))+
theme(title=element_blank())

allnplot2 <- ggplot(allnm, aes(x=factor(univgroup), y=rat, fill=factor(ninecol))) +
scale_y_continuous(breaks=subset(allnm$sumsupto, allnm$sumsupto <0.992),
labels=paste(round(100*subset(allnm$sumsupto, allnm$sumsupto <0.992),2), '%', sep=''))+
scale_x_discrete(breaks="none",label="none")+
geom_bar(stat ="identity" ,position = "stack") +
geom_text(aes(y=sumsupto-(rat/2),
label=allnm$L1),
size=(1/as.numeric(allnm$L1)) *60 ) +
scale_fill_brewer(type = "seq", palette = 3,guide='none')+
coord_cartesian(ylim=c(0.9442275, 1))+
theme(title=element_blank())

allnplot3 <- ggplot(allnm, aes(x=factor(univgroup), y=rat, fill=factor(ninecol))) +
scale_y_continuous(breaks=subset(allnm$sumsupto, allnm$sumsupto <0.9987),
labels=paste(round(100*subset(allnm$sumsupto, allnm$sumsupto <0.9987),2), '%', sep=''))+
scale_x_discrete(breaks="none",label="none")+
geom_bar(stat ="identity" ,position = "stack") +
geom_text(aes(y=sumsupto-(rat/2),
label=allnm$L1),
size=(1/as.numeric(allnm$L1)) *120 ) +
scale_fill_brewer(type = "seq", palette = 3,guide='none')+
coord_cartesian(ylim=c(0.9951513, 1))+
theme(title=element_blank())

allnplot4 <- ggplot(allnm, aes(x=factor(univgroup), y=rat, fill=factor(ninecol))) +
scale_y_continuous(breaks=subset(allnm$sumsupto, allnm$sumsupto <0.99995),
labels=paste(round(100*subset(allnm$sumsupto, allnm$sumsupto <0.99995),5), '%', sep=''))+
scale_x_discrete(breaks="none",label="none")+
geom_bar(stat ="identity" ,position = "stack", label="none") +
geom_text(aes(y=sumsupto-(rat/2),
label=allnm$L1),
size=(1/as.numeric(allnm$L1)) *360 ) +
scale_fill_brewer(type = "seq", palette = 3,guide='none')+
coord_cartesian(ylim=c(0.9998727, 1))+
theme(title=element_blank())

grid.arrange(allnplot1, allnplot2, allnplot3, allnplot4, ncol=4,
left="Composition of Wikidata Items", sub="Number of Language Links in Wikidata Item", main="Composition of Wikidata Items by Language Link Count")
1 change: 1 addition & 0 deletions alln.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"1": 7972524, "2": 1578043, "3": 735573, "4": 410988, "5": 244478, "6": 147416, "7": 110289, "8": 87146, "9": 71751, "10": 60068, "11": 47381, "12": 39861, "13": 35213, "14": 29190, "15": 25439, "16": 22633, "17": 21041, "18": 19071, "19": 15768, "20": 14086, "21": 14027, "22": 14276, "23": 14195, "24": 13593, "25": 12421, "26": 11072, "27": 10455, "28": 8645, "29": 6976, "30": 5337, "31": 4352, "32": 3680, "33": 3209, "34": 2840, "35": 2567, "36": 2357, "37": 2224, "38": 2019, "39": 1862, "40": 1709, "41": 1594, "42": 1528, "43": 1399, "44": 1387, "45": 1257, "46": 1235, "47": 1221, "48": 1246, "49": 1153, "50": 1186, "51": 1128, "52": 1069, "53": 880, "54": 853, "55": 830, "56": 827, "57": 745, "58": 668, "59": 597, "60": 568, "61": 602, "62": 546, "63": 534, "64": 457, "65": 447, "66": 463, "67": 421, "68": 409, "69": 356, "70": 383, "71": 376, "72": 303, "73": 295, "74": 305, "75": 214, "76": 236, "77": 209, "78": 169, "79": 152, "80": 155, "81": 175, "82": 171, "83": 120, "84": 142, "85": 146, "86": 113, "87": 139, "88": 112, "89": 122, "90": 124, "91": 87, "92": 101, "93": 110, "94": 101, "95": 102, "96": 102, "97": 100, "98": 104, "99": 115, "100": 238, "101": 320, "102": 236, "103": 197, "104": 145, "105": 125, "106": 146, "107": 136, "108": 114, "109": 136, "110": 101, "111": 93, "112": 78, "113": 72, "114": 56, "115": 58, "116": 56, "117": 74, "118": 80, "119": 60, "120": 59, "121": 43, "122": 39, "123": 38, "124": 45, "125": 47, "126": 28, "127": 24, "128": 29, "129": 21, "130": 22, "131": 19, "132": 23, "133": 17, "134": 28, "135": 22, "136": 31, "137": 19, "138": 34, "139": 27, "140": 22, "141": 20, "142": 30, "143": 25, "144": 25, "145": 33, "146": 47, "147": 42, "148": 57, "149": 63, "150": 47, "151": 48, "152": 39, "153": 27, "154": 21, "155": 31, "156": 30, "157": 21, "158": 18, "159": 20, "160": 15, "161": 25, "162": 19, "163": 28, "164": 18, "165": 19, "166": 15, "167": 20, "168": 12, "169": 11, "170": 15, "171": 6, "172": 10, "173": 9, "174": 8, "175": 11, "176": 13, "177": 10, "178": 14, "179": 6, "180": 14, "181": 6, "182": 6, "183": 4, "184": 8, "185": 5, "186": 7, "187": 5, "188": 6, "189": 9, "190": 6, "191": 7, "192": 10, "193": 0, "194": 4, "195": 5, "196": 7, "197": 2, "198": 3, "199": 1, "200": 3, "201": 5, "202": 3, "203": 10, "204": 5, "205": 6, "206": 7, "207": 3, "208": 4, "209": 3, "210": 3, "211": 5, "212": 3, "213": 2, "214": 5, "215": 6, "216": 5, "217": 3, "218": 7, "219": 6, "220": 2, "221": 0, "222": 1, "223": 2, "224": 0, "225": 6, "226": 3, "227": 1, "228": 3, "229": 2, "230": 2, "231": 0, "232": 0, "233": 2, "234": 1, "235": 1, "236": 1, "237": 0, "238": 2, "239": 2, "240": 2, "241": 4, "242": 1, "243": 0, "244": 1, "245": 0, "246": 0, "247": 0, "248": 2, "249": 0, "250": 0, "251": 1, "252": 1, "253": 1, "254": 0, "255": 2, "256": 0, "257": 0, "258": 2, "259": 0, "260": 0, "261": 0, "262": 0, "263": 1, "264": 1, "265": 0, "266": 1, "267": 0, "268": 1, "269": 0, "270": 2, "271": 1, "272": 0, "273": 0, "274": 1, "275": 1, "276": 1, "277": 0, "278": 0, "279": 0, "280": 0, "281": 0, "282": 0, "283": 0, "284": 0, "285": 0, "286": 1}
1 change: 1 addition & 0 deletions filter1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"gv": 439, "sco": 1804, "scn": 3475, "wuu": 384, "cdo": 17, "gu": 19670, "kbd": 75, "ng": 0, "gd": 874, "fiu_vro": 600, "ga": 2118, "gn": 60, "gl": 33237, "als": 829, "lg": 0, "hak": 162, "lb": 7108, "szl": 447, "vep": 33, "la": 13113, "ln": 477, "lo": 157, "tt": 6953, "tr": 53292, "ts": 24, "li": 631, "lv": 6155, "bat_smg": 2419, "lt": 38361, "vec": 1498, "th": 25157, "bjn": 246, "tg": 2210, "te": 24925, "ksh": 229, "pcd": 184, "ta": 22395, "yi": 346, "xmf": 397, "ceb": 12604, "yo": 993, "de": 667155, "da": 49791, "za": 32, "dz": 1, "hif": 3904, "rm": 243, "dv": 98, "qu": 3665, "nov": 232, "be_x_old": 15061, "pnt": 44, "eml": 161, "bxr": 36, "bpy": 3982, "crh": 160, "ilo": 266, "mhr": 725, "diq": 501, "el": 19705, "eo": 17095, "en": 2551742, "zh": 235777, "pms": 8025, "ee": 338, "tpi": 19, "arz": 3604, "rmy": 17, "mdf": 384, "kaa": 110, "mh": 0, "arc": 39, "cr": 8, "eu": 24961, "et": 28931, "tet": 44, "es": 318706, "ba": 3548, "ru": 349445, "rw": 44, "mus": 0, "mrj": 127, "ha": 3, "ak": 9, "bm": 9, "new": 46544, "rn": 1, "ro": 30385, "dsb": 167, "bn": 10194, "hsb": 1550, "be": 5080, "bg": 31096, "myv": 64, "uk": 16371, "wa": 5109, "ast": 2682, "wo": 114, "got": 22, "jv": 14006, "bo": 64, "bh": 55, "bi": 19, "rue": 47, "tum": 9, "br": 3641, "bs": 15327, "lez": 218, "ja": 136729, "om": 14, "glk": 334, "ace": 43, "roa_rup": 158, "nds_nl": 289, "ty": 12, "oc": 4714, "ltg": 111, "st": 14, "tw": 16, "krc": 191, "nds": 1451, "pdc": 151, "or": 322, "ext": 332, "xh": 22, "roa_tara": 745, "co": 102, "os": 770, "nso": 18, "simple": 4878, "zh_yue": 3299, "ca": 11360, "lmo": 2648, "ce": 247, "cy": 9289, "ang": 283, "cs": 61105, "udm": 59, "cv": 3273, "cu": 7, "ve": 4, "koi": 239, "ps": 256, "fj": 0, "srn": 104, "pt": 199587, "to": 223, "sm": 8, "tl": 17929, "cho": 0, "frr": 889, "chr": 42, "pa": 515, "xal": 14, "chy": 45, "pi": 24, "war": 11547, "pl": 184879, "tk": 301, "hz": 0, "hy": 10775, "an": 4602, "nrm": 35, "hr": 23149, "iu": 22, "ti": 2, "pfl": 197, "ht": 12366, "hu": 68965, "gan": 918, "hi": 62168, "vls": 350, "ho": 0, "gag": 97, "pnb": 2416, "bug": 48, "kj": 0, "he": 39017, "ii": 0, "mg": 9049, "fur": 192, "uz": 17532, "ml": 13700, "mo": 1, "mn": 482, "mi": 335, "ik": 8, "mk": 17164, "ur": 6935, "zea": 89, "mt": 546, "stq": 370, "ms": 43162, "mr": 13175, "zh_classical": 1073, "ug": 14, "mwl": 920, "my": 20557, "ki": 11, "pih": 6, "aa": 0, "sah": 1388, "ss": 17, "af": 2463, "tn": 58, "vi": 79293, "is": 2851, "am": 4046, "it": 380758, "vo": 2517, "ch": 30, "ay": 51, "as": 369, "ar": 110702, "lbe": 14, "km": 392, "io": 847, "av": 15, "ia": 148, "haw": 38, "az": 28166, "ie": 17, "id": 54507, "ig": 97, "pap": 57, "ks": 2, "nl": 300278, "nn": 13161, "no": 11771, "na": 83, "nah": 800, "ne": 10622, "lij": 226, "csb": 72, "ny": 3, "nap": 764, "sh": 8289, "cbk_zam": 107, "map_bms": 2662, "pag": 63, "zu": 22, "kw": 116, "pam": 292, "nv": 380, "sn": 9, "kab": 61, "fr": 423923, "jbo": 237, "lad": 144, "fy": 7456, "sv": 289709, "frp": 173, "fa": 131681, "ff": 4, "fi": 20073, "mzn": 1468, "ab": 43, "sa": 1149, "fo": 414, "bcl": 275, "bar": 370, "ka": 15148, "kg": 39, "ckb": 6438, "kk": 55516, "sr": 21173, "sq": 14996, "min": 465, "ko": 53896, "kn": 5505, "su": 4851, "kl": 55, "sk": 29129, "kr": 0, "si": 2024, "zh_min_nan": 631, "so": 148, "kv": 702, "ku": 9525, "sl": 34781, "sc": 124, "ky": 10976, "sg": 15, "sw": 4073, "se": 891, "sd": 30}
1 change: 1 addition & 0 deletions filter2.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions filter3.json

Large diffs are not rendered by default.

Loading

0 comments on commit 3c513e5

Please sign in to comment.