Introducción
El cambio de la estructura productiva puede observarse en la
participación de las actividades en el valor agregado, en la
concentración de la producción y en la desigualdad de los crecimientos
sectoriales. Un aumento del PIB no permite establecer, por sí solo, si
la economía se está diversificando o si cambian los sectores que
sostienen su expansión. Identificar estas diferencias es relevante para
discutir la diversificación y la vulnerabilidad de la economía
salvadoreña.
Pregunta de investigación. ¿Cómo cambiaron la
estructura productiva, la concentración y la inversión de El Salvador
entre 2005 I y 2026 II, y qué evidencia existe de cambios de régimen
alrededor de la crisis de 2008–2009 y de la pandemia de 2020?
Hipótesis de trabajo. La participación del sector
agropecuario en el valor agregado disminuyó entre el inicio y el final
de la muestra, mientras los servicios conservaron el mayor peso. Se
contrasta descriptivamente comparando los promedios de las primeras y de
las últimas cuatro observaciones desestacionalizadas. Las pruebas de
quiebres evalúan la estabilidad del índice NAV y no se interpretan como
pruebas causales de esta hipótesis.
Objetivo general. Analizar la transformación de la
estructura productiva salvadoreña mediante cuatro indicadores simples,
los índices NAV y Lilien, el filtro HP y pruebas de series de
tiempo.
Alcance acordado. El trabajo utiliza producción e
inversión. Se excluyen la productividad laboral y la descomposición
shift-share porque no se incorpora empleo sectorial. Esta exclusión se
aparta de esos dos componentes del Tema 2 de la consigna original. La
dolarización de 2001 se incluye como antecedente; su quiebre no es
estimable con una muestra que empieza en 2005. Estas restricciones se
mantienen visibles en la evaluación de cobertura del anexo.
Metodología
Paso 1 Cargar los
cinco archivos
El archivo nominal trimestral (nom) y el de volumen
trimestral (vol) son las fuentes principales. Los anuales
(ann y anv) sirven de comprobación. El IPC
(ipc) se conserva como referencia: su cobertura 2025–2026
no permite deflactar toda la historia. Se utiliza el deflactor implícito
del PIB.
La primera ruta es la proporcionada por el estudiante. Si no existe,
el código utiliza la subcarpeta datos incluida con el
proyecto. No es necesario cambiar los nombres originales de los Excel.
View(nom) o View(vol) pueden ejecutarse en la
consola de RStudio, fuera del tejido del HTML.
carpeta <- "C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio"
if (!dir.exists(carpeta)) carpeta <- "datos"
nom <- read_excel(file.path(carpeta,
"Producto_Interno_Bruto_Trimestral_(PIB_T)._Producción_y_gasto_a_precios_corrientes.xlsx"), col_names = FALSE)
vol <- read_excel(file.path(carpeta,
"PIB_T._Producción_y_gasto._Índices_de_volumen_encadenados._Serie_original_(referencia_2014).xlsx"), col_names = FALSE)
ann <- read_excel(file.path(carpeta,
"Producto_Interno_Bruto__Producción,_Gasto_e_Ingreso._A_precios_corrientes.xlsx"), col_names = FALSE)
anv <- read_excel(file.path(carpeta,
"PIB__Producción_y_gasto._Índices_de_volumen_encadenados_(año_de_referencia_2014).xlsx"), col_names = FALSE)
ipc <- read_excel(file.path(carpeta,
"Índice_de_Precios_al_Consumidor_(IPC).xlsx"), col_names = FALSE)
# Convierte una fila del Excel en un vector numérico.
fila <- function(x, i) as.numeric(unlist(x[i, -1], use.names = FALSE))
# Las filas 7 a 25 corresponden a las 19 actividades trimestrales.
n <- sapply(7:25, function(i) fila(nom, i))
v <- sapply(7:25, function(i) fila(vol, i))
pib_n <- fila(nom, 28)
fbk_n <- fila(nom, 34)
pib_v <- fila(vol, 28)
fbk_v <- fila(vol, 33)
vab_n <- fila(nom, 26)
ini <- as.integer(nom[[2]][4])
fecha <- seq(as.Date(paste0(ini, "-01-01")), by = "3 months", length.out = nrow(n))
anio <- as.integer(format(fecha, "%Y"))
tri <- (as.integer(format(fecha, "%m")) - 1) %/% 3 + 1
per <- paste0(anio, "-T", tri)
stopifnot(nrow(n) >= 80, nrow(n) == nrow(v), !anyNA(n), !anyNA(v),
all(n > 0), all(v > 0), all(pib_n > 0), all(fbk_n > 0))
86observaciones trimestrales
2005-T1 a 2026-T2período observado
3 sectores19 actividades económicas
Cuadro 1. Fuentes y cobertura de los archivos recibidos
|
Archivo
|
Cobertura
|
Uso
|
|
PIB nominal trimestral
|
2005 I a 2026 II
|
Estructura e inversión
|
|
PIB en volumen trimestral
|
2005 I a 2026 II
|
Crecimientos y HP
|
|
PIB anual nominal y en volumen
|
2005 a 2025
|
Validación y referencia 2014
|
|
IPC
|
2025 I a 2026 X
|
Referencia; no se usa como deflactor histórico
|
Se respeta el primer dato disponible de los archivos recibidos. La
muestra de 86 trimestres supera el mínimo de 80 antes de transformar las
series. Las notas de los archivos identifican 2024 como preliminar y
2025–2026 como estimado. No se proyectan trimestres faltantes de 2026 ni
se presenta el primer semestre como un año completo.
Paso 2 Definir los
tres sectores
La clasificación es una agrupación operativa del estudio:
agropecuario (A), industria y construcción (B–F) y servicios (G–S). La
minería se ubica explícitamente en el segundo grupo. La letra S
trimestral ya incorpora T, actividades de los hogares como empleadores,
en toda la serie; no se agrega de nuevo.
cod <- LETTERS[1:19]
act <- c("Agricultura, ganadería, silvicultura y pesca", "Explotación de minas y canteras",
"Industrias manufactureras", "Electricidad, gas, vapor y aire acondicionado",
"Agua, alcantarillados y gestión de desechos", "Construcción",
"Comercio y reparación de vehículos", "Transporte y almacenamiento",
"Alojamiento y servicio de comidas", "Información y comunicaciones",
"Actividades financieras y de seguros", "Actividades inmobiliarias",
"Actividades profesionales, científicas y técnicas", "Servicios administrativos y de apoyo",
"Administración pública, defensa y seguridad social", "Enseñanza",
"Salud humana y asistencia social", "Arte, entretenimiento y recreación",
"Otros servicios, incluidos hogares como empleadores")
grupo <- c(1, rep(2, 5), rep(3, 13))
nom_sec <- c("Sector 1", "Sector 2", "Sector 3")
tabla(data.frame(Sector=paste("Sector",grupo), Código=cod, Actividad=act),
"Cuadro 2. Correspondencia de actividades y sectores")
Cuadro 2. Correspondencia de actividades y sectores
|
Sector
|
Código
|
Actividad
|
|
Sector 1
|
A
|
Agricultura, ganadería, silvicultura y pesca
|
|
Sector 2
|
B
|
Explotación de minas y canteras
|
|
Sector 2
|
C
|
Industrias manufactureras
|
|
Sector 2
|
D
|
Electricidad, gas, vapor y aire acondicionado
|
|
Sector 2
|
E
|
Agua, alcantarillados y gestión de desechos
|
|
Sector 2
|
F
|
Construcción
|
|
Sector 3
|
G
|
Comercio y reparación de vehículos
|
|
Sector 3
|
H
|
Transporte y almacenamiento
|
|
Sector 3
|
I
|
Alojamiento y servicio de comidas
|
|
Sector 3
|
J
|
Información y comunicaciones
|
|
Sector 3
|
K
|
Actividades financieras y de seguros
|
|
Sector 3
|
L
|
Actividades inmobiliarias
|
|
Sector 3
|
M
|
Actividades profesionales, científicas y técnicas
|
|
Sector 3
|
N
|
Servicios administrativos y de apoyo
|
|
Sector 3
|
O
|
Administración pública, defensa y seguridad social
|
|
Sector 3
|
P
|
Enseñanza
|
|
Sector 3
|
Q
|
Salud humana y asistencia social
|
|
Sector 3
|
R
|
Arte, entretenimiento y recreación
|
|
Sector 3
|
S
|
Otros servicios, incluidos hogares como empleadores
|
El PIB, los impuestos netos y la FBKF son agregados, no actividades
adicionales. Las participaciones se calculan sobre valor agregado,
excluyendo impuestos netos sobre productos. Antes del ajuste se verifica
que la suma de las actividades coincida con el valor agregado publicado,
admitiendo el redondeo de centésimas de millón.
Paso 3 Deflactar y
desestacionalizar
El índice de volumen del PIB se convierte en una medida monetaria
referenciada a 2014 usando la cuarta parte del PIB nominal anual de
2014, porque los índices trimestrales promedian 100 en ese año:
El último cociente es una aproximación con deflactor
común, usada para mostrar la transformación de los niveles
nominales. El crecimiento sectorial de Lilien se obtiene de los índices
oficiales de volumen de cada actividad y no de esa aproximación. Las
participaciones y la inversión usan valores nominales en numerador y
denominador, por definición.
Se aplica STL al logaritmo de cada serie positiva, con estacionalidad
periódica y ajuste robusto. La serie ajustada es la exponencial del
logaritmo menos su componente estacional. Se conservan las 86
observaciones. El ajuste es propio y puede diferir del publicado por el
BCR.
# Referencia monetaria y deflactor implícito del PIB.
ref <- as.numeric(ann[30, which(fila(ann, 4) == 2014) + 1]) / 4
pib_r <- ref * pib_v / 100
def <- 100 * pib_n / pib_r
va_r <- n / (def / 100)
# Ajuste STL de una serie positiva.
aj <- function(x) {
z <- ts(log(x), start = c(ini, 1), frequency = 4)
est <- stl(z, s.window = "periodic", robust = TRUE)
as.numeric(exp(z - est$time.series[, "seasonal"]))
}
ns <- apply(n, 2, aj)
vs <- apply(v, 2, aj)
pib <- aj(pib_v)
pn <- aj(pib_n)
fbk <- aj(fbk_n)
# El ajuste indirecto preserva la suma de los tres sectores.
va <- cbind(ns[,1], rowSums(ns[,2:6]), rowSums(ns[,7:19]))
colnames(va) <- nom_sec
part <- 100 * va / rowSums(va)
s1 <- part[,1]; s2 <- part[,2]; s3 <- part[,3]
stopifnot(max(abs(rowSums(part) - 100)) < 1e-8)
err_va <- max(abs(rowSums(n) - vab_n))
La diferencia máxima entre la suma de las ramas nominales originales
y el valor agregado publicado es 0.030 millones de
dólares. Las pequeñas diferencias son compatibles con el
redondeo. La suma de participaciones de los tres sectores ajustados es
100 % por construcción.
Paso 4 Construir los
indicadores
Cuadro 3. Definición de los seis indicadores; frecuencia trimestral
|
Indicador
|
Fórmula
|
Unidad
|
Fuente
|
|
Crecimiento del PIB real
|
100 × Δ ln PIB real ajustado
|
% trimestral logarítmico
|
BCR volumen
|
|
Participación sectorial
|
100 × VA sectorial / VA total ajustado
|
% del valor agregado
|
BCR nominal
|
|
Tasa de inversión
|
100 × FBKF nominal ajustada / PIB nominal ajustado
|
% del PIB
|
BCR nominal
|
|
Concentración HHI
|
Suma de (participación/100)²
|
Índice entre 1/3 y 1
|
Participaciones
|
|
NAV
|
0.5 × suma de |s(t) − s(t−k)|
|
Puntos porcentuales
|
Participaciones
|
|
Lilien
|
Raíz de suma de (s/100) × (g sectorial − g PIB)²
|
Puntos porcentuales de dispersión
|
BCR volumen y nominal
|
El crecimiento principal compara un trimestre con el inmediato
anterior, después del ajuste estacional. No es una tasa interanual ni
anualizada. NAV se calcula con k = 4 trimestres, un
horizonte de un año que deja 82 observaciones. Se conserva k = 20 (cinco
años) como sensibilidad, con 66 observaciones; no se afirma que esa
variante alcance por sí sola el mínimo de 80.
Con
,
las expresiones de los indicadores son:
El superíndice SA identifica las series ajustadas por estacionalidad;
n indica precios corrientes y r volumen real.
Los índices de volumen encadenados no se suman directamente. Para el
crecimiento de los tres sectores se utiliza una agregación
propia de tipo Törnqvist: promedio de las participaciones
nominales internas de dos trimestres consecutivos, multiplicado por los
crecimientos logarítmicos de las actividades. Es una aproximación
superlativa para estos grupos y no una serie agregada oficial del
BCR.
g <- c(NA, 100 * diff(log(pib)))
inv <- 100 * fbk / pn
hhi <- rowSums((part / 100)^2)
# Cambios de las participaciones a k trimestres.
cambio <- function(s, k) {
rbind(matrix(NA, k, ncol(s)), abs(s[(k+1):nrow(s), ] - s[1:(nrow(s)-k), ]))
}
u <- cambio(part, 4)
nav <- rowSums(u) / 2
nav5 <- rowSums(cambio(part, 20)) / 2
# Crecimiento real de las actividades y de los tres sectores.
gi <- apply(log(vs), 2, function(x) c(NA, 100 * diff(x)))
gs <- matrix(NA, nrow(n), 3)
for (j in 1:3) {
w <- ns[, grupo == j, drop = FALSE]
w <- w / rowSums(w)
wm <- (w[-1, , drop=FALSE] + w[-nrow(w), , drop=FALSE]) / 2
gs[-1,j] <- rowSums(wm * gi[-1, grupo == j, drop=FALSE])
}
colnames(gs) <- nom_sec
lil <- sqrt(rowSums((part / 100) * (gs - g)^2))
w19 <- ns / rowSums(ns)
lil19 <- sqrt(rowSums(w19 * (gi - g)^2))
d <- data.frame(fecha, per, anio, tri, pib, g, s1, s2, s3, inv, hhi, nav, nav5, lil)
d$g1 <- gs[,1]; d$g2 <- gs[,2]; d$g3 <- gs[,3]
NAV mide la magnitud de la reasignación productiva, no su
conveniencia. Lilien mide dispersión entre los crecimientos productivos:
no demuestra movilidad efectiva del empleo. HHI depende del número de
grupos; con tres sectores su mínimo es 1/3, por lo que no debe
compararse directamente con un HHI de 19 actividades.
Paso 5 Comparar
ponderaciones
NAV y Lilien conservan sus fórmulas específicas. Para cubrir el
procedimiento general de estandarización y pesos de la consigna, se
añade un índice auxiliar de intensidad del cambio,
construido con los tres cambios absolutos que forman NAV. No sustituye
ni se presenta como el NAV original.
Se estandarizan los componentes en la misma muestra de 82 trimestres.
Todos llevan signo positivo porque aumentos indican más intensidad, no
mayor bienestar. El caso base usa pesos 1/3. La variante PCA utiliza el
cuadrado de las cargas del primer componente, normalizado para que los
pesos sumen uno. Los pesos reflejan covariación estadística y no
importancia causal.
donde
,
es la desviación estándar muestral y
es la carga del primer componente principal. El reescalamiento 0–100 se
aplica por separado a cada versión para facilitar la comparación
gráfica.
ok <- complete.cases(u)
z <- scale(u[ok, ])
pc <- prcomp(z, center = FALSE, scale. = FALSE)
pesos <- pc$rotation[,1]^2 / sum(pc$rotation[,1]^2)
ic1 <- rowMeans(z)
ic2 <- as.numeric(z %*% pesos)
reesc <- function(x) 100 * (x - min(x)) / (max(x) - min(x))
rob <- data.frame(fecha = fecha[ok], Igual = reesc(ic1), PCA = reesc(ic2))
rho <- cor(ic1, ic2)
exp_pc <- 100 * pc$sdev[1]^2 / sum(pc$sdev^2)
# Función pequeña para graficar varias columnas con una leyenda común.
larga <- function(x, fechas, nombres = colnames(x)) {
data.frame(fecha = rep(fechas, ncol(x)),
serie = rep(nombres, each = nrow(x)), valor = as.vector(as.matrix(x)))
}
Paso 6 Especificar
las pruebas y los quiebres
Las pruebas ADF, KPSS y Zivot-Andrews se aplican a tres series
centrales: logaritmo del PIB ajustado, NAV y Lilien. Se examinan niveles
y primeras diferencias. ADF utiliza un máximo de cuatro rezagos y
selección BIC; KPSS usa corrección corta de autocorrelación.
Zivot-Andrews usa el número de rezagos elegido para ADF y permite un
quiebre endógeno. El logaritmo del PIB incluye tendencia; los índices se
modelan con constante. Para sus primeras diferencias se usa
constante.
La nula de ADF y Zivot-Andrews es raíz unitaria; la nula de KPSS es
estacionariedad respecto de la parte determinística especificada. Se
informa la decisión al 5 % con estadísticos y valores críticos.
Resultados contradictorios se reconocen, sin asignar automáticamente un
orden de integración.
raiz <- function(x, fechas, nombre, tendencia = FALSE, dif = FALSE) {
buen <- is.finite(x)
x <- x[buen]; fechas <- fechas[buen]
if (dif) { x <- diff(x); fechas <- fechas[-1]; tendencia <- FALSE }
a <- ur.df(x, type = if (tendencia) "trend" else "drift", lags = 4, selectlags = "BIC")
k <- ur.kpss(x, type = if (tendencia) "tau" else "mu", lags = "short")
rez <- sum(grepl("z.diff.lag", rownames(a@testreg$coefficients), fixed = TRUE))
za <- ur.za(x, model = if (tendencia) "both" else "intercept", lag = rez)
est <- c(a@teststat[1,1], k@teststat, za@teststat)
crit <- c(a@cval[1,"5pct"], k@cval[1,"5pct"], za@cval[2])
rechazo <- c(est[1] < crit[1], est[2] > crit[2], est[3] < crit[3])
q <- paste0(format(fechas[za@bpoint], "%Y"), "-T", (as.integer(format(fechas[za@bpoint], "%m"))-1)%/%3+1)
data.frame(Serie = nombre, Forma = if (dif) "Diferencia" else "Nivel",
Prueba = c("ADF", "KPSS", "Zivot-Andrews"), N = length(x),
Modelo = c(if (tendencia) "Constante y tendencia" else "Constante",
if (tendencia) "Tendencia" else "Nivel", if(tendencia) "Ambos" else "Intercepto"),
Rezagos = c(rez, k@lag, rez), Estadístico = est, Crítico_5 = crit,
Rechaza_nula = ifelse(rechazo, "Sí", "No"),
Quiebre = c("", "", q))
}
series <- list("ln PIB" = log(pib), "NAV" = nav, "Lilien" = lil)
test <- do.call(rbind, lapply(names(series), function(nombre) {
rbind(raiz(series[[nombre]], fecha, nombre, nombre == "ln PIB"),
raiz(series[[nombre]], fecha, nombre, nombre == "ln PIB", dif = TRUE))
}))
El índice principal para fechar quiebres es NAV a cuatro trimestres.
Se estima un modelo de cambios de media, NAV = media de cada régimen +
error, mediante el algoritmo Bai–Perron de breakpoints. Se
busca entre cero y tres quiebres, con segmentos mínimos del 15 % de la
muestra y selección BIC. El máximo de tres es un límite de parsimonia,
no una imposición de los tres hitos.
Se añade una prueba de estabilidad supF con covarianza Newey–West
(cuatro rezagos). Su p-valor corresponde a estabilidad, no es un
p-valor individual de cada fecha elegida por BIC. NAV tiene
ventanas solapadas, por lo que se reporta autocorrelación residual y una
sensibilidad que permite dinámica AR(1). Los intervalos de las fechas
son aproximaciones asintóticas y no recogen toda la incertidumbre de
selección.
b <- d[is.finite(d$nav), c("fecha", "per", "nav")]
bp <- breakpoints(nav ~ 1, data = b, h = 0.15, breaks = 3)
bic <- as.numeric(BIC(bp))
m <- which.min(bic) - 1
cortes <- if (m > 0) breakpoints(bp, breaks = m)$breakpoints else integer(0)
b$reg <- factor(findInterval(seq_len(nrow(b)), cortes) + 1)
fit <- if (m > 0) lm(nav ~ reg, data = b) else lm(nav ~ 1, data = b)
b$media <- fitted(fit)
nw <- function(modelo) NeweyWest(modelo, lag = 4, prewhite = FALSE, adjust = TRUE)
fs <- Fstats(nav ~ 1, data = b, from = 0.15, vcov. = nw)
sup <- sctest(fs, type = "supF")
lb <- Box.test(residuals(fit), lag = 8, type = "Ljung-Box")
ci <- if (m > 0) confint(bp, breaks = m, vcov. = nw)$confint else matrix(numeric(0), 0, 3)
# Sensibilidad con dinámica AR(1).
b$ar <- c(NA, head(b$nav, -1))
ba <- b[-1, ]
bpa <- breakpoints(nav ~ ar, data = ba, h = 0.15, breaks = 3)
ma <- which.min(as.numeric(BIC(bpa))) - 1
ca <- if (ma > 0) breakpoints(bpa, breaks = ma)$breakpoints else integer(0)
# Contrastes adicionales de cambio de media en fechas fijadas previamente.
hitos <- as.Date(c("2008-10-01", "2009-01-01", "2020-04-01"))
hist <- do.call(rbind, lapply(hitos, function(f) {
b$pos <- as.integer(b$fecha >= f)
fm <- lm(nav ~ pos, data = b)
ct <- coeftest(fm, vcov. = nw)
data.frame(Fecha = format(f, "%Y-%m-%d"), Antes = sum(b$pos == 0), Después = sum(b$pos == 1),
Cambio = ct["pos",1], p_HAC = ct["pos",4])
}))
hist$p_Holm <- p.adjust(hist$p_HAC, method = "holm")
Paso 7 Estimar el
producto potencial
El filtro HP se aplica al logaritmo del PIB real ajustado con
λ = 1,600. Se define
y la brecha como
.
El potencial es una aproximación estadística, no una medición de
capacidad basada en capital y trabajo. En los gráficos se expresa como
índice con referencia 2014 y se reconoce la sensibilidad al extremo
final.
hp <- hpfilter(ts(log(pib), start = c(ini,1), frequency = 4), freq = 1600, type = "lambda")
pot <- as.numeric(exp(hp$trend))
gap <- 100 * (pib / pot - 1)
d$pot <- pot; d$gap <- gap
Resultados
Estructura de largo
plazo
Cuadro 4. Participación media: 2005-T1–2005-T4 frente a 2025-T3–2026-T2
|
Sector
|
Inicio
|
Final
|
Cambio_pp
|
|
Sector 1
|
6.70
|
4.83
|
-1.87
|
|
Sector 2
|
26.88
|
28.16
|
1.28
|
|
Sector 3
|
66.42
|
67.01
|
0.59
|
La participación agropecuaria pasa de 6.70 % a
4.83 %, una variación de -1.87 puntos
porcentuales. Los servicios representan 67.01
% en las últimas cuatro observaciones. Esta comparación utiliza
ventanas de cuatro trimestres ajustados y no atribuye las diferencias a
un único acontecimiento.
ggplot(larga(part, fecha), aes(fecha, valor, color = serie)) +
geom_line(linewidth = 0.85) + scale_color_manual(values = col) +
labs(title = "El peso de los tres sectores", x = NULL, y = "% del valor agregado", caption = fuente)
Crecimiento real e
inversión
ggplot(d, aes(fecha, g)) + geom_hline(yintercept=0, color="#b6a8a0") +
geom_col(fill="#762440", width=65) +
labs(title="Crecimiento real y persistencia de los choques", x=NULL,
y="% respecto del trimestre anterior", caption=fuente)
ggplot(d, aes(fecha, inv)) + geom_line(color="#246779", linewidth=0.9) +
labs(title="Acumulación de capital fijo", x=NULL, y="FBKF / PIB (%)", caption=fuente)
La tasa de inversión media es 16.28 % al inicio y
27.87 % al final. La tasa mide la proporción destinada
a capital fijo, pero no su eficiencia, utilización, composición
tecnológica ni aporte causal al crecimiento.
Concentración, NAV y
Lilien
ggplot(d, aes(fecha, hhi)) + geom_line(color="#b77b26", linewidth=0.9) +
labs(title="Concentración de la estructura productiva", x=NULL, y="HHI (tres sectores)", caption=fuente)
El HHI promedio cambia de 0.518 a
0.531. El aumento describe mayor concentración entre
los tres grandes grupos. Este indicador puede ocultar diversificación
dentro de cada grupo y no mide concentración empresarial.
ind <- data.frame(fecha=rep(fecha,2), serie=rep(c("NAV a un año", "Lilien de producción"),each=nrow(d)), valor=c(nav,lil))
ggplot(ind, aes(fecha,valor)) + geom_line(color="#762440", linewidth=0.85) +
facet_wrap(~serie, ncol=1, scales="free_y") +
labs(title="Dos dimensiones del cambio estructural", x=NULL, y="Puntos porcentuales", caption=fuente)
El máximo de NAV es 4.95 puntos, en
2020-T2. El máximo de Lilien es 10.30,
en 2020-T2. Son indicadores de magnitud y dispersión,
no de bienestar ni de reasignación observada de trabajadores.
Robustez de las
ponderaciones y de la agregación
Cuadro 5. Pesos del índice auxiliar de intensidad
|
Sector
|
Iguales
|
PCA
|
|
Sector 1
|
0.3333
|
0.1746
|
|
Sector 2
|
0.3333
|
0.3735
|
|
Sector 3
|
0.3333
|
0.4518
|
La correlación de las dos versiones auxiliares es
0.9821, con la misma muestra de 82
trimestres. El primer componente explica 68.82
% de la varianza estandarizada. Una correlación alta indica
semejanza temporal; no valida causalidad ni sustituye los índices
específicos.
ggplot(larga(as.matrix(rob[,2:3]), rob$fecha, c("Pesos iguales","Pesos PCA")),
aes(fecha,valor,color=serie)) + geom_line(linewidth=0.9) +
scale_color_manual(values=c("Pesos iguales"="#762440","Pesos PCA"="#b77b26")) +
labs(title="Sensibilidad a las ponderaciones", x=NULL, y="Escala 0–100", caption=fuente)
Cuadro 6. Robustez sobre muestras comunes
|
Comparación
|
N
|
Correlación
|
|
NAV a 4 y 20 trimestres
|
66
|
0.4182
|
|
Lilien con 3 grupos y 19 actividades
|
85
|
0.8340
|
|
Auxiliar con pesos iguales y PCA
|
82
|
0.9821
|
La sensibilidad de NAV cambia el horizonte económico y la de Lilien
cambia la desagregación, por lo que no deben interpretarse como
versiones idénticas con distintos pesos. Con tres sectores pueden
compensarse movimientos internos que sí aparecen con 19 actividades.
La correlación de 0.4182 entre los dos horizontes de
NAV muestra que el diagnóstico de corto y mediano plazo depende del
período de comparación. Por su parte, la correlación de
0.8340 entre Lilien de tres y 19 actividades indica
semejanza parcial, con información interna que se pierde al agrupar. La
coincidencia de los pesos auxiliares, por tanto, no elimina la
sensibilidad al horizonte o a la clasificación.
Raíz unitaria y
persistencia
Cuadro 7. Pruebas en niveles; decisiones al 5 %
|
Serie
|
Prueba
|
N
|
Modelo
|
Rezagos
|
Estadístico
|
Crítico_5
|
Rechaza_nula
|
Quiebre
|
|
ln PIB
|
ADF
|
86
|
Constante y tendencia
|
1
|
-4.097
|
-3.450
|
Sí
|
|
|
ln PIB
|
KPSS
|
86
|
Tendencia
|
3
|
0.147
|
0.146
|
Sí
|
|
|
ln PIB
|
Zivot-Andrews
|
86
|
Ambos
|
1
|
-7.049
|
-5.080
|
Sí
|
2020-T1
|
|
NAV
|
ADF
|
82
|
Constante
|
3
|
-2.967
|
-2.890
|
Sí
|
|
|
NAV
|
KPSS
|
82
|
Nivel
|
3
|
0.285
|
0.463
|
No
|
|
|
NAV
|
Zivot-Andrews
|
82
|
Intercepto
|
3
|
-4.615
|
-4.800
|
No
|
2019-T4
|
|
Lilien
|
ADF
|
85
|
Constante
|
1
|
-5.434
|
-2.890
|
Sí
|
|
|
Lilien
|
KPSS
|
85
|
Nivel
|
3
|
0.163
|
0.463
|
No
|
|
|
Lilien
|
Zivot-Andrews
|
85
|
Intercepto
|
1
|
-5.957
|
-4.800
|
Sí
|
2020-T1
|
Lectura del cuadro. En ADF y Zivot-Andrews, rechazar
la nula favorece estacionariedad bajo el modelo especificado. En KPSS,
rechazar cuestiona la estacionariedad. La fecha de Zivot-Andrews es un
candidato endógeno del contraste de raíz unitaria y no equivale al
fechado de Bai–Perron. Las primeras diferencias y los resultados
completos se conservan en el anexo.
En esta ejecución, el logaritmo del PIB presenta evidencia
mixta: ADF rechaza raíz unitaria, mientras KPSS rechaza
estacionariedad alrededor de una tendencia lineal por un margen pequeño
(0.147 frente a 0.146). Zivot-Andrews rechaza raíz unitaria permitiendo
un quiebre en 2020 I. No se asigna automáticamente un orden de
integración al PIB a partir de un solo contraste.
Para NAV, ADF y KPSS son compatibles con
estacionariedad en nivel al 5 %, pero Zivot-Andrews no rechaza raíz
unitaria. La cercanía del ADF a su valor crítico y la discrepancia entre
pruebas aconsejan cautela. En Lilien, las tres pruebas
son compatibles con estacionariedad bajo sus especificaciones. Un índice
estacionario puede presentar episodios de elevada dispersión sin que
estos constituyan una nueva tendencia permanente.
Quiebres del índice
principal
Cuadro 8. Selección del número de quiebres del NAV
|
Quiebres
|
BIC
|
|
0
|
215.52
|
Cuadro 9. Resultado del fechado
|
Resultado
|
|
BIC selecciona cero quiebres en el modelo de medias
|
Cuadro 10. Estabilidad y diagnóstico
|
Prueba
|
Estadístico
|
p_valor
|
|
supF con covarianza HAC
|
7.0031
|
0.1047
|
|
Ljung-Box de residuos, 8 rezagos
|
17.5709
|
0.0247
|
BIC selecciona 0 quiebre(s). La prueba supF arroja
p = 0.1047: no se rechaza la estabilidad al 5 % bajo
este contraste. La fecha que marca breakpoints es la última
observación del régimen anterior; el cuadro también muestra la primera
del siguiente.
En la muestra recibida, la selección de cero quiebres significa que
no se identifican cambios persistentes de la media de NAV con
este modelo y criterio. No significa que las participaciones
sectoriales permanezcan constantes ni que las crisis carezcan de
efectos. La curva del índice puede registrar movimientos fuertes y
temporales dentro de un mismo régimen de media.
ggplot(b,aes(fecha,nav)) + geom_line(color="#762440",linewidth=0.75) +
geom_step(aes(y=media),color="#b77b26",linewidth=1) +
geom_vline(xintercept=as.numeric(b$fecha[cortes]),linetype="dashed",color="#526274") +
labs(title="Estabilidad de la intensidad del cambio",x=NULL,y="NAV a cuatro trimestres",caption=fuente)
La variante AR(1) selecciona 0 quiebre(s), con fines
de régimen en ninguno. El diagnóstico detecta
autocorrelación residual: las ventanas superpuestas y la dinámica del
índice limitan la precisión del modelo de medias. Se interpreta el
fechado junto con la sensibilidad AR(1), sin tratar cada fecha como una
certeza.
Cuadro 11. Cambio de media del NAV en fechas históricas prefijadas;
errores HAC y ajuste Holm
|
Fecha
|
Antes
|
Después
|
Cambio
|
p_HAC
|
p_Holm
|
|
2008-10-01
|
11
|
71
|
-0.2100
|
0.4058
|
1
|
|
2009-01-01
|
12
|
70
|
-0.1025
|
0.6168
|
1
|
|
2020-04-01
|
57
|
25
|
0.0514
|
0.8474
|
1
|
Estos contrastes comparan medias anteriores y posteriores a cada
fecha; no son estimaciones causales ni pruebas de un efecto transitorio
de un solo trimestre. Para 2001 se informa no estimable: fuera
de la muestra. Los contrastes de 2008 IV y 2009 I representan
dos puntos prefijados de la misma crisis; Holm corrige los tres
contrastes de este cuadro.
Los tres contrastes prefijados no rechazan igualdad de medias
al 5 %, incluso antes de la corrección múltiple. Esto es
compatible con un choque intenso pero transitorio en 2020 II, trimestre
en que se observan los máximos de NAV y Lilien y la menor brecha HP. La
falta de rechazo no demuestra igualdad exacta de los regímenes.
Producto potencial y
brecha
ggplot(larga(cbind(Observado=pib, Potencial=pot),fecha),aes(fecha,valor,color=serie)) +
geom_line(linewidth=0.9) + scale_color_manual(values=c("Observado"="#762440","Potencial"="#b77b26")) +
labs(title="Producción observada y tendencia de largo plazo",x=NULL,y="Índice de volumen",caption=fuente)
ggplot(d,aes(fecha,gap)) + geom_hline(yintercept=0,color="#918077") +
geom_col(aes(fill=gap>=0),width=65,show.legend=FALSE) +
scale_fill_manual(values=c("FALSE"="#762440","TRUE"="#246779")) +
labs(title="Desviaciones respecto de la tendencia",x=NULL,y="Brecha del producto (%)",caption=fuente)
La menor brecha se ubica en 2020-T2, con
-20.08 %. La última es 1.15 %. Una
brecha positiva significa producción por encima de la tendencia
estimada; una negativa, por debajo. El dato final es especialmente
sensible a nuevas observaciones y revisiones, y no constituye una medida
exacta de holgura ni un pronóstico.
Discusión y
conclusiones
Qué cambió en la
estructura
El contraste descriptivo de la hipótesis es compatible con una menor
participación agropecuaria y con el predominio de los servicios en la
ventana final. La comparación de extremos no implica que el cambio haya
sido uniforme. La trayectoria completa y NAV permiten identificar
episodios de avance y reversión.
La participación se mide a precios corrientes. Por eso combina
cambios de cantidades y precios relativos, y no identifica por sí sola
una transferencia física de recursos. Los crecimientos de volumen y
Lilien aportan otra perspectiva. La desagregación de tres sectores
facilita comunicar el patrón general, pero agrupa actividades con
productividades y tecnologías distintas.
Cómo interpretar los
choques y la persistencia
La crisis de 2008–2009 y la pandemia se contrastan con fechas
prefijadas y con un fechado endógeno. La coincidencia de un episodio
elevado de NAV o Lilien con una crisis es evidencia descriptiva de
heterogeneidad o reasignación, no una identificación causal. Un choque
transitorio puede elevar la dispersión sin constituir un nuevo régimen
permanente. Por esta razón se consideran BIC, supF, autocorrelación y
sensibilidad AR(1) conjuntamente.
En concreto, el episodio de 2020 II destaca en dispersión y brecha,
pero BIC selecciona cero quiebres de media tanto en el modelo básico
como en la sensibilidad AR(1); supF tampoco rechaza al 5 %. Hay
evidencia descriptiva de un choque excepcional, junto con evidencia
insuficiente de un cambio permanente en la media de NAV. La
autocorrelación residual detectada limita la precisión del modelo básico
y forma parte de esta interpretación.
La dolarización de 2001 no puede evaluarse estadísticamente: no hay
observaciones previas ni del propio año en estos archivos. No detectar
ese hito en una muestra posterior no demuestra ausencia de efectos.
Tampoco se atribuyen los quiebres posteriores a la dolarización sin una
estrategia adicional de identificación.
Qué aporta la
inversión
La inversión media es mayor en las últimas cuatro observaciones que
en las primeras. Esto describe una modificación de la composición del
gasto. La simultaneidad entre inversión y expansión productiva no
permite establecer dirección causal ni afirmar que aumentó la
productividad del capital. La FBKF es distinta de la formación bruta de
capital total; los inventarios recientes están en revisión y no se
utilizan en el numerador.
Límites de las
conclusiones
El análisis utiliza archivos con cifras recientes preliminares o
estimadas, un ajuste estacional propio y aproximaciones de agregación.
Las pruebas tienen incertidumbre de muestra, elección de rezagos,
segmentos y especificación. La alta correlación entre pesos no asegura
robustez a cualquier indicador o clasificación. La brecha HP es sensible
al extremo de la muestra. Finalmente, el estudio no mide productividad
laboral ni ejecuta shift-share: esos componentes quedan fuera por la
exclusión acordada del empleo.
Conclusión principal. Entre las ventanas inicial y
final, la participación agropecuaria disminuye de 6.70 % a 4.83
%, los servicios conservan el mayor peso y la inversión pasa de
16.28 % a 27.87 % del PIB. El HHI de tres grupos
aumenta de 0.518 a 0.531; por tanto, el cambio
observado no equivale a una distribución más equilibrada entre estos
tres grupos. La crisis de 2020 produce el episodio más intenso de
dispersión, mientras las pruebas aplicadas no identifican cambios
persistentes de la media de NAV al 5 %. Sin empleo sectorial, estos
resultados no permiten concluir que la reasignación elevó o redujo la
productividad laboral.
LS0tDQp0aXRsZTogIkNhbWJpbyBlc3RydWN0dXJhbCB5IGNyZWNpbWllbnRvIGRlIEVsIFNhbHZhZG9yIg0Kc3VidGl0bGU6ICJUcmVzIHNlY3RvcmVzIHByb2R1Y3Rpdm9zIGVudHJlIDIwMDUgSSB5IDIwMjYgSUkiDQphdXRob3I6ICJTYW50b3MgSXNhYWMgUm9kcsOtZ3VleiBDbGFyb3MiDQpkYXRlOiAiMjYgZGUgbm92aWVtYnJlIGRlIDIwMjYiDQpsYW5nOiBlcw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICB0b2NfZGVwdGg6IDINCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBtYXRoX21ldGhvZDogbWF0aG1sDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KLS0tDQoNCmBgYHtyIGluaWNpbywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh1cmNhKQ0KbGlicmFyeShzdHJ1Y2NoYW5nZSkNCmxpYnJhcnkobUZpbHRlcikNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkoa25pdHIpDQpvcHRpb25zKHNjaXBlbiA9IDgsIGRpZ2l0cyA9IDUsIHdpZHRoID0gMTAwKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA5LCBmaWcuaGVpZ2h0ID0gNC42LCBkcGkgPSAxNDUsDQogICAgICAgICAgICAgICAgICAgICAgZGV2ID0gInBuZyIsIG91dC53aWR0aCA9ICIxMDAlIikNCmNvbCA8LSBjKCJTZWN0b3IgMSIgPSAiIzhhMjQ0OSIsICJTZWN0b3IgMiIgPSAiI2I3N2IyNiIsICJTZWN0b3IgMyIgPSAiIzI0Njc3OSIpDQp0ZW1hIDwtIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMjEzNTQ3IiksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzUyNjI3NCIsIHNpemUgPSAxMCksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSA4LCBjb2xvciA9ICIjNTI2Mjc0IiksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQp0aGVtZV9zZXQodGVtYSkNCmZ1ZW50ZSA8LSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGNvbiBsb3MgYXJjaGl2b3MgQkNSIGZhY2lsaXRhZG9zIHBvciBlbCBlc3R1ZGlhbnRlLiBBanVzdGUgU1RMIHByb3Bpby4iDQpmbXQgPC0gZnVuY3Rpb24oeCwgZCA9IDIpIGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSBkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iKQ0KdGFibGEgPC0gZnVuY3Rpb24oeCwgdGl0dWxvLCBkID0gMykgew0KICBjYXQoJzxkaXYgY2xhc3M9InRhYmxlLXJlc3BvbnNpdmUiPicsDQogICAgICBrbml0cjo6a2FibGUoeCwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gdGl0dWxvLCBkaWdpdHMgPSBkLA0KICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCB0YWJsZS5hdHRyID0gJ2NsYXNzPSJ0YWJsZSInKSwNCiAgICAgICc8L2Rpdj5cbicpDQp9DQpgYGANCg0KPHN0eWxlPg0KOnJvb3R7LS12aW5vOiM3NjI0NDA7LS10aW50YTojMjEzNTQ3Oy0tc3VhdmU6I2Y3ZjNlZTstLWxpbmVhOiNkZWQ1Y2V9DQpib2R5e2ZvbnQtZmFtaWx5OiJTZWdvZSBVSSIsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjp2YXIoLS10aW50YSk7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MS43O2JhY2tncm91bmQ6I2ZmZmRmYn0NCi5tYWluLWNvbnRhaW5lcnttYXgtd2lkdGg6MTMyMHB4O21hcmdpbjphdXRvO3BhZGRpbmctdG9wOjI1cHg7cGFkZGluZy1ib3R0b206NzBweH0NCmgxLnRpdGxle2ZvbnQtZmFtaWx5Okdlb3JnaWEsc2VyaWY7Zm9udC1zaXplOjQzcHg7bGluZS1oZWlnaHQ6MS4xNTtjb2xvcjp2YXIoLS12aW5vKTtmb250LXdlaWdodDpib2xkO21hcmdpbi10b3A6MThweH0NCi5zdWJ0aXRsZXtmb250LXNpemU6MjJweDtjb2xvcjojNTU2NTc1O21hcmdpbi10b3A6MTRweCFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6NDAwfQ0KaDE6bm90KC50aXRsZSl7Zm9udC1mYW1pbHk6R2VvcmdpYSxzZXJpZjtjb2xvcjp2YXIoLS12aW5vKTtmb250LXNpemU6MzFweDttYXJnaW4tdG9wOjUwcHg7cGFkZGluZy10b3A6MTVweDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lYSl9DQpoMntjb2xvcjojMjEzNTQ3O2ZvbnQtc2l6ZToyNHB4O21hcmdpbi10b3A6MzJweDtsaW5lLWhlaWdodDoxLjN9aDN7Zm9udC1zaXplOjE5cHg7Y29sb3I6dmFyKC0tdmlubyl9DQpwe21hcmdpbi1ib3R0b206MTZweH1he2NvbG9yOnZhcigtLXZpbm8pfXN0cm9uZ3tjb2xvcjojMjkzODQ5fQ0KLmF1dGhvciwuZGF0ZXtmb250LXNpemU6MTVweDtjb2xvcjojNTk2NTczfS5pbnN0aXR1Y2lvbntmb250LXNpemU6MTRweDtjb2xvcjojNTI2Mjc0O21hcmdpbjoyMHB4IDAgMjRweH0NCi5yZXN1bWVue2ZvbnQtc2l6ZToxN3B4O2JhY2tncm91bmQ6dmFyKC0tc3VhdmUpO3BhZGRpbmc6MjRweCAyOHB4O2JvcmRlci1yYWRpdXM6OHB4O21hcmdpbjoyNHB4IDB9DQouZGF0b3MtY2xhdmV7ZGlzcGxheTpmbGV4O2dhcDoyMHB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbjoyNHB4IDAgMzBweH0uZGF0b3tmbGV4OjE7bWluLXdpZHRoOjE3MHB4O2JvcmRlci10b3A6M3B4IHNvbGlkIHZhcigtLXZpbm8pO3BhZGRpbmc6MTBweCAwfS5kYXRvIGJ7Zm9udC1mYW1pbHk6R2VvcmdpYSxzZXJpZjtmb250LXNpemU6MjlweDtkaXNwbGF5OmJsb2NrO2NvbG9yOnZhcigtLXZpbm8pfS5kYXRvIHNwYW57Zm9udC1zaXplOjEzcHg7Y29sb3I6IzUyNjI3NH0NCi50YWJsZXtmb250LXNpemU6MTRweDttYXJnaW46MjBweCAwIDI1cHh9LnRhYmxlIGNhcHRpb257Y29sb3I6IzIxMzU0Nztmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmctYm90dG9tOjEwcHh9DQoudGFibGU+dGhlYWQ+dHI+dGh7YmFja2dyb3VuZDojMjEzNTQ3O2NvbG9yOndoaXRlO2JvcmRlci1ib3R0b206bm9uZTtwYWRkaW5nOjExcHggMTJweH0udGFibGU+dGJvZHk+dHI6bnRoLWNoaWxkKGV2ZW4pe2JhY2tncm91bmQ6I2Y3ZjNlZX0udGFibGU+dGJvZHk+dHI+dGR7cGFkZGluZzoxMHB4IDEycHg7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICNlNGRlZDh9DQoudGFibGUtcmVzcG9uc2l2ZXtvdmVyZmxvdy14OmF1dG99cHJle2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTU7Ym9yZGVyOjFweCBzb2xpZCAjZGZkNmNmO2JhY2tncm91bmQ6I2ZhZjhmNTtib3JkZXItcmFkaXVzOjVweH1jb2Rle2NvbG9yOiM3NjI0NDA7YmFja2dyb3VuZDojZjhmMmYzfQ0KLmJ0bi1kZWZhdWx0e2JhY2tncm91bmQ6I2Y3ZjNlZTtib3JkZXItY29sb3I6I2RlZDVjZTtjb2xvcjojNzYyNDQwfS50b2NpZnl7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS40O2JvcmRlci1jb2xvcjojZTNkOWQwO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6I2ZmZmRmYn0udG9jaWZ5LWl0ZW0uYWN0aXZle2JhY2tncm91bmQ6Izc2MjQ0MCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnRvY2lmeSBsaXtwYWRkaW5nLXRvcDozcHg7cGFkZGluZy1ib3R0b206M3B4fS50b2NpZnktc3ViaGVhZGVye2ZvbnQtc2l6ZToxMnB4fQ0KLmNhcHRpb257Zm9udC1zaXplOjEzcHg7Y29sb3I6IzUyNjI3NDttYXJnaW4tdG9wOjhweH1ibG9ja3F1b3Rle2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjYjc3YjI2O2ZvbnQtc2l6ZToxNnB4O2JhY2tncm91bmQ6I2ZjZmFmNn0NCmRldGFpbHN7bWFyZ2luOjE4cHggMDtwYWRkaW5nOjE0cHggMThweDtib3JkZXI6MXB4IHNvbGlkICNlNWRkZDU7Ym9yZGVyLXJhZGl1czo2cHh9c3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Y29sb3I6Izc2MjQ0MH0NCm1hdGh7Zm9udC1zaXplOjEuMDdlbX1pbWd7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99aHJ7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tbGluZWEpfQ0KQG1lZGlhKG1heC13aWR0aDo3NjdweCl7aDEudGl0bGV7Zm9udC1zaXplOjMycHh9Lm1haW4tY29udGFpbmVye3BhZGRpbmc6MTVweH0ucmVzdW1lbntwYWRkaW5nOjE4cHh9LnRhYmxle2ZvbnQtc2l6ZToxMnB4fS5kYXRvcy1jbGF2ZXtnYXA6MTJweH19DQpAbWVkaWEgcHJpbnR7I1RPQywuY29kZS1mb2xkaW5nLWJ0biwuZHJvcGRvd257ZGlzcGxheTpub25lIWltcG9ydGFudH0uY29sLW1kLTl7d2lkdGg6MTAwJSFpbXBvcnRhbnR9Ym9keXtmb250LXNpemU6MTJweH0ubWFpbi1jb250YWluZXJ7bWF4LXdpZHRoOm5vbmV9aDE6bm90KC50aXRsZSl7YnJlYWstYmVmb3JlOmF1dG99LmZpZ3VyZSx0YWJsZXticmVhay1pbnNpZGU6YXZvaWR9fQ0KPC9zdHlsZT4NCg0KPGRpdiBjbGFzcz0iaW5zdGl0dWNpb24iPg0KVW5pdmVyc2lkYWQgZGUgRWwgU2FsdmFkb3IgwrcgRmFjdWx0YWQgTXVsdGlkaXNjaXBsaW5hcmlhIE9yaWVudGFsPGJyPg0KRGVwYXJ0YW1lbnRvIGRlIENpZW5jaWFzIEVjb27Ds21pY2FzIMK3IFNlY2Npw7NuIGRlIEVjb25vbcOtYTxicj4NCk3DqXRvZG9zIHBhcmEgZWwgQW7DoWxpc2lzIEVjb27Ds21pY28g4oCUIE1BRSAxMTggwrcgRXhhbWVuIHBhcmNpYWwgMw0KPC9kaXY+DQoNCiMgSW50cm9kdWNjacOzbg0KDQpFbCBjYW1iaW8gZGUgbGEgZXN0cnVjdHVyYSBwcm9kdWN0aXZhIHB1ZWRlIG9ic2VydmFyc2UgZW4gbGEgcGFydGljaXBhY2nDs24gZGUgbGFzIGFjdGl2aWRhZGVzIGVuIGVsIHZhbG9yIGFncmVnYWRvLCBlbiBsYSBjb25jZW50cmFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiB5IGVuIGxhIGRlc2lndWFsZGFkIGRlIGxvcyBjcmVjaW1pZW50b3Mgc2VjdG9yaWFsZXMuIFVuIGF1bWVudG8gZGVsIFBJQiBubyBwZXJtaXRlIGVzdGFibGVjZXIsIHBvciBzw60gc29sbywgc2kgbGEgZWNvbm9tw61hIHNlIGVzdMOhIGRpdmVyc2lmaWNhbmRvIG8gc2kgY2FtYmlhbiBsb3Mgc2VjdG9yZXMgcXVlIHNvc3RpZW5lbiBzdSBleHBhbnNpw7NuLiBJZGVudGlmaWNhciBlc3RhcyBkaWZlcmVuY2lhcyBlcyByZWxldmFudGUgcGFyYSBkaXNjdXRpciBsYSBkaXZlcnNpZmljYWNpw7NuIHkgbGEgdnVsbmVyYWJpbGlkYWQgZGUgbGEgZWNvbm9tw61hIHNhbHZhZG9yZcOxYS4NCg0KKipQcmVndW50YSBkZSBpbnZlc3RpZ2FjacOzbi4qKiDCv0PDs21vIGNhbWJpYXJvbiBsYSBlc3RydWN0dXJhIHByb2R1Y3RpdmEsIGxhIGNvbmNlbnRyYWNpw7NuIHkgbGEgaW52ZXJzacOzbiBkZSBFbCBTYWx2YWRvciBlbnRyZSAyMDA1IEkgeSAyMDI2IElJLCB5IHF1w6kgZXZpZGVuY2lhIGV4aXN0ZSBkZSBjYW1iaW9zIGRlIHLDqWdpbWVuIGFscmVkZWRvciBkZSBsYSBjcmlzaXMgZGUgMjAwOOKAkzIwMDkgeSBkZSBsYSBwYW5kZW1pYSBkZSAyMDIwPw0KDQoqKkhpcMOzdGVzaXMgZGUgdHJhYmFqby4qKiBMYSBwYXJ0aWNpcGFjacOzbiBkZWwgc2VjdG9yIGFncm9wZWN1YXJpbyBlbiBlbCB2YWxvciBhZ3JlZ2FkbyBkaXNtaW51ecOzIGVudHJlIGVsIGluaWNpbyB5IGVsIGZpbmFsIGRlIGxhIG11ZXN0cmEsIG1pZW50cmFzIGxvcyBzZXJ2aWNpb3MgY29uc2VydmFyb24gZWwgbWF5b3IgcGVzby4gU2UgY29udHJhc3RhIGRlc2NyaXB0aXZhbWVudGUgY29tcGFyYW5kbyBsb3MgcHJvbWVkaW9zIGRlIGxhcyBwcmltZXJhcyB5IGRlIGxhcyDDumx0aW1hcyBjdWF0cm8gb2JzZXJ2YWNpb25lcyBkZXNlc3RhY2lvbmFsaXphZGFzLiBMYXMgcHJ1ZWJhcyBkZSBxdWllYnJlcyBldmFsw7phbiBsYSBlc3RhYmlsaWRhZCBkZWwgw61uZGljZSBOQVYgeSBubyBzZSBpbnRlcnByZXRhbiBjb21vIHBydWViYXMgY2F1c2FsZXMgZGUgZXN0YSBoaXDDs3Rlc2lzLg0KDQoqKk9iamV0aXZvIGdlbmVyYWwuKiogQW5hbGl6YXIgbGEgdHJhbnNmb3JtYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmEgcHJvZHVjdGl2YSBzYWx2YWRvcmXDsWEgbWVkaWFudGUgY3VhdHJvIGluZGljYWRvcmVzIHNpbXBsZXMsIGxvcyDDrW5kaWNlcyBOQVYgeSBMaWxpZW4sIGVsIGZpbHRybyBIUCB5IHBydWViYXMgZGUgc2VyaWVzIGRlIHRpZW1wby4NCg0KKipBbGNhbmNlIGFjb3JkYWRvLioqIEVsIHRyYWJham8gdXRpbGl6YSBwcm9kdWNjacOzbiBlIGludmVyc2nDs24uIFNlIGV4Y2x1eWVuIGxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbCB5IGxhIGRlc2NvbXBvc2ljacOzbiBzaGlmdC1zaGFyZSBwb3JxdWUgbm8gc2UgaW5jb3Jwb3JhIGVtcGxlbyBzZWN0b3JpYWwuIEVzdGEgZXhjbHVzacOzbiBzZSBhcGFydGEgZGUgZXNvcyBkb3MgY29tcG9uZW50ZXMgZGVsIFRlbWEgMiBkZSBsYSBjb25zaWduYSBvcmlnaW5hbC4gTGEgZG9sYXJpemFjacOzbiBkZSAyMDAxIHNlIGluY2x1eWUgY29tbyBhbnRlY2VkZW50ZTsgc3UgcXVpZWJyZSBubyBlcyBlc3RpbWFibGUgY29uIHVuYSBtdWVzdHJhIHF1ZSBlbXBpZXphIGVuIDIwMDUuIEVzdGFzIHJlc3RyaWNjaW9uZXMgc2UgbWFudGllbmVuIHZpc2libGVzIGVuIGxhIGV2YWx1YWNpw7NuIGRlIGNvYmVydHVyYSBkZWwgYW5leG8uDQoNCiMgTWV0b2RvbG9nw61hDQoNCiMjIFBhc28gMSBDYXJnYXIgbG9zIGNpbmNvIGFyY2hpdm9zDQoNCkVsIGFyY2hpdm8gbm9taW5hbCB0cmltZXN0cmFsIChgbm9tYCkgeSBlbCBkZSB2b2x1bWVuIHRyaW1lc3RyYWwgKGB2b2xgKSBzb24gbGFzIGZ1ZW50ZXMgcHJpbmNpcGFsZXMuIExvcyBhbnVhbGVzIChgYW5uYCB5IGBhbnZgKSBzaXJ2ZW4gZGUgY29tcHJvYmFjacOzbi4gRWwgSVBDIChgaXBjYCkgc2UgY29uc2VydmEgY29tbyByZWZlcmVuY2lhOiBzdSBjb2JlcnR1cmEgMjAyNeKAkzIwMjYgbm8gcGVybWl0ZSBkZWZsYWN0YXIgdG9kYSBsYSBoaXN0b3JpYS4gU2UgdXRpbGl6YSBlbCBkZWZsYWN0b3IgaW1wbMOtY2l0byBkZWwgUElCLg0KDQpMYSBwcmltZXJhIHJ1dGEgZXMgbGEgcHJvcG9yY2lvbmFkYSBwb3IgZWwgZXN0dWRpYW50ZS4gU2kgbm8gZXhpc3RlLCBlbCBjw7NkaWdvIHV0aWxpemEgbGEgc3ViY2FycGV0YSBgZGF0b3NgIGluY2x1aWRhIGNvbiBlbCBwcm95ZWN0by4gTm8gZXMgbmVjZXNhcmlvIGNhbWJpYXIgbG9zIG5vbWJyZXMgb3JpZ2luYWxlcyBkZSBsb3MgRXhjZWwuIGBWaWV3KG5vbSlgIG8gYFZpZXcodm9sKWAgcHVlZGVuIGVqZWN1dGFyc2UgZW4gbGEgY29uc29sYSBkZSBSU3R1ZGlvLCBmdWVyYSBkZWwgdGVqaWRvIGRlbCBIVE1MLg0KDQpgYGB7ciBhcmNoaXZvc30NCmNhcnBldGEgPC0gIkM6L1VzZXJzL2lzYWFjL09uZURyaXZlIC0gVW5pdmVyc2lkYWQgR2VyYXJkbyBCYXJyaW9zL0VzY3JpdG9yaW8iDQppZiAoIWRpci5leGlzdHMoY2FycGV0YSkpIGNhcnBldGEgPC0gImRhdG9zIg0KDQpub20gPC0gcmVhZF9leGNlbChmaWxlLnBhdGgoY2FycGV0YSwNCiAgIlByb2R1Y3RvX0ludGVybm9fQnJ1dG9fVHJpbWVzdHJhbF8oUElCX1QpLl9Qcm9kdWNjacOzbl95X2dhc3RvX2FfcHJlY2lvc19jb3JyaWVudGVzLnhsc3giKSwgY29sX25hbWVzID0gRkFMU0UpDQp2b2wgPC0gcmVhZF9leGNlbChmaWxlLnBhdGgoY2FycGV0YSwNCiAgIlBJQl9ULl9Qcm9kdWNjacOzbl95X2dhc3RvLl/DjW5kaWNlc19kZV92b2x1bWVuX2VuY2FkZW5hZG9zLl9TZXJpZV9vcmlnaW5hbF8ocmVmZXJlbmNpYV8yMDE0KS54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KYW5uIDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKGNhcnBldGEsDQogICJQcm9kdWN0b19JbnRlcm5vX0JydXRvX19Qcm9kdWNjacOzbixfR2FzdG9fZV9JbmdyZXNvLl9BX3ByZWNpb3NfY29ycmllbnRlcy54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KYW52IDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKGNhcnBldGEsDQogICJQSUJfX1Byb2R1Y2Npw7NuX3lfZ2FzdG8uX8ONbmRpY2VzX2RlX3ZvbHVtZW5fZW5jYWRlbmFkb3NfKGHDsW9fZGVfcmVmZXJlbmNpYV8yMDE0KS54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KaXBjIDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKGNhcnBldGEsDQogICLDjW5kaWNlX2RlX1ByZWNpb3NfYWxfQ29uc3VtaWRvcl8oSVBDKS54bHN4IiksIGNvbF9uYW1lcyA9IEZBTFNFKQ0KDQojIENvbnZpZXJ0ZSB1bmEgZmlsYSBkZWwgRXhjZWwgZW4gdW4gdmVjdG9yIG51bcOpcmljby4NCmZpbGEgPC0gZnVuY3Rpb24oeCwgaSkgYXMubnVtZXJpYyh1bmxpc3QoeFtpLCAtMV0sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCg0KIyBMYXMgZmlsYXMgNyBhIDI1IGNvcnJlc3BvbmRlbiBhIGxhcyAxOSBhY3RpdmlkYWRlcyB0cmltZXN0cmFsZXMuDQpuIDwtIHNhcHBseSg3OjI1LCBmdW5jdGlvbihpKSBmaWxhKG5vbSwgaSkpDQp2IDwtIHNhcHBseSg3OjI1LCBmdW5jdGlvbihpKSBmaWxhKHZvbCwgaSkpDQpwaWJfbiA8LSBmaWxhKG5vbSwgMjgpDQpmYmtfbiA8LSBmaWxhKG5vbSwgMzQpDQpwaWJfdiA8LSBmaWxhKHZvbCwgMjgpDQpmYmtfdiA8LSBmaWxhKHZvbCwgMzMpDQp2YWJfbiA8LSBmaWxhKG5vbSwgMjYpDQoNCmluaSA8LSBhcy5pbnRlZ2VyKG5vbVtbMl1dWzRdKQ0KZmVjaGEgPC0gc2VxKGFzLkRhdGUocGFzdGUwKGluaSwgIi0wMS0wMSIpKSwgYnkgPSAiMyBtb250aHMiLCBsZW5ndGgub3V0ID0gbnJvdyhuKSkNCmFuaW8gPC0gYXMuaW50ZWdlcihmb3JtYXQoZmVjaGEsICIlWSIpKQ0KdHJpIDwtIChhcy5pbnRlZ2VyKGZvcm1hdChmZWNoYSwgIiVtIikpIC0gMSkgJS8lIDMgKyAxDQpwZXIgPC0gcGFzdGUwKGFuaW8sICItVCIsIHRyaSkNCnN0b3BpZm5vdChucm93KG4pID49IDgwLCBucm93KG4pID09IG5yb3codiksICFhbnlOQShuKSwgIWFueU5BKHYpLA0KICAgICAgICAgIGFsbChuID4gMCksIGFsbCh2ID4gMCksIGFsbChwaWJfbiA+IDApLCBhbGwoZmJrX24gPiAwKSkNCmBgYA0KDQoNCmBgYHtyIGNvYmVydHVyYSwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQpjYXQoJzxkaXYgY2xhc3M9ImRhdG9zLWNsYXZlIj48ZGl2IGNsYXNzPSJkYXRvIj48Yj4nLG5yb3cobiksDQogICAgJzwvYj48c3Bhbj5vYnNlcnZhY2lvbmVzIHRyaW1lc3RyYWxlczwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJkYXRvIj48Yj4nLA0KICAgIHBlclsxXSwnIGEgJyx0YWlsKHBlciwxKSwnPC9iPjxzcGFuPnBlcsOtb2RvIG9ic2VydmFkbzwvc3Bhbj48L2Rpdj4nLA0KICAgICc8ZGl2IGNsYXNzPSJkYXRvIj48Yj4zIHNlY3RvcmVzPC9iPjxzcGFuPjE5IGFjdGl2aWRhZGVzIGVjb27Ds21pY2FzPC9zcGFuPjwvZGl2PjwvZGl2Picsc2VwPScnKQ0KdGFibGEoZGF0YS5mcmFtZShBcmNoaXZvPWMoIlBJQiBub21pbmFsIHRyaW1lc3RyYWwiLCAiUElCIGVuIHZvbHVtZW4gdHJpbWVzdHJhbCIsICJQSUIgYW51YWwgbm9taW5hbCB5IGVuIHZvbHVtZW4iLCAiSVBDIiksDQogICAgICAgICAgICAgICAgIENvYmVydHVyYT1jKCIyMDA1IEkgYSAyMDI2IElJIiwgIjIwMDUgSSBhIDIwMjYgSUkiLCAiMjAwNSBhIDIwMjUiLCAiMjAyNSBJIGEgMjAyNiBYIiksDQogICAgICAgICAgICAgICAgIFVzbz1jKCJFc3RydWN0dXJhIGUgaW52ZXJzacOzbiIsICJDcmVjaW1pZW50b3MgeSBIUCIsICJWYWxpZGFjacOzbiB5IHJlZmVyZW5jaWEgMjAxNCIsICJSZWZlcmVuY2lhOyBubyBzZSB1c2EgY29tbyBkZWZsYWN0b3IgaGlzdMOzcmljbyIpKSwNCiAgICAgICJDdWFkcm8gMS4gRnVlbnRlcyB5IGNvYmVydHVyYSBkZSBsb3MgYXJjaGl2b3MgcmVjaWJpZG9zIikNCmBgYA0KDQpTZSByZXNwZXRhIGVsIHByaW1lciBkYXRvIGRpc3BvbmlibGUgZGUgbG9zIGFyY2hpdm9zIHJlY2liaWRvcy4gTGEgbXVlc3RyYSBkZSA4NiB0cmltZXN0cmVzIHN1cGVyYSBlbCBtw61uaW1vIGRlIDgwIGFudGVzIGRlIHRyYW5zZm9ybWFyIGxhcyBzZXJpZXMuIExhcyBub3RhcyBkZSBsb3MgYXJjaGl2b3MgaWRlbnRpZmljYW4gMjAyNCBjb21vIHByZWxpbWluYXIgeSAyMDI14oCTMjAyNiBjb21vIGVzdGltYWRvLiBObyBzZSBwcm95ZWN0YW4gdHJpbWVzdHJlcyBmYWx0YW50ZXMgZGUgMjAyNiBuaSBzZSBwcmVzZW50YSBlbCBwcmltZXIgc2VtZXN0cmUgY29tbyB1biBhw7FvIGNvbXBsZXRvLg0KDQojIyBQYXNvIDIgRGVmaW5pciBsb3MgdHJlcyBzZWN0b3Jlcw0KDQpMYSBjbGFzaWZpY2FjacOzbiBlcyB1bmEgYWdydXBhY2nDs24gb3BlcmF0aXZhIGRlbCBlc3R1ZGlvOiBhZ3JvcGVjdWFyaW8gKEEpLCBpbmR1c3RyaWEgeSBjb25zdHJ1Y2Npw7NuIChC4oCTRikgeSBzZXJ2aWNpb3MgKEfigJNTKS4gTGEgbWluZXLDrWEgc2UgdWJpY2EgZXhwbMOtY2l0YW1lbnRlIGVuIGVsIHNlZ3VuZG8gZ3J1cG8uIExhIGxldHJhIFMgdHJpbWVzdHJhbCB5YSBpbmNvcnBvcmEgVCwgYWN0aXZpZGFkZXMgZGUgbG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcywgZW4gdG9kYSBsYSBzZXJpZTsgbm8gc2UgYWdyZWdhIGRlIG51ZXZvLg0KDQpgYGB7ciBzZWN0b3JlcywgcmVzdWx0cz0nYXNpcyd9DQpjb2QgPC0gTEVUVEVSU1sxOjE5XQ0KYWN0IDwtIGMoIkFncmljdWx0dXJhLCBnYW5hZGVyw61hLCBzaWx2aWN1bHR1cmEgeSBwZXNjYSIsICJFeHBsb3RhY2nDs24gZGUgbWluYXMgeSBjYW50ZXJhcyIsDQogIkluZHVzdHJpYXMgbWFudWZhY3R1cmVyYXMiLCAiRWxlY3RyaWNpZGFkLCBnYXMsIHZhcG9yIHkgYWlyZSBhY29uZGljaW9uYWRvIiwNCiAiQWd1YSwgYWxjYW50YXJpbGxhZG9zIHkgZ2VzdGnDs24gZGUgZGVzZWNob3MiLCAiQ29uc3RydWNjacOzbiIsDQogIkNvbWVyY2lvIHkgcmVwYXJhY2nDs24gZGUgdmVow61jdWxvcyIsICJUcmFuc3BvcnRlIHkgYWxtYWNlbmFtaWVudG8iLA0KICJBbG9qYW1pZW50byB5IHNlcnZpY2lvIGRlIGNvbWlkYXMiLCAiSW5mb3JtYWNpw7NuIHkgY29tdW5pY2FjaW9uZXMiLA0KICJBY3RpdmlkYWRlcyBmaW5hbmNpZXJhcyB5IGRlIHNlZ3Vyb3MiLCAiQWN0aXZpZGFkZXMgaW5tb2JpbGlhcmlhcyIsDQogIkFjdGl2aWRhZGVzIHByb2Zlc2lvbmFsZXMsIGNpZW50w61maWNhcyB5IHTDqWNuaWNhcyIsICJTZXJ2aWNpb3MgYWRtaW5pc3RyYXRpdm9zIHkgZGUgYXBveW8iLA0KICJBZG1pbmlzdHJhY2nDs24gcMO6YmxpY2EsIGRlZmVuc2EgeSBzZWd1cmlkYWQgc29jaWFsIiwgIkVuc2XDsWFuemEiLA0KICJTYWx1ZCBodW1hbmEgeSBhc2lzdGVuY2lhIHNvY2lhbCIsICJBcnRlLCBlbnRyZXRlbmltaWVudG8geSByZWNyZWFjacOzbiIsDQogIk90cm9zIHNlcnZpY2lvcywgaW5jbHVpZG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcyIpDQpncnVwbyA8LSBjKDEsIHJlcCgyLCA1KSwgcmVwKDMsIDEzKSkNCm5vbV9zZWMgPC0gYygiU2VjdG9yIDEiLCAiU2VjdG9yIDIiLCAiU2VjdG9yIDMiKQ0KdGFibGEoZGF0YS5mcmFtZShTZWN0b3I9cGFzdGUoIlNlY3RvciIsZ3J1cG8pLCBDw7NkaWdvPWNvZCwgQWN0aXZpZGFkPWFjdCksDQogICAgICAiQ3VhZHJvIDIuIENvcnJlc3BvbmRlbmNpYSBkZSBhY3RpdmlkYWRlcyB5IHNlY3RvcmVzIikNCmBgYA0KDQpFbCBQSUIsIGxvcyBpbXB1ZXN0b3MgbmV0b3MgeSBsYSBGQktGIHNvbiBhZ3JlZ2Fkb3MsIG5vIGFjdGl2aWRhZGVzIGFkaWNpb25hbGVzLiBMYXMgcGFydGljaXBhY2lvbmVzIHNlIGNhbGN1bGFuIHNvYnJlIHZhbG9yIGFncmVnYWRvLCBleGNsdXllbmRvIGltcHVlc3RvcyBuZXRvcyBzb2JyZSBwcm9kdWN0b3MuIEFudGVzIGRlbCBhanVzdGUgc2UgdmVyaWZpY2EgcXVlIGxhIHN1bWEgZGUgbGFzIGFjdGl2aWRhZGVzIGNvaW5jaWRhIGNvbiBlbCB2YWxvciBhZ3JlZ2FkbyBwdWJsaWNhZG8sIGFkbWl0aWVuZG8gZWwgcmVkb25kZW8gZGUgY2VudMOpc2ltYXMgZGUgbWlsbMOzbi4NCg0KIyMgUGFzbyAzIERlZmxhY3RhciB5IGRlc2VzdGFjaW9uYWxpemFyDQoNCkVsIMOtbmRpY2UgZGUgdm9sdW1lbiBkZWwgUElCIHNlIGNvbnZpZXJ0ZSBlbiB1bmEgbWVkaWRhIG1vbmV0YXJpYSByZWZlcmVuY2lhZGEgYSAyMDE0IHVzYW5kbyBsYSBjdWFydGEgcGFydGUgZGVsIFBJQiBub21pbmFsIGFudWFsIGRlIDIwMTQsIHBvcnF1ZSBsb3Mgw61uZGljZXMgdHJpbWVzdHJhbGVzIHByb21lZGlhbiAxMDAgZW4gZXNlIGHDsW86DQoNClxbDQpZX3Recj1cZnJhY3tZX3syMDE0fV5ufXs0fVxmcmFje0lWRV90fXsxMDB9LFxxcXVhZA0KRF90PTEwMFxmcmFje1lfdF5ufXtZX3Recn0sXHFxdWFkDQpWQV97aXR9XntyLER9PVxmcmFje1ZBX3tpdH1ebn17RF90LzEwMH0uDQpcXQ0KDQpFbCDDumx0aW1vIGNvY2llbnRlIGVzIHVuYSAqKmFwcm94aW1hY2nDs24gY29uIGRlZmxhY3RvciBjb23Dum4qKiwgdXNhZGEgcGFyYSBtb3N0cmFyIGxhIHRyYW5zZm9ybWFjacOzbiBkZSBsb3Mgbml2ZWxlcyBub21pbmFsZXMuIEVsIGNyZWNpbWllbnRvIHNlY3RvcmlhbCBkZSBMaWxpZW4gc2Ugb2J0aWVuZSBkZSBsb3Mgw61uZGljZXMgb2ZpY2lhbGVzIGRlIHZvbHVtZW4gZGUgY2FkYSBhY3RpdmlkYWQgeSBubyBkZSBlc2EgYXByb3hpbWFjacOzbi4gTGFzIHBhcnRpY2lwYWNpb25lcyB5IGxhIGludmVyc2nDs24gdXNhbiB2YWxvcmVzIG5vbWluYWxlcyBlbiBudW1lcmFkb3IgeSBkZW5vbWluYWRvciwgcG9yIGRlZmluaWNpw7NuLg0KDQpTZSBhcGxpY2EgU1RMIGFsIGxvZ2FyaXRtbyBkZSBjYWRhIHNlcmllIHBvc2l0aXZhLCBjb24gZXN0YWNpb25hbGlkYWQgcGVyacOzZGljYSB5IGFqdXN0ZSByb2J1c3RvLiBMYSBzZXJpZSBhanVzdGFkYSBlcyBsYSBleHBvbmVuY2lhbCBkZWwgbG9nYXJpdG1vIG1lbm9zIHN1IGNvbXBvbmVudGUgZXN0YWNpb25hbC4gU2UgY29uc2VydmFuIGxhcyA4NiBvYnNlcnZhY2lvbmVzLiBFbCBhanVzdGUgZXMgcHJvcGlvIHkgcHVlZGUgZGlmZXJpciBkZWwgcHVibGljYWRvIHBvciBlbCBCQ1IuDQoNCmBgYHtyIHRyYW5zZm9ybWFyfQ0KIyBSZWZlcmVuY2lhIG1vbmV0YXJpYSB5IGRlZmxhY3RvciBpbXBsw61jaXRvIGRlbCBQSUIuDQpyZWYgPC0gYXMubnVtZXJpYyhhbm5bMzAsIHdoaWNoKGZpbGEoYW5uLCA0KSA9PSAyMDE0KSArIDFdKSAvIDQNCnBpYl9yIDwtIHJlZiAqIHBpYl92IC8gMTAwDQpkZWYgPC0gMTAwICogcGliX24gLyBwaWJfcg0KdmFfciA8LSBuIC8gKGRlZiAvIDEwMCkNCg0KIyBBanVzdGUgU1RMIGRlIHVuYSBzZXJpZSBwb3NpdGl2YS4NCmFqIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeiA8LSB0cyhsb2coeCksIHN0YXJ0ID0gYyhpbmksIDEpLCBmcmVxdWVuY3kgPSA0KQ0KICBlc3QgPC0gc3RsKHosIHMud2luZG93ID0gInBlcmlvZGljIiwgcm9idXN0ID0gVFJVRSkNCiAgYXMubnVtZXJpYyhleHAoeiAtIGVzdCR0aW1lLnNlcmllc1ssICJzZWFzb25hbCJdKSkNCn0NCm5zIDwtIGFwcGx5KG4sIDIsIGFqKQ0KdnMgPC0gYXBwbHkodiwgMiwgYWopDQpwaWIgPC0gYWoocGliX3YpDQpwbiA8LSBhaihwaWJfbikNCmZiayA8LSBhaihmYmtfbikNCg0KIyBFbCBhanVzdGUgaW5kaXJlY3RvIHByZXNlcnZhIGxhIHN1bWEgZGUgbG9zIHRyZXMgc2VjdG9yZXMuDQp2YSA8LSBjYmluZChuc1ssMV0sIHJvd1N1bXMobnNbLDI6Nl0pLCByb3dTdW1zKG5zWyw3OjE5XSkpDQpjb2xuYW1lcyh2YSkgPC0gbm9tX3NlYw0KcGFydCA8LSAxMDAgKiB2YSAvIHJvd1N1bXModmEpDQpzMSA8LSBwYXJ0WywxXTsgczIgPC0gcGFydFssMl07IHMzIDwtIHBhcnRbLDNdDQpzdG9waWZub3QobWF4KGFicyhyb3dTdW1zKHBhcnQpIC0gMTAwKSkgPCAxZS04KQ0KZXJyX3ZhIDwtIG1heChhYnMocm93U3VtcyhuKSAtIHZhYl9uKSkNCmBgYA0KDQpMYSBkaWZlcmVuY2lhIG3DoXhpbWEgZW50cmUgbGEgc3VtYSBkZSBsYXMgcmFtYXMgbm9taW5hbGVzIG9yaWdpbmFsZXMgeSBlbCB2YWxvciBhZ3JlZ2FkbyBwdWJsaWNhZG8gZXMgKipgciBmbXQoZXJyX3ZhLDMpYCBtaWxsb25lcyBkZSBkw7NsYXJlcyoqLiBMYXMgcGVxdWXDsWFzIGRpZmVyZW5jaWFzIHNvbiBjb21wYXRpYmxlcyBjb24gZWwgcmVkb25kZW8uIExhIHN1bWEgZGUgcGFydGljaXBhY2lvbmVzIGRlIGxvcyB0cmVzIHNlY3RvcmVzIGFqdXN0YWRvcyBlcyAxMDAgJSBwb3IgY29uc3RydWNjacOzbi4NCg0KIyMgUGFzbyA0IENvbnN0cnVpciBsb3MgaW5kaWNhZG9yZXMNCg0KYGBge3IgZGljY2lvbmFyaW8sIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KdGFibGEoZGF0YS5mcmFtZSgNCiBJbmRpY2Fkb3I9YygiQ3JlY2ltaWVudG8gZGVsIFBJQiByZWFsIiwgIlBhcnRpY2lwYWNpw7NuIHNlY3RvcmlhbCIsICJUYXNhIGRlIGludmVyc2nDs24iLCAiQ29uY2VudHJhY2nDs24gSEhJIiwgIk5BViIsICJMaWxpZW4iKSwNCiBGw7NybXVsYT1jKCIxMDAgw5cgzpQgbG4gUElCIHJlYWwgYWp1c3RhZG8iLCAiMTAwIMOXIFZBIHNlY3RvcmlhbCAvIFZBIHRvdGFsIGFqdXN0YWRvIiwgIjEwMCDDlyBGQktGIG5vbWluYWwgYWp1c3RhZGEgLyBQSUIgbm9taW5hbCBhanVzdGFkbyIsICJTdW1hIGRlIChwYXJ0aWNpcGFjacOzbi8xMDApwrIiLCAiMC41IMOXIHN1bWEgZGUgfHModCkg4oiSIHModOKIkmspfCIsICJSYcOteiBkZSBzdW1hIGRlIChzLzEwMCkgw5cgKGcgc2VjdG9yaWFsIOKIkiBnIFBJQinCsiIpLA0KIFVuaWRhZD1jKCIlIHRyaW1lc3RyYWwgbG9nYXLDrXRtaWNvIiwgIiUgZGVsIHZhbG9yIGFncmVnYWRvIiwgIiUgZGVsIFBJQiIsICLDjW5kaWNlIGVudHJlIDEvMyB5IDEiLCAiUHVudG9zIHBvcmNlbnR1YWxlcyIsICJQdW50b3MgcG9yY2VudHVhbGVzIGRlIGRpc3BlcnNpw7NuIiksDQogRnVlbnRlPWMoIkJDUiB2b2x1bWVuIiwgIkJDUiBub21pbmFsIiwgIkJDUiBub21pbmFsIiwgIlBhcnRpY2lwYWNpb25lcyIsICJQYXJ0aWNpcGFjaW9uZXMiLCAiQkNSIHZvbHVtZW4geSBub21pbmFsIikpLA0KICJDdWFkcm8gMy4gRGVmaW5pY2nDs24gZGUgbG9zIHNlaXMgaW5kaWNhZG9yZXM7IGZyZWN1ZW5jaWEgdHJpbWVzdHJhbCIpDQpgYGANCg0KRWwgY3JlY2ltaWVudG8gcHJpbmNpcGFsIGNvbXBhcmEgdW4gdHJpbWVzdHJlIGNvbiBlbCBpbm1lZGlhdG8gYW50ZXJpb3IsIGRlc3B1w6lzIGRlbCBhanVzdGUgZXN0YWNpb25hbC4gTm8gZXMgdW5hIHRhc2EgaW50ZXJhbnVhbCBuaSBhbnVhbGl6YWRhLiBOQVYgc2UgY2FsY3VsYSBjb24gKiprID0gNCB0cmltZXN0cmVzKiosIHVuIGhvcml6b250ZSBkZSB1biBhw7FvIHF1ZSBkZWphIDgyIG9ic2VydmFjaW9uZXMuIFNlIGNvbnNlcnZhIGsgPSAyMCAoY2luY28gYcOxb3MpIGNvbW8gc2Vuc2liaWxpZGFkLCBjb24gNjYgb2JzZXJ2YWNpb25lczsgbm8gc2UgYWZpcm1hIHF1ZSBlc2EgdmFyaWFudGUgYWxjYW5jZSBwb3Igc8OtIHNvbGEgZWwgbcOtbmltbyBkZSA4MC4NCg0KQ29uIFwoaj0xLDIsM1wpLCBsYXMgZXhwcmVzaW9uZXMgZGUgbG9zIGluZGljYWRvcmVzIHNvbjoNCg0KXFsNCmdfdD0xMDBcRGVsdGFcbG4gWV90XntyLFNBfSxccXF1YWQNCnNfe2p0fT0xMDBcZnJhY3tWQV97anR9XntuLFNBfX17XHN1bV97aD0xfV57M31WQV97aHR9XntuLFNBfX0sXHFxdWFkDQpJX3Q9MTAwXGZyYWN7RkJLRl90XntuLFNBfX17WV90XntuLFNBfX0uDQpcXQ0KDQpcWw0KSEhJX3Q9XHN1bV97aj0xfV57M31cbGVmdChcZnJhY3tzX3tqdH19ezEwMH1ccmlnaHQpXjIsXHFxdWFkDQpOQVZfdD1cZnJhY3sxfXsyfVxzdW1fe2o9MX1eezN9fHNfe2p0fS1zX3tqLHQtNH18Lg0KXF0NCg0KXFsNCkxpbGllbl90PVxzcXJ0e1xzdW1fe2o9MX1eezN9XGZyYWN7c197anR9fXsxMDB9KGdfe2p0fS1nX3QpXjJ9Lg0KXF0NCg0KRWwgc3VwZXLDrW5kaWNlIFNBIGlkZW50aWZpY2EgbGFzIHNlcmllcyBhanVzdGFkYXMgcG9yIGVzdGFjaW9uYWxpZGFkOyBuIGluZGljYSBwcmVjaW9zIGNvcnJpZW50ZXMgeSByIHZvbHVtZW4gcmVhbC4NCg0KTG9zIMOtbmRpY2VzIGRlIHZvbHVtZW4gZW5jYWRlbmFkb3Mgbm8gc2Ugc3VtYW4gZGlyZWN0YW1lbnRlLiBQYXJhIGVsIGNyZWNpbWllbnRvIGRlIGxvcyB0cmVzIHNlY3RvcmVzIHNlIHV0aWxpemEgdW5hICoqYWdyZWdhY2nDs24gcHJvcGlhIGRlIHRpcG8gVMO2cm5xdmlzdCoqOiBwcm9tZWRpbyBkZSBsYXMgcGFydGljaXBhY2lvbmVzIG5vbWluYWxlcyBpbnRlcm5hcyBkZSBkb3MgdHJpbWVzdHJlcyBjb25zZWN1dGl2b3MsIG11bHRpcGxpY2FkbyBwb3IgbG9zIGNyZWNpbWllbnRvcyBsb2dhcsOtdG1pY29zIGRlIGxhcyBhY3RpdmlkYWRlcy4gRXMgdW5hIGFwcm94aW1hY2nDs24gc3VwZXJsYXRpdmEgcGFyYSBlc3RvcyBncnVwb3MgeSBubyB1bmEgc2VyaWUgYWdyZWdhZGEgb2ZpY2lhbCBkZWwgQkNSLg0KDQpcWw0KZ197anR9PTEwMFxzdW1fe2lcaW4gan1cZnJhY3tcb21lZ2Ffe2l0fStcb21lZ2Ffe2ksdC0xfX0yDQogIFxEZWx0YVxsbiBJVkVfe2l0fV57U0F9LFxxcXVhZA0KXG9tZWdhX3tpdH09XGZyYWN7VkFfe2l0fV57bixTQX19e1xzdW1fe2lcaW4gan1WQV97aXR9XntuLFNBfX0uDQpcXQ0KDQpgYGB7ciBpbmRpY2Fkb3Jlc30NCmcgPC0gYyhOQSwgMTAwICogZGlmZihsb2cocGliKSkpDQppbnYgPC0gMTAwICogZmJrIC8gcG4NCmhoaSA8LSByb3dTdW1zKChwYXJ0IC8gMTAwKV4yKQ0KDQojIENhbWJpb3MgZGUgbGFzIHBhcnRpY2lwYWNpb25lcyBhIGsgdHJpbWVzdHJlcy4NCmNhbWJpbyA8LSBmdW5jdGlvbihzLCBrKSB7DQogIHJiaW5kKG1hdHJpeChOQSwgaywgbmNvbChzKSksIGFicyhzWyhrKzEpOm5yb3cocyksIF0gLSBzWzE6KG5yb3cocyktayksIF0pKQ0KfQ0KdSA8LSBjYW1iaW8ocGFydCwgNCkNCm5hdiA8LSByb3dTdW1zKHUpIC8gMg0KbmF2NSA8LSByb3dTdW1zKGNhbWJpbyhwYXJ0LCAyMCkpIC8gMg0KDQojIENyZWNpbWllbnRvIHJlYWwgZGUgbGFzIGFjdGl2aWRhZGVzIHkgZGUgbG9zIHRyZXMgc2VjdG9yZXMuDQpnaSA8LSBhcHBseShsb2codnMpLCAyLCBmdW5jdGlvbih4KSBjKE5BLCAxMDAgKiBkaWZmKHgpKSkNCmdzIDwtIG1hdHJpeChOQSwgbnJvdyhuKSwgMykNCmZvciAoaiBpbiAxOjMpIHsNCiAgdyA8LSBuc1ssIGdydXBvID09IGosIGRyb3AgPSBGQUxTRV0NCiAgdyA8LSB3IC8gcm93U3Vtcyh3KQ0KICB3bSA8LSAod1stMSwgLCBkcm9wPUZBTFNFXSArIHdbLW5yb3codyksICwgZHJvcD1GQUxTRV0pIC8gMg0KICBnc1stMSxqXSA8LSByb3dTdW1zKHdtICogZ2lbLTEsIGdydXBvID09IGosIGRyb3A9RkFMU0VdKQ0KfQ0KY29sbmFtZXMoZ3MpIDwtIG5vbV9zZWMNCmxpbCA8LSBzcXJ0KHJvd1N1bXMoKHBhcnQgLyAxMDApICogKGdzIC0gZyleMikpDQp3MTkgPC0gbnMgLyByb3dTdW1zKG5zKQ0KbGlsMTkgPC0gc3FydChyb3dTdW1zKHcxOSAqIChnaSAtIGcpXjIpKQ0KDQpkIDwtIGRhdGEuZnJhbWUoZmVjaGEsIHBlciwgYW5pbywgdHJpLCBwaWIsIGcsIHMxLCBzMiwgczMsIGludiwgaGhpLCBuYXYsIG5hdjUsIGxpbCkNCmQkZzEgPC0gZ3NbLDFdOyBkJGcyIDwtIGdzWywyXTsgZCRnMyA8LSBnc1ssM10NCmBgYA0KDQpOQVYgbWlkZSBsYSBtYWduaXR1ZCBkZSBsYSByZWFzaWduYWNpw7NuIHByb2R1Y3RpdmEsIG5vIHN1IGNvbnZlbmllbmNpYS4gTGlsaWVuIG1pZGUgZGlzcGVyc2nDs24gZW50cmUgbG9zIGNyZWNpbWllbnRvcyBwcm9kdWN0aXZvczogbm8gZGVtdWVzdHJhIG1vdmlsaWRhZCBlZmVjdGl2YSBkZWwgZW1wbGVvLiBISEkgZGVwZW5kZSBkZWwgbsO6bWVybyBkZSBncnVwb3M7IGNvbiB0cmVzIHNlY3RvcmVzIHN1IG3DrW5pbW8gZXMgMS8zLCBwb3IgbG8gcXVlIG5vIGRlYmUgY29tcGFyYXJzZSBkaXJlY3RhbWVudGUgY29uIHVuIEhISSBkZSAxOSBhY3RpdmlkYWRlcy4NCg0KIyMgUGFzbyA1IENvbXBhcmFyIHBvbmRlcmFjaW9uZXMNCg0KTkFWIHkgTGlsaWVuIGNvbnNlcnZhbiBzdXMgZsOzcm11bGFzIGVzcGVjw61maWNhcy4gUGFyYSBjdWJyaXIgZWwgcHJvY2VkaW1pZW50byBnZW5lcmFsIGRlIGVzdGFuZGFyaXphY2nDs24geSBwZXNvcyBkZSBsYSBjb25zaWduYSwgc2UgYcOxYWRlICoqdW4gw61uZGljZSBhdXhpbGlhciBkZSBpbnRlbnNpZGFkIGRlbCBjYW1iaW8qKiwgY29uc3RydWlkbyBjb24gbG9zIHRyZXMgY2FtYmlvcyBhYnNvbHV0b3MgcXVlIGZvcm1hbiBOQVYuIE5vIHN1c3RpdHV5ZSBuaSBzZSBwcmVzZW50YSBjb21vIGVsIE5BViBvcmlnaW5hbC4NCg0KU2UgZXN0YW5kYXJpemFuIGxvcyBjb21wb25lbnRlcyBlbiBsYSBtaXNtYSBtdWVzdHJhIGRlIDgyIHRyaW1lc3RyZXMuIFRvZG9zIGxsZXZhbiBzaWdubyBwb3NpdGl2byBwb3JxdWUgYXVtZW50b3MgaW5kaWNhbiBtw6FzIGludGVuc2lkYWQsIG5vIG1heW9yIGJpZW5lc3Rhci4gRWwgY2FzbyBiYXNlIHVzYSBwZXNvcyAxLzMuIExhIHZhcmlhbnRlIFBDQSB1dGlsaXphIGVsIGN1YWRyYWRvIGRlIGxhcyBjYXJnYXMgZGVsIHByaW1lciBjb21wb25lbnRlLCBub3JtYWxpemFkbyBwYXJhIHF1ZSBsb3MgcGVzb3Mgc3VtZW4gdW5vLiBMb3MgcGVzb3MgcmVmbGVqYW4gY292YXJpYWNpw7NuIGVzdGFkw61zdGljYSB5IG5vIGltcG9ydGFuY2lhIGNhdXNhbC4NCg0KXFsNCnpfe2p0fT1cZnJhY3t1X3tqdH0tXG92ZXJsaW5le3V9X2p9e1xzaWdtYV9qfSxccXF1YWQNCklDX3Q9XHN1bV97aj0xfV57M313X2p6X3tqdH0sXHFxdWFkDQp3X2pee1BDQX09XGZyYWN7YV97ajF9XnsyfX17XHN1bV97aD0xfV57M31hX3toMX1eezJ9fSwNClxdDQoNCmRvbmRlIFwodV97anR9PXxzX3tqdH0tc197aix0LTR9fFwpLCBcKFxzaWdtYV9qXCkgZXMgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIG11ZXN0cmFsIHkgXChhX3tqMX1cKSBlcyBsYSBjYXJnYSBkZWwgcHJpbWVyIGNvbXBvbmVudGUgcHJpbmNpcGFsLiBFbCByZWVzY2FsYW1pZW50byAw4oCTMTAwIHNlIGFwbGljYSBwb3Igc2VwYXJhZG8gYSBjYWRhIHZlcnNpw7NuIHBhcmEgZmFjaWxpdGFyIGxhIGNvbXBhcmFjacOzbiBncsOhZmljYS4NCg0KYGBge3Igcm9idXN0ZXp9DQpvayA8LSBjb21wbGV0ZS5jYXNlcyh1KQ0KeiA8LSBzY2FsZSh1W29rLCBdKQ0KcGMgPC0gcHJjb21wKHosIGNlbnRlciA9IEZBTFNFLCBzY2FsZS4gPSBGQUxTRSkNCnBlc29zIDwtIHBjJHJvdGF0aW9uWywxXV4yIC8gc3VtKHBjJHJvdGF0aW9uWywxXV4yKQ0KaWMxIDwtIHJvd01lYW5zKHopDQppYzIgPC0gYXMubnVtZXJpYyh6ICUqJSBwZXNvcykNCnJlZXNjIDwtIGZ1bmN0aW9uKHgpIDEwMCAqICh4IC0gbWluKHgpKSAvIChtYXgoeCkgLSBtaW4oeCkpDQpyb2IgPC0gZGF0YS5mcmFtZShmZWNoYSA9IGZlY2hhW29rXSwgSWd1YWwgPSByZWVzYyhpYzEpLCBQQ0EgPSByZWVzYyhpYzIpKQ0KcmhvIDwtIGNvcihpYzEsIGljMikNCmV4cF9wYyA8LSAxMDAgKiBwYyRzZGV2WzFdXjIgLyBzdW0ocGMkc2Rldl4yKQ0KDQojIEZ1bmNpw7NuIHBlcXVlw7FhIHBhcmEgZ3JhZmljYXIgdmFyaWFzIGNvbHVtbmFzIGNvbiB1bmEgbGV5ZW5kYSBjb23Dum4uDQpsYXJnYSA8LSBmdW5jdGlvbih4LCBmZWNoYXMsIG5vbWJyZXMgPSBjb2xuYW1lcyh4KSkgew0KICBkYXRhLmZyYW1lKGZlY2hhID0gcmVwKGZlY2hhcywgbmNvbCh4KSksDQogICAgICAgICAgICAgc2VyaWUgPSByZXAobm9tYnJlcywgZWFjaCA9IG5yb3coeCkpLCB2YWxvciA9IGFzLnZlY3Rvcihhcy5tYXRyaXgoeCkpKQ0KfQ0KYGBgDQoNCiMjIFBhc28gNiBFc3BlY2lmaWNhciBsYXMgcHJ1ZWJhcyB5IGxvcyBxdWllYnJlcw0KDQpMYXMgcHJ1ZWJhcyBBREYsIEtQU1MgeSBaaXZvdC1BbmRyZXdzIHNlIGFwbGljYW4gYSB0cmVzIHNlcmllcyBjZW50cmFsZXM6IGxvZ2FyaXRtbyBkZWwgUElCIGFqdXN0YWRvLCBOQVYgeSBMaWxpZW4uIFNlIGV4YW1pbmFuIG5pdmVsZXMgeSBwcmltZXJhcyBkaWZlcmVuY2lhcy4gQURGIHV0aWxpemEgdW4gbcOheGltbyBkZSBjdWF0cm8gcmV6YWdvcyB5IHNlbGVjY2nDs24gQklDOyBLUFNTIHVzYSBjb3JyZWNjacOzbiBjb3J0YSBkZSBhdXRvY29ycmVsYWNpw7NuLiBaaXZvdC1BbmRyZXdzIHVzYSBlbCBuw7ptZXJvIGRlIHJlemFnb3MgZWxlZ2lkbyBwYXJhIEFERiB5IHBlcm1pdGUgdW4gcXVpZWJyZSBlbmTDs2dlbm8uIEVsIGxvZ2FyaXRtbyBkZWwgUElCIGluY2x1eWUgdGVuZGVuY2lhOyBsb3Mgw61uZGljZXMgc2UgbW9kZWxhbiBjb24gY29uc3RhbnRlLiBQYXJhIHN1cyBwcmltZXJhcyBkaWZlcmVuY2lhcyBzZSB1c2EgY29uc3RhbnRlLg0KDQpMYSBudWxhIGRlIEFERiB5IFppdm90LUFuZHJld3MgZXMgcmHDrXogdW5pdGFyaWE7IGxhIG51bGEgZGUgS1BTUyBlcyBlc3RhY2lvbmFyaWVkYWQgcmVzcGVjdG8gZGUgbGEgcGFydGUgZGV0ZXJtaW7DrXN0aWNhIGVzcGVjaWZpY2FkYS4gU2UgaW5mb3JtYSBsYSBkZWNpc2nDs24gYWwgNSAlIGNvbiBlc3RhZMOtc3RpY29zIHkgdmFsb3JlcyBjcsOtdGljb3MuIFJlc3VsdGFkb3MgY29udHJhZGljdG9yaW9zIHNlIHJlY29ub2Nlbiwgc2luIGFzaWduYXIgYXV0b23DoXRpY2FtZW50ZSB1biBvcmRlbiBkZSBpbnRlZ3JhY2nDs24uDQoNCmBgYHtyIHJhaWNlc30NCnJhaXogPC0gZnVuY3Rpb24oeCwgZmVjaGFzLCBub21icmUsIHRlbmRlbmNpYSA9IEZBTFNFLCBkaWYgPSBGQUxTRSkgew0KICBidWVuIDwtIGlzLmZpbml0ZSh4KQ0KICB4IDwtIHhbYnVlbl07IGZlY2hhcyA8LSBmZWNoYXNbYnVlbl0NCiAgaWYgKGRpZikgeyB4IDwtIGRpZmYoeCk7IGZlY2hhcyA8LSBmZWNoYXNbLTFdOyB0ZW5kZW5jaWEgPC0gRkFMU0UgfQ0KICBhIDwtIHVyLmRmKHgsIHR5cGUgPSBpZiAodGVuZGVuY2lhKSAidHJlbmQiIGVsc2UgImRyaWZ0IiwgbGFncyA9IDQsIHNlbGVjdGxhZ3MgPSAiQklDIikNCiAgayA8LSB1ci5rcHNzKHgsIHR5cGUgPSBpZiAodGVuZGVuY2lhKSAidGF1IiBlbHNlICJtdSIsIGxhZ3MgPSAic2hvcnQiKQ0KICByZXogPC0gc3VtKGdyZXBsKCJ6LmRpZmYubGFnIiwgcm93bmFtZXMoYUB0ZXN0cmVnJGNvZWZmaWNpZW50cyksIGZpeGVkID0gVFJVRSkpDQogIHphIDwtIHVyLnphKHgsIG1vZGVsID0gaWYgKHRlbmRlbmNpYSkgImJvdGgiIGVsc2UgImludGVyY2VwdCIsIGxhZyA9IHJleikNCiAgZXN0IDwtIGMoYUB0ZXN0c3RhdFsxLDFdLCBrQHRlc3RzdGF0LCB6YUB0ZXN0c3RhdCkNCiAgY3JpdCA8LSBjKGFAY3ZhbFsxLCI1cGN0Il0sIGtAY3ZhbFsxLCI1cGN0Il0sIHphQGN2YWxbMl0pDQogIHJlY2hhem8gPC0gYyhlc3RbMV0gPCBjcml0WzFdLCBlc3RbMl0gPiBjcml0WzJdLCBlc3RbM10gPCBjcml0WzNdKQ0KICBxIDwtIHBhc3RlMChmb3JtYXQoZmVjaGFzW3phQGJwb2ludF0sICIlWSIpLCAiLVQiLCAoYXMuaW50ZWdlcihmb3JtYXQoZmVjaGFzW3phQGJwb2ludF0sICIlbSIpKS0xKSUvJTMrMSkNCiAgZGF0YS5mcmFtZShTZXJpZSA9IG5vbWJyZSwgRm9ybWEgPSBpZiAoZGlmKSAiRGlmZXJlbmNpYSIgZWxzZSAiTml2ZWwiLA0KICAgICAgICAgICAgIFBydWViYSA9IGMoIkFERiIsICJLUFNTIiwgIlppdm90LUFuZHJld3MiKSwgTiA9IGxlbmd0aCh4KSwNCiAgICAgICAgICAgICBNb2RlbG8gPSBjKGlmICh0ZW5kZW5jaWEpICJDb25zdGFudGUgeSB0ZW5kZW5jaWEiIGVsc2UgIkNvbnN0YW50ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVuZGVuY2lhKSAiVGVuZGVuY2lhIiBlbHNlICJOaXZlbCIsIGlmKHRlbmRlbmNpYSkgIkFtYm9zIiBlbHNlICJJbnRlcmNlcHRvIiksDQogICAgICAgICAgICAgUmV6YWdvcyA9IGMocmV6LCBrQGxhZywgcmV6KSwgRXN0YWTDrXN0aWNvID0gZXN0LCBDcsOtdGljb181ID0gY3JpdCwNCiAgICAgICAgICAgICBSZWNoYXphX251bGEgPSBpZmVsc2UocmVjaGF6bywgIlPDrSIsICJObyIpLA0KICAgICAgICAgICAgIFF1aWVicmUgPSBjKCIiLCAiIiwgcSkpDQp9DQpzZXJpZXMgPC0gbGlzdCgibG4gUElCIiA9IGxvZyhwaWIpLCAiTkFWIiA9IG5hdiwgIkxpbGllbiIgPSBsaWwpDQp0ZXN0IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShuYW1lcyhzZXJpZXMpLCBmdW5jdGlvbihub21icmUpIHsNCiAgcmJpbmQocmFpeihzZXJpZXNbW25vbWJyZV1dLCBmZWNoYSwgbm9tYnJlLCBub21icmUgPT0gImxuIFBJQiIpLA0KICAgICAgICByYWl6KHNlcmllc1tbbm9tYnJlXV0sIGZlY2hhLCBub21icmUsIG5vbWJyZSA9PSAibG4gUElCIiwgZGlmID0gVFJVRSkpDQp9KSkNCmBgYA0KDQpFbCDDrW5kaWNlIHByaW5jaXBhbCBwYXJhIGZlY2hhciBxdWllYnJlcyBlcyBOQVYgYSBjdWF0cm8gdHJpbWVzdHJlcy4gU2UgZXN0aW1hIHVuIG1vZGVsbyBkZSBjYW1iaW9zIGRlIG1lZGlhLCBOQVYgPSBtZWRpYSBkZSBjYWRhIHLDqWdpbWVuICsgZXJyb3IsIG1lZGlhbnRlIGVsIGFsZ29yaXRtbyBCYWnigJNQZXJyb24gZGUgYGJyZWFrcG9pbnRzYC4gU2UgYnVzY2EgZW50cmUgY2VybyB5IHRyZXMgcXVpZWJyZXMsIGNvbiBzZWdtZW50b3MgbcOtbmltb3MgZGVsIDE1ICUgZGUgbGEgbXVlc3RyYSB5IHNlbGVjY2nDs24gQklDLiBFbCBtw6F4aW1vIGRlIHRyZXMgZXMgdW4gbMOtbWl0ZSBkZSBwYXJzaW1vbmlhLCBubyB1bmEgaW1wb3NpY2nDs24gZGUgbG9zIHRyZXMgaGl0b3MuDQoNClNlIGHDsWFkZSB1bmEgcHJ1ZWJhIGRlIGVzdGFiaWxpZGFkIHN1cEYgY29uIGNvdmFyaWFuemEgTmV3ZXnigJNXZXN0IChjdWF0cm8gcmV6YWdvcykuIFN1IHAtdmFsb3IgY29ycmVzcG9uZGUgYSBlc3RhYmlsaWRhZCwgKipubyBlcyB1biBwLXZhbG9yIGluZGl2aWR1YWwgZGUgY2FkYSBmZWNoYSBlbGVnaWRhIHBvciBCSUMqKi4gTkFWIHRpZW5lIHZlbnRhbmFzIHNvbGFwYWRhcywgcG9yIGxvIHF1ZSBzZSByZXBvcnRhIGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWwgeSB1bmEgc2Vuc2liaWxpZGFkIHF1ZSBwZXJtaXRlIGRpbsOhbWljYSBBUigxKS4gTG9zIGludGVydmFsb3MgZGUgbGFzIGZlY2hhcyBzb24gYXByb3hpbWFjaW9uZXMgYXNpbnTDs3RpY2FzIHkgbm8gcmVjb2dlbiB0b2RhIGxhIGluY2VydGlkdW1icmUgZGUgc2VsZWNjacOzbi4NCg0KYGBge3IgcXVpZWJyZXN9DQpiIDwtIGRbaXMuZmluaXRlKGQkbmF2KSwgYygiZmVjaGEiLCAicGVyIiwgIm5hdiIpXQ0KYnAgPC0gYnJlYWtwb2ludHMobmF2IH4gMSwgZGF0YSA9IGIsIGggPSAwLjE1LCBicmVha3MgPSAzKQ0KYmljIDwtIGFzLm51bWVyaWMoQklDKGJwKSkNCm0gPC0gd2hpY2gubWluKGJpYykgLSAxDQpjb3J0ZXMgPC0gaWYgKG0gPiAwKSBicmVha3BvaW50cyhicCwgYnJlYWtzID0gbSkkYnJlYWtwb2ludHMgZWxzZSBpbnRlZ2VyKDApDQpiJHJlZyA8LSBmYWN0b3IoZmluZEludGVydmFsKHNlcV9sZW4obnJvdyhiKSksIGNvcnRlcykgKyAxKQ0KZml0IDwtIGlmIChtID4gMCkgbG0obmF2IH4gcmVnLCBkYXRhID0gYikgZWxzZSBsbShuYXYgfiAxLCBkYXRhID0gYikNCmIkbWVkaWEgPC0gZml0dGVkKGZpdCkNCm53IDwtIGZ1bmN0aW9uKG1vZGVsbykgTmV3ZXlXZXN0KG1vZGVsbywgbGFnID0gNCwgcHJld2hpdGUgPSBGQUxTRSwgYWRqdXN0ID0gVFJVRSkNCmZzIDwtIEZzdGF0cyhuYXYgfiAxLCBkYXRhID0gYiwgZnJvbSA9IDAuMTUsIHZjb3YuID0gbncpDQpzdXAgPC0gc2N0ZXN0KGZzLCB0eXBlID0gInN1cEYiKQ0KbGIgPC0gQm94LnRlc3QocmVzaWR1YWxzKGZpdCksIGxhZyA9IDgsIHR5cGUgPSAiTGp1bmctQm94IikNCmNpIDwtIGlmIChtID4gMCkgY29uZmludChicCwgYnJlYWtzID0gbSwgdmNvdi4gPSBudykkY29uZmludCBlbHNlIG1hdHJpeChudW1lcmljKDApLCAwLCAzKQ0KDQojIFNlbnNpYmlsaWRhZCBjb24gZGluw6FtaWNhIEFSKDEpLg0KYiRhciA8LSBjKE5BLCBoZWFkKGIkbmF2LCAtMSkpDQpiYSA8LSBiWy0xLCBdDQpicGEgPC0gYnJlYWtwb2ludHMobmF2IH4gYXIsIGRhdGEgPSBiYSwgaCA9IDAuMTUsIGJyZWFrcyA9IDMpDQptYSA8LSB3aGljaC5taW4oYXMubnVtZXJpYyhCSUMoYnBhKSkpIC0gMQ0KY2EgPC0gaWYgKG1hID4gMCkgYnJlYWtwb2ludHMoYnBhLCBicmVha3MgPSBtYSkkYnJlYWtwb2ludHMgZWxzZSBpbnRlZ2VyKDApDQoNCiMgQ29udHJhc3RlcyBhZGljaW9uYWxlcyBkZSBjYW1iaW8gZGUgbWVkaWEgZW4gZmVjaGFzIGZpamFkYXMgcHJldmlhbWVudGUuDQpoaXRvcyA8LSBhcy5EYXRlKGMoIjIwMDgtMTAtMDEiLCAiMjAwOS0wMS0wMSIsICIyMDIwLTA0LTAxIikpDQpoaXN0IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShoaXRvcywgZnVuY3Rpb24oZikgew0KICBiJHBvcyA8LSBhcy5pbnRlZ2VyKGIkZmVjaGEgPj0gZikNCiAgZm0gPC0gbG0obmF2IH4gcG9zLCBkYXRhID0gYikNCiAgY3QgPC0gY29lZnRlc3QoZm0sIHZjb3YuID0gbncpDQogIGRhdGEuZnJhbWUoRmVjaGEgPSBmb3JtYXQoZiwgIiVZLSVtLSVkIiksIEFudGVzID0gc3VtKGIkcG9zID09IDApLCBEZXNwdcOpcyA9IHN1bShiJHBvcyA9PSAxKSwNCiAgICAgICAgICAgICBDYW1iaW8gPSBjdFsicG9zIiwxXSwgcF9IQUMgPSBjdFsicG9zIiw0XSkNCn0pKQ0KaGlzdCRwX0hvbG0gPC0gcC5hZGp1c3QoaGlzdCRwX0hBQywgbWV0aG9kID0gImhvbG0iKQ0KYGBgDQoNCiMjIFBhc28gNyBFc3RpbWFyIGVsIHByb2R1Y3RvIHBvdGVuY2lhbA0KDQpFbCBmaWx0cm8gSFAgc2UgYXBsaWNhIGFsIGxvZ2FyaXRtbyBkZWwgUElCIHJlYWwgYWp1c3RhZG8gY29uICoqzrsgPSAxLDYwMCoqLiBTZSBkZWZpbmUgXChZX3ReKj1cZXhwKFx0YXVfdClcKSB5IGxhIGJyZWNoYSBjb21vIFwoMTAwKFlfdC9ZX3ReKi0xKVwpLiBFbCBwb3RlbmNpYWwgZXMgdW5hIGFwcm94aW1hY2nDs24gZXN0YWTDrXN0aWNhLCBubyB1bmEgbWVkaWNpw7NuIGRlIGNhcGFjaWRhZCBiYXNhZGEgZW4gY2FwaXRhbCB5IHRyYWJham8uIEVuIGxvcyBncsOhZmljb3Mgc2UgZXhwcmVzYSBjb21vIMOtbmRpY2UgY29uIHJlZmVyZW5jaWEgMjAxNCB5IHNlIHJlY29ub2NlIGxhIHNlbnNpYmlsaWRhZCBhbCBleHRyZW1vIGZpbmFsLg0KDQpgYGB7ciBwb3RlbmNpYWx9DQpocCA8LSBocGZpbHRlcih0cyhsb2cocGliKSwgc3RhcnQgPSBjKGluaSwxKSwgZnJlcXVlbmN5ID0gNCksIGZyZXEgPSAxNjAwLCB0eXBlID0gImxhbWJkYSIpDQpwb3QgPC0gYXMubnVtZXJpYyhleHAoaHAkdHJlbmQpKQ0KZ2FwIDwtIDEwMCAqIChwaWIgLyBwb3QgLSAxKQ0KZCRwb3QgPC0gcG90OyBkJGdhcCA8LSBnYXANCmBgYA0KDQojIFJlc3VsdGFkb3MNCg0KIyMgRXN0cnVjdHVyYSBkZSBsYXJnbyBwbGF6bw0KDQpgYGB7ciByZXN1bWVuX3Jlc3VsdGFkb3MsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KaTAgPC0gMTo0OyBpMSA8LSAobnJvdyhkKS0zKTpucm93KGQpDQpjb21wIDwtIGRhdGEuZnJhbWUoU2VjdG9yID0gbm9tX3NlYywNCiAgICAgICAgICAgICAgICAgICBJbmljaW8gPSBjb2xNZWFucyhwYXJ0W2kwLF0pLCBGaW5hbCA9IGNvbE1lYW5zKHBhcnRbaTEsXSkpDQpjb21wJENhbWJpb19wcCA8LSBjb21wJEZpbmFsIC0gY29tcCRJbmljaW8NCnRhYmxhKGNvbXAsIHBhc3RlMCgiQ3VhZHJvIDQuIFBhcnRpY2lwYWNpw7NuIG1lZGlhOiAiLHBlclsxXSwi4oCTIixwZXJbNF0sIiBmcmVudGUgYSAiLHBlcltucm93KGQpLTNdLCLigJMiLHRhaWwocGVyLDEpKSwgMikNCmBgYA0KDQpMYSBwYXJ0aWNpcGFjacOzbiBhZ3JvcGVjdWFyaWEgcGFzYSBkZSAqKmByIGZtdChjb21wJEluaWNpb1sxXSlgICUqKiBhICoqYHIgZm10KGNvbXAkRmluYWxbMV0pYCAlKiosIHVuYSB2YXJpYWNpw7NuIGRlICoqYHIgZm10KGNvbXAkQ2FtYmlvX3BwWzFdKWAgcHVudG9zIHBvcmNlbnR1YWxlcyoqLiBMb3Mgc2VydmljaW9zIHJlcHJlc2VudGFuICoqYHIgZm10KGNvbXAkRmluYWxbM10pYCAlKiogZW4gbGFzIMO6bHRpbWFzIGN1YXRybyBvYnNlcnZhY2lvbmVzLiBFc3RhIGNvbXBhcmFjacOzbiB1dGlsaXphIHZlbnRhbmFzIGRlIGN1YXRybyB0cmltZXN0cmVzIGFqdXN0YWRvcyB5IG5vIGF0cmlidXllIGxhcyBkaWZlcmVuY2lhcyBhIHVuIMO6bmljbyBhY29udGVjaW1pZW50by4NCg0KYGBge3IgZ3JhZmljb19lc3RydWN0dXJhLCBmaWcuY2FwPSJGaWd1cmEgMS4gUGFydGljaXBhY2lvbmVzIGRlIGxvcyB0cmVzIHNlY3RvcmVzIGVuIGVsIHZhbG9yIGFncmVnYWRvIGFqdXN0YWRvLiJ9DQpnZ3Bsb3QobGFyZ2EocGFydCwgZmVjaGEpLCBhZXMoZmVjaGEsIHZhbG9yLCBjb2xvciA9IHNlcmllKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMC44NSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sKSArDQogIGxhYnModGl0bGUgPSAiRWwgcGVzbyBkZSBsb3MgdHJlcyBzZWN0b3JlcyIsIHggPSBOVUxMLCB5ID0gIiUgZGVsIHZhbG9yIGFncmVnYWRvIiwgY2FwdGlvbiA9IGZ1ZW50ZSkNCmBgYA0KDQojIyBDcmVjaW1pZW50byByZWFsIGUgaW52ZXJzacOzbg0KDQpgYGB7ciBncmFmaWNvX2NyZWNpbWllbnRvLCBmaWcuY2FwPSJGaWd1cmEgMi4gQ3JlY2ltaWVudG8gdHJpbWVzdHJhbCBsb2dhcsOtdG1pY28gZGVsIFBJQiByZWFsIGRlc2VzdGFjaW9uYWxpemFkby4ifQ0KZ2dwbG90KGQsIGFlcyhmZWNoYSwgZykpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGNvbG9yPSIjYjZhOGEwIikgKw0KICBnZW9tX2NvbChmaWxsPSIjNzYyNDQwIiwgd2lkdGg9NjUpICsNCiAgbGFicyh0aXRsZT0iQ3JlY2ltaWVudG8gcmVhbCB5IHBlcnNpc3RlbmNpYSBkZSBsb3MgY2hvcXVlcyIsIHg9TlVMTCwNCiAgICAgICB5PSIlIHJlc3BlY3RvIGRlbCB0cmltZXN0cmUgYW50ZXJpb3IiLCBjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpgYGB7ciBncmFmaWNvX2ludmVyc2lvbiwgZmlnLmNhcD0iRmlndXJhIDMuIEZvcm1hY2nDs24gYnJ1dGEgZGUgY2FwaXRhbCBmaWpvIGNvbW8gcG9yY2VudGFqZSBkZWwgUElCIG5vbWluYWwgYWp1c3RhZG8uIn0NCmdncGxvdChkLCBhZXMoZmVjaGEsIGludikpICsgZ2VvbV9saW5lKGNvbG9yPSIjMjQ2Nzc5IiwgbGluZXdpZHRoPTAuOSkgKw0KICBsYWJzKHRpdGxlPSJBY3VtdWxhY2nDs24gZGUgY2FwaXRhbCBmaWpvIiwgeD1OVUxMLCB5PSJGQktGIC8gUElCICglKSIsIGNhcHRpb249ZnVlbnRlKQ0KYGBgDQoNCkxhIHRhc2EgZGUgaW52ZXJzacOzbiBtZWRpYSBlcyAqKmByIGZtdChtZWFuKGludltpMF0pKWAgJSoqIGFsIGluaWNpbyB5ICoqYHIgZm10KG1lYW4oaW52W2kxXSkpYCAlKiogYWwgZmluYWwuIExhIHRhc2EgbWlkZSBsYSBwcm9wb3JjacOzbiBkZXN0aW5hZGEgYSBjYXBpdGFsIGZpam8sIHBlcm8gbm8gc3UgZWZpY2llbmNpYSwgdXRpbGl6YWNpw7NuLCBjb21wb3NpY2nDs24gdGVjbm9sw7NnaWNhIG5pIGFwb3J0ZSBjYXVzYWwgYWwgY3JlY2ltaWVudG8uDQoNCiMjIENvbmNlbnRyYWNpw7NuLCBOQVYgeSBMaWxpZW4NCg0KYGBge3IgZ3JhZmljb19oaGksIGZpZy5jYXA9IkZpZ3VyYSA0LiBDb25jZW50cmFjacOzbiBkZWwgdmFsb3IgYWdyZWdhZG8gZW4gdHJlcyBzZWN0b3Jlcy4ifQ0KZ2dwbG90KGQsIGFlcyhmZWNoYSwgaGhpKSkgKyBnZW9tX2xpbmUoY29sb3I9IiNiNzdiMjYiLCBsaW5ld2lkdGg9MC45KSArDQogIGxhYnModGl0bGU9IkNvbmNlbnRyYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmEgcHJvZHVjdGl2YSIsIHg9TlVMTCwgeT0iSEhJICh0cmVzIHNlY3RvcmVzKSIsIGNhcHRpb249ZnVlbnRlKQ0KYGBgDQoNCkVsIEhISSBwcm9tZWRpbyBjYW1iaWEgZGUgKipgciBmbXQobWVhbihoaGlbaTBdKSwzKWAqKiBhICoqYHIgZm10KG1lYW4oaGhpW2kxXSksMylgKiouIGByIGlmKG1lYW4oaGhpW2kxXSkgPiBtZWFuKGhoaVtpMF0pKSAiRWwgYXVtZW50byBkZXNjcmliZSBtYXlvciBjb25jZW50cmFjacOzbiBlbnRyZSBsb3MgdHJlcyBncmFuZGVzIGdydXBvcy4iIGVsc2UgIkxhIGRpc21pbnVjacOzbiBkZXNjcmliZSB1bmEgZGlzdHJpYnVjacOzbiBtw6FzIGVxdWlsaWJyYWRhIGVudHJlIGxvcyB0cmVzIGdyYW5kZXMgZ3J1cG9zLiJgIEVzdGUgaW5kaWNhZG9yIHB1ZWRlIG9jdWx0YXIgZGl2ZXJzaWZpY2FjacOzbiBkZW50cm8gZGUgY2FkYSBncnVwbyB5IG5vIG1pZGUgY29uY2VudHJhY2nDs24gZW1wcmVzYXJpYWwuDQoNCmBgYHtyIGdyYWZpY29faW5kaWNlcywgZmlnLmNhcD0iRmlndXJhIDUuIEludGVuc2lkYWQgZGUgbGEgdHJhbnNmb3JtYWNpw7NuIHkgZGlzcGVyc2nDs24gZGUgY3JlY2ltaWVudG9zOyBlc2NhbGFzIGRpc3RpbnRhcy4ifQ0KaW5kIDwtIGRhdGEuZnJhbWUoZmVjaGE9cmVwKGZlY2hhLDIpLCBzZXJpZT1yZXAoYygiTkFWIGEgdW4gYcOxbyIsICJMaWxpZW4gZGUgcHJvZHVjY2nDs24iKSxlYWNoPW5yb3coZCkpLCB2YWxvcj1jKG5hdixsaWwpKQ0KZ2dwbG90KGluZCwgYWVzKGZlY2hhLHZhbG9yKSkgKyBnZW9tX2xpbmUoY29sb3I9IiM3NjI0NDAiLCBsaW5ld2lkdGg9MC44NSkgKw0KICBmYWNldF93cmFwKH5zZXJpZSwgbmNvbD0xLCBzY2FsZXM9ImZyZWVfeSIpICsNCiAgbGFicyh0aXRsZT0iRG9zIGRpbWVuc2lvbmVzIGRlbCBjYW1iaW8gZXN0cnVjdHVyYWwiLCB4PU5VTEwsIHk9IlB1bnRvcyBwb3JjZW50dWFsZXMiLCBjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpFbCBtw6F4aW1vIGRlIE5BViBlcyAqKmByIGZtdChtYXgobmF2LG5hLnJtPVRSVUUpKWAgcHVudG9zKiosIGVuICoqYHIgcGVyW3doaWNoLm1heChyZXBsYWNlKG5hdixpcy5uYShuYXYpLC1JbmYpKV1gKiouIEVsIG3DoXhpbW8gZGUgTGlsaWVuIGVzICoqYHIgZm10KG1heChsaWwsbmEucm09VFJVRSkpYCoqLCBlbiAqKmByIHBlclt3aGljaC5tYXgocmVwbGFjZShsaWwsaXMubmEobGlsKSwtSW5mKSldYCoqLiBTb24gaW5kaWNhZG9yZXMgZGUgbWFnbml0dWQgeSBkaXNwZXJzacOzbiwgbm8gZGUgYmllbmVzdGFyIG5pIGRlIHJlYXNpZ25hY2nDs24gb2JzZXJ2YWRhIGRlIHRyYWJhamFkb3Jlcy4NCg0KIyMgUm9idXN0ZXogZGUgbGFzIHBvbmRlcmFjaW9uZXMgeSBkZSBsYSBhZ3JlZ2FjacOzbg0KDQpgYGB7ciB0YWJsYV9wZXNvcywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYShkYXRhLmZyYW1lKFNlY3Rvcj1ub21fc2VjLCBJZ3VhbGVzPXJlcCgxLzMsMyksIFBDQT1hcy5udW1lcmljKHBlc29zKSksDQogICAgICAiQ3VhZHJvIDUuIFBlc29zIGRlbCDDrW5kaWNlIGF1eGlsaWFyIGRlIGludGVuc2lkYWQiLCA0KQ0KYGBgDQoNCkxhIGNvcnJlbGFjacOzbiBkZSBsYXMgZG9zIHZlcnNpb25lcyBhdXhpbGlhcmVzIGVzICoqYHIgZm10KHJobyw0KWAqKiwgY29uIGxhIG1pc21hIG11ZXN0cmEgZGUgKipgciBucm93KHopYCB0cmltZXN0cmVzKiouIEVsIHByaW1lciBjb21wb25lbnRlIGV4cGxpY2EgKipgciBmbXQoZXhwX3BjKWAgJSoqIGRlIGxhIHZhcmlhbnphIGVzdGFuZGFyaXphZGEuIFVuYSBjb3JyZWxhY2nDs24gYWx0YSBpbmRpY2Egc2VtZWphbnphIHRlbXBvcmFsOyBubyB2YWxpZGEgY2F1c2FsaWRhZCBuaSBzdXN0aXR1eWUgbG9zIMOtbmRpY2VzIGVzcGVjw61maWNvcy4NCg0KYGBge3IgZ3JhZmljb19wY2EsIGZpZy5jYXA9IkZpZ3VyYSA2LiDDjW5kaWNlIGF1eGlsaWFyIGRlIGludGVuc2lkYWQsIHJlZXNjYWxhZG8gZGUgMCBhIDEwMCBlbiBjYWRhIHZlcnNpw7NuLiJ9DQpnZ3Bsb3QobGFyZ2EoYXMubWF0cml4KHJvYlssMjozXSksIHJvYiRmZWNoYSwgYygiUGVzb3MgaWd1YWxlcyIsIlBlc29zIFBDQSIpKSwNCiAgICAgICBhZXMoZmVjaGEsdmFsb3IsY29sb3I9c2VyaWUpKSArIGdlb21fbGluZShsaW5ld2lkdGg9MC45KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiUGVzb3MgaWd1YWxlcyI9IiM3NjI0NDAiLCJQZXNvcyBQQ0EiPSIjYjc3YjI2IikpICsNCiAgbGFicyh0aXRsZT0iU2Vuc2liaWxpZGFkIGEgbGFzIHBvbmRlcmFjaW9uZXMiLCB4PU5VTEwsIHk9IkVzY2FsYSAw4oCTMTAwIiwgY2FwdGlvbj1mdWVudGUpDQpgYGANCg0KYGBge3IgdGFibGFfcm9idXN0ZXosIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KcmhvX25hdiA8LSBjb3IobmF2LCBuYXY1LCB1c2U9ImNvbXBsZXRlLm9icyIpDQpyaG9fbGlsIDwtIGNvcihsaWwsIGxpbDE5LCB1c2U9ImNvbXBsZXRlLm9icyIpDQp0YWJsYShkYXRhLmZyYW1lKENvbXBhcmFjacOzbj1jKCJOQVYgYSA0IHkgMjAgdHJpbWVzdHJlcyIsICJMaWxpZW4gY29uIDMgZ3J1cG9zIHkgMTkgYWN0aXZpZGFkZXMiLCAiQXV4aWxpYXIgY29uIHBlc29zIGlndWFsZXMgeSBQQ0EiKSwNCiAgICAgICAgICAgICAgICAgTj1jKHN1bShjb21wbGV0ZS5jYXNlcyhuYXYsbmF2NSkpLHN1bShjb21wbGV0ZS5jYXNlcyhsaWwsbGlsMTkpKSxucm93KHopKSwNCiAgICAgICAgICAgICAgICAgQ29ycmVsYWNpw7NuPWMocmhvX25hdixyaG9fbGlsLHJobykpLCAiQ3VhZHJvIDYuIFJvYnVzdGV6IHNvYnJlIG11ZXN0cmFzIGNvbXVuZXMiLCA0KQ0KYGBgDQoNCkxhIHNlbnNpYmlsaWRhZCBkZSBOQVYgY2FtYmlhIGVsIGhvcml6b250ZSBlY29uw7NtaWNvIHkgbGEgZGUgTGlsaWVuIGNhbWJpYSBsYSBkZXNhZ3JlZ2FjacOzbiwgcG9yIGxvIHF1ZSBubyBkZWJlbiBpbnRlcnByZXRhcnNlIGNvbW8gdmVyc2lvbmVzIGlkw6ludGljYXMgY29uIGRpc3RpbnRvcyBwZXNvcy4gQ29uIHRyZXMgc2VjdG9yZXMgcHVlZGVuIGNvbXBlbnNhcnNlIG1vdmltaWVudG9zIGludGVybm9zIHF1ZSBzw60gYXBhcmVjZW4gY29uIDE5IGFjdGl2aWRhZGVzLg0KDQpMYSBjb3JyZWxhY2nDs24gZGUgKipgciBmbXQocmhvX25hdiw0KWAqKiBlbnRyZSBsb3MgZG9zIGhvcml6b250ZXMgZGUgTkFWIG11ZXN0cmEgcXVlIGVsIGRpYWduw7NzdGljbyBkZSBjb3J0byB5IG1lZGlhbm8gcGxhem8gZGVwZW5kZSBkZWwgcGVyw61vZG8gZGUgY29tcGFyYWNpw7NuLiBQb3Igc3UgcGFydGUsIGxhIGNvcnJlbGFjacOzbiBkZSAqKmByIGZtdChyaG9fbGlsLDQpYCoqIGVudHJlIExpbGllbiBkZSB0cmVzIHkgMTkgYWN0aXZpZGFkZXMgaW5kaWNhIHNlbWVqYW56YSBwYXJjaWFsLCBjb24gaW5mb3JtYWNpw7NuIGludGVybmEgcXVlIHNlIHBpZXJkZSBhbCBhZ3J1cGFyLiBMYSBjb2luY2lkZW5jaWEgZGUgbG9zIHBlc29zIGF1eGlsaWFyZXMsIHBvciB0YW50bywgbm8gZWxpbWluYSBsYSBzZW5zaWJpbGlkYWQgYWwgaG9yaXpvbnRlIG8gYSBsYSBjbGFzaWZpY2FjacOzbi4NCg0KIyMgUmHDrXogdW5pdGFyaWEgeSBwZXJzaXN0ZW5jaWENCg0KYGBge3IgdGFibGFfcmFpY2VzLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnRhYmxhKHRlc3RbdGVzdCRGb3JtYT09Ik5pdmVsIiwgYygiU2VyaWUiLCJQcnVlYmEiLCJOIiwiTW9kZWxvIiwiUmV6YWdvcyIsIkVzdGFkw61zdGljbyIsIkNyw610aWNvXzUiLCJSZWNoYXphX251bGEiLCJRdWllYnJlIildLA0KICAgICAgIkN1YWRybyA3LiBQcnVlYmFzIGVuIG5pdmVsZXM7IGRlY2lzaW9uZXMgYWwgNSAlIiwgMykNCmBgYA0KDQoqKkxlY3R1cmEgZGVsIGN1YWRyby4qKiBFbiBBREYgeSBaaXZvdC1BbmRyZXdzLCByZWNoYXphciBsYSBudWxhIGZhdm9yZWNlIGVzdGFjaW9uYXJpZWRhZCBiYWpvIGVsIG1vZGVsbyBlc3BlY2lmaWNhZG8uIEVuIEtQU1MsIHJlY2hhemFyIGN1ZXN0aW9uYSBsYSBlc3RhY2lvbmFyaWVkYWQuIExhIGZlY2hhIGRlIFppdm90LUFuZHJld3MgZXMgdW4gY2FuZGlkYXRvIGVuZMOzZ2VubyBkZWwgY29udHJhc3RlIGRlIHJhw616IHVuaXRhcmlhIHkgbm8gZXF1aXZhbGUgYWwgZmVjaGFkbyBkZSBCYWnigJNQZXJyb24uIExhcyBwcmltZXJhcyBkaWZlcmVuY2lhcyB5IGxvcyByZXN1bHRhZG9zIGNvbXBsZXRvcyBzZSBjb25zZXJ2YW4gZW4gZWwgYW5leG8uDQoNCkVuIGVzdGEgZWplY3VjacOzbiwgKiplbCBsb2dhcml0bW8gZGVsIFBJQiBwcmVzZW50YSBldmlkZW5jaWEgbWl4dGEqKjogQURGIHJlY2hhemEgcmHDrXogdW5pdGFyaWEsIG1pZW50cmFzIEtQU1MgcmVjaGF6YSBlc3RhY2lvbmFyaWVkYWQgYWxyZWRlZG9yIGRlIHVuYSB0ZW5kZW5jaWEgbGluZWFsIHBvciB1biBtYXJnZW4gcGVxdWXDsW8gKDAuMTQ3IGZyZW50ZSBhIDAuMTQ2KS4gWml2b3QtQW5kcmV3cyByZWNoYXphIHJhw616IHVuaXRhcmlhIHBlcm1pdGllbmRvIHVuIHF1aWVicmUgZW4gMjAyMCBJLiBObyBzZSBhc2lnbmEgYXV0b23DoXRpY2FtZW50ZSB1biBvcmRlbiBkZSBpbnRlZ3JhY2nDs24gYWwgUElCIGEgcGFydGlyIGRlIHVuIHNvbG8gY29udHJhc3RlLg0KDQpQYXJhICoqTkFWKiosIEFERiB5IEtQU1Mgc29uIGNvbXBhdGlibGVzIGNvbiBlc3RhY2lvbmFyaWVkYWQgZW4gbml2ZWwgYWwgNSAlLCBwZXJvIFppdm90LUFuZHJld3Mgbm8gcmVjaGF6YSByYcOteiB1bml0YXJpYS4gTGEgY2VyY2Fuw61hIGRlbCBBREYgYSBzdSB2YWxvciBjcsOtdGljbyB5IGxhIGRpc2NyZXBhbmNpYSBlbnRyZSBwcnVlYmFzIGFjb25zZWphbiBjYXV0ZWxhLiBFbiAqKkxpbGllbioqLCBsYXMgdHJlcyBwcnVlYmFzIHNvbiBjb21wYXRpYmxlcyBjb24gZXN0YWNpb25hcmllZGFkIGJham8gc3VzIGVzcGVjaWZpY2FjaW9uZXMuIFVuIMOtbmRpY2UgZXN0YWNpb25hcmlvIHB1ZWRlIHByZXNlbnRhciBlcGlzb2Rpb3MgZGUgZWxldmFkYSBkaXNwZXJzacOzbiBzaW4gcXVlIGVzdG9zIGNvbnN0aXR1eWFuIHVuYSBudWV2YSB0ZW5kZW5jaWEgcGVybWFuZW50ZS4NCg0KIyMgUXVpZWJyZXMgZGVsIMOtbmRpY2UgcHJpbmNpcGFsDQoNCmBgYHtyIHRhYmxhc19xdWllYnJlcywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYShkYXRhLmZyYW1lKFF1aWVicmVzPTA6KGxlbmd0aChiaWMpLTEpLCBCSUM9YmljKSwNCiAgICAgICJDdWFkcm8gOC4gU2VsZWNjacOzbiBkZWwgbsO6bWVybyBkZSBxdWllYnJlcyBkZWwgTkFWIiwgMikNCmlmIChtID4gMCkgew0KICBpZHggPC0gZnVuY3Rpb24oeCkgYiRwZXJbcG1heCgxLHBtaW4obnJvdyhiKSxyb3VuZCh4KSkpXQ0KICBmZWNoYXNfYnAgPC0gZGF0YS5mcmFtZShGaW5fZGVsX3LDqWdpbWVuPWIkcGVyW2NvcnRlc10sIEluaWNpb19zaWd1aWVudGU9YiRwZXJbY29ydGVzKzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBMw61taXRlX2luZmVyaW9yPWlkeChjaVssMV0pLCBMw61taXRlX3N1cGVyaW9yPWlkeChjaVssM10pKQ0KICB0YWJsYShmZWNoYXNfYnAsIkN1YWRybyA5LiBGZWNoYXMgZXN0aW1hZGFzIGUgaW50ZXJ2YWxvcyBhcHJveGltYWRvcyBkZWwgOTUgJSIpDQp9IGVsc2Ugew0KICBmZWNoYXNfYnAgPC0gZGF0YS5mcmFtZShSZXN1bHRhZG89IkJJQyBzZWxlY2Npb25hIGNlcm8gcXVpZWJyZXMgZW4gZWwgbW9kZWxvIGRlIG1lZGlhcyIpDQogIHRhYmxhKGZlY2hhc19icCwiQ3VhZHJvIDkuIFJlc3VsdGFkbyBkZWwgZmVjaGFkbyIpDQp9DQp0YWJsYShkYXRhLmZyYW1lKFBydWViYT1jKCJzdXBGIGNvbiBjb3ZhcmlhbnphIEhBQyIsICJManVuZy1Cb3ggZGUgcmVzaWR1b3MsIDggcmV6YWdvcyIpLA0KICAgICAgICAgICAgICAgICBFc3RhZMOtc3RpY289Yyhhcy5udW1lcmljKHN1cCRzdGF0aXN0aWMpLGFzLm51bWVyaWMobGIkc3RhdGlzdGljKSksDQogICAgICAgICAgICAgICAgIHBfdmFsb3I9YyhzdXAkcC52YWx1ZSxsYiRwLnZhbHVlKSksICJDdWFkcm8gMTAuIEVzdGFiaWxpZGFkIHkgZGlhZ27Ds3N0aWNvIiwgNCkNCmBgYA0KDQpCSUMgc2VsZWNjaW9uYSAqKmByIG1gIHF1aWVicmUocykqKi4gTGEgcHJ1ZWJhIHN1cEYgYXJyb2phICoqcCA9IGByIGZtdChzdXAkcC52YWx1ZSw0KWAqKjogYHIgaWYoc3VwJHAudmFsdWU8MC4wNSkgInNlIHJlY2hhemEgbGEgZXN0YWJpbGlkYWQgYWwgNSAlIGJham8gZXN0ZSBjb250cmFzdGUuIiBlbHNlICJubyBzZSByZWNoYXphIGxhIGVzdGFiaWxpZGFkIGFsIDUgJSBiYWpvIGVzdGUgY29udHJhc3RlLiJgIExhIGZlY2hhIHF1ZSBtYXJjYSBgYnJlYWtwb2ludHNgIGVzIGxhIMO6bHRpbWEgb2JzZXJ2YWNpw7NuIGRlbCByw6lnaW1lbiBhbnRlcmlvcjsgZWwgY3VhZHJvIHRhbWJpw6luIG11ZXN0cmEgbGEgcHJpbWVyYSBkZWwgc2lndWllbnRlLg0KDQpFbiBsYSBtdWVzdHJhIHJlY2liaWRhLCBsYSBzZWxlY2Npw7NuIGRlIGNlcm8gcXVpZWJyZXMgc2lnbmlmaWNhIHF1ZSAqKm5vIHNlIGlkZW50aWZpY2FuIGNhbWJpb3MgcGVyc2lzdGVudGVzIGRlIGxhIG1lZGlhIGRlIE5BViBjb24gZXN0ZSBtb2RlbG8geSBjcml0ZXJpbyoqLiBObyBzaWduaWZpY2EgcXVlIGxhcyBwYXJ0aWNpcGFjaW9uZXMgc2VjdG9yaWFsZXMgcGVybWFuZXpjYW4gY29uc3RhbnRlcyBuaSBxdWUgbGFzIGNyaXNpcyBjYXJlemNhbiBkZSBlZmVjdG9zLiBMYSBjdXJ2YSBkZWwgw61uZGljZSBwdWVkZSByZWdpc3RyYXIgbW92aW1pZW50b3MgZnVlcnRlcyB5IHRlbXBvcmFsZXMgZGVudHJvIGRlIHVuIG1pc21vIHLDqWdpbWVuIGRlIG1lZGlhLg0KDQpgYGB7ciBncmFmaWNvX3F1aWVicmVzLCBmaWcuY2FwPSJGaWd1cmEgNy4gTkFWIHkgbWVkaWFzIGRlIGxvcyByZWfDrW1lbmVzIHNlbGVjY2lvbmFkb3MgcG9yIEJJQy4ifQ0KZ2dwbG90KGIsYWVzKGZlY2hhLG5hdikpICsgZ2VvbV9saW5lKGNvbG9yPSIjNzYyNDQwIixsaW5ld2lkdGg9MC43NSkgKw0KICBnZW9tX3N0ZXAoYWVzKHk9bWVkaWEpLGNvbG9yPSIjYjc3YjI2IixsaW5ld2lkdGg9MSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YXMubnVtZXJpYyhiJGZlY2hhW2NvcnRlc10pLGxpbmV0eXBlPSJkYXNoZWQiLGNvbG9yPSIjNTI2Mjc0IikgKw0KICBsYWJzKHRpdGxlPSJFc3RhYmlsaWRhZCBkZSBsYSBpbnRlbnNpZGFkIGRlbCBjYW1iaW8iLHg9TlVMTCx5PSJOQVYgYSBjdWF0cm8gdHJpbWVzdHJlcyIsY2FwdGlvbj1mdWVudGUpDQpgYGANCg0KTGEgdmFyaWFudGUgQVIoMSkgc2VsZWNjaW9uYSAqKmByIG1hYCBxdWllYnJlKHMpKiosIGNvbiBmaW5lcyBkZSByw6lnaW1lbiBlbiAqKmByIGlmKGxlbmd0aChjYSkpIHBhc3RlKGJhJHBlcltjYV0sY29sbGFwc2U9IiwgIikgZWxzZSAibmluZ3VubyJgKiouIGByIGlmKGxiJHAudmFsdWU8MC4wNSkgIkVsIGRpYWduw7NzdGljbyBkZXRlY3RhIGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWw6IGxhcyB2ZW50YW5hcyBzdXBlcnB1ZXN0YXMgeSBsYSBkaW7DoW1pY2EgZGVsIMOtbmRpY2UgbGltaXRhbiBsYSBwcmVjaXNpw7NuIGRlbCBtb2RlbG8gZGUgbWVkaWFzLiBTZSBpbnRlcnByZXRhIGVsIGZlY2hhZG8ganVudG8gY29uIGxhIHNlbnNpYmlsaWRhZCBBUigxKSwgc2luIHRyYXRhciBjYWRhIGZlY2hhIGNvbW8gdW5hIGNlcnRlemEuIiBlbHNlICJFbCBkaWFnbsOzc3RpY28gbm8gcmVjaGF6YSBhdXNlbmNpYSBkZSBhdXRvY29ycmVsYWNpw7NuIGhhc3RhIG9jaG8gcmV6YWdvczsgZXN0byBubyBlbGltaW5hIG90cmFzIGZvcm1hcyBkZSBlc3BlY2lmaWNhY2nDs24gaW1wZXJmZWN0YS4iYA0KDQpgYGB7ciB0YWJsYV9oaXN0b3JpYSwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYShoaXN0LCAiQ3VhZHJvIDExLiBDYW1iaW8gZGUgbWVkaWEgZGVsIE5BViBlbiBmZWNoYXMgaGlzdMOzcmljYXMgcHJlZmlqYWRhczsgZXJyb3JlcyBIQUMgeSBhanVzdGUgSG9sbSIsIDQpDQpgYGANCg0KRXN0b3MgY29udHJhc3RlcyBjb21wYXJhbiBtZWRpYXMgYW50ZXJpb3JlcyB5IHBvc3RlcmlvcmVzIGEgY2FkYSBmZWNoYTsgbm8gc29uIGVzdGltYWNpb25lcyBjYXVzYWxlcyBuaSBwcnVlYmFzIGRlIHVuIGVmZWN0byB0cmFuc2l0b3JpbyBkZSB1biBzb2xvIHRyaW1lc3RyZS4gUGFyYSAyMDAxIHNlIGluZm9ybWEgKipubyBlc3RpbWFibGU6IGZ1ZXJhIGRlIGxhIG11ZXN0cmEqKi4gTG9zIGNvbnRyYXN0ZXMgZGUgMjAwOCBJViB5IDIwMDkgSSByZXByZXNlbnRhbiBkb3MgcHVudG9zIHByZWZpamFkb3MgZGUgbGEgbWlzbWEgY3Jpc2lzOyBIb2xtIGNvcnJpZ2UgbG9zIHRyZXMgY29udHJhc3RlcyBkZSBlc3RlIGN1YWRyby4NCg0KTG9zIHRyZXMgY29udHJhc3RlcyBwcmVmaWphZG9zICoqbm8gcmVjaGF6YW4gaWd1YWxkYWQgZGUgbWVkaWFzIGFsIDUgJSoqLCBpbmNsdXNvIGFudGVzIGRlIGxhIGNvcnJlY2Npw7NuIG3Dumx0aXBsZS4gRXN0byBlcyBjb21wYXRpYmxlIGNvbiB1biBjaG9xdWUgaW50ZW5zbyBwZXJvIHRyYW5zaXRvcmlvIGVuIDIwMjAgSUksIHRyaW1lc3RyZSBlbiBxdWUgc2Ugb2JzZXJ2YW4gbG9zIG3DoXhpbW9zIGRlIE5BViB5IExpbGllbiB5IGxhIG1lbm9yIGJyZWNoYSBIUC4gTGEgZmFsdGEgZGUgcmVjaGF6byBubyBkZW11ZXN0cmEgaWd1YWxkYWQgZXhhY3RhIGRlIGxvcyByZWfDrW1lbmVzLg0KDQojIyBQcm9kdWN0byBwb3RlbmNpYWwgeSBicmVjaGENCg0KYGBge3IgZ3JhZmljb19wb3RlbmNpYWwsIGZpZy5jYXA9IkZpZ3VyYSA4LiBQSUIgcmVhbCBhanVzdGFkbyB5IHRlbmRlbmNpYSBIUDsgw61uZGljZSByZWZlcmlkbyBhIDIwMTQuIn0NCmdncGxvdChsYXJnYShjYmluZChPYnNlcnZhZG89cGliLCBQb3RlbmNpYWw9cG90KSxmZWNoYSksYWVzKGZlY2hhLHZhbG9yLGNvbG9yPXNlcmllKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoPTAuOSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIk9ic2VydmFkbyI9IiM3NjI0NDAiLCJQb3RlbmNpYWwiPSIjYjc3YjI2IikpICsNCiAgbGFicyh0aXRsZT0iUHJvZHVjY2nDs24gb2JzZXJ2YWRhIHkgdGVuZGVuY2lhIGRlIGxhcmdvIHBsYXpvIix4PU5VTEwseT0iw41uZGljZSBkZSB2b2x1bWVuIixjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpgYGB7ciBncmFmaWNvX2JyZWNoYSwgZmlnLmNhcD0iRmlndXJhIDkuIEJyZWNoYSBwb3JjZW50dWFsIHJlc3BlY3RvIGRlbCBwb3RlbmNpYWwgSFAsIM67ID0gMTYwMC4ifQ0KZ2dwbG90KGQsYWVzKGZlY2hhLGdhcCkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsY29sb3I9IiM5MTgwNzciKSArDQogIGdlb21fY29sKGFlcyhmaWxsPWdhcD49MCksd2lkdGg9NjUsc2hvdy5sZWdlbmQ9RkFMU0UpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIkZBTFNFIj0iIzc2MjQ0MCIsIlRSVUUiPSIjMjQ2Nzc5IikpICsNCiAgbGFicyh0aXRsZT0iRGVzdmlhY2lvbmVzIHJlc3BlY3RvIGRlIGxhIHRlbmRlbmNpYSIseD1OVUxMLHk9IkJyZWNoYSBkZWwgcHJvZHVjdG8gKCUpIixjYXB0aW9uPWZ1ZW50ZSkNCmBgYA0KDQpMYSBtZW5vciBicmVjaGEgc2UgdWJpY2EgZW4gKipgciBwZXJbd2hpY2gubWluKGdhcCldYCoqLCBjb24gKipgciBmbXQobWluKGdhcCkpYCAlKiouIExhIMO6bHRpbWEgZXMgKipgciBmbXQodGFpbChnYXAsMSkpYCAlKiouIFVuYSBicmVjaGEgcG9zaXRpdmEgc2lnbmlmaWNhIHByb2R1Y2Npw7NuIHBvciBlbmNpbWEgZGUgbGEgdGVuZGVuY2lhIGVzdGltYWRhOyB1bmEgbmVnYXRpdmEsIHBvciBkZWJham8uIEVsIGRhdG8gZmluYWwgZXMgZXNwZWNpYWxtZW50ZSBzZW5zaWJsZSBhIG51ZXZhcyBvYnNlcnZhY2lvbmVzIHkgcmV2aXNpb25lcywgeSBubyBjb25zdGl0dXllIHVuYSBtZWRpZGEgZXhhY3RhIGRlIGhvbGd1cmEgbmkgdW4gcHJvbsOzc3RpY28uDQoNCiMgRGlzY3VzacOzbiB5IGNvbmNsdXNpb25lcw0KDQojIyBRdcOpIGNhbWJpw7MgZW4gbGEgZXN0cnVjdHVyYQ0KDQpFbCBjb250cmFzdGUgZGVzY3JpcHRpdm8gZGUgbGEgaGlww7N0ZXNpcyBgciBpZihjb21wJENhbWJpb19wcFsxXSA8IDAgJiYgd2hpY2gubWF4KGNvbXAkRmluYWwpPT0zKSAiZXMgY29tcGF0aWJsZSBjb24gdW5hIG1lbm9yIHBhcnRpY2lwYWNpw7NuIGFncm9wZWN1YXJpYSB5IGNvbiBlbCBwcmVkb21pbmlvIGRlIGxvcyBzZXJ2aWNpb3MgZW4gbGEgdmVudGFuYSBmaW5hbC4iIGVsc2UgIm5vIHJlc3BhbGRhIGNvbmp1bnRhbWVudGUgc3VzIGRvcyBwYXJ0ZXM6IGVzIG5lY2VzYXJpbyBjb25zZXJ2YXIgbGEgZGlmZXJlbmNpYSBlbnRyZSBsYSB0cmF5ZWN0b3JpYSBhZ3JvcGVjdWFyaWEgeSBlbCBwZXNvIGRlIGxvcyBzZXJ2aWNpb3MuImAgTGEgY29tcGFyYWNpw7NuIGRlIGV4dHJlbW9zIG5vIGltcGxpY2EgcXVlIGVsIGNhbWJpbyBoYXlhIHNpZG8gdW5pZm9ybWUuIExhIHRyYXllY3RvcmlhIGNvbXBsZXRhIHkgTkFWIHBlcm1pdGVuIGlkZW50aWZpY2FyIGVwaXNvZGlvcyBkZSBhdmFuY2UgeSByZXZlcnNpw7NuLg0KDQpMYSBwYXJ0aWNpcGFjacOzbiBzZSBtaWRlIGEgcHJlY2lvcyBjb3JyaWVudGVzLiBQb3IgZXNvIGNvbWJpbmEgY2FtYmlvcyBkZSBjYW50aWRhZGVzIHkgcHJlY2lvcyByZWxhdGl2b3MsIHkgbm8gaWRlbnRpZmljYSBwb3Igc8OtIHNvbGEgdW5hIHRyYW5zZmVyZW5jaWEgZsOtc2ljYSBkZSByZWN1cnNvcy4gTG9zIGNyZWNpbWllbnRvcyBkZSB2b2x1bWVuIHkgTGlsaWVuIGFwb3J0YW4gb3RyYSBwZXJzcGVjdGl2YS4gTGEgZGVzYWdyZWdhY2nDs24gZGUgdHJlcyBzZWN0b3JlcyBmYWNpbGl0YSBjb211bmljYXIgZWwgcGF0csOzbiBnZW5lcmFsLCBwZXJvIGFncnVwYSBhY3RpdmlkYWRlcyBjb24gcHJvZHVjdGl2aWRhZGVzIHkgdGVjbm9sb2fDrWFzIGRpc3RpbnRhcy4NCg0KIyMgQ8OzbW8gaW50ZXJwcmV0YXIgbG9zIGNob3F1ZXMgeSBsYSBwZXJzaXN0ZW5jaWENCg0KTGEgY3Jpc2lzIGRlIDIwMDjigJMyMDA5IHkgbGEgcGFuZGVtaWEgc2UgY29udHJhc3RhbiBjb24gZmVjaGFzIHByZWZpamFkYXMgeSBjb24gdW4gZmVjaGFkbyBlbmTDs2dlbm8uIExhIGNvaW5jaWRlbmNpYSBkZSB1biBlcGlzb2RpbyBlbGV2YWRvIGRlIE5BViBvIExpbGllbiBjb24gdW5hIGNyaXNpcyBlcyBldmlkZW5jaWEgZGVzY3JpcHRpdmEgZGUgaGV0ZXJvZ2VuZWlkYWQgbyByZWFzaWduYWNpw7NuLCBubyB1bmEgaWRlbnRpZmljYWNpw7NuIGNhdXNhbC4gVW4gY2hvcXVlIHRyYW5zaXRvcmlvIHB1ZWRlIGVsZXZhciBsYSBkaXNwZXJzacOzbiBzaW4gY29uc3RpdHVpciB1biBudWV2byByw6lnaW1lbiBwZXJtYW5lbnRlLiBQb3IgZXN0YSByYXrDs24gc2UgY29uc2lkZXJhbiBCSUMsIHN1cEYsIGF1dG9jb3JyZWxhY2nDs24geSBzZW5zaWJpbGlkYWQgQVIoMSkgY29uanVudGFtZW50ZS4NCg0KRW4gY29uY3JldG8sIGVsIGVwaXNvZGlvIGRlIDIwMjAgSUkgZGVzdGFjYSBlbiBkaXNwZXJzacOzbiB5IGJyZWNoYSwgcGVybyBCSUMgc2VsZWNjaW9uYSBjZXJvIHF1aWVicmVzIGRlIG1lZGlhIHRhbnRvIGVuIGVsIG1vZGVsbyBiw6FzaWNvIGNvbW8gZW4gbGEgc2Vuc2liaWxpZGFkIEFSKDEpOyBzdXBGIHRhbXBvY28gcmVjaGF6YSBhbCA1ICUuIEhheSBldmlkZW5jaWEgZGVzY3JpcHRpdmEgZGUgdW4gY2hvcXVlIGV4Y2VwY2lvbmFsLCBqdW50byBjb24gZXZpZGVuY2lhIGluc3VmaWNpZW50ZSBkZSB1biBjYW1iaW8gcGVybWFuZW50ZSBlbiBsYSBtZWRpYSBkZSBOQVYuIExhIGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWwgZGV0ZWN0YWRhIGxpbWl0YSBsYSBwcmVjaXNpw7NuIGRlbCBtb2RlbG8gYsOhc2ljbyB5IGZvcm1hIHBhcnRlIGRlIGVzdGEgaW50ZXJwcmV0YWNpw7NuLg0KDQpMYSBkb2xhcml6YWNpw7NuIGRlIDIwMDEgbm8gcHVlZGUgZXZhbHVhcnNlIGVzdGFkw61zdGljYW1lbnRlOiBubyBoYXkgb2JzZXJ2YWNpb25lcyBwcmV2aWFzIG5pIGRlbCBwcm9waW8gYcOxbyBlbiBlc3RvcyBhcmNoaXZvcy4gTm8gZGV0ZWN0YXIgZXNlIGhpdG8gZW4gdW5hIG11ZXN0cmEgcG9zdGVyaW9yIG5vIGRlbXVlc3RyYSBhdXNlbmNpYSBkZSBlZmVjdG9zLiBUYW1wb2NvIHNlIGF0cmlidXllbiBsb3MgcXVpZWJyZXMgcG9zdGVyaW9yZXMgYSBsYSBkb2xhcml6YWNpw7NuIHNpbiB1bmEgZXN0cmF0ZWdpYSBhZGljaW9uYWwgZGUgaWRlbnRpZmljYWNpw7NuLg0KDQojIyBRdcOpIGFwb3J0YSBsYSBpbnZlcnNpw7NuDQoNCkxhIGludmVyc2nDs24gbWVkaWEgYHIgaWYobWVhbihpbnZbaTFdKT5tZWFuKGludltpMF0pKSAiZXMgbWF5b3IiIGVsc2UgImVzIG1lbm9yImAgZW4gbGFzIMO6bHRpbWFzIGN1YXRybyBvYnNlcnZhY2lvbmVzIHF1ZSBlbiBsYXMgcHJpbWVyYXMuIEVzdG8gZGVzY3JpYmUgdW5hIG1vZGlmaWNhY2nDs24gZGUgbGEgY29tcG9zaWNpw7NuIGRlbCBnYXN0by4gTGEgc2ltdWx0YW5laWRhZCBlbnRyZSBpbnZlcnNpw7NuIHkgZXhwYW5zacOzbiBwcm9kdWN0aXZhIG5vIHBlcm1pdGUgZXN0YWJsZWNlciBkaXJlY2Npw7NuIGNhdXNhbCBuaSBhZmlybWFyIHF1ZSBhdW1lbnTDsyBsYSBwcm9kdWN0aXZpZGFkIGRlbCBjYXBpdGFsLiBMYSBGQktGIGVzIGRpc3RpbnRhIGRlIGxhIGZvcm1hY2nDs24gYnJ1dGEgZGUgY2FwaXRhbCB0b3RhbDsgbG9zIGludmVudGFyaW9zIHJlY2llbnRlcyBlc3TDoW4gZW4gcmV2aXNpw7NuIHkgbm8gc2UgdXRpbGl6YW4gZW4gZWwgbnVtZXJhZG9yLg0KDQojIyBMw61taXRlcyBkZSBsYXMgY29uY2x1c2lvbmVzDQoNCkVsIGFuw6FsaXNpcyB1dGlsaXphIGFyY2hpdm9zIGNvbiBjaWZyYXMgcmVjaWVudGVzIHByZWxpbWluYXJlcyBvIGVzdGltYWRhcywgdW4gYWp1c3RlIGVzdGFjaW9uYWwgcHJvcGlvIHkgYXByb3hpbWFjaW9uZXMgZGUgYWdyZWdhY2nDs24uIExhcyBwcnVlYmFzIHRpZW5lbiBpbmNlcnRpZHVtYnJlIGRlIG11ZXN0cmEsIGVsZWNjacOzbiBkZSByZXphZ29zLCBzZWdtZW50b3MgeSBlc3BlY2lmaWNhY2nDs24uIExhIGFsdGEgY29ycmVsYWNpw7NuIGVudHJlIHBlc29zIG5vIGFzZWd1cmEgcm9idXN0ZXogYSBjdWFscXVpZXIgaW5kaWNhZG9yIG8gY2xhc2lmaWNhY2nDs24uIExhIGJyZWNoYSBIUCBlcyBzZW5zaWJsZSBhbCBleHRyZW1vIGRlIGxhIG11ZXN0cmEuIEZpbmFsbWVudGUsIGVsIGVzdHVkaW8gbm8gbWlkZSBwcm9kdWN0aXZpZGFkIGxhYm9yYWwgbmkgZWplY3V0YSBzaGlmdC1zaGFyZTogZXNvcyBjb21wb25lbnRlcyBxdWVkYW4gZnVlcmEgcG9yIGxhIGV4Y2x1c2nDs24gYWNvcmRhZGEgZGVsIGVtcGxlby4NCg0KKipDb25jbHVzacOzbiBwcmluY2lwYWwuKiogRW50cmUgbGFzIHZlbnRhbmFzIGluaWNpYWwgeSBmaW5hbCwgbGEgcGFydGljaXBhY2nDs24gYWdyb3BlY3VhcmlhIGRpc21pbnV5ZSBkZSAqKmByIGZtdChjb21wJEluaWNpb1sxXSlgICUgYSBgciBmbXQoY29tcCRGaW5hbFsxXSlgICUqKiwgbG9zIHNlcnZpY2lvcyBjb25zZXJ2YW4gZWwgbWF5b3IgcGVzbyB5IGxhIGludmVyc2nDs24gcGFzYSBkZSAqKmByIGZtdChtZWFuKGludltpMF0pKWAgJSBhIGByIGZtdChtZWFuKGludltpMV0pKWAgJSoqIGRlbCBQSUIuIEVsIEhISSBkZSB0cmVzIGdydXBvcyBhdW1lbnRhIGRlICoqYHIgZm10KG1lYW4oaGhpW2kwXSksMylgIGEgYHIgZm10KG1lYW4oaGhpW2kxXSksMylgKio7IHBvciB0YW50bywgZWwgY2FtYmlvIG9ic2VydmFkbyBubyBlcXVpdmFsZSBhIHVuYSBkaXN0cmlidWNpw7NuIG3DoXMgZXF1aWxpYnJhZGEgZW50cmUgZXN0b3MgdHJlcyBncnVwb3MuIExhIGNyaXNpcyBkZSAyMDIwIHByb2R1Y2UgZWwgZXBpc29kaW8gbcOhcyBpbnRlbnNvIGRlIGRpc3BlcnNpw7NuLCBtaWVudHJhcyBsYXMgcHJ1ZWJhcyBhcGxpY2FkYXMgbm8gaWRlbnRpZmljYW4gY2FtYmlvcyBwZXJzaXN0ZW50ZXMgZGUgbGEgbWVkaWEgZGUgTkFWIGFsIDUgJS4gU2luIGVtcGxlbyBzZWN0b3JpYWwsIGVzdG9zIHJlc3VsdGFkb3Mgbm8gcGVybWl0ZW4gY29uY2x1aXIgcXVlIGxhIHJlYXNpZ25hY2nDs24gZWxldsOzIG8gcmVkdWpvIGxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbC4NCg0KIyBSZWZlcmVuY2lhcw0KDQotIEJhbmNvIENlbnRyYWwgZGUgUmVzZXJ2YSBkZSBFbCBTYWx2YWRvci4gKlByb2R1Y3RvIEludGVybm8gQnJ1dG8gVHJpbWVzdHJhbDogUHJvZHVjY2nDs24geSBnYXN0byBhIHByZWNpb3MgY29ycmllbnRlcyouIEFyY2hpdm8gRXhjZWwgZmFjaWxpdGFkbyBwb3IgZWwgZXN0dWRpYW50ZSwgY29ydGUgZGUgYXJjaGl2b3MgMTIgZGUgbm92aWVtYnJlIGRlIDIwMjYsIMO6bHRpbWEgb2JzZXJ2YWNpw7NuIDIwMjYgSUkuIFtDb25zdWx0YSBCQ1JdKGh0dHBzOi8vZXN0YWRpc3RpY2FzLmJjci5nb2Iuc3Yvc2VyaWUvcHJvZHVjdG8taW50ZXJuby1icnV0by10cmltZXN0cmFsLXBpYi10LXByb2R1Y2Npb24teS1nYXN0by1hLXByZWNpb3MtY29ycmllbnRlcy1lbi1taWxsb25lcy1kZS11cykuDQotIEJhbmNvIENlbnRyYWwgZGUgUmVzZXJ2YSBkZSBFbCBTYWx2YWRvci4gKlBJQiBULiBQcm9kdWNjacOzbiB5IGdhc3RvLiDDjW5kaWNlcyBkZSB2b2x1bWVuIGVuY2FkZW5hZG9zLiBTZXJpZSBvcmlnaW5hbCAocmVmZXJlbmNpYSAyMDE0KSouIEFyY2hpdm8gRXhjZWwgZmFjaWxpdGFkbyBwb3IgZWwgZXN0dWRpYW50ZSwgbWlzbW8gY29ydGUuIFtTZWN0b3IgcmVhbF0oaHR0cHM6Ly9lc3RhZGlzdGljYXMuYmNyLmdvYi5zdi9jbGFzaWZpY2FjaW9uL3NlY3Rvci1yZWFsKS4NCi0gQmFuY28gQ2VudHJhbCBkZSBSZXNlcnZhIGRlIEVsIFNhbHZhZG9yLiAqUElCIGFudWFsIGEgcHJlY2lvcyBjb3JyaWVudGVzIGUgw61uZGljZXMgZGUgdm9sdW1lbiBlbmNhZGVuYWRvczsgSVBDKi4gQXJjaGl2b3MgY29tcGxlbWVudGFyaW9zIGZhY2lsaXRhZG9zIHBvciBlbCBlc3R1ZGlhbnRlLiBbQmFzZSBlc3RhZMOtc3RpY2FdKGh0dHBzOi8vZXN0YWRpc3RpY2FzLmJjci5nb2Iuc3YvKS4NCi0gVW5pdmVyc2lkYWQgZGUgRWwgU2FsdmFkb3IsIFNlY2Npw7NuIGRlIEVjb25vbcOtYS4gKDIwMjYpLiAqRXhhbWVuIHBhcmNpYWwgMzogRGVzYXJyb2xsbyBkZSBpbmRpY2Fkb3JlcyBwYXJhIGVsIGFuw6FsaXNpcyBlc3RydWN0dXJhbCBkZSBsYSBlY29ub23DrWEgc2FsdmFkb3Jlw7FhKi4gQ29uc2lnbmEgeSByw7picmljYSBmYWNpbGl0YWRhcyBwb3IgZWwgZXN0dWRpYW50ZS4NCi0gUiBDb3JlIFRlYW0uICpTVEwgeSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyouIERvY3VtZW50YWNpw7NuIGRlIFtzdGxdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL1ItbWFudWFsL1ItZGV2ZWwvbGlicmFyeS9zdGF0cy9odG1sL3N0bC5odG1sKSB5IFtwcmNvbXBdKGh0dHBzOi8vc3RhdC5ldGh6LmNoL1ItbWFudWFsL1ItZGV2ZWwvbGlicmFyeS9zdGF0cy9odG1sL3ByY29tcC5odG1sKS4NCi0gUGZhZmYsIEIuICp1cmNhOiBVbml0IFJvb3QgYW5kIENvaW50ZWdyYXRpb24gVGVzdHMgZm9yIFRpbWUgU2VyaWVzIERhdGEqLiBbTWFudWFsXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvdXJjYS91cmNhLnBkZikuDQotIFplaWxlaXMsIEEuIHkgY29sYWJvcmFkb3Jlcy4gKnN0cnVjY2hhbmdlOiBUZXN0aW5nLCBNb25pdG9yaW5nLCBhbmQgRGF0aW5nIFN0cnVjdHVyYWwgQ2hhbmdlcyouIEluY2x1eWUgZWwgYWxnb3JpdG1vIGRlIEJhaSB5IFBlcnJvbiAoMjAwMykuIFtNYW51YWxdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdHJ1Y2NoYW5nZS9zdHJ1Y2NoYW5nZS5wZGYpLg0KLSBCYWxjaWxhciwgTS4gKm1GaWx0ZXI6IE1pc2NlbGxhbmVvdXMgVGltZSBTZXJpZXMgRmlsdGVycyouIEltcGxlbWVudGFjacOzbiBkZWwgZmlsdHJvIGRlIEhvZHJpY2sgeSBQcmVzY290dC4gW01hbnVhbF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21GaWx0ZXIvbUZpbHRlci5wZGYpLg0KLSBGb25kbyBNb25ldGFyaW8gSW50ZXJuYWNpb25hbCB5IG90cm9zIG9yZ2FuaXNtb3MuICgyMDA0KS4gKlByb2R1Y2VyIFByaWNlIEluZGV4IE1hbnVhbDogVGhlb3J5IGFuZCBQcmFjdGljZSosIGNhcMOtdHVsbyAxNiwgc2VjY2nDs24gMTYuMTI0IHkgZWN1YWNpw7NuIDE2LjcyOiDDrW5kaWNlIGRlIGNhbnRpZGFkIFTDtnJucXZpc3QgY29uIHBhcnRpY2lwYWNpb25lcyBkZSB2YWxvci4gW01hbnVhbF0oaHR0cHM6Ly93d3cuaW1mLm9yZy9leHRlcm5hbC9wdWJzL2Z0L3BwaS8yMDEwL21hbnVhbC9wcGkucGRmKS4NCi0gUG9zaXQuICpSIE1hcmtkb3duOiBodG1sX2RvY3VtZW50Ki4gW0RvY3VtZW50YWNpw7NuXShodHRwczovL3BrZ3MucnN0dWRpby5jb20vcm1hcmtkb3duL3JlZmVyZW5jZS9odG1sX2RvY3VtZW50Lmh0bWwpLg0KDQojIEFuZXhvcyBwYXJhIHJlcHJvZHVjaXIgeSBkZWZlbmRlcg0KDQojIyBDb2JlcnR1cmEgZGUgbGEgY29uc2lnbmENCg0KYGBge3IgY29iZXJ0dXJhX2NvbnNpZ25hLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnRhYmxhKGRhdGEuZnJhbWUoUmVxdWlzaXRvPWMoIkhUTUwgYXV0b2NvbnRlbmlkbyBjb24gUiBNYXJrZG93biIsICJNdWVzdHJhIHRyaW1lc3RyYWwgbcOtbmltYSIsICJDb3J0ZSBkZSAyMDI2IiwgIkNyZWNpbWllbnRvLCBwYXJ0aWNpcGFjaW9uZXMsIGludmVyc2nDs24geSBISEkiLCAiTkFWIHkgTGlsaWVuIiwgIlNUTCwgbG9nYXJpdG1vcyB5IGRlZmxhY3RvciIsICJQZXNvcyBpZ3VhbGVzIHkgUENBIiwgIkFERiwgS1BTUyB5IFppdm90LUFuZHJld3MiLCAiQmFpLVBlcnJvbiBzb2JyZSBOQVYiLCAiUG90ZW5jaWFsIHkgYnJlY2hhIEhQIiwgIkRvbGFyaXphY2nDs24gZGUgMjAwMSIsICJQcm9kdWN0aXZpZGFkIGxhYm9yYWwgeSBzaGlmdC1zaGFyZSIpLA0KICAgICAgICAgICAgICAgICBDb2JlcnR1cmE9YygiR2VuZXJhZG8gZGVzZGUgZXN0ZSBSbWQ7IGbDs3JtdWxhcyBNYXRoTUwgZSBpbcOhZ2VuZXMgaW50ZWdyYWRhcyIsICI4NiBkYXRvcyBvcmlnaW5hbGVzOyBOQVYgYW51YWw6IDgyIiwgIkhhc3RhIDIwMjYgSUkgZW4gbG9zIGFyY2hpdm9zIHJlY2liaWRvcyIsICJDYWxjdWxhZG9zIiwgIkNhbGN1bGFkb3MgY29uIGbDs3JtdWxhcyBlc3BlY8OtZmljYXMiLCAiQXBsaWNhZG9zIHkgZG9jdW1lbnRhZG9zIiwgIkNvbXBhcmFjacOzbiBhdXhpbGlhciBleHBsw61jaXRhOyBubyByZWVtcGxhemEgTkFWIiwgIlJlc3VsdGFkb3MgZW4gbml2ZWxlcyB5IGRpZmVyZW5jaWFzIiwgIkZlY2hhZG8gQklDLCBlc3RhYmlsaWRhZCBIQUMgeSBzZW5zaWJpbGlkYWQgQVIoMSkiLCAiQ2FsY3VsYWRvcyBjb24gbGFtYmRhIDE2MDAiLCAiTm8gZXN0aW1hYmxlOyBzZSBjb25zZXJ2YSBjb21vIGFudGVjZWRlbnRlIiwgIkV4Y2x1aWRvcyBwb3IgYWxjYW5jZSBhY29yZGFkbyIpKSwNCiAgICAgICJDdWFkcm8gQTEuIEN1bXBsaW1pZW50byBlZmVjdGl2byB5IGV4Y2x1c2lvbmVzIikNCmBgYA0KDQojIyBQcmltZXJhcyBkaWZlcmVuY2lhcyB5IHNlbnNpYmlsaWRhZCBncsOhZmljYQ0KDQpgYGB7ciBkaWZlcmVuY2lhcywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp0YWJsYSh0ZXN0W3Rlc3QkRm9ybWE9PSJEaWZlcmVuY2lhIiwgYygiU2VyaWUiLCJQcnVlYmEiLCJOIiwiTW9kZWxvIiwiUmV6YWdvcyIsIkVzdGFkw61zdGljbyIsIkNyw610aWNvXzUiLCJSZWNoYXphX251bGEiLCJRdWllYnJlIildLA0KICAgICAgIkN1YWRybyBBMi4gUHJ1ZWJhcyBzb2JyZSBwcmltZXJhcyBkaWZlcmVuY2lhcyIsIDMpDQpgYGANCg0KYGBge3IgaG9yaXpvbnRlcywgZmlnLmNhcD0iRmlndXJhIEExLiBOQVYgY29uIGhvcml6b250ZXMgZGUgdW5vIHkgY2luY28gYcOxb3M7IHVuaWRhZGVzIGlndWFsZXMsIGhvcml6b250ZSBkaXN0aW50by4ifQ0KZ2dwbG90KGxhcmdhKGNiaW5kKCJVbiBhw7FvIj1uYXYsIkNpbmNvIGHDsW9zIj1uYXY1KSxmZWNoYSksYWVzKGZlY2hhLHZhbG9yLGNvbG9yPXNlcmllKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoPTAuODUpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJVbiBhw7FvIj0iIzc2MjQ0MCIsIkNpbmNvIGHDsW9zIj0iIzI0Njc3OSIpKSArDQogIGxhYnModGl0bGU9IlNlbnNpYmlsaWRhZCBkZWwgaG9yaXpvbnRlIGRlIGNvbXBhcmFjacOzbiIseD1OVUxMLHk9Ik5BViAocHVudG9zKSIsY2FwdGlvbj1mdWVudGUpDQpgYGANCg0KYGBge3IgZGVzYWdyZWdhY2lvbiwgZmlnLmNhcD0iRmlndXJhIEEyLiBEaXNwZXJzacOzbiBjb24gdHJlcyBzZWN0b3JlcyB5IGNvbiAxOSBhY3RpdmlkYWRlcy4ifQ0KZ2dwbG90KGxhcmdhKGNiaW5kKCJUcmVzIHNlY3RvcmVzIj1saWwsIjE5IGFjdGl2aWRhZGVzIj1saWwxOSksZmVjaGEpLGFlcyhmZWNoYSx2YWxvcixjb2xvcj1zZXJpZSkpICsNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aD0wLjg1KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiVHJlcyBzZWN0b3JlcyI9IiM3NjI0NDAiLCIxOSBhY3RpdmlkYWRlcyI9IiMyNDY3NzkiKSkgKw0KICBsYWJzKHRpdGxlPSJFZmVjdG8gZGUgbGEgZGVzYWdyZWdhY2nDs24iLHg9TlVMTCx5PSJMaWxpZW4gKHB1bnRvcykiLGNhcHRpb249ZnVlbnRlKQ0KYGBgDQoNCiMjIENvbXByb2JhY2lvbmVzIGRlIGRhdG9zIHkgZGVmbGFjdGFjacOzbg0KDQpgYGB7ciB2YWxpZGFyX2FudWFsLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmHDsW9zIDwtIGZpbGEoYW5uLDQpDQp2YWwgPC0gZG8uY2FsbChyYmluZCxsYXBwbHkoYygyMDA1LDIwMTQsMjAyNSksZnVuY3Rpb24oYcOxbyl7DQogIGogPC0gd2hpY2goYcOxb3M9PWHDsW8pKzE7IGsgPC0gd2hpY2goYW5pbz09YcOxbykNCiAgZGF0YS5mcmFtZShBw7FvPWHDsW8sIFBJQl9hbnVhbD1hcy5udW1lcmljKGFublszMCxqXSksIFBJQl9zdW1hX3RyaW1lc3RyZXM9c3VtKHBpYl9uW2tdKSwNCiAgICAgICAgICAgICBGQktGX2FudWFsPWFzLm51bWVyaWMoYW5uWzM3LGpdKSwgRkJLRl9zdW1hX3RyaW1lc3RyZXM9c3VtKGZia19uW2tdKSkNCn0pKQ0KdGFibGEodmFsLCJDdWFkcm8gQTMuIFZhbGlkYWNpw7NuIGRlIGxvcyBhcmNoaXZvcyBhbnVhbCB5IHRyaW1lc3RyYWwsIG1pbGxvbmVzIGRlIGTDs2xhcmVzIiwyKQ0KdmFsX3YgPC0gZGF0YS5mcmFtZShBw7FvPXZhbCRBw7FvLA0KICBWb2x1bWVuX2FudWFsPXNhcHBseSh2YWwkQcOxbyxmdW5jdGlvbihhw7FvKSBhcy5udW1lcmljKGFudlszMCx3aGljaChmaWxhKGFudiw0KT09YcOxbykrMV0pKSwNCiAgUHJvbWVkaW9fdHJpbWVzdHJhbD1zYXBwbHkodmFsJEHDsW8sZnVuY3Rpb24oYcOxbykgbWVhbihwaWJfdlthbmlvPT1hw7FvXSkpKQ0KdGFibGEodmFsX3YsIkN1YWRybyBBNC4gVmFsaWRhY2nDs24gZGVsIFBJQiBlbiB2b2x1bWVuLCByZWZlcmVuY2lhIDIwMTQiLDMpDQp0YWJsYShkYXRhLmZyYW1lKFBlcsOtb2RvPXBlcltjKDEsMzcsMzgsbGVuZ3RoKHBlcikpXSwgUElCX25vbWluYWw9cGliX25bYygxLDM3LDM4LGxlbmd0aChwZXIpKV0sDQogICAgICAgICAgICAgICAgIFBJQl9yZWFsX3JlZjIwMTQ9cGliX3JbYygxLDM3LDM4LGxlbmd0aChwZXIpKV0sIERlZmxhY3Rvcj1kZWZbYygxLDM3LDM4LGxlbmd0aChwZXIpKV0pLA0KICAgICAgIkN1YWRybyBBNS4gVHJhemFiaWxpZGFkIGRlbCBkZWZsYWN0b3IgaW1wbMOtY2l0bywgcmVmZXJlbmNpYSAyMDE0IiwzKQ0KYGBgDQoNCkxhcyBkaWZlcmVuY2lhcyBkZSBjZW50w6lzaW1hcyBlbiBsYSBjb21wcm9iYWNpw7NuIGFudWFsIHByb2NlZGVuIGRlbCByZWRvbmRlby4gRWwgY3VhZHJvIGRlbCBkZWZsYWN0b3IgdXNhIG5pdmVsZXMgb3JpZ2luYWxlcywgbm8gYWp1c3RhZG9zLiBQYXJhIG9idGVuZXIgbml2ZWxlcyBzZWN0b3JpYWxlcyBhcHJveGltYWRvcyBlbiBtaWxsb25lcyBkZSBkw7NsYXJlcyBkZSByZWZlcmVuY2lhIHNlIGRpdmlkZSBjYWRhIHZhbG9yIG5vbWluYWwgcG9yIGVzZSBkZWZsYWN0b3IvMTAwOyBwYXJhIGxvcyBjcmVjaW1pZW50b3Mgc2VjdG9yaWFsZXMgcHJpbmNpcGFsZXMgc2UgY29uc2VydmFuIGxvcyDDrW5kaWNlcyBvZmljaWFsZXMgeSBsYSBhZ3JlZ2FjacOzbiBUw7ZybnF2aXN0IGVzcGVjaWZpY2FkYS4NCg0K