Índices de Dominância
\(D_1\)
Índice de dominância \(D_1\): \[D1 = \text{Norm}(HHI) = \frac{k \sum_{i=1}^{k}
p_i^2 - 1}{k - 1}\]
D1 <- function(x){
n <- sum(x) # numero total de vendas
prop <- x/n # participacoes de mercado
k <- length(x) # numero de empresas
HHI <- sum(prop^2) # indice de Herfindahl–Hirschman
D1 <- (k*HHI - 1)/(k-1)
return(D1)
}
\(D_2\)
Índice de Rosenbluth–Hall–Tidemann: \[\begin{align*}
I_{\text{Ros}} &= \frac{1}{2\sum_{i=1}^{k} i\,p_{(i)} - 1}
\end{align*}\]
Índice de dominância \(D_2\): \[\begin{align*}
D_2 &= \frac{I_{\text{Ros}} - 1/k}{1- \frac{1}{k}} \\
&= \frac{k I_{\text{Ros}} - 1}{k - 1}.
\end{align*}\]
D2 <- function(x){
n <- sum(x) # total de vendas
prop <- x/n # participacoes de mercado
prop_O <- sort(prop, decreasing = T) # participacoes de mercado ordenadas
pesos <- seq_along(prop_O) # indices das participacoes de mercado ordenadas
k <- length(x) # numero de empresas
Iros <- 1/(2*sum(pesos*prop_O) - 1) # indice de Rosenbluth–Hall–Tidemann
D2 <- (k*Iros - 1)/(k - 1)
return(D2)
}
\(D_3\)
Entropia de Shannon: \[\begin{align*}
H_s = -\sum_{i=1}^{k}p_i\ln p_i.
\end{align*} \]
Índice de dominância \(D_3\): \[\begin{align*}
D_3 &= 1 - \text{Norm}(H_s) \\
&= 1 - \frac{H_s}{\ln k}
\end{align*}\]
D3 <- function(x){
n <- sum(x) # total de vendas
prop <- x/n # participacoes de mercado
k <- length(x) # numero de empresas
Hs <- -sum(prop*log(prop), na.rm = T) # entropia de shannon
HsNorm <- Hs/log(k) # entropia de shannon normalizada
D3 <- 1 - HsNorm
return(D3)
}
\(D_4\)
Índice de Heip: \[\begin{align*}
I_{\text{Heip}} &= \frac{e^{H_S} - 1}{k - 1},
\end{align*}\]
Índice de dominância \(D_4\): \[\begin{align*}
D_4 &= 1 - I_{\text{Heip}} \\
&= \frac{k - e^{H_S}}{k - 1}
\end{align*}\]
D4 <- function(x){
n <- sum(x) # total de vendas
prop <- x/n # participacoes de mercado
k <- length(x) # numero de empresas
Hs <- -sum(prop*log(prop), na.rm = T) # entropia de shannon
Iheip <- (exp(Hs) - 1)/(k - 1) # indice de Heip
D4 <- 1 - Iheip
return(D4)
}
\(D_5\)
Índice de Hannah-Kay: \[\begin{align*}
I_{HK}(\alpha) &= \left( \sum_{i=1}^{k} p_i^\alpha
\right)^{\frac{1}{1-\alpha}}, \quad \alpha>0, \alpha \neq 1.
\end{align*}\]
Índice de dominância \(D_5\): \[\begin{align*}
D_5 &= \frac{k - I_{HK}(2)}{k - 1}\\
&= \frac{k\sum_{i=1}^kp_i^2 - 1}{(k-1)\sum_{i=1}^kp_i^2}
\end{align*}\]
D5 <- function(x){
n <- sum(x) # total de vendas
prop <- x/n # participacoes de mercado
k <- length(x) # numero de empresas
Ihk <- 1/sum(prop^2) # indice de Hannah-Kay
D5 <- (k - Ihk)/(k-1)
return(D5)
}
\(D_6\)
Estatística \(VA\): \[\begin{align*}
VA &= 1 -
\frac{\displaystyle \sum_{i=1}^{k} \left(f_i -
\frac{n}{k}\right)^2}
{n^2 \frac{(k-1)}{k}},
\end{align*}\]
Índice de dominância \(D_6\): \[\begin{align*}
D_6 &= 1 - VA\\
&= \frac{k}{k-1} \left( \sum_{i=1}^{k} p_i^2 - \frac{1}{k}
\right)
\end{align*}\]
D6 <- function(x){
n <- sum(x) # total de vendas
k <- length(x) # numero de empresas
VA <- 1 - ( sum( (x - (n/k))^2 )/( ( (n^2)*(k-1) )/k ) ) # estatistica VA
D6 <- 1 - VA
return(D6)
}
\(D_7\)
Estatística \(SDA\): \[\begin{align*}
SDA &= 1 -
\sqrt{\frac{\displaystyle \sum_{i=1}^{k} \left(f_i -
\frac{n}{k}\right)^2}
{n^2 \frac{(k-1)}{k}}}
\end{align*}\]
Indice de dominância \(D_7\): \[\begin{align*}
D_7 &= 1 - SDA \\[6pt]
&= \sqrt{\frac{k}{k-1} \left(\sum_{i=1}^{k} p_i^2 -
\frac{1}{k}\right)}
\end{align*}\]
D7 <- function(x){
n <- sum(x) # total de vendas
k <- length(x) # numero de empresas
SDA <- 1 - sqrt( sum( (x - (n/k))^2 )/( ( (n^2)*(k-1) )/k ) ) # estatistica SDA
D7 <- 1 - SDA
return(D7)
}
Relações entre os índices de dominância
Entre os índices que dependem
de \(HHI\)
Somente \(D_1, \; D_5, \; D_6\; \text{ e }
\; D_7\) dependem de \(HHI\):
\[\begin{align*}
&D_1 = D_6\\
&D_7 = \sqrt{D_6} = \sqrt{D_1}\\
&D_5 = \frac{D_1}{HHI}= \frac{D_6}{HHI}\\
&D_5 = \frac{D_7^2}{HHI}
\end{align*}\]
Entre os índices que dependem
de \(H_S\)
Somente \(D_3 \; \text{ e } \; D_4\)
dependem de \(H_S\): \[\begin{align*}
&D_4 = \frac{k}{k - 1}(1 - e^{1-D_3})
\end{align*}\]
Intervalos para os índices de dominância
Sabe-se que \[\begin{align*}
HHI &< 0,01 \rightarrow \text{alta competitividade}\\
0,01 \leq HHI &< 0,15 \rightarrow \text{pouco concentrado}\\
0,15 \leq HHI &< 0,25 \rightarrow \text{concentração média}\\
HHI &\geq 0.25 \rightarrow \text{alta concentração}.
\end{align*}\] Pela relação entre \(HHI\), \(D_1 \;
\text{ e } \; D_6\), temos que: \[\begin{align*}
D_1 = D_6 &< \frac{0,01k - 1}{k - 1} \rightarrow \text{alta
competitividade}\\
\frac{0,01k - 1}{k - 1} \leq D_1 = D_6 &< \frac{0,15k - 1}{k -
1} \rightarrow \text{pouco concentrado}\\
\frac{0,15k - 1}{k - 1} \leq D_1 = D_6 &< \frac{0,25k - 1}{k -
1} \rightarrow \text{concentração média}\\
D_1 = D_6 &\geq \frac{0,25k - 1}{k - 1} \rightarrow \text{alta
concentração}
\end{align*}\]
Pela relação entre \(D_1\), \(D_6\) e \(D_7\), temos que: \[\begin{align*}
D_7 &< \sqrt{\frac{0,01k - 1}{k - 1}} \rightarrow \text{alta
competitividade}\\
\sqrt{\frac{0,01k - 1}{k - 1}} \leq D_7 &< \sqrt{\frac{0,15k -
1}{k - 1}} \rightarrow \text{pouco concentrado}\\
\sqrt{\frac{0,15k - 1}{k - 1}} \leq D_7 &< \sqrt{\frac{0,25k -
1}{k - 1}} \rightarrow \text{concentração média}\\
D_7 &\geq \sqrt{\frac{0,25k - 1}{k - 1}} \rightarrow \text{alta
concentração}
\end{align*}\]
Pela relação entre \(D_5\) e \(HHI\), temos que: \[\begin{align*}
D_5 &< \frac{0,01k - 1}{0,01(k - 1)} \rightarrow \text{alta
competitividade}\\
\frac{0,01k - 1}{0,01(k - 1)} \leq D_5 &< \frac{0,15k -
1}{0,15(k - 1)} \rightarrow \text{pouco concentrado}\\
\frac{0,15k - 1}{0,15(k - 1)} \leq D_5 &< \frac{0,25k -
1}{0,25(k - 1)} \rightarrow \text{concentração média}\\
D_5 &\geq \frac{0,25k - 1}{0,25(k - 1)} \rightarrow \text{alta
concentração}
\end{align*}\]
Distribuição assintótica
Seja \((\chi,
\beta_\chi, P)_{P\in\Delta_M}\) um espaço estatístico, onde
\(\chi = \{x_1, ..., x_M\}\), \(\Delta_M = \{P = (p_1, ..., p_M)^t\), \(p_i \geq 0\) e \(\sum_{i=1}^Mp_i = 1\}\) e \(\beta_\chi\) a sigma-álgebra de todos os
subconjuntos de \(\chi\). Para algum
\(P\in \Delta_M\), a entropia \(H_{h,v}^{\varphi_1, \varphi_2}\) é definida
pela seguinte expressão: \[
H_{h,v}^{\varphi_1, \varphi_2}(P) = h\left(
\frac{\sum_{i=1}^Mv_i\varphi_1(p_i)}{\sum_{i=1}^Mv_i\varphi_2(p_i)}
\right),
\] onde \(v_i>0\), \(i = 1, ..., M\), é o peso associado ao
elemento \(x_i\) de \(\chi\). Além disso, nós supomos que \(\varphi_1: [0,1) \rightarrow \mathbb{R}\),
\(\varphi_2: [0,1) \rightarrow
\mathbb{R}\) e \(h: \mathbb{R}
\rightarrow \mathbb{R}\) sejam quaisquer dos triplos de funções
apresentados na tabela apresentada no artigo. A tabela seguinte mostra
algumas dessas funções para as entropias utilizadas nos índices de
dominância apresentados anteriormente.
| Shannon |
\(x\) |
\(-x \log x\) |
\(x\) |
\(v\) |
| Rényi |
\((1 - r)^{-1}\log
x\) |
\(x^r\) |
\(x\) |
\(v\) |
| Tsallis |
\(\ (r-1)^{-1}(1 -
x)\) |
\(x^r\) |
\(x\) |
\(v\) |
Teorema: Suponha que \(h\in C^1(\mathbb{R})\), \(\varphi_1 \in C^1((0,1))\), \(\varphi_2 \in C^1((0,1))\) e \(p_i>0, \; i = 1, ..., M.\) Se a
frequência relativa \(\hat{P}\) é o
estimador de \(P=(p_1, ...,, p_M)\)
baseado em uma amostra aleatória de tamanho \(n\), então \[\begin{align*}
n^{1/2}[H_{h,v}^{\varphi_1, \varphi_2}(\hat{P}) - H_{h,v}^{\varphi_1,
\varphi_2}(P)]\overset{D}{\rightarrow}N(0, \sigma^2),
\end{align*}\] em que \[\begin{align*}
\sigma^2 &= \sum_{i = 1}^Mt_i^2p_i - \bigg(\sum_{i =
1}^Mt_ip_i\bigg)^2\\
t_i &= \frac{d}{dp_i}H_{h,v}^{\varphi_1, \varphi_2}(P).
\end{align*}\]
No caso da Entropia de Shannon, Entropia de Tsallis e Entropia de
Rényi, temos os seguintes \(t_i's\):
| Shannon |
\(- (1 + \log
p_i)\) |
| Rényi |
\(\frac{r}{1 - r} \, p_i^{r -
1} \left[\sum_{i = 1}^M p_i^r\right]^{-1}\) |
| Tsallis |
\(-\frac{r}{r - 1}p_i^{r -
1}\) |
Logo, a distribuição assintótica das entropias é dada por:
| Shannon |
\(\hat{H}_s \overset{D}{\to}
N\!\left(H_s, \frac{1}{n}\left(\sum_{i=1}^{k} p_i\ln^2 p_i -
H_s^2\right)\right)\) |
| Rényi |
\(\hat{H}_R \overset{D}{\to}
N\!\left(H_R, \frac{1}{n}
\Bigg[
\left(\frac{\alpha}{\alpha - 1}\right)^2
\Bigg(
\left(\sum_{i=1}^{k} p_i^\alpha\right)^{-2} \left(\sum_{i=1}^{k}
p_i^{2\alpha - 1}\right)
- \left(\sum_{i=1}^{k} p_i^\alpha\right)^2
\Bigg)
\Bigg]
\right)\) |
| Tsallis |
\(\hat{H}_T \overset{D}{\to}
N\!\left(H_T, \frac{1}{n}
\Bigg[
\left(\frac{\alpha}{\alpha - 1}\right)^2
\Bigg(
\sum_{i=1}^{k} p_i^{2\alpha - 1}
- \left(\sum_{i=1}^{k} p_i^\alpha\right)^2
\Bigg)
\Bigg]
\right)\) |
\(D_1\)
\[\begin{align*}
\hat{D}_1 \overset{D}{\rightarrow} N\bigg(\frac{k[1 - H_T(2)] - 1}{k -
1}, \bigg[\frac{k}{k-1}\bigg]^2\mathbb{V}ar[\hat{H}_T(2)]\bigg)
\end{align*}\]
\(D_3\)
\[\begin{align*}
\hat{D}_3 \overset{D}{\rightarrow} N\bigg(1 - \frac{H_s}{\log k},
\frac{\mathbb{V}ar(\hat{H}_s)}{\log^2 k}\bigg)
\end{align*}\]
\(D_4\)
Seja \(W = \hat{D}_4\). Logo, temos
que a densidade de \(W\) é dada por:
\[\begin{align*}
f_W(w) = \frac{k - 1}{[k - (k-1)w]\sqrt{2\pi
\sigma^2_S}}exp\bigg[-\frac{[\log(k - (k-1)w) -
H_s]^2}{2\sigma_S^2}\bigg]\overset{\mathbb{I}(w)}{_{(-\infty,
\frac{k}{k-1})}}
\end{align*}\]
# fdp de D4 e D5 ----------------------------------------------------------
f1 <- function(x, mu, sigma2, k){
( (k - 1)/((k - (k-1)*x)*sqrt(2*pi*sigma2)) )*exp(-((log(k - (k-1)*x) - mu)^2)/(2*sigma2))
}
\(D_5\)
Seja \(V = \hat{D}_5\). Logo, temos
que a densidade de \(V\) é dada por:
\[\begin{align*}
f_V(v) = \frac{k - 1}{[k - (k-1)v]\sqrt{2\pi
\sigma^2_R}}exp\bigg[-\frac{[\log(k - (k-1)v) -
H_R]^2}{2\sigma_R^2}\bigg]\overset{\mathbb{I}(v)}{_{(-\infty,
\frac{k}{k-1})}}
\end{align*}\]
# fdp de D4 e D5 ----------------------------------------------------------
f1 <- function(x, mu, sigma2, k){
( (k - 1)/((k - (k-1)*x)*sqrt(2*pi*sigma2)) )*exp(-((log(k - (k-1)*x) - mu)^2)/(2*sigma2))
}
\(D_6\)
\[\begin{align*}
\hat{D}_6 \overset{D}{\rightarrow} N\bigg(\frac{k[1 - H_T(2)] - 1}{k -
1}, \bigg[\frac{k}{k-1}\bigg]^2\mathbb{V}ar[\hat{H}_T(2)]\bigg)
\end{align*}\]
\(D_7\)
Seja \(U = \hat{D}_6\) e \(Y = \hat{D}_7 = \sqrt{U}\). Temos a
seguinte densidade que está bem definida somente para \(\mathbb{R^+}\): \[\begin{align*}
f_Y(y) =
\frac{2y}{\sqrt{2\pi\sigma^2_U}}exp\bigg[-\frac{(y^2-\mu_U)^2}{2\sigma^2_U}
\bigg]\overset{\mathbb{I}(y)}{{(0,\infty)}}.
\end{align*}\]
# fdp de D7 ---------------------------------------------------------------
f2 <- function(x, mu, sigma2){
( (2*x)/sqrt(2*pi*sigma2) )*exp(-(((x^2) - mu)^2)/(2*sigma2))
}
Simulação
Configuração 1
Com 1000 amostras:
# Caso 1 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.24, 0.26, 0.255, 0.245) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c1.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.24, 0.26, 0.255, 0.245) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c1.2 <- id(a, N)
Índices de dominância
teóricos
# Calculo do valor teorico dos indices de dominancia
d1.t_c1 <- D1(n*p); d1.t_c1
## [1] 0.0003333333
d2.t_c1 <- D2(n*p); d2.t_c1
## [1] 0.005937235
d3.t_c1 <- D3(n*p); d3.t_c1
## [1] 0.0003607556
d4.t_c1 <- D4(n*p); d4.t_c1
## [1] 0.0006666512
d5.t_c1 <- D5(n*p); d5.t_c1
## [1] 0.001332001
d6.t_c1 <- D6(n*p); d6.t_c1
## [1] 0.0003333333
d7.t_c1 <- D7(n*p); d7.t_c1
## [1] 0.01825742
Entropias e variância das
entropias
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
v1; v3; v6
## [1] 4.44e-07
## [1] 5.201531e-07
## [1] 4.44e-07
Plotagem
# Histogramas Caso 1 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c1, NA, d3.t_c1, Hs, Hr, d6.t_c1, d1.t_c1)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c1.1, medias, variancias, k, 1, p)

# com N = 3000
medias <- c(d1.t_c1, NA, d3.t_c1, Hs, Hr, d6.t_c1, d1.t_c1)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c1.2, medias, variancias, k, 1, p)

Configuração 2
Com 1000 amostras:
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.85, 0.05, 0.05, 0.05) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c2.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.85, 0.05, 0.05, 0.05) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c2.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c2 <- D1(n*p); d1.t_c2
## [1] 0.64
d2.t_c2 <- D2(n*p); d2.t_c2
## [1] 0.5
d3.t_c2 <- D3(n*p); d3.t_c2
## [1] 0.5762077
d4.t_c2 <- D4(n*p); d4.t_c2
## [1] 0.7335047
d5.t_c2 <- D5(n*p); d5.t_c2
## [1] 0.8767123
d6.t_c2 <- D6(n*p); d6.t_c2
## [1] 0.64
d7.t_c2 <- D7(n*p); d7.t_c2
## [1] 0.8
Entropias e variância das
entropias
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
Plotagem
# Histogramas Caso 2 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c2, NA, d3.t_c2, Hs, Hr, d6.t_c2, d1.t_c2)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c2.1, medias, variancias, k, 2, p)

# com N = 3000
medias <- c(d1.t_c2, NA, d3.t_c2, Hs, Hr, d6.t_c2, d1.t_c2)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c2.2, medias, variancias, k, 2, p)

Configuração 3
Com 1000 amostras:
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.35, 0.45, 0.1, 0.1) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c3.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.35, 0.45, 0.1, 0.1) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c3.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c3 <- D1(n*p); d1.t_c3
## [1] 0.1266667
d2.t_c3 <- D2(n*p); d2.t_c3
## [1] 0.1604938
d3.t_c3 <- D3(n*p); d3.t_c3
## [1] 0.1435562
d4.t_c3 <- D4(n*p); d4.t_c3
## [1] 0.2406123
d5.t_c3 <- D5(n*p); d5.t_c3
## [1] 0.3671498
d6.t_c3 <- D6(n*p); d6.t_c3
## [1] 0.1266667
d7.t_c3 <- D7(n*p); d7.t_c3
## [1] 0.3559026
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
v1; v3; v6
## [1] 0.0001207111
## [1] 0.0001682834
## [1] 0.0001207111
Plotagem
# Histogramas Caso 3 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c3, NA, d3.t_c3, Hs, Hr, d6.t_c3, d1.t_c3)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c3.1, medias, variancias, k, 3, p)

# com N = 3000
medias <- c(d1.t_c3, NA, d3.t_c3, Hs, Hr, d6.t_c3, d1.t_c3)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c3.2, medias, variancias, k, 3, p)

Configuração 4
Com 1000 amostras:
# Caso 4 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <-c(0.2, 0.2, 0.2, 0.05, 0.15, 0.2) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c4.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.2, 0.2, 0.2, 0.05, 0.15, 0.2) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c4.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c4 <- D1(n*p); d1.t_c4
## [1] 0.022
d2.t_c4 <- D2(n*p); d2.t_c4
## [1] 0.03529412
d3.t_c4 <- D3(n*p); d3.t_c4
## [1] 0.03898655
d4.t_c4 <- D4(n*p); d4.t_c4
## [1] 0.08096464
d5.t_c4 <- D5(n*p); d5.t_c4
## [1] 0.1189189
d6.t_c4 <- D6(n*p); d6.t_c4
## [1] 0.022
d7.t_c4 <- D7(n*p); d7.t_c4
## [1] 0.148324
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
v1; v3; v6
## [1] 7.344e-06
## [1] 2.985792e-05
## [1] 7.344e-06
Plotagem
# Histogramas Caso 4 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c4, NA, d3.t_c4, Hs, Hr, d6.t_c4, d1.t_c4)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c4.1, medias, variancias, k, 4, p)

# com N = 3000
medias <- c(d1.t_c4, NA, d3.t_c4, Hs, Hr, d6.t_c4, d1.t_c4)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c4.2, medias, variancias, k, 4, p)

Configuração 5
Com 1000 amostras:
# Caso 5 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.01, 0.01, 0.01, 0.01, 0.01, 0.95) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c5.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.01, 0.01, 0.01, 0.01, 0.01, 0.95) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c5.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c5 <- D1(n*p); d1.t_c5
## [1] 0.8836
d2.t_c5 <- D2(n*p); d2.t_c5
## [1] 0.7230769
d3.t_c5 <- D3(n*p); d3.t_c5
## [1] 0.8442943
d4.t_c5 <- D4(n*p); d4.t_c5
## [1] 0.9356419
d5.t_c5 <- D5(n*p); d5.t_c5
## [1] 0.9785161
d6.t_c5 <- D6(n*p); d6.t_c5
## [1] 0.8836
d7.t_c5 <- D7(n*p); d7.t_c5
## [1] 0.94
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
v1; v3; v6
## [1] 0.000241753
## [1] 0.0003068293
## [1] 0.000241753
Plotagem
# Histogramas Caso 5 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c5, NA, d3.t_c5, Hs, Hr, d6.t_c5, d1.t_c5)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c5.1, medias, variancias, k, 5, p)

# com N = 3000
medias <- c(d1.t_c5, NA, d3.t_c5, Hs, Hr, d6.t_c5, d1.t_c5)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c5.2, medias, variancias, k, 5, p)

Configuração 6
Com 1000 amostras:
# Caso 6 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.01, 0.01, 0.02, 0.02, 0.47, 0.47) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c6.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.01, 0.01, 0.02, 0.02, 0.47, 0.47) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c6.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c6 <- D1(n*p); d1.t_c6
## [1] 0.33136
d2.t_c6 <- D2(n*p); d2.t_c6
## [1] 0.3172414
d3.t_c6 <- D3(n*p); d3.t_c6
## [1] 0.4651595
d4.t_c6 <- D4(n*p); d4.t_c6
## [1] 0.678545
d5.t_c6 <- D5(n*p); d5.t_c6
## [1] 0.7483288
d6.t_c6 <- D6(n*p); d6.t_c6
## [1] 0.33136
d7.t_c6 <- D7(n*p); d7.t_c6
## [1] 0.5756388
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
v1; v3; v6
## [1] 6.677084e-05
## [1] 0.0002036551
## [1] 6.677084e-05
Plotagem
# Histogramas Caso 6 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c6, NA, d3.t_c6, Hs, Hr, d6.t_c6, d1.t_c6)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c6.1, medias, variancias, k, 6, p)

# com N = 3000
medias <- c(d1.t_c6, NA, d3.t_c6, Hs, Hr, d6.t_c6, d1.t_c6)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c6.2, medias, variancias, k, 6, p)

Configuração 7
Com 1000 amostras:
# Caso 7 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c7.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11, 0.09, 0.11) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c7.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c7 <- D1(n*p); d1.t_c7
## [1] 0.001111111
d2.t_c7 <- D2(n*p); d2.t_c7
## [1] 0.005847953
d3.t_c7 <- D3(n*p); d3.t_c7
## [1] 0.002175106
d4.t_c7 <- D4(n*p); d4.t_c7
## [1] 0.00555094
d5.t_c7 <- D5(n*p); d5.t_c7
## [1] 0.0110011
d6.t_c7 <- D6(n*p); d6.t_c7
## [1] 0.001111111
d7.t_c7 <- D7(n*p); d7.t_c7
## [1] 0.03333333
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
Plotagem
# Histogramas Caso 7 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c7, NA, d3.t_c7, Hs, Hr, d6.t_c7, d1.t_c7)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c7.1, medias, variancias, k, 7, p)

# com N = 3000
medias <- c(d1.t_c7, NA, d3.t_c7, Hs, Hr, d6.t_c7, d1.t_c7)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c7.2, medias, variancias, k, 7, p)

Configuração 8
Com 1000 amostras:
# Caso 8 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c8.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.91, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c8.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c8 <- D1(n*p)
d2.t_c8 <- D2(n*p)
d3.t_c8 <- D3(n*p)
d4.t_c8 <- D4(n*p)
d5.t_c8 <- D5(n*p)
d6.t_c8 <- D6(n*p)
d7.t_c8 <- D7(n*p)
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
Plotagem
# Histogramas Caso 8 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c8, NA, d3.t_c8, Hs, Hr, d6.t_c8, d1.t_c8)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c8.1, medias, variancias, k, 8, p)

# com N = 3000
medias <- c(d1.t_c8, NA, d3.t_c8, Hs, Hr, d6.t_c8, d1.t_c8)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c8.2, medias, variancias, k, 8, p)

Configuração 9
Com 1000 amostras:
# Caso 9 ------------------------------------------------------------------
n <- 1000 # tamanho de cada amostra
# N = 1000
N <- 1000 # numero de amostras
p <- c(0.45, 0.47, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c9.1 <- id(a, N)
Com 3000 amostras:
# N = 3000
N <- 3000 # numero de amostras
p <- c(0.45, 0.47, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01) # participacoes de mercado
set.seed(123)
a <- rmultinom(N, n, p)
id_c9.2 <- id(a, N)
Índices de dominância teóricos
para essa configuração
# Calculo do valor teorico dos indices de dominancia
d1.t_c9 <- D1(n*p); d1.t_c9
## [1] 0.3602222
d2.t_c9 <- D2(n*p); d2.t_c9
## [1] 0.2885691
d3.t_c9 <- D3(n*p); d3.t_c9
## [1] 0.5298316
d4.t_c9 <- D4(n*p); d4.t_c9
## [1] 0.7830718
d5.t_c9 <- D5(n*p); d5.t_c9
## [1] 0.8491802
d6.t_c9 <- D6(n*p); d6.t_c9
## [1] 0.3602222
d7.t_c9 <- D7(n*p); d7.t_c9
## [1] 0.6001852
Entropias e variância das
entropias
# Entropias teoricas
Hs <- -sum(p*log(p)) # entropia de shannon
Hr <- -log(sum(p^2)) # entropia de renyi com alpha = 2
Ht <- 1 - sum(p^2) # entropia de tsallis com alpha = 2
# variancia teorica das entropias
v_shannon <- ( sum(p*(log(p)^2)) - (Hs^2) )/n
v_renyi <- ( 4*( ((sum(p^2)^(-2)) * sum(p^3)) - 1 ) )/n
v_tsallis <- ( 4*(sum(p^3) - (sum(p^2)^2)) )/n
Variâncias assintóticas de
alguns índices de dominância
# Variancia teorica dos indices de dominancia
k <- length(p) # numero de empresas
v1 <- ((k/(k-1))^2) * v_tsallis # variancia do D1
v3 <- v_shannon/(log(k)^2) # variancia do D3
v6 <- ((k/(k-1))^2) * v_tsallis # variancia do D6
Plotagem
# Histogramas Caso 9 ------------------------------------------------------
# com N = 1000
medias <- c(d1.t_c9, NA, d3.t_c9, Hs, Hr, d6.t_c9, d1.t_c9)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c9.1, medias, variancias, k, 9, p)

# com N = 3000
medias <- c(d1.t_c9, NA, d3.t_c9, Hs, Hr, d6.t_c9, d1.t_c9)
variancias <- c(v1, NA, v3, v_shannon, v_renyi, v6, v1)
plotagem(id_c9.2, medias, variancias, k, 9, p)

Teste
de Normalidade - Jarque-Bera
|
Cenario
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
|
1.1
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
|
1.2
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
|
2.1
|
0.8662
|
0.0394
|
0.5733
|
0.9825
|
0.3588
|
0.8662
|
0.9799
|
|
2.2
|
0.7659
|
<= 0.01
|
0.4954
|
0.4261
|
<= 0.01
|
0.7659
|
0.4553
|
|
3.1
|
0.4336
|
0.3167
|
0.2818
|
0.6137
|
0.6111
|
0.4336
|
0.6648
|
|
3.2
|
0.0978
|
0.0423
|
0.1129
|
0.6525
|
0.2137
|
0.0978
|
0.2769
|
|
4.1
|
0.0234
|
0.2645
|
<= 0.01
|
<= 0.01
|
0.1041
|
0.0234
|
0.3331
|
|
4.2
|
0.0249
|
0.0568
|
<= 0.01
|
<= 0.01
|
0.2465
|
0.0249
|
0.1913
|
|
5.1
|
0.4024
|
0.1498
|
0.4453
|
0.2425
|
0.061
|
0.4024
|
0.2704
|
|
5.2
|
0.1188
|
0.5659
|
0.8601
|
0.0303
|
<= 0.01
|
0.1188
|
0.0296
|
|
6.1
|
0.7695
|
0.6862
|
0.8501
|
0.6228
|
0.2291
|
0.7695
|
0.5441
|
|
6.2
|
0.1057
|
0.2306
|
0.3721
|
0.0842
|
<= 0.01
|
0.1057
|
0.02
|
|
7.1
|
<= 0.01
|
0.1188
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
0.3753
|
|
7.2
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
<= 0.01
|
|
8.1
|
0.4076
|
<= 0.01
|
0.1323
|
0.8805
|
0.9358
|
0.4076
|
0.6641
|
|
8.2
|
0.7186
|
<= 0.01
|
0.2427
|
0.5759
|
0.1812
|
0.7186
|
0.975
|
|
9.1
|
0.1504
|
0.1821
|
0.1957
|
0.1038
|
0.0379
|
0.1504
|
0.1086
|
|
9.2
|
0.1227
|
<= 0.01
|
0.1024
|
0.032
|
<= 0.01
|
0.1227
|
0.0701
|
Erro
Quadrático Médio
|
caso
|
melhor
|
segundo_melhor
|
|
1.1
|
D6
|
D1
|
|
1.2
|
D6
|
D1
|
|
2.1
|
D5
|
D7
|
|
2.2
|
D5
|
D7
|
|
3.1
|
D6
|
D1
|
|
3.2
|
D6
|
D1
|
|
4.1
|
D1
|
D6
|
|
4.2
|
D1
|
D6
|
|
5.1
|
D5
|
D7
|
|
5.2
|
D5
|
D7
|
|
6.1
|
D5
|
D7
|
|
6.2
|
D5
|
D7
|
|
7.1
|
D1
|
D6
|
|
7.2
|
D1
|
D6
|
|
8.1
|
D5
|
D4
|
|
8.2
|
D5
|
D4
|
|
9.1
|
D5
|
D7
|
|
9.2
|
D5
|
D7
|
Coeficiente de variação
|
caso
|
melhor
|
segundo_melhor
|
|
1.1
|
D7
|
D2
|
|
1.2
|
D7
|
D2
|
|
2.1
|
D5
|
D7
|
|
2.2
|
D5
|
D7
|
|
3.1
|
D7
|
D5
|
|
3.2
|
D7
|
D5
|
|
4.1
|
D7
|
D2
|
|
4.2
|
D7
|
D2
|
|
5.1
|
D5
|
D7
|
|
5.2
|
D5
|
D7
|
|
6.1
|
D5
|
D7
|
|
6.2
|
D5
|
D7
|
|
7.1
|
D7
|
D2
|
|
7.2
|
D7
|
D2
|
|
8.1
|
D5
|
D4
|
|
8.2
|
D5
|
D4
|
|
9.1
|
D5
|
D7
|
|
9.2
|
D5
|
D7
|
LS0tDQp0aXRsZTogJ1NpbXVsYcOnw6NvIC0gw41uZGljZXMgZGUgZG9taW7Dom5jaWEnDQphdXRob3I6ICcqSm9uYXMgRnJlaXJlIFJpYmVpcm8qJw0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnKiVkIGRlICVCLCAgJVkqJylgIg0KbGluay1jaXRhdGlvbnM6IHRydWUNCmxhbmc6ICJwdC1iciINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZToNCiAgICAgIGJvb3Rzd2F0Y2g6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDogYnJlZXplZGFyaw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGFuY2hvcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGNpdGF0aW9uX3BhY2thZ2U6IGJpYmxhdGV4DQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgcGFjb3Rlcw0KDQpsaWJyYXJ5KHRzZXJpZXMpICMgcHJhIGZhemVyIG8gdGVzdGUgZGUgSmFycXVlLUJlcmENCmxpYnJhcnkoY2FyKSAjIHBybyBxcVBsb3QgY29tIGFzIGJhbmRhcw0KYGBgDQoNCiMgw41uZGljZXMgZGUgRG9taW7Dom5jaWEgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KIyMgJERfMSQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF8xJDoNCiQkRDEgPSBcdGV4dHtOb3JtfShISEkpID0gXGZyYWN7ayBcc3VtX3tpPTF9XntrfSBwX2leMiAtIDF9e2sgLSAxfSQkDQpgYGB7cn0NCkQxIDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIHN1bSh4KSAjIG51bWVybyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB4L24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIEhISSA8LSBzdW0ocHJvcF4yKSAjIGluZGljZSBkZSBIZXJmaW5kYWhs4oCTSGlyc2NobWFuDQogIA0KICBEMSA8LSAoaypISEkgLSAxKS8oay0xKQ0KICByZXR1cm4oRDEpDQp9DQpgYGANCg0KIyMgJERfMiQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0Kw41uZGljZSBkZSBSb3NlbmJsdXRo4oCTSGFsbOKAk1RpZGVtYW5uOiANCiQkXGJlZ2lue2FsaWduKn0NCgkJSV97XHRleHR7Um9zfX0gJj0gXGZyYWN7MX17MlxzdW1fe2k9MX1ee2t9IGlcLHBfeyhpKX0gLSAxfSANCglcZW5ke2FsaWduKn0kJA0KCQ0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF8yJDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF8yICY9IFxmcmFje0lfe1x0ZXh0e1Jvc319IC0gMS9rfXsxLSBcZnJhY3sxfXtrfX0gXFwNCgkJJj0gXGZyYWN7ayBJX3tcdGV4dHtSb3N9fSAtIDF9e2sgLSAxfS4NCglcZW5ke2FsaWduKn0kJA0KCQ0KYGBge3J9DQpEMiA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBzdW0oeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB4L24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgcHJvcF9PIDwtIHNvcnQocHJvcCwgZGVjcmVhc2luZyA9IFQpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvIG9yZGVuYWRhcw0KICBwZXNvcyA8LSBzZXFfYWxvbmcocHJvcF9PKSAjIGluZGljZXMgZGFzIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2FkbyBvcmRlbmFkYXMNCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIElyb3MgPC0gMS8oMipzdW0ocGVzb3MqcHJvcF9PKSAtIDEpICMgaW5kaWNlIGRlIFJvc2VuYmx1dGjigJNIYWxs4oCTVGlkZW1hbm4NCiAgDQogIEQyIDwtIChrKklyb3MgLSAxKS8oayAtIDEpDQogIHJldHVybihEMikNCn0NCmBgYA0KDQojIyAkRF8zJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpFbnRyb3BpYSBkZSBTaGFubm9uOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlIX3MgPSAtXHN1bV97aT0xfV57a31wX2lcbG4gcF9pLg0KCVxlbmR7YWxpZ24qfSAkJA0KDQrDjW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzMkOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlEXzMgJj0gMSAtIFx0ZXh0e05vcm19KEhfcykgXFwNCgkJJj0gMSAtIFxmcmFje0hfc317XGxuIGt9DQoJXGVuZHthbGlnbip9JCQNCgkNCmBgYHtyfQ0KRDMgPC0gZnVuY3Rpb24oeCl7DQogIG4gPC0gc3VtKHgpICMgdG90YWwgZGUgdmVuZGFzDQogIHByb3AgPC0geC9uICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQogIGsgPC0gbGVuZ3RoKHgpICMgbnVtZXJvIGRlIGVtcHJlc2FzDQogIA0KICBIcyA8LSAtc3VtKHByb3AqbG9nKHByb3ApLCBuYS5ybSA9IFQpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KICBIc05vcm0gPC0gSHMvbG9nKGspICMgZW50cm9waWEgZGUgc2hhbm5vbiBub3JtYWxpemFkYQ0KICANCiAgRDMgPC0gMSAtIEhzTm9ybQ0KICByZXR1cm4oRDMpDQp9DQpgYGANCg0KDQojIyAkRF80JCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0Kw41uZGljZSBkZSBIZWlwOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlJX3tcdGV4dHtIZWlwfX0gJj0gXGZyYWN7ZV57SF9TfSAtIDF9e2sgLSAxfSwNCglcZW5ke2FsaWduKn0kJA0KDQrDjW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzQkOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlEXzQgJj0gMSAtIElfe1x0ZXh0e0hlaXB9fSBcXA0KCQkmPSBcZnJhY3trIC0gZV57SF9TfX17ayAtIDF9DQoJXGVuZHthbGlnbip9JCQNCg0KYGBge3J9DQpENCA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBzdW0oeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgcHJvcCA8LSB4L24gIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIEhzIDwtIC1zdW0ocHJvcCpsb2cocHJvcCksIG5hLnJtID0gVCkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQogIEloZWlwIDwtIChleHAoSHMpIC0gMSkvKGsgLSAxKSAjIGluZGljZSBkZSBIZWlwDQogIA0KICBENCA8LSAxIC0gSWhlaXANCiAgcmV0dXJuKEQ0KQ0KfQ0KYGBgDQoNCiMjICREXzUkIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCsONbmRpY2UgZGUgSGFubmFoLUtheToNCiQkXGJlZ2lue2FsaWduKn0NCgkJSV97SEt9KFxhbHBoYSkgJj0gXGxlZnQoIFxzdW1fe2k9MX1ee2t9IHBfaV5cYWxwaGEgXHJpZ2h0KV57XGZyYWN7MX17MS1cYWxwaGF9fSwgXHF1YWQgXGFscGhhPjAsIFxhbHBoYSBcbmVxIDEuDQoJXGVuZHthbGlnbip9JCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF81JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJRF81ICY9IFxmcmFje2sgLSBJX3tIS30oMil9e2sgLSAxfVxcDQoJCSY9IFxmcmFje2tcc3VtX3tpPTF9XmtwX2leMiAtIDF9eyhrLTEpXHN1bV97aT0xfV5rcF9pXjJ9DQoJCVxlbmR7YWxpZ24qfSQkDQpgYGB7cn0NCkQ1IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIHN1bSh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICBwcm9wIDwtIHgvbiAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KICBrIDwtIGxlbmd0aCh4KSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgSWhrIDwtIDEvc3VtKHByb3BeMikgIyBpbmRpY2UgZGUgSGFubmFoLUtheQ0KICANCiAgRDUgPC0gKGsgLSBJaGspLyhrLTEpDQogIHJldHVybihENSkNCn0NCmBgYA0KDQojIyAkRF82JCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpFc3RhdMOtc3RpY2EgJFZBJDoNCiQkXGJlZ2lue2FsaWduKn0NCgkJVkEgJj0gMSAtIA0KCQlcZnJhY3tcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee2t9IFxsZWZ0KGZfaSAtIFxmcmFje259e2t9XHJpZ2h0KV4yfQ0KCQl7bl4yIFxmcmFjeyhrLTEpfXtrfX0sDQoJXGVuZHthbGlnbip9JCQNCg0Kw41uZGljZSBkZSBkb21pbsOibmNpYSAkRF82JDoNCiQkXGJlZ2lue2FsaWduKn0NCgkgCURfNiAmPSAxIC0gVkFcXA0KCSAJJj0gXGZyYWN7a317ay0xfSBcbGVmdCggXHN1bV97aT0xfV57a30gcF9pXjIgLSBcZnJhY3sxfXtrfSBccmlnaHQpDQoJIFxlbmR7YWxpZ24qfSQkDQoJIA0KYGBge3J9DQpENiA8LSBmdW5jdGlvbih4KXsNCiAgbiA8LSBzdW0oeCkgIyB0b3RhbCBkZSB2ZW5kYXMNCiAgayA8LSBsZW5ndGgoeCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCiAgDQogIFZBIDwtIDEgLSAoIHN1bSggKHggLSAobi9rKSleMiApLyggKCAobl4yKSooay0xKSApL2sgKSApICMgZXN0YXRpc3RpY2EgVkENCiAgDQogIEQ2IDwtIDEgLSBWQQ0KICByZXR1cm4oRDYpDQp9DQpgYGANCg0KIyMgJERfNyQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KRXN0YXTDrXN0aWNhICRTREEkOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlTREEgJj0gMSAtIA0KCQlcc3FydHtcZnJhY3tcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee2t9IFxsZWZ0KGZfaSAtIFxmcmFje259e2t9XHJpZ2h0KV4yfQ0KCQl7bl4yIFxmcmFjeyhrLTEpfXtrfX19DQoJXGVuZHthbGlnbip9JCQNCg0KSW5kaWNlIGRlIGRvbWluw6JuY2lhICREXzckOg0KJCRcYmVnaW57YWxpZ24qfQ0KCQlEXzcgJj0gMSAtIFNEQSBcXFs2cHRdDQoJCSY9IFxzcXJ0e1xmcmFje2t9e2stMX0gXGxlZnQoXHN1bV97aT0xfV57a30gcF9pXjIgLSBcZnJhY3sxfXtrfVxyaWdodCl9IA0KCVxlbmR7YWxpZ24qfSQkDQoJDQpgYGB7cn0NCkQ3IDwtIGZ1bmN0aW9uKHgpew0KICBuIDwtIHN1bSh4KSAjIHRvdGFsIGRlIHZlbmRhcw0KICBrIDwtIGxlbmd0aCh4KSAjIG51bWVybyBkZSBlbXByZXNhcw0KICANCiAgU0RBIDwtIDEgLSBzcXJ0KCBzdW0oICh4IC0gKG4vaykpXjIgKS8oICggKG5eMikqKGstMSkgKS9rICkgKSAjIGVzdGF0aXN0aWNhIFNEQQ0KICANCiAgRDcgPC0gMSAtIFNEQQ0KICByZXR1cm4oRDcpDQp9DQpgYGANCg0KIyBSZWxhw6fDtWVzIGVudHJlIG9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhDQoNCiMjIEVudHJlIG9zIMOtbmRpY2VzIHF1ZSBkZXBlbmRlbSBkZSAkSEhJJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KU29tZW50ZSAkRF8xLCBcOyBEXzUsICBcOyBEXzZcOyBcdGV4dHsgZSB9IFw7IERfNyQgZGVwZW5kZW0gZGUgJEhISSQ6DQokJFxiZWdpbnthbGlnbip9DQogICZEXzEgPSBEXzZcXA0KICAmRF83ID0gXHNxcnR7RF82fSA9IFxzcXJ0e0RfMX1cXA0KICAmRF81ID0gXGZyYWN7RF8xfXtISEl9PSBcZnJhY3tEXzZ9e0hISX1cXA0KICAmRF81ID0gXGZyYWN7RF83XjJ9e0hISX0NClxlbmR7YWxpZ24qfSQkDQoNCiMjIEVudHJlIG9zIMOtbmRpY2VzIHF1ZSBkZXBlbmRlbSBkZSAkSF9TJCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KU29tZW50ZSAkRF8zIFw7IFx0ZXh0eyBlIH0gXDsgRF80JCBkZXBlbmRlbSBkZSAkSF9TJDoNCiQkXGJlZ2lue2FsaWduKn0NCiAgJkRfNCA9IFxmcmFje2t9e2sgLSAxfSgxIC0gZV57MS1EXzN9KQ0KXGVuZHthbGlnbip9JCQNCg0KIyBJbnRlcnZhbG9zIHBhcmEgb3Mgw61uZGljZXMgZGUgZG9taW7Dom5jaWENClNhYmUtc2UgcXVlIA0KJCRcYmVnaW57YWxpZ24qfQ0KICBISEkgJjwgMCwwMSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbXBldGl0aXZpZGFkZX1cXA0KICAwLDAxIFxsZXEgSEhJICY8IDAsMTUgXHJpZ2h0YXJyb3cgXHRleHR7cG91Y28gY29uY2VudHJhZG99XFwNCiAgMCwxNSBcbGVxIEhISSAmPCAwLDI1IFxyaWdodGFycm93IFx0ZXh0e2NvbmNlbnRyYcOnw6NvIG3DqWRpYX1cXA0KICBISEkgJlxnZXEgMC4yNSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbmNlbnRyYcOnw6NvfS4NClxlbmR7YWxpZ24qfSQkDQpQZWxhIHJlbGHDp8OjbyBlbnRyZSAkSEhJJCwgJERfMSBcOyBcdGV4dHsgZSB9IFw7ICBEXzYkLCB0ZW1vcyBxdWU6DQokJFxiZWdpbnthbGlnbip9DQogIERfMSA9IERfNiAmPCBcZnJhY3swLDAxayAtIDF9e2sgLSAxfSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbXBldGl0aXZpZGFkZX1cXA0KICBcZnJhY3swLDAxayAtIDF9e2sgLSAxfSBcbGVxIERfMSA9IERfNiAmPCBcZnJhY3swLDE1ayAtIDF9e2sgLSAxfSBccmlnaHRhcnJvdyBcdGV4dHtwb3VjbyBjb25jZW50cmFkb31cXA0KICBcZnJhY3swLDE1ayAtIDF9e2sgLSAxfSBcbGVxIERfMSA9IERfNiAmPCBcZnJhY3swLDI1ayAtIDF9e2sgLSAxfSBccmlnaHRhcnJvdyBcdGV4dHtjb25jZW50cmHDp8OjbyBtw6lkaWF9XFwNCiAgRF8xID0gRF82ICZcZ2VxIFxmcmFjezAsMjVrIC0gMX17ayAtIDF9IFxyaWdodGFycm93IFx0ZXh0e2FsdGEgY29uY2VudHJhw6fDo299DQpcZW5ke2FsaWduKn0kJA0KDQpQZWxhIHJlbGHDp8OjbyBlbnRyZSAkRF8xJCwgJERfNiQgZSAkRF83JCwgdGVtb3MgcXVlOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBEXzcgJjwgXHNxcnR7XGZyYWN7MCwwMWsgLSAxfXtrIC0gMX19IFxyaWdodGFycm93IFx0ZXh0e2FsdGEgY29tcGV0aXRpdmlkYWRlfVxcDQogIFxzcXJ0e1xmcmFjezAsMDFrIC0gMX17ayAtIDF9fSBcbGVxIERfNyAmPCBcc3FydHtcZnJhY3swLDE1ayAtIDF9e2sgLSAxfX0gXHJpZ2h0YXJyb3cgXHRleHR7cG91Y28gY29uY2VudHJhZG99XFwNCiAgXHNxcnR7XGZyYWN7MCwxNWsgLSAxfXtrIC0gMX19IFxsZXEgRF83ICY8IFxzcXJ0e1xmcmFjezAsMjVrIC0gMX17ayAtIDF9fSBccmlnaHRhcnJvdyBcdGV4dHtjb25jZW50cmHDp8OjbyBtw6lkaWF9XFwNCiAgRF83ICZcZ2VxIFxzcXJ0e1xmcmFjezAsMjVrIC0gMX17ayAtIDF9fSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbmNlbnRyYcOnw6NvfQ0KXGVuZHthbGlnbip9JCQNCg0KUGVsYSByZWxhw6fDo28gZW50cmUgJERfNSQgZSAkSEhJJCwgdGVtb3MgcXVlOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBEXzUgJjwgXGZyYWN7MCwwMWsgLSAxfXswLDAxKGsgLSAxKX0gXHJpZ2h0YXJyb3cgXHRleHR7YWx0YSBjb21wZXRpdGl2aWRhZGV9XFwNCiAgXGZyYWN7MCwwMWsgLSAxfXswLDAxKGsgLSAxKX0gXGxlcSBEXzUgJjwgXGZyYWN7MCwxNWsgLSAxfXswLDE1KGsgLSAxKX0gXHJpZ2h0YXJyb3cgXHRleHR7cG91Y28gY29uY2VudHJhZG99XFwNCiAgXGZyYWN7MCwxNWsgLSAxfXswLDE1KGsgLSAxKX0gXGxlcSBEXzUgJjwgXGZyYWN7MCwyNWsgLSAxfXswLDI1KGsgLSAxKX0gXHJpZ2h0YXJyb3cgXHRleHR7Y29uY2VudHJhw6fDo28gbcOpZGlhfVxcDQogIERfNSAmXGdlcSBcZnJhY3swLDI1ayAtIDF9ezAsMjUoayAtIDEpfSBccmlnaHRhcnJvdyBcdGV4dHthbHRhIGNvbmNlbnRyYcOnw6NvfQ0KXGVuZHthbGlnbip9JCQNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRnVuY2FvIHBhcmEgY2FsY3VsYXIgdG9kb3Mgb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZCA8LSBmdW5jdGlvbih4LCBOKXsgIyB4ID0gbWF0cml6IGNvbSBOIGFtb3N0cmFzDQogICAgICAgICAgICAgICAgICAgICAgIyBOID0gbnVtZXJvIGRlIGFtb3N0cmFzDQogIA0KICBkb21pbmFuY2lhIDwtIG1hdHJpeCgwLCBuY29sID0gNywgbnJvdyA9IE4pICMgbWF0cml6IHF1ZSB2YWkgcmVjZWJlciBvcyBpbmRpY2VzDQogIGNvbG5hbWVzKGRvbWluYW5jaWEpIDwtIGMoIkQxIiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IikNCiAgDQogIGZvcihpIGluIDE6Til7DQogICAgZG9taW5hbmNpYVtpLCAxXSA8LSBEMSh4WyxpXSkNCiAgICBkb21pbmFuY2lhW2ksIDJdIDwtIEQyKHhbLGldKQ0KICAgIGRvbWluYW5jaWFbaSwgM10gPC0gRDMoeFssaV0pDQogICAgZG9taW5hbmNpYVtpLCA0XSA8LSBENCh4WyxpXSkNCiAgICBkb21pbmFuY2lhW2ksIDVdIDwtIEQ1KHhbLGldKQ0KICAgIGRvbWluYW5jaWFbaSwgNl0gPC0gRDYoeFssaV0pDQogICAgZG9taW5hbmNpYVtpLCA3XSA8LSBENyh4WyxpXSkNCiAgfQ0KICByZXR1cm4oZG9taW5hbmNpYSkNCn0NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBGdW5jYW8gcGFyYSBwbG90YWdlbSBkZSBoaXN0b2dyYW1hcyBlIGN1cnZhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3RhZ2VtIDwtIGZ1bmN0aW9uKGRhZG9zLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIGNhc28sIHApIHsNCiAgcGFyKG1mcm93ID0gYygzLCAzKSwgbWFyID0gYygzLCAzLCAyLCAxKSkNCiAgDQogIHRpcG9zIDwtIGMoIm5vcm0iLCBOQSwgIm5vcm0iLCAiZjEiLCAiZjEiLCAibm9ybSIsICJmMiIpDQogIA0KICBmb3IgKGkgaW4gMTo3KSB7DQogICAgaGlzdChkYWRvc1ssIGldLA0KICAgICAgICAgbWFpbiA9IHBhc3RlMCgiSGlzdG9ncmFtYSBkZSBEIiwgaSksDQogICAgICAgICBjb2wgPSAibGlnaHRncmVlbiIsIHhsYWIgPSBwYXN0ZTAoIkQiLCBpKSwNCiAgICAgICAgIHlsYWIgPSAiRGVuc2lkYWRlIiwgZnJlcSA9IEZBTFNFLCBib3JkZXIgPSAid2hpdGUiKQ0KICAgIA0KICAgICMgY3VydmEgZW1ww61yaWNhDQogICAgbGluZXMoZGVuc2l0eShkYWRvc1ssIGldKSwgbHdkID0gMiwgY29sID0gImJsdWUiKQ0KICAgIA0KICAgICMgY3VydmEgdGXDs3JpY2ENCiAgICBpZiAoIWlzLm5hKHRpcG9zW2ldKSkgew0KICAgICAgaWYgKHRpcG9zW2ldID09ICJub3JtIikgew0KICAgICAgICBjdXJ2ZShkbm9ybSh4LCBtZWRpYXNbaV0sIHNxcnQodmFyaWFuY2lhc1tpXSkpLCBsd2QgPSAyLCBhZGQgPSBULCBjb2wgPSAicmVkIikNCiAgICAgIH0gZWxzZSBpZiAodGlwb3NbaV0gPT0gImYxIikgew0KICAgICAgICBjdXJ2ZShmMSh4LCBtZWRpYXNbaV0sIHZhcmlhbmNpYXNbaV0sIGspLCBsd2QgPSAyLCBhZGQgPSBULCBjb2wgPSAicmVkIikNCiAgICAgIH0gZWxzZSBpZiAodGlwb3NbaV0gPT0gImYyIikgew0KICAgICAgICBjdXJ2ZShmMih4LCBtZWRpYXNbaV0sIHZhcmlhbmNpYXNbaV0pLCBsd2QgPSAyLCBhZGQgPSBULCBjb2wgPSAicmVkIikNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgcGxvdC5uZXcoKQ0KICANCiAgIyBwYWluZWwgZGEgbGVnZW5kYQ0KICBwbG90Lm5ldygpDQogIA0KICBwcm9iIDwtIHBhc3RlMCgiKCIsIHBhc3RlKHAsIGNvbGxhcHNlID0gIiwgIiksICIpIikNCiAgcGFyKHhwZCA9IE5BKQ0KICBsZWdlbmQoImJvdHRvbWxlZnQiLA0KICAgICAgICAgbGVnZW5kID0gYygiQ3VydmEgZW1ww61yaWNhIiwgIkN1cnZhIHRlw7NyaWNhIiwgIiAiLA0KICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIkNhc28gIiwgY2FzbywgIiBjb20gTiA9ICIsIG5yb3coZGFkb3MpLCAiIGFtb3N0cmFzIiksDQogICAgICAgICAgICAgICAgICAgIGJxdW90ZShzY3JpcHRzdHlsZShib2xkKFApID09IC4ocHJvYiledCkpKSwNCiAgICAgICAgIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgIndoaXRlIiwgIndoaXRlIiwgIndoaXRlIiksDQogICAgICAgICBsd2QgPSAyLCBidHkgPSAibyIsDQogICAgICAgICBjZXggPSAxLjMsIGluc2V0ID0gYygtMS40LCAtMC4xKSkNCiAgcGFyKHhwZCA9IEZBTFNFKQ0KICANCiAgcGFyKG1mcm93ID0gYygxLCAxKSkNCn0NCmBgYA0KDQojIERpc3RyaWJ1acOnw6NvIGFzc2ludMOzdGljYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQpTZWphICQoXGNoaSwgXGJldGFfXGNoaSwgIFApX3tQXGluXERlbHRhX019JCB1bSBlc3Bhw6dvIGVzdGF0w61zdGljbywgb25kZSAkXGNoaSA9IFx7eF8xLCAuLi4sIHhfTVx9JCwgJFxEZWx0YV9NID0gXHtQID0gKHBfMSwgLi4uLCBwX00pXnQkLCAkcF9pIFxnZXEgMCQgZSAkXHN1bV97aT0xfV5NcF9pID0gMVx9JCBlICRcYmV0YV9cY2hpJCBhIHNpZ21hLcOhbGdlYnJhICBkZSB0b2RvcyBvcyBzdWJjb25qdW50b3MgZGUgJFxjaGkkLiBQYXJhIGFsZ3VtICRQXGluIFxEZWx0YV9NJCwgYSBlbnRyb3BpYSAkSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9JCDDqSBkZWZpbmlkYSBwZWxhIHNlZ3VpbnRlIGV4cHJlc3PDo286DQpcWw0KSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9KFApID0gaFxsZWZ0KCBcZnJhY3tcc3VtX3tpPTF9Xk12X2lcdmFycGhpXzEocF9pKX17XHN1bV97aT0xfV5Ndl9pXHZhcnBoaV8yKHBfaSl9IFxyaWdodCksDQpcXQ0Kb25kZSAkdl9pPjAkLCAkaSA9IDEsIC4uLiwgTSQsIMOpIG8gcGVzbyBhc3NvY2lhZG8gYW8gZWxlbWVudG8gJHhfaSQgZGUgJFxjaGkkLiBBbMOpbSBkaXNzbywgbsOzcyBzdXBvbW9zIHF1ZSAkXHZhcnBoaV8xOiBbMCwxKSBccmlnaHRhcnJvdyBcbWF0aGJie1J9JCwgJFx2YXJwaGlfMjogWzAsMSkgXHJpZ2h0YXJyb3cgXG1hdGhiYntSfSQgZSAkaDogXG1hdGhiYntSfSBccmlnaHRhcnJvdyBcbWF0aGJie1J9JCBzZWphbSBxdWFpc3F1ZXIgZG9zIHRyaXBsb3MgZGUgZnVuw6fDtWVzIGFwcmVzZW50YWRvcyBuYSB0YWJlbGEgYXByZXNlbnRhZGEgbm8gYXJ0aWdvLiBBIHRhYmVsYSBzZWd1aW50ZSBtb3N0cmEgYWxndW1hcyBkZXNzYXMgZnVuw6fDtWVzIHBhcmEgYXMgZW50cm9waWFzIHV0aWxpemFkYXMgbm9zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIGFwcmVzZW50YWRvcyBhbnRlcmlvcm1lbnRlLg0KDQp8IEVudHJvcGlhIHwgXChoKHgpXCkgICAgICAgICAgICAgICAgICAgICAgICB8IFwoXHZhcnBoaV8xKHgpXCkgICAgICAgICAgIHwgXChcdmFycGhpXzIoeClcKSAgICAgICAgIHwgXCh2X2lcKSB8DQp8Oi0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgU2hhbm5vbiB8IFwoeFwpICAgICAgICAgICAgICAgICB8IFwoLXggXGxvZyB4XCkgICAgICAgICAgICAgICAgICAgICAgfCBcKHhcKSAgICAgICAgICAgICAgICAgICAgfCBcKHZcKSB8DQp8IFLDqW55aSB8IFwoKDEgLSByKV57LTF9XGxvZyB4XCkgfCBcKHheclwpICAgICAgICAgICAgICAgICB8IFwoeFwpICAgICAgICAgICAgICAgICAgfCBcKHZcKSB8DQp8IFRzYWxsaXMgfCBcKFwgKHItMSleey0xfSgxIC0geCkgXCkgfCBcKCB4XnIgXCkgfCBcKCB4IFwpIHwgXCggdiBcKSB8DQoNCj4gKipUZW9yZW1hKio6IFN1cG9uaGEgcXVlICRoXGluIENeMShcbWF0aGJie1J9KSQsICRcdmFycGhpXzEgXGluIENeMSgoMCwxKSkkLCAkXHZhcnBoaV8yIFxpbiBDXjEoKDAsMSkpJCBlICRwX2k+MCwgXDsgaSA9IDEsIC4uLiwgTS4kIFNlIGEgZnJlcXXDqm5jaWEgcmVsYXRpdmEgJFxoYXR7UH0kIMOpIG8gZXN0aW1hZG9yIGRlICRQPShwXzEsIC4uLiwsIHBfTSkkIGJhc2VhZG8gZW0gdW1hIGFtb3N0cmEgYWxlYXTDs3JpYSBkZSB0YW1hbmhvICRuJCwgZW50w6NvDQokJFxiZWdpbnthbGlnbip9DQogIG5eezEvMn1bSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9KFxoYXR7UH0pIC0gSF97aCx2fV57XHZhcnBoaV8xLCBcdmFycGhpXzJ9KFApXVxvdmVyc2V0e0R9e1xyaWdodGFycm93fU4oMCwgXHNpZ21hXjIpLA0KXGVuZHthbGlnbip9JCQNCmVtIHF1ZSANCiQkXGJlZ2lue2FsaWduKn0NCiAgXHNpZ21hXjIgJj0gXHN1bV97aSA9IDF9Xk10X2leMnBfaSAtIFxiaWdnKFxzdW1fe2kgPSAxfV5NdF9pcF9pXGJpZ2cpXjJcXA0KICB0X2kgJj0gXGZyYWN7ZH17ZHBfaX1IX3toLHZ9XntcdmFycGhpXzEsIFx2YXJwaGlfMn0oUCkuDQpcZW5ke2FsaWduKn0kJA0KDQpObyBjYXNvIGRhIEVudHJvcGlhIGRlIFNoYW5ub24sIEVudHJvcGlhIGRlIFRzYWxsaXMgZSBFbnRyb3BpYSBkZSBSw6lueWksIHRlbW9zIG9zIHNlZ3VpbnRlcyAkdF9pJ3MkOg0KDQp8IEVudHJvcGlhIHwgXCggdF9pIFwpIHwNCnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLXwNCnwgU2hhbm5vbiB8IFwoLSAoMSArIFxsb2cgcF9pKVwpIHwNCnwgUsOpbnlpIHwgXChcZnJhY3tyfXsxIC0gcn0gXCwgcF9pXntyIC0gMX0gXGxlZnRbXHN1bV97aSA9IDF9Xk0gcF9pXnJccmlnaHRdXnstMX1cKSB8DQp8IFRzYWxsaXMgfCBcKCAtXGZyYWN7cn17ciAtIDF9cF9pXntyIC0gMX0gIFwpIHwNCg0KTG9nbywgYSBkaXN0cmlidWnDp8OjbyBhc3NpbnTDs3RpY2EgZGFzIGVudHJvcGlhcyDDqSBkYWRhIHBvcjoNCg0KfCBFbnRyb3BpYSB8IERpc3RyaWJ1acOnw6NvIGFzc2ludMOzdGljYSB8DQp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IFNoYW5ub24gfCBcKCBcaGF0e0h9X3MgXG92ZXJzZXR7RH17XHRvfSBOXCFcbGVmdChIX3MsIFxmcmFjezF9e259XGxlZnQoXHN1bV97aT0xfV57a30gcF9pXGxuXjIgcF9pIC0gSF9zXjJccmlnaHQpXHJpZ2h0KSBcKSB8DQp8IFLDqW55aSB8IFwoICBcaGF0e0h9X1IgXG92ZXJzZXR7RH17XHRvfSBOXCFcbGVmdChIX1IsIFxmcmFjezF9e259IA0KICAgICAgICBcQmlnZ1sNCiAgICAgICAgXGxlZnQoXGZyYWN7XGFscGhhfXtcYWxwaGEgLSAxfVxyaWdodCleMiANCiAgICAgICAgXEJpZ2coIA0KICAgICAgICBcbGVmdChcc3VtX3tpPTF9XntrfSBwX2leXGFscGhhXHJpZ2h0KV57LTJ9IFxsZWZ0KFxzdW1fe2k9MX1ee2t9IHBfaV57MlxhbHBoYSAtIDF9XHJpZ2h0KQ0KICAgICAgICAtIFxsZWZ0KFxzdW1fe2k9MX1ee2t9IHBfaV5cYWxwaGFccmlnaHQpXjIgDQogICAgICAgIFxCaWdnKSANCiAgICAgICAgXEJpZ2ddDQogICAgICAgIFxyaWdodCkgXCkgfA0KfCBUc2FsbGlzIHwgXCggIFxoYXR7SH1fVCBcb3ZlcnNldHtEfXtcdG99IE5cIVxsZWZ0KEhfVCwgXGZyYWN7MX17bn0gDQogICAgICAgIFxCaWdnWw0KICAgICAgICBcbGVmdChcZnJhY3tcYWxwaGF9e1xhbHBoYSAtIDF9XHJpZ2h0KV4yIA0KICAgICAgICBcQmlnZygNCiAgICAgICAgXHN1bV97aT0xfV57a30gcF9pXnsyXGFscGhhIC0gMX0NCiAgICAgICAgLSBcbGVmdChcc3VtX3tpPTF9XntrfSBwX2leXGFscGhhXHJpZ2h0KV4yDQogICAgICAgIFxCaWdnKQ0KICAgICAgICBcQmlnZ10NCiAgICAgICAgXHJpZ2h0KSBcKSB8DQoNCg0KIyMgJERfMSQgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCiQkXGJlZ2lue2FsaWduKn0NCiAgXGhhdHtEfV8xIFxvdmVyc2V0e0R9e1xyaWdodGFycm93fSBOXGJpZ2coXGZyYWN7a1sxIC0gSF9UKDIpXSAtIDF9e2sgLSAxfSwgXGJpZ2dbXGZyYWN7a317ay0xfVxiaWdnXV4yXG1hdGhiYntWfWFyW1xoYXR7SH1fVCgyKV1cYmlnZykNClxlbmR7YWxpZ24qfSQkDQoNCiMjICREXzMkICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KJCRcYmVnaW57YWxpZ24qfQ0KICBcaGF0e0R9XzMgXG92ZXJzZXR7RH17XHJpZ2h0YXJyb3d9IE5cYmlnZygxIC0gXGZyYWN7SF9zfXtcbG9nIGt9LCBcZnJhY3tcbWF0aGJie1Z9YXIoXGhhdHtIfV9zKX17XGxvZ14yIGt9XGJpZ2cpDQpcZW5ke2FsaWduKn0kJA0KDQojIyAkRF80JCAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NClNlamEgJFcgPSBcaGF0e0R9XzQkLiBMb2dvLCB0ZW1vcyBxdWUgYSBkZW5zaWRhZGUgZGUgJFckIMOpIGRhZGEgcG9yOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBmX1codykgPSBcZnJhY3trIC0gMX17W2sgLSAoay0xKXddXHNxcnR7MlxwaSBcc2lnbWFeMl9TfX1leHBcYmlnZ1stXGZyYWN7W1xsb2coayAtIChrLTEpdykgLSBIX3NdXjJ9ezJcc2lnbWFfU14yfVxiaWdnXVxvdmVyc2V0e1xtYXRoYmJ7SX0odyl9e197KC1caW5mdHksIFxmcmFje2t9e2stMX0pfX0NClxlbmR7YWxpZ24qfSQkDQoNCmBgYHtyfQ0KIyBmZHAgZGUgRDQgZSBENSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmYxIDwtIGZ1bmN0aW9uKHgsIG11LCBzaWdtYTIsIGspew0KICAoIChrIC0gMSkvKChrIC0gKGstMSkqeCkqc3FydCgyKnBpKnNpZ21hMikpICkqZXhwKC0oKGxvZyhrIC0gKGstMSkqeCkgLSBtdSleMikvKDIqc2lnbWEyKSkNCn0NCmBgYA0KDQojIyAkRF81JCAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NClNlamEgJFYgPSBcaGF0e0R9XzUkLiBMb2dvLCB0ZW1vcyBxdWUgYSBkZW5zaWRhZGUgZGUgJFYkIMOpIGRhZGEgcG9yOg0KJCRcYmVnaW57YWxpZ24qfQ0KICBmX1YodikgPSBcZnJhY3trIC0gMX17W2sgLSAoay0xKXZdXHNxcnR7MlxwaSBcc2lnbWFeMl9SfX1leHBcYmlnZ1stXGZyYWN7W1xsb2coayAtIChrLTEpdikgLSBIX1JdXjJ9ezJcc2lnbWFfUl4yfVxiaWdnXVxvdmVyc2V0e1xtYXRoYmJ7SX0odil9e197KC1caW5mdHksIFxmcmFje2t9e2stMX0pfX0NClxlbmR7YWxpZ24qfSQkDQoNCmBgYHtyfQ0KIyBmZHAgZGUgRDQgZSBENSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmYxIDwtIGZ1bmN0aW9uKHgsIG11LCBzaWdtYTIsIGspew0KICAoIChrIC0gMSkvKChrIC0gKGstMSkqeCkqc3FydCgyKnBpKnNpZ21hMikpICkqZXhwKC0oKGxvZyhrIC0gKGstMSkqeCkgLSBtdSleMikvKDIqc2lnbWEyKSkNCn0NCmBgYA0KIyMgJERfNiQgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCiQkXGJlZ2lue2FsaWduKn0NCiAgXGhhdHtEfV82IFxvdmVyc2V0e0R9e1xyaWdodGFycm93fSBOXGJpZ2coXGZyYWN7a1sxIC0gSF9UKDIpXSAtIDF9e2sgLSAxfSwgXGJpZ2dbXGZyYWN7a317ay0xfVxiaWdnXV4yXG1hdGhiYntWfWFyW1xoYXR7SH1fVCgyKV1cYmlnZykNClxlbmR7YWxpZ24qfSQkDQoNCiMjICREXzckICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KU2VqYSAkVSA9IFxoYXR7RH1fNiQgZSAkWSA9IFxoYXR7RH1fNyA9IFxzcXJ0e1V9JC4gVGVtb3MgYSBzZWd1aW50ZSBkZW5zaWRhZGUgcXVlIGVzdMOhIGJlbSBkZWZpbmlkYSBzb21lbnRlIHBhcmEgJFxtYXRoYmJ7Ul4rfSQ6DQokJFxiZWdpbnthbGlnbip9DQogIGZfWSh5KSA9IFxmcmFjezJ5fXtcc3FydHsyXHBpXHNpZ21hXjJfVX19ZXhwXGJpZ2dbLVxmcmFjeyh5XjItXG11X1UpXjJ9ezJcc2lnbWFeMl9VfSBcYmlnZ11cb3ZlcnNldHtcbWF0aGJie0l9KHkpfXt7KDAsXGluZnR5KX19Lg0KXGVuZHthbGlnbip9JCQNCmBgYHtyfQ0KIyBmZHAgZGUgRDcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmYyIDwtIGZ1bmN0aW9uKHgsIG11LCBzaWdtYTIpew0KICAoICgyKngpL3NxcnQoMipwaSpzaWdtYTIpICkqZXhwKC0oKCh4XjIpIC0gbXUpXjIpLygyKnNpZ21hMikpDQp9DQoNCmBgYA0KDQojIFNpbXVsYcOnw6NvIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCiMjIENvbmZpZ3VyYcOnw6NvIDEgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpDb20gMTAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KIyBDYXNvIDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCm4gPC0gMTAwMCAjIHRhbWFuaG8gZGUgY2FkYSBhbW9zdHJhDQoNCiMgTiA9IDEwMDANCg0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4yNCwgMC4yNiwgMC4yNTUsIDAuMjQ1KSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzEuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMjQsIDAuMjYsIDAuMjU1LCAwLjI0NSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2MxLjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQpkMS50X2MxIDwtIEQxKG4qcCk7IGQxLnRfYzENCmQyLnRfYzEgPC0gRDIobipwKTsgZDIudF9jMQ0KZDMudF9jMSA8LSBEMyhuKnApOyBkMy50X2MxDQpkNC50X2MxIDwtIEQ0KG4qcCk7IGQ0LnRfYzENCmQ1LnRfYzEgPC0gRDUobipwKTsgZDUudF9jMQ0KZDYudF9jMSA8LSBENihuKnApOyBkNi50X2MxDQpkNy50X2MxIDwtIEQ3KG4qcCk7IGQ3LnRfYzENCmBgYA0KDQojIyMgRW50cm9waWFzIGUgdmFyacOibmNpYSBkYXMgZW50cm9waWFzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQpIcyA8LSAtc3VtKHAqbG9nKHApKSAjIGVudHJvcGlhIGRlIHNoYW5ub24NCkhyIDwtIC1sb2coc3VtKHBeMikpICMgZW50cm9waWEgZGUgcmVueWkgY29tIGFscGhhID0gMg0KSHQgPC0gMSAtIHN1bShwXjIpICMgZW50cm9waWEgZGUgdHNhbGxpcyBjb20gYWxwaGEgPSAyDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCnZfc2hhbm5vbiA8LSAoIHN1bShwKihsb2cocCleMikpIC0gIChIc14yKSApL24gDQp2X3JlbnlpIDwtICggNCooICgoc3VtKHBeMileKC0yKSkgKiBzdW0ocF4zKSkgLSAxICkgKS9uIA0Kdl90c2FsbGlzIDwtICggNCooc3VtKHBeMykgLSAoc3VtKHBeMileMikpICkvbg0KYGBgDQoNCiMjIyBWYXJpw6JuY2lhcyBhc3NpbnTDs3RpY2FzIGRlIGFsZ3VucyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgVmFyaWFuY2lhIHRlb3JpY2EgZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQprIDwtIGxlbmd0aChwKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQp2MSA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQxDQp2MyA8LSB2X3NoYW5ub24vKGxvZyhrKV4yKSAjIHZhcmlhbmNpYSBkbyBEMw0KdjYgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBENg0KDQp2MTsgdjM7IHY2DQpgYGANCg0KIyMjIFBsb3RhZ2VtIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSGlzdG9ncmFtYXMgQ2FzbyAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGNvbSBOID0gMTAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2MxLCBOQSwgZDMudF9jMSwgSHMsIEhyLCBkNi50X2MxLCBkMS50X2MxKQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzEuMSwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCAxLCBwKQ0KDQojIGNvbSBOID0gMzAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2MxLCBOQSwgZDMudF9jMSwgSHMsIEhyLCBkNi50X2MxLCBkMS50X2MxKQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzEuMiwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCAxLCBwKQ0KDQpgYGANCg0KDQoNCiMjIENvbmZpZ3VyYcOnw6NvIDIgIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpDb20gMTAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KbiA8LSAxMDAwICMgdGFtYW5obyBkZSBjYWRhIGFtb3N0cmENCg0KIyBOID0gMTAwMA0KDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjg1LCAwLjA1LCAwLjA1LCAwLjA1KSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzIuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuODUsIDAuMDUsIDAuMDUsIDAuMDUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jMi4yIDwtIGlkKGEsIE4pDQpgYGANCg0KIyMjIMONbmRpY2VzIGRlIGRvbWluw6JuY2lhIHRlw7NyaWNvcyBwYXJhIGVzc2EgY29uZmlndXJhw6fDo28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIENhbGN1bG8gZG8gdmFsb3IgdGVvcmljbyBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQpkMS50X2MyIDwtIEQxKG4qcCk7IGQxLnRfYzINCmQyLnRfYzIgPC0gRDIobipwKTsgZDIudF9jMg0KZDMudF9jMiA8LSBEMyhuKnApOyBkMy50X2MyDQpkNC50X2MyIDwtIEQ0KG4qcCk7IGQ0LnRfYzINCmQ1LnRfYzIgPC0gRDUobipwKTsgZDUudF9jMg0KZDYudF9jMiA8LSBENihuKnApOyBkNi50X2MyDQpkNy50X2MyIDwtIEQ3KG4qcCk7IGQ3LnRfYzINCmBgYA0KDQojIyMgRW50cm9waWFzIGUgdmFyacOibmNpYSBkYXMgZW50cm9waWFzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQpIcyA8LSAtc3VtKHAqbG9nKHApKSAjIGVudHJvcGlhIGRlIHNoYW5ub24NCkhyIDwtIC1sb2coc3VtKHBeMikpICMgZW50cm9waWEgZGUgcmVueWkgY29tIGFscGhhID0gMg0KSHQgPC0gMSAtIHN1bShwXjIpICMgZW50cm9waWEgZGUgdHNhbGxpcyBjb20gYWxwaGEgPSAyDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCnZfc2hhbm5vbiA8LSAoIHN1bShwKihsb2cocCleMikpIC0gIChIc14yKSApL24gDQp2X3JlbnlpIDwtICggNCooICgoc3VtKHBeMileKC0yKSkgKiBzdW0ocF4zKSkgLSAxICkgKS9uICANCnZfdHNhbGxpcyA8LSAoIDQqKHN1bShwXjMpIC0gKHN1bShwXjIpXjIpKSApL24NCmBgYA0KDQojIyMgVmFyacOibmNpYXMgYXNzaW50w7N0aWNhcyBkZSBhbGd1bnMgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIFZhcmlhbmNpYSB0ZW9yaWNhIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0KayA8LSBsZW5ndGgocCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KdjEgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBEMQ0KdjMgPC0gdl9zaGFubm9uLyhsb2coayleMikgIyB2YXJpYW5jaWEgZG8gRDMNCnY2IDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY29tIE4gPSAxMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzIsIE5BLCBkMy50X2MyLCBIcywgSHIsIGQ2LnRfYzIsIGQxLnRfYzIpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jMi4xLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDIsIHApDQoNCiMgY29tIE4gPSAzMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzIsIE5BLCBkMy50X2MyLCBIcywgSHIsIGQ2LnRfYzIsIGQxLnRfYzIpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jMi4yLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDIsIHApDQpgYGANCg0KDQoNCg0KIyMgQ29uZmlndXJhw6fDo28gMyAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkNvbSAxMDAwIGFtb3N0cmFzOg0KYGBge3J9DQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMzUsIDAuNDUsIDAuMSwgMC4xKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzMuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMzUsIDAuNDUsIDAuMSwgMC4xKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzMuMiA8LSBpZChhLCBOKQ0KYGBgDQoNCiMjIyDDjW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3MgcGFyYSBlc3NhIGNvbmZpZ3VyYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KZDEudF9jMyA8LSBEMShuKnApOyBkMS50X2MzDQpkMi50X2MzIDwtIEQyKG4qcCk7IGQyLnRfYzMNCmQzLnRfYzMgPC0gRDMobipwKTsgZDMudF9jMw0KZDQudF9jMyA8LSBENChuKnApOyBkNC50X2MzDQpkNS50X2MzIDwtIEQ1KG4qcCk7IGQ1LnRfYzMNCmQ2LnRfYzMgPC0gRDYobipwKTsgZDYudF9jMw0KZDcudF9jMyA8LSBENyhuKnApOyBkNy50X2MzDQpgYGANCg0KIyMjIEVudHJvcGlhcyBlIHZhcmnDom5jaWEgZGFzIGVudHJvcGlhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBFbnRyb3BpYXMgdGVvcmljYXMNCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQpIciA8LSAtbG9nKHN1bShwXjIpKSAjIGVudHJvcGlhIGRlIHJlbnlpIGNvbSBhbHBoYSA9IDINCkh0IDwtIDEgLSBzdW0ocF4yKSAjIGVudHJvcGlhIGRlIHRzYWxsaXMgY29tIGFscGhhID0gMg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQpgYGANCg0KIyMjIFZhcmnDom5jaWFzIGFzc2ludMOzdGljYXMgZGUgYWxndW5zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBWYXJpYW5jaWEgdGVvcmljYSBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCmsgPC0gbGVuZ3RoKHApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCnYxIDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDENCnYzIDwtIHZfc2hhbm5vbi8obG9nKGspXjIpICMgdmFyaWFuY2lhIGRvIEQzDQp2NiA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQ2DQoNCnYxOyB2MzsgdjYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY29tIE4gPSAxMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzMsIE5BLCBkMy50X2MzLCBIcywgSHIsIGQ2LnRfYzMsIGQxLnRfYzMpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jMy4xLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDMsIHApDQoNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jMywgTkEsIGQzLnRfYzMsIEhzLCBIciwgZDYudF9jMywgZDEudF9jMykNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2MzLjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgMywgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA0ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpDb20gMTAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KIyBDYXNvIDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCm4gPC0gMTAwMCAjIHRhbWFuaG8gZGUgY2FkYSBhbW9zdHJhDQoNCiMgTiA9IDEwMDANCg0KTiA8LSAxMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtYygwLjIsIDAuMiwgMC4yLCAwLjA1LCAwLjE1LCAwLjIpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNC4xIDwtIGlkKGEsIE4pDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4yLCAwLjIsIDAuMiwgMC4wNSwgMC4xNSwgMC4yKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzQuMiA8LSBpZChhLCBOKQ0KYGBgDQoNCiMjIyDDjW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3MgcGFyYSBlc3NhIGNvbmZpZ3VyYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KZDEudF9jNCA8LSBEMShuKnApOyBkMS50X2M0DQpkMi50X2M0IDwtIEQyKG4qcCk7IGQyLnRfYzQNCmQzLnRfYzQgPC0gRDMobipwKTsgZDMudF9jNA0KZDQudF9jNCA8LSBENChuKnApOyBkNC50X2M0DQpkNS50X2M0IDwtIEQ1KG4qcCk7IGQ1LnRfYzQNCmQ2LnRfYzQgPC0gRDYobipwKTsgZDYudF9jNA0KZDcudF9jNCA8LSBENyhuKnApOyBkNy50X2M0DQpgYGANCg0KIyMjIEVudHJvcGlhcyBlIHZhcmnDom5jaWEgZGFzIGVudHJvcGlhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBFbnRyb3BpYXMgdGVvcmljYXMNCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQpIciA8LSAtbG9nKHN1bShwXjIpKSAjIGVudHJvcGlhIGRlIHJlbnlpIGNvbSBhbHBoYSA9IDINCkh0IDwtIDEgLSBzdW0ocF4yKSAjIGVudHJvcGlhIGRlIHRzYWxsaXMgY29tIGFscGhhID0gMg0KDQpgYGANCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgdmFyaWFuY2lhIHRlb3JpY2EgZGFzIGVudHJvcGlhcw0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQpgYGANCg0KIyMjIFZhcmnDom5jaWFzIGFzc2ludMOzdGljYXMgZGUgYWxndW5zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBWYXJpYW5jaWEgdGVvcmljYSBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCmsgPC0gbGVuZ3RoKHApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCnYxIDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDENCnYzIDwtIHZfc2hhbm5vbi8obG9nKGspXjIpICMgdmFyaWFuY2lhIGRvIEQzDQp2NiA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQ2DQoNCnYxOyB2MzsgdjYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KIyBjb20gTiA9IDEwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNCwgTkEsIGQzLnRfYzQsIEhzLCBIciwgZDYudF9jNCwgZDEudF9jNCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M0LjEsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNCwgcCkNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNCwgTkEsIGQzLnRfYzQsIEhzLCBIciwgZDYudF9jNCwgZDEudF9jNCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M0LjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNCwgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA1ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KQ29tIDEwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgQ2FzbyA1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuOTUpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNS4xIDwtIGlkKGEsIE4pDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC45NSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2M1LjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzUgPC0gRDEobipwKTsgZDEudF9jNQ0KZDIudF9jNSA8LSBEMihuKnApOyBkMi50X2M1DQpkMy50X2M1IDwtIEQzKG4qcCk7IGQzLnRfYzUNCmQ0LnRfYzUgPC0gRDQobipwKTsgZDQudF9jNQ0KZDUudF9jNSA8LSBENShuKnApOyBkNS50X2M1DQpkNi50X2M1IDwtIEQ2KG4qcCk7IGQ2LnRfYzUNCmQ3LnRfYzUgPC0gRDcobipwKTsgZDcudF9jNQ0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQoNCmBgYA0KDQojIyMgVmFyacOibmNpYXMgYXNzaW50w7N0aWNhcyBkZSBhbGd1bnMgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIFZhcmlhbmNpYSB0ZW9yaWNhIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0KayA8LSBsZW5ndGgocCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KdjEgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBEMQ0KdjMgPC0gdl9zaGFubm9uLyhsb2coayleMikgIyB2YXJpYW5jaWEgZG8gRDMNCnY2IDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDYNCg0KdjE7IHYzOyB2Ng0KYGBgDQoNCiMjIyBQbG90YWdlbSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEhpc3RvZ3JhbWFzIENhc28gNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBjb20gTiA9IDEwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNSwgTkEsIGQzLnRfYzUsIEhzLCBIciwgZDYudF9jNSwgZDEudF9jNSkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M1LjEsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNSwgcCkNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jNSwgTkEsIGQzLnRfYzUsIEhzLCBIciwgZDYudF9jNSwgZDEudF9jNSkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M1LjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgNSwgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA2ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KQ29tIDEwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgQ2FzbyA2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMDEsIDAuMDEsIDAuMDIsIDAuMDIsIDAuNDcsIDAuNDcpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNi4xIDwtIGlkKGEsIE4pDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC4wMSwgMC4wMSwgMC4wMiwgMC4wMiwgMC40NywgMC40NykgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2M2LjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzYgPC0gRDEobipwKTsgZDEudF9jNg0KZDIudF9jNiA8LSBEMihuKnApOyBkMi50X2M2DQpkMy50X2M2IDwtIEQzKG4qcCk7IGQzLnRfYzYNCmQ0LnRfYzYgPC0gRDQobipwKTsgZDQudF9jNg0KZDUudF9jNiA8LSBENShuKnApOyBkNS50X2M2DQpkNi50X2M2IDwtIEQ2KG4qcCk7IGQ2LnRfYzYNCmQ3LnRfYzYgPC0gRDcobipwKTsgZDcudF9jNg0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCmBgYA0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyB2YXJpYW5jaWEgdGVvcmljYSBkYXMgZW50cm9waWFzDQoNCnZfc2hhbm5vbiA8LSAoIHN1bShwKihsb2cocCleMikpIC0gIChIc14yKSApL24gDQp2X3JlbnlpIDwtICggNCooICgoc3VtKHBeMileKC0yKSkgKiBzdW0ocF4zKSkgLSAxICkgKS9uICANCnZfdHNhbGxpcyA8LSAoIDQqKHN1bShwXjMpIC0gKHN1bShwXjIpXjIpKSApL24NCg0KYGBgDQoNCiMjIyBWYXJpw6JuY2lhcyBhc3NpbnTDs3RpY2FzIGRlIGFsZ3VucyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgVmFyaWFuY2lhIHRlb3JpY2EgZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQprIDwtIGxlbmd0aChwKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQp2MSA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQxDQp2MyA8LSB2X3NoYW5ub24vKGxvZyhrKV4yKSAjIHZhcmlhbmNpYSBkbyBEMw0KdjYgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBENg0KDQp2MTsgdjM7IHY2DQpgYGANCg0KIyMjIFBsb3RhZ2VtIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSGlzdG9ncmFtYXMgQ2FzbyA2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGNvbSBOID0gMTAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M2LCBOQSwgZDMudF9jNiwgSHMsIEhyLCBkNi50X2M2LCBkMS50X2M2KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzYuMSwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA2LCBwKQ0KDQojIGNvbSBOID0gMzAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M2LCBOQSwgZDMudF9jNiwgSHMsIEhyLCBkNi50X2M2LCBkMS50X2M2KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzYuMiwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA2LCBwKQ0KDQpgYGANCg0KIyMgQ29uZmlndXJhw6fDo28gNyAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkNvbSAxMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIENhc28gNyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbiA8LSAxMDAwICMgdGFtYW5obyBkZSBjYWRhIGFtb3N0cmENCg0KIyBOID0gMTAwMA0KDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjA5LCAwLjExLCAwLjA5LCAwLjExLCAwLjA5LCAwLjExLCAwLjA5LCAwLjExLCAwLjA5LCAwLjExKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzcuMSA8LSBpZChhLCBOKQ0KYGBgDQoNCkNvbSAzMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIE4gPSAzMDAwDQoNCk4gPC0gMzAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEsIDAuMDksIDAuMTEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jNy4yIDwtIGlkKGEsIE4pDQoNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzcgPC0gRDEobipwKTsgZDEudF9jNw0KZDIudF9jNyA8LSBEMihuKnApOyBkMi50X2M3DQpkMy50X2M3IDwtIEQzKG4qcCk7IGQzLnRfYzcNCmQ0LnRfYzcgPC0gRDQobipwKTsgZDQudF9jNw0KZDUudF9jNyA8LSBENShuKnApOyBkNS50X2M3DQpkNi50X2M3IDwtIEQ2KG4qcCk7IGQ2LnRfYzcNCmQ3LnRfYzcgPC0gRDcobipwKTsgZDcudF9jNw0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQoNCmBgYA0KDQojIyMgVmFyacOibmNpYXMgYXNzaW50w7N0aWNhcyBkZSBhbGd1bnMgw61uZGljZXMgZGUgZG9taW7Dom5jaWEgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIFZhcmlhbmNpYSB0ZW9yaWNhIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCg0KayA8LSBsZW5ndGgocCkgIyBudW1lcm8gZGUgZW1wcmVzYXMNCg0KdjEgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBEMQ0KdjMgPC0gdl9zaGFubm9uLyhsb2coayleMikgIyB2YXJpYW5jaWEgZG8gRDMNCnY2IDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDYNCmBgYA0KDQojIyMgUGxvdGFnZW0gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCmBgYHtyfQ0KIyBIaXN0b2dyYW1hcyBDYXNvIDcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY29tIE4gPSAxMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzcsIE5BLCBkMy50X2M3LCBIcywgSHIsIGQ2LnRfYzcsIGQxLnRfYzcpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jNy4xLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDcsIHApDQoNCiMgY29tIE4gPSAzMDAwDQoNCm1lZGlhcyA8LSBjKGQxLnRfYzcsIE5BLCBkMy50X2M3LCBIcywgSHIsIGQ2LnRfYzcsIGQxLnRfYzcpDQp2YXJpYW5jaWFzIDwtIGModjEsIE5BLCB2Mywgdl9zaGFubm9uLCB2X3JlbnlpLCB2NiwgdjEpDQpwbG90YWdlbShpZF9jNy4yLCBtZWRpYXMsIHZhcmlhbmNpYXMsIGssIDcsIHApDQpgYGANCg0KIyMgQ29uZmlndXJhw6fDo28gOCAgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkNvbSAxMDAwIGFtb3N0cmFzOg0KYGBge3J9DQojIENhc28gOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbiA8LSAxMDAwICMgdGFtYW5obyBkZSBjYWRhIGFtb3N0cmENCg0KIyBOID0gMTAwMA0KDQpOIDwtIDEwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjkxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzguMSA8LSBpZChhLCBOKQ0KDQpgYGANCg0KQ29tIDMwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgTiA9IDMwMDANCg0KTiA8LSAzMDAwICMgbnVtZXJvIGRlIGFtb3N0cmFzDQpwIDwtIGMoMC45MSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSkgIyBwYXJ0aWNpcGFjb2VzIGRlIG1lcmNhZG8NCg0Kc2V0LnNlZWQoMTIzKQ0KYSA8LSBybXVsdGlub20oTiwgbiwgcCkNCmlkX2M4LjIgPC0gaWQoYSwgTikNCmBgYA0KDQojIyMgw41uZGljZXMgZGUgZG9taW7Dom5jaWEgdGXDs3JpY29zIHBhcmEgZXNzYSBjb25maWd1cmHDp8OjbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgQ2FsY3VsbyBkbyB2YWxvciB0ZW9yaWNvIGRvcyBpbmRpY2VzIGRlIGRvbWluYW5jaWENCmQxLnRfYzggPC0gRDEobipwKQ0KZDIudF9jOCA8LSBEMihuKnApDQpkMy50X2M4IDwtIEQzKG4qcCkNCmQ0LnRfYzggPC0gRDQobipwKQ0KZDUudF9jOCA8LSBENShuKnApDQpkNi50X2M4IDwtIEQ2KG4qcCkNCmQ3LnRfYzggPC0gRDcobipwKQ0KYGBgDQoNCiMjIyBFbnRyb3BpYXMgZSB2YXJpw6JuY2lhIGRhcyBlbnRyb3BpYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgRW50cm9waWFzIHRlb3JpY2FzDQoNCkhzIDwtIC1zdW0ocCpsb2cocCkpICMgZW50cm9waWEgZGUgc2hhbm5vbg0KSHIgPC0gLWxvZyhzdW0ocF4yKSkgIyBlbnRyb3BpYSBkZSByZW55aSBjb20gYWxwaGEgPSAyDQpIdCA8LSAxIC0gc3VtKHBeMikgIyBlbnRyb3BpYSBkZSB0c2FsbGlzIGNvbSBhbHBoYSA9IDINCg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24NCnZfdHNhbGxpcyA8LSAoIDQqKHN1bShwXjMpIC0gKHN1bShwXjIpXjIpKSApL24NCg0KYGBgDQoNCiMjIyBWYXJpw6JuY2lhcyBhc3NpbnTDs3RpY2FzIGRlIGFsZ3VucyDDrW5kaWNlcyBkZSBkb21pbsOibmNpYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3IgY29sbGFwc2U9VFJVRX0NCiMgVmFyaWFuY2lhIHRlb3JpY2EgZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KDQprIDwtIGxlbmd0aChwKSAjIG51bWVybyBkZSBlbXByZXNhcw0KDQp2MSA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQxDQp2MyA8LSB2X3NoYW5ub24vKGxvZyhrKV4yKSAjIHZhcmlhbmNpYSBkbyBEMw0KdjYgPC0gKChrLyhrLTEpKV4yKSAqIHZfdHNhbGxpcyAjIHZhcmlhbmNpYSBkbyBENg0KYGBgDQoNCiMjIyBQbG90YWdlbSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBge3J9DQojIEhpc3RvZ3JhbWFzIENhc28gOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBjb20gTiA9IDEwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jOCwgTkEsIGQzLnRfYzgsIEhzLCBIciwgZDYudF9jOCwgZDEudF9jOCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M4LjEsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgOCwgcCkNCg0KIyBjb20gTiA9IDMwMDANCg0KbWVkaWFzIDwtIGMoZDEudF9jOCwgTkEsIGQzLnRfYzgsIEhzLCBIciwgZDYudF9jOCwgZDEudF9jOCkNCnZhcmlhbmNpYXMgPC0gYyh2MSwgTkEsIHYzLCB2X3NoYW5ub24sIHZfcmVueWksIHY2LCB2MSkNCnBsb3RhZ2VtKGlkX2M4LjIsIG1lZGlhcywgdmFyaWFuY2lhcywgaywgOCwgcCkNCmBgYA0KDQojIyBDb25maWd1cmHDp8OjbyA5ICB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KQ29tIDEwMDAgYW1vc3RyYXM6DQpgYGB7cn0NCiMgQ2FzbyA5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuIDwtIDEwMDAgIyB0YW1hbmhvIGRlIGNhZGEgYW1vc3RyYQ0KDQojIE4gPSAxMDAwDQoNCk4gPC0gMTAwMCAjIG51bWVybyBkZSBhbW9zdHJhcw0KcCA8LSBjKDAuNDUsIDAuNDcsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpICMgcGFydGljaXBhY29lcyBkZSBtZXJjYWRvDQoNCnNldC5zZWVkKDEyMykNCmEgPC0gcm11bHRpbm9tKE4sIG4sIHApDQppZF9jOS4xIDwtIGlkKGEsIE4pDQoNCmBgYA0KDQpDb20gMzAwMCBhbW9zdHJhczoNCmBgYHtyfQ0KIyBOID0gMzAwMA0KDQpOIDwtIDMwMDAgIyBudW1lcm8gZGUgYW1vc3RyYXMNCnAgPC0gYygwLjQ1LCAwLjQ3LCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxKSAjIHBhcnRpY2lwYWNvZXMgZGUgbWVyY2Fkbw0KDQpzZXQuc2VlZCgxMjMpDQphIDwtIHJtdWx0aW5vbShOLCBuLCBwKQ0KaWRfYzkuMiA8LSBpZChhLCBOKQ0KYGBgDQoNCiMjIyDDjW5kaWNlcyBkZSBkb21pbsOibmNpYSB0ZcOzcmljb3MgcGFyYSBlc3NhIGNvbmZpZ3VyYcOnw6NvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBDYWxjdWxvIGRvIHZhbG9yIHRlb3JpY28gZG9zIGluZGljZXMgZGUgZG9taW5hbmNpYQ0KZDEudF9jOSA8LSBEMShuKnApOyBkMS50X2M5DQpkMi50X2M5IDwtIEQyKG4qcCk7IGQyLnRfYzkNCmQzLnRfYzkgPC0gRDMobipwKTsgZDMudF9jOQ0KZDQudF9jOSA8LSBENChuKnApOyBkNC50X2M5DQpkNS50X2M5IDwtIEQ1KG4qcCk7IGQ1LnRfYzkNCmQ2LnRfYzkgPC0gRDYobipwKTsgZDYudF9jOQ0KZDcudF9jOSA8LSBENyhuKnApOyBkNy50X2M5DQpgYGANCg0KIyMjIEVudHJvcGlhcyBlIHZhcmnDom5jaWEgZGFzIGVudHJvcGlhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBFbnRyb3BpYXMgdGVvcmljYXMNCg0KSHMgPC0gLXN1bShwKmxvZyhwKSkgIyBlbnRyb3BpYSBkZSBzaGFubm9uDQpIciA8LSAtbG9nKHN1bShwXjIpKSAjIGVudHJvcGlhIGRlIHJlbnlpIGNvbSBhbHBoYSA9IDINCkh0IDwtIDEgLSBzdW0ocF4yKSAjIGVudHJvcGlhIGRlIHRzYWxsaXMgY29tIGFscGhhID0gMg0KYGBgDQoNCmBgYHtyIGNvbGxhcHNlPVRSVUV9DQojIHZhcmlhbmNpYSB0ZW9yaWNhIGRhcyBlbnRyb3BpYXMNCg0Kdl9zaGFubm9uIDwtICggc3VtKHAqKGxvZyhwKV4yKSkgLSAgKEhzXjIpICkvbiANCnZfcmVueWkgPC0gKCA0KiggKChzdW0ocF4yKV4oLTIpKSAqIHN1bShwXjMpKSAtIDEgKSApL24gDQp2X3RzYWxsaXMgPC0gKCA0KihzdW0ocF4zKSAtIChzdW0ocF4yKV4yKSkgKS9uDQpgYGANCg0KIyMjIFZhcmnDom5jaWFzIGFzc2ludMOzdGljYXMgZGUgYWxndW5zIMOtbmRpY2VzIGRlIGRvbWluw6JuY2lhIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7ciBjb2xsYXBzZT1UUlVFfQ0KIyBWYXJpYW5jaWEgdGVvcmljYSBkb3MgaW5kaWNlcyBkZSBkb21pbmFuY2lhDQoNCmsgPC0gbGVuZ3RoKHApICMgbnVtZXJvIGRlIGVtcHJlc2FzDQoNCnYxIDwtICgoay8oay0xKSleMikgKiB2X3RzYWxsaXMgIyB2YXJpYW5jaWEgZG8gRDENCnYzIDwtIHZfc2hhbm5vbi8obG9nKGspXjIpICMgdmFyaWFuY2lhIGRvIEQzDQp2NiA8LSAoKGsvKGstMSkpXjIpICogdl90c2FsbGlzICMgdmFyaWFuY2lhIGRvIEQ2DQpgYGANCg0KIyMjIFBsb3RhZ2VtIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpgYGB7cn0NCiMgSGlzdG9ncmFtYXMgQ2FzbyA5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGNvbSBOID0gMTAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M5LCBOQSwgZDMudF9jOSwgSHMsIEhyLCBkNi50X2M5LCBkMS50X2M5KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzkuMSwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA5LCBwKQ0KDQojIGNvbSBOID0gMzAwMA0KDQptZWRpYXMgPC0gYyhkMS50X2M5LCBOQSwgZDMudF9jOSwgSHMsIEhyLCBkNi50X2M5LCBkMS50X2M5KQ0KdmFyaWFuY2lhcyA8LSBjKHYxLCBOQSwgdjMsIHZfc2hhbm5vbiwgdl9yZW55aSwgdjYsIHYxKQ0KcGxvdGFnZW0oaWRfYzkuMiwgbWVkaWFzLCB2YXJpYW5jaWFzLCBrLCA5LCBwKQ0KYGBgDQoNCiMgVGVzdGUgZGUgTm9ybWFsaWRhZGUgLSBKYXJxdWUtQmVyYQ0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBJZGVudGlmaWNhIHRvZGFzIGFzIG1hdHJpemVzIGlkX2MxLjEgYXTDqSBpZF9jOS4yDQpub21lc19tYXRyaXplcyA8LSBscyhwYXR0ZXJuID0gIl5pZF9jWzEtOV1cXC5bMTJdJCIpICMgcGVnYSB0b2RvcyBvcyBub21lcyBuZXNzZSBwYWRyw6NvDQoNCiMgTGlzdGEgcGFyYSBhcm1hemVuYXIgcmVzdWx0YWRvcw0KbGlzdGFfcmVzdWx0YWRvcyA8LSBsaXN0KCkNCg0KZm9yIChub21lIGluIG5vbWVzX21hdHJpemVzKSB7DQogIGRhZG9zIDwtIGdldChub21lKQ0KICANCiAgIyBGdW5jYW8gcGFyYSB0ZXN0YXIgbm9ybWFsaWRhZGUNCiAgdGVzdGUgPC0gZnVuY3Rpb24oY29sdW5hKSB7DQogICAgdGVzdGUgPC0gamFycXVlLmJlcmEudGVzdChjb2x1bmEpDQogICAgcCA8LSB0ZXN0ZSRwLnZhbHVlDQogICAgaWYgKHAgPD0gMC4wMSkgew0KICAgICAgIjw9IDAuMDEiDQogICAgfSBlbHNlIHsNCiAgICAgIHJvdW5kKHAsIDQpfQ0KICAgIH0NCiAgDQogICMgQXBsaWNhbmRvIG8gdGVzdGUgcG9yIGNvbHVuYQ0KICBwX3ZhbHMgPC0gYXBwbHkoZGFkb3MsIDIsIHRlc3RlKQ0KICANCiAgIyBSZW1vdmUgbyBwcmVmaXhvICJpZF9jIg0KICBub21lX2N1cnRvIDwtIHN1YigiXmlkX2MiLCAiIiwgbm9tZSkNCiAgDQogICMgQ3JpYSBsaW5oYSBkYSB0YWJlbGENCiAgbGlzdGFfcmVzdWx0YWRvc1tbbm9tZV1dIDwtIGRhdGEuZnJhbWUoDQogICAgQ2VuYXJpbyA9IG5vbWVfY3VydG8sDQogICAgdChwX3ZhbHMpLA0KICAgIHJvdy5uYW1lcyA9IE5VTEwNCiAgKQ0KfQ0KDQojIEp1bnRhIHRvZGFzIGFzIGxpbmhhcw0KdGFiZWxhX2ZpbmFsIDwtIGRvLmNhbGwocmJpbmQsIGxpc3RhX3Jlc3VsdGFkb3MpDQpyb3cubmFtZXModGFiZWxhX2ZpbmFsKSA8LSBOVUxMDQoNCiMgQ29sb3JpciB2YWxvcmVzICI8PSAwLjAxIiBlbSB2ZXJtZWxobw0KdGFiZWxhX2NvbG9yaWRhIDwtIHRhYmVsYV9maW5hbCAlPiUNCiAgbXV0YXRlKGFjcm9zcygNCiAgICAtQ2VuYXJpbywNCiAgICB+IHsNCiAgICAgIHggPC0gYXMuY2hhcmFjdGVyKC54KQ0KICAgICAgaWZlbHNlKHggPT0gIjw9IDAuMDEiLA0KICAgICAgICAgICAgIGNlbGxfc3BlYyh4LCBmb3JtYXQgPSAiaHRtbCIsIGNvbG9yID0gInJlZCIpLA0KICAgICAgICAgICAgIHgpDQogICAgfQ0KICApKQ0KDQojIFJlbmRlcml6YXIgdGFiZWxhDQprYWJsZSh0YWJlbGFfY29sb3JpZGEsDQogICAgICBmb3JtYXQgPSAiaHRtbCIsDQogICAgICBlc2NhcGUgPSBGQUxTRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgZnVsbF93aWR0aCA9IFRSVUUsDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikNCiAgKQ0KYGBgDQoNCiMgRXJybyBRdWFkcsOhdGljbyBNw6lkaW8NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRXJybyBxdWFkcsOhdGljbyBtw6lkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNhc29zIDwtIDE6OQ0KZHMgPC0gMTo3DQoNCiMgQ29udmVydGUgMyAtPiAiRDMiDQpub21lX2QgPC0gZnVuY3Rpb24oaikgcGFzdGUwKCJEIiwgaikNCg0KIyBGdW7Dp8OjbyBxdWUgY2FsY3VsYSBwYXJhIGlkX2NYLlkNCnByb2Nlc3Nhcl9zdWJjYXNvIDwtIGZ1bmN0aW9uKGNhc28sIHN1Yikgew0KICANCiAgIyBvYmpldG8gaWRfY1guWSAgKFkgPSAxIG91IDIpDQogIGlkX21hdCA8LSBnZXQocGFzdGUwKCJpZF9jIiwgY2FzbywgIi4iLCBzdWIpKQ0KICANCiAgZXFtIDwtIG51bWVyaWMobGVuZ3RoKGRzKSkNCiAgDQogIGZvciAoaiBpbiBkcykgew0KICAgIGRfdmVjIDwtIGdldChwYXN0ZTAoImQiLCBqLCAiLnRfYyIsIGNhc28pKQ0KICAgIGVxbVtqXSA8LSBtZWFuKChpZF9tYXRbLCBqXSAtIGRfdmVjKV4yKQ0KICB9DQogIA0KICBvcmRlbSA8LSBvcmRlcihlcW0pDQogIA0KICBkYXRhLmZyYW1lKA0KICAgIGNhc28gPSBwYXN0ZTAoY2FzbywgIi4iLCBzdWIpLA0KICAgIG1lbGhvciA9IG5vbWVfZChvcmRlbVsxXSksDQogICAgc2VndW5kb19tZWxob3IgPSBub21lX2Qob3JkZW1bMl0pDQogICkNCn0NCg0KIyBBcGxpY2EgcGFyYSB0b2RvcyBvcyBjYXNvcyAxLjEsIDEuMiwgMi4xLCAyLjIsIC4uLiwgOS4yDQpyZXN1bHRhZG8gPC0gZG8uY2FsbCgNCiAgcmJpbmQsDQogIGxhcHBseShjYXNvcywgZnVuY3Rpb24oY2Fzbykgew0KICAgIHJiaW5kKA0KICAgICAgcHJvY2Vzc2FyX3N1YmNhc28oY2FzbywgMSksDQogICAgICBwcm9jZXNzYXJfc3ViY2FzbyhjYXNvLCAyKQ0KICAgICkNCiAgfSkNCikNCg0KIyBSZW5kZXJpemFyIHRhYmVsYQ0Ka2FibGUocmVzdWx0YWRvKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBmdWxsX3dpZHRoID0gVFJVRSwNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKQ0KICApDQpgYGANCg0KIyBDb2VmaWNpZW50ZSBkZSB2YXJpYcOnw6NvDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENvZWZpY2llbnRlIGRlIHZhcmlhw6fDo28gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjYXNvcyA8LSAxOjkNCmRzIDwtIDE6Nw0KDQojIENvbnZlcnRlIDMgLT4gIkQzIg0Kbm9tZV9kIDwtIGZ1bmN0aW9uKGopIHBhc3RlMCgiRCIsIGopDQoNCiMgRnVuw6fDo28gY29lZmljaWVudGUgZGUgdmFyaWHDp8OjbyBkaXJldG8gZGEgYW1vc3RyYQ0KY29lZl92YXIgPC0gZnVuY3Rpb24oeCkgew0KICBtIDwtIG1lYW4oeCkNCiAgcyA8LSBzZCh4KQ0KICBpZiAobSA9PSAwKSByZXR1cm4oSW5mKSAgICMgZXZpdGEgZGl2aXPDo28gcG9yIHplcm8NCiAgcyAvIG0NCn0NCg0KIyBGdW7Dp8OjbyBwYXJhIHByb2Nlc3NhciBjYWRhIHN1YmNhc28gWC5ZDQpwcm9jZXNzYXJfc3ViY2Fzb19jdl9hbW9zdHJhIDwtIGZ1bmN0aW9uKGNhc28sIHN1Yikgew0KICANCiAgIyBvYmpldG8gaWRfY1guWQ0KICBpZF9tYXQgPC0gZ2V0KHBhc3RlMCgiaWRfYyIsIGNhc28sICIuIiwgc3ViKSkNCiAgDQogIGN2IDwtIG51bWVyaWMobGVuZ3RoKGRzKSkNCiAgDQogIGZvciAoaiBpbiBkcykgew0KICAgIGFtb3N0cmEgPC0gaWRfbWF0Wywgal0NCiAgICBjdltqXSA8LSBjb2VmX3ZhcihhbW9zdHJhKQ0KICB9DQogIA0KICBvcmRlbSA8LSBvcmRlcihjdikNCiAgDQogIGRhdGEuZnJhbWUoDQogICAgY2FzbyA9IHBhc3RlMChjYXNvLCAiLiIsIHN1YiksDQogICAgbWVsaG9yID0gbm9tZV9kKG9yZGVtWzFdKSwNCiAgICBzZWd1bmRvX21lbGhvciA9IG5vbWVfZChvcmRlbVsyXSkNCiAgKQ0KfQ0KDQojIFRhYmVsYSBmaW5hbDogMS4xLCAxLjIsIC4uLiwgOS4yDQpyZXN1bHRhZG9fY3ZfYW1vc3RyYSA8LSBkby5jYWxsKA0KICByYmluZCwNCiAgbGFwcGx5KGNhc29zLCBmdW5jdGlvbihjYXNvKSB7DQogICAgcmJpbmQoDQogICAgICBwcm9jZXNzYXJfc3ViY2Fzb19jdl9hbW9zdHJhKGNhc28sIDEpLA0KICAgICAgcHJvY2Vzc2FyX3N1YmNhc29fY3ZfYW1vc3RyYShjYXNvLCAyKQ0KICAgICkNCiAgfSkNCikNCg0KIyBSZW5kZXJpemFyIHRhYmVsYQ0Ka2FibGUocmVzdWx0YWRvX2N2X2Ftb3N0cmEpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGZ1bGxfd2lkdGggPSBUUlVFLA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpDQogICkNCg0KYGBgDQoNCg0KDQo=