Cases, Variables, and Values

A data table is comprised of cases and variables.

Each variable comprises values (or levels).

There is no hard distinction between a variable and a value. What’s a variable in one situation may be a value in another, and vice versa.

A data table

Beckmans

Cases, Variables, and Values

Two formats

Narrow

Q: What IS different? Q: What is NOT different?

Beckmans %>% 
  pivot_longer(cols = c(indoors, outdoors, tv, breakfast), 
               names_to = "type", values_to = "preference")

(Too) Narrow

None of the data has actually been lost, but it’s not a helpful form since there isn’t a useful definition of “case”.

Wide

So what?

Note about terms “wide” and “narrow”

It’s actually possible for a “wider” form of the data and a “narrow” form of the data to have the same number of columns! For example, when the “key” only has two outcomes.

# this is "wide"--with 5 variables
Beckmans %>%
  select(who, age, sex, indoors, outdoors)
# this is "narrow"--with 5 variables
Beckmans %>% 
  select(who, age, sex, indoors, outdoors) %>%
  pivot_longer(cols = c(indoors, outdoors), names_to = "type", values_to = "preference")
NA

Excerpt from BabyNames

Questions:

RQ 1. How many babies of each name and sex? RQ 2. For each name, is it primarily given to girls or boys? Which names are gender neutral?

In narrow format

data("BabyNames", package = "dcData")

BabyNames <- 
  BabyNames %>%
  filter( name %in% c("Eden", "Jack", "Hazel")) 

RQ 1. How many babies of each name and sex?

BabyTotals <-
  BabyNames %>%
  group_by(name, sex) %>%
  summarise(total = sum(count, na.rm = TRUE))
`summarise()` has grouped output by 'name'. You can override using the `.groups` argument.

Easy!

In Wide format

RQ 2. Which names are most gender neutral?

WideOutput <- 
  NarrowInput %>% 
  pivot_wider(names_from = var1, values_from = var2, values_fill = 0)
BabyTotalsWide <- 
  BabyTotals %>% 
  pivot_wider(names_from = sex, values_from = total, values_fill = 0)

BabyTotalsWide

With sexes side by side…

We can easily calculate balance associated with names


BabyTotalsWide <- 
  BabyTotalsWide %>% 
  rename(fem = F, male = M) %>%         # `F` is a terrible variable name (why?)
  mutate(prop_fem  = fem  / (male + fem), 
         prop_male = male / (male + fem),
         name_specificity = pmax(prop_fem, prop_male))    # what does `pmax()` do?

BabyTotalsWide

pivot_longer( )—when you have “Wide” and want “Narrow”

Syntax:

NarrowOutput <- 
  WideInput %>% 
  pivot_longer(cols = c(wide_var1, wide_var2, ...), names_to = "long_var1", values_to "long_var2")
BabyTotalsNarrow <- 
  BabyTotalsWide %>% 
  select(prop_fem, prop_male) %>%
  pivot_longer(cols = c(prop_fem, prop_male), names_to = "sex", values_to = "proportion") 
Adding missing grouping variables: `name`
BabyTotalsNarrow

With sexes stacked again…

We can make an intuitive bar chart (though some clean up is needed…)

BabyTotalsNarrow %>%
  ggplot() + 
  geom_bar(aes(x = name, fill = sex, weight = proportion)) 

NA

With some improvements

  • clean up labels of sexes
  • add title, source, & better axis labels (default y-axis label was flat wrong)
# first, clean up the labels in `sex` for plotting
BabyTotalsNarrow %>%
  mutate(sex = if_else(sex == "prop_fem", 
                       true = "female", 
                       false = if_else(sex == "prop_male", 
                                       true = "male", 
                                       false = "unk")  # end of "inner" if_else()
                       )                               # ends the "outer" if_else()
         ) %>%                                         # ends the mutate() 
  ggplot() + 
  geom_bar(aes(x = name, fill = sex, weight = proportion)) + 
  ggtitle("Gender Balance among Names of Beckman Kids", 
          subtitle = "source: U.S. Social Security Administration") + 
  xlab("Name") + 
  ylab("Proportion")

NA
LS0tCnRpdGxlOiAiUmVkZWZpbmluZyByb3dzOiBXaWRlIHZzIG5hcnJvdyBkYXRhIG9yZ2FuaXphdGlvbiIKc3VidGl0bGU6ICJEYXRhIENvbXB1dGluZyBDaGFwdGVyIDEyIgphdXRob3I6ICJQcm9mIE1hdHRoZXcgQmVja21hbiIKb3V0cHV0OiAKICBzbGlkeV9wcmVzZW50YXRpb246IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocHJpbnRyKQpsaWJyYXJ5KG1vc2FpYykKbGlicmFyeShkY0RhdGEpCm9wdGlvbnMod2lkdGggPSA4MCkKYGBgCgojIyBDYXNlcywgVmFyaWFibGVzLCBhbmQgVmFsdWVzCgpBIGRhdGEgdGFibGUgaXMgY29tcHJpc2VkIG9mICpjYXNlcyogYW5kICp2YXJpYWJsZXMqLgoKRWFjaCAqdmFyaWFibGUqIGNvbXByaXNlcyAqdmFsdWVzKiAob3IgbGV2ZWxzKS4KClRoZXJlIGlzIG5vIGhhcmQgZGlzdGluY3Rpb24gYmV0d2VlbiBhIHZhcmlhYmxlIGFuZCBhIHZhbHVlLiAgV2hhdCdzIGEgdmFyaWFibGUgaW4gb25lIHNpdHVhdGlvbiBtYXkgYmUgYSB2YWx1ZSBpbiBhbm90aGVyLCBhbmQgdmljZSB2ZXJzYS4KCmBgYHtyIGVjaG89RkFMU0V9CgpCZWNrbWFucyA8LSAKICB0cmliYmxlKH53aG8sIH5hZ2UsIH5zZXgsIH5pbmRvb3JzLCB+b3V0ZG9vcnMsIH50diwgfmJyZWFrZmFzdCwgCiAgICAgICAgICAiRWRlbiIsIDExLCAiRiIsICJHYW1pbmciLCAiU3dpbW1pbmciLCAiQUZWIiwgInNhbmR3aWNoIiwgCiAgICAgICAgICAiSmFjayIsIDgsICJNIiwgIkxlZ29zIiwgIkNhbXBpbmciLCAiSGF3a2V5ZSIsICJjZXJlYWwiLAogICAgICAgICAgIkhhemVsIiwgNCwgIkYiLCAiUHV6emxlcyIsICJQbGF5Z3JvdW5kIiwgIkJsdWV5IiwgImJhZ2VsIG9yIHRvYXN0IikKCmBgYAoKQSBkYXRhIHRhYmxlCgpgYGB7cn0KQmVja21hbnMKYGBgCgoKIyMgQ2FzZXMsIFZhcmlhYmxlcywgYW5kIFZhbHVlcwoKLSBWYXJpYWJsZXM6IGB3aG9gLCBgYWdlYCwgYHNleGAsIGBpbmRvb3JzYCwgYG91dGRvb3JzYCwgYHR2YCwgYGJyZWFrZmFzdGAKICAgIC0gVmFsdWVzOiAKICAgICAgICAtIGB3aG9gIGlzIGEgbmFtZSAKICAgICAgICAtIGBhZ2VgIGlzIG51bWVyaWMgYWdlIAogICAgICAgIC0gYHNleGAgaXMgc2V4IG9mIHRoZSBwZXJzb24KICAgICAgICAtIGBpbmRvb3JzYCBpcyBhIGhvYmJ5IHdoaWxlIGluZG9vcnMKICAgICAgICAtIGBvdXRkb29yc2AgaXMgYSBob2JieSB3aGlsZSBvdXRkb29ycwogICAgICAgIC0gYHR2YCBpcyBhIGZhdm9yaXRlIHRlbGV2aXNpb24gc2hvdyAoLi4ub3RoZXIgdGhhbiBZb3VUdWJlKQogICAgICAgIC0gYGJyZWFrZmFzdGAgaXMgdHlwaWNhbCBtZWFsIHByZWZlcmVuY2UgYmVmb3JlIHNjaG9vbAotIENhc2VzOiBCZWNrbWFucyB7RWRlbiwgSmFjaywgSGF6ZWx9CgpgYGB7ciBlY2hvPUZBTFNFfQpCZWNrbWFucwpgYGAKCgojIyBUd28gZm9ybWF0cwoKLSBEYXRhIGluIEtleS9WYWx1ZSBmb3JtYXQgYXJlICoqbmFycm93KioKICAgIC0gcG9zc2libGUgdG8gZ2V0ICp0b28qIG5hcnJvdyBpZiB0aGUgbWVhbmluZyBvZiBjYXNlIGJlY29tZXMgYXdrd2FyZAotIFRoZSBjb3JyZXNwb25kaW5nICoqd2lkZSoqIGZvcm1hdCBoYXMgCiAgICAtIHNlcGFyYXRlIHZhcmlhYmxlcyBmb3IgZWFjaCBsZXZlbCBpbiBga2V5YAogICAgLSBzZXRzIHRoZSB2YWx1ZXMgZm9yIHRob3NlIHZhcmlhYmxlcyBmcm9tIHRoZSBpbmZvIGluIGB2YWx1ZWAKCiMjIyBOYXJyb3cKClE6IFdoYXQgSVMgZGlmZmVyZW50PwpROiBXaGF0IGlzIE5PVCBkaWZmZXJlbnQ/CgpgYGB7cn0KQmVja21hbnMgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gYyhpbmRvb3JzLCBvdXRkb29ycywgdHYsIGJyZWFrZmFzdCksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0eXBlIiwgdmFsdWVzX3RvID0gInByZWZlcmVuY2UiKQpgYGAKCgoKIyMjIChUb28pIE5hcnJvdwoKTm9uZSBvZiB0aGUgZGF0YSBoYXMgYWN0dWFsbHkgYmVlbiBsb3N0LCBidXQgaXQncyBub3QgYSBoZWxwZnVsIGZvcm0gc2luY2UgdGhlcmUgaXNuJ3QgYSB1c2VmdWwgZGVmaW5pdGlvbiBvZiAiY2FzZSIuICAKCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJlY2ttYW5zICU+JSAKICBtdXRhdGUoYWdlID0gYXMuY2hhcmFjdGVyKGFnZSkpICU+JSAgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHdobywgYWdlLCBzZXgsIGluZG9vcnMsIG91dGRvb3JzLCB0diwgYnJlYWtmYXN0KSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImtleSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpCmBgYAoKIyMjIFdpZGUKCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJlY2ttYW5zCmBgYAoKCgoKIyMgU28gd2hhdD8KCi0gVGhpcyBhbGxvd3MgdXMgdG8gZWFzaWx5IHJlZGVmaW5lIGhvdyByb3dzIGFyZSBwcmVzZW50ZWQgaW4gdGhlIGRhdGEKICAgIC0gUG9zc2libHkgbW90aXZhdGVkIGJ5IHRoZSByZXNlYXJjaCBxdWVzdGlvbgogICAgLSBQb3NzaWJseSBtb3RpdmF0ZWQgYnkgZGVzaXJlIHRvIGpvaW4gdHdvIGRhdGEgdGFibGVzIHdpdGggZGlmZmVyZW50IGNhc2UgZGVmaW5pdGlvbnMKICAgIC0gUG9zc2libHkgbW90aXZhdGVkIGJ5IGEgZGF0YSB2aXN1YWxpemF0aW9uCi0gQWxzbywgc29tZSBvcGVyYXRpb25zIGFyZSBlYXN5IGluIHdpZGUgZm9ybWF0LCBidXQgaGFyZCBpbiBuYXJyb3cgYW5kICp2aWNlIHZlcnNhKgotIFdlIG5lZWQgdG9vbHMgdGhhdCBtYWtlIGl0IGVhc3kgdG8gc3dpdGNoIGJhY2sgYW5kIGZvcnRoCgoKIyMgTm90ZSBhYm91dCB0ZXJtcyAid2lkZSIgYW5kICJuYXJyb3ciCgpJdCdzIGFjdHVhbGx5IHBvc3NpYmxlIGZvciBhICJ3aWRlciIgZm9ybSBvZiB0aGUgZGF0YSBhbmQgYSAibmFycm93IiBmb3JtIG9mIHRoZSBkYXRhIHRvIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMhICBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgImtleSIgb25seSBoYXMgdHdvIG91dGNvbWVzLiAKCmBgYHtyfQojIHRoaXMgaXMgIndpZGUiLS13aXRoIDUgdmFyaWFibGVzCkJlY2ttYW5zICU+JQogIHNlbGVjdCh3aG8sIGFnZSwgc2V4LCBpbmRvb3JzLCBvdXRkb29ycykKYGBgCgpgYGB7cn0KIyB0aGlzIGlzICJuYXJyb3ciLS13aXRoIDUgdmFyaWFibGVzCkJlY2ttYW5zICU+JSAKICBzZWxlY3Qod2hvLCBhZ2UsIHNleCwgaW5kb29ycywgb3V0ZG9vcnMpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhpbmRvb3JzLCBvdXRkb29ycyksIG5hbWVzX3RvID0gInR5cGUiLCB2YWx1ZXNfdG8gPSAicHJlZmVyZW5jZSIpCgpgYGAKCgoKCiMjIyBFeGNlcnB0IGZyb20gYEJhYnlOYW1lc2AKCmBgYHtyIGVjaG89RkFMU0V9CmRhdGEoIkJhYnlOYW1lcyIsIHBhY2thZ2UgPSAiZGNEYXRhIikKClNob3J0QmFieU5hbWVzIDwtIAogIEJhYnlOYW1lcyAlPiUKICBmaWx0ZXIoIG5hbWUgJWluJSBjKCJFZGVuIiwgIkphY2siLCAiSGF6ZWwiKSwgCiAgICAgICAgICB5ZWFyICVpbiUgMjAxMjoyMDEzICkgJT4lIAogIGFycmFuZ2UobmFtZSwgeWVhcikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpTaG9ydEJhYnlOYW1lcwpgYGAKCiMjIyBRdWVzdGlvbnM6CgpSUSAxLiBIb3cgbWFueSBiYWJpZXMgb2YgZWFjaCBuYW1lIGFuZCBzZXg/ClJRIDIuIEZvciBlYWNoIG5hbWUsIGlzIGl0IHByaW1hcmlseSBnaXZlbiB0byBnaXJscyBvciBib3lzPyAgV2hpY2ggbmFtZXMgYXJlIGdlbmRlciBuZXV0cmFsPwoKCgojIyBJbiBuYXJyb3cgZm9ybWF0CgpgYGB7cn0KZGF0YSgiQmFieU5hbWVzIiwgcGFja2FnZSA9ICJkY0RhdGEiKQoKQmFieU5hbWVzIDwtIAogIEJhYnlOYW1lcyAlPiUKICBmaWx0ZXIoIG5hbWUgJWluJSBjKCJFZGVuIiwgIkphY2siLCAiSGF6ZWwiKSkgCmBgYAoKUlEgMS4gSG93IG1hbnkgYmFiaWVzIG9mIGVhY2ggbmFtZSBhbmQgc2V4PwoKYGBge3J9CkJhYnlUb3RhbHMgPC0KICBCYWJ5TmFtZXMgJT4lCiAgZ3JvdXBfYnkobmFtZSwgc2V4KSAlPiUKICBzdW1tYXJpc2UodG90YWwgPSBzdW0oY291bnQsIG5hLnJtID0gVFJVRSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KQmFieVRvdGFscwpgYGAKCkVhc3khCgoKCiMjIEluIFdpZGUgZm9ybWF0CgpSUSAyLiBXaGljaCBuYW1lcyBhcmUgbW9zdCBnZW5kZXIgbmV1dHJhbD8KCgpgYGAKV2lkZU91dHB1dCA8LSAKICBOYXJyb3dJbnB1dCAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhcjEsIHZhbHVlc19mcm9tID0gdmFyMiwgdmFsdWVzX2ZpbGwgPSAwKQpgYGAKCi0gd2Ugd2FudCBhIG5ldyBjb2x1bW4gZm9yIGVhY2ggY2F0ZWdvcnkgb2YgYHNleGAsIHNvIGBuYW1lc19mcm9tID0gc2V4YCAKICAgIC0gd2Ugd2lsbCAidW5zdGFjayIgZWFjaCBhdmFpbGFibGUgY2F0ZWdvcnkgYXMgYSBuZXcgdmFyaWFibGUgKGEuay5hLiBjYXN0LCBzcHJlYWQsIHVuZm9sZCkKICAgIC0gY2F0ZWdvcmllcyBvZiBgc2V4YCB3ZXJlICJGIiBhbmQgIk0iIGluIHRoaXMgZXhhbXBsZQotIHRoZSB2YWx1ZXMvZW50cmllcyBmb3Igb3VyIG5ldyB2YXJpYWJsZXMgYXJlIGNvbWluZyBmcm9tIGB0b3RhbGAsIHNvIGB2YWx1ZXNfZnJvbSA9IHRvdGFsYAogICAgLSBgdmFsdWVzX2ZpbGwgPSAwYCBzcGVjaWZpZXMgYSBkZWZhdWx0IHZhbHVlCiAgICAtIGUuZy4sIGluIDIwMTIgbm8gb25lIGluIGBCYWJ5TmFtZXNgIHdhcyBhc3NpZ25lZCB7SGF6ZWwsIE19LCBzbyBpdCBzaG91bGQgYmUgemVybwoKCmBgYHtyfQpCYWJ5VG90YWxzV2lkZSA8LSAKICBCYWJ5VG90YWxzICU+JSAKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc2V4LCB2YWx1ZXNfZnJvbSA9IHRvdGFsLCB2YWx1ZXNfZmlsbCA9IDApCgpCYWJ5VG90YWxzV2lkZQpgYGAKCiMjIFdpdGggc2V4ZXMgc2lkZSBieSBzaWRlLi4uIAoKV2UgY2FuIGVhc2lseSBjYWxjdWxhdGUgYmFsYW5jZSBhc3NvY2lhdGVkIHdpdGggbmFtZXMKCgpgYGB7cn0KCkJhYnlUb3RhbHNXaWRlIDwtIAogIEJhYnlUb3RhbHNXaWRlICU+JSAKICByZW5hbWUoZmVtID0gRiwgbWFsZSA9IE0pICU+JSAgICAgICAgICMgYEZgIGlzIGEgdGVycmlibGUgdmFyaWFibGUgbmFtZSAod2h5PykKICBtdXRhdGUocHJvcF9mZW0gID0gZmVtICAvIChtYWxlICsgZmVtKSwgCiAgICAgICAgIHByb3BfbWFsZSA9IG1hbGUgLyAobWFsZSArIGZlbSksCiAgICAgICAgIG5hbWVfc3BlY2lmaWNpdHkgPSBwbWF4KHByb3BfZmVtLCBwcm9wX21hbGUpKSAgICAjIHdoYXQgZG9lcyBgcG1heCgpYCBkbz8KCkJhYnlUb3RhbHNXaWRlCmBgYAoKIyMgYHBpdm90X2xvbmdlciggKWAtLS13aGVuIHlvdSBoYXZlICJXaWRlIiBhbmQgd2FudCAiTmFycm93IgoKU3ludGF4OgoKYGBgCk5hcnJvd091dHB1dCA8LSAKICBXaWRlSW5wdXQgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gYyh3aWRlX3ZhcjEsIHdpZGVfdmFyMiwgLi4uKSwgbmFtZXNfdG8gPSAibG9uZ192YXIxIiwgdmFsdWVzX3RvICJsb25nX3ZhcjIiKQpgYGAKCi0gVGhlIGBjb2xzYCBhcmUgdGhlIHZhcmlhYmxlcyB3ZSB3YW50IHRvIGNvbWJpbmUgKGEuay5hLiBtZWx0LCBzdGFjaywgZm9sZCwgZ2F0aGVyKQotIGUuZy4gYHByb3BfZmVtYCBhbmQgYHByb3BfbWFsZWAgaW4gdGhpcyBjYXNlCgpgYGB7ciBlY2hvPVRSVUV9CkJhYnlUb3RhbHNOYXJyb3cgPC0gCiAgQmFieVRvdGFsc1dpZGUgJT4lIAogIHNlbGVjdChwcm9wX2ZlbSwgcHJvcF9tYWxlKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMocHJvcF9mZW0sIHByb3BfbWFsZSksIG5hbWVzX3RvID0gInNleCIsIHZhbHVlc190byA9ICJwcm9wb3J0aW9uIikgCgpCYWJ5VG90YWxzTmFycm93CmBgYAoKIyMgV2l0aCBzZXhlcyBzdGFja2VkIGFnYWluLi4uCgpXZSBjYW4gbWFrZSBhbiBpbnR1aXRpdmUgYmFyIGNoYXJ0ICh0aG91Z2ggc29tZSBjbGVhbiB1cCBpcyBuZWVkZWQuLi4pCgpgYGB7cn0KQmFieVRvdGFsc05hcnJvdyAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYmFyKGFlcyh4ID0gbmFtZSwgZmlsbCA9IHNleCwgd2VpZ2h0ID0gcHJvcG9ydGlvbikpIAogIApgYGAKCiMjIyMgV2l0aCBzb21lIGltcHJvdmVtZW50cyAKCi0gY2xlYW4gdXAgbGFiZWxzIG9mIHNleGVzCi0gYWRkIHRpdGxlLCBzb3VyY2UsICYgYmV0dGVyIGF4aXMgbGFiZWxzIChkZWZhdWx0IHktYXhpcyBsYWJlbCB3YXMgZmxhdCB3cm9uZykKCmBgYHtyfQojIGZpcnN0LCBjbGVhbiB1cCB0aGUgbGFiZWxzIGluIGBzZXhgIGZvciBwbG90dGluZwpCYWJ5VG90YWxzTmFycm93ICU+JQogIG11dGF0ZShzZXggPSBpZl9lbHNlKHNleCA9PSAicHJvcF9mZW0iLCAKICAgICAgICAgICAgICAgICAgICAgICB0cnVlID0gImZlbWFsZSIsIAogICAgICAgICAgICAgICAgICAgICAgIGZhbHNlID0gaWZfZWxzZShzZXggPT0gInByb3BfbWFsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlID0gIm1hbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPSAidW5rIikgICMgZW5kIG9mICJpbm5lciIgaWZfZWxzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVuZHMgdGhlICJvdXRlciIgaWZfZWxzZSgpCiAgICAgICAgICkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVuZHMgdGhlIG11dGF0ZSgpIAogIGdncGxvdCgpICsgCiAgZ2VvbV9iYXIoYWVzKHggPSBuYW1lLCBmaWxsID0gc2V4LCB3ZWlnaHQgPSBwcm9wb3J0aW9uKSkgKyAKICBnZ3RpdGxlKCJHZW5kZXIgQmFsYW5jZSBhbW9uZyBOYW1lcyBvZiBCZWNrbWFuIEtpZHMiLCAKICAgICAgICAgIHN1YnRpdGxlID0gInNvdXJjZTogVS5TLiBTb2NpYWwgU2VjdXJpdHkgQWRtaW5pc3RyYXRpb24iKSArIAogIHhsYWIoIk5hbWUiKSArIAogIHlsYWIoIlByb3BvcnRpb24iKQogIApgYGAK