Практическая работа №2
Статистический анализ качественных (категориальных) признаков
Глушков Егор Александрович, гр. 20.М04-мм
Вариант № 7. Категориальные переменные: intpla, curwor, se.
Данные (addicts.xls), варианты в Табл.1. Для каждой из трех независимых категориальных переменных исследовать таблицы сопряженности с зависимой переменной end.
- Проверить гипотезы о независимости по критерию хи-квадрат (без поправки и с поправкой) и точному критерию Фишера. Представить условные вероятности и значимости их отличия.
- Вычислить коэффициенты неопределенности для зависимой переменной end и 1) для каждой из независимых переменных по отдельности, 2) для трех пар независимых переменных, 3) для всех трех независимых переменных одновременно.
Переменные:
- intpla – место лечения (1 - амбулаторно, 2 - в диспансере)
- curwor – занятость (1 - работает, 2 - не работает)
- se – использование успокоительных средств (1 - да, 0 - нет)
- end – итог лечения (1 - программа лечения выполнена, 0 - программа сорвана)
Исследуем переменные на наличие пропусков.
c(summary(as.factor(addicts$intpla)), summary(as.factor(addicts$curwor)), summary(as.factor(addicts$se)), summary(as.factor(addicts$end)))
1 2 0 1 0 1 NA's 0 1 NA's
141 139 204 76 213 65 2 202 77 1
Исключаем данные с пропусками и выделяем нужные столбцы [удалены 3 записи]
data <- na.omit(addicts[ , c("intpla", "curwor", "se", "end")])
summary(data)
intpla curwor se end
Min. :1.000 Min. :0.0000 Min. :0.0000 Min. :0.0000
1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
Median :1.000 Median :0.0000 Median :0.0000 Median :0.0000
Mean :1.498 Mean :0.2744 Mean :0.2347 Mean :0.2708
3rd Qu.:2.000 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:1.0000
Max. :2.000 Max. :1.0000 Max. :1.0000 Max. :1.0000
Гипотезы о независимости по критерию \(\chi^2\) и точному критерию Фишера
intpla - место лечения
tab_intpla <- table(X=data$intpla, Y=data$end); tab_intpla
Y
X 0 1
1 96 43
2 106 32
tab_intpla[,2]/rowSums(tab_intpla)
1 2
0.3093525 0.2318841
Для 30.9% лечившихся амбулаторно и для 23.2% лечившихся в диспансере программа лечения была выполнена.
c(fisher.test(tab_intpla)$p.value, chisq.test(tab_intpla, correct=FALSE)$p.value, chisq.test(tab_intpla)$p.value)
[1] 0.1763913 0.1468375 0.1883169
Итоговые p.value критериев Фишера и \(\chi^2\) без поправки и с поправкой на непрерывность превышают уровень значимости 0.05. Гипотеза о том, что условные вероятности одинаковы, не отвергается. Проценты людей, лечившихся амбулаторно и в диспансере, отличаются незначимо. Данные признаки независимы. Различия в частотах можно объяснить случайностью.
curwor - занятость
tab_curwor <- table(X=data$curwor, Y=data$end); tab_curwor
Y
X 0 1
0 153 48
1 49 27
tab_curwor[,2]/rowSums(tab_curwor)
0 1
0.2388060 0.3552632
Для 23.9% лечившихся, занятых на работе, и для 35.5% пациентов, кто не работал, программа лечения была выполнена.
c(fisher.test(tab_curwor)$p.value, chisq.test(tab_curwor, correct=FALSE)$p.value, chisq.test(tab_curwor)$p.value)
[1] 0.06837940 0.05162145 0.07269287
Итоговые p.value критериев Фишера и \(\chi^2\) без поправки и с поправкой на непрерывность лишь немного превышают уровень значимости 0.05. Гипотеза о том, что условные вероятности одинаковы, не отвергается. Проценты людей, имеющих работу и не имеющих, отличаются незначимо, однако к данным результатам стоит отнестись с осторожностью ввиду достаточно близкого к уровню значимости 0.05 p-значения критериев.
se - использование успокоительных средств
tab_se <- table(X=data$se, Y=data$end); tab_se
Y
X 0 1
0 149 63
1 53 12
tab_se[,2]/rowSums(tab_se)
0 1
0.2971698 0.1846154
Для 29.7% лечившихся, не употреблявших успокоительные средства, и для 18.5% пациентов, кто употреблял успокоительные, программа лечения была выполнена.
c(fisher.test(tab_se)$p.value, chisq.test(tab_se, correct=FALSE)$p.value, chisq.test(tab_se)$p.value)
[1] 0.08081371 0.07400653 0.10372925
Итоговые p.value критериев Фишера и \(\chi^2\) без поправки и с поправкой на непрерывность немного превышают уровень значимости 0.05. Гипотеза о том, что условные вероятности одинаковы, не отвергается. Проценты людей, принимавших и не принимавших успокоительные, отличаются незначимо, однако к данным результатам стоит отнестись с некоторой осторожностью.
Коэффициенты неопределенности
Entropy <- function(x)
{
p <- x / sum(x)
p <- p[p!=0]
-sum(p*log(p, 2))
}
Uncertainty_coefficient <- function(tab)
{
Hxy <- Entropy(as.vector(tab))
Hx<-Entropy(rowSums(tab))
Hy<-Entropy(colSums(tab))
I <- Hx + Hy - Hxy
c(I/Hx, I/Hy, 2*I/(Hx+Hy)) * 100
}
- Независимые переменные по отдельности
Uncertainty_coefficient(tab_intpla)
[1] 0.5496901 0.6524060 0.5966596
Uncertainty_coefficient(tab_curwor)
[1] 1.125993 1.132826 1.129399
Uncertainty_coefficient(tab_se)
[1] 1.119485 1.044402 1.080641
Для признака intpla коэффициент неопределенности едва превышает 0.5%, для curwor и se – чуть больше 1%. Таким образом, знание любого из этих признаков по отдельности не вносит ясности в вопрос, было ли лечение успешным, так как зависимости между этими признаками с end практически нет, только за счет объема выборки есть некоторое отличие от нуля.
- Пары независимых переменных
x <- data$end
X. <- data[, -which(colnames(data)=="end")]
Bin_encoding <- function(X_)
{
rowSums(apply(rbind(2^(seq(ncol(X_))-1), X_), 2, function(x) x[-1] * x[1]))
}
Uncertainty_coefficients_multiple <- function(x, X., k)
{
C <- combn(ncol(X.), k)
L <- apply(C, 2, function(z) {
Uncertainty_coefficient(table(x, Bin_encoding(X.[, z])))[1]
})
df <- data.frame(t(apply(C, 2, function(z)colnames(X.)[z])), L=L)
df[order(df$L, decreasing=TRUE),]
}
Uncertainty_coefficients_multiple(x, X., k=2)
- Все три независимые переменные одновременно
Uncertainty_coefficients_multiple(x, X., k=3)
Сочетание пары переменных “занятость - использование успокоительных” даёт нам лишь 2.1% информации о том, насколько программа лечения была выполнена. Другие две пары объясняют зависимую переменную end лишь на 1.24% и 1.5%. Аналогично можно сказать и о комбинации сразу всех трех признаков: 2.47%, что фактически говорит о независимости успешности лечения от места лечения, занятости, приема успокоительных или комбинации этих признаков в паре или даже тройке.
LS0tDQp0aXRsZTogIiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMg0J/RgNCw0LrRgtC40YfQtdGB0LrQsNGPINGA0LDQsdC+0YLQsCDihJYyDQojIyMg0KHRgtCw0YLQuNGB0YLQuNGH0LXRgdC60LjQuSDQsNC90LDQu9C40Lcg0LrQsNGH0LXRgdGC0LLQtdC90L3Ri9GFICjQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3Ri9GFKSDQv9GA0LjQt9C90LDQutC+0LINCg0KPiDQk9C70YPRiNC60L7QsiDQldCz0L7RgCDQkNC70LXQutGB0LDQvdC00YDQvtCy0LjRhywg0LPRgC4gMjAu0JwwNC3QvNC8ICANCj4g0JLQsNGA0LjQsNC90YIg4oSWIDcuINCa0LDRgtC10LPQvtGA0LjQsNC70YzQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LU6IGludHBsYSwgY3Vyd29yLCBzZS4NCg0KLS0tDQrQlNCw0L3QvdGL0LUgKGFkZGljdHMueGxzKSwg0LLQsNGA0LjQsNC90YLRiyDQsiDQotCw0LHQuy4xLiDQlNC70Y8g0LrQsNC20LTQvtC5INC40Lcg0YLRgNC10YUg0L3QtdC30LDQstC40YHQuNC80YvRhSDQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3Ri9GFINC/0LXRgNC10LzQtdC90L3Ri9GFINC40YHRgdC70LXQtNC+0LLQsNGC0Ywg0YLQsNCx0LvQuNGG0Ysg0YHQvtC/0YDRj9C20LXQvdC90L7RgdGC0Lgg0YEg0LfQsNCy0LjRgdC40LzQvtC5INC/0LXRgNC10LzQtdC90L3QvtC5IGVuZC4NCg0KKiDQn9GA0L7QstC10YDQuNGC0Ywg0LPQuNC/0L7RgtC10LfRiyDQviDQvdC10LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQv9C+INC60YDQuNGC0LXRgNC40Y4g0YXQuC3QutCy0LDQtNGA0LDRgiAo0LHQtdC3INC/0L7Qv9GA0LDQstC60Lgg0Lgg0YEg0L/QvtC/0YDQsNCy0LrQvtC5KSDQuCDRgtC+0YfQvdC+0LzRgyDQutGA0LjRgtC10YDQuNGOINCk0LjRiNC10YDQsC4g0J/RgNC10LTRgdGC0LDQstC40YLRjCDRg9GB0LvQvtCy0L3Ri9C1INCy0LXRgNC+0Y/RgtC90L7RgdGC0Lgg0Lgg0LfQvdCw0YfQuNC80L7RgdGC0Lgg0LjRhSDQvtGC0LvQuNGH0LjRjy4NCiog0JLRi9GH0LjRgdC70LjRgtGMINC60L7RjdGE0YTQuNGG0LjQtdC90YLRiyDQvdC10L7Qv9GA0LXQtNC10LvQtdC90L3QvtGB0YLQuCDQtNC70Y8g0LfQsNCy0LjRgdC40LzQvtC5INC/0LXRgNC10LzQtdC90L3QvtC5IGVuZCDQuCAxKSDQtNC70Y8g0LrQsNC20LTQvtC5INC40Lcg0L3QtdC30LDQstC40YHQuNC80YvRhSDQv9C10YDQtdC80LXQvdC90YvRhSDQv9C+INC+0YLQtNC10LvRjNC90L7RgdGC0LgsIDIpINC00LvRjyDRgtGA0LXRhSDQv9Cw0YAg0L3QtdC30LDQstC40YHQuNC80YvRhSDQv9C10YDQtdC80LXQvdC90YvRhSwgMykg0LTQu9GPINCy0YHQtdGFINGC0YDQtdGFINC90LXQt9Cw0LLQuNGB0LjQvNGL0YUg0L/QtdGA0LXQvNC10L3QvdGL0YUg0L7QtNC90L7QstGA0LXQvNC10L3QvdC+Lg0KDQrQn9C10YDQtdC80LXQvdC90YvQtTogIA0KDQorIGludHBsYSAtLSDQvNC10YHRgtC+INC70LXRh9C10L3QuNGPICgxIC0g0LDQvNCx0YPQu9Cw0YLQvtGA0L3QviwgMiAtINCyINC00LjRgdC/0LDQvdGB0LXRgNC1KQ0KKyBjdXJ3b3IgLS0g0LfQsNC90Y/RgtC+0YHRgtGMICgxIC0g0YDQsNCx0L7RgtCw0LXRgiwgMiAtINC90LUg0YDQsNCx0L7RgtCw0LXRgikNCisgc2UgLS0g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LUg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvRhSDRgdGA0LXQtNGB0YLQsiAoMSAtINC00LAsIDAgLSDQvdC10YIpDQorIGVuZCAtLSDQuNGC0L7QsyDQu9C10YfQtdC90LjRjyAoMSAtINC/0YDQvtCz0YDQsNC80LzQsCDQu9C10YfQtdC90LjRjyDQstGL0L/QvtC70L3QtdC90LAsIDAgLSDQv9GA0L7Qs9GA0LDQvNC80LAg0YHQvtGA0LLQsNC90LApDQoNCg0K0JjRgdGB0LvQtdC00YPQtdC8INC/0LXRgNC10LzQtdC90L3Ri9C1INC90LAg0L3QsNC70LjRh9C40LUg0L/RgNC+0L/Rg9GB0LrQvtCyLiANCmBgYHtyfQ0KYyhzdW1tYXJ5KGFzLmZhY3RvcihhZGRpY3RzJGludHBsYSkpLCBzdW1tYXJ5KGFzLmZhY3RvcihhZGRpY3RzJGN1cndvcikpLCBzdW1tYXJ5KGFzLmZhY3RvcihhZGRpY3RzJHNlKSksIHN1bW1hcnkoYXMuZmFjdG9yKGFkZGljdHMkZW5kKSkpDQpgYGANCg0K0JjRgdC60LvRjtGH0LDQtdC8INC00LDQvdC90YvQtSDRgSDQv9GA0L7Qv9GD0YHQutCw0LzQuCDQuCDQstGL0LTQtdC70Y/QtdC8INC90YPQttC90YvQtSDRgdGC0L7Qu9Cx0YbRiyBb0YPQtNCw0LvQtdC90YsgMyDQt9Cw0L/QuNGB0LhdDQpgYGB7cn0NCmRhdGEgPC0gbmEub21pdChhZGRpY3RzWyAsIGMoImludHBsYSIsICJjdXJ3b3IiLCAic2UiLCAiZW5kIildKQ0Kc3VtbWFyeShkYXRhKQ0KYGBgDQoNCiMjIyDQk9C40L/QvtGC0LXQt9GLINC+INC90LXQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC/0L4g0LrRgNC40YLQtdGA0LjRjiAkXGNoaV4yJCDQuCDRgtC+0YfQvdC+0LzRgyDQutGA0LjRgtC10YDQuNGOINCk0LjRiNC10YDQsA0KDQo+IGludHBsYSAtINC80LXRgdGC0L4g0LvQtdGH0LXQvdC40Y8NCg0KYGBge3J9DQp0YWJfaW50cGxhIDwtIHRhYmxlKFg9ZGF0YSRpbnRwbGEsIFk9ZGF0YSRlbmQpOyB0YWJfaW50cGxhDQpgYGANCg0KYGBge3J9DQp0YWJfaW50cGxhWywyXS9yb3dTdW1zKHRhYl9pbnRwbGEpDQpgYGANCtCU0LvRjyAzMC45JSDQu9C10YfQuNCy0YjQuNGF0YHRjyDQsNC80LHRg9C70LDRgtC+0YDQvdC+INC4INC00LvRjyAyMy4yJSDQu9C10YfQuNCy0YjQuNGF0YHRjyDQsiDQtNC40YHQv9Cw0L3RgdC10YDQtSDQv9GA0L7Qs9GA0LDQvNC80LAg0LvQtdGH0LXQvdC40Y8g0LHRi9C70LAg0LLRi9C/0L7Qu9C90LXQvdCwLiANCg0KYGBge3J9DQpjKGZpc2hlci50ZXN0KHRhYl9pbnRwbGEpJHAudmFsdWUsIGNoaXNxLnRlc3QodGFiX2ludHBsYSwgY29ycmVjdD1GQUxTRSkkcC52YWx1ZSwgY2hpc3EudGVzdCh0YWJfaW50cGxhKSRwLnZhbHVlKQ0KYGBgDQrQmNGC0L7Qs9C+0LLRi9C1IHAudmFsdWUg0LrRgNC40YLQtdGA0LjQtdCyINCk0LjRiNC10YDQsCDQuCAkXGNoaV4yJCDQsdC10Lcg0L/QvtC/0YDQsNCy0LrQuCDQuCDRgSDQv9C+0L/RgNCw0LLQutC+0Lkg0L3QsCDQvdC10L/RgNC10YDRi9Cy0L3QvtGB0YLRjCDQv9GA0LXQstGL0YjQsNGO0YIg0YPRgNC+0LLQtdC90Ywg0LfQvdCw0YfQuNC80L7RgdGC0LggMC4wNS4g0JPQuNC/0L7RgtC10LfQsCDQviDRgtC+0LwsINGH0YLQviDRg9GB0LvQvtCy0L3Ri9C1INCy0LXRgNC+0Y/RgtC90L7RgdGC0Lgg0L7QtNC40L3QsNC60L7QstGLLCAqKtC90LUg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyoqLiDQn9GA0L7RhtC10L3RgtGLINC70Y7QtNC10LksINC70LXRh9C40LLRiNC40YXRgdGPINCw0LzQsdGD0LvQsNGC0L7RgNC90L4g0Lgg0LIg0LTQuNGB0L/QsNC90YHQtdGA0LUsINC+0YLQu9C40YfQsNGO0YLRgdGPICoq0L3QtdC30L3QsNGH0LjQvNC+KiouINCU0LDQvdC90YvQtSDQv9GA0LjQt9C90LDQutC4INC90LXQt9Cw0LLQuNGB0LjQvNGLLiDQoNCw0LfQu9C40YfQuNGPINCyINGH0LDRgdGC0L7RgtCw0YUg0LzQvtC20L3QviDQvtCx0YrRj9GB0L3QuNGC0Ywg0YHQu9GD0YfQsNC50L3QvtGB0YLRjNGOLiANCg0KDQo+IGN1cndvciAtINC30LDQvdGP0YLQvtGB0YLRjA0KDQpgYGB7cn0NCnRhYl9jdXJ3b3IgPC0gdGFibGUoWD1kYXRhJGN1cndvciwgWT1kYXRhJGVuZCk7IHRhYl9jdXJ3b3INCmBgYA0KDQpgYGB7cn0NCnRhYl9jdXJ3b3JbLDJdL3Jvd1N1bXModGFiX2N1cndvcikNCmBgYA0K0JTQu9GPIDIzLjklINC70LXRh9C40LLRiNC40YXRgdGPLCDQt9Cw0L3Rj9GC0YvRhSDQvdCwINGA0LDQsdC+0YLQtSwg0Lgg0LTQu9GPIDM1LjUlINC/0LDRhtC40LXQvdGC0L7Qsiwg0LrRgtC+INC90LUg0YDQsNCx0L7RgtCw0LssINC/0YDQvtCz0YDQsNC80LzQsCDQu9C10YfQtdC90LjRjyDQsdGL0LvQsCDQstGL0L/QvtC70L3QtdC90LAuIA0KDQpgYGB7cn0NCmMoZmlzaGVyLnRlc3QodGFiX2N1cndvcikkcC52YWx1ZSwgY2hpc3EudGVzdCh0YWJfY3Vyd29yLCBjb3JyZWN0PUZBTFNFKSRwLnZhbHVlLCBjaGlzcS50ZXN0KHRhYl9jdXJ3b3IpJHAudmFsdWUpDQpgYGANCtCY0YLQvtCz0L7QstGL0LUgcC52YWx1ZSDQutGA0LjRgtC10YDQuNC10LIg0KTQuNGI0LXRgNCwINC4ICRcY2hpXjIkINCx0LXQtyDQv9C+0L/RgNCw0LLQutC4INC4INGBINC/0L7Qv9GA0LDQstC60L7QuSDQvdCwINC90LXQv9GA0LXRgNGL0LLQvdC+0YHRgtGMINC70LjRiNGMINC90LXQvNC90L7Qs9C+INC/0YDQtdCy0YvRiNCw0Y7RgiDRg9GA0L7QstC10L3RjCDQt9C90LDRh9C40LzQvtGB0YLQuCAwLjA1LiDQk9C40L/QvtGC0LXQt9CwINC+INGC0L7QvCwg0YfRgtC+INGD0YHQu9C+0LLQvdGL0LUg0LLQtdGA0L7Rj9GC0L3QvtGB0YLQuCDQvtC00LjQvdCw0LrQvtCy0YssICoq0L3QtSDQvtGC0LLQtdGA0LPQsNC10YLRgdGPKiouINCf0YDQvtGG0LXQvdGC0Ysg0LvRjtC00LXQuSwg0LjQvNC10Y7RidC40YUg0YDQsNCx0L7RgtGDINC4INC90LUg0LjQvNC10Y7RidC40YUsINC+0YLQu9C40YfQsNGO0YLRgdGPICoq0L3QtdC30L3QsNGH0LjQvNC+KiosINC+0LTQvdCw0LrQviDQuiDQtNCw0L3QvdGL0Lwg0YDQtdC30YPQu9GM0YLQsNGC0LDQvCDRgdGC0L7QuNGCINC+0YLQvdC10YHRgtC40YHRjCDRgSDQvtGB0YLQvtGA0L7QttC90L7RgdGC0YzRjiDQstCy0LjQtNGDINC00L7RgdGC0LDRgtC+0YfQvdC+INCx0LvQuNC30LrQvtCz0L4g0Log0YPRgNC+0LLQvdGOINC30L3QsNGH0LjQvNC+0YHRgtC4IDAuMDUgcC3Qt9C90LDRh9C10L3QuNGPINC60YDQuNGC0LXRgNC40LXQsi4NCg0KPiBzZSAtINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC1INGD0YHQv9C+0LrQvtC40YLQtdC70YzQvdGL0YUg0YHRgNC10LTRgdGC0LINCg0KYGBge3J9DQp0YWJfc2UgPC0gdGFibGUoWD1kYXRhJHNlLCBZPWRhdGEkZW5kKTsgdGFiX3NlDQpgYGANCg0KYGBge3J9DQp0YWJfc2VbLDJdL3Jvd1N1bXModGFiX3NlKQ0KYGBgDQrQlNC70Y8gMjkuNyUg0LvQtdGH0LjQstGI0LjRhdGB0Y8sINC90LUg0YPQv9C+0YLRgNC10LHQu9GP0LLRiNC40YUg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvQtSDRgdGA0LXQtNGB0YLQstCwLCDQuCDQtNC70Y8gMTguNSUg0L/QsNGG0LjQtdC90YLQvtCyLCDQutGC0L4g0YPQv9C+0YLRgNC10LHQu9GP0Lsg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvQtSwg0L/RgNC+0LPRgNCw0LzQvNCwINC70LXRh9C10L3QuNGPINCx0YvQu9CwINCy0YvQv9C+0LvQvdC10L3QsC4gDQoNCmBgYHtyfQ0KYyhmaXNoZXIudGVzdCh0YWJfc2UpJHAudmFsdWUsIGNoaXNxLnRlc3QodGFiX3NlLCBjb3JyZWN0PUZBTFNFKSRwLnZhbHVlLCBjaGlzcS50ZXN0KHRhYl9zZSkkcC52YWx1ZSkNCmBgYA0K0JjRgtC+0LPQvtCy0YvQtSBwLnZhbHVlINC60YDQuNGC0LXRgNC40LXQsiDQpNC40YjQtdGA0LAg0LggJFxjaGleMiQg0LHQtdC3INC/0L7Qv9GA0LDQstC60Lgg0Lgg0YEg0L/QvtC/0YDQsNCy0LrQvtC5INC90LAg0L3QtdC/0YDQtdGA0YvQstC90L7RgdGC0Ywg0L3QtdC80L3QvtCz0L4g0L/RgNC10LLRi9GI0LDRjtGCINGD0YDQvtCy0LXQvdGMINC30L3QsNGH0LjQvNC+0YHRgtC4IDAuMDUuINCT0LjQv9C+0YLQtdC30LAg0L4g0YLQvtC8LCDRh9GC0L4g0YPRgdC70L7QstC90YvQtSDQstC10YDQvtGP0YLQvdC+0YHRgtC4INC+0LTQuNC90LDQutC+0LLRiywgKirQvdC1INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8qKi4g0J/RgNC+0YbQtdC90YLRiyDQu9GO0LTQtdC5LCDQv9GA0LjQvdC40LzQsNCy0YjQuNGFINC4INC90LUg0L/RgNC40L3QuNC80LDQstGI0LjRhSDRg9GB0L/QvtC60L7QuNGC0LXQu9GM0L3Ri9C1LCDQvtGC0LvQuNGH0LDRjtGC0YHRjyAqKtC90LXQt9C90LDRh9C40LzQvioqLCDQvtC00L3QsNC60L4g0Log0LTQsNC90L3Ri9C8INGA0LXQt9GD0LvRjNGC0LDRgtCw0Lwg0YHRgtC+0LjRgiDQvtGC0L3QtdGB0YLQuNGB0Ywg0YEg0L3QtdC60L7RgtC+0YDQvtC5INC+0YHRgtC+0YDQvtC20L3QvtGB0YLRjNGOLg0KDQoNCiMjIyDQmtC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0L3QtdC+0L/RgNC10LTQtdC70LXQvdC90L7RgdGC0LgNCg0KYGBge3J9DQpFbnRyb3B5IDwtIGZ1bmN0aW9uKHgpDQp7DQogIHAgPC0geCAvIHN1bSh4KQ0KICBwIDwtIHBbcCE9MF0NCiAgLXN1bShwICogbG9nKHAsIDIpKQ0KfQ0KDQpVbmNlcnRhaW50eV9jb2VmZmljaWVudCA8LSBmdW5jdGlvbih0YWIpDQp7DQogIEh4eSA8LSBFbnRyb3B5KGFzLnZlY3Rvcih0YWIpKQ0KICBIeDwtRW50cm9weShyb3dTdW1zKHRhYikpDQogIEh5PC1FbnRyb3B5KGNvbFN1bXModGFiKSkNCiAgSSA8LSBIeCArIEh5IC0gSHh5DQogIGMoSS9IeCwgSS9IeSwgMipJLyhIeCtIeSkpICogMTAwDQp9DQpgYGANCg0KMS4g0J3QtdC30LDQstC40YHQuNC80YvQtSDQv9C10YDQtdC80LXQvdC90YvQtSDQv9C+INC+0YLQtNC10LvRjNC90L7RgdGC0LgNCg0KYGBge3J9DQpVbmNlcnRhaW50eV9jb2VmZmljaWVudCh0YWJfaW50cGxhKQ0KVW5jZXJ0YWludHlfY29lZmZpY2llbnQodGFiX2N1cndvcikNClVuY2VydGFpbnR5X2NvZWZmaWNpZW50KHRhYl9zZSkNCmBgYA0K0JTQu9GPINC/0YDQuNC30L3QsNC60LAgaW50cGxhINC60L7RjdGE0YTQuNGG0LjQtdC90YIg0L3QtdC+0L/RgNC10LTQtdC70LXQvdC90L7RgdGC0Lgg0LXQtNCy0LAg0L/RgNC10LLRi9GI0LDQtdGCIDAuNSUsINC00LvRjyBjdXJ3b3Ig0Lggc2UgLS0g0YfRg9GC0Ywg0LHQvtC70YzRiNC1IDElLiDQotCw0LrQuNC8INC+0LHRgNCw0LfQvtC8LCDQt9C90LDQvdC40LUg0LvRjtCx0L7Qs9C+INC40Lcg0Y3RgtC40YUg0L/RgNC40LfQvdCw0LrQvtCyINC/0L4g0L7RgtC00LXQu9GM0L3QvtGB0YLQuCDQvdC1INCy0L3QvtGB0LjRgiDRj9GB0L3QvtGB0YLQuCDQsiDQstC+0L/RgNC+0YEsINCx0YvQu9C+INC70Lgg0LvQtdGH0LXQvdC40LUg0YPRgdC/0LXRiNC90YvQvCwg0YLQsNC6INC60LDQuiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC80LXQttC00YMg0Y3RgtC40LzQuCDQv9GA0LjQt9C90LDQutCw0LzQuCDRgSBlbmQg0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDQvdC10YIsINGC0L7Qu9GM0LrQviDQt9CwINGB0YfQtdGCINC+0LHRitC10LzQsCDQstGL0LHQvtGA0LrQuCDQtdGB0YLRjCDQvdC10LrQvtGC0L7RgNC+0LUg0L7RgtC70LjRh9C40LUg0L7RgiDQvdGD0LvRjy4NCg0KDQoyLiDQn9Cw0YDRiyDQvdC10LfQsNCy0LjRgdC40LzRi9GFINC/0LXRgNC10LzQtdC90L3Ri9GFDQpgYGB7cn0NCnggPC0gZGF0YSRlbmQNClguIDwtIGRhdGFbLCAtd2hpY2goY29sbmFtZXMoZGF0YSk9PSJlbmQiKV0NCg0KQmluX2VuY29kaW5nIDwtIGZ1bmN0aW9uKFhfKQ0Kew0KICByb3dTdW1zKGFwcGx5KHJiaW5kKDJeKHNlcShuY29sKFhfKSktMSksIFhfKSwgMiwgZnVuY3Rpb24oeCkgeFstMV0gKiB4WzFdKSkNCn0NCg0KVW5jZXJ0YWludHlfY29lZmZpY2llbnRzX211bHRpcGxlIDwtIGZ1bmN0aW9uKHgsIFguLCBrKQ0Kew0KICBDIDwtIGNvbWJuKG5jb2woWC4pLCBrKQ0KICBMIDwtIGFwcGx5KEMsIDIsIGZ1bmN0aW9uKHopIHsNCiAgICBVbmNlcnRhaW50eV9jb2VmZmljaWVudCh0YWJsZSh4LCBCaW5fZW5jb2RpbmcoWC5bLCB6XSkpKVsxXQ0KICB9KQ0KICBkZiA8LSBkYXRhLmZyYW1lKHQoYXBwbHkoQywgMiwgZnVuY3Rpb24oeiljb2xuYW1lcyhYLilbel0pKSwgTD1MKQ0KICBkZltvcmRlcihkZiRMLCBkZWNyZWFzaW5nPVRSVUUpLF0NCn0NCmBgYA0KDQoNCmBgYHtyfQ0KVW5jZXJ0YWludHlfY29lZmZpY2llbnRzX211bHRpcGxlKHgsIFguLCBrPTIpDQpgYGANCg0KMy4g0JLRgdC1INGC0YDQuCDQvdC10LfQsNCy0LjRgdC40LzRi9C1INC/0LXRgNC10LzQtdC90L3Ri9C1INC+0LTQvdC+0LLRgNC10LzQtdC90L3Qvg0KYGBge3J9DQpVbmNlcnRhaW50eV9jb2VmZmljaWVudHNfbXVsdGlwbGUoeCwgWC4sIGs9MykNCmBgYA0KDQrQodC+0YfQtdGC0LDQvdC40LUg0L/QsNGA0Ysg0L/QtdGA0LXQvNC10L3QvdGL0YUgItC30LDQvdGP0YLQvtGB0YLRjCAtINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC1INGD0YHQv9C+0LrQvtC40YLQtdC70YzQvdGL0YUiINC00LDRkdGCINC90LDQvCDQu9C40YjRjCAyLjElINC40L3RhNC+0YDQvNCw0YbQuNC4INC+INGC0L7QvCwg0L3QsNGB0LrQvtC70YzQutC+INC/0YDQvtCz0YDQsNC80LzQsCDQu9C10YfQtdC90LjRjyDQsdGL0LvQsCDQstGL0L/QvtC70L3QtdC90LAuINCU0YDRg9Cz0LjQtSDQtNCy0LUg0L/QsNGA0Ysg0L7QsdGK0Y/RgdC90Y/RjtGCINC30LDQstC40YHQuNC80YPRjiDQv9C10YDQtdC80LXQvdC90YPRjiBlbmQg0LvQuNGI0Ywg0L3QsCAxLjI0JSDQuCAxLjUlLiDQkNC90LDQu9C+0LPQuNGH0L3QviDQvNC+0LbQvdC+INGB0LrQsNC30LDRgtGMINC4INC+INC60L7QvNCx0LjQvdCw0YbQuNC4INGB0YDQsNC30YMg0LLRgdC10YUg0YLRgNC10YUg0L/RgNC40LfQvdCw0LrQvtCyOiAyLjQ3JSwg0YfRgtC+INGE0LDQutGC0LjRh9C10YHQutC4INCz0L7QstC+0YDQuNGCINC+INC90LXQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INGD0YHQv9C10YjQvdC+0YHRgtC4INC70LXRh9C10L3QuNGPINC+0YIg0LzQtdGB0YLQsCDQu9C10YfQtdC90LjRjywg0LfQsNC90Y/RgtC+0YHRgtC4LCDQv9GA0LjQtdC80LAg0YPRgdC/0L7QutC+0LjRgtC10LvRjNC90YvRhSDQuNC70Lgg0LrQvtC80LHQuNC90LDRhtC40Lgg0Y3RgtC40YUg0L/RgNC40LfQvdCw0LrQvtCyINCyINC/0LDRgNC1INC40LvQuCDQtNCw0LbQtSDRgtGA0L7QudC60LUuIA0K