1 Gas Station Point of Compromise

The original “Gas Station - Point of Compromised (POC)” data set contained 72,798 observations. A random 500 observations were selected to display on the map below based on the latitude and longitude of the observation. Size of marker and color of marker are proportional to the number of POCs in the ZIP code.

Using the hover over each of the markers it displays State, County, Address, Zip Code, and Area Type. Viewing these descriptions it is clear there are more POCs in “urban” areas as opposed to “urban” areas. This data correlates with the more populated regions of the United States.

#Import data
poc<- read.csv("https://tkelleman.github.io/tkweb/Week7/POC.csv")
#Select 500 observations at random
poc.rand500<-poc[sample(nrow(poc),500),]


geostyle<- list(scope = 'usa',
              projection = list(type = 'albers usa'),
              showland = TRUE,
              landcolor = toRGB("gray95"),
              subunitcolor = toRGB("gray85"),
              countrycolor = toRGB("gray85"),
              countrywidth = 0.5,
              subunitwidth = 0.5
            )
map<- plot_geo(poc.rand500, lat = ~ycoord, lon = ~xcoord) %>% 
  add_markers(text = ~paste("State:", STATE, 
                            "<br>County:", county, 
                            "<br>Address:", ADDRESS, 
                            "<br>Zip Code:", ZIPnew,
                            "<br>Area Type:", description
                            ),
              color = ~ZIPPOC, 
              symbol = "circle", 
              size = ~ZIPPOC, 
              hoverinfo = "text")   %>% 
  colorbar(title = "Number of POC <br>at each Zip Code")  %>% 
  layout( title = 'Gas Station - Point of Compromise', 
          geo = geostyle)
map


2 Philadelphia Crime Data

To generate the appropriate subset of data from the original “Philly Crime Data (2015-2024)” data set the incomplete observations were removed using na.omit. The date needed to be extracted using the “lubridate” package. Once the date was properly formatted, the data was filtered to include only observations from the year 2023.

In this map it is clear that “nonfatal” crimes are more common than “fatal” in Philadelphia, but there isn’t much a of a trend based on neighborhood. There are however some pockets within the city without any observations that indicate they are either safer areas of the city or lacking data.

#Import data
#Read the Philly Crime data
phillyCrime <- na.omit(read.csv("https://tkelleman.github.io/tkweb/Week7/PhillyCrimeSince2015.csv"))

# Extract the year from the date
y <- mdy_hm(phillyCrime$date)
phillyCrime$year <- year(y)

# Filter data for 2023
phillyCrime.2023 <- filter(phillyCrime, year == 2023)


phillyCrime.2023$color <- ifelse(phillyCrime.2023$fatal == "Fatal", "#118ab2", "#ffd166")

label.msg<- label.msg <- paste("Neighborhood:", phillyCrime.2023$neighborhood,    
                   "<br> Zip Code:", phillyCrime.2023$zip_code, 
                   "<br> Street Name:", phillyCrime.2023$street_name)

# Create leaflet map
leaflet(phillyCrime.2023) %>%
  addProviderTiles(providers$OpenStreetMap) %>% 
  setView(
            lng = mean(phillyCrime.2023$lng), 
            lat = mean(phillyCrime.2023$lat), 
            zoom = 11) %>%
  addCircleMarkers(
            color = "black",
            fillColor = ~color,
            #radius = 
            stroke = TRUE, 
            weight = 1,
            fillOpacity = 0.8,
            label = label.msg)  %>%
  addLegend(
            position = "bottomright", 
            colors = c("#118ab2", "#ffd166"),
            labels= c("Fatal", "Nonfatal"),
            title= "Fatal & Nonfatal Crimes in Philadelphia",
            opacity = 0.6) %>%
  addControl(
            html = "<div class='map-title'>Leaflet Map of Crime in Philadelphia <br>by Fatal and Nonfatal   Crimes</div>",
            position = "topleft"
  )
LS0tDQp0aXRsZTogIldlZWsgNyAtIFIgTWFwcyBmb3IgVmlzdWFsaXppbmcgU3BhdGlvbiBJbmZvcm1hdGlvbiINCmF1dGhvcjogIlRpbSBLZWxsZW1hbiINCmRhdGU6ICIyMDI0LTAzLTIwIg0KDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogbm8NCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogOA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgIA0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogbm8NCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQpkaXYjVE9DIGE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KZGl2I1RPQyBhOmxpbmsgew0KICBjb2xvcjogYmx1ZTsNCn0NCg0KDQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IA0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsNCiAgICBmb250LXNpemU6IDI0cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiBzZWxlY3RlZCBsaW5rICovDQphOmFjdGl2ZSB7DQogIGNvbG9yOiB5ZWxsb3c7DQp9DQo8L3N0eWxlPg0KYGBgDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCiAgIGxpYnJhcnkoY293cGxvdCkNCn0NCmlmICghcmVxdWlyZSgibGF0ZXgyZXhwIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxhdGV4MmV4cCIpDQogICBsaWJyYXJ5KGxhdGV4MmV4cCkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgicG5nIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKSAgICAgICAgICAgICAjIEluc3RhbGwgcG5nIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJwbmciKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQojIyMgZ2dwbG90IGFuZCBleHRlbnNpb25zDQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dwbG90MiIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdncmlkZ2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3JpZGdlcyIpDQp9DQppZiAoIXJlcXVpcmUoImdyYXBoaWNzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJncmFwaGljcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJncmFwaGljcyIpDQp9DQppZiAoIXJlcXVpcmUoImRwbHlyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJkcGx5ciIpDQp9DQppZiAoIXJlcXVpcmUoImx1YnJpZGF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImx1YnJpZGF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXAiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRtYXAiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcCIpDQp9DQppZiAoIXJlcXVpcmUoInNmIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJzZiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzZiIpDQp9DQoNCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KIyBHYXMgU3RhdGlvbiBQb2ludCBvZiBDb21wcm9taXNlIHsudGFic2V0fQ0KVGhlIG9yaWdpbmFsIOKAnEdhcyBTdGF0aW9uIC0gUG9pbnQgb2YgQ29tcHJvbWlzZWQgKFBPQynigJ0gZGF0YSBzZXQgY29udGFpbmVkIDcyLDc5OCBvYnNlcnZhdGlvbnMuIEEgcmFuZG9tIDUwMCBvYnNlcnZhdGlvbnMgd2VyZSBzZWxlY3RlZCB0byBkaXNwbGF5IG9uIHRoZSBtYXAgYmVsb3cgYmFzZWQgb24gdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgb2YgdGhlIG9ic2VydmF0aW9uLiBTaXplIG9mIG1hcmtlciBhbmQgY29sb3Igb2YgbWFya2VyIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBQT0NzIGluIHRoZSBaSVAgY29kZS4gDQo8YnI+DQo8YnI+DQpVc2luZyB0aGUgaG92ZXIgb3ZlciBlYWNoIG9mIHRoZSBtYXJrZXJzIGl0IGRpc3BsYXlzIFN0YXRlLCBDb3VudHksIEFkZHJlc3MsIFppcCBDb2RlLCBhbmQgQXJlYSBUeXBlLiBWaWV3aW5nIHRoZXNlIGRlc2NyaXB0aW9ucyBpdCBpcyBjbGVhciB0aGVyZSBhcmUgbW9yZSBQT0NzIGluICJ1cmJhbiIgYXJlYXMgYXMgb3Bwb3NlZCB0byAidXJiYW4iIGFyZWFzLiBUaGlzIGRhdGEgY29ycmVsYXRlcyB3aXRoIHRoZSBtb3JlIHBvcHVsYXRlZCByZWdpb25zIG9mIHRoZSBVbml0ZWQgU3RhdGVzLg0KYGBge3IgZXZhbD1UUlVFfQ0KI0ltcG9ydCBkYXRhDQpwb2M8LSByZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs3L1BPQy5jc3YiKQ0KI1NlbGVjdCA1MDAgb2JzZXJ2YXRpb25zIGF0IHJhbmRvbQ0KcG9jLnJhbmQ1MDA8LXBvY1tzYW1wbGUobnJvdyhwb2MpLDUwMCksXQ0KDQoNCmdlb3N0eWxlPC0gbGlzdChzY29wZSA9ICd1c2EnLA0KICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gbGlzdCh0eXBlID0gJ2FsYmVycyB1c2EnKSwNCiAgICAgICAgICAgICAgc2hvd2xhbmQgPSBUUlVFLA0KICAgICAgICAgICAgICBsYW5kY29sb3IgPSB0b1JHQigiZ3JheTk1IiksDQogICAgICAgICAgICAgIHN1YnVuaXRjb2xvciA9IHRvUkdCKCJncmF5ODUiKSwNCiAgICAgICAgICAgICAgY291bnRyeWNvbG9yID0gdG9SR0IoImdyYXk4NSIpLA0KICAgICAgICAgICAgICBjb3VudHJ5d2lkdGggPSAwLjUsDQogICAgICAgICAgICAgIHN1YnVuaXR3aWR0aCA9IDAuNQ0KICAgICAgICAgICAgKQ0KbWFwPC0gcGxvdF9nZW8ocG9jLnJhbmQ1MDAsIGxhdCA9IH55Y29vcmQsIGxvbiA9IH54Y29vcmQpICU+JSANCiAgYWRkX21hcmtlcnModGV4dCA9IH5wYXN0ZSgiU3RhdGU6IiwgU1RBVEUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+Q291bnR5OiIsIGNvdW50eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5BZGRyZXNzOiIsIEFERFJFU1MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+WmlwIENvZGU6IiwgWklQbmV3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+QXJlYSBUeXBlOiIsIGRlc2NyaXB0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgY29sb3IgPSB+WklQUE9DLCANCiAgICAgICAgICAgICAgc3ltYm9sID0gImNpcmNsZSIsIA0KICAgICAgICAgICAgICBzaXplID0gflpJUFBPQywgDQogICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IikgICAlPiUgDQogIGNvbG9yYmFyKHRpdGxlID0gIk51bWJlciBvZiBQT0MgPGJyPmF0IGVhY2ggWmlwIENvZGUiKSAgJT4lIA0KICBsYXlvdXQoIHRpdGxlID0gJ0dhcyBTdGF0aW9uIC0gUG9pbnQgb2YgQ29tcHJvbWlzZScsIA0KICAgICAgICAgIGdlbyA9IGdlb3N0eWxlKQ0KbWFwDQpgYGANCjxicj4NCg0KIyBQaGlsYWRlbHBoaWEgQ3JpbWUgRGF0YSB7LnRhYnNldH0NClRvIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBzdWJzZXQgb2YgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCDigJxQaGlsbHkgQ3JpbWUgRGF0YSAoMjAxNS0yMDI0KeKAnSBkYXRhIHNldCB0aGUgaW5jb21wbGV0ZSBvYnNlcnZhdGlvbnMgd2VyZSByZW1vdmVkIHVzaW5nIG5hLm9taXQuICBUaGUgZGF0ZSBuZWVkZWQgdG8gYmUgZXh0cmFjdGVkIHVzaW5nIHRoZSDigJxsdWJyaWRhdGXigJ0gcGFja2FnZS4gT25jZSB0aGUgZGF0ZSB3YXMgcHJvcGVybHkgZm9ybWF0dGVkLCB0aGUgZGF0YSB3YXMgZmlsdGVyZWQgdG8gaW5jbHVkZSBvbmx5IG9ic2VydmF0aW9ucyBmcm9tIHRoZSB5ZWFyIDIwMjMuIA0KPGJyPg0KPGJyPg0KSW4gdGhpcyBtYXAgaXQgaXMgY2xlYXIgdGhhdCDigJxub25mYXRhbOKAnSBjcmltZXMgYXJlIG1vcmUgY29tbW9uIHRoYW4g4oCcZmF0YWzigJ0gaW4gUGhpbGFkZWxwaGlhLCBidXQgdGhlcmUgaXNu4oCZdCBtdWNoIGEgb2YgYSB0cmVuZCBiYXNlZCBvbiBuZWlnaGJvcmhvb2QuIFRoZXJlIGFyZSBob3dldmVyIHNvbWUgcG9ja2V0cyB3aXRoaW4gdGhlIGNpdHkgd2l0aG91dCBhbnkgb2JzZXJ2YXRpb25zIHRoYXQgaW5kaWNhdGUgdGhleSBhcmUgZWl0aGVyIHNhZmVyIGFyZWFzIG9mIHRoZSBjaXR5IG9yIGxhY2tpbmcgZGF0YS4NCmBgYHtyIGV2YWw9VFJVRX0NCiNJbXBvcnQgZGF0YQ0KI1JlYWQgdGhlIFBoaWxseSBDcmltZSBkYXRhDQpwaGlsbHlDcmltZSA8LSBuYS5vbWl0KHJlYWQuY3N2KCJodHRwczovL3RrZWxsZW1hbi5naXRodWIuaW8vdGt3ZWIvV2VlazcvUGhpbGx5Q3JpbWVTaW5jZTIwMTUuY3N2IikpDQoNCiMgRXh0cmFjdCB0aGUgeWVhciBmcm9tIHRoZSBkYXRlDQp5IDwtIG1keV9obShwaGlsbHlDcmltZSRkYXRlKQ0KcGhpbGx5Q3JpbWUkeWVhciA8LSB5ZWFyKHkpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIDIwMjMNCnBoaWxseUNyaW1lLjIwMjMgPC0gZmlsdGVyKHBoaWxseUNyaW1lLCB5ZWFyID09IDIwMjMpDQoNCg0KcGhpbGx5Q3JpbWUuMjAyMyRjb2xvciA8LSBpZmVsc2UocGhpbGx5Q3JpbWUuMjAyMyRmYXRhbCA9PSAiRmF0YWwiLCAiIzExOGFiMiIsICIjZmZkMTY2IikNCg0KbGFiZWwubXNnPC0gbGFiZWwubXNnIDwtIHBhc3RlKCJOZWlnaGJvcmhvb2Q6IiwgcGhpbGx5Q3JpbWUuMjAyMyRuZWlnaGJvcmhvb2QsICAgIA0KICAgICAgICAgICAgICAgICAgICI8YnI+IFppcCBDb2RlOiIsIHBoaWxseUNyaW1lLjIwMjMkemlwX2NvZGUsIA0KICAgICAgICAgICAgICAgICAgICI8YnI+IFN0cmVldCBOYW1lOiIsIHBoaWxseUNyaW1lLjIwMjMkc3RyZWV0X25hbWUpDQoNCiMgQ3JlYXRlIGxlYWZsZXQgbWFwDQpsZWFmbGV0KHBoaWxseUNyaW1lLjIwMjMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKSAlPiUgDQogIHNldFZpZXcoDQogICAgICAgICAgICBsbmcgPSBtZWFuKHBoaWxseUNyaW1lLjIwMjMkbG5nKSwgDQogICAgICAgICAgICBsYXQgPSBtZWFuKHBoaWxseUNyaW1lLjIwMjMkbGF0KSwgDQogICAgICAgICAgICB6b29tID0gMTEpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgZmlsbENvbG9yID0gfmNvbG9yLA0KICAgICAgICAgICAgI3JhZGl1cyA9IA0KICAgICAgICAgICAgc3Ryb2tlID0gVFJVRSwgDQogICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjgsDQogICAgICAgICAgICBsYWJlbCA9IGxhYmVsLm1zZykgICU+JQ0KICBhZGRMZWdlbmQoDQogICAgICAgICAgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsIA0KICAgICAgICAgICAgY29sb3JzID0gYygiIzExOGFiMiIsICIjZmZkMTY2IiksDQogICAgICAgICAgICBsYWJlbHM9IGMoIkZhdGFsIiwgIk5vbmZhdGFsIiksDQogICAgICAgICAgICB0aXRsZT0gIkZhdGFsICYgTm9uZmF0YWwgQ3JpbWVzIGluIFBoaWxhZGVscGhpYSIsDQogICAgICAgICAgICBvcGFjaXR5ID0gMC42KSAlPiUNCiAgYWRkQ29udHJvbCgNCiAgICAgICAgICAgIGh0bWwgPSAiPGRpdiBjbGFzcz0nbWFwLXRpdGxlJz5MZWFmbGV0IE1hcCBvZiBDcmltZSBpbiBQaGlsYWRlbHBoaWEgPGJyPmJ5IEZhdGFsIGFuZCBOb25mYXRhbCAgIENyaW1lczwvZGl2PiIsDQogICAgICAgICAgICBwb3NpdGlvbiA9ICJ0b3BsZWZ0Ig0KICApDQpgYGA=