Go back to the About page.

Go back to the Basis Functions page.

Let us set some global options for all code chunks in this document.

# Set seed for reproducibility
set.seed(1982) 
# Set global options for all code chunks
knitr::opts_chunk$set(
  # Disable messages printed by R code chunks
  message = FALSE,    
  # Disable warnings printed by R code chunks
  warning = FALSE,    
  # Show R code within code chunks in output
  echo = TRUE,        
  # Include both R code and its results in output
  include = TRUE,     
  # Evaluate R code chunks
  eval = TRUE,       
  # Enable caching of R code chunks for faster rendering
  cache = FALSE,      
  # Align figures in the center of the output
  fig.align = "center",
  # Enable retina display for high-resolution figures
  retina = 2,
  # Show errors in the output instead of stopping rendering
  error = TRUE,
  # Do not collapse code and output into a single block
  collapse = FALSE
)
# Start the figure counter
fig_count <- 0
# Define the captioner function
captioner <- function(caption) {
  fig_count <<- fig_count + 1
  paste0("Figure ", fig_count, ": ", caption)
}

Import libraries

library(MetricGraph)
library(dplyr)
library(plotly)

library(here)
library(rmarkdown)
library(grateful) # to cite

By hand


Press the Show button below to reveal the code.


V <- rbind(c(0, 0), c(1, 0), c(1, 1), c(0, 1), c(-1, 1), c(-1, 0), c(0, -1))
E <- rbind(c(1, 2), c(2, 3), c(3, 4), c(4, 5),
           c(5, 6), c(6, 1), c(4, 1),c(1, 7))
graph <- metric_graph$new(V = V, E = E)

#vertical 
df01 = data.frame(x = c(-1,-1), y = c(0,0), z = c(0,1))
df02 = data.frame(x = c(-2/3,-2/3), y = c(0,0), z = c(0,1))
df03 = data.frame(x = c(-1/3,-1/3), y = c(0,0), z = c(0,1))
df04 = data.frame(x = c(0,0), y = c(0,0), z = c(0,1))
df05 = data.frame(x = c(0,0), y = c(-1/3,-1/3), z = c(0,1))
df06 = data.frame(x = c(0,0), y = c(-2/3,-2/3), z = c(0,1))
df07 = data.frame(x = c(0,0), y = c(-1,-1), z = c(0,1))
df08 = data.frame(x = c(2/3,2/3), y = c(-1,-1), z = c(0,1))
df09 = data.frame(x = c(1/3,1/3), y = c(-1,-1), z = c(0,1))
df10 = data.frame(x = c(1,1), y = c(-1,-1), z = c(0,1))
df11 = data.frame(x = c(2/3,2/3), y = c(0,0), z = c(0,1))
df12 = data.frame(x = c(1/3,1/3), y = c(0,0), z = c(0,1))
df13 = data.frame(x = c(1,1), y = c(0,0), z = c(0,1))
df14 = data.frame(x = c(2/3,2/3), y = c(1,1), z = c(0,1))
df15 = data.frame(x = c(1/3,1/3), y = c(1,1), z = c(0,1))
df16 = data.frame(x = c(1,1), y = c(1,1), z = c(0,1))
df17 = data.frame(x = c(1,1), y = c(-1/3,-1/3), z = c(0,1))
df18 = data.frame(x = c(1,1), y = c(-2/3,-2/3), z = c(0,1))
df19 = data.frame(x = c(1,1), y = c(1/3,1/3), z = c(0,1))
df20 = data.frame(x = c(1,1), y = c(2/3,2/3), z = c(0,1))
df21 = data.frame(x = c(0,0), y = c(1/3,1/3), z = c(0,1))
df22 = data.frame(x = c(0,0), y = c(2/3,2/3), z = c(0,1))
df23 = data.frame(x = c(0,0), y = c(1,1), z = c(0,1))
#inclined
d01 = data.frame(x = c(-1,-2/3), y = c(0,0), z = c(0,1))
d02 = data.frame(x = c(-2/3,-1/3), y = c(0,0), z = c(0,1))
d03 = data.frame(x = c(-1/3,0), y = c(0,0), z = c(0,1)) #central
d04 = data.frame(x = c(0,1/3), y = c(0,0), z = c(0,1))
d05 = data.frame(x = c(1/3,2/3), y = c(0,0), z = c(0,1))
d06 = data.frame(x = c(2/3,1), y = c(0,0), z = c(0,1))
d07 = data.frame(x = c(1,2/3), y = c(0,0), z = c(0,1))
d08 = data.frame(x = c(2/3,1/3), y = c(0,0), z = c(0,1))
d09 = data.frame(x = c(1/3,0), y = c(0,0), z = c(0,1)) #central
d10 = data.frame(x = c(0,-1/3), y = c(0,0), z = c(0,1))
d11 = data.frame(x = c(-1/3,-2/3), y = c(0,0), z = c(0,1))
d12 = data.frame(x = c(-2/3,-1), y = c(0,0), z = c(0,1))
d13 = data.frame(x = c(0,1/3), y = c(1,1), z = c(0,1))
d14 = data.frame(x = c(1/3,2/3), y = c(1,1), z = c(0,1))#basis
d15 = data.frame(x = c(2/3,1), y = c(1,1), z = c(0,1))
d16 = data.frame(x = c(1,2/3), y = c(1,1), z = c(0,1))#basis
d17 = data.frame(x = c(2/3,1/3), y = c(1,1), z = c(0,1))
d18 = data.frame(x = c(1/3,0), y = c(1,1), z = c(0,1))
d19 = data.frame(x = c(0,1/3), y = c(-1,-1), z = c(0,1))
d20 = data.frame(x = c(1/3,2/3), y = c(-1,-1), z = c(0,1))
d21 = data.frame(x = c(2/3,1), y = c(-1,-1), z = c(0,1))
d22 = data.frame(x = c(1,2/3), y = c(-1,-1), z = c(0,1))
d23 = data.frame(x = c(2/3,1/3), y = c(-1,-1), z = c(0,1))
d24 = data.frame(x = c(1/3,0), y = c(-1,-1), z = c(0,1))
d25 = data.frame(y = c(-1,-2/3), x = c(0,0), z = c(0,1))
d26 = data.frame(y = c(-2/3,-1/3), x = c(0,0), z = c(0,1))
d27 = data.frame(y = c(-1/3,0), x = c(0,0), z = c(0,1)) #central
d28 = data.frame(y = c(0,1/3), x = c(0,0), z = c(0,1))
d29 = data.frame(y = c(1/3,2/3), x = c(0,0), z = c(0,1))
d30 = data.frame(y = c(2/3,1), x = c(0,0), z = c(0,1))
d31 = data.frame(y = c(1,2/3), x = c(0,0), z = c(0,1))
d32 = data.frame(y = c(2/3,1/3), x = c(0,0), z = c(0,1))
d33 = data.frame(y = c(1/3,0), x = c(0,0), z = c(0,1)) #central
d34 = data.frame(y = c(0,-1/3), x = c(0,0), z = c(0,1))
d35 = data.frame(y = c(-1/3,-2/3), x = c(0,0), z = c(0,1))
d36 = data.frame(y = c(-2/3,-1), x = c(0,0), z = c(0,1))
d37 = data.frame(y = c(-1,-2/3), x = c(1,1), z = c(0,1))
d38 = data.frame(y = c(-2/3,-1/3), x = c(1,1), z = c(0,1))
d39 = data.frame(y = c(-1/3,0), x = c(1,1), z = c(0,1))
d40 = data.frame(y = c(0,1/3), x = c(1,1), z = c(0,1))
d41 = data.frame(y = c(1/3,2/3), x = c(1,1), z = c(0,1))
d42 = data.frame(y = c(2/3,1), x = c(1,1), z = c(0,1))
d43 = data.frame(y = c(1,2/3), x = c(1,1), z = c(0,1))
d44 = data.frame(y = c(2/3,1/3), x = c(1,1), z = c(0,1))
d45 = data.frame(y = c(1/3,0), x = c(1,1), z = c(0,1))
d46 = data.frame(y = c(0,-1/3), x = c(1,1), z = c(0,1))
d47 = data.frame(y = c(-1/3,-2/3), x = c(1,1), z = c(0,1))
d48 = data.frame(y = c(-2/3,-1), x = c(1,1), z = c(0,1))
# star set
d49 = data.frame(y = c(1/3,0), x = c(0,0), z = c(0,0))
d50 = data.frame(y = c(0,0), x = c(1/3,0), z = c(0,0))
d51 = data.frame(y = c(-1/3,0), x = c(0,0), z = c(0,0))
d52 = data.frame(y = c(0,0), x = c(-1/3,0), z = c(0,0))

graph$build_mesh(h = 1/40)
graph$plot(plotly = TRUE, vertex_size = 4, vertex_color = "blue",
           edge_color = "black", edge_width = 2) %>%  
  config(mathjax = 'cdn') %>% 
  layout(title = TeX("\\text{Basis functions on a metric graph }\\Gamma = (\\mathcal{V},\\mathcal{E})"), 
         showlegend = FALSE,
                    font = list(family = "Palatino"),
                    scene = list(
                      aspectratio = list(x = 1.8, y = 1.8, z = 0.4),
                      annotations = list(
                        list(
                          x = -1, y = 0, z = 0,
                          text = TeX("v_1"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 0, y = 0, z = 0,
                          text = TeX("v_2"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 0, y = -1, z = 0,
                          text = TeX("v_3"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 1, y = -1, z = 0,
                          text = TeX("v_4"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 1, y = 0, z = 0,
                          text = TeX("v_5"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 1, y = 1, z = 0,
                          text = TeX("v_6,x_0^{e_7}"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 0, y = 1, z = 0,
                          text = TeX("v_7,x_3^{e_7}"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 2/3, y = 1, z = 0,
                          text = TeX("x_1^{e_7}"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 1/3, y = 1, z = 0,
                          text = TeX("x_2^{e_7}"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "black", size = 16),
                          arrowcolor = "black", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 0.15, y = 0, z = 0,
                          text = TeX("\\mathcal{N}_{v_2}"),
                          textangle = 0, ax = 0, ay = 25,
                          font = list(color = "green", size = 16),
                          arrowcolor = "white", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 2/3, y = 1, z = 1,
                          text = TeX("\\varphi_1^{e_7}"),
                          textangle = 0, ax = 0, ay = 75,
                          font = list(color = "blue", size = 16),
                          arrowcolor = "white", arrowsize = 1, arrowwidth = 1,arrowhead = 1),
                        list(
                          x = 0, y = 0, z = 1,
                          text = TeX("\\phi_{v_2}"),
                          textangle = 0, ax = 0, ay = 75,
                          font = list(color = "red", size = 16),
                          arrowcolor = "white", arrowsize = 1, arrowwidth = 1,arrowhead = 1)
                        ))) %>% 
  add_trace(x = -2/3, y = 0, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = -1/3, y = 0, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = -1/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = -2/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 1/3, y = -1, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 2/3, y = -1, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = 1/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = 2/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>% 
  add_trace(x = 1/3, y = 0, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 2/3, y = 0, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>% 
  add_trace(x = 1/3, y = 1, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 2/3, y = 1, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>% 
  add_trace(x = 1, y = 1/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 1, y = 2/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>% 
  add_trace(x = 1, y = -1/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>%
  add_trace(x = 1, y = -2/3, z = 0, mode = "markers", type = "scatter3d", 
            marker = list(size = 4, color = "black", symbol = 104)) %>% #so far the botton
  add_trace(x = -2/3, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = -1/3, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = -1/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = -2/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 1/3, y = -1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 2/3, y = -1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = 1/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 0, y = 2/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>% 
  add_trace(x = 1/3, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 2/3, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>% 
  add_trace(x = 1/3, y = 1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 2/3, y = 1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>% 
  add_trace(x = 1, y = 1/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 1, y = 2/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>% 
  add_trace(x = 1, y = -1/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "black", symbol = 104)) %>%
  add_trace(x = 1, y = -2/3, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>% # now the vextex above
  add_trace(x = -1, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>% 
  add_trace(x = 0, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>%
  add_trace(x = 0, y = 1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>% 
  add_trace(x = 0, y = -1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>%
  add_trace(x = 1, y = 0, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>% 
  add_trace(x = 1, y = 1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>%
  add_trace(x = 1, y = -1, z = 1, mode = "markers", type = "scatter3d", 
            marker = list(size = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = df01, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df02, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df03, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df04, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df05, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df06, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df07, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df08, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df09, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df10, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df11, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df12, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df13, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df14, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df15, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df16, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df17, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df18, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df19, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df20, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df21, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df22, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% 
  add_trace(data = df23, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104, dash = 'dot')) %>% #so far vertical
  add_trace(data = d01, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d02, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d03, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 2, color = "red", symbol = 104)) %>% 
  add_trace(data = d04, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d05, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d06, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d07, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d08, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d09, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 2, color = "red", symbol = 104)) %>% 
  add_trace(data = d10, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d11, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d12, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d13, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d14, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 2, color = "blue", symbol = 104)) %>% 
  add_trace(data = d15, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d16, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 2, color = "blue", symbol = 104)) %>% 
  add_trace(data = d17, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d18, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d19, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d20, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d21, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d22, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d23, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d24, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d25, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d26, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d27, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 2, color = "red", symbol = 104)) %>% 
  add_trace(data = d28, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d29, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d30, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d31, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d32, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d33, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 2, color = "red", symbol = 104)) %>% 
  add_trace(data = d34, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d35, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d36, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d37, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d38, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d39, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d40, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d41, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d42, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d43, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d44, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d45, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d46, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d47, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% 
  add_trace(data = d48, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 1, color = "gray", symbol = 104)) %>% #star set
  add_trace(data = d49, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 3, color = "green", symbol = 104)) %>% 
  add_trace(data = d50, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 3, color = "green", symbol = 104)) %>% 
  add_trace(data = d51, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 3, color = "green", symbol = 104)) %>% 
  add_trace(data = d52, x = ~x, y = ~y, z = ~z, mode = "lines", type = "scatter3d",
            line = list(width = 3, color = "green", symbol = 104))

Figure 1: Illustration of the system of basis functions \(\{\varphi_j^e, \phi_v\}\) (solid gray lines) on the graph \(\Gamma= (\mathcal{V},\mathcal{E})\), where \(\mathcal{E}= \left\{e_1,\dots,e_8\right\}\) and \(\mathcal{V}= \left\{v_1,\dots,v_7\right\}\). Note that for all \(e_i\in\mathcal{E}\), \(n_{e_i} = 3\) and \(h_{e_i} = 1/3\). In particular, for edge \(e_7\), observe that the three regular segments are delimited by the nodes \(v_6 = x_0^{e_7}, x_1^{e_7}, x_2^{e_7}, x_3^{e_7} = v_7\). Corresponding to node \(x_1^{e_7}\), we have plotted the basis function \(\varphi_1^{e_7}\) in blue. Notice also that the set \(\mathcal{N}_{v_2}\) is depicted in green and its corresponding basis function \(\phi_{v_2}\) is shown in red.

Using projection matrix

graph_to_get_loc <- graph$clone()
graph_to_get_loc$build_mesh(h = 1/150)

graph_to_get_loc$plot(mesh = TRUE) + 
  ggtitle("Fine mesh") + 
  theme_minimal() + 
  theme(text = element_text(family = "Palatino"))
Figure 2: Fine mesh

Figure 2: Fine mesh

loc <- graph_to_get_loc$get_mesh_locations()

graph$build_mesh(h = 1/3)

graph$plot(mesh = TRUE) + 
  ggtitle("Coarse mesh") + 
  theme_minimal() + 
  theme(text = element_text(family = "Palatino"))
Figure 3: Coarse mesh

Figure 3: Coarse mesh

A <- graph$fem_basis(loc)

DD <- data.frame(A = as.matrix(A)) %>% 
  rowwise() %>%
  mutate(max_value = max(c_across(everything()))) %>%
  cbind(edge_number = loc[, 1], distance_on_edge = loc[, 2], A.24 = 0)

graph$add_observations(data = DD, edge_number = "edge_number",
  distance_on_edge = "distance_on_edge", data_coords = "PtE", normalized = TRUE, clear_obs = TRUE)

Press the Show button below to reveal the code.


graph$plot(data = "max_value", vertex_size = 0, plotly = TRUE, edge_width = 0.1) %>%  
  config(mathjax = 'cdn') %>% 
  layout(showlegend = FALSE,
         font = list(family = "Palatino"),
         scene = list(aspectratio = list(x = 1.8, y = 1.8, z = 0.4)))

Figure 4: Basis functions on a metric graph \(\Gamma = (\mathcal{V},\mathcal{E})\)

graph$plot(data = "A.1", vertex_size = 0, plotly = TRUE, edge_width = 0.1) %>%  
  config(mathjax = 'cdn') %>% 
  layout(showlegend = FALSE,
         font = list(family = "Palatino"),
         scene = list(aspectratio = list(x = 1.8, y = 1.8, z = 0.4)))

Figure 5: One basis function on a metric graph \(\Gamma = (\mathcal{V},\mathcal{E})\)

graph_to_get_loc$plot_function(X = DD$max_value, vertex_size = 0, plotly = TRUE) %>%  
  config(mathjax = 'cdn') %>% 
  layout(showlegend = FALSE,
         font = list(family = "Palatino"),
         scene = list(aspectratio = list(x = 1.8, y = 1.8, z = 0.4)))

Figure 6: Basis functions on a metric graph \(\Gamma = (\mathcal{V},\mathcal{E})\)

graph_to_get_loc$plot_function(X = DD$A.1, vertex_size = 0, plotly = TRUE) %>%  
  config(mathjax = 'cdn') %>% 
  layout(showlegend = FALSE,
         font = list(family = "Palatino"),
         scene = list(aspectratio = list(x = 1.8, y = 1.8, z = 0.4)))

Figure 7: One basis function on a metric graph \(\Gamma = (\mathcal{V},\mathcal{E})\)

References

cite_packages(output = "paragraph", out.dir = ".")

We used R version 4.4.1 (R Core Team 2024a) and the following R packages: cowplot v. 1.1.3 (Wilke 2024), ggmap v. 4.0.0.900 (Kahle and Wickham 2013), ggpubr v. 0.6.0 (Kassambara 2023), ggtext v. 0.1.2 (Wilke and Wiernik 2022), grid v. 4.4.1 (R Core Team 2024b), here v. 1.0.1 (Müller 2020), htmltools v. 0.5.8.1 (Cheng et al. 2024), INLA v. 24.12.11 (Rue, Martino, and Chopin 2009; Lindgren, Rue, and Lindström 2011; Martins et al. 2013; Lindgren and Rue 2015; De Coninck et al. 2016; Rue et al. 2017; Verbosio et al. 2017; Bakka et al. 2018; Kourounis, Fuchs, and Schenk 2018), inlabru v. 2.12.0.9002 (Yuan et al. 2017; Bachl et al. 2019), knitr v. 1.48 (Xie 2014, 2015, 2024), latex2exp v. 0.9.6 (Meschiari 2022), Matrix v. 1.6.5 (Bates, Maechler, and Jagan 2024), MetricGraph v. 1.4.0.9000 (Bolin, Simas, and Wallin 2023b, 2023a, 2023c, 2024; Bolin et al. 2024), OpenStreetMap v. 0.4.0 (Fellows and JMapViewer library by Jan Peter Stotz 2023), osmdata v. 0.2.5 (Mark Padgham et al. 2017), patchwork v. 1.2.0 (Pedersen 2024), plotly v. 4.10.4 (Sievert 2020), plotrix v. 3.8.4 (J 2006), reshape2 v. 1.4.4 (Wickham 2007), rmarkdown v. 2.28 (Xie, Allaire, and Grolemund 2018; Xie, Dervieux, and Riederer 2020; Allaire et al. 2024), rSPDE v. 2.4.0.9000 (Bolin and Kirchner 2020; Bolin and Simas 2023; Bolin, Simas, and Xiong 2024), scales v. 1.3.0 (Wickham, Pedersen, and Seidel 2023), sf v. 1.0.19 (E. Pebesma 2018; E. Pebesma and Bivand 2023), sp v. 2.1.4 (E. J. Pebesma and Bivand 2005; Bivand, Pebesma, and Gomez-Rubio 2013), tidyverse v. 2.0.0 (Wickham et al. 2019), viridis v. 0.6.4 (Garnier et al. 2023), xaringanExtra v. 0.8.0 (Aden-Buie and Warkentin 2024).

Aden-Buie, Garrick, and Matthew T. Warkentin. 2024. xaringanExtra: Extras and Extensions for xaringan Slides. https://CRAN.R-project.org/package=xaringanExtra.
Allaire, JJ, Yihui Xie, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, et al. 2024. rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Bachl, Fabian E., Finn Lindgren, David L. Borchers, and Janine B. Illian. 2019. inlabru: An R Package for Bayesian Spatial Modelling from Ecological Survey Data.” Methods in Ecology and Evolution 10: 760–66. https://doi.org/10.1111/2041-210X.13168.
Bakka, Haakon, Håvard Rue, Geir-Arne Fuglstad, Andrea I. Riebler, David Bolin, Janine Illian, Elias Krainski, Daniel P. Simpson, and Finn K. Lindgren. 2018. “Spatial Modelling with INLA: A Review.” WIRES (Invited Extended Review) xx (Feb): xx–. http://arxiv.org/abs/1802.06350.
Bates, Douglas, Martin Maechler, and Mikael Jagan. 2024. Matrix: Sparse and Dense Matrix Classes and Methods. https://CRAN.R-project.org/package=Matrix.
Bivand, Roger S., Edzer Pebesma, and Virgilio Gomez-Rubio. 2013. Applied Spatial Data Analysis with R, Second Edition. Springer, NY. https://asdar-book.org/.
Bolin, David, and Kristin Kirchner. 2020. “The Rational SPDE Approach for Gaussian Random Fields with General Smoothness.” Journal of Computational and Graphical Statistics 29 (2): 274–85. https://doi.org/10.1080/10618600.2019.1665537.
Bolin, David, Mihály Kovács, Vivek Kumar, and Alexandre B. Simas. 2024. “Regularity and Numerical Approximation of Fractional Elliptic Differential Equations on Compact Metric Graphs.” Mathematics of Computation 93 (349): 2439–72. https://doi.org/10.1090/mcom/3929.
Bolin, David, and Alexandre B. Simas. 2023. rSPDE: Rational Approximations of Fractional Stochastic Partial Differential Equations. https://CRAN.R-project.org/package=rSPDE.
Bolin, David, Alexandre B. Simas, and Jonas Wallin. 2023a. “Markov Properties of Gaussian Random Fields on Compact Metric Graphs.” arXiv Preprint arXiv:2304.03190. https://doi.org/10.48550/arXiv.2304.03190.
———. 2023b. MetricGraph: Random Fields on Metric Graphs. https://CRAN.R-project.org/package=MetricGraph.
———. 2023c. “Statistical Inference for Gaussian Whittle-Matérn Fields on Metric Graphs.” arXiv Preprint arXiv:2304.10372. https://doi.org/10.48550/arXiv.2304.10372.
———. 2024. “Gaussian Whittle-Matérn Fields on Metric Graphs.” Bernoulli 30 (2): 1611–39. https://doi.org/10.3150/23-BEJ1647.
Bolin, David, Alexandre B. Simas, and Zhen Xiong. 2024. “Covariance-Based Rational Approximations of Fractional SPDEs for Computationally Efficient Bayesian Inference.” Journal of Computational and Graphical Statistics 33 (1): 64–74. https://doi.org/10.1080/10618600.2023.2231051.
Cheng, Joe, Carson Sievert, Barret Schloerke, Winston Chang, Yihui Xie, and Jeff Allen. 2024. htmltools: Tools for HTML. https://CRAN.R-project.org/package=htmltools.
De Coninck, Arne, Bernard De Baets, Drosos Kourounis, Fabio Verbosio, Olaf Schenk, Steven Maenhout, and Jan Fostier. 2016. Needles: Toward Large-Scale Genomic Prediction with Marker-by-Environment Interaction.” Genetics 203 (1): 543–55. https://doi.org/10.1534/genetics.115.179887.
Fellows, Ian, and using the JMapViewer library by Jan Peter Stotz. 2023. OpenStreetMap: Access to Open Street Map Raster Images. https://CRAN.R-project.org/package=OpenStreetMap.
Garnier, Simon, Ross, Noam, Rudis, Robert, Camargo, et al. 2023. viridis(Lite) - Colorblind-Friendly Color Maps for r. https://doi.org/10.5281/zenodo.4679423.
J, Lemon. 2006. Plotrix: A Package in the Red Light District of r.” R-News 6 (4): 8–12.
Kahle, David, and Hadley Wickham. 2013. ggmap: Spatial Visualization with Ggplot2.” The R Journal 5 (1): 144–61. https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf.
Kassambara, Alboukadel. 2023. ggpubr: ggplot2 Based Publication Ready Plots. https://CRAN.R-project.org/package=ggpubr.
Kourounis, D., A. Fuchs, and O. Schenk. 2018. “Towards the Next Generation of Multiperiod Optimal Power Flow Solvers.” IEEE Transactions on Power Systems PP (99): 1–10. https://doi.org/10.1109/TPWRS.2017.2789187.
Lindgren, Finn, and Håvard Rue. 2015. “Bayesian Spatial Modelling with R-INLA.” Journal of Statistical Software 63 (19): 1–25. http://www.jstatsoft.org/v63/i19/.
Lindgren, Finn, Håvard Rue, and Johan Lindström. 2011. “An Explicit Link Between Gaussian Fields and Gaussian Markov Random Fields: The Stochastic Partial Differential Equation Approach (with Discussion).” Journal of the Royal Statistical Society B 73 (4): 423–98.
Mark Padgham, Bob Rudis, Robin Lovelace, and Maëlle Salmon. 2017. “Osmdata.” Journal of Open Source Software 2 (14): 305. https://doi.org/10.21105/joss.00305.
Martins, Thiago G., Daniel Simpson, Finn Lindgren, and Håvard Rue. 2013. “Bayesian Computing with INLA: New Features.” Computational Statistics and Data Analysis 67: 68–83.
Meschiari, Stefano. 2022. Latex2exp: Use LaTeX Expressions in Plots. https://CRAN.R-project.org/package=latex2exp.
Müller, Kirill. 2020. here: A Simpler Way to Find Your Files. https://CRAN.R-project.org/package=here.
Pebesma, Edzer. 2018. Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.
Pebesma, Edzer J., and Roger Bivand. 2005. “Classes and Methods for Spatial Data in R.” R News 5 (2): 9–13. https://CRAN.R-project.org/doc/Rnews/.
Pebesma, Edzer, and Roger Bivand. 2023. Spatial Data Science: With applications in R. Chapman and Hall/CRC. https://doi.org/10.1201/9780429459016.
Pedersen, Thomas Lin. 2024. patchwork: The Composer of Plots. https://CRAN.R-project.org/package=patchwork.
R Core Team. 2024a. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
———. 2024b. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Rue, Håvard, Sara Martino, and Nicholas Chopin. 2009. “Approximate Bayesian Inference for Latent Gaussian Models Using Integrated Nested Laplace Approximations (with Discussion).” Journal of the Royal Statistical Society B 71: 319–92.
Rue, Håvard, Andrea I. Riebler, Sigrunn H. Sørbye, Janine B. Illian, Daniel P. Simpson, and Finn K. Lindgren. 2017. “Bayesian Computing with INLA: A Review.” Annual Reviews of Statistics and Its Applications 4 (March): 395–421. http://arxiv.org/abs/1604.00860.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with r, Plotly, and Shiny. Chapman; Hall/CRC. https://plotly-r.com.
Verbosio, Fabio, Arne De Coninck, Drosos Kourounis, and Olaf Schenk. 2017. “Enhancing the Scalability of Selected Inversion Factorization Algorithms in Genomic Prediction.” Journal of Computational Science 22 (Supplement C): 99–108. https://doi.org/10.1016/j.jocs.2017.08.013.
Wickham, Hadley. 2007. “Reshaping Data with the reshape Package.” Journal of Statistical Software 21 (12): 1–20. http://www.jstatsoft.org/v21/i12/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, Thomas Lin Pedersen, and Dana Seidel. 2023. scales: Scale Functions for Visualization. https://CRAN.R-project.org/package=scales.
Wilke, Claus O. 2024. cowplot: Streamlined Plot Theme and Plot Annotations for ggplot2. https://CRAN.R-project.org/package=cowplot.
Wilke, Claus O., and Brenton M. Wiernik. 2022. ggtext: Improved Text Rendering Support for ggplot2. https://CRAN.R-project.org/package=ggtext.
Xie, Yihui. 2014. knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2024. knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
Yuan, Yuan, Bachl, Fabian E., Lindgren, Finn, Borchers, et al. 2017. “Point Process Models for Spatio-Temporal Distance Sampling Data from a Large-Scale Survey of Blue Whales.” Ann. Appl. Stat. 11 (4): 2270–97. https://doi.org/10.1214/17-AOAS1078.
LS0tCnRpdGxlOiAiQmFzaXMgZnVuY3Rpb25zLCBhbHRlcm5hdGl2ZSBpbGx1c3RyYXRpb25zIgpkYXRlOiAiQ3JlYXRlZDogMDUtMDctMjAyNC4gTGFzdCBtb2RpZmllZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWS4nKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgbWF0aGpheDogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbWF0aGpheEAzL2VzNS90ZXgtbW1sLWNodG1sLmpzIgogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdGhlbWU6IGZsYXRseQogICAgY29kZV9mb2xkaW5nOiBzaG93ICMgY2xhc3Muc291cmNlID0gImZvbGQtaGlkZSIgdG8gaGlkZSBjb2RlIGFuZCBhZGQgYSBidXR0b24gdG8gc2hvdyBpdAogICAgIyBkZl9wcmludDogcGFnZWQKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKYWx3YXlzX2FsbG93X2h0bWw6IHRydWUKYmlibGlvZ3JhcGh5OiAKICAtIHJlZmVyZW5jZXMuYmliCiAgLSBncmF0ZWZ1bC1yZWZzLmJpYgpoZWFkZXItaW5jbHVkZXM6CiAgLSBcbmV3Y29tbWFuZHtcYXJ9e1xtYXRoYmJ7Un19CiAgLSBcbmV3Y29tbWFuZHtcbGxhdn1bMV17XGxlZnRceyMxXHJpZ2h0XH19CiAgLSBcbmV3Y29tbWFuZHtccGFyZX1bMV17XGxlZnQoIzFccmlnaHQpfQogIC0gXG5ld2NvbW1hbmR7XE5jYWx9e1xtYXRoY2Fse059fQogIC0gXG5ld2NvbW1hbmR7XFZjYWx9e1xtYXRoY2Fse1Z9fQogIC0gXG5ld2NvbW1hbmR7XEVjYWx9e1xtYXRoY2Fse0V9fQotLS0KCgpgYGB7ciB4YXJpbmdhbkV4dHJhLWNsaXBib2FyZCwgZWNobyA9IEZBTFNFfQpodG1sdG9vbHM6OnRhZ0xpc3QoCiAgeGFyaW5nYW5FeHRyYTo6dXNlX2NsaXBib2FyZCgKICAgIGJ1dHRvbl90ZXh0ID0gIjxpIGNsYXNzPVwiZmEtc29saWQgZmEtY2xpcGJvYXJkXCIgc3R5bGU9XCJjb2xvcjogIzAwMDA4QlwiPjwvaT4iLAogICAgc3VjY2Vzc190ZXh0ID0gIjxpIGNsYXNzPVwiZmEgZmEtY2hlY2tcIiBzdHlsZT1cImNvbG9yOiAjOTBCRTZEXCI+PC9pPiIsCiAgICBlcnJvcl90ZXh0ID0gIjxpIGNsYXNzPVwiZmEgZmEtdGltZXMtY2lyY2xlXCIgc3R5bGU9XCJjb2xvcjogI0Y5NDE0NFwiPjwvaT4iCiAgKSwKICBybWFya2Rvd246Omh0bWxfZGVwZW5kZW5jeV9mb250X2F3ZXNvbWUoKQopCmBgYAoKCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0KYm9keSAubWFpbi1jb250YWluZXIgewogIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50OwogIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Cn0KYm9keSB7CiAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Cn0KCmJvZHksIHRkIHsKICAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE0cHg7Cn0KcHJlIHsKICBmb250LXNpemU6IDE0cHgKfQouY2FwdGlvbiB7CiAgbWFyZ2luOiBhdXRvOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW4tYm90dG9tOiAyMHB4OyAvKiBTcGFjaW5nIGJlbG93IHRoZSBib3ggKi8KfQpgYGAKCgpHbyBiYWNrIHRvIHRoZSBbQWJvdXQgcGFnZV0oYWJvdXQuaHRtbCkuCgpHbyBiYWNrIHRvIHRoZSBbQmFzaXMgRnVuY3Rpb25zXShiYXNpc19mdW5jdGlvbnMuaHRtbCkgcGFnZS4KCkxldCB1cyBzZXQgc29tZSBnbG9iYWwgb3B0aW9ucyBmb3IgYWxsIGNvZGUgY2h1bmtzIGluIHRoaXMgZG9jdW1lbnQuCgoKYGBge3J9CiMgU2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxOTgyKSAKIyBTZXQgZ2xvYmFsIG9wdGlvbnMgZm9yIGFsbCBjb2RlIGNodW5rcwprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgIyBEaXNhYmxlIG1lc3NhZ2VzIHByaW50ZWQgYnkgUiBjb2RlIGNodW5rcwogIG1lc3NhZ2UgPSBGQUxTRSwgICAgCiAgIyBEaXNhYmxlIHdhcm5pbmdzIHByaW50ZWQgYnkgUiBjb2RlIGNodW5rcwogIHdhcm5pbmcgPSBGQUxTRSwgICAgCiAgIyBTaG93IFIgY29kZSB3aXRoaW4gY29kZSBjaHVua3MgaW4gb3V0cHV0CiAgZWNobyA9IFRSVUUsICAgICAgICAKICAjIEluY2x1ZGUgYm90aCBSIGNvZGUgYW5kIGl0cyByZXN1bHRzIGluIG91dHB1dAogIGluY2x1ZGUgPSBUUlVFLCAgICAgCiAgIyBFdmFsdWF0ZSBSIGNvZGUgY2h1bmtzCiAgZXZhbCA9IFRSVUUsICAgICAgIAogICMgRW5hYmxlIGNhY2hpbmcgb2YgUiBjb2RlIGNodW5rcyBmb3IgZmFzdGVyIHJlbmRlcmluZwogIGNhY2hlID0gRkFMU0UsICAgICAgCiAgIyBBbGlnbiBmaWd1cmVzIGluIHRoZSBjZW50ZXIgb2YgdGhlIG91dHB1dAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogICMgRW5hYmxlIHJldGluYSBkaXNwbGF5IGZvciBoaWdoLXJlc29sdXRpb24gZmlndXJlcwogIHJldGluYSA9IDIsCiAgIyBTaG93IGVycm9ycyBpbiB0aGUgb3V0cHV0IGluc3RlYWQgb2Ygc3RvcHBpbmcgcmVuZGVyaW5nCiAgZXJyb3IgPSBUUlVFLAogICMgRG8gbm90IGNvbGxhcHNlIGNvZGUgYW5kIG91dHB1dCBpbnRvIGEgc2luZ2xlIGJsb2NrCiAgY29sbGFwc2UgPSBGQUxTRQopCiMgU3RhcnQgdGhlIGZpZ3VyZSBjb3VudGVyCmZpZ19jb3VudCA8LSAwCiMgRGVmaW5lIHRoZSBjYXB0aW9uZXIgZnVuY3Rpb24KY2FwdGlvbmVyIDwtIGZ1bmN0aW9uKGNhcHRpb24pIHsKICBmaWdfY291bnQgPDwtIGZpZ19jb3VudCArIDEKICBwYXN0ZTAoIkZpZ3VyZSAiLCBmaWdfY291bnQsICI6ICIsIGNhcHRpb24pCn0KYGBgCgojIEltcG9ydCBsaWJyYXJpZXMKCmBgYHtyfQpsaWJyYXJ5KE1ldHJpY0dyYXBoKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsb3RseSkKCmxpYnJhcnkoaGVyZSkKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoZ3JhdGVmdWwpICMgdG8gY2l0ZQpgYGAKCiMgQnkgaGFuZAoKPGRpdiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4KKioqKioqKioKKipQcmVzcyB0aGUgU2hvdyBidXR0b24gYmVsb3cgdG8gcmV2ZWFsIHRoZSBjb2RlLioqCgoqKioqKioqKgo8L2Rpdj4KCmBgYHtyLCAgZmlnLmhlaWdodCA9IDgsIG91dC53aWR0aCA9ICIxMDAlIiwgY2xhc3Muc291cmNlID0gImZvbGQtaGlkZSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIklsbHVzdHJhdGlvbiBvZiB0aGUgc3lzdGVtIG9mIGJhc2lzIGZ1bmN0aW9ucyAkXFx7XFx2YXJwaGlfal5lLCBcXHBoaV92XFx9JCAoc29saWQgZ3JheSBsaW5lcykgb24gdGhlIGdyYXBoICRcXEdhbW1hPSAoXFxWY2FsLFxcRWNhbCkkLCB3aGVyZSAkXFxFY2FsPSBcXGxsYXZ7ZV8xLFxcZG90cyxlXzh9JCBhbmQgJFxcVmNhbCA9ICBcXGxsYXZ7dl8xLFxcZG90cyx2Xzd9JC4gTm90ZSB0aGF0IGZvciBhbGwgJGVfaVxcaW5cXEVjYWwkLCAkbl97ZV9pfSA9IDMkIGFuZCAkaF97ZV9pfSA9IDEvMyQuIEluIHBhcnRpY3VsYXIsIGZvciBlZGdlICRlXzckLCBvYnNlcnZlIHRoYXQgdGhlIHRocmVlIHJlZ3VsYXIgc2VnbWVudHMgYXJlIGRlbGltaXRlZCBieSB0aGUgbm9kZXMgJHZfNiA9IHhfMF57ZV83fSwgeF8xXntlXzd9LCB4XzJee2VfN30sIHhfM157ZV83fSA9IHZfNyQuIENvcnJlc3BvbmRpbmcgdG8gbm9kZSAkeF8xXntlXzd9JCwgd2UgaGF2ZSBwbG90dGVkIHRoZSBiYXNpcyBmdW5jdGlvbiAkXFx2YXJwaGlfMV57ZV83fSQgaW4gYmx1ZS4gTm90aWNlIGFsc28gdGhhdCB0aGUgc2V0ICRcXE5jYWxfe3ZfMn0kIGlzIGRlcGljdGVkIGluIGdyZWVuIGFuZCBpdHMgY29ycmVzcG9uZGluZyBiYXNpcyBmdW5jdGlvbiAkXFxwaGlfe3ZfMn0kIGlzIHNob3duIGluIHJlZC4iKX0KClYgPC0gcmJpbmQoYygwLCAwKSwgYygxLCAwKSwgYygxLCAxKSwgYygwLCAxKSwgYygtMSwgMSksIGMoLTEsIDApLCBjKDAsIC0xKSkKRSA8LSByYmluZChjKDEsIDIpLCBjKDIsIDMpLCBjKDMsIDQpLCBjKDQsIDUpLAogICAgICAgICAgIGMoNSwgNiksIGMoNiwgMSksIGMoNCwgMSksYygxLCA3KSkKZ3JhcGggPC0gbWV0cmljX2dyYXBoJG5ldyhWID0gViwgRSA9IEUpCgojdmVydGljYWwgCmRmMDEgPSBkYXRhLmZyYW1lKHggPSBjKC0xLC0xKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZGYwMiA9IGRhdGEuZnJhbWUoeCA9IGMoLTIvMywtMi8zKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZGYwMyA9IGRhdGEuZnJhbWUoeCA9IGMoLTEvMywtMS8zKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZGYwNCA9IGRhdGEuZnJhbWUoeCA9IGMoMCwwKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZGYwNSA9IGRhdGEuZnJhbWUoeCA9IGMoMCwwKSwgeSA9IGMoLTEvMywtMS8zKSwgeiA9IGMoMCwxKSkKZGYwNiA9IGRhdGEuZnJhbWUoeCA9IGMoMCwwKSwgeSA9IGMoLTIvMywtMi8zKSwgeiA9IGMoMCwxKSkKZGYwNyA9IGRhdGEuZnJhbWUoeCA9IGMoMCwwKSwgeSA9IGMoLTEsLTEpLCB6ID0gYygwLDEpKQpkZjA4ID0gZGF0YS5mcmFtZSh4ID0gYygyLzMsMi8zKSwgeSA9IGMoLTEsLTEpLCB6ID0gYygwLDEpKQpkZjA5ID0gZGF0YS5mcmFtZSh4ID0gYygxLzMsMS8zKSwgeSA9IGMoLTEsLTEpLCB6ID0gYygwLDEpKQpkZjEwID0gZGF0YS5mcmFtZSh4ID0gYygxLDEpLCB5ID0gYygtMSwtMSksIHogPSBjKDAsMSkpCmRmMTEgPSBkYXRhLmZyYW1lKHggPSBjKDIvMywyLzMpLCB5ID0gYygwLDApLCB6ID0gYygwLDEpKQpkZjEyID0gZGF0YS5mcmFtZSh4ID0gYygxLzMsMS8zKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZGYxMyA9IGRhdGEuZnJhbWUoeCA9IGMoMSwxKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZGYxNCA9IGRhdGEuZnJhbWUoeCA9IGMoMi8zLDIvMyksIHkgPSBjKDEsMSksIHogPSBjKDAsMSkpCmRmMTUgPSBkYXRhLmZyYW1lKHggPSBjKDEvMywxLzMpLCB5ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkZjE2ID0gZGF0YS5mcmFtZSh4ID0gYygxLDEpLCB5ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkZjE3ID0gZGF0YS5mcmFtZSh4ID0gYygxLDEpLCB5ID0gYygtMS8zLC0xLzMpLCB6ID0gYygwLDEpKQpkZjE4ID0gZGF0YS5mcmFtZSh4ID0gYygxLDEpLCB5ID0gYygtMi8zLC0yLzMpLCB6ID0gYygwLDEpKQpkZjE5ID0gZGF0YS5mcmFtZSh4ID0gYygxLDEpLCB5ID0gYygxLzMsMS8zKSwgeiA9IGMoMCwxKSkKZGYyMCA9IGRhdGEuZnJhbWUoeCA9IGMoMSwxKSwgeSA9IGMoMi8zLDIvMyksIHogPSBjKDAsMSkpCmRmMjEgPSBkYXRhLmZyYW1lKHggPSBjKDAsMCksIHkgPSBjKDEvMywxLzMpLCB6ID0gYygwLDEpKQpkZjIyID0gZGF0YS5mcmFtZSh4ID0gYygwLDApLCB5ID0gYygyLzMsMi8zKSwgeiA9IGMoMCwxKSkKZGYyMyA9IGRhdGEuZnJhbWUoeCA9IGMoMCwwKSwgeSA9IGMoMSwxKSwgeiA9IGMoMCwxKSkKI2luY2xpbmVkCmQwMSA9IGRhdGEuZnJhbWUoeCA9IGMoLTEsLTIvMyksIHkgPSBjKDAsMCksIHogPSBjKDAsMSkpCmQwMiA9IGRhdGEuZnJhbWUoeCA9IGMoLTIvMywtMS8zKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDAzID0gZGF0YS5mcmFtZSh4ID0gYygtMS8zLDApLCB5ID0gYygwLDApLCB6ID0gYygwLDEpKSAjY2VudHJhbApkMDQgPSBkYXRhLmZyYW1lKHggPSBjKDAsMS8zKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDA1ID0gZGF0YS5mcmFtZSh4ID0gYygxLzMsMi8zKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDA2ID0gZGF0YS5mcmFtZSh4ID0gYygyLzMsMSksIHkgPSBjKDAsMCksIHogPSBjKDAsMSkpCmQwNyA9IGRhdGEuZnJhbWUoeCA9IGMoMSwyLzMpLCB5ID0gYygwLDApLCB6ID0gYygwLDEpKQpkMDggPSBkYXRhLmZyYW1lKHggPSBjKDIvMywxLzMpLCB5ID0gYygwLDApLCB6ID0gYygwLDEpKQpkMDkgPSBkYXRhLmZyYW1lKHggPSBjKDEvMywwKSwgeSA9IGMoMCwwKSwgeiA9IGMoMCwxKSkgI2NlbnRyYWwKZDEwID0gZGF0YS5mcmFtZSh4ID0gYygwLC0xLzMpLCB5ID0gYygwLDApLCB6ID0gYygwLDEpKQpkMTEgPSBkYXRhLmZyYW1lKHggPSBjKC0xLzMsLTIvMyksIHkgPSBjKDAsMCksIHogPSBjKDAsMSkpCmQxMiA9IGRhdGEuZnJhbWUoeCA9IGMoLTIvMywtMSksIHkgPSBjKDAsMCksIHogPSBjKDAsMSkpCmQxMyA9IGRhdGEuZnJhbWUoeCA9IGMoMCwxLzMpLCB5ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkMTQgPSBkYXRhLmZyYW1lKHggPSBjKDEvMywyLzMpLCB5ID0gYygxLDEpLCB6ID0gYygwLDEpKSNiYXNpcwpkMTUgPSBkYXRhLmZyYW1lKHggPSBjKDIvMywxKSwgeSA9IGMoMSwxKSwgeiA9IGMoMCwxKSkKZDE2ID0gZGF0YS5mcmFtZSh4ID0gYygxLDIvMyksIHkgPSBjKDEsMSksIHogPSBjKDAsMSkpI2Jhc2lzCmQxNyA9IGRhdGEuZnJhbWUoeCA9IGMoMi8zLDEvMyksIHkgPSBjKDEsMSksIHogPSBjKDAsMSkpCmQxOCA9IGRhdGEuZnJhbWUoeCA9IGMoMS8zLDApLCB5ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkMTkgPSBkYXRhLmZyYW1lKHggPSBjKDAsMS8zKSwgeSA9IGMoLTEsLTEpLCB6ID0gYygwLDEpKQpkMjAgPSBkYXRhLmZyYW1lKHggPSBjKDEvMywyLzMpLCB5ID0gYygtMSwtMSksIHogPSBjKDAsMSkpCmQyMSA9IGRhdGEuZnJhbWUoeCA9IGMoMi8zLDEpLCB5ID0gYygtMSwtMSksIHogPSBjKDAsMSkpCmQyMiA9IGRhdGEuZnJhbWUoeCA9IGMoMSwyLzMpLCB5ID0gYygtMSwtMSksIHogPSBjKDAsMSkpCmQyMyA9IGRhdGEuZnJhbWUoeCA9IGMoMi8zLDEvMyksIHkgPSBjKC0xLC0xKSwgeiA9IGMoMCwxKSkKZDI0ID0gZGF0YS5mcmFtZSh4ID0gYygxLzMsMCksIHkgPSBjKC0xLC0xKSwgeiA9IGMoMCwxKSkKZDI1ID0gZGF0YS5mcmFtZSh5ID0gYygtMSwtMi8zKSwgeCA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDI2ID0gZGF0YS5mcmFtZSh5ID0gYygtMi8zLC0xLzMpLCB4ID0gYygwLDApLCB6ID0gYygwLDEpKQpkMjcgPSBkYXRhLmZyYW1lKHkgPSBjKC0xLzMsMCksIHggPSBjKDAsMCksIHogPSBjKDAsMSkpICNjZW50cmFsCmQyOCA9IGRhdGEuZnJhbWUoeSA9IGMoMCwxLzMpLCB4ID0gYygwLDApLCB6ID0gYygwLDEpKQpkMjkgPSBkYXRhLmZyYW1lKHkgPSBjKDEvMywyLzMpLCB4ID0gYygwLDApLCB6ID0gYygwLDEpKQpkMzAgPSBkYXRhLmZyYW1lKHkgPSBjKDIvMywxKSwgeCA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDMxID0gZGF0YS5mcmFtZSh5ID0gYygxLDIvMyksIHggPSBjKDAsMCksIHogPSBjKDAsMSkpCmQzMiA9IGRhdGEuZnJhbWUoeSA9IGMoMi8zLDEvMyksIHggPSBjKDAsMCksIHogPSBjKDAsMSkpCmQzMyA9IGRhdGEuZnJhbWUoeSA9IGMoMS8zLDApLCB4ID0gYygwLDApLCB6ID0gYygwLDEpKSAjY2VudHJhbApkMzQgPSBkYXRhLmZyYW1lKHkgPSBjKDAsLTEvMyksIHggPSBjKDAsMCksIHogPSBjKDAsMSkpCmQzNSA9IGRhdGEuZnJhbWUoeSA9IGMoLTEvMywtMi8zKSwgeCA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDM2ID0gZGF0YS5mcmFtZSh5ID0gYygtMi8zLC0xKSwgeCA9IGMoMCwwKSwgeiA9IGMoMCwxKSkKZDM3ID0gZGF0YS5mcmFtZSh5ID0gYygtMSwtMi8zKSwgeCA9IGMoMSwxKSwgeiA9IGMoMCwxKSkKZDM4ID0gZGF0YS5mcmFtZSh5ID0gYygtMi8zLC0xLzMpLCB4ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkMzkgPSBkYXRhLmZyYW1lKHkgPSBjKC0xLzMsMCksIHggPSBjKDEsMSksIHogPSBjKDAsMSkpCmQ0MCA9IGRhdGEuZnJhbWUoeSA9IGMoMCwxLzMpLCB4ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkNDEgPSBkYXRhLmZyYW1lKHkgPSBjKDEvMywyLzMpLCB4ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkNDIgPSBkYXRhLmZyYW1lKHkgPSBjKDIvMywxKSwgeCA9IGMoMSwxKSwgeiA9IGMoMCwxKSkKZDQzID0gZGF0YS5mcmFtZSh5ID0gYygxLDIvMyksIHggPSBjKDEsMSksIHogPSBjKDAsMSkpCmQ0NCA9IGRhdGEuZnJhbWUoeSA9IGMoMi8zLDEvMyksIHggPSBjKDEsMSksIHogPSBjKDAsMSkpCmQ0NSA9IGRhdGEuZnJhbWUoeSA9IGMoMS8zLDApLCB4ID0gYygxLDEpLCB6ID0gYygwLDEpKQpkNDYgPSBkYXRhLmZyYW1lKHkgPSBjKDAsLTEvMyksIHggPSBjKDEsMSksIHogPSBjKDAsMSkpCmQ0NyA9IGRhdGEuZnJhbWUoeSA9IGMoLTEvMywtMi8zKSwgeCA9IGMoMSwxKSwgeiA9IGMoMCwxKSkKZDQ4ID0gZGF0YS5mcmFtZSh5ID0gYygtMi8zLC0xKSwgeCA9IGMoMSwxKSwgeiA9IGMoMCwxKSkKIyBzdGFyIHNldApkNDkgPSBkYXRhLmZyYW1lKHkgPSBjKDEvMywwKSwgeCA9IGMoMCwwKSwgeiA9IGMoMCwwKSkKZDUwID0gZGF0YS5mcmFtZSh5ID0gYygwLDApLCB4ID0gYygxLzMsMCksIHogPSBjKDAsMCkpCmQ1MSA9IGRhdGEuZnJhbWUoeSA9IGMoLTEvMywwKSwgeCA9IGMoMCwwKSwgeiA9IGMoMCwwKSkKZDUyID0gZGF0YS5mcmFtZSh5ID0gYygwLDApLCB4ID0gYygtMS8zLDApLCB6ID0gYygwLDApKQoKZ3JhcGgkYnVpbGRfbWVzaChoID0gMS80MCkKZ3JhcGgkcGxvdChwbG90bHkgPSBUUlVFLCB2ZXJ0ZXhfc2l6ZSA9IDQsIHZlcnRleF9jb2xvciA9ICJibHVlIiwKICAgICAgICAgICBlZGdlX2NvbG9yID0gImJsYWNrIiwgZWRnZV93aWR0aCA9IDIpICU+JSAgCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgJT4lIAogIGxheW91dCh0aXRsZSA9IFRlWCgiXFx0ZXh0e0Jhc2lzIGZ1bmN0aW9ucyBvbiBhIG1ldHJpYyBncmFwaCB9XFxHYW1tYSA9IChcXG1hdGhjYWx7Vn0sXFxtYXRoY2Fse0V9KSIpLCAKICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMS44LCB5ID0gMS44LCB6ID0gMC40KSwKICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gLTEsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAiYmxhY2siLCBhcnJvd3NpemUgPSAxLCBhcnJvd3dpZHRoID0gMSxhcnJvd2hlYWQgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJibGFjayIsIGFycm93c2l6ZSA9IDEsIGFycm93d2lkdGggPSAxLGFycm93aGVhZCA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLCB5ID0gLTEsIHogPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJibGFjayIsIGFycm93c2l6ZSA9IDEsIGFycm93d2lkdGggPSAxLGFycm93aGVhZCA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxLCB5ID0gLTEsIHogPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJibGFjayIsIGFycm93c2l6ZSA9IDEsIGFycm93d2lkdGggPSAxLGFycm93aGVhZCA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl81IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gImJsYWNrIiwgYXJyb3dzaXplID0gMSwgYXJyb3d3aWR0aCA9IDEsYXJyb3doZWFkID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDEsIHkgPSAxLCB6ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzYseF8wXntlXzd9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gImJsYWNrIiwgYXJyb3dzaXplID0gMSwgYXJyb3d3aWR0aCA9IDEsYXJyb3doZWFkID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAxLCB6ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzcseF8zXntlXzd9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gImJsYWNrIiwgYXJyb3dzaXplID0gMSwgYXJyb3d3aWR0aCA9IDEsYXJyb3doZWFkID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDIvMywgeSA9IDEsIHogPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInhfMV57ZV83fSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJibGFjayIsIGFycm93c2l6ZSA9IDEsIGFycm93d2lkdGggPSAxLGFycm93aGVhZCA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxLzMsIHkgPSAxLCB6ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ4XzJee2VfN30iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAiYmxhY2siLCBhcnJvd3NpemUgPSAxLCBhcnJvd3dpZHRoID0gMSxhcnJvd2hlYWQgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4xNSwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcbWF0aGNhbHtOfV97dl8yfSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJ3aGl0ZSIsIGFycm93c2l6ZSA9IDEsIGFycm93d2lkdGggPSAxLGFycm93aGVhZCA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAyLzMsIHkgPSAxLCB6ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXHZhcnBoaV8xXntlXzd9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDc1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsdWUiLCBzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAid2hpdGUiLCBhcnJvd3NpemUgPSAxLCBhcnJvd3dpZHRoID0gMSxhcnJvd2hlYWQgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxccGhpX3t2XzJ9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDc1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gInJlZCIsIHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJ3aGl0ZSIsIGFycm93c2l6ZSA9IDEsIGFycm93d2lkdGggPSAxLGFycm93aGVhZCA9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICkpKSAlPiUgCiAgYWRkX3RyYWNlKHggPSAtMi8zLCB5ID0gMCwgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAtMS8zLCB5ID0gMCwgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gLTEvMywgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gLTIvMywgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAxLzMsIHkgPSAtMSwgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAyLzMsIHkgPSAtMSwgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gMS8zLCB6ID0gMCwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDAsIHkgPSAyLzMsIHogPSAwLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0LCBjb2xvciA9ICJibGFjayIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoeCA9IDEvMywgeSA9IDAsIHogPSAwLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0LCBjb2xvciA9ICJibGFjayIsIHN5bWJvbCA9IDEwNCkpICU+JQogIGFkZF90cmFjZSh4ID0gMi8zLCB5ID0gMCwgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZSh4ID0gMS8zLCB5ID0gMSwgeiA9IDAsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAyLzMsIHkgPSAxLCB6ID0gMCwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKHggPSAxLCB5ID0gMS8zLCB6ID0gMCwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAyLzMsIHogPSAwLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0LCBjb2xvciA9ICJibGFjayIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAtMS8zLCB6ID0gMCwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAtMi8zLCB6ID0gMCwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUgI3NvIGZhciB0aGUgYm90dG9uCiAgYWRkX3RyYWNlKHggPSAtMi8zLCB5ID0gMCwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAtMS8zLCB5ID0gMCwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gLTEvMywgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gLTIvMywgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAxLzMsIHkgPSAtMSwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAyLzMsIHkgPSAtMSwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gMS8zLCB6ID0gMSwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMSwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDAsIHkgPSAyLzMsIHogPSAxLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAxLCBjb2xvciA9ICJibGFjayIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoeCA9IDEvMywgeSA9IDAsIHogPSAxLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAxLCBjb2xvciA9ICJibGFjayIsIHN5bWJvbCA9IDEwNCkpICU+JQogIGFkZF90cmFjZSh4ID0gMi8zLCB5ID0gMCwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZSh4ID0gMS8zLCB5ID0gMSwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAyLzMsIHkgPSAxLCB6ID0gMSwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMSwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKHggPSAxLCB5ID0gMS8zLCB6ID0gMSwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMSwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAyLzMsIHogPSAxLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAxLCBjb2xvciA9ICJibGFjayIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAtMS8zLCB6ID0gMSwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMSwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAtMi8zLCB6ID0gMSwgbW9kZSA9ICJtYXJrZXJzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAjIG5vdyB0aGUgdmV4dGV4IGFib3ZlCiAgYWRkX3RyYWNlKHggPSAtMSwgeSA9IDAsIHogPSAxLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZSh4ID0gMCwgeSA9IDAsIHogPSAxLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gMSwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKHggPSAwLCB5ID0gLTEsIHogPSAxLCBtb2RlID0gIm1hcmtlcnMiLCB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lCiAgYWRkX3RyYWNlKHggPSAxLCB5ID0gMCwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKHggPSAxLCB5ID0gMSwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUKICBhZGRfdHJhY2UoeCA9IDEsIHkgPSAtMSwgeiA9IDEsIG1vZGUgPSAibWFya2VycyIsIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjAxLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMDIsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYwMywgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjA0LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMDUsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYwNiwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjA3LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMDgsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYwOSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjEwLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMTEsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYxMiwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjEzLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMTQsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYxNSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjE2LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMTcsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYxOCwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjE5LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMjAsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZGYyMSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0LCBkYXNoID0gJ2RvdCcpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkZjIyLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQsIGRhc2ggPSAnZG90JykpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGRmMjMsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCwgZGFzaCA9ICdkb3QnKSkgJT4lICNzbyBmYXIgdmVydGljYWwKICBhZGRfdHJhY2UoZGF0YSA9IGQwMSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDAyLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMDMsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMiwgY29sb3IgPSAicmVkIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDA0LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMDUsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQwNiwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDA3LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMDgsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQwOSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAyLCBjb2xvciA9ICJyZWQiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMTAsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQxMSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDEyLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMTMsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQxNCwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAyLCBjb2xvciA9ICJibHVlIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDE1LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMTYsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMiwgY29sb3IgPSAiYmx1ZSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQxNywgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDE4LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMTksIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQyMCwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDIxLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMjIsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQyMywgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDI0LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMjUsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQyNiwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDI3LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDIsIGNvbG9yID0gInJlZCIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQyOCwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDI5LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMzAsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQzMSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDMyLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMzMsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMiwgY29sb3IgPSAicmVkIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDM0LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMzUsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQzNiwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDM3LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkMzgsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQzOSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDQwLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkNDEsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQ0MiwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDQzLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkNDQsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQ0NSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDQ2LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDEsIGNvbG9yID0gImdyYXkiLCBzeW1ib2wgPSAxMDQpKSAlPiUgCiAgYWRkX3RyYWNlKGRhdGEgPSBkNDcsIHggPSB+eCwgeSA9IH55LCB6ID0gfnosIG1vZGUgPSAibGluZXMiLCB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSwgY29sb3IgPSAiZ3JheSIsIHN5bWJvbCA9IDEwNCkpICU+JSAKICBhZGRfdHJhY2UoZGF0YSA9IGQ0OCwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgbW9kZSA9ICJsaW5lcyIsIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSAxLCBjb2xvciA9ICJncmF5Iiwgc3ltYm9sID0gMTA0KSkgJT4lICNzdGFyIHNldAogIGFkZF90cmFjZShkYXRhID0gZDQ5LCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDMsIGNvbG9yID0gImdyZWVuIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDUwLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDMsIGNvbG9yID0gImdyZWVuIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDUxLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDMsIGNvbG9yID0gImdyZWVuIiwgc3ltYm9sID0gMTA0KSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0gZDUyLCB4ID0gfngsIHkgPSB+eSwgeiA9IH56LCBtb2RlID0gImxpbmVzIiwgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDMsIGNvbG9yID0gImdyZWVuIiwgc3ltYm9sID0gMTA0KSkKYGBgCgojIFVzaW5nIHByb2plY3Rpb24gbWF0cml4CgoKYGBge3IsIGZpZy5kaW0gPSBjKDUsNSksIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZpbmUgbWVzaCIpfQpncmFwaF90b19nZXRfbG9jIDwtIGdyYXBoJGNsb25lKCkKZ3JhcGhfdG9fZ2V0X2xvYyRidWlsZF9tZXNoKGggPSAxLzE1MCkKCmdyYXBoX3RvX2dldF9sb2MkcGxvdChtZXNoID0gVFJVRSkgKyAKICBnZ3RpdGxlKCJGaW5lIG1lc2giKSArIAogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlBhbGF0aW5vIikpCmBgYAoKCmBgYHtyLCBmaWcuZGltID0gYyg1LDUpLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJDb2Fyc2UgbWVzaCIpfQpsb2MgPC0gZ3JhcGhfdG9fZ2V0X2xvYyRnZXRfbWVzaF9sb2NhdGlvbnMoKQoKZ3JhcGgkYnVpbGRfbWVzaChoID0gMS8zKQoKZ3JhcGgkcGxvdChtZXNoID0gVFJVRSkgKyAKICBnZ3RpdGxlKCJDb2Fyc2UgbWVzaCIpICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiUGFsYXRpbm8iKSkKYGBgCgoKYGBge3J9CkEgPC0gZ3JhcGgkZmVtX2Jhc2lzKGxvYykKCkREIDwtIGRhdGEuZnJhbWUoQSA9IGFzLm1hdHJpeChBKSkgJT4lIAogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUobWF4X3ZhbHVlID0gbWF4KGNfYWNyb3NzKGV2ZXJ5dGhpbmcoKSkpKSAlPiUKICBjYmluZChlZGdlX251bWJlciA9IGxvY1ssIDFdLCBkaXN0YW5jZV9vbl9lZGdlID0gbG9jWywgMl0sIEEuMjQgPSAwKQoKZ3JhcGgkYWRkX29ic2VydmF0aW9ucyhkYXRhID0gREQsIGVkZ2VfbnVtYmVyID0gImVkZ2VfbnVtYmVyIiwKICBkaXN0YW5jZV9vbl9lZGdlID0gImRpc3RhbmNlX29uX2VkZ2UiLCBkYXRhX2Nvb3JkcyA9ICJQdEUiLCBub3JtYWxpemVkID0gVFJVRSwgY2xlYXJfb2JzID0gVFJVRSkKYGBgCgoKPGRpdiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4KKioqKioqKioKKipQcmVzcyB0aGUgU2hvdyBidXR0b24gYmVsb3cgdG8gcmV2ZWFsIHRoZSBjb2RlLioqCgoqKioqKioqKgo8L2Rpdj4KCgpgYGB7ciwgZmlnLmhlaWdodCA9IDgsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiQmFzaXMgZnVuY3Rpb25zIG9uIGEgbWV0cmljIGdyYXBoICRcXEdhbW1hID0gKFxcbWF0aGNhbHtWfSxcXG1hdGhjYWx7RX0pJCIpfQpncmFwaCRwbG90KGRhdGEgPSAibWF4X3ZhbHVlIiwgdmVydGV4X3NpemUgPSAwLCBwbG90bHkgPSBUUlVFLCBlZGdlX3dpZHRoID0gMC4xKSAlPiUgIAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpICU+JSAKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgc2NlbmUgPSBsaXN0KGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMS44LCB5ID0gMS44LCB6ID0gMC40KSkpCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJPbmUgYmFzaXMgZnVuY3Rpb24gb24gYSBtZXRyaWMgZ3JhcGggJFxcR2FtbWEgPSAoXFxtYXRoY2Fse1Z9LFxcbWF0aGNhbHtFfSkkIil9CmdyYXBoJHBsb3QoZGF0YSA9ICJBLjEiLCB2ZXJ0ZXhfc2l6ZSA9IDAsIHBsb3RseSA9IFRSVUUsIGVkZ2Vfd2lkdGggPSAwLjEpICU+JSAgCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgJT4lIAogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UsCiAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICBzY2VuZSA9IGxpc3QoYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAxLjgsIHkgPSAxLjgsIHogPSAwLjQpKSkKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQgPSA4LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkJhc2lzIGZ1bmN0aW9ucyBvbiBhIG1ldHJpYyBncmFwaCAkXFxHYW1tYSA9IChcXG1hdGhjYWx7Vn0sXFxtYXRoY2Fse0V9KSQiKX0KZ3JhcGhfdG9fZ2V0X2xvYyRwbG90X2Z1bmN0aW9uKFggPSBERCRtYXhfdmFsdWUsIHZlcnRleF9zaXplID0gMCwgcGxvdGx5ID0gVFJVRSkgJT4lICAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSAlPiUgCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgIHNjZW5lID0gbGlzdChhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDEuOCwgeSA9IDEuOCwgeiA9IDAuNCkpKQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodCA9IDgsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiT25lIGJhc2lzIGZ1bmN0aW9uIG9uIGEgbWV0cmljIGdyYXBoICRcXEdhbW1hID0gKFxcbWF0aGNhbHtWfSxcXG1hdGhjYWx7RX0pJCIpfQpncmFwaF90b19nZXRfbG9jJHBsb3RfZnVuY3Rpb24oWCA9IEREJEEuMSwgdmVydGV4X3NpemUgPSAwLCBwbG90bHkgPSBUUlVFKSAlPiUgIAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpICU+JSAKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgc2NlbmUgPSBsaXN0KGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMS44LCB5ID0gMS44LCB6ID0gMC40KSkpCmBgYAoKCgoKIyBSZWZlcmVuY2VzCgpgYGB7cn0KY2l0ZV9wYWNrYWdlcyhvdXRwdXQgPSAicGFyYWdyYXBoIiwgb3V0LmRpciA9ICIuIikKYGBgCgo=