Serie de tiempo de la población y estado
ts_CA <- ts(data=CA$Population, start = c(1900,1))
ts_CA
## Time Series:
## Start = 1900
## End = 2019
## Frequency = 1
## [1] 1490000 1550000 1623000 1702000 1792000 1893000 1976000 2054000
## [9] 2161000 2282000 2406000 2534000 2668000 2811000 2934000 3008000
## [17] 3071000 3171000 3262000 3339000 3554000 3795000 3991000 4270000
## [25] 4541000 4730000 4929000 5147000 5344000 5531000 5711000 5824000
## [33] 5894000 5963000 6060000 6175000 6341000 6528000 6656000 6785000
## [41] 6950000 7237000 7735000 8506000 8945000 9344000 9559000 9832000
## [49] 10064000 10337000 10677000 11134000 11635000 12251000 12746000 13133000
## [57] 13713000 14264000 14880000 15467000 15870000 16497000 17072000 17668000
## [65] 18151000 18585000 18858000 19176000 19394000 19711000 19971069 20345939
## [73] 20585469 20868728 21173865 21537849 21935909 22352396 22835958 23256880
## [81] 23800800 24285933 24820009 25360026 25844393 26441109 27102237 27777158
## [89] 28464249 29218164 29950111 30414114 30875920 31147208 31317179 31493525
## [97] 31780829 32217708 32682794 33145121 33987977 34479458 34871843 35253159
## [105] 35574576 35827943 36021202 36250311 36604337 36961229 37319502 37638369
## [113] 37948800 38260787 38596972 38918045 39167117 39358497 39461588 39512223
ts_AZ <- ts(data=AZ$Population, start = c(1900,1))
ts_AZ
## Time Series:
## Start = 1900
## End = 2019
## Frequency = 1
## [1] 124000 131000 138000 144000 151000 158000 167000 176000 186000
## [10] 196000 206000 212000 217000 236000 253000 263000 282000 311000
## [19] 320000 329000 340000 351000 360000 371000 382000 393000 403000
## [28] 414000 422000 430000 434000 429000 426000 426000 428000 434000
## [37] 443000 453000 466000 484000 499000 490000 524000 692000 610000
## [46] 594000 616000 653000 690000 714000 756000 785000 842000 894000
## [55] 933000 987000 1053000 1125000 1193000 1261000 1321000 1407000 1471000
## [64] 1521000 1556000 1584000 1614000 1646000 1682000 1737000 1775399 1895814
## [73] 2008291 2124438 2223196 2284847 2346157 2425197 2515316 2635571 2737774
## [82] 2810107 2889861 2968925 3067135 3183538 3308262 3437103 3535183 3622185
## [91] 3679056 3762394 3867333 3993390 4147561 4306908 4432308 4552207 4667277
## [100] 4778332 5160586 5273477 5396255 5510364 5652404 5839077 6029141 6167681
## [109] 6280362 6343154 6407172 6472643 6554978 6632764 6730413 6829676 6941072
## [118] 7044008 7158024 7278717
ts_IN <- ts(data=IN$Population, start = c(1900,1))
ts_IN
## Time Series:
## Start = 1900
## End = 2019
## Frequency = 1
## [1] 2518000 2541000 2567000 2594000 2614000 2635000 2663000 2679000 2677000
## [10] 2678000 2713000 2751000 2785000 2824000 2857000 2873000 2897000 2910000
## [19] 2880000 2906000 2947000 2976000 2965000 3042000 3086000 3119000 3148000
## [28] 3191000 3212000 3226000 3242000 3257000 3281000 3304000 3319000 3332000
## [37] 3348000 3374000 3386000 3403000 3433000 3483000 3507000 3449000 3440000
## [46] 3427000 3702000 3779000 3877000 3958000 3967000 4096000 4148000 4182000
## [55] 4264000 4363000 4458000 4529000 4583000 4613000 4674000 4730000 4736000
## [64] 4799000 4856000 4922000 4999000 5053000 5093000 5143000 5195392 5253396
## [73] 5302435 5338277 5361890 5365766 5389088 5425638 5470214 5501174 5490721
## [82] 5480435 5467922 5450395 5458322 5459211 5454108 5473012 5491735 5523693
## [91] 5555097 5602062 5648649 5701965 5745626 5791819 5834908 5872370 5907617
## [100] 5942901 6091866 6127760 6155967 6196638 6233007 6278616 6332669 6379599
## [109] 6424806 6459325 6490432 6516528 6537703 6568713 6593644 6608422 6634304
## [118] 6658078 6695497 6732219
ts_MT <- ts(data=MT$Population, start = c(1900,1))
ts_MT
## Time Series:
## Start = 1900
## End = 2019
## Frequency = 1
## [1] 245000 261000 270000 282000 293000 305000 322000 332000 346000
## [10] 363000 380000 397000 414000 433000 452000 469000 487000 505000
## [19] 501000 534000 543000 546000 543000 538000 538000 535000 531000
## [28] 527000 541000 524000 539000 540000 540000 541000 545000 550000
## [37] 554000 554000 552000 555000 558000 543000 518000 485000 469000
## [46] 477000 514000 531000 542000 569000 593000 596000 602000 616000
## [55] 624000 636000 656000 667000 666000 669000 679000 696000 698000
## [64] 703000 706000 706000 707000 701000 700000 694000 694409 710814
## [73] 718732 726798 736419 748208 757317 769953 782317 787305 788752
## [82] 795328 803986 814031 820905 822320 813739 805063 800202 799636
## [91] 799824 807837 822436 839876 854923 868522 876656 878706 879533
## [100] 882779 903773 906961 911667 919630 930009 940102 952692 964706
## [109] 976415 983982 990697 997316 1003783 1013569 1021869 1030475 1040859
## [118] 1052482 1060665 1068778
ts_ME <- ts(data=ME$Population, start = c(1900,1))
ts_ME
## Time Series:
## Start = 1900
## End = 2019
## Frequency = 1
## [1] 695000 699000 703000 709000 719000 723000 729000 731000 735000
## [10] 740000 745000 751000 753000 763000 772000 774000 775000 777000
## [19] 760000 762000 771000 775000 778000 781000 788000 792000 793000
## [28] 796000 797000 797000 800000 807000 815000 821000 829000 836000
## [37] 840000 842000 843000 846000 849000 852000 839000 806000 801000
## [46] 800000 832000 854000 878000 903000 917000 916000 915000 913000
## [55] 927000 934000 938000 943000 944000 957000 975000 995000 994000
## [64] 993000 993000 997000 999000 1004000 994000 992000 993722 1015390
## [73] 1034292 1045655 1059040 1071995 1088412 1103578 1113566 1122563 1126860
## [82] 1133033 1136684 1144772 1155635 1162936 1170126 1184574 1203840 1219961
## [91] 1231296 1235439 1235748 1238256 1237687 1237438 1241436 1245215 1247554
## [100] 1253040 1277072 1285692 1295960 1306513 1313688 1318787 1323619 1327040
## [109] 1330509 1329590 1327629 1328284 1327729 1328009 1330513 1328262 1331317
## [118] 1334612 1339057 1344212
Aplicación de ARIMA
arima1 <- auto.arima(ts_CA, D=1)
summary(arima1)
## Series: ts_CA
## ARIMA(0,2,0)
##
## sigma^2 = 9.971e+09: log likelihood = -1525.79
## AIC=3053.57 AICc=3053.61 BIC=3056.34
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -88.02939 99017.45 65793.72 0.06388803 0.560492 0.2059178
## ACF1
## Training set -0.1174913
arima2 <- auto.arima(ts_AZ, D=1)
summary(arima2)
## Series: ts_AZ
## ARIMA(0,2,1)
##
## Coefficients:
## ma1
## -0.7815
## s.e. 0.0620
##
## sigma^2 = 1.504e+09: log likelihood = -1414.15
## AIC=2832.3 AICc=2832.4 BIC=2837.84
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 3812.388 38291.02 20396.69 0.3291156 1.521771 0.3286796 0.04665136
arima3 <- auto.arima(ts_IN, D=1)
summary(arima3)
## Series: ts_IN
## ARIMA(1,1,1) with drift
##
## Coefficients:
## ar1 ma1 drift
## 0.8402 -0.6540 35005.847
## s.e. 0.1209 0.1717 6586.586
##
## sigma^2 = 1.188e+09: log likelihood = -1410.69
## AIC=2829.37 AICc=2829.72 BIC=2840.49
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 196.8848 33881.45 18351.97 -0.01160382 0.4553768 0.4776668
## ACF1
## Training set 0.03082154
arima4 <- auto.arima(ts_MT, D=1)
summary(arima4)
## Series: ts_MT
## ARIMA(1,1,0) with drift
##
## Coefficients:
## ar1 drift
## 0.5308 7017.935
## s.e. 0.0772 1636.222
##
## sigma^2 = 72671363: log likelihood = -1245.05
## AIC=2496.09 AICc=2496.3 BIC=2504.43
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -48.99213 8417.516 5757.345 0.03315024 1.01426 0.5910594
## ACF1
## Training set -0.04391617
arima5 <- auto.arima(ts_ME, D=1)
summary(arima5)
## Series: ts_ME
## ARIMA(0,1,2) with drift
##
## Coefficients:
## ma1 ma2 drift
## 0.5693 0.3749 5449.97
## s.e. 0.0821 0.0864 1163.30
##
## sigma^2 = 44209727: log likelihood = -1215.04
## AIC=2438.08 AICc=2438.43 BIC=2449.2
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 9.981606 6537.283 4235.301 -0.007616192 0.4497604 0.6027132
## ACF1
## Training set 0.02999791
Mapas
Convertir a dataframe para poder juntar la información de cada una
de las décadas
California<- as.data.frame(pronostico_CA5)
Arizona<- as.data.frame(pronostico_AZ5)
Indiana<- as.data.frame(pronostico_IN5)
Montana<- as.data.frame(pronostico_MT5)
Maine<- as.data.frame(pronostico_ME5)
#a<- a[c(11,21,31),]
Estados<-rbind(California,Arizona,Indiana,Montana,Maine)
a<- Estados[c(10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250),]
A10<-a[c(1,6,11,16,21),]
A20<-a[c(2,7,12,17,22),]
A30<-a[c(3,8,13,18,23),]
A40<-a[c(4,9,14,19,24),]
A50<-a[c(5,10,15,20,25),]
rownames(A10) <- c('California','Arizona','Indiana','Montana','Maine')
rownames(A20) <- c('California','Arizona','Indiana','Montana','Maine')
rownames(A30) <- c('California','Arizona','Indiana','Montana','Maine')
rownames(A40) <- c('California','Arizona','Indiana','Montana','Maine')
rownames(A50) <- c('California','Arizona','Indiana','Montana','Maine')
mapa_estados <- map_data("state")
Mapa dentro de 10 años
rangos_poblacion <- c(0, 2000000, 6000000, 10000000, 16000000, max(A10$`Point Forecast`))
colores <- c("lightblue", "skyblue", "darkcyan", "blue2", "darkblue")
# Crear una columna en datos_completos que indique el rango de población
A10$`Point Forecast` <- cut(A10$`Point Forecast`, breaks = rangos_poblacion, labels = colores)
A10$region <- c('california','arizona','indiana','montana','maine')
mapa_10 <- full_join(A10,mapa_estados, by="region")
ggplot() +
geom_map(data = mapa_10, map = mapa_10,
aes(x = long, y = lat, map_id = region, fill = mapa_10$`Point Forecast`),
color = "black", size = 0.1) +
scale_fill_identity() + # Utilizar los colores directamente de la columna 'color'
expand_limits(x = mapa_10$long, y = mapa_10$lat) +
theme_void() +
labs(title = "Mapa de población por estado en Estados Unidos dentro de 10 años")

Mapa dentro de 20 años
rangos_poblacion <- c(0, 2000000, 6000000, 10000000, 16000000, max(A20$`Point Forecast`))
colores <- c("lightblue", "skyblue", "darkcyan", "blue2", "darkblue")
# Crear una columna en datos_completos que indique el rango de población
A20$`Point Forecast` <- cut(A20$`Point Forecast`, breaks = rangos_poblacion, labels = colores)
A20$region <- c('california','arizona','indiana','montana','maine')
mapa_20 <- full_join(A20,mapa_estados, by="region")
ggplot() +
geom_map(data = mapa_20, map = mapa_20,
aes(x = long, y = lat, map_id = region, fill = mapa_20$`Point Forecast`),
color = "black", size = 0.1) +
scale_fill_identity() + # Utilizar los colores directamente de la columna 'color'
expand_limits(x = mapa_20$long, y = mapa_20$lat) +
theme_void() +
labs(title = "Mapa de población por estado en Estados Unidos dentro de 20 años")

Mapa dentro de 30 años
rangos_poblacion <- c(0, 2000000, 6000000, 10000000, 16000000, max(A30$`Point Forecast`))
colores <- c("lightblue", "skyblue", "darkcyan", "blue2", "darkblue")
# Crear una columna en datos_completos que indique el rango de población
A30$`Point Forecast` <- cut(A30$`Point Forecast`, breaks = rangos_poblacion, labels = colores)
A30$region <- c('california','arizona','indiana','montana','maine')
mapa_30 <- full_join(A30,mapa_estados, by="region")
ggplot() +
geom_map(data = mapa_30, map = mapa_30,
aes(x = long, y = lat, map_id = region, fill = mapa_30$`Point Forecast`),
color = "black", size = 0.1) +
scale_fill_identity() + # Utilizar los colores directamente de la columna 'color'
expand_limits(x = mapa_30$long, y = mapa_30$lat) +
theme_void() +
labs(title = "Mapa de población por estado en Estados Unidos dentro de 30 años")

Mapa dentro de 40 años
rangos_poblacion <- c(0, 2000000, 6000000, 10000000, 16000000, max(A40$`Point Forecast`))
colores <- c("lightblue", "skyblue", "darkcyan", "blue2", "darkblue")
# Crear una columna en datos_completos que indique el rango de población
A40$`Point Forecast` <- cut(A40$`Point Forecast`, breaks = rangos_poblacion, labels = colores)
A40$region <- c('california','arizona','indiana','montana','maine')
mapa_40 <- full_join(A40,mapa_estados, by="region")
ggplot() +
geom_map(data = mapa_40, map = mapa_40,
aes(x = long, y = lat, map_id = region, fill = mapa_40$`Point Forecast`),
color = "black", size = 0.1) +
scale_fill_identity() + # Utilizar los colores directamente de la columna 'color'
expand_limits(x = mapa_40$long, y = mapa_40$lat) +
theme_void() +
labs(title = "Mapa de población por estado en Estados Unidos dentro de 40 años")

Mapa dentro de 50 años
rangos_poblacion <- c(0, 2000000, 6000000, 10000000, 16000000, max(A50$`Point Forecast`))
colores <- c("lightblue", "skyblue", "darkcyan", "blue2", "darkblue")
# Crear una columna en datos_completos que indique el rango de población
A50$`Point Forecast` <- cut(A50$`Point Forecast`, breaks = rangos_poblacion, labels = colores)
A50$region <- c('california','arizona','indiana','montana','maine')
mapa_50 <- full_join(A50,mapa_estados, by="region")
ggplot() +
geom_map(data = mapa_50, map = mapa_50,
aes(x = long, y = lat, map_id = region, fill = mapa_50$`Point Forecast`),
color = "black", size = 0.1) +
scale_fill_identity() + # Utilizar los colores directamente de la columna 'color'
expand_limits(x = mapa_50$long, y = mapa_50$lat) +
theme_void() +
labs(title = "Mapa de población por estado en Estados Unidos dentro de 50 años")

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIEludGVncmFkb3JhIgphdXRob3I6ICJUYW5pYSBPcnRlZ2EgLSBBMDE3MjE0NDkiCmRhdGU6ICIyMDI0LTAyLTIxIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQotLS0KCiFbXSh1c2EuZ2lmKQoKIyMgQW7DoWxpc2lzIGRlIGxhIFBvbGFjacOzbiBkZSBlc3RhZG9zIGRlIEVzdGFkb3MgVW5pZG9zLiAgCiMjIyMgRXF1aXBvIDcgICAgICAgIAojIyMjIyMgVGFuaWEgT3J0ZWdhICAgICAgIAojIyMjIyMgSHVtYmVydG8gTWVuYSAgICAgICAgCiMjIyMjIyBBcmVzIE1lbMOpbmRleiAgICAgICAgCgoKIyMjIyMgTGxhbWFkbyBkZSBsaWJyZXLDrWFzCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KHBsbSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc2YpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShkcGx5cikKbGlicmFyeShtYXBzKQpgYGAKCgojIyBPYnRlbmNpw7NuIGRlIGxvcyBkYXRvcyAKYGBge3J9CnBvcHVsYXRpb24gPC0gcmVhZF9jc3YoIlVTQV9Qb3B1bGF0aW9uLmNzdiIpCmBgYAoKIyMjIFNlbGVjY2nDs24gZGUgNSBlc3RhZG9zCiMjIyMjIyBDYWxpZm9ybmlhIChDQSkKIyMjIyMjIEFyaXpvbmEgKEFaKQojIyMjIyMgSW5pZGlhbmEgKElOKQojIyMjIyBNb250YW5hIChNVCkKIyMjIyMgTWFpbmUgKE1FKQoKYGBge3J9CkNBIDwtIHBvcHVsYXRpb25bcG9wdWxhdGlvbiRTdGF0ZSA9PSAiQ0EiLF0KQVogPC0gcG9wdWxhdGlvbltwb3B1bGF0aW9uJFN0YXRlID09ICJBWiIsXQpJTiA8LSBwb3B1bGF0aW9uW3BvcHVsYXRpb24kU3RhdGUgPT0gIklOIixdCk1UIDwtIHBvcHVsYXRpb25bcG9wdWxhdGlvbiRTdGF0ZSA9PSAiTVQiLF0KTUUgPC0gcG9wdWxhdGlvbltwb3B1bGF0aW9uJFN0YXRlID09ICJNRSIsXQpgYGAKCiMjIFNlcmllIGRlIHRpZW1wbyBkZSBsYSBwb2JsYWNpw7NuIHkgZXN0YWRvCmBgYHtyfQp0c19DQSA8LSB0cyhkYXRhPUNBJFBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDEpKQp0c19DQQpgYGAKCmBgYHtyfQp0c19BWiA8LSB0cyhkYXRhPUFaJFBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDEpKQp0c19BWgpgYGAKCmBgYHtyfQp0c19JTiA8LSB0cyhkYXRhPUlOJFBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDEpKQp0c19JTgpgYGAKCmBgYHtyfQp0c19NVCA8LSB0cyhkYXRhPU1UJFBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDEpKQp0c19NVApgYGAKCmBgYHtyfQp0c19NRSA8LSB0cyhkYXRhPU1FJFBvcHVsYXRpb24sIHN0YXJ0ID0gYygxOTAwLDEpKQp0c19NRQpgYGAKIyMgQXBsaWNhY2nDs24gZGUgQVJJTUEKCmBgYHtyfQphcmltYTEgPC0gYXV0by5hcmltYSh0c19DQSwgRD0xKQpzdW1tYXJ5KGFyaW1hMSkKYGBgCgpgYGB7cn0KYXJpbWEyIDwtIGF1dG8uYXJpbWEodHNfQVosIEQ9MSkKc3VtbWFyeShhcmltYTIpCmBgYAoKYGBge3J9CmFyaW1hMyA8LSBhdXRvLmFyaW1hKHRzX0lOLCBEPTEpCnN1bW1hcnkoYXJpbWEzKQpgYGAKCmBgYHtyfQphcmltYTQgPC0gYXV0by5hcmltYSh0c19NVCwgRD0xKQpzdW1tYXJ5KGFyaW1hNCkKYGBgCgpgYGB7cn0KYXJpbWE1IDwtIGF1dG8uYXJpbWEodHNfTUUsIEQ9MSkKc3VtbWFyeShhcmltYTUpCmBgYAoKIyMgUHJvbsOzc3RpY29zIGRlbnRybyBkZSBsYXMgc2lndWllbnRlcyA1IGTDqWNhZGFzCgojIyMgUHJvbsOzc3RpY28gQ2FsaWZvcm5pYQpgYGB7cn0KcHJvbm9zdGljb19DQTUgPC0gZm9yZWNhc3QoYXJpbWExLCBsZXZlbCA9Yyg1MCksIGg9NTApCnByb25vc3RpY29fQ0E1CnBsb3QocHJvbm9zdGljb19DQTUpCmBgYAoKIyMjIFByb27Ds3N0aWNvIEFyaXpvbmEKYGBge3J9CnByb25vc3RpY29fQVo1IDwtIGZvcmVjYXN0KGFyaW1hMiwgbGV2ZWwgPWMoNTApLCBoPTUwKQpwcm9ub3N0aWNvX0FaNQpwbG90KHByb25vc3RpY29fQVo1KQpgYGAKCiMjIyBQcm9uw7NzdGljbyBJbmRpYW5hCmBgYHtyfQpwcm9ub3N0aWNvX0lONSA8LSBmb3JlY2FzdChhcmltYTMsIGxldmVsID1jKDUwKSwgaD01MCkKcHJvbm9zdGljb19JTjUKcGxvdChwcm9ub3N0aWNvX0lONSkKYGBgCgojIyMgUHJvbsOzc3RpY28gTW9udGFuYQpgYGB7cn0KcHJvbm9zdGljb19NVDUgPC0gZm9yZWNhc3QoYXJpbWE0LCBsZXZlbCA9Yyg1MCksIGg9NTApCnByb25vc3RpY29fTVQ1CnBsb3QocHJvbm9zdGljb19NVDUpCmBgYAoKIyMjIyBQcm9uw7NzdGljbyBNYWluZQpgYGB7cn0KcHJvbm9zdGljb19NRTUgPC0gZm9yZWNhc3QoYXJpbWE1LCBsZXZlbCA9Yyg1MCksIGg9NTApCnByb25vc3RpY29fTUU1CnBsb3QocHJvbm9zdGljb19NRTUpCmBgYAoKIyMgTWFwYXMKCiMjIyBDb252ZXJ0aXIgYSBkYXRhZnJhbWUgcGFyYSBwb2RlciBqdW50YXIgbGEgaW5mb3JtYWNpw7NuIGRlIGNhZGEgdW5hIGRlIGxhcyBkw6ljYWRhcwpgYGB7cn0KQ2FsaWZvcm5pYTwtIGFzLmRhdGEuZnJhbWUocHJvbm9zdGljb19DQTUpCkFyaXpvbmE8LSBhcy5kYXRhLmZyYW1lKHByb25vc3RpY29fQVo1KQpJbmRpYW5hPC0gYXMuZGF0YS5mcmFtZShwcm9ub3N0aWNvX0lONSkKTW9udGFuYTwtIGFzLmRhdGEuZnJhbWUocHJvbm9zdGljb19NVDUpCk1haW5lPC0gYXMuZGF0YS5mcmFtZShwcm9ub3N0aWNvX01FNSkKYGBgCgpgYGB7cn0KI2E8LSBhW2MoMTEsMjEsMzEpLF0KRXN0YWRvczwtcmJpbmQoQ2FsaWZvcm5pYSxBcml6b25hLEluZGlhbmEsTW9udGFuYSxNYWluZSkKYGBgCgpgYGB7cn0KYTwtIEVzdGFkb3NbYygxMCwyMCwzMCw0MCw1MCw2MCw3MCw4MCw5MCwxMDAsMTEwLDEyMCwxMzAsMTQwLDE1MCwxNjAsMTcwLDE4MCwxOTAsMjAwLDIxMCwyMjAsMjMwLDI0MCwyNTApLF0KYGBgCgpgYGB7cn0KQTEwPC1hW2MoMSw2LDExLDE2LDIxKSxdCkEyMDwtYVtjKDIsNywxMiwxNywyMiksXQpBMzA8LWFbYygzLDgsMTMsMTgsMjMpLF0KQTQwPC1hW2MoNCw5LDE0LDE5LDI0KSxdCkE1MDwtYVtjKDUsMTAsMTUsMjAsMjUpLF0KYGBgCgpgYGB7cn0Kcm93bmFtZXMoQTEwKSA8LSBjKCdDYWxpZm9ybmlhJywnQXJpem9uYScsJ0luZGlhbmEnLCdNb250YW5hJywnTWFpbmUnKQpyb3duYW1lcyhBMjApIDwtIGMoJ0NhbGlmb3JuaWEnLCdBcml6b25hJywnSW5kaWFuYScsJ01vbnRhbmEnLCdNYWluZScpCnJvd25hbWVzKEEzMCkgPC0gYygnQ2FsaWZvcm5pYScsJ0FyaXpvbmEnLCdJbmRpYW5hJywnTW9udGFuYScsJ01haW5lJykKcm93bmFtZXMoQTQwKSA8LSBjKCdDYWxpZm9ybmlhJywnQXJpem9uYScsJ0luZGlhbmEnLCdNb250YW5hJywnTWFpbmUnKQpyb3duYW1lcyhBNTApIDwtIGMoJ0NhbGlmb3JuaWEnLCdBcml6b25hJywnSW5kaWFuYScsJ01vbnRhbmEnLCdNYWluZScpCmBgYAoKYGBge3J9Cm1hcGFfZXN0YWRvcyA8LSBtYXBfZGF0YSgic3RhdGUiKQpgYGAKCiMjIyBNYXBhIGRlbnRybyBkZSAxMCBhw7FvcwoKYGBge3J9CnJhbmdvc19wb2JsYWNpb24gPC0gYygwLCAyMDAwMDAwLCA2MDAwMDAwLCAxMDAwMDAwMCwgMTYwMDAwMDAsIG1heChBMTAkYFBvaW50IEZvcmVjYXN0YCkpCmNvbG9yZXMgPC0gYygibGlnaHRibHVlIiwgInNreWJsdWUiLCAiZGFya2N5YW4iLCAiYmx1ZTIiLCAiZGFya2JsdWUiKQpgYGAKCmBgYHtyfQojIENyZWFyIHVuYSBjb2x1bW5hIGVuIGRhdG9zX2NvbXBsZXRvcyBxdWUgaW5kaXF1ZSBlbCByYW5nbyBkZSBwb2JsYWNpw7NuCkExMCRgUG9pbnQgRm9yZWNhc3RgIDwtIGN1dChBMTAkYFBvaW50IEZvcmVjYXN0YCwgYnJlYWtzID0gcmFuZ29zX3BvYmxhY2lvbiwgbGFiZWxzID0gY29sb3JlcykKCmBgYAoKYGBge3J9CkExMCRyZWdpb24gPC0gYygnY2FsaWZvcm5pYScsJ2FyaXpvbmEnLCdpbmRpYW5hJywnbW9udGFuYScsJ21haW5lJykKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQptYXBhXzEwIDwtIGZ1bGxfam9pbihBMTAsbWFwYV9lc3RhZG9zLCBieT0icmVnaW9uIikKZ2dwbG90KCkgKwogIGdlb21fbWFwKGRhdGEgPSBtYXBhXzEwLCBtYXAgPSBtYXBhXzEwLAogICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gbWFwYV8xMCRgUG9pbnQgRm9yZWNhc3RgKSwKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjEpICsKICBzY2FsZV9maWxsX2lkZW50aXR5KCkgKyAgIyBVdGlsaXphciBsb3MgY29sb3JlcyBkaXJlY3RhbWVudGUgZGUgbGEgY29sdW1uYSAnY29sb3InCiAgZXhwYW5kX2xpbWl0cyh4ID0gbWFwYV8xMCRsb25nLCB5ID0gbWFwYV8xMCRsYXQpICsKICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiTWFwYSBkZSBwb2JsYWNpw7NuIHBvciBlc3RhZG8gZW4gRXN0YWRvcyBVbmlkb3MgZGVudHJvIGRlIDEwIGHDsW9zIikKYGBgCgojIyMgTWFwYSBkZW50cm8gZGUgMjAgYcOxb3MKYGBge3J9CnJhbmdvc19wb2JsYWNpb24gPC0gYygwLCAyMDAwMDAwLCA2MDAwMDAwLCAxMDAwMDAwMCwgMTYwMDAwMDAsIG1heChBMjAkYFBvaW50IEZvcmVjYXN0YCkpCmNvbG9yZXMgPC0gYygibGlnaHRibHVlIiwgInNreWJsdWUiLCAiZGFya2N5YW4iLCAiYmx1ZTIiLCAiZGFya2JsdWUiKQpgYGAKCmBgYHtyfQojIENyZWFyIHVuYSBjb2x1bW5hIGVuIGRhdG9zX2NvbXBsZXRvcyBxdWUgaW5kaXF1ZSBlbCByYW5nbyBkZSBwb2JsYWNpw7NuCkEyMCRgUG9pbnQgRm9yZWNhc3RgIDwtIGN1dChBMjAkYFBvaW50IEZvcmVjYXN0YCwgYnJlYWtzID0gcmFuZ29zX3BvYmxhY2lvbiwgbGFiZWxzID0gY29sb3JlcykKCmBgYAoKYGBge3J9CkEyMCRyZWdpb24gPC0gYygnY2FsaWZvcm5pYScsJ2FyaXpvbmEnLCdpbmRpYW5hJywnbW9udGFuYScsJ21haW5lJykKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQptYXBhXzIwIDwtIGZ1bGxfam9pbihBMjAsbWFwYV9lc3RhZG9zLCBieT0icmVnaW9uIikKZ2dwbG90KCkgKwogIGdlb21fbWFwKGRhdGEgPSBtYXBhXzIwLCBtYXAgPSBtYXBhXzIwLAogICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gbWFwYV8yMCRgUG9pbnQgRm9yZWNhc3RgKSwKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjEpICsKICBzY2FsZV9maWxsX2lkZW50aXR5KCkgKyAgIyBVdGlsaXphciBsb3MgY29sb3JlcyBkaXJlY3RhbWVudGUgZGUgbGEgY29sdW1uYSAnY29sb3InCiAgZXhwYW5kX2xpbWl0cyh4ID0gbWFwYV8yMCRsb25nLCB5ID0gbWFwYV8yMCRsYXQpICsKICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiTWFwYSBkZSBwb2JsYWNpw7NuIHBvciBlc3RhZG8gZW4gRXN0YWRvcyBVbmlkb3MgZGVudHJvIGRlIDIwIGHDsW9zIikKYGBgCgojIyMgTWFwYSBkZW50cm8gZGUgMzAgYcOxb3MKYGBge3J9CnJhbmdvc19wb2JsYWNpb24gPC0gYygwLCAyMDAwMDAwLCA2MDAwMDAwLCAxMDAwMDAwMCwgMTYwMDAwMDAsIG1heChBMzAkYFBvaW50IEZvcmVjYXN0YCkpCmNvbG9yZXMgPC0gYygibGlnaHRibHVlIiwgInNreWJsdWUiLCAiZGFya2N5YW4iLCAiYmx1ZTIiLCAiZGFya2JsdWUiKQpgYGAKCmBgYHtyfQojIENyZWFyIHVuYSBjb2x1bW5hIGVuIGRhdG9zX2NvbXBsZXRvcyBxdWUgaW5kaXF1ZSBlbCByYW5nbyBkZSBwb2JsYWNpw7NuCkEzMCRgUG9pbnQgRm9yZWNhc3RgIDwtIGN1dChBMzAkYFBvaW50IEZvcmVjYXN0YCwgYnJlYWtzID0gcmFuZ29zX3BvYmxhY2lvbiwgbGFiZWxzID0gY29sb3JlcykKCmBgYAoKYGBge3J9CkEzMCRyZWdpb24gPC0gYygnY2FsaWZvcm5pYScsJ2FyaXpvbmEnLCdpbmRpYW5hJywnbW9udGFuYScsJ21haW5lJykKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQptYXBhXzMwIDwtIGZ1bGxfam9pbihBMzAsbWFwYV9lc3RhZG9zLCBieT0icmVnaW9uIikKZ2dwbG90KCkgKwogIGdlb21fbWFwKGRhdGEgPSBtYXBhXzMwLCBtYXAgPSBtYXBhXzMwLAogICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gbWFwYV8zMCRgUG9pbnQgRm9yZWNhc3RgKSwKICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjEpICsKICBzY2FsZV9maWxsX2lkZW50aXR5KCkgKyAgIyBVdGlsaXphciBsb3MgY29sb3JlcyBkaXJlY3RhbWVudGUgZGUgbGEgY29sdW1uYSAnY29sb3InCiAgZXhwYW5kX2xpbWl0cyh4ID0gbWFwYV8zMCRsb25nLCB5ID0gbWFwYV8zMCRsYXQpICsKICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiTWFwYSBkZSBwb2JsYWNpw7NuIHBvciBlc3RhZG8gZW4gRXN0YWRvcyBVbmlkb3MgZGVudHJvIGRlIDMwIGHDsW9zIikKYGBgCgoKIyMjIE1hcGEgZGVudHJvIGRlIDQwIGHDsW9zCgpgYGB7cn0KcmFuZ29zX3BvYmxhY2lvbiA8LSBjKDAsIDIwMDAwMDAsIDYwMDAwMDAsIDEwMDAwMDAwLCAxNjAwMDAwMCwgbWF4KEE0MCRgUG9pbnQgRm9yZWNhc3RgKSkKY29sb3JlcyA8LSBjKCJsaWdodGJsdWUiLCAic2t5Ymx1ZSIsICJkYXJrY3lhbiIsICJibHVlMiIsICJkYXJrYmx1ZSIpCmBgYAoKYGBge3J9CiMgQ3JlYXIgdW5hIGNvbHVtbmEgZW4gZGF0b3NfY29tcGxldG9zIHF1ZSBpbmRpcXVlIGVsIHJhbmdvIGRlIHBvYmxhY2nDs24KQTQwJGBQb2ludCBGb3JlY2FzdGAgPC0gY3V0KEE0MCRgUG9pbnQgRm9yZWNhc3RgLCBicmVha3MgPSByYW5nb3NfcG9ibGFjaW9uLCBsYWJlbHMgPSBjb2xvcmVzKQoKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpBNDAkcmVnaW9uIDwtIGMoJ2NhbGlmb3JuaWEnLCdhcml6b25hJywnaW5kaWFuYScsJ21vbnRhbmEnLCdtYWluZScpCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KbWFwYV80MCA8LSBmdWxsX2pvaW4oQTQwLG1hcGFfZXN0YWRvcywgYnk9InJlZ2lvbiIpCmdncGxvdCgpICsKICBnZW9tX21hcChkYXRhID0gbWFwYV80MCwgbWFwID0gbWFwYV80MCwKICAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIG1hcF9pZCA9IHJlZ2lvbiwgZmlsbCA9IG1hcGFfNDAkYFBvaW50IEZvcmVjYXN0YCksCiAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4xKSArCiAgc2NhbGVfZmlsbF9pZGVudGl0eSgpICsgICMgVXRpbGl6YXIgbG9zIGNvbG9yZXMgZGlyZWN0YW1lbnRlIGRlIGxhIGNvbHVtbmEgJ2NvbG9yJwogIGV4cGFuZF9saW1pdHMoeCA9IG1hcGFfNDAkbG9uZywgeSA9IG1hcGFfNDAkbGF0KSArCiAgdGhlbWVfdm9pZCgpICsKICBsYWJzKHRpdGxlID0gIk1hcGEgZGUgcG9ibGFjacOzbiBwb3IgZXN0YWRvIGVuIEVzdGFkb3MgVW5pZG9zIGRlbnRybyBkZSA0MCBhw7FvcyIpCmBgYAoKCiMjIyBNYXBhIGRlbnRybyBkZSA1MCBhw7FvcwpgYGB7cn0KcmFuZ29zX3BvYmxhY2lvbiA8LSBjKDAsIDIwMDAwMDAsIDYwMDAwMDAsIDEwMDAwMDAwLCAxNjAwMDAwMCwgbWF4KEE1MCRgUG9pbnQgRm9yZWNhc3RgKSkKY29sb3JlcyA8LSBjKCJsaWdodGJsdWUiLCAic2t5Ymx1ZSIsICJkYXJrY3lhbiIsICJibHVlMiIsICJkYXJrYmx1ZSIpCmBgYAoKYGBge3J9CiMgQ3JlYXIgdW5hIGNvbHVtbmEgZW4gZGF0b3NfY29tcGxldG9zIHF1ZSBpbmRpcXVlIGVsIHJhbmdvIGRlIHBvYmxhY2nDs24KQTUwJGBQb2ludCBGb3JlY2FzdGAgPC0gY3V0KEE1MCRgUG9pbnQgRm9yZWNhc3RgLCBicmVha3MgPSByYW5nb3NfcG9ibGFjaW9uLCBsYWJlbHMgPSBjb2xvcmVzKQoKYGBgCgpgYGB7cn0KQTUwJHJlZ2lvbiA8LSBjKCdjYWxpZm9ybmlhJywnYXJpem9uYScsJ2luZGlhbmEnLCdtb250YW5hJywnbWFpbmUnKQpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0V9Cm1hcGFfNTAgPC0gZnVsbF9qb2luKEE1MCxtYXBhX2VzdGFkb3MsIGJ5PSJyZWdpb24iKQpnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoZGF0YSA9IG1hcGFfNTAsIG1hcCA9IG1hcGFfNTAsCiAgICAgICAgICAgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBtYXBfaWQgPSByZWdpb24sIGZpbGwgPSBtYXBhXzUwJGBQb2ludCBGb3JlY2FzdGApLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgKwogIHNjYWxlX2ZpbGxfaWRlbnRpdHkoKSArICAjIFV0aWxpemFyIGxvcyBjb2xvcmVzIGRpcmVjdGFtZW50ZSBkZSBsYSBjb2x1bW5hICdjb2xvcicKICBleHBhbmRfbGltaXRzKHggPSBtYXBhXzUwJGxvbmcsIHkgPSBtYXBhXzUwJGxhdCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgbGFicyh0aXRsZSA9ICJNYXBhIGRlIHBvYmxhY2nDs24gcG9yIGVzdGFkbyBlbiBFc3RhZG9zIFVuaWRvcyBkZW50cm8gZGUgNTAgYcOxb3MiKQpgYGAKCgoK