The purpose of this study is describing the distribution of ties in irrational numbers when considering sequences of embedding dimension \(D\) (and \(\tau=1\)). The finding will help building a model for simulating such occurrences and, then, assessing imputation techniques in a Monte Carlo study.

source('Bandt-Pompe.R')
if(!require(ggpubr)){
  install.packages("ggpubr")
  require(ggpubr)
}
if(!require(ggplot2)){
  install.packages("ggplot2")
  require(ggplot2)
}
if(!require(ggthemes)){
  install.packages("ggthemes")
  require(ggthemes)
}

Analysis of the distribution of repeated symbols for sequences with N = 1000

e.data = read.table('../Data/e.txt', stringsAsFactors=FALSE, fileEncoding="latin1")
pi.data = read.table('../Data/pi.txt', stringsAsFactors=FALSE, fileEncoding="latin1")
sqrt2.data = read.table('../Data/sqrt2.txt', stringsAsFactors=FALSE, fileEncoding="latin1")

e.vector = as.numeric(strsplit(as.character(e.data), "")[[1]])[3:100011]
pi.vector = as.numeric(strsplit(as.character(pi.data), "")[[1]])[3:100011]
sqrt2.vector = as.numeric(strsplit(as.character(sqrt2.data), "")[[1]])[3:100030]

n.series = 100
n.elements = 1000
e.series = asplit(array(e.vector, c(n.elements, round(length(e.vector)/n.elements))), MARGIN = 2)
pi.series = asplit(array(pi.vector, c(n.elements, round(length(pi.vector)/n.elements))), MARGIN = 2)
sqrt2.series = asplit(array(sqrt2.vector, c(n.elements, round(length(sqrt2.vector)/n.elements))), MARGIN = 2)
D = 3
Tau = 1
e.percent.D3 = pi.percent.D3 = sqrt2.percent.D3 = rep(0, n.series)

for(i in 1:n.series){
  elements = formationPattern(e.series[[i]], D, Tau, 1)
  e.percent.D3[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(pi.series[[i]], D, Tau, 1)
  pi.percent.D3[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(sqrt2.series[[i]], D, Tau, 1)
  sqrt2.percent.D3[i] = percentual.equalities(elements)
}

data.D3 <- data.frame(
  type = c(rep("e", n.series), rep("pi", n.series), rep("sqrt2", n.series)),
  value = c(e.percent.D3, pi.percent.D3, sqrt2.percent.D3)
)
par(mfrow=c(1,1)) 
data.D3 %>%
    ggplot(aes(x = value, fill = type)) +
    geom_histogram(color="#e9ecef", alpha = 3.6, position = 'identity', bins = n.series/2) +
    scale_fill_manual(values=c("#69b3a2", "#404080", "#d4bf08")) +
    theme_few(base_size = 12, base_family = "serif") +
    labs(fill = "") +
    ggtitle('D = 3') + 
    facet_grid(~type) +  
    theme(plot.title = element_text(hjust=0.5))

D = 4
Tau = 1
e.percent.D4 = pi.percent.D4 = sqrt2.percent.D4 = rep(0, n.series)

for(i in 1:n.series){
  elements = formationPattern(e.series[[i]], D, Tau, 1)
  e.percent.D4[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(pi.series[[i]], D, Tau, 1)
  pi.percent.D4[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(sqrt2.series[[i]], D, Tau, 1)
  sqrt2.percent.D4[i] = percentual.equalities(elements)
}

data.D4 <- data.frame(
  type = c(rep("e", n.series), rep("pi", n.series), rep("sqrt2", n.series)),
  value = c(e.percent.D4, pi.percent.D4, sqrt2.percent.D4)
)
par(mfrow=c(1,1)) 
data.D4 %>%
    ggplot(aes(x = value, fill = type)) +
    geom_histogram(color="#e9ecef", alpha = 3.6, position = 'identity', bins = n.series/2) +
    scale_fill_manual(values=c("#69b3a2", "#404080", "#d4bf08")) +
    theme_few(base_size = 12, base_family = "serif") +
    labs(fill="") +
    ggtitle('D = 4') + 
    facet_grid(~type) +  
    theme(plot.title = element_text(hjust=0.5))

Normality test for N = 1000 with Shapiro-wilk

cat(' (D = 3 & N = 1000) -> p-values: ', 
    shapiro.test(data.D3[1:100,]$value)$p.value, " ", 
    shapiro.test(data.D3[101:200,]$value)$p.value, " ", 
    shapiro.test(data.D3[201:300,]$value)$p.value, '\n',
    '(D = 4 & N = 1000) -> p-values: ', 
    shapiro.test(data.D4[1:100,]$value)$p.value, " ", 
    shapiro.test(data.D4[101:200,]$value)$p.value, " ", 
    shapiro.test(data.D4[201:300,]$value)$p.value)
 (D = 3 & N = 1000) -> p-values:  0.02877825   0.7478345   0.07641253 
 (D = 4 & N = 1000) -> p-values:  0.0455737   0.2775077   0.7623933

Analysis of the distribution of repeated symbols for sequences with N = 10000

n.series = 10
n.elements = 10000
e.series = asplit(array(e.vector, c(n.elements, round(length(e.vector)/n.elements))), MARGIN = 2)
pi.series = asplit(array(pi.vector, c(n.elements, round(length(pi.vector)/n.elements))), MARGIN = 2)
sqrt2.series = asplit(array(sqrt2.vector, c(n.elements, round(length(sqrt2.vector)/n.elements))), MARGIN = 2)
D = 3
Tau = 1
e.percent.D3 = pi.percent.D3 = sqrt2.percent.D3 = rep(0, n.series)

for(i in 1:n.series){
  elements = formationPattern(e.series[[i]], D, Tau, 1)
  e.percent.D3[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(pi.series[[i]], D, Tau, 1)
  pi.percent.D3[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(sqrt2.series[[i]], D, Tau, 1)
  sqrt2.percent.D3[i] = percentual.equalities(elements)
}

data.D3 <- data.frame(
  type = c(rep("e", n.series), rep("pi", n.series), rep("sqrt2", n.series)),
  value = c(e.percent.D3, pi.percent.D3, sqrt2.percent.D3)
)
data.D3 %>%
    ggplot(aes(x = value, fill = type)) +
    geom_histogram(color="#e9ecef", alpha = 3.6, position = 'identity', bins = n.series) +
    scale_fill_manual(values=c("#69b3a2", "#404080", "#d4bf08")) +
    theme_few(base_size = 12, base_family = "serif") +
    labs(fill = "") +
    ggtitle('D = 3') + 
    facet_grid(~type) +  
    theme(plot.title = element_text(hjust=0.5))

D = 4
Tau = 1
e.percent.D4 = pi.percent.D4 = sqrt2.percent.D4 = rep(0, n.series)

for(i in 1:n.series){
  elements = formationPattern(e.series[[i]], D, Tau, 1)
  e.percent.D4[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(pi.series[[i]], D, Tau, 1)
  pi.percent.D4[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(sqrt2.series[[i]], D, Tau, 1)
  sqrt2.percent.D4[i] = percentual.equalities(elements)
}

data.D4 <- data.frame(
  type = c(rep("e", n.series), rep("pi", n.series), rep("sqrt2", n.series)),
  value = c(e.percent.D4, pi.percent.D4, sqrt2.percent.D4)
)
data.D4 %>%
    ggplot(aes(x = value, fill = type)) +
    geom_histogram(color="#e9ecef", alpha = 3.6, position = 'identity', bins = n.series) +
    scale_fill_manual(values=c("#69b3a2", "#404080", "#d4bf08")) +
    theme_few(base_size = 12, base_family = "serif") +
    labs(fill="") +
    ggtitle('D = 4') + 
    facet_grid(~type) +  
    theme(plot.title = element_text(hjust=0.5))

D = 5
Tau = 1
e.percent.D5 = pi.percent.D5 = sqrt2.percent.D5 = rep(0, n.series)

for(i in 1:n.series){
  elements = formationPattern(e.series[[i]], D, Tau, 1)
  e.percent.D5[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(pi.series[[i]], D, Tau, 1)
  pi.percent.D5[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(sqrt2.series[[i]], D, Tau, 1)
  sqrt2.percent.D5[i] = percentual.equalities(elements)
}

data.D5 <- data.frame(
  type = c(rep("e", n.series), rep("pi", n.series), rep("sqrt2", n.series)),
  value = c(e.percent.D5, pi.percent.D5, sqrt2.percent.D5)
)
data.D5 %>%
    ggplot(aes(x = value, fill = type)) +
    geom_histogram(color="#e9ecef", alpha = 3.6, position = 'identity', bins = n.series) +
    scale_fill_manual(values=c("#69b3a2", "#404080", "#d4bf08")) +
    theme_few(base_size = 12, base_family = "serif") +
    labs(fill="") +
    ggtitle('D = 5') + 
    facet_grid(~type) +  
    theme(plot.title = element_text(hjust=0.5))

D = 6
Tau = 1
e.percent.D6 = pi.percent.D6 = sqrt2.percent.D6 = rep(0, n.series)

for(i in 1:n.series){
  elements = formationPattern(e.series[[i]], D, Tau, 1)
  e.percent.D6[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(pi.series[[i]], D, Tau, 1)
  pi.percent.D6[i] = percentual.equalities(elements)
}
for(i in 1:n.series){
  elements = formationPattern(sqrt2.series[[i]], D, Tau, 1)
  sqrt2.percent.D6[i] = percentual.equalities(elements)
}

data.D6 <- data.frame(
  type = c(rep("e", n.series), rep("pi", n.series), rep("sqrt2", n.series)),
  value = c(e.percent.D6, pi.percent.D6, sqrt2.percent.D6)
)
data.D6 %>%
    ggplot(aes(x = value, fill = type)) +
    geom_histogram(color="#e9ecef", alpha = 3.6, position = 'identity', bins = n.series) +
    scale_fill_manual(values=c("#69b3a2", "#404080", "#d4bf08")) +
    theme_few(base_size = 12, base_family = "serif") +
    labs(fill="") +
    ggtitle('D = 6') + 
    facet_grid(~type) +  
    theme(plot.title = element_text(hjust=0.5))

Normality test for N = 10000 with Shapiro-wilk

cat(' (D = 3 & N = 10000) -> p-values: ', 
    shapiro.test(data.D3[1:10,]$value)$p.value, " ", 
    shapiro.test(data.D3[11:20,]$value)$p.value, " ", 
    shapiro.test(data.D3[21:30,]$value)$p.value, '\n',
    '(D = 4 & N = 10000) -> p-values: ', 
    shapiro.test(data.D4[1:10,]$value)$p.value, " ", 
    shapiro.test(data.D4[11:20,]$value)$p.value, " ", 
    shapiro.test(data.D4[21:30,]$value)$p.value, '\n',
    '(D = 5 & N = 10000) -> p-values: ', 
    shapiro.test(data.D5[1:10,]$value)$p.value, " ", 
    shapiro.test(data.D5[11:20,]$value)$p.value, " ", 
    shapiro.test(data.D5[21:30,]$value)$p.value, '\n',
    '(D = 6 & N = 10000) -> p-values: ', 
    shapiro.test(data.D6[1:10,]$value)$p.value, " ", 
    shapiro.test(data.D6[11:20,]$value)$p.value, " ", 
    shapiro.test(data.D6[21:30,]$value)$p.value)
 (D = 3 & N = 10000) -> p-values:  0.2182204   0.6359071   0.5956063 
 (D = 4 & N = 10000) -> p-values:  0.7717133   0.0474167   0.2127638 
 (D = 5 & N = 10000) -> p-values:  0.7599577   0.02953326   0.05893071 
 (D = 6 & N = 10000) -> p-values:  0.3857358   0.1359803   0.2876493
LS0tCnRpdGxlOiAiU3R1ZHkgb2YgdGhlIEVtcGlyaWNhbCBEaXN0cmlidXRpb24gb2YgVGllcyBpbiBJcnJhdGlvbmFsIE51bWJlcnMiCmF1dGhvcjogIkVkdWFyZGEgQ2hhZ2FzIgpkYXRlOiAiTm92IDcsIDIwMjAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoZSBwdXJwb3NlIG9mIHRoaXMgc3R1ZHkgaXMgZGVzY3JpYmluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIHRpZXMgaW4gaXJyYXRpb25hbCBudW1iZXJzIHdoZW4gY29uc2lkZXJpbmcgc2VxdWVuY2VzIG9mIGVtYmVkZGluZyBkaW1lbnNpb24gJEQkIChhbmQgJFx0YXU9MSQpLgpUaGUgZmluZGluZyB3aWxsIGhlbHAgYnVpbGRpbmcgYSBtb2RlbCBmb3Igc2ltdWxhdGluZyBzdWNoIG9jY3VycmVuY2VzIGFuZCwgdGhlbiwgYXNzZXNzaW5nIGltcHV0YXRpb24gdGVjaG5pcXVlcyBpbiBhIE1vbnRlIENhcmxvIHN0dWR5LgoKYGBge3J9IApzb3VyY2UoJ0JhbmR0LVBvbXBlLlInKQppZighcmVxdWlyZShnZ3B1YnIpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3B1YnIiKQogIHJlcXVpcmUoZ2dwdWJyKQp9CmlmKCFyZXF1aXJlKGdncGxvdDIpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKICByZXF1aXJlKGdncGxvdDIpCn0KaWYoIXJlcXVpcmUoZ2d0aGVtZXMpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3RoZW1lcyIpCiAgcmVxdWlyZShnZ3RoZW1lcykKfQpgYGAKCiMjIyBBbmFseXNpcyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlcGVhdGVkIHN5bWJvbHMgZm9yIHNlcXVlbmNlcyB3aXRoIE4gPSAxMDAwCgpgYGB7cn0gCmUuZGF0YSA9IHJlYWQudGFibGUoJy4uL0RhdGEvZS50eHQnLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLCBmaWxlRW5jb2Rpbmc9ImxhdGluMSIpCnBpLmRhdGEgPSByZWFkLnRhYmxlKCcuLi9EYXRhL3BpLnR4dCcsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsIGZpbGVFbmNvZGluZz0ibGF0aW4xIikKc3FydDIuZGF0YSA9IHJlYWQudGFibGUoJy4uL0RhdGEvc3FydDIudHh0Jywgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwgZmlsZUVuY29kaW5nPSJsYXRpbjEiKQoKZS52ZWN0b3IgPSBhcy5udW1lcmljKHN0cnNwbGl0KGFzLmNoYXJhY3RlcihlLmRhdGEpLCAiIilbWzFdXSlbMzoxMDAwMTFdCnBpLnZlY3RvciA9IGFzLm51bWVyaWMoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHBpLmRhdGEpLCAiIilbWzFdXSlbMzoxMDAwMTFdCnNxcnQyLnZlY3RvciA9IGFzLm51bWVyaWMoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHNxcnQyLmRhdGEpLCAiIilbWzFdXSlbMzoxMDAwMzBdCgpuLnNlcmllcyA9IDEwMApuLmVsZW1lbnRzID0gMTAwMAplLnNlcmllcyA9IGFzcGxpdChhcnJheShlLnZlY3RvciwgYyhuLmVsZW1lbnRzLCByb3VuZChsZW5ndGgoZS52ZWN0b3IpL24uZWxlbWVudHMpKSksIE1BUkdJTiA9IDIpCnBpLnNlcmllcyA9IGFzcGxpdChhcnJheShwaS52ZWN0b3IsIGMobi5lbGVtZW50cywgcm91bmQobGVuZ3RoKHBpLnZlY3Rvcikvbi5lbGVtZW50cykpKSwgTUFSR0lOID0gMikKc3FydDIuc2VyaWVzID0gYXNwbGl0KGFycmF5KHNxcnQyLnZlY3RvciwgYyhuLmVsZW1lbnRzLCByb3VuZChsZW5ndGgoc3FydDIudmVjdG9yKS9uLmVsZW1lbnRzKSkpLCBNQVJHSU4gPSAyKQpgYGAKCmBgYHtyfSAKRCA9IDMKVGF1ID0gMQplLnBlcmNlbnQuRDMgPSBwaS5wZXJjZW50LkQzID0gc3FydDIucGVyY2VudC5EMyA9IHJlcCgwLCBuLnNlcmllcykKCmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihlLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgZS5wZXJjZW50LkQzW2ldID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGVsZW1lbnRzKQp9CmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihwaS5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIHBpLnBlcmNlbnQuRDNbaV0gPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoZWxlbWVudHMpCn0KZm9yKGkgaW4gMTpuLnNlcmllcyl7CiAgZWxlbWVudHMgPSBmb3JtYXRpb25QYXR0ZXJuKHNxcnQyLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgc3FydDIucGVyY2VudC5EM1tpXSA9IHBlcmNlbnR1YWwuZXF1YWxpdGllcyhlbGVtZW50cykKfQoKZGF0YS5EMyA8LSBkYXRhLmZyYW1lKAogIHR5cGUgPSBjKHJlcCgiZSIsIG4uc2VyaWVzKSwgcmVwKCJwaSIsIG4uc2VyaWVzKSwgcmVwKCJzcXJ0MiIsIG4uc2VyaWVzKSksCiAgdmFsdWUgPSBjKGUucGVyY2VudC5EMywgcGkucGVyY2VudC5EMywgc3FydDIucGVyY2VudC5EMykKKQpkYXRhLkQzICU+JQogICAgZ2dwbG90KGFlcyh4ID0gdmFsdWUsIGZpbGwgPSB0eXBlKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9IiNlOWVjZWYiLCBhbHBoYSA9IDMuNiwgcG9zaXRpb24gPSAnaWRlbnRpdHknLCBiaW5zID0gbi5zZXJpZXMvMikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2OWIzYTIiLCAiIzQwNDA4MCIsICIjZDRiZjA4IikpICsKICAgIHRoZW1lX2ZldyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2VyaWYiKSArCiAgICBsYWJzKGZpbGwgPSAiIikgKwogICAgZ2d0aXRsZSgnRCA9IDMnKSArIAogICAgZmFjZXRfZ3JpZCh+dHlwZSkgKyAgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKCmBgYHtyfSAKRCA9IDQKVGF1ID0gMQplLnBlcmNlbnQuRDQgPSBwaS5wZXJjZW50LkQ0ID0gc3FydDIucGVyY2VudC5ENCA9IHJlcCgwLCBuLnNlcmllcykKCmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihlLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgZS5wZXJjZW50LkQ0W2ldID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGVsZW1lbnRzKQp9CmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihwaS5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIHBpLnBlcmNlbnQuRDRbaV0gPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoZWxlbWVudHMpCn0KZm9yKGkgaW4gMTpuLnNlcmllcyl7CiAgZWxlbWVudHMgPSBmb3JtYXRpb25QYXR0ZXJuKHNxcnQyLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgc3FydDIucGVyY2VudC5ENFtpXSA9IHBlcmNlbnR1YWwuZXF1YWxpdGllcyhlbGVtZW50cykKfQoKZGF0YS5ENCA8LSBkYXRhLmZyYW1lKAogIHR5cGUgPSBjKHJlcCgiZSIsIG4uc2VyaWVzKSwgcmVwKCJwaSIsIG4uc2VyaWVzKSwgcmVwKCJzcXJ0MiIsIG4uc2VyaWVzKSksCiAgdmFsdWUgPSBjKGUucGVyY2VudC5ENCwgcGkucGVyY2VudC5ENCwgc3FydDIucGVyY2VudC5ENCkKKQpkYXRhLkQ0ICU+JQogICAgZ2dwbG90KGFlcyh4ID0gdmFsdWUsIGZpbGwgPSB0eXBlKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9IiNlOWVjZWYiLCBhbHBoYSA9IDMuNiwgcG9zaXRpb24gPSAnaWRlbnRpdHknLCBiaW5zID0gbi5zZXJpZXMvMikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2OWIzYTIiLCAiIzQwNDA4MCIsICIjZDRiZjA4IikpICsKICAgIHRoZW1lX2ZldyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2VyaWYiKSArCiAgICBsYWJzKGZpbGw9IiIpICsKICAgIGdndGl0bGUoJ0QgPSA0JykgKyAKICAgIGZhY2V0X2dyaWQofnR5cGUpICsgIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMjIyMgTm9ybWFsaXR5IHRlc3QgZm9yIE4gPSAxMDAwIHdpdGggU2hhcGlyby13aWxrIApgYGB7cn0gCmNhdCgnIChEID0gMyAmIE4gPSAxMDAwKSAtPiBwLXZhbHVlczogJywgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5EM1sxOjEwMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDNbMTAxOjIwMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDNbMjAxOjMwMCxdJHZhbHVlKSRwLnZhbHVlLCAnXG4nLAogICAgJyhEID0gNCAmIE4gPSAxMDAwKSAtPiBwLXZhbHVlczogJywgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5ENFsxOjEwMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDRbMTAxOjIwMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDRbMjAxOjMwMCxdJHZhbHVlKSRwLnZhbHVlKQpgYGAKIyMjIEFuYWx5c2lzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmVwZWF0ZWQgc3ltYm9scyBmb3Igc2VxdWVuY2VzIHdpdGggTiA9IDEwMDAwCgpgYGB7cn0Kbi5zZXJpZXMgPSAxMApuLmVsZW1lbnRzID0gMTAwMDAKZS5zZXJpZXMgPSBhc3BsaXQoYXJyYXkoZS52ZWN0b3IsIGMobi5lbGVtZW50cywgcm91bmQobGVuZ3RoKGUudmVjdG9yKS9uLmVsZW1lbnRzKSkpLCBNQVJHSU4gPSAyKQpwaS5zZXJpZXMgPSBhc3BsaXQoYXJyYXkocGkudmVjdG9yLCBjKG4uZWxlbWVudHMsIHJvdW5kKGxlbmd0aChwaS52ZWN0b3IpL24uZWxlbWVudHMpKSksIE1BUkdJTiA9IDIpCnNxcnQyLnNlcmllcyA9IGFzcGxpdChhcnJheShzcXJ0Mi52ZWN0b3IsIGMobi5lbGVtZW50cywgcm91bmQobGVuZ3RoKHNxcnQyLnZlY3Rvcikvbi5lbGVtZW50cykpKSwgTUFSR0lOID0gMikKYGBgCgpgYGB7cn0gCkQgPSAzClRhdSA9IDEKZS5wZXJjZW50LkQzID0gcGkucGVyY2VudC5EMyA9IHNxcnQyLnBlcmNlbnQuRDMgPSByZXAoMCwgbi5zZXJpZXMpCgpmb3IoaSBpbiAxOm4uc2VyaWVzKXsKICBlbGVtZW50cyA9IGZvcm1hdGlvblBhdHRlcm4oZS5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIGUucGVyY2VudC5EM1tpXSA9IHBlcmNlbnR1YWwuZXF1YWxpdGllcyhlbGVtZW50cykKfQpmb3IoaSBpbiAxOm4uc2VyaWVzKXsKICBlbGVtZW50cyA9IGZvcm1hdGlvblBhdHRlcm4ocGkuc2VyaWVzW1tpXV0sIEQsIFRhdSwgMSkKICBwaS5wZXJjZW50LkQzW2ldID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGVsZW1lbnRzKQp9CmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihzcXJ0Mi5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIHNxcnQyLnBlcmNlbnQuRDNbaV0gPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoZWxlbWVudHMpCn0KCmRhdGEuRDMgPC0gZGF0YS5mcmFtZSgKICB0eXBlID0gYyhyZXAoImUiLCBuLnNlcmllcyksIHJlcCgicGkiLCBuLnNlcmllcyksIHJlcCgic3FydDIiLCBuLnNlcmllcykpLAogIHZhbHVlID0gYyhlLnBlcmNlbnQuRDMsIHBpLnBlcmNlbnQuRDMsIHNxcnQyLnBlcmNlbnQuRDMpCikKZGF0YS5EMyAlPiUKICAgIGdncGxvdChhZXMoeCA9IHZhbHVlLCBmaWxsID0gdHlwZSkpICsKICAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSIjZTllY2VmIiwgYWxwaGEgPSAzLjYsIHBvc2l0aW9uID0gJ2lkZW50aXR5JywgYmlucyA9IG4uc2VyaWVzKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzY5YjNhMiIsICIjNDA0MDgwIiwgIiNkNGJmMDgiKSkgKwogICAgdGhlbWVfZmV3KGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICJzZXJpZiIpICsKICAgIGxhYnMoZmlsbCA9ICIiKSArCiAgICBnZ3RpdGxlKCdEID0gMycpICsgCiAgICBmYWNldF9ncmlkKH50eXBlKSArICAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgpgYGB7cn0gCkQgPSA0ClRhdSA9IDEKZS5wZXJjZW50LkQ0ID0gcGkucGVyY2VudC5ENCA9IHNxcnQyLnBlcmNlbnQuRDQgPSByZXAoMCwgbi5zZXJpZXMpCgpmb3IoaSBpbiAxOm4uc2VyaWVzKXsKICBlbGVtZW50cyA9IGZvcm1hdGlvblBhdHRlcm4oZS5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIGUucGVyY2VudC5ENFtpXSA9IHBlcmNlbnR1YWwuZXF1YWxpdGllcyhlbGVtZW50cykKfQpmb3IoaSBpbiAxOm4uc2VyaWVzKXsKICBlbGVtZW50cyA9IGZvcm1hdGlvblBhdHRlcm4ocGkuc2VyaWVzW1tpXV0sIEQsIFRhdSwgMSkKICBwaS5wZXJjZW50LkQ0W2ldID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGVsZW1lbnRzKQp9CmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihzcXJ0Mi5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIHNxcnQyLnBlcmNlbnQuRDRbaV0gPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoZWxlbWVudHMpCn0KCmRhdGEuRDQgPC0gZGF0YS5mcmFtZSgKICB0eXBlID0gYyhyZXAoImUiLCBuLnNlcmllcyksIHJlcCgicGkiLCBuLnNlcmllcyksIHJlcCgic3FydDIiLCBuLnNlcmllcykpLAogIHZhbHVlID0gYyhlLnBlcmNlbnQuRDQsIHBpLnBlcmNlbnQuRDQsIHNxcnQyLnBlcmNlbnQuRDQpCikKZGF0YS5ENCAlPiUKICAgIGdncGxvdChhZXMoeCA9IHZhbHVlLCBmaWxsID0gdHlwZSkpICsKICAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSIjZTllY2VmIiwgYWxwaGEgPSAzLjYsIHBvc2l0aW9uID0gJ2lkZW50aXR5JywgYmlucyA9IG4uc2VyaWVzKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzY5YjNhMiIsICIjNDA0MDgwIiwgIiNkNGJmMDgiKSkgKwogICAgdGhlbWVfZmV3KGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICJzZXJpZiIpICsKICAgIGxhYnMoZmlsbD0iIikgKwogICAgZ2d0aXRsZSgnRCA9IDQnKSArIAogICAgZmFjZXRfZ3JpZCh+dHlwZSkgKyAgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKYGBge3J9IApEID0gNQpUYXUgPSAxCmUucGVyY2VudC5ENSA9IHBpLnBlcmNlbnQuRDUgPSBzcXJ0Mi5wZXJjZW50LkQ1ID0gcmVwKDAsIG4uc2VyaWVzKQoKZm9yKGkgaW4gMTpuLnNlcmllcyl7CiAgZWxlbWVudHMgPSBmb3JtYXRpb25QYXR0ZXJuKGUuc2VyaWVzW1tpXV0sIEQsIFRhdSwgMSkKICBlLnBlcmNlbnQuRDVbaV0gPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoZWxlbWVudHMpCn0KZm9yKGkgaW4gMTpuLnNlcmllcyl7CiAgZWxlbWVudHMgPSBmb3JtYXRpb25QYXR0ZXJuKHBpLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgcGkucGVyY2VudC5ENVtpXSA9IHBlcmNlbnR1YWwuZXF1YWxpdGllcyhlbGVtZW50cykKfQpmb3IoaSBpbiAxOm4uc2VyaWVzKXsKICBlbGVtZW50cyA9IGZvcm1hdGlvblBhdHRlcm4oc3FydDIuc2VyaWVzW1tpXV0sIEQsIFRhdSwgMSkKICBzcXJ0Mi5wZXJjZW50LkQ1W2ldID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGVsZW1lbnRzKQp9CgpkYXRhLkQ1IDwtIGRhdGEuZnJhbWUoCiAgdHlwZSA9IGMocmVwKCJlIiwgbi5zZXJpZXMpLCByZXAoInBpIiwgbi5zZXJpZXMpLCByZXAoInNxcnQyIiwgbi5zZXJpZXMpKSwKICB2YWx1ZSA9IGMoZS5wZXJjZW50LkQ1LCBwaS5wZXJjZW50LkQ1LCBzcXJ0Mi5wZXJjZW50LkQ1KQopCmRhdGEuRDUgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSwgZmlsbCA9IHR5cGUpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iI2U5ZWNlZiIsIGFscGhhID0gMy42LCBwb3NpdGlvbiA9ICdpZGVudGl0eScsIGJpbnMgPSBuLnNlcmllcykgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2OWIzYTIiLCAiIzQwNDA4MCIsICIjZDRiZjA4IikpICsKICAgIHRoZW1lX2ZldyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2VyaWYiKSArCiAgICBsYWJzKGZpbGw9IiIpICsKICAgIGdndGl0bGUoJ0QgPSA1JykgKyAKICAgIGZhY2V0X2dyaWQofnR5cGUpICsgIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCmBgYHtyfSAKRCA9IDYKVGF1ID0gMQplLnBlcmNlbnQuRDYgPSBwaS5wZXJjZW50LkQ2ID0gc3FydDIucGVyY2VudC5ENiA9IHJlcCgwLCBuLnNlcmllcykKCmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihlLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgZS5wZXJjZW50LkQ2W2ldID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGVsZW1lbnRzKQp9CmZvcihpIGluIDE6bi5zZXJpZXMpewogIGVsZW1lbnRzID0gZm9ybWF0aW9uUGF0dGVybihwaS5zZXJpZXNbW2ldXSwgRCwgVGF1LCAxKQogIHBpLnBlcmNlbnQuRDZbaV0gPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoZWxlbWVudHMpCn0KZm9yKGkgaW4gMTpuLnNlcmllcyl7CiAgZWxlbWVudHMgPSBmb3JtYXRpb25QYXR0ZXJuKHNxcnQyLnNlcmllc1tbaV1dLCBELCBUYXUsIDEpCiAgc3FydDIucGVyY2VudC5ENltpXSA9IHBlcmNlbnR1YWwuZXF1YWxpdGllcyhlbGVtZW50cykKfQoKZGF0YS5ENiA8LSBkYXRhLmZyYW1lKAogIHR5cGUgPSBjKHJlcCgiZSIsIG4uc2VyaWVzKSwgcmVwKCJwaSIsIG4uc2VyaWVzKSwgcmVwKCJzcXJ0MiIsIG4uc2VyaWVzKSksCiAgdmFsdWUgPSBjKGUucGVyY2VudC5ENiwgcGkucGVyY2VudC5ENiwgc3FydDIucGVyY2VudC5ENikKKQpkYXRhLkQ2ICU+JQogICAgZ2dwbG90KGFlcyh4ID0gdmFsdWUsIGZpbGwgPSB0eXBlKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9IiNlOWVjZWYiLCBhbHBoYSA9IDMuNiwgcG9zaXRpb24gPSAnaWRlbnRpdHknLCBiaW5zID0gbi5zZXJpZXMpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjNjliM2EyIiwgIiM0MDQwODAiLCAiI2Q0YmYwOCIpKSArCiAgICB0aGVtZV9mZXcoYmFzZV9zaXplID0gMTIsIGJhc2VfZmFtaWx5ID0gInNlcmlmIikgKwogICAgbGFicyhmaWxsPSIiKSArCiAgICBnZ3RpdGxlKCdEID0gNicpICsgCiAgICBmYWNldF9ncmlkKH50eXBlKSArICAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIyMjIE5vcm1hbGl0eSB0ZXN0IGZvciBOID0gMTAwMDAgd2l0aCBTaGFwaXJvLXdpbGsgCmBgYHtyfSAKY2F0KCcgKEQgPSAzICYgTiA9IDEwMDAwKSAtPiBwLXZhbHVlczogJywgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5EM1sxOjEwLF0kdmFsdWUpJHAudmFsdWUsICIgIiwgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5EM1sxMToyMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDNbMjE6MzAsXSR2YWx1ZSkkcC52YWx1ZSwgJ1xuJywKICAgICcoRCA9IDQgJiBOID0gMTAwMDApIC0+IHAtdmFsdWVzOiAnLCAKICAgIHNoYXBpcm8udGVzdChkYXRhLkQ0WzE6MTAsXSR2YWx1ZSkkcC52YWx1ZSwgIiAiLCAKICAgIHNoYXBpcm8udGVzdChkYXRhLkQ0WzExOjIwLF0kdmFsdWUpJHAudmFsdWUsICIgIiwgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5ENFsyMTozMCxdJHZhbHVlKSRwLnZhbHVlLCAnXG4nLAogICAgJyhEID0gNSAmIE4gPSAxMDAwMCkgLT4gcC12YWx1ZXM6ICcsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDVbMToxMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDVbMTE6MjAsXSR2YWx1ZSkkcC52YWx1ZSwgIiAiLCAKICAgIHNoYXBpcm8udGVzdChkYXRhLkQ1WzIxOjMwLF0kdmFsdWUpJHAudmFsdWUsICdcbicsCiAgICAnKEQgPSA2ICYgTiA9IDEwMDAwKSAtPiBwLXZhbHVlczogJywgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5ENlsxOjEwLF0kdmFsdWUpJHAudmFsdWUsICIgIiwgCiAgICBzaGFwaXJvLnRlc3QoZGF0YS5ENlsxMToyMCxdJHZhbHVlKSRwLnZhbHVlLCAiICIsIAogICAgc2hhcGlyby50ZXN0KGRhdGEuRDZbMjE6MzAsXSR2YWx1ZSkkcC52YWx1ZSkKYGBgCgoKCgoKCgo=