Marvin López, 23 Junio de 2020

library(dplyr)
library(ggplot2)
library(kableExtra)

Programas de TV y películas que figuran en Netflix

Este conjunto de datos consta de programas de televisión y películas disponibles en Netflix del año 2015 a Enero 2020.
Realizar una exploración de los datos para poder determinar en que se enfoca más la plataforma y cuales son aquellos casos en donde se es diferente.

Dataset

14 variables y 6224 observaciones

dataset<-read.csv("netflix_titles.csv")
dataset

I. Análisis Descriptivo

Muestra la cantidad de películas y la cantidad de programas de televisión en los 5 años.

summary(dataset$type)
  Movie TV Show 
   4257    1967 

Muestra los años con información que contiene el dataset.

summary(dataset$year_added)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2015    2017    2018    2018    2019    2020 

Muestra de clasificación de los títulos.

summary(dataset$rating)
       G    NC-17       NR       PG    PG-13        R    TV-14     TV-G    TV-MA    TV-PG     TV-Y    TV-Y7 
      37        2      218      184      286      508     1698      149     2027      701      143      169 
TV-Y7-FV       UR 
      95        7 

Medidas de tendencia central

En esta sección se realizan dos arreglos a la columna de duración, el cual contiene información del número de temporadas y el tiempo en minutos para el caso de las películas.

Por lo que el arreglo tvShows, se retiró el dato de “Season” y “Seasons”, en cuanto al de movies el de “min”.

tvShows<-dataset %>%
  filter(type== "TV Show")

tvShows$duration<-as.character(tvShows$duration)
temp<-unlist(strsplit(tvShows$duration, " "))
temp<-temp[temp != "Season"]
temp<-temp[temp != "Seasons"]
tvShows$durationNum<-as.numeric(temp)
movies<-dataset %>%
  filter(type== "Movie") 

movies$duration<-as.character(movies$duration)
temp<-unlist(strsplit(movies$duration, " "))
temp<-temp[temp != "min"]
movies$durationNum<-as.numeric(temp)

En base a los arreglos obtener la información siguiete:

¿Cuál es la media de la duración para ambos typos?

Media

TVShows
mean(tvShows$durationNum)
[1] 1.780376
Movies
mean(movies$durationNum)
[1] 99.15645

¿Cuál es la mediana de la duración para ambos typos?

Mediana

TVShows
median(tvShows$durationNum)
[1] 1
Movies
median(movies$durationNum)
[1] 98

¿Cuál es la moda de la duración para ambos typos?

Moda

TVShows
tabla<-table(tvShows$durationNum)
sort(tabla, decreasing = T)

   1    2    3    4    5    6    7    8    9   10   11   12   13   15   14 
1319  304  158   61   46   22   21   16    7    3    3    2    2    2    1 
Movies
tabla2<-table(movies$durationNum)
sort(tabla2, decreasing = T)

 90  91  92  94  95  93  97  99  88  96  98 100  89  86 103 102 101  87 105 106 110 104 107 108  85 109  84 
111 104 101  94  94  90  88  88  86  85  83  80  78  77  75  74  71  70  70  70  69  62  60  56  50  50  49 
116  83 119  81 118 111 112 113 117  78  82 121 124 127 126 114 122 128 137  79  80 120 123 115 125 130  75 
 49  48  47  46  45  43  41  40  40  39  38  37  36  36  35  33  33  33  33  32  32  32  32  30  30  30  28 
133 135  74 132  63  66  53  77  69  73 129 131  61  65  72  54  59  60  62  71  58  24  70 134  52  76 140 
 28  28  27  27  26  25  24  24  23  23  23  23  22  21  21  20  20  20  20  20  19  18  18  18  17  17  17 
 46  67  68 141  44 136 143  64 150  22  40  55 139 148 151  57 138 146 163  56 153 154 162  29  45 142 145 
 16  16  16  16  15  15  15  14  14  13  13  13  13  13  13  12  12  12  12  11  11  11  11   9   9   9   9 
158  47  49  51 147 149  25 155 161 168  23  50 144 156 159 166  26  28  30  42  48 160 165  32  38 152 157 
  9   8   8   8   8   8   7   7   7   7   6   6   6   6   6   6   5   5   5   5   5   5   5   4   4   4   4 
170 171 185 164 172 173 176 177  12  14  19  27  31  35  41 169 179   3  10  11  15  18  20  33  34  36  43 
  4   4   4   3   3   3   3   3   2   2   2   2   2   2   2   2   2   1   1   1   1   1   1   1   1   1   1 
167 174 178 180 181 182 187 189 190 191 192 193 195 196 200 201 203 205 209 214 224 228 312 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 

Gráfica Temporadas

tvShows %>%
  ggplot(aes(x=durationNum, y=..density.. ))+
    geom_density()

Gráfica Movies

movies %>%
  ggplot(aes(x=durationNum, y=..density..))+
  geom_density()

Medidas de dispersión

Dispersión

¿Cuál es la dispersión entre la duración para ambos typos?

TVShows
DispersionTV<-tvShows$durationNum
mean(DispersionTV)
[1] 1.780376
range(DispersionTV)
[1]  1 15
hist(DispersionTV, col = "magenta")

Movies
DispersionMovies<-movies$durationNum
mean(DispersionMovies)
[1] 99.15645
range(DispersionMovies)
[1]   3 312
hist(DispersionMovies, col = "blue")

Varianza

¿Encontrar la varianza para ambos typos?

TVShows
VarianzaTV<-tvShows$durationNum
var(VarianzaTV)
[1] 2.642483
Movies
VarianzaM<-movies$durationNum
var(VarianzaM)
[1] 787.1738

Medidas de posición

Cuantiles

¿Encontrar la posición de la mediana en base a los cuantiles, tomando en cuenta que la mediana en TVShow es 1 y para Movies es 98?

TVShows
quantile(tvShows$durationNum)
  0%  25%  50%  75% 100% 
   1    1    1    2   15 
Movies
quantile(movies$durationNum)
  0%  25%  50%  75% 100% 
   3   86   98  115  312 

Análisis de los datos descriptivos

Para el caso de los títulos que corresponden a Programas televisivos podemos notar que el mayor contenido se encuentra entre 1 y 2 temporadas por lo que la curva empieza a notarse a partir de la tercera y a aplanarse más, luego de la 8va temporada. En este punto ya son muy pocas los programas que contiene más de este número.

En cuento a las películas en su mayoría tienen un tiempo de duración de 1 hora y 40 minutos por lo que la curva se comienza a elevar a partir de 45 minutos, observando que llegando a las dos y 3 horas ya son muy pocas las películas en este rango y se ve el descenso hasta notar la línea más plana.

I. Estudio comportamiento probabilístico.

Si todo el contenido de los 5 años estuviera cargado a la plataforma de Netflix con los 6,224 títulos. ¿Cúal es la probabilidad de que 20 amigos eligiendo aleatoriamente un título este sea de clasificación TV14. Se pretende encontrar la función de densidad de probabilidad.

a. Determine PDF.

b. Determine CDF

c. Anánilisis probabilistico de este evento

Distribucíon binomial

PDF

n<-20
p<-0.27
x<-0:20


PDF<-dbinom(x, n, p)
PDF
 [1] 1.846959e-03 1.366243e-02 4.800568e-02 1.065331e-01 1.674614e-01 1.982008e-01 1.832679e-01 1.355680e-01
 [9] 8.148010e-02 4.018197e-02 1.634801e-02 5.496839e-03 1.524808e-03 3.470585e-04 6.418206e-05 9.495428e-06
[17] 1.097502e-06 9.551189e-08 5.887719e-09 2.292263e-10 4.239116e-12
barplot(PDF_2,
        main="PMF Distribucion Binomial",
        xlab="Valores de x",
        ylab="Densidad de Probabildiad",
        col=rainbow(21),
        space=rep(0, 21),
        names.arg = x)
lines(x=x+0.5, y=PDF_2, col="blue", lwd=2)

DatosBinomiales<-data.frame(x=x, y=PDF)
DatosBinomiales
Valor_Esperado(DatosBinomiales)
[1] 63.64332

CDF

CDF_1<-pbinom(x, n, p)
CDF_1
 [1] 0.001846959 0.015509394 0.063515072 0.170048221 0.337509576 0.535710412 0.718978309 0.854546342
 [9] 0.936026444 0.976208412 0.992556418 0.998053257 0.999578065 0.999925123 0.999989305 0.999998801
[17] 0.999999898 0.999999994 1.000000000 1.000000000 1.000000000
plot(x, CDF_1,
     main="PMF Distribucion Binomial",
     xlab="Valores de x", ylab="Densidad de Probabilidad",
     col="magenta",
     type="b",
     lwd=2,
     pch=16)

Análisis Probabilístico

Llegando al análisis podemos ver que de los 20 amigos 5 de ellos es probable que eligan aleatoriamente un título de clasificación T14.

LS0tDQp0aXRsZTogIlBST1lFQ1RPIEZJTkFMIC0gVMOtVFVMT1MgTkVURkxJWCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpNYXJ2aW4gTMOzcGV6LCANCjIzIEp1bmlvIGRlIDIwMjANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpgYGANCg0KDQoNCiMjIyAgUHJvZ3JhbWFzIGRlIFRWIHkgcGVsw61jdWxhcyBxdWUgZmlndXJhbiBlbiBOZXRmbGl4DQoNCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Fc3RlIGNvbmp1bnRvIGRlIGRhdG9zIGNvbnN0YSBkZSBwcm9ncmFtYXMgZGUgdGVsZXZpc2nDs24geSBwZWzDrWN1bGFzIGRpc3BvbmlibGVzIGVuIE5ldGZsaXggZGVsIGHDsW8gMjAxNSBhIEVuZXJvIDIwMjAuPGRpdi8+DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPlJlYWxpemFyIHVuYSBleHBsb3JhY2nDs24gZGUgbG9zIGRhdG9zIHBhcmEgcG9kZXIgZGV0ZXJtaW5hciBlbiBxdWUgc2UgZW5mb2NhIG3DoXMgbGEgcGxhdGFmb3JtYSB5IGN1YWxlcyBzb24gYXF1ZWxsb3MgY2Fzb3MgZW4gZG9uZGUgc2UgZXMgZGlmZXJlbnRlLjxkaXYvPg0KDQoNCiMjIyBEYXRhc2V0DQojIyMjIDE0IHZhcmlhYmxlcyB5IDYyMjQgb2JzZXJ2YWNpb25lcw0KYGBge3J9DQpkYXRhc2V0PC1yZWFkLmNzdigibmV0ZmxpeF90aXRsZXMuY3N2IikNCmRhdGFzZXQNCmBgYA0KDQojIyMgSS4gQW7DoWxpc2lzIERlc2NyaXB0aXZvDQoNCg0KIyMjIyMjIyBNdWVzdHJhIGxhIGNhbnRpZGFkIGRlIHBlbMOtY3VsYXMgeSBsYSBjYW50aWRhZCBkZSBwcm9ncmFtYXMgZGUgdGVsZXZpc2nDs24gZW4gbG9zIDUgYcOxb3MuDQoNCmBgYHtyfQ0Kc3VtbWFyeShkYXRhc2V0JHR5cGUpDQpgYGANCg0KIyMjIyMjIyBNdWVzdHJhIGxvcyBhw7FvcyBjb24gaW5mb3JtYWNpw7NuIHF1ZSBjb250aWVuZSBlbCBkYXRhc2V0Lg0KYGBge3J9DQpzdW1tYXJ5KGRhdGFzZXQkeWVhcl9hZGRlZCkNCmBgYA0KDQojIyMjIyMjIE11ZXN0cmEgZGUgY2xhc2lmaWNhY2nDs24gZGUgbG9zIHTDrXR1bG9zLg0KYGBge3J9DQpzdW1tYXJ5KGRhdGFzZXQkcmF0aW5nKQ0KYGBgDQoNCiMjIyBNZWRpZGFzIGRlIHRlbmRlbmNpYSBjZW50cmFsDQoNCkVuIGVzdGEgc2VjY2nDs24gc2UgcmVhbGl6YW4gZG9zIGFycmVnbG9zIGEgbGEgY29sdW1uYSBkZSBkdXJhY2nDs24sIGVsIGN1YWwgY29udGllbmUgaW5mb3JtYWNpw7NuIGRlbCBuw7ptZXJvIGRlIHRlbXBvcmFkYXMgeSBlbCB0aWVtcG8gZW4gbWludXRvcyBwYXJhIGVsIGNhc28gZGUgbGFzIHBlbMOtY3VsYXMuDQoNClBvciBsbyBxdWUgZWwgYXJyZWdsbyB0dlNob3dzLCBzZSByZXRpcsOzIGVsIGRhdG8gZGUgIlNlYXNvbiIgeSAiU2Vhc29ucyIsIGVuIGN1YW50byBhbCBkZSBtb3ZpZXMgZWwgZGUgIm1pbiIuDQoNCmBgYHtyfQ0KdHZTaG93czwtZGF0YXNldCAlPiUNCiAgZmlsdGVyKHR5cGU9PSAiVFYgU2hvdyIpDQoNCnR2U2hvd3MkZHVyYXRpb248LWFzLmNoYXJhY3Rlcih0dlNob3dzJGR1cmF0aW9uKQ0KdGVtcDwtdW5saXN0KHN0cnNwbGl0KHR2U2hvd3MkZHVyYXRpb24sICIgIikpDQp0ZW1wPC10ZW1wW3RlbXAgIT0gIlNlYXNvbiJdDQp0ZW1wPC10ZW1wW3RlbXAgIT0gIlNlYXNvbnMiXQ0KdHZTaG93cyRkdXJhdGlvbk51bTwtYXMubnVtZXJpYyh0ZW1wKQ0KDQpgYGANCg0KYGBge3J9DQptb3ZpZXM8LWRhdGFzZXQgJT4lDQogIGZpbHRlcih0eXBlPT0gIk1vdmllIikgDQoNCm1vdmllcyRkdXJhdGlvbjwtYXMuY2hhcmFjdGVyKG1vdmllcyRkdXJhdGlvbikNCnRlbXA8LXVubGlzdChzdHJzcGxpdChtb3ZpZXMkZHVyYXRpb24sICIgIikpDQp0ZW1wPC10ZW1wW3RlbXAgIT0gIm1pbiJdDQptb3ZpZXMkZHVyYXRpb25OdW08LWFzLm51bWVyaWModGVtcCkNCg0KYGBgDQoNCkVuIGJhc2UgYSBsb3MgYXJyZWdsb3Mgb2J0ZW5lciBsYSBpbmZvcm1hY2nDs24gc2lndWlldGU6DQoNCiMjIyMjIyMgwr9DdcOhbCBlcyBsYSBtZWRpYSBkZSBsYSBkdXJhY2nDs24gcGFyYSBhbWJvcyB0eXBvcz8NCg0KIyMjIyBNZWRpYQ0KDQojIyMjIyMgVFZTaG93cw0KYGBge3J9DQptZWFuKHR2U2hvd3MkZHVyYXRpb25OdW0pDQpgYGANCiMjIyMjIyBNb3ZpZXMNCmBgYHtyfQ0KbWVhbihtb3ZpZXMkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIyMjIyDCv0N1w6FsIGVzIGxhIG1lZGlhbmEgZGUgbGEgZHVyYWNpw7NuIHBhcmEgYW1ib3MgdHlwb3M/DQoNCiMjIyMgTWVkaWFuYQ0KDQojIyMjIyMgVFZTaG93cw0KYGBge3J9DQptZWRpYW4odHZTaG93cyRkdXJhdGlvbk51bSkNCmBgYA0KDQojIyMjIyMgTW92aWVzDQpgYGB7cn0NCm1lZGlhbihtb3ZpZXMkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIyMjIyDCv0N1w6FsIGVzIGxhIG1vZGEgZGUgbGEgZHVyYWNpw7NuIHBhcmEgYW1ib3MgdHlwb3M/DQojIyMjIE1vZGENCg0KIyMjIyMjIFRWU2hvd3MNCmBgYHtyfQ0KdGFibGE8LXRhYmxlKHR2U2hvd3MkZHVyYXRpb25OdW0pDQpzb3J0KHRhYmxhLCBkZWNyZWFzaW5nID0gVCkNCmBgYA0KDQojIyMjIyMgTW92aWVzDQpgYGB7cn0NCnRhYmxhMjwtdGFibGUobW92aWVzJGR1cmF0aW9uTnVtKQ0Kc29ydCh0YWJsYTIsIGRlY3JlYXNpbmcgPSBUKQ0KYGBgDQoNCiMjIyMgR3LDoWZpY2EgVGVtcG9yYWRhcw0KYGBge3J9DQp0dlNob3dzICU+JQ0KICBnZ3Bsb3QoYWVzKHg9ZHVyYXRpb25OdW0sIHk9Li5kZW5zaXR5Li4gKSkrDQogICAgZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQojIyMjIEdyw6FmaWNhIE1vdmllcw0KYGBge3J9DQptb3ZpZXMgJT4lDQogIGdncGxvdChhZXMoeD1kdXJhdGlvbk51bSwgeT0uLmRlbnNpdHkuLikpKw0KICBnZW9tX2RlbnNpdHkoKQ0KYGBgDQoNCg0KDQojIyMgTWVkaWRhcyBkZSBkaXNwZXJzacOzbg0KDQoNCiMjIyMgRGlzcGVyc2nDs24NCg0KIyMjIyMjIyDCv0N1w6FsIGVzIGxhIGRpc3BlcnNpw7NuIGVudHJlIGxhIGR1cmFjacOzbiBwYXJhIGFtYm9zIHR5cG9zPw0KDQojIyMjIyMgVFZTaG93cw0KDQpgYGB7cn0NCkRpc3BlcnNpb25UVjwtdHZTaG93cyRkdXJhdGlvbk51bQ0KbWVhbihEaXNwZXJzaW9uVFYpDQpgYGANCg0KDQpgYGB7cn0NCnJhbmdlKERpc3BlcnNpb25UVikNCmBgYA0KYGBge3J9DQpoaXN0KERpc3BlcnNpb25UViwgY29sID0gIm1hZ2VudGEiKQ0KYGBgDQoNCiMjIyMjIyBNb3ZpZXMNCg0KYGBge3J9DQpEaXNwZXJzaW9uTW92aWVzPC1tb3ZpZXMkZHVyYXRpb25OdW0NCm1lYW4oRGlzcGVyc2lvbk1vdmllcykNCmBgYA0KYGBge3J9DQpyYW5nZShEaXNwZXJzaW9uTW92aWVzKQ0KYGBgDQpgYGB7cn0NCmhpc3QoRGlzcGVyc2lvbk1vdmllcywgY29sID0gImJsdWUiKQ0KYGBgDQoNCiMjIyMgVmFyaWFuemENCg0KIyMjIyMjIyDCv0VuY29udHJhciBsYSB2YXJpYW56YSBwYXJhIGFtYm9zIHR5cG9zPw0KDQojIyMjIyMgVFZTaG93cw0KYGBge3J9DQpWYXJpYW56YVRWPC10dlNob3dzJGR1cmF0aW9uTnVtDQp2YXIoVmFyaWFuemFUVikNCg0KYGBgDQoNCg0KIyMjIyMjIE1vdmllcw0KYGBge3J9DQpWYXJpYW56YU08LW1vdmllcyRkdXJhdGlvbk51bQ0KdmFyKFZhcmlhbnphTSkNCg0KYGBgDQoNCiMjIyBNZWRpZGFzIGRlIHBvc2ljacOzbg0KDQoNCiMjIyMgQ3VhbnRpbGVzDQoNCiMjIyMjIyMgwr9FbmNvbnRyYXIgbGEgcG9zaWNpw7NuIGRlIGxhIG1lZGlhbmEgZW4gYmFzZSBhIGxvcyBjdWFudGlsZXMsIHRvbWFuZG8gZW4gY3VlbnRhIHF1ZSBsYSBtZWRpYW5hIGVuIFRWU2hvdyBlcyAxIHkgcGFyYSBNb3ZpZXMgZXMgOTg/DQoNCiMjIyMjIyBUVlNob3dzDQpgYGB7cn0NCnF1YW50aWxlKHR2U2hvd3MkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIyMjIE1vdmllcw0KYGBge3J9DQpxdWFudGlsZShtb3ZpZXMkZHVyYXRpb25OdW0pDQpgYGANCg0KIyMjIEFuw6FsaXNpcyBkZSBsb3MgZGF0b3MgZGVzY3JpcHRpdm9zDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPlBhcmEgZWwgY2FzbyBkZSBsb3MgdMOtdHVsb3MgcXVlIGNvcnJlc3BvbmRlbiBhIFByb2dyYW1hcyB0ZWxldmlzaXZvcyBwb2RlbW9zIG5vdGFyIHF1ZSBlbCBtYXlvciBjb250ZW5pZG8gc2UgZW5jdWVudHJhIGVudHJlIDEgeSAyIHRlbXBvcmFkYXMgcG9yIGxvIHF1ZSBsYSBjdXJ2YSBlbXBpZXphIGEgbm90YXJzZSBhIHBhcnRpciBkZSBsYSB0ZXJjZXJhIHkgYSBhcGxhbmFyc2UgbcOhcywgbHVlZ28gZGUgbGEgOHZhIHRlbXBvcmFkYS4gRW4gZXN0ZSBwdW50byB5YSBzb24gbXV5IHBvY2FzIGxvcyBwcm9ncmFtYXMgcXVlIGNvbnRpZW5lIG3DoXMgZGUgZXN0ZSBuw7ptZXJvLjxkaXYvPg0KDQpFbiBjdWVudG8gYSBsYXMgcGVsw61jdWxhcyBlbiBzdSBtYXlvcsOtYSB0aWVuZW4gdW4gdGllbXBvIGRlIGR1cmFjacOzbiBkZSAxIGhvcmEgeSA0MCBtaW51dG9zIHBvciBsbyBxdWUgbGEgY3VydmEgc2UgY29taWVuemEgYSBlbGV2YXIgYSBwYXJ0aXIgZGUgNDUgbWludXRvcywgb2JzZXJ2YW5kbyBxdWUgbGxlZ2FuZG8gYSBsYXMgZG9zIHkgMyBob3JhcyB5YSBzb24gbXV5IHBvY2FzIGxhcyBwZWzDrWN1bGFzIGVuIGVzdGUgcmFuZ28geSBzZSB2ZSBlbCBkZXNjZW5zbyBoYXN0YSBub3RhciBsYSBsw61uZWEgbcOhcyBwbGFuYS4gDQoNCg0KDQoNCiMjIyBJLiBFc3R1ZGlvIGNvbXBvcnRhbWllbnRvIHByb2JhYmlsw61zdGljby4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+U2kgdG9kbyBlbCBjb250ZW5pZG8gZGUgbG9zIDUgYcOxb3MgZXN0dXZpZXJhIGNhcmdhZG8gYSBsYSBwbGF0YWZvcm1hIGRlIE5ldGZsaXggY29uIGxvcyA2LDIyNCB0w610dWxvcy4gwr9Dw7phbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIDIwIGFtaWdvcyBlbGlnaWVuZG8gYWxlYXRvcmlhbWVudGUgdW4gdMOtdHVsbyBlc3RlIHNlYSBkZSBjbGFzaWZpY2FjacOzbiBUVjE0LiBTZSBwcmV0ZW5kZSBlbmNvbnRyYXIgbGEgZnVuY2nDs24gZGUgZGVuc2lkYWQgZGUgcHJvYmFiaWxpZGFkLjxkaXYvPg0KDQojIyMjIGEuIERldGVybWluZSBQREYuDQojIyMjIGIuIERldGVybWluZSBDREYNCiMjIyMgYy4gQW7DoW5pbGlzaXMgcHJvYmFiaWxpc3RpY28gZGUgZXN0ZSBldmVudG8NCg0KIyMjIERpc3RyaWJ1Y8Otb24gYmlub21pYWwNCg0KIyMjIyBQREYgDQoNCmBgYHtyfQ0KbjwtMjANCnA8LTAuMjcNCng8LTA6MjANCg0KDQpQREY8LWRiaW5vbSh4LCBuLCBwKQ0KUERGDQoNCmBgYA0KDQpgYGB7cn0NCmJhcnBsb3QoUERGXzIsDQogICAgICAgIG1haW49IlBNRiBEaXN0cmlidWNpb24gQmlub21pYWwiLA0KICAgICAgICB4bGFiPSJWYWxvcmVzIGRlIHgiLA0KICAgICAgICB5bGFiPSJEZW5zaWRhZCBkZSBQcm9iYWJpbGRpYWQiLA0KICAgICAgICBjb2w9cmFpbmJvdygyMSksDQogICAgICAgIHNwYWNlPXJlcCgwLCAyMSksDQogICAgICAgIG5hbWVzLmFyZyA9IHgpDQpsaW5lcyh4PXgrMC41LCB5PVBERl8yLCBjb2w9ImJsdWUiLCBsd2Q9MikNCmBgYA0KDQpgYGB7cn0NCkRhdG9zQmlub21pYWxlczwtZGF0YS5mcmFtZSh4PXgsIHk9UERGKQ0KRGF0b3NCaW5vbWlhbGVzDQpgYGANCg0KYGBge3J9DQpWYWxvcl9Fc3BlcmFkbyhEYXRvc0Jpbm9taWFsZXMpDQpgYGANCg0KIyMjIyBDREYNCg0KYGBge3J9DQpDREZfMTwtcGJpbm9tKHgsIG4sIHApDQpDREZfMQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdCh4LCBDREZfMSwNCiAgICAgbWFpbj0iUE1GIERpc3RyaWJ1Y2lvbiBCaW5vbWlhbCIsDQogICAgIHhsYWI9IlZhbG9yZXMgZGUgeCIsIHlsYWI9IkRlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCIsDQogICAgIGNvbD0ibWFnZW50YSIsDQogICAgIHR5cGU9ImIiLA0KICAgICBsd2Q9MiwNCiAgICAgcGNoPTE2KQ0KYGBgDQoNCiMjIyBBbsOhbGlzaXMgUHJvYmFiaWzDrXN0aWNvDQoNCkxsZWdhbmRvIGFsIGFuw6FsaXNpcyBwb2RlbW9zIHZlciBxdWUgZGUgbG9zIDIwIGFtaWdvcyA1IGRlIGVsbG9zIGVzIHByb2JhYmxlIHF1ZSBlbGlnYW4gYWxlYXRvcmlhbWVudGUgdW4gdMOtdHVsbyBkZSBjbGFzaWZpY2FjacOzbiBUMTQuDQoNCg==