1. PREPARE

INTRODUCTION

The main objective of this independent analysis is to investigate how text network analysis can support the identification of keyword networks from collections of scientific interdisciplinary documents such as journal articles.The motivation of this analysis is based on empirical studies that have used text network analysis to identify co-occurrence words and further analyze research trends from academic papers. For instance, studies by Li et al. (2016) and Park(2019) utilized text network analysis to analyze co-keyword networks and keywords co- occurrence networks in academic articles in nursing and physics. Based on that context, I realized that a majority of these text network studies utilized papers and articles from distinct disciplines. For instance Park(2019) focused his analysis on nursing which also made the results very relevant distinct to that area. In this analysis, I am curious to take a different approach and further explore the interdisciplinary dataset from the previous analysis from Kaggle. The dataset hosts a collection of journal abstracts from six key areas which are Computer Science, Physics, Mathematics, Quantitative Biology and Quantitative Finance. In this analysis I will investigate whether text network analysis can provide insights on the prevalent keyword networks that are common in the six represented disciplines.

Research Questions

The main research question guiding this analysis is * How can bigrams support the understanding of trending keywords in a collection of interdisciplinary academic articles?

Data Source

In this study, the dataset of interest is a collection of abstracts extracted from a corpus of journal articles from Kaggle. For the purpose of this study, I randomly selected a total of 1148 abstract for further analysis.

library(dplyr)
library(tidytext)
library(tidyverse)
library(tidyr)
library(ggplot2)
library(igraph)
library(ggraph)

2. WRANGLE

2a. Importing Data

The first step in the wrangling process is to import the dataset into R environment.

journalabstracts <- read_csv("data/journalabstracts.csv")
## Rows: 1148 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): abstract
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

The dataset has a total of 1148 abstracts which will be the basis of text network analysis in this study.

2b. Tokenizing text into bigrams

Next, we will use some familiar tidytext functions for tokenizing text. But this time, we will tokenize bigram, instead of unigrams (or single words) in the sentiment analysis unit. We can also tokenize trigrams etc.

#tokenizing text by bigrams 
ja_bigrams <- journalabstracts %>%
  unnest_tokens(bigram, abstract, token = "ngrams", n = 2)

The tokenization resulted into 180286 bigrams. The next process is to count and identify the most common bigrams.

#count bigrams 
ja_bigrams %>%
  count(bigram, sort = TRUE)
## # A tibble: 97,280 × 2
##    bigram       n
##    <chr>    <int>
##  1 of the    1897
##  2 in the     865
##  3 to the     522
##  4 on the     496
##  5 in this    399
##  6 for the    398
##  7 that the   397
##  8 and the    381
##  9 of a       380
## 10 can be     351
## # … with 97,270 more rows

It can be noted that the common bigrams are rather combinations of stopwords and bring noise to the data. For this matter, the process of removing stopwords is important inorder to pare the dataset.

#separating bigrams inorder to remove stopwords 
bigrams_separated <- ja_bigrams %>%
  separate(bigram, c("word1", "word2"), sep = " ")

bigrams_filtered <- bigrams_separated %>%
  filter(!word1 %in% stop_words$word) %>%
  filter(!word2 %in% stop_words$word)
  

bigram_counts <- bigrams_filtered %>% 
  count(word1, word2, sort = TRUE)

bigram_counts
## # A tibble: 35,794 × 3
##    word1   word2        n
##    <chr>   <chr>    <int>
##  1 neural  networks    75
##  2 neural  network     74
##  3 machine learning    72
##  4 deep    learning    48
##  5 real    world       48
##  6 time    series      37
##  7 dark    matter      36
##  8 deep    neural      35
##  9 real    time        31
## 10 low     rank        30
## # … with 35,784 more rows
#reuniting filtered words to reform bigrams 
bigrams_united <- bigrams_filtered %>%
  unite(bigram, word1, word2, sep = " ")

bigrams_united
## # A tibble: 45,797 × 1
##    bigram          
##    <chr>           
##  1 universal real  
##  2 real time       
##  3 time prediction 
##  4 band limited    
##  5 limited signals 
##  6 filter consists 
##  7 multiple time   
##  8 time delayed    
##  9 delayed feedback
## 10 feedback terms  
## # … with 45,787 more rows
# plotting the bigrams 
bigrams_united %>%
  count(bigram, sort = TRUE) %>% 
  top_n(20) %>% 
  ggplot(aes(bigram)) + 
  geom_bar(fill = "#de5833") +
   theme_minimal() +
  coord_flip()+
  labs(title = "Top Bigrams of Interdisciplinary Journal Abstracts")
## Selecting by n

3. VISUALIZING THE WORD NETWORK

bigram_graph <- bigram_counts %>%
  graph_from_data_frame()

bigram_graph
## IGRAPH 74446e6 DN-- 11575 35794 -- 
## + attr: name (v/c), n (e/n)
## + edges from 74446e6 (vertex names):
##  [1] neural       ->networks neural       ->network  machine      ->learning
##  [4] deep         ->learning real         ->world    time         ->series  
##  [7] dark         ->matter   deep         ->neural   real         ->time    
## [10] low          ->rank     magnetic     ->field    monte        ->carlo   
## [13] proposed     ->method   convolutional->neural   1            ->2       
## [16] data         ->sets     experimental ->results  reinforcement->learning
## [19] wide         ->range    power        ->law      proposed     ->approach
## [22] frac         ->1        lower        ->bound    gradient     ->descent 
## + ... omitted several edges
bigram_graph_filtered <- bigram_counts %>%
  filter(n > 10) %>%
  graph_from_data_frame()

bigram_graph_filtered
## IGRAPH 5ee3fb5 DN-- 99 69 -- 
## + attr: name (v/c), n (e/n)
## + edges from 5ee3fb5 (vertex names):
##  [1] neural       ->networks neural       ->network  machine      ->learning
##  [4] deep         ->learning real         ->world    time         ->series  
##  [7] dark         ->matter   deep         ->neural   real         ->time    
## [10] low          ->rank     magnetic     ->field    monte        ->carlo   
## [13] proposed     ->method   convolutional->neural   1            ->2       
## [16] data         ->sets     experimental ->results  reinforcement->learning
## [19] wide         ->range    power        ->law      proposed     ->approach
## [22] frac         ->1        lower        ->bound    gradient     ->descent 
## + ... omitted several edges
set.seed(100)

a <- grid::arrow(type = "closed", length = unit(.2, "inches"))

ggraph(bigram_graph_filtered, layout = "fr") +
  geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
                 arrow = a, end_cap = circle(.07, 'inches')) +
  geom_node_point(color = "#de5833", size = 2) +
  geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
  theme_void()

5. COMMUNICATE

The main purpose of this independent analysis was to investigate the use of text networks in identifying frequent interdisciplinary words from a collection of scientific journal abstracts. The results indicate that most of these bigram networks are for terminologies that are analytics-based and they cross-cut between disciplines. Due to the big volume of tokenized biagrams, which prior to filtering came to 45,797, I made the decision to visualize bigrams that have occurred more than 10 times. Relationships are identified with bigrams such as “machine learning”,“algorithms”, “experiments” which could indicate the prevalent techniques and methodologies used for deep analysis. Another cluster contains bigrams such as “real world”, “real time” and “time series” which could be an indication of the nature of datasets that were used. Furthermore there words such as “magnetic field”, “carlo monte”, “orbit” and which are more related to Physics.
In conclusion, text network analysis presents great potential in tracking research trends in journal articles and they can also support holistic understanding of key points and their relationships.

References

Li, H., An, H., Wang, Y., Huang, J., & Gao, X. (2016). Evolutionary features of academic articles co-keyword network and keywords co-occurrence network: Based on two-mode affiliation network. Physica A: Statistical Mechanics and its Applications, 450, 657-669.

LS0tCnRpdGxlOiAiVW5pdDQgSW5kZXBlbmRlbnQgQW5hbHlzaXMiCmF1dGhvcjogIkRvcmVlbiBNdXNoaSIKZGF0ZTogJzIwMjItMDMtMjcnCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgd3JhcDogNzIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMjIDEuIFBSRVBBUkUgCgojIyMgSU5UUk9EVUNUSU9OIAoKVGhlIG1haW4gb2JqZWN0aXZlIG9mIHRoaXMgaW5kZXBlbmRlbnQgYW5hbHlzaXMgaXMgdG8gaW52ZXN0aWdhdGUgaG93IHRleHQgbmV0d29yayBhbmFseXNpcyBjYW4gc3VwcG9ydCB0aGUgaWRlbnRpZmljYXRpb24gb2Yga2V5d29yZCBuZXR3b3JrcyBmcm9tIGNvbGxlY3Rpb25zIG9mIHNjaWVudGlmaWMgaW50ZXJkaXNjaXBsaW5hcnkgZG9jdW1lbnRzIHN1Y2ggYXMgam91cm5hbCBhcnRpY2xlcy5UaGUgbW90aXZhdGlvbiBvZiB0aGlzIGFuYWx5c2lzIGlzIGJhc2VkIG9uIGVtcGlyaWNhbCBzdHVkaWVzIHRoYXQgaGF2ZSB1c2VkIHRleHQgbmV0d29yayBhbmFseXNpcyB0byBpZGVudGlmeSBjby1vY2N1cnJlbmNlIHdvcmRzIGFuZCBmdXJ0aGVyIGFuYWx5emUgcmVzZWFyY2ggdHJlbmRzIGZyb20gYWNhZGVtaWMgcGFwZXJzLiBGb3IgaW5zdGFuY2UsIHN0dWRpZXMgYnkgTGkgZXQgYWwuICgyMDE2KSBhbmQgUGFyaygyMDE5KSB1dGlsaXplZCB0ZXh0IG5ldHdvcmsgYW5hbHlzaXMgdG8gYW5hbHl6ZSBjby1rZXl3b3JkIG5ldHdvcmtzIGFuZCBrZXl3b3JkcyBjby0gb2NjdXJyZW5jZSBuZXR3b3JrcyBpbiBhY2FkZW1pYyBhcnRpY2xlcyBpbiBudXJzaW5nIGFuZCBwaHlzaWNzLiAKQmFzZWQgb24gdGhhdCBjb250ZXh0LCBJIHJlYWxpemVkIHRoYXQgYSBtYWpvcml0eSBvZiB0aGVzZSB0ZXh0IG5ldHdvcmsgc3R1ZGllcyB1dGlsaXplZCBwYXBlcnMgYW5kIGFydGljbGVzIGZyb20gZGlzdGluY3QgZGlzY2lwbGluZXMuIEZvciBpbnN0YW5jZSBQYXJrKDIwMTkpIGZvY3VzZWQgaGlzIGFuYWx5c2lzIG9uIG51cnNpbmcgd2hpY2ggYWxzbyBtYWRlIHRoZSByZXN1bHRzIHZlcnkgcmVsZXZhbnQgZGlzdGluY3QgdG8gdGhhdCBhcmVhLiBJbiB0aGlzIGFuYWx5c2lzLCBJIGFtIGN1cmlvdXMgdG8gdGFrZSBhIGRpZmZlcmVudCBhcHByb2FjaCBhbmQgZnVydGhlciBleHBsb3JlIHRoZSBpbnRlcmRpc2NpcGxpbmFyeSBkYXRhc2V0IGZyb20gdGhlIHByZXZpb3VzIGFuYWx5c2lzIGZyb20gS2FnZ2xlLiBUaGUgZGF0YXNldCBob3N0cyBhIGNvbGxlY3Rpb24gb2Ygam91cm5hbCBhYnN0cmFjdHMgZnJvbSBzaXgga2V5IGFyZWFzIHdoaWNoIGFyZSBDb21wdXRlciBTY2llbmNlLCBQaHlzaWNzLCBNYXRoZW1hdGljcywgUXVhbnRpdGF0aXZlIEJpb2xvZ3kgYW5kIFF1YW50aXRhdGl2ZSBGaW5hbmNlLiBJbiB0aGlzIGFuYWx5c2lzIEkgd2lsbCBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRleHQgbmV0d29yayBhbmFseXNpcyBjYW4gcHJvdmlkZSBpbnNpZ2h0cyBvbiB0aGUgcHJldmFsZW50IGtleXdvcmQgbmV0d29ya3MgdGhhdCBhcmUgY29tbW9uIGluIHRoZSBzaXggcmVwcmVzZW50ZWQgZGlzY2lwbGluZXMuIAoKIyMjIFJlc2VhcmNoIFF1ZXN0aW9ucyAKVGhlIG1haW4gcmVzZWFyY2ggcXVlc3Rpb24gZ3VpZGluZyB0aGlzIGFuYWx5c2lzIGlzCiogSG93IGNhbiBiaWdyYW1zIHN1cHBvcnQgdGhlIHVuZGVyc3RhbmRpbmcgb2YgdHJlbmRpbmcga2V5d29yZHMgaW4gYSBjb2xsZWN0aW9uIG9mIGludGVyZGlzY2lwbGluYXJ5IGFjYWRlbWljIGFydGljbGVzPyAKCiMjIyBEYXRhIFNvdXJjZSAKCkluIHRoaXMgc3R1ZHksIHRoZSBkYXRhc2V0IG9mIGludGVyZXN0IGlzIGEgY29sbGVjdGlvbiBvZiBhYnN0cmFjdHMgZXh0cmFjdGVkIGZyb20gYSBjb3JwdXMgb2Ygam91cm5hbCBhcnRpY2xlcyBmcm9tIFtLYWdnbGVdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vYmxlc3NvbmRlbnNpbDI5NC90b3BpYy1tb2RlbGluZy1mb3ItcmVzZWFyY2gtYXJ0aWNsZXM/c2VsZWN0PXRlc3QuY3N2KS4gRm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3R1ZHksIEkgcmFuZG9tbHkgc2VsZWN0ZWQgYSB0b3RhbCBvZiAxMTQ4IGFic3RyYWN0IGZvciBmdXJ0aGVyIGFuYWx5c2lzLiAKCgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGlncmFwaCkKbGlicmFyeShnZ3JhcGgpCmBgYAoKCiMjIDIuIFdSQU5HTEUKCiMjIyAyYS4gSW1wb3J0aW5nIERhdGEKClRoZSBmaXJzdCBzdGVwIGluIHRoZSB3cmFuZ2xpbmcgcHJvY2VzcyBpcyB0byBpbXBvcnQgdGhlIGRhdGFzZXQgaW50byBSIGVudmlyb25tZW50LiAKCmBgYHtyIHJlYWQtY3N2fQpqb3VybmFsYWJzdHJhY3RzIDwtIHJlYWRfY3N2KCJkYXRhL2pvdXJuYWxhYnN0cmFjdHMuY3N2IikKYGBgClRoZSBkYXRhc2V0IGhhcyBhIHRvdGFsIG9mIDExNDggYWJzdHJhY3RzIHdoaWNoIHdpbGwgYmUgdGhlIGJhc2lzIG9mIHRleHQgbmV0d29yayBhbmFseXNpcyBpbiB0aGlzIHN0dWR5LiAKCiMjIyAyYi4gVG9rZW5pemluZyB0ZXh0IGludG8gYmlncmFtcwoKTmV4dCwgd2Ugd2lsbCB1c2Ugc29tZSBmYW1pbGlhciBgdGlkeXRleHRgIGZ1bmN0aW9ucyBmb3IgdG9rZW5pemluZwp0ZXh0LiBCdXQgdGhpcyB0aW1lLCB3ZSB3aWxsIHRva2VuaXplIGJpZ3JhbSwgaW5zdGVhZCBvZiB1bmlncmFtcyAob3IKc2luZ2xlIHdvcmRzKSBpbiB0aGUgc2VudGltZW50IGFuYWx5c2lzIHVuaXQuIFdlIGNhbiBhbHNvIHRva2VuaXplCnRyaWdyYW1zIGV0Yy4KCgpgYGB7ciB0b2tlbml6ZX0KI3Rva2VuaXppbmcgdGV4dCBieSBiaWdyYW1zIApqYV9iaWdyYW1zIDwtIGpvdXJuYWxhYnN0cmFjdHMgJT4lCiAgdW5uZXN0X3Rva2VucyhiaWdyYW0sIGFic3RyYWN0LCB0b2tlbiA9ICJuZ3JhbXMiLCBuID0gMikKYGBgClRoZSB0b2tlbml6YXRpb24gcmVzdWx0ZWQgaW50byAxODAyODYgYmlncmFtcy4gVGhlIG5leHQgcHJvY2VzcyBpcyB0byBjb3VudCBhbmQgaWRlbnRpZnkgdGhlIG1vc3QgY29tbW9uIGJpZ3JhbXMuIAoKYGBge3J9CiNjb3VudCBiaWdyYW1zIApqYV9iaWdyYW1zICU+JQogIGNvdW50KGJpZ3JhbSwgc29ydCA9IFRSVUUpCmBgYApJdCBjYW4gYmUgbm90ZWQgdGhhdCB0aGUgY29tbW9uIGJpZ3JhbXMgYXJlIHJhdGhlciBjb21iaW5hdGlvbnMgb2Ygc3RvcHdvcmRzIGFuZCBicmluZyBub2lzZSB0byB0aGUgZGF0YS4gRm9yIHRoaXMgbWF0dGVyLCB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBzdG9wd29yZHMgaXMgaW1wb3J0YW50IGlub3JkZXIgdG8gcGFyZSB0aGUgZGF0YXNldC4gCgpgYGB7cn0KI3NlcGFyYXRpbmcgYmlncmFtcyBpbm9yZGVyIHRvIHJlbW92ZSBzdG9wd29yZHMgCmJpZ3JhbXNfc2VwYXJhdGVkIDwtIGphX2JpZ3JhbXMgJT4lCiAgc2VwYXJhdGUoYmlncmFtLCBjKCJ3b3JkMSIsICJ3b3JkMiIpLCBzZXAgPSAiICIpCgpiaWdyYW1zX2ZpbHRlcmVkIDwtIGJpZ3JhbXNfc2VwYXJhdGVkICU+JQogIGZpbHRlcighd29yZDEgJWluJSBzdG9wX3dvcmRzJHdvcmQpICU+JQogIGZpbHRlcighd29yZDIgJWluJSBzdG9wX3dvcmRzJHdvcmQpCiAgCgpiaWdyYW1fY291bnRzIDwtIGJpZ3JhbXNfZmlsdGVyZWQgJT4lIAogIGNvdW50KHdvcmQxLCB3b3JkMiwgc29ydCA9IFRSVUUpCgpiaWdyYW1fY291bnRzCmBgYAoKCmBgYHtyfQojcmV1bml0aW5nIGZpbHRlcmVkIHdvcmRzIHRvIHJlZm9ybSBiaWdyYW1zIApiaWdyYW1zX3VuaXRlZCA8LSBiaWdyYW1zX2ZpbHRlcmVkICU+JQogIHVuaXRlKGJpZ3JhbSwgd29yZDEsIHdvcmQyLCBzZXAgPSAiICIpCgpiaWdyYW1zX3VuaXRlZAoKYGBgCgoKCmBgYHtyfQojIHBsb3R0aW5nIHRoZSBiaWdyYW1zIApiaWdyYW1zX3VuaXRlZCAlPiUKICBjb3VudChiaWdyYW0sIHNvcnQgPSBUUlVFKSAlPiUgCiAgdG9wX24oMjApICU+JSAKICBnZ3Bsb3QoYWVzKGJpZ3JhbSkpICsgCiAgZ2VvbV9iYXIoZmlsbCA9ICIjZGU1ODMzIikgKwogICB0aGVtZV9taW5pbWFsKCkgKwogIGNvb3JkX2ZsaXAoKSsKICBsYWJzKHRpdGxlID0gIlRvcCBCaWdyYW1zIG9mIEludGVyZGlzY2lwbGluYXJ5IEpvdXJuYWwgQWJzdHJhY3RzIikKYGBgCgoKIyMgMy4gVklTVUFMSVpJTkcgVEhFIFdPUkQgTkVUV09SSwoKCmBgYHtyIHRyYW5mb3JtIGRhdGEgZm9yIHZpc3VhbGl6aW5nIHdvcmQgbmV0fQpiaWdyYW1fZ3JhcGggPC0gYmlncmFtX2NvdW50cyAlPiUKICBncmFwaF9mcm9tX2RhdGFfZnJhbWUoKQoKYmlncmFtX2dyYXBoCmBgYAoKYGBge3IgZmlsdGVyIGluZnJlcXVlbnQgYmlncmFtc30KYmlncmFtX2dyYXBoX2ZpbHRlcmVkIDwtIGJpZ3JhbV9jb3VudHMgJT4lCiAgZmlsdGVyKG4gPiAxMCkgJT4lCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKCkKCmJpZ3JhbV9ncmFwaF9maWx0ZXJlZApgYGAKCgpgYGB7ciB2aXN1YWxpemUgZmlsdGVyZWQgbmV0fQpzZXQuc2VlZCgxMDApCgphIDwtIGdyaWQ6OmFycm93KHR5cGUgPSAiY2xvc2VkIiwgbGVuZ3RoID0gdW5pdCguMiwgImluY2hlcyIpKQoKZ2dyYXBoKGJpZ3JhbV9ncmFwaF9maWx0ZXJlZCwgbGF5b3V0ID0gImZyIikgKwogIGdlb21fZWRnZV9saW5rKGFlcyhlZGdlX2FscGhhID0gbiksIHNob3cubGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgYXJyb3cgPSBhLCBlbmRfY2FwID0gY2lyY2xlKC4wNywgJ2luY2hlcycpKSArCiAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gIiNkZTU4MzMiLCBzaXplID0gMikgKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCB2anVzdCA9IDEsIGhqdXN0ID0gMSkgKwogIHRoZW1lX3ZvaWQoKQpgYGAKCiMjIDUuIENPTU1VTklDQVRFIAoKVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGluZGVwZW5kZW50IGFuYWx5c2lzIHdhcyB0byBpbnZlc3RpZ2F0ZSB0aGUgdXNlIG9mIHRleHQgbmV0d29ya3MgaW4gaWRlbnRpZnlpbmcgZnJlcXVlbnQgaW50ZXJkaXNjaXBsaW5hcnkgd29yZHMgZnJvbSBhIGNvbGxlY3Rpb24gb2Ygc2NpZW50aWZpYyBqb3VybmFsIGFic3RyYWN0cy4KVGhlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBtb3N0IG9mIHRoZXNlIGJpZ3JhbSBuZXR3b3JrcyBhcmUgZm9yIHRlcm1pbm9sb2dpZXMgdGhhdCBhcmUgYW5hbHl0aWNzLWJhc2VkIGFuZCB0aGV5IGNyb3NzLWN1dCBiZXR3ZWVuIGRpc2NpcGxpbmVzLiBEdWUgdG8gdGhlIGJpZyB2b2x1bWUgb2YgdG9rZW5pemVkIGJpYWdyYW1zLCB3aGljaCBwcmlvciB0byBmaWx0ZXJpbmcgY2FtZSB0byA0NSw3OTcsIEkgbWFkZSB0aGUgZGVjaXNpb24gdG8gdmlzdWFsaXplIGJpZ3JhbXMgdGhhdCBoYXZlIG9jY3VycmVkIG1vcmUgdGhhbiAxMCB0aW1lcy4gUmVsYXRpb25zaGlwcyBhcmUgaWRlbnRpZmllZCB3aXRoIGJpZ3JhbXMgc3VjaCBhcyAibWFjaGluZSBsZWFybmluZyIsImFsZ29yaXRobXMiLCAiZXhwZXJpbWVudHMiIHdoaWNoIGNvdWxkIGluZGljYXRlIHRoZSBwcmV2YWxlbnQgdGVjaG5pcXVlcyBhbmQgbWV0aG9kb2xvZ2llcyB1c2VkIGZvciBkZWVwIGFuYWx5c2lzLiBBbm90aGVyIGNsdXN0ZXIgY29udGFpbnMgYmlncmFtcyBzdWNoIGFzICJyZWFsIHdvcmxkIiwgInJlYWwgdGltZSIgYW5kICJ0aW1lIHNlcmllcyIgd2hpY2ggY291bGQgYmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbmF0dXJlIG9mIGRhdGFzZXRzIHRoYXQgd2VyZSB1c2VkLiBGdXJ0aGVybW9yZSB0aGVyZSB3b3JkcyBzdWNoIGFzICJtYWduZXRpYyBmaWVsZCIsICJjYXJsbyBtb250ZSIsICJvcmJpdCIgYW5kIHdoaWNoIGFyZSBtb3JlIHJlbGF0ZWQgdG8gUGh5c2ljcy4gICAKSW4gY29uY2x1c2lvbiwgdGV4dCBuZXR3b3JrIGFuYWx5c2lzIHByZXNlbnRzIGdyZWF0IHBvdGVudGlhbCBpbiB0cmFja2luZyByZXNlYXJjaCB0cmVuZHMgaW4gam91cm5hbCBhcnRpY2xlcyBhbmQgdGhleSBjYW4gYWxzbyBzdXBwb3J0IGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2Yga2V5IHBvaW50cyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcy4KCiMjIyBSZWZlcmVuY2VzCkxpLCBILiwgQW4sIEguLCBXYW5nLCBZLiwgSHVhbmcsIEouLCAmIEdhbywgWC4gKDIwMTYpLiBFdm9sdXRpb25hcnkgZmVhdHVyZXMgb2YgYWNhZGVtaWMgYXJ0aWNsZXMgY28ta2V5d29yZCBuZXR3b3JrIGFuZCBrZXl3b3JkcyBjby1vY2N1cnJlbmNlIG5ldHdvcms6IEJhc2VkIG9uIHR3by1tb2RlIGFmZmlsaWF0aW9uIG5ldHdvcmsuIFBoeXNpY2EgQTogU3RhdGlzdGljYWwgTWVjaGFuaWNzIGFuZCBpdHMgQXBwbGljYXRpb25zLCA0NTAsIDY1Ny02NjkuCg==