library(ipumsr)
## Warning: package 'ipumsr' was built under R version 4.1.3
nhgis_ddi <- read_ipums_codebook("C:/Users/drayr/Downloads/nhgis0002_csv.zip")
nhgis <- read_nhgis(data_file = "C:/Users/drayr/Downloads/nhgis0002_csv.zip")
## Use of data from NHGIS is subject to conditions including that users should
## cite the data appropriately. Use command `ipums_conditions()` for more details.
##
##
## Reading data file...
nhgis<-haven::zap_labels(nhgis)
names(nhgis)<-tolower(names(nhgis))
library(sf)
## Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
holc <- st_read("C:/Users/drayr/Downloads/TXSanAntonio19XX/cartodb-query.shp")
## Reading layer `cartodb-query' from data source
## `C:\Users\drayr\Downloads\TXSanAntonio19XX\cartodb-query.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 20 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -98.57493 ymin: 29.35626 xmax: -98.43542 ymax: 29.49135
## Geodetic CRS: WGS 84
Load some other packages
library(survey, quietly = T)
## Warning: package 'survey' was built under R version 4.1.3
library(tidyverse, quietly = T)
library(car, quietly = T)
## Warning: package 'car' was built under R version 4.1.3
## Warning: package 'carData' was built under R version 4.1.3
library(ggplot2, quietly = T)
library(tigris, quietly = T)
library(classInt, quietly = T)
library(tmap, quietly = T)
library(raster)
Download geographic data for Census Tracts
options(tigris_class = "sf")
tract<-tracts(state = "TX",
county = 029,
year = 2020,
c = T)
##
|
| | 0%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 4%
|
|=== | 5%
|
|==== | 5%
|
|==== | 6%
|
|===== | 7%
|
|===== | 8%
|
|====== | 8%
|
|====== | 9%
|
|======= | 10%
|
|======= | 11%
|
|======== | 11%
|
|======== | 12%
|
|========= | 12%
|
|========= | 13%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 15%
|
|=========== | 16%
|
|============ | 17%
|
|============ | 18%
|
|============= | 18%
|
|============= | 19%
|
|============== | 19%
|
|============== | 20%
|
|=============== | 21%
|
|=============== | 22%
|
|================ | 23%
|
|================ | 24%
|
|================= | 24%
|
|================= | 25%
|
|================== | 26%
|
|=================== | 27%
|
|=================== | 28%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 29%
|
|===================== | 30%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 32%
|
|======================= | 33%
|
|======================= | 34%
|
|======================== | 34%
|
|======================== | 35%
|
|========================= | 35%
|
|========================= | 36%
|
|========================== | 37%
|
|=========================== | 38%
|
|=========================== | 39%
|
|============================ | 40%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 42%
|
|============================== | 43%
|
|=============================== | 44%
|
|=============================== | 45%
|
|================================ | 45%
|
|================================ | 46%
|
|================================= | 47%
|
|================================== | 48%
|
|=================================== | 49%
|
|=================================== | 50%
|
|=================================== | 51%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 53%
|
|====================================== | 54%
|
|====================================== | 55%
|
|======================================= | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|======================================== | 58%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 60%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 62%
|
|============================================ | 63%
|
|============================================ | 64%
|
|============================================= | 64%
|
|============================================= | 65%
|
|============================================== | 65%
|
|============================================== | 66%
|
|=============================================== | 66%
|
|=============================================== | 67%
|
|=============================================== | 68%
|
|================================================ | 69%
|
|================================================= | 70%
|
|================================================= | 71%
|
|================================================== | 71%
|
|================================================== | 72%
|
|=================================================== | 72%
|
|=================================================== | 73%
|
|==================================================== | 74%
|
|==================================================== | 75%
|
|===================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 78%
|
|======================================================= | 79%
|
|======================================================== | 80%
|
|======================================================== | 81%
|
|========================================================= | 81%
|
|========================================================= | 82%
|
|========================================================== | 82%
|
|========================================================== | 83%
|
|=========================================================== | 84%
|
|=========================================================== | 85%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|============================================================= | 87%
|
|============================================================= | 88%
|
|============================================================== | 88%
|
|============================================================== | 89%
|
|=============================================================== | 89%
|
|=============================================================== | 90%
|
|=============================================================== | 91%
|
|================================================================ | 91%
|
|================================================================= | 92%
|
|================================================================= | 93%
|
|================================================================== | 94%
|
|=================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 97%
|
|==================================================================== | 98%
|
|===================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 100%
plot(tract["GEOID"],
main = "Census Tracts in San Antonio")

plot(holc["holc_grade"],
main = "HOLC graded areas: San Antonio 1935")

Prepare variables
nhgis2 <- nhgis %>%
mutate( tot=u7e001,
hisp=u7e002,
nh=u7e003,
nhblk=u7e006,
nhwht=u7e005,
GEOID=geocode,
cofips=countya) %>%
filter(statea=="48" & countya=="029")%>%
dplyr:: select(GEOID, tot, hisp, nh,nhblk,nhwht,cofips)
#We need the county-level totals for the total population and each race group
codat<-nhgis2%>%
summarise(co_total=sum(tot), co_wht=sum(nhwht), co_blk=sum(nhblk), cohisp=sum(hisp))
codat$cofips="029"
#we merge the county data back to the tract data by the county FIPS code
merged<-left_join(x=nhgis2,y=codat, by="cofips")
#have a look and make sure it looks ok
head(merged)
#isolation index
tr.iso<-merged%>%
mutate(isoh=(hisp/cohisp * hisp/tot),
isob=(nhblk/co_blk * nhblk/tot),
isow=(nhwht/co_wht * nhwht/tot))%>%
group_by(cofips)#%>%
#summarise(iso_b= sum(isob, na.rm=T))
knitr::kable(head(nhgis2))
| 48029110100 |
3628 |
1639 |
1989 |
270 |
1400 |
029 |
| 48029110300 |
1950 |
1232 |
718 |
86 |
540 |
029 |
| 48029110500 |
1451 |
1191 |
260 |
80 |
139 |
029 |
| 48029110600 |
6664 |
4202 |
2462 |
811 |
1597 |
029 |
| 48029110700 |
1007 |
746 |
261 |
50 |
185 |
029 |
| 48029111000 |
2044 |
1135 |
909 |
115 |
668 |
029 |
join to geography
geo1<-left_join(tract, tr.iso, by=c("GEOID"= "GEOID"))
head(geo1)
geo2<-geo1%>%
mutate(
area=st_area(.))
geo2<-st_transform(geo2, crs=2278)
holc<-st_transform(holc, crs=2278)
Map layout
tmap_mode("view")
## tmap mode set to interactive viewing
holctract<-st_intersection(holc,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcAB<-holc%>%
filter(holc_grade== "A" | holc_grade=="B" )
holctractAB<-st_intersection(holcAB,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcCD<-holc%>%
filter(holc_grade== "C" | holc_grade=="D" )
holctractCD<-st_intersection(holcCD,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcA<-holc%>%
filter(holc_grade=="A")
holctractA<-st_intersection(holcA,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcB<-holc%>%
filter(holc_grade=="B")
holctractB<-st_intersection(holcB,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcC<-holc%>%
filter(holc_grade=="C")
holctractC<-st_intersection(holcC,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
holcD<-holc%>%
filter(holc_grade=="D")
holctractD<-st_intersection(holcD,geo2)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
#tmaptools::palette_explorer()
tmap_mode("view")
## tmap mode set to interactive viewing
#Hispanic isolation
tm_shape(holctract)+
tm_polygons(alpha=0, palette = "-viridis", n = 10, contrast = c(0.42, 1))+
tm_shape(holc)+
tm_polygons("holc_grade", alpha = .5, border.col = "red", lty= "solid")+
tm_layout(title="HOLC grades Layered on SA 2020 Census Tracts",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))
# tm_shape(holctract)+
# tm_polygons("isoh", palette = "-viridis", n = 10, contrast = c(0, 0.52))+
# tm_shape(holcCD)+
# tm_polygons("holc_grade",palette = "black", alpha = .3, border.col = "red", lty= "solid", ltw = 100)
#
#
# tm_shape(holctractAB)+
# tm_polygons("isoh")+
# tm_shape(holcAB)+
# tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
#
# tm_shape(holctractCD)+
# tm_polygons("isoh")+
# tm_shape(holcCD)+
# tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
#
# #White isolation
# tm_shape(holctract)+
# tm_polygons("isow", palette = "-viridis", n = 10, contrast = c(0, 0.52))+
# tm_shape(holcAB)+
# tm_polygons("holc_grade",palette = "black", alpha = .3, border.col = "red", lty= "solid", ltw = 100)
#
#
# tm_shape(holctractAB)+
# tm_polygons("isow")+
# tm_shape(holcAB)+
# tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
#
# tm_shape(holctractCD)+
# tm_polygons("isow")+
# tm_shape(holcCD)+
# tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
#
# tm_shape(holctractD)+
# tm_polygons("hisp")+
# tm_shape(holcD)+
# tm_polygons("holc_grade", alpha = 0, border.col = "red", lty= "solid")
Make a map layout
#tmaptools::palette_explorer()
#Hispanic isolation
tmap_mode("plot")
## tmap mode set to plotting
p1<-tm_shape(holctract)+
tm_polygons(c("isoh"),
title=c("Hispanic Isolation "),
palette="Blues",
style="quantile",
n=5)+
tm_scale_bar()+
tm_layout(title="Hispanic Isolation Index by Census Tract 2020",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_compass()+
tm_format("World",
legend.position = c("left", "bottom"),
main.title.position =c("center"))+
tm_shape(holcCD)+
tm_polygons("holc_grade",palette = "red", alpha = .3, border.col = "red", lty= "solid", ltw = 100)
p2<-tm_shape(holctract)+
tm_polygons(c("isow"),
title=c("White Isolation "),
palette="Greens",
style="quantile",
n=5)+
tm_scale_bar()+
tm_layout(title="White Isolation Index by Census Tract 2020",
title.size =1.5,
legend.frame = TRUE,
title.position = c('right', 'top'))+
tm_compass()+
tm_format("World",
legend.position = c("left", "bottom"),
main.title.position =c("center"))+
tm_shape(holcAB)+
tm_polygons("holc_grade",palette = "red", alpha = .3, border.col = "red", lty= "solid", ltw = 100)
tmap_arrange(p1,p2, nrow=1)

LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QgY29kZSBERU0gNzA5MyINCmF1dGhvcjogIkRhdmlkIFJvZHJpZ3VleiINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2hlaWdodDogNw0KICAgIGZpZ193aWR0aDogNw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGlwdW1zcikNCg0KbmhnaXNfZGRpIDwtIHJlYWRfaXB1bXNfY29kZWJvb2soIkM6L1VzZXJzL2RyYXlyL0Rvd25sb2Fkcy9uaGdpczAwMDJfY3N2LnppcCIpDQoNCm5oZ2lzIDwtIHJlYWRfbmhnaXMoZGF0YV9maWxlID0gIkM6L1VzZXJzL2RyYXlyL0Rvd25sb2Fkcy9uaGdpczAwMDJfY3N2LnppcCIpDQpuaGdpczwtaGF2ZW46OnphcF9sYWJlbHMobmhnaXMpIA0KbmFtZXMobmhnaXMpPC10b2xvd2VyKG5hbWVzKG5oZ2lzKSkNCg0KbGlicmFyeShzZikNCmhvbGMgPC0gc3RfcmVhZCgiQzovVXNlcnMvZHJheXIvRG93bmxvYWRzL1RYU2FuQW50b25pbzE5WFgvY2FydG9kYi1xdWVyeS5zaHAiKQ0KDQoNCmBgYA0KDQojIyBMb2FkIHNvbWUgb3RoZXIgcGFja2FnZXMNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShzdXJ2ZXksIHF1aWV0bHkgPSBUKQ0KbGlicmFyeSh0aWR5dmVyc2UsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShjYXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShnZ3Bsb3QyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGlncmlzLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoY2xhc3NJbnQsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeSh0bWFwLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkocmFzdGVyKQ0KDQpgYGANCg0KDQojIyMgRG93bmxvYWQgZ2VvZ3JhcGhpYyBkYXRhIGZvciBDZW5zdXMgVHJhY3RzDQoNCmBgYHtyfQ0Kb3B0aW9ucyh0aWdyaXNfY2xhc3MgPSAic2YiKQ0KdHJhY3Q8LXRyYWN0cyhzdGF0ZSA9ICJUWCIsDQogICAgICAgICAgICAgIGNvdW50eSA9IDAyOSwNCiAgICAgICAgICAgICB5ZWFyID0gMjAyMCwNCiAgICAgICAgICAgICBjID0gVCkNCg0KDQpwbG90KHRyYWN0WyJHRU9JRCJdLA0KICAgICBtYWluID0gIkNlbnN1cyBUcmFjdHMgaW4gU2FuIEFudG9uaW8iKQ0KDQoNCnBsb3QoaG9sY1siaG9sY19ncmFkZSJdLA0KICAgICBtYWluID0gIkhPTEMgZ3JhZGVkIGFyZWFzOiBTYW4gQW50b25pbyAxOTM1IikNCg0KYGBgDQoNCg0KIyMgUHJlcGFyZSB2YXJpYWJsZXMNCg0KYGBge3J9DQpuaGdpczIgPC0gbmhnaXMgJT4lDQogIG11dGF0ZSggdG90PXU3ZTAwMSwNCiAgICBoaXNwPXU3ZTAwMiwNCiAgICBuaD11N2UwMDMsDQogICAgbmhibGs9dTdlMDA2LA0KICAgIG5od2h0PXU3ZTAwNSwNCiAgICBHRU9JRD1nZW9jb2RlLA0KICAgIGNvZmlwcz1jb3VudHlhKSAlPiUNCiAgZmlsdGVyKHN0YXRlYT09IjQ4IiAmIGNvdW50eWE9PSIwMjkiKSU+JQ0KICAgZHBseXI6OiBzZWxlY3QoR0VPSUQsIHRvdCwgaGlzcCwgbmgsbmhibGssbmh3aHQsY29maXBzKQ0KDQoNCiNXZSBuZWVkIHRoZSBjb3VudHktbGV2ZWwgdG90YWxzIGZvciB0aGUgdG90YWwgcG9wdWxhdGlvbiBhbmQgZWFjaCByYWNlIGdyb3VwDQpjb2RhdDwtbmhnaXMyJT4lDQogIHN1bW1hcmlzZShjb190b3RhbD1zdW0odG90KSwgY29fd2h0PXN1bShuaHdodCksIGNvX2Jsaz1zdW0obmhibGspLCBjb2hpc3A9c3VtKGhpc3ApKQ0KY29kYXQkY29maXBzPSIwMjkiDQoNCiN3ZSBtZXJnZSB0aGUgY291bnR5IGRhdGEgYmFjayB0byB0aGUgdHJhY3QgZGF0YSBieSB0aGUgY291bnR5IEZJUFMgY29kZQ0KbWVyZ2VkPC1sZWZ0X2pvaW4oeD1uaGdpczIseT1jb2RhdCwgYnk9ImNvZmlwcyIpDQojaGF2ZSBhIGxvb2sgYW5kIG1ha2Ugc3VyZSBpdCBsb29rcyBvaw0KaGVhZChtZXJnZWQpDQoNCiNpc29sYXRpb24gaW5kZXgNCnRyLmlzbzwtbWVyZ2VkJT4lDQogIG11dGF0ZShpc29oPShoaXNwL2NvaGlzcCAqIGhpc3AvdG90KSwNCiAgICAgICAgIGlzb2I9KG5oYmxrL2NvX2JsayAqIG5oYmxrL3RvdCksDQogICAgICAgICBpc293PShuaHdodC9jb193aHQgKiBuaHdodC90b3QpKSU+JQ0KICBncm91cF9ieShjb2ZpcHMpIyU+JQ0KICAjc3VtbWFyaXNlKGlzb19iPSBzdW0oaXNvYiwgbmEucm09VCkpDQoNCmtuaXRyOjprYWJsZShoZWFkKG5oZ2lzMikpDQoNCmBgYA0KDQoNCiMjIGpvaW4gdG8gZ2VvZ3JhcGh5DQoNCmBgYHtyfQ0KDQpnZW8xPC1sZWZ0X2pvaW4odHJhY3QsIHRyLmlzbywgYnk9YygiR0VPSUQiPSAiR0VPSUQiKSkNCmhlYWQoZ2VvMSkNCg0KZ2VvMjwtZ2VvMSU+JQ0KICAgbXV0YXRlKCANCiAgICBhcmVhPXN0X2FyZWEoLikpICAgDQoNCmdlbzI8LXN0X3RyYW5zZm9ybShnZW8yLCBjcnM9MjI3OCkNCmhvbGM8LXN0X3RyYW5zZm9ybShob2xjLCBjcnM9MjI3OCkNCmBgYA0KDQojIyBNYXAgbGF5b3V0DQoNCmBgYHtyfQ0KdG1hcF9tb2RlKCJ2aWV3IikNCg0KaG9sY3RyYWN0PC1zdF9pbnRlcnNlY3Rpb24oaG9sYyxnZW8yKQ0KDQpob2xjQUI8LWhvbGMlPiUNCiAgZmlsdGVyKGhvbGNfZ3JhZGU9PSAiQSIgfCBob2xjX2dyYWRlPT0iQiIgKQ0KaG9sY3RyYWN0QUI8LXN0X2ludGVyc2VjdGlvbihob2xjQUIsZ2VvMikNCg0KaG9sY0NEPC1ob2xjJT4lDQogIGZpbHRlcihob2xjX2dyYWRlPT0gIkMiIHwgaG9sY19ncmFkZT09IkQiICkNCmhvbGN0cmFjdENEPC1zdF9pbnRlcnNlY3Rpb24oaG9sY0NELGdlbzIpDQoNCg0KDQpob2xjQTwtaG9sYyU+JQ0KICBmaWx0ZXIoaG9sY19ncmFkZT09IkEiKQ0KaG9sY3RyYWN0QTwtc3RfaW50ZXJzZWN0aW9uKGhvbGNBLGdlbzIpDQoNCmhvbGNCPC1ob2xjJT4lDQogIGZpbHRlcihob2xjX2dyYWRlPT0iQiIpDQpob2xjdHJhY3RCPC1zdF9pbnRlcnNlY3Rpb24oaG9sY0IsZ2VvMikNCg0KaG9sY0M8LWhvbGMlPiUNCiAgZmlsdGVyKGhvbGNfZ3JhZGU9PSJDIikNCmhvbGN0cmFjdEM8LXN0X2ludGVyc2VjdGlvbihob2xjQyxnZW8yKQ0KDQpob2xjRDwtaG9sYyU+JQ0KICBmaWx0ZXIoaG9sY19ncmFkZT09IkQiKQ0KaG9sY3RyYWN0RDwtc3RfaW50ZXJzZWN0aW9uKGhvbGNELGdlbzIpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiN0bWFwdG9vbHM6OnBhbGV0dGVfZXhwbG9yZXIoKQ0KdG1hcF9tb2RlKCJ2aWV3IikNCiNIaXNwYW5pYyBpc29sYXRpb24NCg0KdG1fc2hhcGUoaG9sY3RyYWN0KSsNCiAgdG1fcG9seWdvbnMoYWxwaGE9MCwgcGFsZXR0ZSA9ICItdmlyaWRpcyIsIG4gPSAxMCwgY29udHJhc3QgPSBjKDAuNDIsIDEpKSsNCiAgdG1fc2hhcGUoaG9sYykrDQogIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAuNSwgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIpKw0KICB0bV9sYXlvdXQodGl0bGU9IkhPTEMgZ3JhZGVzIExheWVyZWQgb24gU0EgMjAyMCBDZW5zdXMgVHJhY3RzIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKQ0KDQojIHRtX3NoYXBlKGhvbGN0cmFjdCkrDQojICAgIHRtX3BvbHlnb25zKCJpc29oIiwgcGFsZXR0ZSA9ICItdmlyaWRpcyIsIG4gPSAxMCwgY29udHJhc3QgPSBjKDAsIDAuNTIpKSsNCiMgICB0bV9zaGFwZShob2xjQ0QpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIixwYWxldHRlID0gImJsYWNrIiwgYWxwaGEgPSAuMywgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIsIGx0dyA9IDEwMCkNCiMgDQojIA0KIyB0bV9zaGFwZShob2xjdHJhY3RBQikrDQojICAgdG1fcG9seWdvbnMoImlzb2giKSsNCiMgICB0bV9zaGFwZShob2xjQUIpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAwLCBib3JkZXIuY29sID0gInJlZCIsIGx0eT0gInNvbGlkIikNCiMgDQojIHRtX3NoYXBlKGhvbGN0cmFjdENEKSsNCiMgICB0bV9wb2x5Z29ucygiaXNvaCIpKw0KIyAgIHRtX3NoYXBlKGhvbGNDRCkrDQojICAgdG1fcG9seWdvbnMoImhvbGNfZ3JhZGUiLCBhbHBoYSA9IDAsIGJvcmRlci5jb2wgPSAicmVkIiwgbHR5PSAic29saWQiKQ0KIyANCiMgI1doaXRlIGlzb2xhdGlvbg0KIyB0bV9zaGFwZShob2xjdHJhY3QpKw0KIyAgICB0bV9wb2x5Z29ucygiaXNvdyIsIHBhbGV0dGUgPSAiLXZpcmlkaXMiLCBuID0gMTAsIGNvbnRyYXN0ID0gYygwLCAwLjUyKSkrDQojICAgdG1fc2hhcGUoaG9sY0FCKSsNCiMgICB0bV9wb2x5Z29ucygiaG9sY19ncmFkZSIscGFsZXR0ZSA9ICJibGFjayIsIGFscGhhID0gLjMsIGJvcmRlci5jb2wgPSAicmVkIiwgbHR5PSAic29saWQiLCBsdHcgPSAxMDApDQojIA0KIyANCiMgdG1fc2hhcGUoaG9sY3RyYWN0QUIpKw0KIyAgIHRtX3BvbHlnb25zKCJpc293IikrDQojICAgdG1fc2hhcGUoaG9sY0FCKSsNCiMgICB0bV9wb2x5Z29ucygiaG9sY19ncmFkZSIsIGFscGhhID0gMCwgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIpDQojIA0KIyB0bV9zaGFwZShob2xjdHJhY3RDRCkrDQojICAgdG1fcG9seWdvbnMoImlzb3ciKSsNCiMgICB0bV9zaGFwZShob2xjQ0QpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAwLCBib3JkZXIuY29sID0gInJlZCIsIGx0eT0gInNvbGlkIikNCiMgDQojIHRtX3NoYXBlKGhvbGN0cmFjdEQpKw0KIyAgIHRtX3BvbHlnb25zKCJoaXNwIikrDQojICAgdG1fc2hhcGUoaG9sY0QpKw0KIyAgIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIiwgYWxwaGEgPSAwLCBib3JkZXIuY29sID0gInJlZCIsIGx0eT0gInNvbGlkIikNCg0KYGBgDQoNCiMjIE1ha2UgYSBtYXAgbGF5b3V0DQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQoNCg0KI3RtYXB0b29sczo6cGFsZXR0ZV9leHBsb3JlcigpDQojSGlzcGFuaWMgaXNvbGF0aW9uDQoNCnRtYXBfbW9kZSgicGxvdCIpDQpwMTwtdG1fc2hhcGUoaG9sY3RyYWN0KSsNCiAgdG1fcG9seWdvbnMoYygiaXNvaCIpLA0KICAgICAgICAgICAgICB0aXRsZT1jKCJIaXNwYW5pYyBJc29sYXRpb24gIiksDQogICAgICAgICAgICAgIHBhbGV0dGU9IkJsdWVzIiwNCiAgICAgICAgICAgICAgc3R5bGU9InF1YW50aWxlIiwNCiAgICAgICAgICAgICAgbj01KSsNCiAgdG1fc2NhbGVfYmFyKCkrDQogIHRtX2xheW91dCh0aXRsZT0iSGlzcGFuaWMgSXNvbGF0aW9uIEluZGV4IGJ5IENlbnN1cyBUcmFjdCAyMDIwIiwNCiAgICAgICAgICAgIHRpdGxlLnNpemUgPTEuNSwNCiAgICAgICAgICAgIGxlZ2VuZC5mcmFtZSA9IFRSVUUsDQogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoJ3JpZ2h0JywgJ3RvcCcpKSsNCiAgdG1fY29tcGFzcygpKw0KICB0bV9mb3JtYXQoIldvcmxkIiwNCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICBjKCJsZWZ0IiwgImJvdHRvbSIpLA0KICAgICAgICAgICAgbWFpbi50aXRsZS5wb3NpdGlvbiA9YygiY2VudGVyIikpKw0KICAgIHRtX3NoYXBlKGhvbGNDRCkrDQogIHRtX3BvbHlnb25zKCJob2xjX2dyYWRlIixwYWxldHRlID0gInJlZCIsIGFscGhhID0gLjMsIGJvcmRlci5jb2wgPSAicmVkIiwgbHR5PSAic29saWQiLCBsdHcgPSAxMDApDQoNCg0KcDI8LXRtX3NoYXBlKGhvbGN0cmFjdCkrDQogIHRtX3BvbHlnb25zKGMoImlzb3ciKSwNCiAgICAgICAgICAgICAgdGl0bGU9YygiV2hpdGUgSXNvbGF0aW9uICIpLA0KICAgICAgICAgICAgICBwYWxldHRlPSJHcmVlbnMiLA0KICAgICAgICAgICAgICBzdHlsZT0icXVhbnRpbGUiLA0KICAgICAgICAgICAgICBuPTUpKw0KICB0bV9zY2FsZV9iYXIoKSsNCiAgdG1fbGF5b3V0KHRpdGxlPSJXaGl0ZSBJc29sYXRpb24gSW5kZXggYnkgQ2Vuc3VzIFRyYWN0IDIwMjAiLA0KICAgICAgICAgICAgdGl0bGUuc2l6ZSA9MS41LA0KICAgICAgICAgICAgbGVnZW5kLmZyYW1lID0gVFJVRSwNCiAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gYygncmlnaHQnLCAndG9wJykpKw0KICB0bV9jb21wYXNzKCkrDQogIHRtX2Zvcm1hdCgiV29ybGQiLA0KICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIGMoImxlZnQiLCAiYm90dG9tIiksDQogICAgICAgICAgICBtYWluLnRpdGxlLnBvc2l0aW9uID1jKCJjZW50ZXIiKSkrDQogICAgdG1fc2hhcGUoaG9sY0FCKSsNCiAgdG1fcG9seWdvbnMoImhvbGNfZ3JhZGUiLHBhbGV0dGUgPSAicmVkIiwgYWxwaGEgPSAuMywgYm9yZGVyLmNvbCA9ICJyZWQiLCBsdHk9ICJzb2xpZCIsIGx0dyA9IDEwMCkNCg0KDQp0bWFwX2FycmFuZ2UocDEscDIsIG5yb3c9MSkNCg0KDQpgYGANCg0KDQoNCg0K