Principais Funções de Probabilidade
Distribuição Multinomial
- Número máximo de ocorrências finito
- Probabilidades independentes para cada evento
- Múltiplas categorias
\[
p = \frac{n!}{n_1!n_2!...n_k!}p_1^{n_{1}}p_2^{n_2}...{p_k^{n_k}}
\] Onde k é o número de categorias observadas, n é o tamanho da amostra colhida, cada \(n_i\) é o tamanho da subamostra desejada e \(p_i\) é a sua probabilidade. Observe-se que:
\[
\sum(n_i)=n
\] e que \[
\sum(p_i)=1
\] e de forma geral:
\[
p=\frac{\sum(n_i)!}{\pi(n_i!)}\pi(p_i^{n_i})
\]
Distribuição Binomial
- Número máximo de ocorrências finito
- Probabilidades independentes para cada evento
- Duas categorias
Fórmula da probabilidade binomial \[p=\binom{n}{x}p^x(1-p)^{n-x}
\]
Este é um caso especial da probabilidade multinomial, onde só há duas categorias, onde n é o tamanho da amostra, x é o número de ocorrências favoráveis, p é a probabilidade favorável e 1-p é a probabilidade desfavorável. No R,
\(dbinom(x, size, prob)\) # distribuição pontual
\(pbinom(q, size, prob)\) # distribuição acumulada à esquerda
\(qbinom(p, size, prob)\) # quantil da probabilidade p
\(rbinom(n, size, prob)\) # gerar n números aleatórios
Distribuição de Poisson
- Número máximo de ocorrências infinito
- Taxa uniforme de ocorrência de eventos
Fórmula da Probabilidade de Poisson
\[P(x)= \dfrac{\lambda^x\,e^{-\lambda}}{x!}\]
No R temos:
\(dpois(x, lambda)\) # distribuição pontual
\(ppois(q, lambda)\) # distribuição acumulada à esquerda
\(qpois(p, lambda)\) # quantil da probabilidade p
\(rpois(n, lambda)\) # gerar n números aleatórios
Distribuição Hipergeométrica
- Número máximo de ocorrências finito
- Probabilidades dependentes para cada evento
- Múltiplas categorias
Fórmula da probabilidade hipergeométrica:
\[
p =\dfrac{\binom{n1}{x1}\binom{n2}{x2}...\binom{n_k}{x_k}}{\binom{n_1+n_2+...+n_k}{x_1+x_2+...+x_k}}
\]
Onde cada \(n_i\) é o tamanho da subamostra desejada e cada \(x_i\) é o número de ocorrências desejado para cada subamostra. De forma geral, temos:
\[
p=\dfrac{\pi\binom{n_i}{x_i}}{\binom{\sum n_i}{\sum x_i}}
\] No R, Para as duas categorias temos:
\(dhyper(x1, n1, n2, x1+x2)\) # distribuição pontual
\(phyper(x1, n1, n2, x1+x2)\) # distribuição acumulada à esquerda
\(qhyper(p1, n1, n2, x1+x2)\) # quantil da probabilidade p
\(rhyper(N, n1, n2, x1+x2)\) # gerar N números aleatórios
Distribuição Binomial
As caracterÃsticas para se usar esta distribuição são:
- Eventos enumeráveis
- Enumeráveis
- Os eventos são realmente independentes
\[
P(x)=\binom{n}{x}*p^n*(1-p)^{n-x}
\]
ou então pela fórmula do R:
\(sum(choose(N,n)*p^n*(1-p)^{N-n})\)
ou na forma reduzida
\(dbinom(x=x, size=n, prob=p)\)
Exemplos
Um grupo de 50 manifestantes de um mesmo grupo polÃtico e contrários a uma proposta participa de uma assembleia onde estão presentes, no total, 300 pessoas, das quais 60% são favoráveis à mesma proposta. Se for formada uma comissão de 10 pessoas, qual a probabilidade de, dentre as 10, existirem 5 favoráveis à proposta e apenas um membro do grupo polÃtico destacado anteriormente?
# membros do grupo
n1=50
# total de favoráveis
n2=180
# total de contrários
n3=120
# total de contrários fora do grupo
n4=n3-n1
choose(n1,1)*choose(n2,5)*choose(n4,4)/choose(300,10)
Qual a probabilidade, em um lançamento de 10 moedas honestas, de se obter 4 ou menos caras?
n = 10
x = 0:4
p = 0.5
sum(choose(n, x)*p^x*(1-p)^(n-x))
ou utilizando a fórmula
sum(dbinom(x = x, size = n, prob = p))
Distribuição Hipergeométrica
As caracterÃsticas de seu uso são:
- Eventos enumeráveis
- Probabilidades não são constantes
\[ p(x) = \dfrac{\displaystyle\binom{a}{x}\binom{b}{k-x}}{\displaystyle\binom{a+b}{k}} \]
ou então pela fórmula do R:
\(p(x)=choose(a,x)*choose(b,k-x)/choose(a+b,k)\)
ou na forma reduzida \(p = sum(dhyper(x, m, n, k))\)
Um funcionario da expedição deveria remeter 6 de 15 pacotes por via expressa para a Europa, mas ele acaba misturando todos e aleatoriamente manda 6 dos pacotes por via expressa para a Europa. Qual a probabilidade de que apenas 3 dos pacotes que deveriam ir por via sigam realmente por via expressa?
a=6
x=3
b=9
k=6
choose(a,x)*choose(b,k-x)/choose(a+b,k)
Num grupo de 5 engenheiros e 4 arquitetos, qual a prob de serem escolhidos aleatoriamente 4 individuos que sejam 2 engenheiros e 2 arquitetos?
a=5
b=4
x=2
k=4
choose(5,2)*choose(4,2)/choose(9,4)
Num grupo de 10 engenheiros, 6 arquitetos, 3 advogados, 5 administradores, qual a probabilidade de ter um grupo de 1 de cada?
choose(10,1)*choose(6,1)*choose(3,1)*choose(5,1)/choose(24,4)
Examina-se um lote de 100 frascos de perfume, dos quais 50 sao falsificados e os restantes são originais. Qual a probabilidade de um inspetor escolher uma amostra de 10 frascos e encontrar 2 ou menos falsificados?
\[
p = \dfrac{\displaystyle\binom{50}{0}\binom{50}{10}}{\displaystyle\binom{100}{10}} + \dfrac{\displaystyle\binom{50}{1}\binom{50}{9}}{\displaystyle\binom{100}{10}} + \dfrac{\displaystyle\binom{50}{2}\binom{50}{8}}{\displaystyle\binom{100}{10}}
\] logo
fHyperGeom2 = function(x, i, y, j, dec = 4) {
round(choose(x,i)*choose(y, j)/choose(x+y, i+j),dec)
}
fHyperGeom2ToLaTeX = function(x, i, y, j, z, k, dec = 4) {
res = paste0(
"\\ensuremath{",
"\\dhipergeom{", x, "}{", i, "}{", y, "}{", j, "}{", x+ y, "}{", i + j, "}" ,
"}"
)
val = fHyperGeom2(x, i, y, j, dec)
return(list(code = res, val = val))
}
N = 100
def = 50
ok = N-def
n = 10
x = 2
l = fHyperGeom2ToLaTeX(def, 0:x, N-def, n-0:x) # Ver o pacote que contem a função fHyperGeom2ToLaTeX
p = sum(l$val)
p
Distribuição de Poisson
As caracterÃsticas para se usar esta distribuição ocorre quando o \(\lambda\) é uma taxa de chegada ou de ocorrência - ou quando o n é grande e a probabilidade é pequena, ou seja, n>=100 e p<10.
\[P(x)= \dfrac{\lambda^x\,e^{-\lambda}}{x!}\] ou então pelas fórmulas reduzidas do R:
\(dpois(x,\lambda)\)
\(\lambda^x*e^{-\lambda}/factorial(x)\)
Exemplos
Um posto de correio atende, normalmente, 3 clientes no perÃodo de 11 Ã s 13h. Qual a probabilidade desse posto
a) Não receber cliente algum das 11 às 12h?
taxa = 3/2 #clientes por hora
p = ppois(q=0, lambda=taxa)
p
b) Receber mais que 5 clientes das 11 Ã s 13h?
taxa = 3 #clientes em um perÃodo de duas horas
#probabilidade de 5 ou menos
p = ppois(q=5, lambda=taxa)
1-p
Um posto de observacao registra a passagem de 10 veiculos em media por hora. Qual a prob de em uma hora nao passar veiculo algum?
10^0*exp(-10)/factorial(0)
dpois(0,10/1)
ppois(0, 10/1)
Numa instalação, queimam 2.000 lâmpadas por ano. Qual a probabilidade de queimarem mais de 20 lâmpadas em uma dada semana?
taxa = 2000/365*7 # queimas por semana
1 - ppois(20, taxa)
Numa instalação, queimam 2.000 lâmpadas por ano. Qual a probabilidade de queimarem mais de 50 lâmpadas em uma dada semana?
taxa = 2000/365*7
1 - ppois(50, taxa)
Uma secretária comete 1 erro a cada 50 páginas. Qual a probabilidade de pegar um documento de 200 páginas gerado por essa secretária e ele não conter erros?
q=0
size=200
prob=1/50
pbinom(q, size, prob)
ou pela aproximação de Poissoon
q=0
lambda=1/50*200
ppois(q,lambda)
Uma máquina falha tipicamente três vezes por ano. Qual a probabilidade dela falhar mais que uma vez em um determinado mês?
p = ppois(1, 3/12) # falhar uma vez ou menos no mês
1 - p # falhar mais que uma vez no mês
Em uma oficina mecânica, tipicamente chegam 12 carros em um dia de 8 horas de serviço. Qual a probabilidade de chegarem mais de 2 carros em uma determinada hora?
1 - ppois(2, lambda = 12/8)
Caminhões chegam a um posto de pedágio com uma taxa de chegadas de 18 veÃculos por hora. Qual a probabilidade de chegarem 10 ou mais caminhões em um intervalo de tempo de 30 minutos?
lambda=18 #veiculos por hora
janela=30/60
nchegadas=10
lambda=lambda*janela
p=round(ppois(nchegadas-1,lambda=lambda),4)
p=1-p
p
Distribuição Multinomial
As caracterÃsticas para se usar esta distribuição é quando há mais de dois resultados possÃveis em cada prova, as probabilidades dos vários resultados permanecem as mesmas para cada prova, e as provas são todas independentes.
\[
p = \dfrac{n!}{x_1!x_2!x_3!x_4!}\,p_1^{x_1}\,p_2^{x_2}\,p_3^{x_3}\,p_4^{x_4}
\]
ou pela fórmula do R:
\(p = factorial(n)/(factorial(x1)*factorial(x2)*factorial(x3)*factorial(x4))*p1^x1*p2^x2*p3^x3* p4^x4\)
Exemplos
Uma rede de TV aberta de Curitiba tem 30% da audiência nas noites de sexta-feira, um canal local tem 20%, a TV a cabo tem 40%, e 10% assistem videocassetes. Qual a probabilidade de que entre 7 espectadores de televisão selecionados aleatoriamente naquela cidade numa noite de sexta-feira, 3 estejam assistindo à TV aberta, 1 esteja assistindo ao canal local, 2 estejam vendo TV a cabo e 1 esteja assistindo videocassetes?
n=7
x1=3
x2=1
x3=2
x4=1
p1=0.3
p2=0.2
p3=0.4
p4=0.1
p = factorial(n)/(factorial(x1)*factorial(x2)*factorial(x3)*factorial(x4))*p1^x1*p2^x2*p3^x3* p4^x4
p
Meu historico de passeios é bastante consistente, resume-se a sair para jantar e para ir ao cinema. Analisando esse histórico, constatei que tenho uma probabilidade de 0.9 de jantar, de 0.5 de ir ao cinema e 0.4 de fazer as duas coisas na mesma noite. Considerando um universo de 10 saÃdas, qual a probabilidade de eu ter todas as vezes jantado e em 5 delas eu tambem ter ido ao cinema?
pA = 0.9
pB = 0.5
pab = 0.4
pa = pA - pab
pb = pB - pab
na = 5
nb = 0
nab = 5
p = factorial(na+nb+nab)/(factorial(na)*factorial(nb)*factorial(nab))*pa^na*pb^nb*pab^nab
p = round(p, 4)
p
Um destino turÃstico possui 4 restaurantes — A, B, C, D — cujas possibilidades de escolha por parte dos visitantes são, respectivamente, p1 = 0.3, p2 = 0.2, p3 = 0.4, p4 = 0.1. Qual a probabilidade de, em um conjunto de 5 visitantes, n1 = 1, n2 = 1, n3 = 2, n4 = 1 visitantes escolherem os restaurantes A, B, C, D, respectivamente?
pmultinom = function(n, p) {
if(length(n)!=length(p)) stop("Vetores com comprimentos diferentes")
if(sum(p)!=1) stop("Probabilidades não somam 1")
factorial(sum(n))/prod(sapply(n, factorial))*prod(p^n)
}
pp = c(0.3, 0.2, 0.4, 0.1)
nn = c(1, 1, 2, 1)
p = pmultinom(nn, pp)
p = round(p, 4)
p
Se a probabilidade de um determinado dia em Curitiba ser ensolarado é de 22%, de estar chovendo é de 34% e de estar nublado é de 44%, qual a probabilidade de termos 1 dia de cada em um conjunto de 3 dias?
x = c(1, 1, 1)
p = c(0.22, 0.34, 0.44)
factorial(sum(x))/prod(factorial(x))*prod(p^x)
Uma amostragem apresentou os seguintes resultados.
a = [102 91 112 101 105 85 92 98 80 95]
Apos a padronização dos dados, com a operação $ ap = $
pode-se afirmar que:
a = c(102, 91, 112, 101, 105, 85, 92, 98, 80, 95)
ap = scale(a)
summary(ap)
Distribuição Normal
Uma caracterÃstica importante das distribuições normais, é que elas dependem apenas da média \((\mu)\) e do desvio padrão \((\sigma)\).
Exemplos
Imaginando que o chamado quociente de inteligência (QI) seja uma medida normalmente distribuÃda, possuindo média igual a 100 e desvio padrão igual a 15, determine:
a) A probabilidade de alguém possuir QI acima de 120.
m=100
sd=15
q=120
1-pnorm(q, m, sd)
b)O QI de uma pessoa que está acima de 99% da população.
q=qnorm(0.99,100,15)
plotareas(q,999,100,15)
c) A probabilidade de uma pessoa possuir QI acima de 90 ou abaixo de 70.
plotareas(c(90,-999), c(999,70),100,15)
pnorm(70,100,15) + (1 - pnorm(90,100,15))
d) A probabilidade de uma pessoa possuir QI entre 90 e 120 ou acima de 110.
plotareas(c(90, 110), c(120, 999), 100, 15, col = c(4, 2), density = 50, angle = c(45, -45))
O que, por meio de observação e cálculo direto, fornece
1-pnorm(90, 100, 15)
e) Uma variável x normalmente distribuÃda apresenta média igual a 20 e desvio-padrão igual a 3. Calcule o limite superior do intervalo de probabilidade que inicia em x = 15 e compreende 80% da probabilidade de ocorrência de valores para essa variável.
q = qnorm(0.8+pnorm(15, 20, 3), 20, 3)
q
verificando:
pnorm(q, 20, 3) - pnorm(15, 20, 3)
plotareas(15, q, 20, 3)
LS0tDQp0aXRsZTogIlByb3ZhIDAzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiZuYnNwOw0KDQojIyA8dT4gUHJpbmNpcGFpcyBGdW7Dp8O1ZXMgZGUgUHJvYmFiaWxpZGFkZSA8L3U+DQoNCiMjIyBEaXN0cmlidWnDp8OjbyBNdWx0aW5vbWlhbA0KDQotIE7Dum1lcm8gbcOheGltbyBkZSBvY29ycsOqbmNpYXMgZmluaXRvDQotIFByb2JhYmlsaWRhZGVzIGluZGVwZW5kZW50ZXMgcGFyYSBjYWRhIGV2ZW50bw0KLSBNw7psdGlwbGFzIGNhdGVnb3JpYXMNCg0KJCQNCnAgPSBcZnJhY3tuIX17bl8xIW5fMiEuLi5uX2shfXBfMV57bl97MX19cF8yXntuXzJ9Li4ue3Bfa157bl9rfX0NCiQkDQpPbmRlICoqayoqIMOpIG8gbsO6bWVybyBkZSBjYXRlZ29yaWFzIG9ic2VydmFkYXMsICoqbioqIMOpIG8gdGFtYW5obyBkYSBhbW9zdHJhIGNvbGhpZGEsIGNhZGEgJG5faSQgw6kgbyB0YW1hbmhvIGRhIHN1YmFtb3N0cmEgZGVzZWphZGEgZSAkcF9pJCAgw6kgYSBzdWEgcHJvYmFiaWxpZGFkZS4gT2JzZXJ2ZS1zZSBxdWU6DQoNCiQkDQpcc3VtKG5faSk9bg0KJCQNCmUgcXVlIA0KJCQNClxzdW0ocF9pKT0xDQokJA0KZSBkZSBmb3JtYSBnZXJhbDoNCg0KJCQNCnA9XGZyYWN7XHN1bShuX2kpIX17XHBpKG5faSEpfVxwaShwX2lee25faX0pDQokJA0KJm5ic3A7DQoNCiMjIyBEaXN0cmlidWnDp8OjbyBCaW5vbWlhbA0KDQotIE7Dum1lcm8gbcOheGltbyBkZSBvY29ycsOqbmNpYXMgZmluaXRvDQotIFByb2JhYmlsaWRhZGVzIGluZGVwZW5kZW50ZXMgcGFyYSBjYWRhIGV2ZW50bw0KLSBEdWFzIGNhdGVnb3JpYXMNCg0KKipGw7NybXVsYSBkYSBwcm9iYWJpbGlkYWRlIGJpbm9taWFsKioNCiQkcD1cYmlub217bn17eH1wXngoMS1wKV57bi14fSANCiQkDQoNCkVzdGUgw6kgdW0gY2FzbyBlc3BlY2lhbCBkYSBwcm9iYWJpbGlkYWRlIG11bHRpbm9taWFsLCBvbmRlIHPDsyBow6EgZHVhcyBjYXRlZ29yaWFzLCBvbmRlICoqbioqIMOpIG8gdGFtYW5obyBkYSBhbW9zdHJhLCAqKngqKiDDqSBvIG7Dum1lcm8gZGUgb2NvcnLDqm5jaWFzIGZhdm9yw6F2ZWlzLCAqKnAqKiDDqSBhIHByb2JhYmlsaWRhZGUgZmF2b3LDoXZlbCBlICoqMS1wKiogw6kgYSBwcm9iYWJpbGlkYWRlIGRlc2Zhdm9yw6F2ZWwuIA0KTm8gUiwNCg0KJGRiaW5vbSh4LCBzaXplLCBwcm9iKSQgIyBkaXN0cmlidWnDp8OjbyBwb250dWFsDQoNCiRwYmlub20ocSwgc2l6ZSwgcHJvYikkICMgZGlzdHJpYnVpw6fDo28gYWN1bXVsYWRhIMOgIGVzcXVlcmRhDQoNCiRxYmlub20ocCwgc2l6ZSwgcHJvYikkICMgcXVhbnRpbCBkYSBwcm9iYWJpbGlkYWRlIHANCg0KJHJiaW5vbShuLCBzaXplLCBwcm9iKSQgIyBnZXJhciBuIG7Dum1lcm9zIGFsZWF0w7NyaW9zDQoNCiZuYnNwOw0KDQojIyMgRGlzdHJpYnVpw6fDo28gZGUgUG9pc3Nvbg0KDQotIE7Dum1lcm8gbcOheGltbyBkZSBvY29ycsOqbmNpYXMgaW5maW5pdG8NCi0gVGF4YSB1bmlmb3JtZSBkZSBvY29ycsOqbmNpYSBkZSBldmVudG9zDQoNCkbDs3JtdWxhIGRhIFByb2JhYmlsaWRhZGUgZGUgUG9pc3Nvbg0KDQokJFAoeCk9IFxkZnJhY3tcbGFtYmRhXnhcLGVeey1cbGFtYmRhfX17eCF9JCQNCg0KTm8gUiB0ZW1vczoNCg0KJGRwb2lzKHgsIGxhbWJkYSkkICMgZGlzdHJpYnVpw6fDo28gcG9udHVhbA0KDQokcHBvaXMocSwgbGFtYmRhKSQgIyBkaXN0cmlidWnDp8OjbyBhY3VtdWxhZGEgw6AgZXNxdWVyZGENCg0KJHFwb2lzKHAsIGxhbWJkYSkkICMgcXVhbnRpbCBkYSBwcm9iYWJpbGlkYWRlIHANCg0KJHJwb2lzKG4sIGxhbWJkYSkkICMgZ2VyYXIgbiBuw7ptZXJvcyBhbGVhdMOzcmlvcw0KDQoNCiZuYnNwOw0KDQojIyMgRGlzdHJpYnVpw6fDo28gSGlwZXJnZW9tw6l0cmljYQ0KDQotIE7Dum1lcm8gbcOheGltbyBkZSBvY29ycsOqbmNpYXMgZmluaXRvDQotIFByb2JhYmlsaWRhZGVzIGRlcGVuZGVudGVzIHBhcmEgY2FkYSBldmVudG8NCi0gTcO6bHRpcGxhcyBjYXRlZ29yaWFzDQoNCkbDs3JtdWxhIGRhIHByb2JhYmlsaWRhZGUgaGlwZXJnZW9tw6l0cmljYToNCg0KJCQNCnAgPVxkZnJhY3tcYmlub217bjF9e3gxfVxiaW5vbXtuMn17eDJ9Li4uXGJpbm9te25fa317eF9rfX17XGJpbm9te25fMStuXzIrLi4uK25fa317eF8xK3hfMisuLi4reF9rfX0NCiQkDQoNCk9uZGUgY2FkYSAkbl9pJCDDqSBvIHRhbWFuaG8gZGEgc3ViYW1vc3RyYSBkZXNlamFkYSBlIGNhZGEgJHhfaSQgw6kgbyBuw7ptZXJvIGRlIG9jb3Jyw6puY2lhcyBkZXNlamFkbyBwYXJhIGNhZGEgc3ViYW1vc3RyYS4NCkRlIGZvcm1hIGdlcmFsLCB0ZW1vczoNCg0KJCQNCnA9XGRmcmFje1xwaVxiaW5vbXtuX2l9e3hfaX19e1xiaW5vbXtcc3VtIG5faX17XHN1bSB4X2l9fQ0KJCQNCk5vIFIsIFBhcmEgYXMgZHVhcyBjYXRlZ29yaWFzIHRlbW9zOg0KDQokZGh5cGVyKHgxLCBuMSwgbjIsIHgxK3gyKSQgIyBkaXN0cmlidWnDp8OjbyBwb250dWFsDQoNCiRwaHlwZXIoeDEsIG4xLCBuMiwgeDEreDIpJCAjIGRpc3RyaWJ1acOnw6NvIGFjdW11bGFkYSDDoCBlc3F1ZXJkYQ0KDQokcWh5cGVyKHAxLCBuMSwgbjIsIHgxK3gyKSQgIyBxdWFudGlsIGRhIHByb2JhYmlsaWRhZGUgcA0KDQokcmh5cGVyKE4sIG4xLCBuMiwgeDEreDIpJCAjIGdlcmFyIE4gbsO6bWVyb3MgYWxlYXTDs3Jpb3MNCg0KDQombmJzcDsNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+RGlzdHJpYnVpw6fDo28gQmlub21pYWwNCg0KQXMgY2FyYWN0ZXLDrXN0aWNhcyBwYXJhIHNlIHVzYXIgZXN0YSBkaXN0cmlidWnDp8OjbyBzw6NvOg0KDQoqIEV2ZW50b3MgZW51bWVyw6F2ZWlzDQoqIEVudW1lcsOhdmVpcw0KKiBPcyBldmVudG9zIHPDo28gcmVhbG1lbnRlIGluZGVwZW5kZW50ZXMNCg0KJCQNClAoeCk9XGJpbm9te259e3h9KnBebiooMS1wKV57bi14fQ0KJCQNCg0Kb3UgZW50w6NvIHBlbGEgZsOzcm11bGEgZG8gUjoNCg0KDQokc3VtKGNob29zZShOLG4pKnBebiooMS1wKV57Ti1ufSkkDQoNCm91IG5hIGZvcm1hIHJlZHV6aWRhDQoNCiRkYmlub20oeD14LCBzaXplPW4sIHByb2I9cCkkDQoNCiZuYnNwOw0KDQojIyMjICoqRXhlbXBsb3MqKg0KDQojIyMjICoqRW0gdW1hIHByb3ZhIGRlIDEwIHF1ZXN0w7VlcyBkbyB0aXBvIHZlcmRhZGVpcm8gb3UgZmFsc28sIHF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHVtIGFsdW5vIHBhc3NhciBjb20gbcOpZGlhIHBlbG8gbWVub3Mgc2V0ZSBzZSBlbGUgbmFkYSBzb3ViZXIgZGEgbWF0w6lyaWE/KioNCg0KYGBge3J9DQoNCk49MTANCnM9NzoxMA0KcD0wLjUNCg0Kc3VtKGNob29zZSgxMCwgcykqMC41XnMqMC41XigxMC1zKSkNCg0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqVW0gZ3J1cG8gZGUgNTAgbWFuaWZlc3RhbnRlcyBkZSB1bSBtZXNtbyBncnVwbyBwb2zDrXRpY28gZSBjb250csOhcmlvcyBhIHVtYSBwcm9wb3N0YSBwYXJ0aWNpcGEgZGUgdW1hIGFzc2VtYmxlaWEgb25kZSBlc3TDo28gcHJlc2VudGVzLCBubyB0b3RhbCwgMzAwIHBlc3NvYXMsIGRhcyBxdWFpcyA2MCUgc8OjbyBmYXZvcsOhdmVpcyDDoCBtZXNtYSBwcm9wb3N0YS4gU2UgZm9yIGZvcm1hZGEgdW1hIGNvbWlzc8OjbyBkZSAxMCBwZXNzb2FzLCBxdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSwgZGVudHJlIGFzIDEwLCBleGlzdGlyZW0gNSBmYXZvcsOhdmVpcyDDoCBwcm9wb3N0YSBlIGFwZW5hcyB1bSBtZW1icm8gZG8gZ3J1cG8gcG9sw610aWNvIGRlc3RhY2FkbyBhbnRlcmlvcm1lbnRlPyoqDQoNCmBgYHtyfQ0KIyBtZW1icm9zIGRvIGdydXBvDQpuMT01MA0KIyB0b3RhbCBkZSBmYXZvcsOhdmVpcw0KbjI9MTgwDQojIHRvdGFsIGRlIGNvbnRyw6FyaW9zDQpuMz0xMjANCiMgdG90YWwgZGUgY29udHLDoXJpb3MgZm9yYSBkbyBncnVwbw0KbjQ9bjMtbjENCg0KY2hvb3NlKG4xLDEpKmNob29zZShuMiw1KSpjaG9vc2UobjQsNCkvY2hvb3NlKDMwMCwxMCkNCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKk8gbWVzbW8gZXhlcmPDrWNpbyBjb20gZsOzcm11bGEgcmVkdXppZGE6KioNCg0KYGBge3J9DQpuPTEwDQpwPTAuNQ0KeD03OjEwIA0KDQpzdW0oZGJpbm9tKHgsIG4sIHApKQ0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqUXVhbCBhIHByb2JhYmlsaWRhZGUsIGVtIHVtIGxhbsOnYW1lbnRvIGRlIDEwIG1vZWRhcyBob25lc3RhcywgZGUgc2Ugb2J0ZXIgNCBvdSBtZW5vcyBjYXJhcz8qKg0KYGBge3J9DQpuID0gMTANCnggPSAwOjQNCnAgPSAwLjUNCnN1bShjaG9vc2UobiwgeCkqcF54KigxLXApXihuLXgpKQ0KYGBgDQpvdSB1dGlsaXphbmRvIGEgZsOzcm11bGENCg0KYGBge3J9DQpzdW0oZGJpbm9tKHggPSB4LCBzaXplID0gbiwgcHJvYiA9IHApKQ0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqTnVtYSBwcm92YSBjb20gOSBxdWVzdMO1ZXMgZGUgbcO6bHRpcGxhIGVzY29saGEgY2FkYSB1bWEgY29tIGNpbmNvIGFsdGVybmF0aXZhcywgcXVhbCBhIHByb2JhYmlsaWRhZGUgZGUsIGFvIGFjYXNvLCB1bSBhbHVubyB0aXJhciBub3RhIG1haW9yIG91IGlndWFsIHF1ZSA3PyoqDQoNCmBgYHtyfQ0KcCA9IDEvNQ0KbiA9IDkNCnggPSA3DQoxIC0gcGJpbm9tKDYsIDksIDEvNSkNCmBgYA0KDQombmJzcDsNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+RGlzdHJpYnVpw6fDo28gSGlwZXJnZW9tw6l0cmljYQ0KDQpBcyBjYXJhY3RlcsOtc3RpY2FzIGRlIHNldSB1c28gc8OjbzoNCg0KKiBFdmVudG9zIGVudW1lcsOhdmVpcw0KKiBQcm9iYWJpbGlkYWRlcyBuw6NvIHPDo28gY29uc3RhbnRlcw0KDQokJCBwKHgpID0gXGRmcmFje1xkaXNwbGF5c3R5bGVcYmlub217YX17eH1cYmlub217Yn17ay14fX17XGRpc3BsYXlzdHlsZVxiaW5vbXthK2J9e2t9fSAkJA0KDQpvdSBlbnTDo28gcGVsYSBmw7NybXVsYSBkbyBSOg0KDQokcCh4KT1jaG9vc2UoYSx4KSpjaG9vc2UoYixrLXgpL2Nob29zZShhK2IsaykkDQoNCm91IG5hIGZvcm1hIHJlZHV6aWRhDQokcCA9IHN1bShkaHlwZXIoeCwgbSwgbiwgaykpJA0KDQojIyMjICoqRXhlbXBsb3MqKg0KDQombmJzcDsNCg0KIyMjIyAqKlVtIGZ1bmNpb25hcmlvIGRhIGV4cGVkacOnw6NvIGRldmVyaWEgcmVtZXRlciA2IGRlIDE1IHBhY290ZXMgcG9yIHZpYSBleHByZXNzYSBwYXJhIGEgRXVyb3BhLCBtYXMgZWxlIGFjYWJhIG1pc3R1cmFuZG8gdG9kb3MgZSBhbGVhdG9yaWFtZW50ZSBtYW5kYSA2IGRvcyBwYWNvdGVzIHBvciB2aWEgZXhwcmVzc2EgcGFyYSBhIEV1cm9wYS4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgcXVlIGFwZW5hcyAzIGRvcyBwYWNvdGVzIHF1ZSBkZXZlcmlhbSBpciBwb3IgdmlhIHNpZ2FtIHJlYWxtZW50ZSBwb3IgdmlhIGV4cHJlc3NhPyoqDQoNCmBgYHtyfQ0KYT02DQp4PTMNCmI9OQ0Kaz02DQpjaG9vc2UoYSx4KSpjaG9vc2UoYixrLXgpL2Nob29zZShhK2IsaykNCg0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqTnVtIGdydXBvIGRlIDUgZW5nZW5oZWlyb3MgZSA0IGFycXVpdGV0b3MsIHF1YWwgYSBwcm9iIGRlIHNlcmVtIGVzY29saGlkb3MgYWxlYXRvcmlhbWVudGUgNCBpbmRpdmlkdW9zIHF1ZSBzZWphbSAyIGVuZ2VuaGVpcm9zIGUgMiBhcnF1aXRldG9zPyoqDQoNCmBgYHtyfQ0KYT01DQpiPTQNCng9Mg0Kaz00DQoNCmNob29zZSg1LDIpKmNob29zZSg0LDIpL2Nob29zZSg5LDQpDQoNCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKk51bSBncnVwbyBkZSAxMCBlbmdlbmhlaXJvcywgNiBhcnF1aXRldG9zLCAzIGFkdm9nYWRvcywgNSBhZG1pbmlzdHJhZG9yZXMsIHF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHRlciB1bSBncnVwbyBkZSAxIGRlIGNhZGE/KioNCg0KYGBge3J9DQpjaG9vc2UoMTAsMSkqY2hvb3NlKDYsMSkqY2hvb3NlKDMsMSkqY2hvb3NlKDUsMSkvY2hvb3NlKDI0LDQpDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMgKipVbWEgZW1wcmVzYSBmYWJyaWNvdSAxMDAwIHBlw6dhcyBhdXRvbW90aXZhcywgZGFzIHF1YWlzIDIyIGNvbSBkZWZlaXRvIGUgYXMgcmVzdGFudGVzIE9LLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSBpbnNwZXRvciB0aXJhciB1bWEgYW1vc3RyYSBkZSAxMjAgcGXDp2FzIGUgZW5jb250cmFyIDMgb3UgbWVub3MgY29tIGRlZmVpdG8/KioNCmBgYHtyfQ0KTiA9IDEwMDANCmRlZiA9IDIyDQpvayA9IE4tZGVmDQpuID0gMTIwDQp4ID0gMw0KcCA9IHN1bShkaHlwZXIoeCA9IG4tMDp4LCBtID0gb2ssIG4gPSBkZWYsIGsgPSBuKSkNCnANCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKlVtYSBlbXByZXNhIHRlbSB1bSBoaXN0w7NyaWNvIGRlIGZhYnJpY2HDp8OjbyBhcHJlc2VudGFuZG8gMS41JSBkZSBwZcOnYXMgY29tIGRlZmVpdG8uIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHVtIGluc3BldG9yIHRpcmFyIHVtYSBhbW9zdHJhIGRlIDEyMCBwZcOnYXMgZSBlbmNvbnRyYXIgNCBvdSBtYWlzIGNvbSBkZWZlaXRvPyoqDQoNCmBgYHtyfQ0KbiA9IDEyMA0KeCA9IDQNCnBlcmMgPSAwLjAxNQ0KDQpwPXBiaW5vbShxPXgtMSwgc2l6ZT1uLCBwcm9iPXBlcmMpICMgZXhwbGljYcOnw6NvOiBQKDQgb3UgbWFpcykgPSAxIC0gcCgzIG91IG1lbm9zKSA9IDEgLSBwYmlub20oMywgMTIwLCAwLjAxNSkNCg0KcD1yb3VuZCgxLXAsNCkNCnANCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKkV4YW1pbmEtc2UgdW0gbG90ZSBkZSAxMDAgZnJhc2NvcyBkZSBwZXJmdW1lLCBkb3MgcXVhaXMgNTAgc2FvIGZhbHNpZmljYWRvcyBlIG9zIHJlc3RhbnRlcyBzw6NvIG9yaWdpbmFpcy4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgdW0gaW5zcGV0b3IgZXNjb2xoZXIgdW1hIGFtb3N0cmEgZGUgMTAgZnJhc2NvcyBlIGVuY29udHJhciAyIG91IG1lbm9zIGZhbHNpZmljYWRvcz8qKg0KDQoNCiQkDQpwID0gXGRmcmFje1xkaXNwbGF5c3R5bGVcYmlub217NTB9ezB9XGJpbm9tezUwfXsxMH19e1xkaXNwbGF5c3R5bGVcYmlub217MTAwfXsxMH19ICsgXGRmcmFje1xkaXNwbGF5c3R5bGVcYmlub217NTB9ezF9XGJpbm9tezUwfXs5fX17XGRpc3BsYXlzdHlsZVxiaW5vbXsxMDB9ezEwfX0gKyBcZGZyYWN7XGRpc3BsYXlzdHlsZVxiaW5vbXs1MH17Mn1cYmlub217NTB9ezh9fXtcZGlzcGxheXN0eWxlXGJpbm9tezEwMH17MTB9fQ0KJCQNCmxvZ28NCg0KYGBge3J9DQoNCmZIeXBlckdlb20yID0gZnVuY3Rpb24oeCwgaSwgeSwgaiwgZGVjID0gNCkgew0KICByb3VuZChjaG9vc2UoeCxpKSpjaG9vc2UoeSwgaikvY2hvb3NlKHgreSwgaStqKSxkZWMpDQp9DQoNCmZIeXBlckdlb20yVG9MYVRlWCA9IGZ1bmN0aW9uKHgsIGksIHksIGosIHosIGssIGRlYyA9IDQpIHsNCiAgcmVzID0gcGFzdGUwKA0KICAgICJcXGVuc3VyZW1hdGh7IiwgDQogICAgIlxcZGhpcGVyZ2VvbXsiLCB4LCAifXsiLCBpLCAifXsiLCB5LCAifXsiLCBqLCAifXsiLCB4KyB5LCAifXsiLCBpICsgaiwgIn0iICwNCiAgICAifSINCiAgKQ0KICB2YWwgPSBmSHlwZXJHZW9tMih4LCBpLCB5LCBqLCBkZWMpDQogIHJldHVybihsaXN0KGNvZGUgPSByZXMsIHZhbCA9IHZhbCkpDQp9DQoNCk4gPSAxMDANCmRlZiA9IDUwDQpvayA9IE4tZGVmDQpuID0gMTANCnggPSAyDQpsID0gZkh5cGVyR2VvbTJUb0xhVGVYKGRlZiwgMDp4LCBOLWRlZiwgbi0wOngpICAgIyBWZXIgbyBwYWNvdGUgcXVlIGNvbnRlbSBhIGZ1bsOnw6NvIGZIeXBlckdlb20yVG9MYVRlWA0KcCA9IHN1bShsJHZhbCkNCnANCmBgYA0KDQombmJzcDsNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+RGlzdHJpYnVpw6fDo28gZGUgUG9pc3Nvbg0KDQpBcyBjYXJhY3RlcsOtc3RpY2FzIHBhcmEgc2UgdXNhciBlc3RhIGRpc3RyaWJ1acOnw6NvIG9jb3JyZSBxdWFuZG8gbyAkXGxhbWJkYSQgw6kgdW1hIHRheGEgZGUgY2hlZ2FkYSBvdSBkZSBvY29ycsOqbmNpYSAtIG91IHF1YW5kbyBvIG4gw6kgZ3JhbmRlIGUgYSBwcm9iYWJpbGlkYWRlIMOpIHBlcXVlbmEsIG91IHNlamEsIG4+PTEwMCBlIHA8MTAuDQoNCiQkUCh4KT0gXGRmcmFje1xsYW1iZGFeeFwsZV57LVxsYW1iZGF9fXt4IX0kJA0Kb3UgZW50w6NvIHBlbGFzIGbDs3JtdWxhcyByZWR1emlkYXMgZG8gUjoNCg0KJGRwb2lzKHgsXGxhbWJkYSkkDQoNCiRcbGFtYmRhXngqZV57LVxsYW1iZGF9L2ZhY3RvcmlhbCh4KSQNCg0KJm5ic3A7DQoNCiMjIyMgKipFeGVtcGxvcyoqDQoNCiMjIyMgKipVbSBwb3N0byBkZSBjb3JyZWlvIGF0ZW5kZSwgbm9ybWFsbWVudGUsIDMgY2xpZW50ZXMgbm8gcGVyw61vZG8gZGUgMTEgw6BzIDEzaC4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGVzc2UgcG9zdG8qKg0KDQojIyMjIyAqKmEpIE7Do28gcmVjZWJlciBjbGllbnRlIGFsZ3VtIGRhcyAxMSDDoHMgMTJoPyoqDQoNCmBgYHtyfQ0KdGF4YSA9IDMvMiAgI2NsaWVudGVzIHBvciBob3JhDQpwID0gcHBvaXMocT0wLCBsYW1iZGE9dGF4YSkNCnANCmBgYA0KDQojIyMjIyAqKmIpIFJlY2ViZXIgbWFpcyBxdWUgNSBjbGllbnRlcyBkYXMgMTEgw6BzIDEzaD8qKg0KDQpgYGB7cn0NCnRheGEgPSAzICNjbGllbnRlcyBlbSB1bSBwZXLDrW9kbyBkZSBkdWFzIGhvcmFzDQojcHJvYmFiaWxpZGFkZSBkZSA1IG91IG1lbm9zDQpwID0gcHBvaXMocT01LCBsYW1iZGE9dGF4YSkNCjEtcA0KYGBgDQoNCiZuYnNwOw0KDQojIyMjIyAqKlVtIHBvc3RvIGRlIG9ic2VydmFjYW8gcmVnaXN0cmEgYSBwYXNzYWdlbSBkZSAxMCB2ZWljdWxvcyBlbSBtZWRpYSBwb3IgaG9yYS4gUXVhbCBhIHByb2IgZGUgZW0gdW1hIGhvcmEgbmFvIHBhc3NhciB2ZWljdWxvIGFsZ3VtPyoqDQoNCmBgYHtyfQ0KDQoxMF4wKmV4cCgtMTApL2ZhY3RvcmlhbCgwKQ0KDQpkcG9pcygwLDEwLzEpDQoNCnBwb2lzKDAsIDEwLzEpDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMjICoqTnVtYSBpbnN0YWxhw6fDo28sIHF1ZWltYW0gMi4wMDAgbMOibXBhZGFzIHBvciBhbm8uIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHF1ZWltYXJlbSBtYWlzIGRlIDIwIGzDom1wYWRhcyBlbSB1bWEgZGFkYSBzZW1hbmE/KioNCg0KYGBge3J9DQoNCg0KdGF4YSA9IDIwMDAvMzY1KjcgIyBxdWVpbWFzIHBvciBzZW1hbmENCg0KMSAtIHBwb2lzKDIwLCB0YXhhKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMjICoqTnVtYSBpbnN0YWxhw6fDo28sIHF1ZWltYW0gMi4wMDAgbMOibXBhZGFzIHBvciBhbm8uIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHF1ZWltYXJlbSBtYWlzIGRlIDUwIGzDom1wYWRhcyBlbSB1bWEgZGFkYSBzZW1hbmE/KioNCg0KYGBge3J9DQoNCnRheGEgPSAyMDAwLzM2NSo3DQoNCjEgLSBwcG9pcyg1MCwgdGF4YSkNCg0KYGBgDQoNCiZuYnNwOw0KDQojIyMjIyAqKlBlc3NvYXMgY2hlZ2FtIGEgdW1hIGZpbGEgZGUgc3VwZXJtZXJjYWRvIGNvbSB1bSB0ZW1wbyBtZWRpbyBlbnRyZSBjaGVnYWRhcyBkZSAyNyBzZWd1bmRvcy4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgY2hlZ2FyZW0gbWVub3MgZGUgNCBjbGllbnRlcyBlbSB1bSBpbnRlcnZhbG8gZGUgdGVtcG8gZGUgMyBtaW51dG9zPyoqDQpgYGB7cn0NCnRlbXBvID0gMjcvNjAgICNlbSBtaW51dG9zDQpqYW5lbGEgPSAzDQpuY2hlZ2FkYXMgPSA0DQpsYW1iZGEgPSAxL3RlbXBvICogamFuZWxhDQoNCnAgPSByb3VuZChwcG9pcyhuY2hlZ2FkYXMtMSxsYW1iZGEpLDQpDQpwDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMjICoqRm9pIGNvbXByYWRvIHVtIGxvdGUgZGUgbGFtcGFkYXMgcXVlIGFwcmVzZW50YW0gZGVmZWl0byBjb20gdW0gdGVtcG8gbcOpZGlvIGVudHJlIGZhbGhhcyBkZSAyMDAwIGhvcmFzLiBFbSB1bSBncmFuZGUgZXNjcml0b3JpbyBvbmRlIGZvcmFtIHVzYWRhcyBlc3NhcyBsw6JtcGFkYXMsIHF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHRlciBxdWUgdHJvY2FyIDMgb3UgbWFpcyBsw6JtcGFkYXMgZW0gdW0gcGVyw61vZG8gZGUgMTgwIGRpYXMgZGUgZnVuY2lvbmFtZW50byBpbmludGVycnVwdG8/KioNCmBgYHtyfQ0KdGVtcG8gPSAyMDAwLzI0ICAjZW0gZGlhcw0KamFuZWxhID0gMTgwICAgICAjZW0gZGlhcw0KbmZhbGhhcyA9IDMNCmxhbWJkYSA9IDEvdGVtcG8qamFuZWxhDQoNCnAgPSByb3VuZChwcG9pcyhuZmFsaGFzLTEsbGFtYmRhKSw0KQ0KcD0xLXANCnANCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKlVtYSBzZWNyZXTDoXJpYSwgdGlwaWNhbWVudGUsIGNvbWV0ZSAyIGVycm9zIGEgY2FkYSAxMCBww6FnaW5hcy4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgdW0gcmVsYXTDs3JpbywgZGlnaXRhZG8gcG9yIGEgZWxhIGUgY29tIDI1MCBww6FnaW5hcywgYXByZXNlbnRhciBtYWlzIGRlIDUwIGVycm9zPyoqDQoNCmBgYHtyfQ0KMS1wYmlub20oNTAsIDI1MCwgMC4yKQ0KYGBgDQpvdSBlbnTDo28NCg0KYGBge3J9DQoxLXBwb2lzKDUwLCA1MCkNCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKlNlIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSBkb2N1bWVudG8gYXByZXNlbnRhciBlcnJvIMOpIGRlIDEwJSwgcXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgdW0gbG90ZSBkZSAxMCBkb2N1bWVudG9zIGFwcmVzZW50YXIgbm8gbcOheGltbyB1bSBkb2N1bWVudG8gY29tIGVycm8/KioNCmBgYHtyfQ0KcD0wLjENCm49MTANCng9MQ0KcGJpbm9tKHEgPSB4LCBzaXplID0gbiwgcHJvYiA9IHApDQpgYGANCiZuYnNwOw0KDQojIyMjICoqVW1hIHNlY3JldMOhcmlhIGNvbWV0ZSAxIGVycm8gYSBjYWRhIDUwIHDDoWdpbmFzLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSBwZWdhciB1bSBkb2N1bWVudG8gZGUgMjAwIHDDoWdpbmFzIGdlcmFkbyBwb3IgZXNzYSBzZWNyZXTDoXJpYSBlIGVsZSBuw6NvIGNvbnRlciBlcnJvcz8qKg0KYGBge3J9DQpxPTANCnNpemU9MjAwDQpwcm9iPTEvNTANCnBiaW5vbShxLCBzaXplLCBwcm9iKQ0KYGBgDQpvdSBwZWxhIGFwcm94aW1hw6fDo28gZGUgUG9pc3Nvb24NCg0KYGBge3J9DQpxPTANCmxhbWJkYT0xLzUwKjIwMA0KcHBvaXMocSxsYW1iZGEpDQpgYGANCiZuYnNwOw0KDQojIyMjICoqUGVzc29hcyBjaGVnYW0gYSB1bWEgZmlsYSBkZSBzdXBlcm1lcmNhZG8gY29tIHVtIHRlbXBvIG1lZGlvIGVudHJlIGNoZWdhZGFzIGRlIDI3IHNlZ3VuZG9zLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSBjaGVnYXJlbSBtZW5vcyBkZSA0IGNsaWVudGVzIGVtIHVtIGludGVydmFsbyBkZSB0ZW1wbyBkZSAzIG1pbnV0b3M/KioNCg0KYGBge3J9DQp0ZW1wbyA9IDI3ICMgZW0gc2VndW5kb3MNCmphbmVsYSA9IDMgIyBlbSBtaW51dG9zDQpuY2hlZ2FkYXMgPSA0DQp0ZW1wbyA9IDI3LzYwDQpsYW1iZGEgPSAxL3RlbXBvKmphbmVsYQ0KcCA9IHJvdW5kKHBwb2lzKHEgPSAobmNoZWdhZGFzLTEpLCBsYW1iZGEgPSBsYW1iZGEpLCA0KQ0KcA0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqVW1hIG3DoXF1aW5hIGZhbGhhIHRpcGljYW1lbnRlIHRyw6pzIHZlemVzIHBvciBhbm8uIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlbGEgZmFsaGFyIG1haXMgcXVlIHVtYSB2ZXogZW0gdW0gZGV0ZXJtaW5hZG8gbcOqcz8qKg0KDQpgYGB7cn0NCnAgPSBwcG9pcygxLCAzLzEyKSAjIGZhbGhhciB1bWEgdmV6IG91IG1lbm9zIG5vIG3DqnMNCjEgLSBwICAjIGZhbGhhciBtYWlzIHF1ZSB1bWEgdmV6IG5vIG3DqnMNCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKkVtIHVtYSBvZmljaW5hIG1lY8OibmljYSwgdGlwaWNhbWVudGUgY2hlZ2FtIDEyIGNhcnJvcyBlbSB1bSBkaWEgZGUgOCBob3JhcyBkZSBzZXJ2acOnby4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgY2hlZ2FyZW0gbWFpcyBkZSAyIGNhcnJvcyBlbSB1bWEgZGV0ZXJtaW5hZGEgaG9yYT8qKg0KDQpgYGB7cn0NCjEgLSBwcG9pcygyLCBsYW1iZGEgPSAxMi84KQ0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqQ2FtaW5ow7VlcyBjaGVnYW0gYSB1bSBwb3N0byBkZSBwZWTDoWdpbyBjb20gdW1hIHRheGEgZGUgY2hlZ2FkYXMgZGUgMTggdmXDrWN1bG9zIHBvciBob3JhLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSBjaGVnYXJlbSAxMCBvdSBtYWlzIGNhbWluaMO1ZXMgZW0gdW0gaW50ZXJ2YWxvIGRlIHRlbXBvIGRlIDMwIG1pbnV0b3M/KioNCg0KYGBge3J9DQpsYW1iZGE9MTggI3ZlaWN1bG9zIHBvciBob3JhDQpqYW5lbGE9MzAvNjANCm5jaGVnYWRhcz0xMA0KbGFtYmRhPWxhbWJkYSpqYW5lbGENCg0KcD1yb3VuZChwcG9pcyhuY2hlZ2FkYXMtMSxsYW1iZGE9bGFtYmRhKSw0KQ0KcD0xLXANCnANCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKkZvaSBjb21wcmFkbyB1bSBsb3RlIGRlIDQwMCBsw6JtcGFkYXMsIHF1ZSBhcHJlc2VudGFtIGRlZmVpdG8gZGUgZsOhYnJpY2EgY29tIHVtIHBlcmNlbnR1YWwgZGUgMC4xNSUuIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlLCBuZXNzZSBsb3RlLCBoYXZlciAyIG91IG1haXMgbMOibXBhZGFzIGNvbSBkZWZlaXRvPyoqDQpgYGB7cn0NCm4gPSA0MDANCnBlcmNmYWxoYSA9IDAuMDAxNQ0KbmZhbGhhcyA9IDINCg0KcCA9IHJvdW5kKGRiaW5vbSh4ID0gbmZhbGhhcy0xLCBzaXplID0gbiwgcHJvYiA9IHBlcmNmYWxoYSksIDQpDQpwID0gMS1wDQpwDQpgYGANCg0KJm5ic3A7DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkRpc3RyaWJ1acOnw6NvIE11bHRpbm9taWFsDQoNCkFzIGNhcmFjdGVyw61zdGljYXMgcGFyYSBzZSB1c2FyIGVzdGEgZGlzdHJpYnVpw6fDo28gw6kgcXVhbmRvIGjDoSBtYWlzIGRlIGRvaXMgcmVzdWx0YWRvcyBwb3Nzw612ZWlzIGVtIGNhZGEgcHJvdmEsIGFzIHByb2JhYmlsaWRhZGVzIGRvcyB2w6FyaW9zIHJlc3VsdGFkb3MgcGVybWFuZWNlbSBhcyBtZXNtYXMgcGFyYSBjYWRhIHByb3ZhLCBlIGFzIHByb3ZhcyBzw6NvIHRvZGFzIGluZGVwZW5kZW50ZXMuDQoNCiQkDQpwID0gXGRmcmFje24hfXt4XzEheF8yIXhfMyF4XzQhfVwscF8xXnt4XzF9XCxwXzJee3hfMn1cLHBfM157eF8zfVwscF80Xnt4XzR9DQokJA0KDQpvdSBwZWxhIGbDs3JtdWxhIGRvIFI6DQoNCiRwID0gZmFjdG9yaWFsKG4pLyhmYWN0b3JpYWwoeDEpKmZhY3RvcmlhbCh4MikqZmFjdG9yaWFsKHgzKSpmYWN0b3JpYWwoeDQpKSpwMV54MSpwMl54MipwM154MyogcDReeDQkDQoNCg0KJm5ic3A7DQoNCiMjIyMgKipFeGVtcGxvcyoqDQoNCiMjIyMgKipVbWEgcmVkZSBkZSBUViBhYmVydGEgZGUgQ3VyaXRpYmEgdGVtIDMwJSBkYSBhdWRpw6puY2lhIG5hcyBub2l0ZXMgZGUgc2V4dGEtZmVpcmEsIHVtIGNhbmFsIGxvY2FsIHRlbSAyMCUsIGEgVFYgYSBjYWJvIHRlbSA0MCUsIGUgMTAlIGFzc2lzdGVtIHZpZGVvY2Fzc2V0ZXMuIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHF1ZSBlbnRyZSA3IGVzcGVjdGFkb3JlcyBkZSB0ZWxldmlzw6NvIHNlbGVjaW9uYWRvcyBhbGVhdG9yaWFtZW50ZSBuYXF1ZWxhIGNpZGFkZSBudW1hIG5vaXRlIGRlIHNleHRhLWZlaXJhLCAzIGVzdGVqYW0gYXNzaXN0aW5kbyDDoCBUViBhYmVydGEsIDEgZXN0ZWphIGFzc2lzdGluZG8gYW8gY2FuYWwgbG9jYWwsIDIgZXN0ZWphbSB2ZW5kbyBUViBhIGNhYm8gZSAxIGVzdGVqYSBhc3Npc3RpbmRvIHZpZGVvY2Fzc2V0ZXM/KioNCg0KYGBge3J9DQpuPTcNCngxPTMNCngyPTENCngzPTINCng0PTENCnAxPTAuMw0KcDI9MC4yDQpwMz0wLjQNCnA0PTAuMQ0KDQpwID0gZmFjdG9yaWFsKG4pLyhmYWN0b3JpYWwoeDEpKmZhY3RvcmlhbCh4MikqZmFjdG9yaWFsKHgzKSpmYWN0b3JpYWwoeDQpKSpwMV54MSpwMl54MipwM154MyogcDReeDQNCnANCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKkVtIHVtYSBkZXRlcm1pbmFkYSBub2l0ZSB1bWEgcGVzc29hIHRlbSBhIHByb2JhYmlsaWRhZGUgZGUgMzAlIGRlIGZpY2FyIGVtIGNhc2EgZSB2ZXIgVFYsIDIwJSBkZSBpciBhbyBzaG9wcGluZyBmYXplciBjb21wcmFzIGUgNTAlIGRlIGlyIGFvIGNpbmVtYS4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUsIGVtIHVtYSBkZXRlcm1pbmFkYSBub2l0ZSwgZW0gdW0gZ3J1cG8gZGUgMTAgYW1pZ29zLCA1IGlyZW0gYW8gY2luZW1hLCA0IGlyZW0gYW8gc2hvcHBpbmcgZmF6ZXIgY29tcHJhcyBlIGFwZW5hcyAxIGZpY2FyIGVtIGNhc2EgdmVuZG8gVFY/KioNCg0KYGBge3J9DQpuPTEwDQpuMT01DQpuMj00DQpuMz0xDQpwMT0wLjMwDQpwMj0wLjIwDQpwMz0wLjUwDQp4MT0xDQp4Mj00DQp4Mz01DQpwID0gZmFjdG9yaWFsKDEwKS8oZmFjdG9yaWFsKG4xKSpmYWN0b3JpYWwobjIpKmZhY3RvcmlhbChuMykpKnAxXngxKnAyXngyKnAzXngzDQpwDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMgKipNZXUgaGlzdG9yaWNvIGRlIHBhc3NlaW9zIMOpIGJhc3RhbnRlIGNvbnNpc3RlbnRlLCByZXN1bWUtc2UgYSBzYWlyIHBhcmEgamFudGFyIGUgcGFyYSBpciBhbyBjaW5lbWEuIEFuYWxpc2FuZG8gZXNzZSBoaXN0w7NyaWNvLCBjb25zdGF0ZWkgcXVlIHRlbmhvIHVtYSBwcm9iYWJpbGlkYWRlIGRlIDAuOSBkZSBqYW50YXIsIGRlIDAuNSBkZSBpciBhbyBjaW5lbWEgZSAwLjQgZGUgZmF6ZXIgYXMgZHVhcyBjb2lzYXMgbmEgbWVzbWEgbm9pdGUuIENvbnNpZGVyYW5kbyB1bSB1bml2ZXJzbyBkZSAxMCBzYcOtZGFzLCBxdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSBldSB0ZXIgdG9kYXMgYXMgdmV6ZXMgamFudGFkbyBlIGVtIDUgZGVsYXMgZXUgdGFtYmVtIHRlciBpZG8gYW8gY2luZW1hPyoqDQoNCmBgYHtyfQ0KcEEgPSAwLjkNCnBCID0gMC41DQpwYWIgPSAwLjQNCnBhID0gcEEgLSBwYWINCnBiID0gcEIgLSBwYWINCm5hID0gNQ0KbmIgPSAwDQpuYWIgPSA1DQoNCnAgPSBmYWN0b3JpYWwobmErbmIrbmFiKS8oZmFjdG9yaWFsKG5hKSpmYWN0b3JpYWwobmIpKmZhY3RvcmlhbChuYWIpKSpwYV5uYSpwYl5uYipwYWJebmFiDQoNCnAgPSByb3VuZChwLCA0KQ0KcA0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqVW0gZGVzdGlubyB0dXLDrXN0aWNvIHBvc3N1aSA0IHJlc3RhdXJhbnRlcyDigJQgQSwgQiwgQywgRCDigJQgY3VqYXMgcG9zc2liaWxpZGFkZXMgZGUgZXNjb2xoYSBwb3IgcGFydGUgZG9zIHZpc2l0YW50ZXMgc8OjbywgcmVzcGVjdGl2YW1lbnRlLCBwMSA9IDAuMywgcDIgPSAwLjIsIHAzID0gMC40LCBwNCA9IDAuMS4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUsIGVtIHVtIGNvbmp1bnRvIGRlIDUgdmlzaXRhbnRlcywgbjEgPSAxLCBuMiA9IDEsIG4zID0gMiwgbjQgPSAxIHZpc2l0YW50ZXMgZXNjb2xoZXJlbSBvcyByZXN0YXVyYW50ZXMgQSwgQiwgQywgRCwgcmVzcGVjdGl2YW1lbnRlPyoqDQoNCmBgYHtyfQ0KcG11bHRpbm9tID0gZnVuY3Rpb24obiwgcCkgew0KICBpZihsZW5ndGgobikhPWxlbmd0aChwKSkgc3RvcCgiVmV0b3JlcyBjb20gY29tcHJpbWVudG9zIGRpZmVyZW50ZXMiKQ0KICBpZihzdW0ocCkhPTEpIHN0b3AoIlByb2JhYmlsaWRhZGVzIG7Do28gc29tYW0gMSIpDQogIGZhY3RvcmlhbChzdW0obikpL3Byb2Qoc2FwcGx5KG4sIGZhY3RvcmlhbCkpKnByb2QocF5uKQ0KfQ0KcHAgPSBjKDAuMywgMC4yLCAwLjQsIDAuMSkNCm5uID0gYygxLCAxLCAyLCAxKQ0KcCA9IHBtdWx0aW5vbShubiwgcHApDQpwID0gcm91bmQocCwgNCkNCnANCg0KYGBgDQoNCiZuYnNwOw0KDQojIyMjICoqU2VqYW0gZHVhcyB2YXJpYXZlaXMgYWxlYXTDs3JpYXMgbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRhcywgeDEsIHgyLCBjb20gbcOpZGlhcyDCtTEgPSAxMCwgwrUyID0gMjAgZSBkZXN2aW9zIHBhZHLDo28gz4MxID0gMiBlIM+DMiA9IDMuIEFvIHNvbWFyIGVzc2FzIGR1YXMgdmFyaWF2ZWlzIG9idMOqbS1zZSB4MyA9IHgxICsgeDI7IGVzcGVyYS1zZSBxdWU6KioNCg0KU2FiZW5kby1zZSBxdWUsIHNlIHgxIH4gTijCtTEsz4MxKSBlIHgyIH4gTijCtTIsz4MyKSwgZW50w6NvIHgzIH4gTijCtTEgKyDCtTIpLCAoz4MxXjIrz4MyXjIpXjEvMi4gQXNzaW06DQoNCmBgYHtyfQ0KbXUxID0gMTANCnNpZ21hMSA9IDINCm11MiA9IDIwDQpzaWdtYTIgPSAzDQptdTMgPSBtdTEgKyBtdTINCnNpZ21hMyA9IHNxcnQoc2lnbWExXjIrc2lnbWEyXjIpDQpjKG11Mywgc2lnbWEzKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMgKipTdXBvbmRvIHF1ZSBhIG1lZGnDp8OjbyBkbyB0ZW1wbyBwYXJhIGV4ZWN1dGFyIHVtYSBkZXRlcm1pbmFkYSB0YXJlZmEgcG9yIG1laW8gZGUgdW1hIGFtb3N0cmFnZW0gZW0gdW1hIGVzY2FsYSBhcmJpdHLDoXJpYSByZXN1bHRvdSBlbSB1bWEgdmFyacOhdmVsIHF1ZSBhcHJlc2VudGEgdW1hIGRpc3RyaWJ1acOnw6NvIGFwcm94aW1hZGFtZW50ZSBub3JtYWwsIGNvbSBtw6lkaWEgeMKvID0gMTAwIGUgZGVzdmlvIHBhZHLDo28gcyA9IDIwLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSBub3ZvIHZhbG9yLCBjb2xldGFkbyBhbyBhY2Fzbywgc2VyIG1lbm9yIHF1ZSA2NSBvdSBtYWlvciBxdWUgOTU/KioNCg0KYGBge3J9DQp4YmFycmEgPSAxMDANCmRlc3ZwYWQgPSAyMA0KeG1pbiA9IDY1DQp4bWF4ID0gOTUNCnAgPSAxLXBub3JtKHhtYXgseGJhcnJhLGRlc3ZwYWQpK3Bub3JtKHhtaW4seGJhcnJhLGRlc3ZwYWQpDQpwID0gcm91bmQocCwgNCkNCnANCmBgYA0KDQombmJzcDsNCg0KIyMjIyAqKlNlIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSBkZXRlcm1pbmFkbyBkaWEgZW0gQ3VyaXRpYmEgc2VyIGVuc29sYXJhZG8gw6kgZGUgMjIlLCBkZSBlc3RhciBjaG92ZW5kbyDDqSBkZSAzNCUgZSBkZSBlc3RhciBudWJsYWRvIMOpIGRlIDQ0JSwgcXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgdGVybW9zIDEgZGlhIGRlIGNhZGEgZW0gdW0gY29uanVudG8gZGUgMyBkaWFzPyoqDQoNCmBgYHtyfQ0KeCA9IGMoMSwgMSwgMSkNCnAgPSBjKDAuMjIsIDAuMzQsIDAuNDQpDQpmYWN0b3JpYWwoc3VtKHgpKS9wcm9kKGZhY3RvcmlhbCh4KSkqcHJvZChwXngpDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMgKipVbWEgYW1vc3RyYWdlbSBhcHJlc2VudG91IG9zIHNlZ3VpbnRlcyByZXN1bHRhZG9zLioqDQoNCmEgPSBbMTAyIDkxIDExMiAxMDEgMTA1IDg1IDkyIDk4IDgwIDk1XQ0KDQpBcG9zIGEgcGFkcm9uaXphw6fDo28gZG9zIGRhZG9zLCBjb20gYSBvcGVyYcOnw6NvICQgYXAgPSBcZGZyYWMge2EtXG11fSB7XHNpZ21hfSAkDQoNCnBvZGUtc2UgYWZpcm1hciBxdWU6DQoNCg0KYGBge3J9DQoNCmEgPSBjKDEwMiwgOTEsIDExMiwgMTAxLCAxMDUsIDg1LCA5MiwgOTgsIDgwLCA5NSkNCmFwID0gc2NhbGUoYSkNCnN1bW1hcnkoYXApDQoNCmBgYA0KDQombmJzcDsNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+RGlzdHJpYnVpw6fDo28gYXByb3hpbWFkYW1lbnRlIE5vcm1hbCBjb20gTcOpZGlhIGUgRGVzdmlvIFBhZHLDo28NCg0KJHAgPSBwbm9ybSh4bWF4LHhiYXJyYSxkZXN2cGFkKS1wbm9ybSh4bWluLHhiYXJyYSxkZXN2cGFkKSQNCg0KDQojIyMNCiMjIyMgKipFeGVtcGxvcyoqDQoNCiMjIyMgKipTdXBvbmRvIHF1ZSBhIG1lZGljw6NvIGRhIGhhYmlsaWRhZGUgcGFyYSBleGVjdXRhciB1bWEgZGV0ZXJtaW5hZGEgdGFyZWZhIHBvciBtZWlvIGRlIHVtYSBhbW9zdHJhZ2VtIGVtIHVtYSBlc2NhbGEgYXJiaXRyw6FyaWEgcmVzdWx0b3UgZW0gdW1hIHZhcmnDoXZlbCBxdWUgYXByZXNlbnRhIHVtYSBkaXN0cmlidWljw6NvIGFwcm94aW1hZGFtZW50ZSBub3JtYWwsIGNvbSBtw6lkaWEgeMKvID0gMTAgZSBkZXN2aW8gcGFkcmFvIHMgPSAyLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSBub3ZvIHZhbG9yLCBjb2xldGFkbyBhbyBhY2FzbywgZmljYXIgZW50cmUgNiBlIDg/ICoqDQoNCmBgYHtyfQ0KeGJhcnJhID0gMTANCmRlc3ZwYWQgPSAyDQp4bWluID0gNg0KeG1heCA9IDgNCg0KcCA9IHBub3JtKHhtYXgseGJhcnJhLGRlc3ZwYWQpLXBub3JtKHhtaW4seGJhcnJhLGRlc3ZwYWQpDQpwDQpgYGANCg0KJm5ic3A7DQoNCiMjIyMgKipTdXBvbmRvIHF1ZSBhIG1lZGnDp8OjbyBkYSBoYWJpbGlkYWRlIHBhcmEgZXhlY3V0YXIgdW1hIGRldGVybWluYWRhIHRhcmVmYSBwb3IgbWVpbyBkZSB1bWEgYW1vc3RyYWdlbSBlbSB1bWEgZXNjYWxhIGFyYml0cmFyaWEgcmVzdWx0b3UgZW0gdW1hIHZhcmnDoXZlbCBxdWUgYXByZXNlbnRhIHVtYSBkaXN0cmlidWnDp8OjbyBhbyBhcHJveGltYWRhbWVudGUgbm9ybWFsLCBjb20gbcOpZGlhIHjCryA9IDE1IGUgZGVzdmlvIHBhZHLDo28gcyA9IDIuNywgUXVhbCBhIGFmaXJtYcOnw6NvIHZlcmRhZGVpcmE/KiogDQoNCg0KYGBge3J9DQp4YmFycmEgPSAxNQ0KZGVzdnBhZCA9IDIuNw0KcSA9IHJvdW5kKHFub3JtKDA6NC80LCB4YmFycmEsIGRlc3ZwYWQpLDQpDQpuYW1lcyhxKSA9IHBhc3RlKCJxIiwwOjQsIHNlcCA9ICIiKQ0KDQpxDQoNCnFbNF0tcVsyXQ0KDQpgYGANCg0KJm5ic3A7DQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkRpc3RyaWJ1acOnw6NvIE5vcm1hbA0KDQpVbWEgY2FyYWN0ZXLDrXN0aWNhIGltcG9ydGFudGUgZGFzIGRpc3RyaWJ1acOnw7VlcyBub3JtYWlzLCDDqSBxdWUgZWxhcyBkZXBlbmRlbSBhcGVuYXMgZGEgbcOpZGlhICQoXG11KSQgZSBkbyBkZXN2aW8gcGFkcsOjbyAkKFxzaWdtYSkkLg0KDQombmJzcDsNCg0KIyMjIyAqKkV4ZW1wbG9zKiogDQoNCiMjIyMgKipFbSB1bWEgcG9wdWxhw6fDo28gY29tIGFsdHVyYSBtw6lkaWEgZGUgMTgwY20gZSBkZXN2aW8tcGFkcsOjbyBkZSAyMmNtLCBub3JtYWxtZW50ZSBkaXN0cmlidcOtZGEsIHF1YWwgYSBwcm9iYWJpbGlkYWRlIGRlIHVtIGluZGl2w61kdW8gZXNjb2xoaWRvIGFvIGFjYXNvIHRlciBhbHR1cmEgZW50cmUgMTUwY20gZSAyMDBjbT8qKg0KDQpgYGB7cn0NCnBsb3RhcmVhcyh4MSA9IDE1MCwgeDIgPSAyMDAsIG1lZGlhID0gMTgwLCBkcCA9IDIyLCBkZW5zaXR5ID0gODApDQpgYGANCg0KYGBge3J9DQpwbm9ybSgyMDAsIDE4MCwgMjIpLXBub3JtKDE1MCwgMTgwLCAyMikNCmBgYA0KJm5ic3A7DQoNCiMjIyMgKipJbWFnaW5hbmRvIHF1ZSBvIGNoYW1hZG8gcXVvY2llbnRlIGRlIGludGVsaWfDqm5jaWEgKFFJKSBzZWphIHVtYSBtZWRpZGEgbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRhLCBwb3NzdWluZG8gbcOpZGlhIGlndWFsIGEgMTAwIGUgZGVzdmlvIHBhZHLDo28gaWd1YWwgYSAxNSwgZGV0ZXJtaW5lOioqDQoNCiZuYnNwOw0KDQojIyMjIyAqKmEpIEEgcHJvYmFiaWxpZGFkZSBkZSBhbGd1w6ltIHBvc3N1aXIgUUkgYWNpbWEgZGUgMTIwLioqDQoNCmBgYHtyfQ0KbT0xMDANCnNkPTE1DQpxPTEyMA0KMS1wbm9ybShxLCBtLCBzZCkNCmBgYA0KJm5ic3A7DQoNCiMjIyMjICoqYilPIFFJIGRlIHVtYSBwZXNzb2EgcXVlIGVzdMOhIGFjaW1hIGRlIDk5JSBkYSBwb3B1bGHDp8Ojby4qKg0KDQpgYGB7cn0NCnE9cW5vcm0oMC45OSwxMDAsMTUpDQoNCnBsb3RhcmVhcyhxLDk5OSwxMDAsMTUpDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqKmMpIEEgcHJvYmFiaWxpZGFkZSBkZSB1bWEgcGVzc29hIHBvc3N1aXIgUUkgYWNpbWEgZGUgOTAgb3UgYWJhaXhvIGRlIDcwLioqDQoNCmBgYHtyfQ0KcGxvdGFyZWFzKGMoOTAsLTk5OSksIGMoOTk5LDcwKSwxMDAsMTUpDQoNCmBgYA0KYGBge3J9DQpwbm9ybSg3MCwxMDAsMTUpICsgKDEgLSBwbm9ybSg5MCwxMDAsMTUpKQ0KYGBgDQombmJzcDsNCg0KIyMjIyMgKipkKSBBIHByb2JhYmlsaWRhZGUgZGUgdW1hIHBlc3NvYSBwb3NzdWlyIFFJIGVudHJlIDkwIGUgMTIwIG91IGFjaW1hIGRlIDExMC4qKg0KDQpgYGB7cn0NCnBsb3RhcmVhcyhjKDkwLCAxMTApLCBjKDEyMCwgOTk5KSwgMTAwLCAxNSwgY29sID0gYyg0LCAyKSwgZGVuc2l0eSA9IDUwLCBhbmdsZSA9IGMoNDUsIC00NSkpDQpgYGANCiBPIHF1ZSwgcG9yIG1laW8gZGUgb2JzZXJ2YcOnw6NvIGUgY8OhbGN1bG8gZGlyZXRvLCBmb3JuZWNlDQoNCmBgYHtyfQ0KMS1wbm9ybSg5MCwgMTAwLCAxNSkNCmBgYA0KJm5ic3A7DQoNCiMjIyMjICoqZSkgVW1hIHZhcmnDoXZlbCB4IG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kYSBhcHJlc2VudGEgbcOpZGlhIGlndWFsIGEgMjAgZSBkZXN2aW8tcGFkcsOjbyBpZ3VhbCBhIDMuIENhbGN1bGUgbyBsaW1pdGUgc3VwZXJpb3IgZG8gaW50ZXJ2YWxvIGRlIHByb2JhYmlsaWRhZGUgcXVlIGluaWNpYSBlbSB4ID0gMTUgZSBjb21wcmVlbmRlIDgwJSBkYSBwcm9iYWJpbGlkYWRlIGRlIG9jb3Jyw6puY2lhIGRlIHZhbG9yZXMgcGFyYSBlc3NhIHZhcmnDoXZlbC4qKg0KDQpgYGB7cn0NCnEgPSBxbm9ybSgwLjgrcG5vcm0oMTUsIDIwLCAzKSwgMjAsIDMpDQoNCnENCmBgYA0KdmVyaWZpY2FuZG86IA0KYGBge3J9DQpwbm9ybShxLCAyMCwgMykgLSBwbm9ybSgxNSwgMjAsIDMpDQpgYGANCmBgYHtyfQ0KcGxvdGFyZWFzKDE1LCBxLCAyMCwgMykNCmBgYA0KJm5ic3A7DQoNCiMjIyMgKipTdXBvbmRvIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwsIGNvbSBtw6lkaWEgMTAgZSBkZXN2aW8tcGFkcsOjbyAyLCBjYWxjdWxlIGFzIHByb2JhYmlsaWRhZGVzOioqDQoNCiZuYnNwOw0KDQojIyMjIyAqKmEpIERlIHF1ZSB1bSB2YWxvciBlc2NvbGhpZG8gYW8gYWNhc28gc2VqYSBtZW5vciBxdWUgMy4qKg0KDQpgYGB7cn0NCnBub3JtKDMsIDEwLCAyKQ0KYGBgDQombmJzcDsNCg0KIyMjIyMgKipEZSBxdWUgdW0gdmFsb3IgZXNjb2xoaWRvIGFvIGFjYXNvIHNlamEgbWFpb3IgcXVlIDguKioNCg0KYGBge3J9DQoxLXBub3JtKDgsIDEwLCAyKQ0KYGBgDQombmJzcDsNCg0KIyMjIyMgKipEZSBxdWUgdW0gdmFsb3IgZXNjb2xoaWRvIGFvIGFjYXNvIGVzdGVqYSBlbnRyZSA5IGUgMTEuKioNCg0KYGBge3J9DQpwbm9ybSgxMSwgMTAsIDIpLXBub3JtKDksIDEwLCAyKQ0KYGBgDQombmJzcDsNCg0KIyMjIyMgKipEZSBxdWUgdW0gdmFsb3IgZXNjb2xoaWRvIGFvIGFjYXNvIGVzdGVqYSBlbnRyZSAxMCBlIDEyLioqDQoNCmBgYHtyfQ0KcG5vcm0oMTIsIDEwLCAyKS1wbm9ybSgxMCwgMTAsIDIpDQpgYGANCiZuYnNwOw0KDQojIyMjICoqTyB0ZW1wbyBwYXJhIGF0ZW5kaW1lbnRvIGRlIGNsaWVudGVzIG5hIGZpbGEgZGUgdW0gYmFuY28gZXN0w6Egbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRvIGNvbSBtw6lkaWEgaWd1YWwgYSA4IG1pbiwgZSBvIGRlc3ZpbyBwYWRyw6NvIGRlIDIgbWluLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBxdWUgdW0gYXRlbmRpbWVudG8gZHVyZToqKg0KDQombmJzcDsNCg0KIyMjIyMgKiphKSBNZW5vcyBkbyBxdWUgNSBtaW4/KioNCg0KYGBge3J9DQpzPTINCm09OA0KcD01DQoNCnE9cG5vcm0ocCxtLHMpDQpxIA0KDQpgYGANCg0KUG9ydGFudG8sIGNvbW8gbyB2YWxvciBkYSBwcm9iYWJpbGlkYWRlIMOpIDAuMDY2OCAoNiw2OCUpIHF1ZSDDqSBhIMOhcmVhIGhhY2h1cmFkYSwgbyByZXN0YW50ZSBkYSDDoXJlYSBvYnRlbS1zZSBzdWJ0cmFpbmRvIDYsNjY4IGRlIDUwIHF1ZSByZXN1bHRhIGVtIHVtYSBwcm9iYWJpbGlkYWRlIGRlIDQzLjMyDQoNCmBgYHtyfQ0KcGxvdGFyZWFzKDUscSw4LDIpDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqKmIpIE1haXMgZG8gcXVlIDEwIG1pbj8qKg0KYGBge3J9DQpxPXBub3JtKDEwLG0scykNCnENCg0KYGBgDQoNCmBgYHtyfQ0KcGxvdGFyZWFzKDEwLHEsOCwyKQ0KYGBgDQpQb3J0YW50bywgY29uZm9ybWUgYSBmaWd1cmEsIG8gdmFsb3IgaGFjaHVyYWRvIGVxdWl2YWxlIGEgMC44NDEzNCBvdSA4NCwxMyUuIExvZ28gc3VidHJhaW5kbyBlc3RlIHZhbG9yIGRlIDEwMCwgdGVyZW1vcyBhIHByb2JhYmlsaWRhZGUgZGUgMTUuODcgcmVmZXJlbnRlIGEgw6FyZWEgbsOjbyBoYWNodXJhZGEgcXVlIMOpIGEgc29sdcOnw6NvIGRvIHByb2JsZW1hLg0KDQombmJzcDsNCg0KIyMjIyMgKipjKSBlbnRyZSA3IGUgOT8qKg0KDQpgYGB7cn0NCnE9cG5vcm0oOSw4LDIpLXBub3JtKDcsOCwyKQ0KcQ0KDQpgYGANCmBgYHtyfQ0KeDEgPSA3DQp4MiA9IDkNCm0gPSA4DQpzID0gMg0KDQpwbG90YXJlYXMoeDEseDIsbSwyKQ0KYGBgDQoNCkEgw6FyZWEgaGFjaHVyYWRhIGRvIGdyw6FmaWNvIGVxdWl2YWxlIGEgMzgsMjklDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==