date: “2023-01-23”

This notebook uses LitsearchR to complie a more effective serach term for literature review. As well as litsearchr itself, we will use a few other R packages in the tutorial. Let’s load them.

install.packages("remotes")
Installing package into ‘C:/Users/carol/AppData/Local/R/win-library/4.2’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.2/remotes_2.4.2.zip'
Content type 'application/zip' length 399026 bytes (389 KB)
downloaded 389 KB
package ‘remotes’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\carol\AppData\Local\Temp\RtmpAvAaVu\downloaded_packages
remotes::install_github("elizagrames/litsearchr")
Skipping install of 'litsearchr' from a github remote, the SHA1 (0c108e30) has not changed since last install.
  Use `force = TRUE` to force installation
remotes::install_github("baddstats/polyclip")
Skipping install of 'polyclip' from a github remote, the SHA1 (5c5404a8) has not changed since last install.
  Use `force = TRUE` to force installation
install.packages("swirl", repos="http://cran.rstudio.com/", dependencies=TRUE)
Installing package into ‘C:/Users/carol/AppData/Local/R/win-library/4.2’
(as ‘lib’ is unspecified)
trying URL 'http://cran.rstudio.com/bin/windows/contrib/4.2/swirl_2.4.5.zip'
Content type 'application/zip' length 350138 bytes (341 KB)
downloaded 341 KB
package ‘swirl’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\carol\AppData\Local\Temp\RtmpAvAaVu\downloaded_packages
install.packages("package_name", repos=c("http://rstudio.org/_packages",
                                         "http://cran.rstudio.com",dependencies=TRUE))
Installing package into ‘C:/Users/carol/AppData/Local/R/win-library/4.2’
(as ‘lib’ is unspecified)
Warning in install.packages :
  unable to access index for repository TRUE/src/contrib:
  cannot open URL 'TRUE/src/contrib/PACKAGES'
Warning in install.packages :
  package ‘package_name’ is not available for this version of R

A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
Warning in install.packages :
  unable to access index for repository http://rstudio.org/_packages/bin/windows/contrib/4.2:
  cannot open URL 'http://rstudio.org/_packages/bin/windows/contrib/4.2/PACKAGES'
Warning in install.packages :
  unable to access index for repository TRUE/bin/windows/contrib/4.2:
  cannot open URL 'TRUE/bin/windows/contrib/4.2/PACKAGES'
                                         

As well as litsearchr itself, we will use a few other R packages in the tutorial. Let’s load them. To use the litsearchr package, we need to install it first. litsearchr isn’t (yet) stored in the package repository of CRAN, the Comprehensive R Archive Network. This means that the usual install.packages() function or the Install button in RStudio won’t find it. Instead, we can install the package from Eliza’s GitHub repository.

The devtools package provides a function for installing R packages from GitHub instead of from CRAN. So we can use this.

library(ggplot2)
library(ggraph)
library(igraph)
library(readr)
library(ggraph)
library(dplyr)
library(ggraph)

Including Plots

The starting point in litsearchr is an existing search that we have already carried out. We first conduct a quick, cursory search for our topic of interest. This is known as the ‘naive search’. litsearchr will then take the results of our naive search and suggest improvements that might capture more articles that are relevant to our topic (and hopefully fewer that are not relevant).

We start by going to the PubMed search page and enter the search in the Query box there. For this example, I entered the following three search terms, combined with AND, like this:

(Edtech) AND (digital) AND (teachers)

If you click on the Send to button above the PubMed search results, and then select to send them to Citation manager, you will be prompted to download all the results to a file that litsearchr can read. I have downloaded the example results to a file called scopus.bib.

[1] �\u0080\u00981.0.0�\u0080\u0099
Reading file scopus.bib ... done

import_results() gives us a dataframe in which each result is a row. We can see from the number of rows how many results our search got.

nrow(naive_results)
[1] 888
naive_results

We can take a look at the first few.

naive_results

There are columns for the title, authors, date, abstract, and so on. We can check the names of all the columns to see all the information we have on each search result.

colnames(naive_results)
 [1] "type"            "author"          "title"           "journal"         "year"           
 [6] "volume"          "pages"           "doi"             "note"            "url"            
[11] "affiliation"     "abstract"        "author_keywords" "document_type"   "source"         
[16] "number"          "art_number"     

And just as a check, let’s take a look at the title of the first result.

naive_results[1, "title"]
[1] "A Cyber-Physical Systems architecture for Industry 4.0-based manufacturing systems"

The next step is to analyze the search results that we already have and look to see whether there are more search terms in them that might be related to our topic. If so, we can use these additional terms in a new search to get more relevant results.

There are two different ways of searching for new terms.

Keywords: Many authors or journals already provide a list of keywords attached to the article. So the simplest way to get new search terms is just to look at what keywords were already provided in the articles we already found.

As an example, we can take a look at the keywords for the first article in our results.

naive_results[4, "author_keywords"]
[1] "cyber-physical systems;  industrial Internet of Things;  industrial wireless networks;  Industry 4.0;  software-defined networks"

How many articles are missing keywords? We can count up the number of NA values to find out.

sum(is.na(naive_results[,"author_keywords"]))
[1] 45

More than half of them. So relying on the provided keywords might not always be such a great approach. But for the purposes of demonstration let’s see how we could use them in litsearchr.

litsearchr has a function extract_terms() that can gather the keywords from this column of our search results. The keywords argument is where we put the column of keywords from our results dataframe. The method=“tagged” argument lets extract_terms() know that we are getting keywords that article authors themselves have provided (or ‘tagged’ the article with).

extract_terms(keywords=naive_results[, "author_keywords"], method="tagged")
  [1] "3d printing"                                "4th industrial revolution"                 
  [3] "access control"                             "additive manufacturing"                    
  [5] "advanced manufacturing"                     "aggregate production planning"             
  [7] "agile manufacturing"                        "agriculture 4.0"                           
  [9] "analytic hierarchy process"                 "artificial intelligence"                   
 [11] "artificial intelligence ai"                 "artificial neural network"                 
 [13] "assessment model"                           "asset administration shell"                
 [15] "augmented reality"                          "augmented reality ar"                      
 [17] "automotive industry"                        "autonomous vehicles"                       
 [19] "bibliometric analysis"                      "big data"                                  
 [21] "big data analytics"                         "big data analytics bda"                    
 [23] "big data platform"                          "bioinspired manufacturing"                 
 [25] "biological transformation in manufacturing" "biologicalisation in manufacturing"        
 [27] "building information modeling bim"          "built environment"                         
 [29] "business model"                             "business process management"               
 [31] "case study"                                 "change management"                         
 [33] "chemical engineering"                       "circular business models cbms"             
 [35] "circular economy"                           "cloud computing"                           
 [37] "cloud manufacturing"                        "collaborative robot"                       
 [39] "collaborative robotics"                     "competitive advantage"                     
 [41] "complex control systems"                    "complex networks"                          
 [43] "complex systems"                            "computational thinking"                    
 [45] "computer systems"                           "concept map"                               
 [47] "conceptual framework"                       "condition monitoring"                      
 [49] "construction industry"                      "critical success factors"                  
 [51] "curriculum design"                          "cyber-physical production system"          
 [53] "cyber-physical system"                      "cyber-physical systems"                    
 [55] "cyber-physical systems cps"                 "cyber physical system"                     
 [57] "cyber physical systems"                     "cyber physical systems cps"                
 [59] "cyber security"                             "data analysis"                             
 [61] "data management"                            "data mining"                               
 [63] "data processing"                            "data protection"                           
 [65] "data science"                               "data security"                             
 [67] "data sharing"                               "deadlock prevention"                       
 [69] "decision making"                            "decision support"                          
 [71] "deep learning"                              "delphi method"                             
 [73] "design science"                             "design thinking"                           
 [75] "developing countries"                       "diamond model"                             
 [77] "digital competence"                         "digital economy"                           
 [79] "digital manufacturing"                      "digital partnering"                        
 [81] "digital revolution"                         "digital supply chain"                      
 [83] "digital technologies"                       "digital technology"                        
 [85] "digital transformation"                     "digital twin"                              
 [87] "digital twin dt"                            "digital twins"                             
 [89] "discrete event simulation"                  "distributed manufacturing"                 
 [91] "distributed systems"                        "economic development"                      
 [93] "edge computing"                             "embedded systems"                          
 [95] "emerging economies"                         "energy efficiency"                         
 [97] "energy industry"                            "engineering education"                     
 [99] "enterprise integration"                     "environmental sustainability"              
[101] "factory automation"                         "failure prediction"                        
[103] "fault detection"                            "federated learning"                        
[105] "fifth industrial revolution"                "flexible manufacturing systems"            
[107] "flow measurement"                           "fog computing"                             
[109] "food industry"                              "fourth industrial revolution"              
[111] "fourth industrial revolution 4ir"           "higher education"                          
[113] "ho chi minh city"                           "human-centered manufacturing"              
[115] "human-robot collaboration"                  "human-robot interaction"                   
[117] "human capital"                              "human factors"                             
[119] "human resource"                             "iec 61131-3"                               
[121] "indoor positioning"                         "industrial automation"                     
[123] "industrial district id"                     "industrial engineering"                    
[125] "industrial ethernet"                        "industrial internet"                       
[127] "industrial internet of things"              "industrial internet of things iiot"        
[129] "industrial iot"                             "industrial networks"                       
[131] "industrial policy"                          "industrial revolution"                     
[133] "industrial robot"                           "industrial robotics"                       
[135] "industrial robots"                          "industrie 4.0"                             
[137] "industry 4.0"                               "industry 4.0 technologies"                 
[139] "industry 4.0 tools"                         "industry 40"                               
[141] "industry 5.0"                               "information systems"                       
[143] "information technology"                     "innovation management"                     
[145] "input-output analysis"                      "intelligent manufacturing"                 
[147] "international trade"                        "internet of thing iot"                     
[149] "internet of things"                         "internet of things iot"                    
[151] "investment efficiency"                      "ir 4.0"                                    
[153] "italian ceramic industry"                   "kalman filter"                             
[155] "knowledge discovery"                        "knowledge management"                      
[157] "knowledge representation"                   "labor market"                              
[159] "lean management"                            "lean manufacturing"                        
[161] "lean manufacturing 4.0"                     "lean production"                           
[163] "lean six sigma"                             "lifecycle management"                      
[165] "literature review"                          "logistics 4.0"                             
[167] "machine learning"                           "maintenance management"                    
[169] "manufacturing execution system mes"         "manufacturing industry"                    
[171] "manufacturing process"                      "manufacturing systems"                     
[173] "manufacturing technology"                   "mass customization"                        
[175] "maturity model"                             "maturity models"                           
[177] "mechanical engineering"                     "medium-sized enterprises"                  
[179] "mobile application"                         "mobile robots"                             
[181] "model-driven engineering"                   "multi-antenna techniques"                  
[183] "multi-criteria decision-making"             "network intelligence"                      
[185] "network security"                           "network slicing"                           
[187] "opc ua"                                     "open innovation"                           
[189] "operations management"                      "operator 4.0"                              
[191] "performance analysis"                       "performance management"                    
[193] "petri nets"                                 "power consumption"                         
[195] "predictive maintenance"                     "preventive maintenance"                    
[197] "process control"                            "process integration"                       
[199] "process planning"                           "product design"                            
[201] "product development"                        "product robustness"                        
[203] "production management"                      "production planning"                       
[205] "project-based learning"                     "project management"                        
[207] "quality 4.0"                                "quality control"                           
[209] "quality management"                         "quality of service"                        
[211] "rami 4.0"                                   "raw material"                              
[213] "readiness factor"                           "reference architecture"                    
[215] "regional economy"                           "renewable energy"                          
[217] "resource allocation"                        "risk analysis"                             
[219] "risk assessment"                            "risk management"                           
[221] "semantic web"                               "sharing economy"                           
[223] "shipyard 4.0"                               "signal processing"                         
[225] "six sigma"                                  "smart city"                                
[227] "smart contract"                             "smart factories"                           
[229] "smart factory"                              "smart grid"                                
[231] "smart industry"                             "smart manufacturing"                       
[233] "smart pipes"                                "smart production"                          
[235] "smart technology"                           "social sustainability"                     
[237] "society 5.0"                                "software-defined network"                  
[239] "software-defined network sdn"               "software-defined networking"               
[241] "software-defined networking sdn"            "software-defined networks"                 
[243] "software defined networking"                "software defined networking sdn"           
[245] "software defined networks"                  "steel industry"                            
[247] "stochastic frontier analysis"               "supply chain"                              
[249] "supply chain management"                    "supply chain resilience"                   
[251] "supply management"                          "sustainable development"                   
[253] "sustainable development goals"              "sustainable manufacturing"                 
[255] "sustainable production"                     "sustainable supply chain"                  
[257] "system dynamics"                            "systematic literature review"              
[259] "systematic review"                          "systems engineering"                       
[261] "systems modeling"                           "systems theory"                            
[263] "tabu search"                                "task analysis"                             
[265] "technological change"                       "technological innovation"                  
[267] "technology roadmap"                         "the fourth industrial revolution"          
[269] "transdisciplinary systems"                  "user experience"                           
[271] "value chain"                                "value network"                             
[273] "virtual enterprise"                         "virtual reality"                           
[275] "vocational education"                       "wireless sensor networks"                  
[277] "workflow management"                        "zero-defect manufacturing"                 
## Loading required namespace: stopwords

We seem to have got only multi-word phrases, no single words. And we didn’t get very many. As is often the case in programming, we need to check the documentation for extract_terms() to see what its default behavior is. (We can get the documentation in RStudio by typing ? extract_terms at the console).

We see that extract_terms() has a few default arguments:

min_freq=2. Only get keywords that appear at least twice in the full set of results. This is good for making sure that we are only getting keywords that are related to more than just one article in our field of interest. But it might also miss out some important extra suggestions. min_n=2. Only get keywords that consist of at least two words. This is why we only see multi-word phrases in the keywords we just got. max_n=5. Get keywords up to five words long. Maybe this is longer than we need. We can experiment with changing some of these arguments. For example, let’s try including single words. This time, let’s store the result in a variable, as we will use it later on.

keywords <- extract_terms(keywords=naive_results[,"author_keywords"], method="tagged", min_n=1)

keywords
  [1] "3d printing"                                "4ir"                                       
  [3] "4th industrial revolution"                  "access control"                            
  [5] "additive manufacturing"                     "advanced manufacturing"                    
  [7] "aggregate production planning"              "aggregation"                               
  [9] "agile"                                      "agile manufacturing"                       
 [11] "agriculture 4.0"                            "agv"                                       
 [13] "ahp"                                        "analytic hierarchy process"                
 [15] "artificial intelligence"                    "artificial intelligence ai"                
 [17] "artificial neural network"                  "assembly"                                  
 [19] "assessment model"                           "asset administration shell"                
 [21] "augmented reality"                          "augmented reality ar"                      
 [23] "automation"                                 "automotive industry"                       
 [25] "autonomous vehicles"                        "benchmarking"                              
 [27] "bibliometric analysis"                      "big data"                                  
 [29] "big data analytics"                         "big data analytics bda"                    
 [31] "big data platform"                          "bioeconomy"                                
 [33] "bioinspired manufacturing"                  "biological transformation in manufacturing"
 [35] "biologicalisation in manufacturing"         "blockchain"                                
 [37] "building information modeling bim"          "built environment"                         
 [39] "business"                                   "business model"                            
 [41] "business process management"                "case study"                                
 [43] "challenges"                                 "change management"                         
 [45] "chemical engineering"                       "circular business models cbms"             
 [47] "circular economy"                           "classification"                            
 [49] "cloud computing"                            "cloud manufacturing"                       
 [51] "cmm"                                        "cobot"                                     
 [53] "cognition"                                  "collaborative robot"                       
 [55] "collaborative robotics"                     "companies"                                 
 [57] "competence"                                 "competition"                               
 [59] "competitive advantage"                      "competitiveness"                           
 [61] "complex control systems"                    "complex networks"                          
 [63] "complex systems"                            "computational thinking"                    
 [65] "computer systems"                           "concept map"                               
 [67] "conceptual framework"                       "condition monitoring"                      
 [69] "construction"                               "construction industry"                     
 [71] "control"                                    "covid-19"                                  
 [73] "cpps"                                       "cps"                                       
 [75] "creativity"                                 "criteria"                                  
 [77] "critical success factors"                   "cryptography"                              
 [79] "curriculum design"                          "cyber-physical production system"          
 [81] "cyber-physical system"                      "cyber-physical systems"                    
 [83] "cyber-physical systems cps"                 "cyber physical system"                     
 [85] "cyber physical systems"                     "cyber physical systems cps"                
 [87] "cyber security"                             "cybersecurity"                             
 [89] "data"                                       "data-driven"                               
 [91] "data analysis"                              "data management"                           
 [93] "data mining"                                "data processing"                           
 [95] "data protection"                            "data science"                              
 [97] "data security"                              "data sharing"                              
 [99] "deadlock prevention"                        "decision making"                           
[101] "decision support"                           "deep learning"                             
[103] "definition"                                 "delphi method"                             
[105] "design science"                             "design thinking"                           
[107] "developing countries"                       "development"                               
[109] "dfm"                                        "diamond model"                             
[111] "digital competence"                         "digital economy"                           
[113] "digital manufacturing"                      "digital partnering"                        
[115] "digital revolution"                         "digital supply chain"                      
[117] "digital technologies"                       "digital technology"                        
[119] "digital transformation"                     "digital twin"                              
[121] "digital twin dt"                            "digital twins"                             
[123] "digitalisation"                             "digitalization"                            
[125] "digitisation"                               "digitization"                              
[127] "discrete event simulation"                  "distributed manufacturing"                 
[129] "distributed systems"                        "e-commerce"                                
[131] "economic development"                       "ecosystem"                                 
[133] "edge"                                       "edge computing"                            
[135] "education"                                  "embedded systems"                          
[137] "emerging economies"                         "employability"                             
[139] "employees"                                  "employment"                                
[141] "energy"                                     "energy efficiency"                         
[143] "energy industry"                            "engineering education"                     
[145] "enterprise integration"                     "entrepreneurship"                          
[147] "environmental"                              "environmental sustainability"              
[149] "equilibrium"                                "ergonomics"                                
[151] "ethics"                                     "evaluation"                                
[153] "factory automation"                         "failure"                                   
[155] "failure prediction"                         "fault detection"                           
[157] "federated learning"                         "fifth industrial revolution"               
[159] "fintech"                                    "flexibility"                               
[161] "flexible manufacturing systems"             "flow measurement"                          
[163] "fog"                                        "fog computing"                             
[165] "food"                                       "food industry"                             
[167] "fourth industrial revolution"               "fourth industrial revolution 4ir"          
[169] "fpga"                                       "framework"                                 
[171] "future"                                     "hartes"                                    
[173] "health"                                     "heuristics"                                
[175] "higher education"                           "ho chi minh city"                          
[177] "human"                                      "human-centered manufacturing"              
[179] "human-robot collaboration"                  "human-robot interaction"                   
[181] "human capital"                              "human factors"                             
[183] "human resource"                             "humanity"                                  
[185] "i4.0"                                       "iacs"                                      
[187] "ict"                                        "identification"                            
[189] "identity"                                   "iec 61131-3"                               
[191] "iiot"                                       "indicators"                                
[193] "indoor positioning"                         "industrial automation"                     
[195] "industrial district id"                     "industrial engineering"                    
[197] "industrial ethernet"                        "industrial internet"                       
[199] "industrial internet of things"              "industrial internet of things iiot"        
[201] "industrial iot"                             "industrial networks"                       
[203] "industrial policy"                          "industrial revolution"                     
[205] "industrial robot"                           "industrial robotics"                       
[207] "industrial robots"                          "industrie 4.0"                             
[209] "industries"                                 "industry"                                  
[211] "industry 4.0"                               "industry 4.0 technologies"                 
[213] "industry 4.0 tools"                         "industry 40"                               
[215] "industry 5.0"                               "information"                               
[217] "information systems"                        "information technology"                    
[219] "innovation"                                 "innovation management"                     
[221] "input-output analysis"                      "institutions"                              
[223] "intelligent manufacturing"                  "international trade"                       
[225] "internet-of-things"                         "internet of thing iot"                     
[227] "internet of things"                         "internet of things iot"                    
[229] "interoperability"                           "investment efficiency"                     
[231] "iot"                                        "ir 4.0"                                    
[233] "italian ceramic industry"                   "iwsn"                                      
[235] "kalman filter"                              "knowledge"                                 
[237] "knowledge discovery"                        "knowledge management"                      
[239] "knowledge representation"                   "labor market"                              
[241] "labview"                                    "leadership"                                
[243] "lean"                                       "lean management"                           
[245] "lean manufacturing"                         "lean manufacturing 4.0"                    
[247] "lean production"                            "lean six sigma"                            
[249] "learning"                                   "legitimacy"                                
[251] "lifecycle management"                       "literature review"                         
[253] "localization"                               "logistic"                                  
[255] "logistics"                                  "logistics 4.0"                             
[257] "machine learning"                           "machining"                                 
[259] "maintenance"                                "maintenance management"                    
[261] "management"                                 "manufacturing"                             
[263] "manufacturing execution system mes"         "manufacturing industry"                    
[265] "manufacturing process"                      "manufacturing systems"                     
[267] "manufacturing technology"                   "mass customization"                        
[269] "maturity model"                             "maturity models"                           
[271] "mcdm"                                       "mechanical engineering"                    
[273] "mechatronics"                               "medium-sized enterprises"                  
[275] "mes"                                        "mining"                                    
[277] "mobile application"                         "mobile robots"                             
[279] "model-driven engineering"                   "modeling"                                  
[281] "modelling"                                  "monitoring"                                
[283] "multi-antenna techniques"                   "multi-criteria decision-making"            
[285] "network intelligence"                       "network security"                          
[287] "network slicing"                            "nfv"                                       
[289] "node-red"                                   "ocf"                                       
[291] "oil"                                        "ontology"                                  
[293] "opc ua"                                     "open innovation"                           
[295] "openflow"                                   "operations"                                
[297] "operations management"                      "operator 4.0"                              
[299] "optimization"                               "order"                                     
[301] "organizations"                              "pandemic"                                  
[303] "paradigm"                                   "performance"                               
[305] "performance analysis"                       "performance management"                    
[307] "petri nets"                                 "platform"                                  
[309] "power consumption"                          "prediction"                                
[311] "predictive maintenance"                     "preventive maintenance"                    
[313] "privacy"                                    "process control"                           
[315] "process integration"                        "process planning"                          
[317] "procurement"                                "product design"                            
[319] "product development"                        "product robustness"                        
[321] "production"                                 "production management"                     
[323] "production planning"                        "productivity"                              
[325] "prognostics"                                "project-based learning"                    
[327] "project management"                         "purchasing"                                
[329] "qos"                                        "quality"                                   
[331] "quality 4.0"                                "quality control"                           
[333] "quality management"                         "quality of service"                        
[335] "rami 4.0"                                   "raw material"                              
[337] "readiness"                                  "readiness factor"                          
[339] "real-time"                                  "reconfigurability"                         
[341] "reference architecture"                     "regional economy"                          
[343] "reliability"                                "remanufacturing"                           
[345] "renewable energy"                           "resilience"                                
[347] "resource allocation"                        "retrofitting"                              
[349] "review"                                     "rfid"                                      
[351] "risk"                                       "risk analysis"                             
[353] "risk assessment"                            "risk management"                           
[355] "robotics"                                   "robots"                                    
[357] "rss"                                        "safety"                                    
[359] "scalability"                                "scheduling"                                
[361] "science"                                    "sdn"                                       
[363] "security"                                   "semantic web"                              
[365] "sharing economy"                            "shipbuilding"                              
[367] "shipyard 4.0"                               "signal processing"                         
[369] "simulation"                                 "six sigma"                                 
[371] "skills"                                     "small"                                     
[373] "smart city"                                 "smart contract"                            
[375] "smart factories"                            "smart factory"                             
[377] "smart grid"                                 "smart industry"                            
[379] "smart manufacturing"                        "smart pipes"                               
[381] "smart production"                           "smart technology"                          
[383] "sme"                                        "smes"                                      
[385] "social sustainability"                      "society 5.0"                               
[387] "software"                                   "software-defined network"                  
[389] "software-defined network sdn"               "software-defined networking"               
[391] "software-defined networking sdn"            "software-defined networks"                 
[393] "software defined networking"                "software defined networking sdn"           
[395] "software defined networks"                  "standards"                                 
[397] "start-up"                                   "steel industry"                            
[399] "stem"                                       "stochastic frontier analysis"              
[401] "strategy"                                   "supply chain"                              
[403] "supply chain management"                    "supply chain resilience"                   
[405] "supply management"                          "survey"                                    
[407] "sustainability"                             "sustainable development"                   
[409] "sustainable development goals"              "sustainable manufacturing"                 
[411] "sustainable production"                     "sustainable supply chain"                  
[413] "system dynamics"                            "systematic literature review"              
[415] "systematic review"                          "systems engineering"                       
[417] "systems modeling"                           "systems theory"                            
[419] "tabu search"                                "task analysis"                             
[421] "teaching"                                   "technological change"                      
[423] "technological innovation"                   "technologies"                              
[425] "technology"                                 "technology roadmap"                        
[427] "the fourth industrial revolution"           "tools"                                     
[429] "topsis"                                     "tqm"                                       
[431] "traceability"                               "tracking"                                  
[433] "training"                                   "transdisciplinary systems"                 
[435] "transformation"                             "tsch"                                      
[437] "uncertainty"                                "university"                                
[439] "urllc"                                      "user experience"                           
[441] "value chain"                                "value network"                             
[443] "vietnam"                                    "virtual enterprise"                        
[445] "virtual reality"                            "vocational education"                      
[447] "well-being"                                 "wi-fi"                                     
[449] "wireless sensor networks"                   "workflow management"                       
[451] "workforce"                                  "zero-defect manufacturing"                 

This gets us more search terms. Some of these might be useful new terms to include in our literature search. But others are clearly too broad, for example outcome, or are from tangential topics, for example virtual reality.

You could try narrowing the terms down a bit, for example by asking only for those that are provided for at least three of the articles in our search. Where there are additional arguments to a function like this, it is a good idea to try out a few variations to get some idea of how they work. You can give this a go. For now, let’s move on to a different method of getting search terms from our naive search.

Titles and abstracts

As was said earlier, not all articles even include keywords. Additionally, it’s possible that the authors of the articles themselves can’t always be trusted to tag their pieces with all the keywords that could connect them to pertinent subjects. Searching in the article titles and/or abstracts is a substitute (or additional) way to discover new relevant search phrases.

To keep the sample simple, we’ll limit our search to titles alone in this instance. The abstracts of the articles are substantially longer and include numerous extraneous words. It would take a lot of effort to filter these out.

The majority of pertinent terms should be in titles, which are generally brief. But in order to acquire only the “interesting” terms, we will still need to narrow them down a little. A technique called Rapid Automatic Keyword Extraction has previously been created by someone to accomplish this (RAKE). If we instruct litsearchr to, it can employ this methodology (the argument for doing so has the curious name “fakerake”, because in fact litsearchr uses a slightly simplified version of the full RAKE technique).

Similar to when we searched using the author’s suggested keywords, we can specify whether to include single words or multi-word phrases with the arguments min n and max n, and we can specify with the argument min freq whether to omit words that appear in insufficient numbers of the titles in our initial search.

extract_terms(text=naive_results[, "title"], method="fakerake", min_freq=3, min_n=2)
  [1] "additive manufacturing"              "administration shell"               
  [3] "artificial intelligence"             "asset administration"               
  [5] "asset administration shell"          "augmented reality"                  
  [7] "automotive industry"                 "bibliometric analysis"              
  [9] "biological transformation"           "business model"                     
 [11] "business process"                    "chain management"                   
 [13] "circular economy"                    "cloud manufacturing"                
 [15] "conceptual framework"                "condition monitoring"               
 [17] "critical success"                    "critical success factors"           
 [19] "cyber-physical production"           "cyber-physical production systems"  
 [21] "cyber-physical systems"              "cyber manufacturing"                
 [23] "cyber physical"                      "cyber physical systems"             
 [25] "czech republic"                      "decision support"                   
 [27] "developing countries"                "digital economy"                    
 [29] "digital transformation"              "digital twin-based"                 
 [31] "digital twins"                       "economic growth"                    
 [33] "education institutions"              "enabling technologies"              
 [35] "engineering education"               "european union"                     
 [37] "fourth industrial"                   "fourth industrial revolution"       
 [39] "higher education"                    "human-robot collaborative"          
 [41] "implementation framework"            "industrial internet"                
 [43] "industrial manufacturing"            "industrial networks"                
 [45] "industrial revolution"               "industrial robots"                  
 [47] "industrial wireless"                 "industrial wireless sensor"         
 [49] "industrial wireless sensor networks" "information technology"             
 [51] "intelligent manufacturing"           "knowledge management"               
 [53] "learning approach"                   "literature review"                  
 [55] "machine learning"                    "maintenance based"                  
 [57] "manufacturing companies"             "manufacturing enterprises"          
 [59] "manufacturing industry"              "manufacturing system"               
 [61] "manufacturing systems"               "manufacturing technologies"         
 [63] "manufacturing technology"            "maturity model"                     
 [65] "medium-sized enterprises"            "method based"                       
 [67] "neural network"                      "performance indicators"             
 [69] "physical systems"                    "predictive maintenance"             
 [71] "predictive maintenance based"        "process planning"                   
 [73] "production processes"                "production systems"                 
 [75] "quality management"                  "reference framework"                
 [77] "regional innovation"                 "research agenda"                    
 [79] "reverse logistics"                   "sensor networks"                    
 [81] "smart factory"                       "smart industry"                     
 [83] "smart manufacturing"                 "software-defined industrial"        
 [85] "software defined"                    "success factors"                    
 [87] "supply chain"                        "supply chain management"            
 [89] "supply chains"                       "sustainable development"            
 [91] "sustainable manufacturing"           "sustainable production"             
 [93] "sustainable supply"                  "system based"                       
 [95] "systematic literature"               "systematic literature review"       
 [97] "systematic review"                   "systems engineering"                
 [99] "wireless sensor"                     "wireless sensor networks"           

We find more search terms when we search in the titles than when we only use the author-provided keywords. This is partially due to the fact that while every article has a title, not every article includes keywords. Additionally, the keywords were specifically chosen for their significance, although the titles also include other unrelated phrases. We most likely find far more terms than we require using the title search.

Some of the terms that appear in a title are from broad science or data analysis and have nothing to do with the article’s unique subject. Such regularly occurring but meaningless terms are known as “stopwords” in language analysis. If we work with Litsearchr frequently and need to filter a lot.

clinpsy_stopwords <- read_lines("keywords1.txt")

clinpsy_stopwords
  [1] "advances"        "analyse"         "analysed"        "analyses"        "analysing"      
  [6] "analysis"        "analyze"         "analyzes"        "analyzed"        "analyzing"      
 [11] "assess"          "assessed"        "assesses"        "assessing"       "assessment"     
 [16] "assessments"     "change"          "changed"         "changes"         "changing"       
 [21] "characteristic"  "characteristics" "characterize"    "characterized"   "characterizes"  
 [26] "characterizing"  "cluster"         "combine"         "combined"        "combines"       
 [31] "combining"       "compare"         "compared"        "compares"        "comparing"      
 [36] "comparison"      "design"          "designed"        "designing"       "effect"         
 [41] "effective"       "effectiveness"   "effects"         "efficacy"        "follow"         
 [46] "followed"        "following"       "follows"         "group"           "groups"         
 [51] "impact"          "longitudinal"    "moderate"        "moderated"       "moderates"      
 [56] "moderating"      "moderator"       "moderators"      "outcome"         "outcomes"       
 [61] "pilot"           "practice"        "predict"         "predicted"       "predicting"     
 [66] "predictor"       "predictors"      "predicts"        "preliminary"     "primary"        
 [71] "protocol"        "quality"         "random"          "randomise"       "randomised"     
 [76] "randomising"     "randomize"       "randomized"      "randomizing"     "rationale"      
 [81] "reduce"          "reduced"         "reduces"         "reducing"        "related"        
 [86] "report"          "reported"        "reporting"       "reports"         "result"         
 [91] "resulted"        "resulting"       "results"         "review"          "studied"        
 [96] "studies"         "study"           "studying"        "systematic"      "versus"         

We can exclude words by using the stopwords option provided by the extract terms() function. Through the get stopwords() function, litsearchr also offers a generic list of stopwords for English (and for some other languages), so we can also incorporate this into our own, more focused stopword list.

all_stopwords <- c(get_stopwords("English"), clinpsy_stopwords)

Now let’s use this big list of stopwords to have another go at extracting only relevant search terms.

title_terms <- extract_terms(
  text=naive_results[, "title"],
  method="fakerake",
  min_freq=3, min_n=2,
  stopwords=all_stopwords
)

title_terms
 [1] "additive manufacturing"              "administration shell"               
 [3] "artificial intelligence"             "asset administration"               
 [5] "asset administration shell"          "augmented reality"                  
 [7] "automotive industry"                 "biological transformation"          
 [9] "business model"                      "business process"                   
[11] "chain management"                    "circular economy"                   
[13] "cloud manufacturing"                 "conceptual framework"               
[15] "condition monitoring"                "critical success"                   
[17] "critical success factors"            "cyber-physical production"          
[19] "cyber-physical production systems"   "cyber-physical systems"             
[21] "cyber manufacturing"                 "cyber physical"                     
[23] "cyber physical systems"              "czech republic"                     
[25] "decision support"                    "developing countries"               
[27] "digital economy"                     "digital transformation"             
[29] "digital twin-based"                  "digital twins"                      
[31] "economic growth"                     "education institutions"             
[33] "enabling technologies"               "engineering education"              
[35] "european union"                      "fourth industrial"                  
[37] "fourth industrial revolution"        "higher education"                   
[39] "human-robot collaborative"           "implementation framework"           
[41] "industrial internet"                 "industrial manufacturing"           
[43] "industrial networks"                 "industrial revolution"              
[45] "industrial robots"                   "industrial wireless"                
[47] "industrial wireless sensor"          "industrial wireless sensor networks"
[49] "information technology"              "intelligent manufacturing"          
[51] "knowledge management"                "learning approach"                  
[53] "machine learning"                    "maintenance based"                  
[55] "manufacturing companies"             "manufacturing enterprises"          
[57] "manufacturing industry"              "manufacturing system"               
[59] "manufacturing systems"               "manufacturing technologies"         
[61] "manufacturing technology"            "maturity model"                     
[63] "medium-sized enterprises"            "method based"                       
[65] "neural network"                      "performance indicators"             
[67] "physical systems"                    "predictive maintenance"             
[69] "predictive maintenance based"        "process planning"                   
[71] "production processes"                "production systems"                 
[73] "reference framework"                 "regional innovation"                
[75] "research agenda"                     "reverse logistics"                  
[77] "sensor networks"                     "smart factory"                      
[79] "smart industry"                      "smart manufacturing"                
[81] "software-defined industrial"         "software defined"                   
[83] "success factors"                     "supply chain"                       
[85] "supply chain management"             "supply chains"                      
[87] "sustainable development"             "sustainable manufacturing"          
[89] "sustainable production"              "sustainable supply"                 
[91] "system based"                        "systems engineering"                
[93] "wireless sensor"                     "wireless sensor networks"           

This looks a bit better. We should be careful not to accidentally exclude any potentially relevant words at this stage, and as usual exploration is important. Try out different lists of stopwords and different values of min_freq, min_n, and max_n to get a clear impression of the articles in the naive search.

Let’s finish by adding together the search terms we got from the article titles and those we got from the keywords earlier, removing duplicates.

terms <- unique(c(keywords, title_terms))

Nextwork Anaylsis

Unrelated to the others and our area of interest, there are definitely still some in there. Perhaps only a few articles that don’t mention many of the other search terms contain these. We are interested in a methodical approach to discovering these “isolated” search phrases.

To do this, one method is to network-analyze the search phrases. This is based on the notion that concepts are connected to one another by virtue of sharing articles. We can identify groups of terms that are likely all referring to the same issue if we can identify which terms frequently appear together in the same article.

The complete texts of the articles are not available to us, and even if they were, my rudimentary machine would struggle to scan a huge number of full texts for search phrases. Therefore, we will consider the title and abstract of each article to represent the article’s “content,” and we will consider a term to have appeared in the article if it appears in either the title or abstract. To do this, we must link each article’s title and abstract.

docs <- paste(naive_results[, "title"], naive_results[, "abstract"])

Let’s just check the first one to make sure we did this right.

docs[1]
[1] "A Cyber-Physical Systems architecture for Industry 4.0-based manufacturing systems Recent advances in manufacturing industry has paved way for a systematical deployment of Cyber-Physical Systems (CPS), within which information from all related perspectives is closely monitored and synchronized between the physical factory floor and the cyber computational space. Moreover, by utilizing advanced information analytics, networked machines will be able to perform more efficiently, collaboratively and resiliently. Such trend is transforming manufacturing industry to the next generation, namely Industry 4.0. At this early development phase, there is an urgent need for a clear definition of CPS. In this paper, a unified 5-level architecture is proposed as a guideline for implementation of CPS. © 2014 Society of Manufacturing Engineers (SME)."

We now create a matrix that records which terms appear in which articles. The litsearchr function create_dfm() does this. ‘DFM’ stands for ‘document-feature matrix’, where the ‘documents’ are our articles and the ‘features’ are the search terms. The elements argument is the list of documents. The features argument is the list of terms whose relationships we want to analyze within that set of documents.

dfm <- create_dfm(elements=docs, features=terms)

The rows of our matrix represent the articles (their titles and abstracts), and the columns represent the search terms. Each entry in the matrix records how many times that article contains that term. For example, if we look at the first three articles we see that adherence does not occur in any of them, adolescents occurs in the third, antidepressant occurs in the first two, and anxiety occurs in all of them.

dfm[1:3, 1:4]
     3d printing 4ir 4th industrial revolution access control
[1,]           0   0                         0              0
[2,]           0   0                         0              0
[3,]           0   0                         0              0

We can then turn this matrix into a network of linked search terms, using the litsearchr function create_network(). This function has an argument min_studies that excludes terms that occur in fewer than a given number of articles.

g <- create_network(dfm, min_studies=3)

The ggraph() function takes the network that we got from create_network() as its argument and draws it as a graph. In addition, we can specify a layout for the graph. Here we use the ‘Kamada and Kawai’ layout. To sum it up very simply, this layout draws terms that are closely linked close together, and those that are less closely linked further away from each other. We add some labels showing what the actual terms are, using geom_node_text(). Since there are far too many terms to show all of them without completely cluttering the figure, we show just an arbitrary subset of them that do not overlap on the figure, using the argument check_overlap=TRUE. Finally, we also add lines linking the terms, using geom_edge_link(). We color these lines so there are more solid lines linking terms that appear in more articles together (this is called the ‘weight’ of the link).

ggraph(g, layout="stress") +
  coord_fixed() +
  expand_limits(x=c(-3, 3)) +
  geom_edge_link(aes(alpha=weight)) +
  geom_node_point(shape="circle filled", fill="white") +
  geom_node_text(aes(label=name), hjust="outward", check_overlap=TRUE) +
  guides(edge_alpha=FALSE)

Pruning

Now let’s use the network to rank our search terms by importance, with the aim of pruning away some of the least important ones.

The ‘strength’ of each term in the network is the number of other terms that it appears together with. We can get this information from our network using the strength() function from the igraph package (behind the scenes, litsearchr uses igraph for some of the workings of its network analyses). If we then arrange the terms in ascending order of strength we see those that might be the least important.

strengths <- strength(g)

data.frame(term=names(strengths), strength=strengths, row.names=NULL) %>%
  mutate(rank=rank(strength, ties.method="min")) %>%
  arrange(strength) ->
  term_strengths

term_strengths

At the top are the terms that are most weakly linked to the others. For some of them you can compare this with their positions on the graph visualization above, where they appear near the margins of the figure. In most cases, terms like these are completely irrelevant and have occurred in a few of the articles in the naive search for arbitrary reasons, for example virtual reality. Some are perhaps still relevant but are just very rarely used.

We would like to discard some of the terms that only rarely occur together with the others. What rule can we use to make a decision about which to discard? To get an idea of how we might approach this question, let’s visualize the strengths of the terms.

cutoff_fig <- ggplot(term_strengths, aes(x=rank, y=strength, label=term)) +
  geom_line() +
  geom_point() +
  geom_text(data=filter(term_strengths, rank>5), hjust="right", nudge_y=20, check_overlap=TRUE)

cutoff_fig

The figure shows the terms in ascending order of strength from left to right. Again, only an arbitrary subset of the terms are labeled, so as not to clutter the figure. We can see for example that there are five terms (starting with behavioral therapy) that have much higher strengths than the others.

Let’s use this figure to visualize two methods that litsearchr offers for pruning away the search terms least closely linked to the others. Both of these involve finding a cutoff value for term strength, such that we discard terms with a strength below that value. The find_cutoff() function implements these methods.

Cumulatively

One simple way to decide on a cutoff is to choose to retain a certain proportion of the total strength of the network of search terms, for example 80%. If we supply the argument method=“cumulative” to the find_cutoff() function, we get the cutoff strength value according to this method. The percent argument specifies what proportion of the total strength we would like to retain.

cutoff_cum <- find_cutoff(g, method="cumulative", percent=0.8)

cutoff_cum
[1] 690

Let’s see this on our figure.

cutoff_fig +
  geom_hline(yintercept=cutoff_cum, linetype="dashed")

Once we have found a cutoff value, the reduce_graph() function applies it and prunes away the terms with low strength. The arguments are the original network and the cutoff. The get_keywords() function then gets the remaining terms from the reduced network.

get_keywords(reduce_graph(g, cutoff_cum))
  [1] "artificial intelligence"          "assembly"                         "automation"                      
  [4] "big data"                         "business"                         "business model"                  
  [7] "case study"                       "challenges"                       "cloud computing"                 
 [10] "companies"                        "competitiveness"                  "construction"                    
 [13] "control"                          "cps"                              "criteria"                        
 [16] "cyber-physical system"            "cyber-physical systems"           "data"                            
 [19] "definition"                       "development"                      "digital technologies"            
 [22] "digital transformation"           "digital twin"                     "digitalization"                  
 [25] "edge"                             "education"                        "energy"                          
 [28] "environmental"                    "evaluation"                       "flexibility"                     
 [31] "fourth industrial revolution"     "framework"                        "future"                          
 [34] "health"                           "human"                            "i4.0"                            
 [37] "ict"                              "identification"                   "iiot"                            
 [40] "industrial internet"              "industrial internet of things"    "industrial revolution"           
 [43] "industries"                       "industry"                         "industry 4.0"                    
 [46] "industry 4.0 technologies"        "information"                      "innovation"                      
 [49] "internet of things"               "iot"                              "knowledge"                       
 [52] "learning"                         "literature review"                "logistic"                        
 [55] "machine learning"                 "maintenance"                      "management"                      
 [58] "manufacturing"                    "manufacturing industry"           "manufacturing process"           
 [61] "manufacturing systems"            "mes"                              "mining"                          
 [64] "modeling"                         "monitoring"                       "operations"                      
 [67] "optimization"                     "order"                            "organizations"                   
 [70] "paradigm"                         "performance"                      "platform"                        
 [73] "production"                       "productivity"                     "quality"                         
 [76] "real-time"                        "reliability"                      "review"                          
 [79] "risk"                             "safety"                           "science"                         
 [82] "sdn"                              "security"                         "simulation"                      
 [85] "skills"                           "small"                            "smart manufacturing"             
 [88] "sme"                              "software"                         "standards"                       
 [91] "stem"                             "strategy"                         "supply chain"                    
 [94] "survey"                           "sustainability"                   "technologies"                    
 [97] "technology"                       "the fourth industrial revolution" "tools"                           
[100] "training"                         "transformation"                   "university"                      
[103] "fourth industrial"                "manufacturing system"             "physical systems"                
[106] "production systems"              

Changepoints

Looking at the figure above, another method of pruning away terms suggests itself. There are certain points along the ranking of terms where the strength of the next strongest term is much greater than that of the previous one (places where the ascending line ‘jumps up’). We could use these places as cutoffs, since the terms below them have much lower strength than those above. There may of course be more than one place where term strength jumps up like this, so we will have multiple candidates for cutoffs. The same find_cutoff() function with the argument method=“changepoint” will find these cutoffs. The knot_num argument specifies how many ‘knots’ we wish to slice the keywords into.

This time we get several suggested cutoffs. Let’s put them on our figure, where we can see that they cut off the search terms just before large increases in term strength.

After doing this, we can apply the same reduce_graph() function that we did for the cumulative strength method. The only difference is that we have to pick one of the cutoffs in our vector.

g_redux <- reduce_graph(g, cutoff_change[1])
selected_terms <- get_keywords(g_redux)

selected_terms

Grouping Now that we have got a revised list of search terms from the results of our naive search, we want to turn them into a new search query that we can use to get more articles relevant to the same topic. For this new, hopefully more rigorous, search we will need a combination of OR and AND operators. The OR operator should combine search terms that are all about the same subtopic, so that we get articles that contain any one of them. The AND operator should combine these groups of search terms so that we get only articles that mention at least one term from each of the subtopics that we are interested in.

In our starting example we had three subtopics, medication, cognitive-behavioral therapy, and phobias. So the first step is to take the terms that we have found and group them into clusters related to each of these topics. (Or it may be the case that our work with litsearchr has led us to rethink our subtopics or to add new ones.)

There are methods for automatically grouping networks into clusters, but these are not always so reliable; computers don’t understand what words mean. Currently the litsearchr documentation recommends doing this step manually. We look at our search terms, and put them into a list of separate vectors, one for each subtopic

grouped_terms <-list(
  genindustryterm=selected_terms[c(1, 34, 40, 43, 28, 31, 94, 34, 37, 67, 91, 97, 100)],
  business=selected_terms[c(4, 7, 55, 10, 22, 25, 26, 29, 30, 49, 55, 58, 64, 70, 73, 82, 85, 88)],
  skill=selected_terms[c(13, 16, 12, 15, 20, 21, 23, 27, 46, 19, 61, 76, 79)])
grouped_terms

Writing a new search The write_search() function takes our list of grouped search terms and writes the text of a new search. There are quite a few arguments to take care of for this function:

languages provides a list of languages to translate the search into, in case we want to get articles in multiple languages. exactphrase controls whether terms that consist of more than one word should be matched exactly rather than as two separate words. If we have phrases that are only relevant as a whole phrase, then we should set this to TRUE, so that for example social phobia will not also catch all the articles containing the word social. stemming controls whether words are stripped down to the smallest meaningful part of the word (its ‘stem’) so that we make sure to catch all variants of the word, for example catching both behavior and behavioral. closure controls whether partial matches are matched at the left end of a word (“left”), at the right (“right”), only as exact matches (“full”) or as any word containing a term (“none”). writesearch controls whether we would like to write the search text to a file.

write_search(
  grouped_terms,
  languages="English",
  exactphrase=TRUE,
  stemming=FALSE,
  closure="left",
  writesearch=TRUE
)

Let’s read in the contents of the text file that we just wrote, to see what our search text looks like.

cat(read_file("search-inEnglish.txt"))

We can now go back to the search site and copy the contents of this text file into the search field to conduct a new search.

Checking the new search

I ran our new search and downloaded the results to a file called scopus. Let’s load this file with litsearchr. This may take a moment, as this file contains a lot more results than the naive search.

new_results <- import_results(file="scopus.bib")

How many did we get?

nrow(new_results)

We now need to check whether the new results seem to be relevant to our chosen topic. There are a few basic things that we can check.

Against the naive search

We can first check whether all of the results of the naive search are in the new search. Since we conducted the naive search using the most important terms that occurred to us for our topic, and since we included these same terms or very similar in our new search, we ought to get the same articles back among our new results, at least if they were really relevant.

naive_results %>%
  mutate(in_new_results=title %in% new_results[, "title"]) ->
  naive_results

naive_results %>%
  filter(!in_new_results) %>%
  select(title, keywords)

We didn’t miss any of the articles from the naive search. Good.

Against gold standard results

If we have started reviewing the literature on our chosen topic, we may already know the titles of some important articles that have been written on the subject. So another way of checking our new search is to check whether it includes specific important results. litsearchr provides a function called check_recall() for searching for specific titles. We do not have to get the titles of our desired articles exactly right. If the capitalization or punctuation is slightly different from the version in our results dataframe, check_recall() will find the closest match.

Let’s try it.

important_titles <- c(
  "Industry 5.0: A survey on enabling technologies and potential applications","Exploring the Application Sphere of the Internet of Things in Industry 4.0: A Review, Bibliometric and Content Analysis
"
)

data.frame(check_recall(important_titles, new_results[, "title"]))

All of the best matches in the output table are clearly the articles that we were looking for, so our new search has found these.

That’s the end of our tutorial. You can try to refine the example search further, or try one of your own.

LS0tDQp3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KdGl0bGU6ICJMaXRzZWFyY2hSIENvZGUiDQotLS0NCi0tLQ0KICANCmRhdGU6ICIyMDIzLTAxLTIzIg0KLS0tDQpUaGlzIG5vdGVib29rIHVzZXMgTGl0c2VhcmNoUiB0byBjb21wbGllIGEgbW9yZSBlZmZlY3RpdmUgc2VyYWNoIHRlcm0gZm9yIGxpdGVyYXR1cmUgcmV2aWV3LiANCkFzIHdlbGwgYXMgbGl0c2VhcmNociBpdHNlbGYsIHdlIHdpbGwgdXNlIGEgZmV3IG90aGVyIFIgcGFja2FnZXMgaW4gdGhlIHR1dG9yaWFsLiBMZXTigJlzIGxvYWQgdGhlbS4NCg0KYGBge3Igc2V0dXB9DQppbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIikNCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJlbGl6YWdyYW1lcy9saXRzZWFyY2hyIikNCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJiYWRkc3RhdHMvcG9seWNsaXAiKQ0KaW5zdGFsbC5wYWNrYWdlcygic3dpcmwiLCByZXBvcz0iaHR0cDovL2NyYW4ucnN0dWRpby5jb20vIiwgZGVwZW5kZW5jaWVzPVRSVUUpDQppbnN0YWxsLnBhY2thZ2VzKCJwYWNrYWdlX25hbWUiLCByZXBvcz1jKCJodHRwOi8vcnN0dWRpby5vcmcvX3BhY2thZ2VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9jcmFuLnJzdHVkaW8uY29tIixkZXBlbmRlbmNpZXM9VFJVRSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCkFzIHdlbGwgYXMgbGl0c2VhcmNociBpdHNlbGYsIHdlIHdpbGwgdXNlIGEgZmV3IG90aGVyIFIgcGFja2FnZXMgaW4gdGhlIHR1dG9yaWFsLiBMZXTigJlzIGxvYWQgdGhlbS4NClRvIHVzZSB0aGUgbGl0c2VhcmNociBwYWNrYWdlLCB3ZSBuZWVkIHRvIGluc3RhbGwgaXQgZmlyc3QuIGxpdHNlYXJjaHIgaXNu4oCZdCAoeWV0KSBzdG9yZWQgaW4gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeSBvZiBDUkFOLCB0aGUgQ29tcHJlaGVuc2l2ZSBSIEFyY2hpdmUgTmV0d29yay4gVGhpcyBtZWFucyB0aGF0IHRoZSB1c3VhbCBpbnN0YWxsLnBhY2thZ2VzKCkgZnVuY3Rpb24gb3IgdGhlIEluc3RhbGwgYnV0dG9uIGluIFJTdHVkaW8gd29u4oCZdCBmaW5kIGl0LiBJbnN0ZWFkLCB3ZSBjYW4gaW5zdGFsbCB0aGUgcGFja2FnZSBmcm9tIEVsaXph4oCZcyBHaXRIdWIgcmVwb3NpdG9yeS4NCg0KVGhlIGRldnRvb2xzIHBhY2thZ2UgcHJvdmlkZXMgYSBmdW5jdGlvbiBmb3IgaW5zdGFsbGluZyBSIHBhY2thZ2VzIGZyb20gR2l0SHViIGluc3RlYWQgb2YgZnJvbSBDUkFOLiBTbyB3ZSBjYW4gdXNlIHRoaXMuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3JhcGgpDQpsaWJyYXJ5KGlncmFwaCkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncmFwaCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncmFwaCkNCmBgYA0KDQojIyBJbmNsdWRpbmcgUGxvdHMNCg0KVGhlIHN0YXJ0aW5nIHBvaW50IGluIGxpdHNlYXJjaHIgaXMgYW4gZXhpc3Rpbmcgc2VhcmNoIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGNhcnJpZWQgb3V0LiBXZSBmaXJzdCBjb25kdWN0IGEgcXVpY2ssIGN1cnNvcnkgc2VhcmNoIGZvciBvdXIgdG9waWMgb2YgaW50ZXJlc3QuIFRoaXMgaXMga25vd24gYXMgdGhlIOKAmG5haXZlIHNlYXJjaOKAmS4gbGl0c2VhcmNociB3aWxsIHRoZW4gdGFrZSB0aGUgcmVzdWx0cyBvZiBvdXIgbmFpdmUgc2VhcmNoIGFuZCBzdWdnZXN0IGltcHJvdmVtZW50cyB0aGF0IG1pZ2h0IGNhcHR1cmUgbW9yZSBhcnRpY2xlcyB0aGF0IGFyZSByZWxldmFudCB0byBvdXIgdG9waWMgKGFuZCBob3BlZnVsbHkgZmV3ZXIgdGhhdCBhcmUgbm90IHJlbGV2YW50KS4NCg0KV2Ugc3RhcnQgYnkgZ29pbmcgdG8gdGhlIFB1Yk1lZCBzZWFyY2ggcGFnZSBhbmQgZW50ZXIgdGhlIHNlYXJjaCBpbiB0aGUgUXVlcnkgYm94IHRoZXJlLiBGb3IgdGhpcyBleGFtcGxlLCBJIGVudGVyZWQgdGhlIGZvbGxvd2luZyB0aHJlZSBzZWFyY2ggdGVybXMsIGNvbWJpbmVkIHdpdGggQU5ELCBsaWtlIHRoaXM6DQoNCihFZHRlY2gpIEFORCAoZGlnaXRhbCkgQU5EICh0ZWFjaGVycykNCg0KSWYgeW91IGNsaWNrIG9uIHRoZSBTZW5kIHRvIGJ1dHRvbiBhYm92ZSB0aGUgUHViTWVkIHNlYXJjaCByZXN1bHRzLCBhbmQgdGhlbiBzZWxlY3QgdG8gc2VuZCB0aGVtIHRvIENpdGF0aW9uIG1hbmFnZXIsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGRvd25sb2FkIGFsbCB0aGUgcmVzdWx0cyB0byBhIGZpbGUgdGhhdCBsaXRzZWFyY2hyIGNhbiByZWFkLiBJIGhhdmUgZG93bmxvYWRlZCB0aGUgZXhhbXBsZSByZXN1bHRzIHRvIGEgZmlsZSBjYWxsZWQgc2NvcHVzLmJpYi4NCg0KYGBge3IgcHJlc3N1cmUsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGxpdHNlYXJjaHIpDQpwYWNrYWdlVmVyc2lvbigibGl0c2VhcmNociIpDQpuYWl2ZV9yZXN1bHRzIDwtIGltcG9ydF9yZXN1bHRzKGZpbGU9InNjb3B1cy5iaWIiKQ0KYGBgDQoNCmltcG9ydF9yZXN1bHRzKCkgZ2l2ZXMgdXMgYSBkYXRhZnJhbWUgaW4gd2hpY2ggZWFjaCByZXN1bHQgaXMgYSByb3cuIFdlIGNhbiBzZWUgZnJvbSB0aGUgbnVtYmVyIG9mIHJvd3MgaG93IG1hbnkgcmVzdWx0cyBvdXIgc2VhcmNoIGdvdC4NCmBgYHtyfQ0KbnJvdyhuYWl2ZV9yZXN1bHRzKQ0KbmFpdmVfcmVzdWx0cw0KYGBgDQoNCldlIGNhbiB0YWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZmV3Lg0KDQpgYGB7cn0NCm5haXZlX3Jlc3VsdHMNCmBgYA0KDQpUaGVyZSBhcmUgY29sdW1ucyBmb3IgdGhlIHRpdGxlLCBhdXRob3JzLCBkYXRlLCBhYnN0cmFjdCwgYW5kIHNvIG9uLiBXZSBjYW4gY2hlY2sgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY29sdW1ucyB0byBzZWUgYWxsIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIG9uIGVhY2ggc2VhcmNoIHJlc3VsdC4NCg0KYGBge3J9DQpjb2xuYW1lcyhuYWl2ZV9yZXN1bHRzKQ0KYGBgDQoNCkFuZCBqdXN0IGFzIGEgY2hlY2ssIGxldOKAmXMgdGFrZSBhIGxvb2sgYXQgdGhlIHRpdGxlIG9mIHRoZSBmaXJzdCByZXN1bHQuDQpgYGB7cn0NCm5haXZlX3Jlc3VsdHNbMSwgInRpdGxlIl0NCmBgYA0KVGhlIG5leHQgc3RlcCBpcyB0byBhbmFseXplIHRoZSBzZWFyY2ggcmVzdWx0cyB0aGF0IHdlIGFscmVhZHkgaGF2ZSBhbmQgbG9vayB0byBzZWUgd2hldGhlciB0aGVyZSBhcmUgbW9yZSBzZWFyY2ggdGVybXMgaW4gdGhlbSB0aGF0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gb3VyIHRvcGljLiBJZiBzbywgd2UgY2FuIHVzZSB0aGVzZSBhZGRpdGlvbmFsIHRlcm1zIGluIGEgbmV3IHNlYXJjaCB0byBnZXQgbW9yZSByZWxldmFudCByZXN1bHRzLg0KDQpUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIG9mIHNlYXJjaGluZyBmb3IgbmV3IHRlcm1zLg0KDQpLZXl3b3JkczogTWFueSBhdXRob3JzIG9yIGpvdXJuYWxzIGFscmVhZHkgcHJvdmlkZSBhIGxpc3Qgb2Yga2V5d29yZHMgYXR0YWNoZWQgdG8gdGhlIGFydGljbGUuIFNvIHRoZSBzaW1wbGVzdCB3YXkgdG8gZ2V0IG5ldyBzZWFyY2ggdGVybXMgaXMganVzdCB0byBsb29rIGF0IHdoYXQga2V5d29yZHMgd2VyZSBhbHJlYWR5IHByb3ZpZGVkIGluIHRoZSBhcnRpY2xlcyB3ZSBhbHJlYWR5IGZvdW5kLg0KDQpBcyBhbiBleGFtcGxlLCB3ZSBjYW4gdGFrZSBhIGxvb2sgYXQgdGhlIGtleXdvcmRzIGZvciB0aGUgZmlyc3QgYXJ0aWNsZSBpbiBvdXIgcmVzdWx0cy4NCmBgYHtyfQ0KbmFpdmVfcmVzdWx0c1s0LCAiYXV0aG9yX2tleXdvcmRzIl0NCmBgYA0KSG93IG1hbnkgYXJ0aWNsZXMgYXJlIG1pc3Npbmcga2V5d29yZHM/IFdlIGNhbiBjb3VudCB1cCB0aGUgbnVtYmVyIG9mIE5BIHZhbHVlcyB0byBmaW5kIG91dC4NCmBgYHtyfQ0Kc3VtKGlzLm5hKG5haXZlX3Jlc3VsdHNbLCJhdXRob3Jfa2V5d29yZHMiXSkpDQpgYGANCk1vcmUgdGhhbiBoYWxmIG9mIHRoZW0uIFNvIHJlbHlpbmcgb24gdGhlIHByb3ZpZGVkIGtleXdvcmRzIG1pZ2h0IG5vdCBhbHdheXMgYmUgc3VjaCBhIGdyZWF0IGFwcHJvYWNoLiBCdXQgZm9yIHRoZSBwdXJwb3NlcyBvZiBkZW1vbnN0cmF0aW9uIGxldOKAmXMgc2VlIGhvdyB3ZSBjb3VsZCB1c2UgdGhlbSBpbiBsaXRzZWFyY2hyLg0KDQpsaXRzZWFyY2hyIGhhcyBhIGZ1bmN0aW9uIGV4dHJhY3RfdGVybXMoKSB0aGF0IGNhbiBnYXRoZXIgdGhlIGtleXdvcmRzIGZyb20gdGhpcyBjb2x1bW4gb2Ygb3VyIHNlYXJjaCByZXN1bHRzLiBUaGUga2V5d29yZHMgYXJndW1lbnQgaXMgd2hlcmUgd2UgcHV0IHRoZSBjb2x1bW4gb2Yga2V5d29yZHMgZnJvbSBvdXIgcmVzdWx0cyBkYXRhZnJhbWUuIFRoZSBtZXRob2Q9InRhZ2dlZCIgYXJndW1lbnQgbGV0cyBleHRyYWN0X3Rlcm1zKCkga25vdyB0aGF0IHdlIGFyZSBnZXR0aW5nIGtleXdvcmRzIHRoYXQgYXJ0aWNsZSBhdXRob3JzIHRoZW1zZWx2ZXMgaGF2ZSBwcm92aWRlZCAob3Ig4oCYdGFnZ2Vk4oCZIHRoZSBhcnRpY2xlIHdpdGgpLg0KDQpgYGB7cn0NCmV4dHJhY3RfdGVybXMoa2V5d29yZHM9bmFpdmVfcmVzdWx0c1ssICJhdXRob3Jfa2V5d29yZHMiXSwgbWV0aG9kPSJ0YWdnZWQiKQ0KIyMgTG9hZGluZyByZXF1aXJlZCBuYW1lc3BhY2U6IHN0b3B3b3Jkcw0KYGBgDQoNCldlIHNlZW0gdG8gaGF2ZSBnb3Qgb25seSBtdWx0aS13b3JkIHBocmFzZXMsIG5vIHNpbmdsZSB3b3Jkcy4gQW5kIHdlIGRpZG7igJl0IGdldCB2ZXJ5IG1hbnkuIEFzIGlzIG9mdGVuIHRoZSBjYXNlIGluIHByb2dyYW1taW5nLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciBleHRyYWN0X3Rlcm1zKCkgdG8gc2VlIHdoYXQgaXRzIGRlZmF1bHQgYmVoYXZpb3IgaXMuIChXZSBjYW4gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIGluIFJTdHVkaW8gYnkgdHlwaW5nID8gZXh0cmFjdF90ZXJtcyBhdCB0aGUgY29uc29sZSkuDQoNCldlIHNlZSB0aGF0IGV4dHJhY3RfdGVybXMoKSBoYXMgYSBmZXcgZGVmYXVsdCBhcmd1bWVudHM6DQoNCm1pbl9mcmVxPTIuIE9ubHkgZ2V0IGtleXdvcmRzIHRoYXQgYXBwZWFyIGF0IGxlYXN0IHR3aWNlIGluIHRoZSBmdWxsIHNldCBvZiByZXN1bHRzLiBUaGlzIGlzIGdvb2QgZm9yIG1ha2luZyBzdXJlIHRoYXQgd2UgYXJlIG9ubHkgZ2V0dGluZyBrZXl3b3JkcyB0aGF0IGFyZSByZWxhdGVkIHRvIG1vcmUgdGhhbiBqdXN0IG9uZSBhcnRpY2xlIGluIG91ciBmaWVsZCBvZiBpbnRlcmVzdC4gQnV0IGl0IG1pZ2h0IGFsc28gbWlzcyBvdXQgc29tZSBpbXBvcnRhbnQgZXh0cmEgc3VnZ2VzdGlvbnMuDQptaW5fbj0yLiBPbmx5IGdldCBrZXl3b3JkcyB0aGF0IGNvbnNpc3Qgb2YgYXQgbGVhc3QgdHdvIHdvcmRzLiBUaGlzIGlzIHdoeSB3ZSBvbmx5IHNlZSBtdWx0aS13b3JkIHBocmFzZXMgaW4gdGhlIGtleXdvcmRzIHdlIGp1c3QgZ290Lg0KbWF4X249NS4gR2V0IGtleXdvcmRzIHVwIHRvIGZpdmUgd29yZHMgbG9uZy4gTWF5YmUgdGhpcyBpcyBsb25nZXIgdGhhbiB3ZSBuZWVkLg0KV2UgY2FuIGV4cGVyaW1lbnQgd2l0aCBjaGFuZ2luZyBzb21lIG9mIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUsIGxldOKAmXMgdHJ5IGluY2x1ZGluZyBzaW5nbGUgd29yZHMuIFRoaXMgdGltZSwgbGV04oCZcyBzdG9yZSB0aGUgcmVzdWx0IGluIGEgdmFyaWFibGUsIGFzIHdlIHdpbGwgdXNlIGl0IGxhdGVyIG9uLg0KDQpgYGB7cn0NCmtleXdvcmRzIDwtIGV4dHJhY3RfdGVybXMoa2V5d29yZHM9bmFpdmVfcmVzdWx0c1ssImF1dGhvcl9rZXl3b3JkcyJdLCBtZXRob2Q9InRhZ2dlZCIsIG1pbl9uPTEpDQoNCmtleXdvcmRzDQpgYGANClRoaXMgZ2V0cyB1cyBtb3JlIHNlYXJjaCB0ZXJtcy4gU29tZSBvZiB0aGVzZSBtaWdodCBiZSB1c2VmdWwgbmV3IHRlcm1zIHRvIGluY2x1ZGUgaW4gb3VyIGxpdGVyYXR1cmUgc2VhcmNoLiBCdXQgb3RoZXJzIGFyZSBjbGVhcmx5IHRvbyBicm9hZCwgZm9yIGV4YW1wbGUgb3V0Y29tZSwgb3IgYXJlIGZyb20gdGFuZ2VudGlhbCB0b3BpY3MsIGZvciBleGFtcGxlIHZpcnR1YWwgcmVhbGl0eS4NCg0KWW91IGNvdWxkIHRyeSBuYXJyb3dpbmcgdGhlIHRlcm1zIGRvd24gYSBiaXQsIGZvciBleGFtcGxlIGJ5IGFza2luZyBvbmx5IGZvciB0aG9zZSB0aGF0IGFyZSBwcm92aWRlZCBmb3IgYXQgbGVhc3QgdGhyZWUgb2YgdGhlIGFydGljbGVzIGluIG91ciBzZWFyY2guIFdoZXJlIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGxpa2UgdGhpcywgaXQgaXMgYSBnb29kIGlkZWEgdG8gdHJ5IG91dCBhIGZldyB2YXJpYXRpb25zIHRvIGdldCBzb21lIGlkZWEgb2YgaG93IHRoZXkgd29yay4gWW91IGNhbiBnaXZlIHRoaXMgYSBnby4gRm9yIG5vdywgbGV04oCZcyBtb3ZlIG9uIHRvIGEgZGlmZmVyZW50IG1ldGhvZCBvZiBnZXR0aW5nIHNlYXJjaCB0ZXJtcyBmcm9tIG91ciBuYWl2ZSBzZWFyY2guDQoNClRpdGxlcyBhbmQgYWJzdHJhY3RzDQoNCkFzIHdhcyBzYWlkIGVhcmxpZXIsIG5vdCBhbGwgYXJ0aWNsZXMgZXZlbiBpbmNsdWRlIGtleXdvcmRzLiBBZGRpdGlvbmFsbHksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgYXV0aG9ycyBvZiB0aGUgYXJ0aWNsZXMgdGhlbXNlbHZlcyBjYW4ndCBhbHdheXMgYmUgdHJ1c3RlZCB0byB0YWcgdGhlaXIgcGllY2VzIHdpdGggYWxsIHRoZSBrZXl3b3JkcyB0aGF0IGNvdWxkIGNvbm5lY3QgdGhlbSB0byBwZXJ0aW5lbnQgc3ViamVjdHMuIFNlYXJjaGluZyBpbiB0aGUgYXJ0aWNsZSB0aXRsZXMgYW5kL29yIGFic3RyYWN0cyBpcyBhIHN1YnN0aXR1dGUgKG9yIGFkZGl0aW9uYWwpIHdheSB0byBkaXNjb3ZlciBuZXcgcmVsZXZhbnQgc2VhcmNoIHBocmFzZXMuDQoNClRvIGtlZXAgdGhlIHNhbXBsZSBzaW1wbGUsIHdlJ2xsIGxpbWl0IG91ciBzZWFyY2ggdG8gdGl0bGVzIGFsb25lIGluIHRoaXMgaW5zdGFuY2UuIFRoZSBhYnN0cmFjdHMgb2YgdGhlIGFydGljbGVzIGFyZSBzdWJzdGFudGlhbGx5IGxvbmdlciBhbmQgaW5jbHVkZSBudW1lcm91cyBleHRyYW5lb3VzIHdvcmRzLiBJdCB3b3VsZCB0YWtlIGEgbG90IG9mIGVmZm9ydCB0byBmaWx0ZXIgdGhlc2Ugb3V0Lg0KDQpUaGUgbWFqb3JpdHkgb2YgcGVydGluZW50IHRlcm1zIHNob3VsZCBiZSBpbiB0aXRsZXMsIHdoaWNoIGFyZSBnZW5lcmFsbHkgYnJpZWYuIEJ1dCBpbiBvcmRlciB0byBhY3F1aXJlIG9ubHkgdGhlICJpbnRlcmVzdGluZyIgdGVybXMsIHdlIHdpbGwgc3RpbGwgbmVlZCB0byBuYXJyb3cgdGhlbSBkb3duIGEgbGl0dGxlLiBBIHRlY2huaXF1ZSBjYWxsZWQgUmFwaWQgQXV0b21hdGljIEtleXdvcmQgRXh0cmFjdGlvbiBoYXMgcHJldmlvdXNseSBiZWVuIGNyZWF0ZWQgYnkgc29tZW9uZSB0byBhY2NvbXBsaXNoIHRoaXMgKFJBS0UpLiBJZiB3ZSBpbnN0cnVjdCBsaXRzZWFyY2hyIHRvLCBpdCBjYW4gZW1wbG95IHRoaXMgbWV0aG9kb2xvZ3kgKHRoZSBhcmd1bWVudCBmb3IgZG9pbmcgc28gaGFzIHRoZSBjdXJpb3VzIG5hbWUgImZha2VyYWtlIiwgYmVjYXVzZSBpbiBmYWN0IGxpdHNlYXJjaHIgdXNlcyBhIHNsaWdodGx5IHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgZnVsbCBSQUtFIHRlY2huaXF1ZSkuDQoNClNpbWlsYXIgdG8gd2hlbiB3ZSBzZWFyY2hlZCB1c2luZyB0aGUgYXV0aG9yJ3Mgc3VnZ2VzdGVkIGtleXdvcmRzLCB3ZSBjYW4gc3BlY2lmeSB3aGV0aGVyIHRvIGluY2x1ZGUgc2luZ2xlIHdvcmRzIG9yIG11bHRpLXdvcmQgcGhyYXNlcyB3aXRoIHRoZSBhcmd1bWVudHMgbWluIG4gYW5kIG1heCBuLCBhbmQgd2UgY2FuIHNwZWNpZnkgd2l0aCB0aGUgYXJndW1lbnQgbWluIGZyZXEgd2hldGhlciB0byBvbWl0IHdvcmRzIHRoYXQgYXBwZWFyIGluIGluc3VmZmljaWVudCBudW1iZXJzIG9mIHRoZSB0aXRsZXMgaW4gb3VyIGluaXRpYWwgc2VhcmNoLg0KDQpgYGB7cn0NCmV4dHJhY3RfdGVybXModGV4dD1uYWl2ZV9yZXN1bHRzWywgInRpdGxlIl0sIG1ldGhvZD0iZmFrZXJha2UiLCBtaW5fZnJlcT0zLCBtaW5fbj0yKQ0KYGBgDQoNCldlIGZpbmQgbW9yZSBzZWFyY2ggdGVybXMgd2hlbiB3ZSBzZWFyY2ggaW4gdGhlIHRpdGxlcyB0aGFuIHdoZW4gd2Ugb25seSB1c2UgdGhlIGF1dGhvci1wcm92aWRlZCBrZXl3b3Jkcy4gVGhpcyBpcyBwYXJ0aWFsbHkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2hpbGUgZXZlcnkgYXJ0aWNsZSBoYXMgYSB0aXRsZSwgbm90IGV2ZXJ5IGFydGljbGUgaW5jbHVkZXMga2V5d29yZHMuIEFkZGl0aW9uYWxseSwgdGhlIGtleXdvcmRzIHdlcmUgc3BlY2lmaWNhbGx5IGNob3NlbiBmb3IgdGhlaXIgc2lnbmlmaWNhbmNlLCBhbHRob3VnaCB0aGUgdGl0bGVzIGFsc28gaW5jbHVkZSBvdGhlciB1bnJlbGF0ZWQgcGhyYXNlcy4gV2UgbW9zdCBsaWtlbHkgZmluZCBmYXIgbW9yZSB0ZXJtcyB0aGFuIHdlIHJlcXVpcmUgdXNpbmcgdGhlIHRpdGxlIHNlYXJjaC4NCg0KU29tZSBvZiB0aGUgdGVybXMgdGhhdCBhcHBlYXIgaW4gYSB0aXRsZSBhcmUgZnJvbSBicm9hZCBzY2llbmNlIG9yIGRhdGEgYW5hbHlzaXMgYW5kIGhhdmUgbm90aGluZyB0byBkbyB3aXRoIHRoZSBhcnRpY2xlJ3MgdW5pcXVlIHN1YmplY3QuIFN1Y2ggcmVndWxhcmx5IG9jY3VycmluZyBidXQgbWVhbmluZ2xlc3MgdGVybXMgYXJlIGtub3duIGFzICJzdG9wd29yZHMiIGluIGxhbmd1YWdlIGFuYWx5c2lzLiBJZiB3ZSB3b3JrIHdpdGggTGl0c2VhcmNociBmcmVxdWVudGx5IGFuZCBuZWVkIHRvIGZpbHRlciBhIGxvdC4NCmBgYHtyfQ0KY2xpbnBzeV9zdG9wd29yZHMgPC0gcmVhZF9saW5lcygia2V5d29yZHMxLnR4dCIpDQoNCmNsaW5wc3lfc3RvcHdvcmRzDQpgYGANCg0KV2UgY2FuIGV4Y2x1ZGUgd29yZHMgYnkgdXNpbmcgdGhlIHN0b3B3b3JkcyBvcHRpb24gcHJvdmlkZWQgYnkgdGhlIGV4dHJhY3QgdGVybXMoKSBmdW5jdGlvbi4gVGhyb3VnaCB0aGUgZ2V0IHN0b3B3b3JkcygpIGZ1bmN0aW9uLCBsaXRzZWFyY2hyIGFsc28gb2ZmZXJzIGEgZ2VuZXJpYyBsaXN0IG9mIHN0b3B3b3JkcyBmb3IgRW5nbGlzaCAoYW5kIGZvciBzb21lIG90aGVyIGxhbmd1YWdlcyksIHNvIHdlIGNhbiBhbHNvIGluY29ycG9yYXRlIHRoaXMgaW50byBvdXIgb3duLCBtb3JlIGZvY3VzZWQgc3RvcHdvcmQgbGlzdC4NCg0KYGBge3J9DQphbGxfc3RvcHdvcmRzIDwtIGMoZ2V0X3N0b3B3b3JkcygiRW5nbGlzaCIpLCBjbGlucHN5X3N0b3B3b3JkcykNCmBgYA0KTm93IGxldOKAmXMgdXNlIHRoaXMgYmlnIGxpc3Qgb2Ygc3RvcHdvcmRzIHRvIGhhdmUgYW5vdGhlciBnbyBhdCBleHRyYWN0aW5nIG9ubHkgcmVsZXZhbnQgc2VhcmNoIHRlcm1zLg0KYGBge3J9DQp0aXRsZV90ZXJtcyA8LSBleHRyYWN0X3Rlcm1zKA0KICB0ZXh0PW5haXZlX3Jlc3VsdHNbLCAidGl0bGUiXSwNCiAgbWV0aG9kPSJmYWtlcmFrZSIsDQogIG1pbl9mcmVxPTMsIG1pbl9uPTIsDQogIHN0b3B3b3Jkcz1hbGxfc3RvcHdvcmRzDQopDQoNCnRpdGxlX3Rlcm1zDQpgYGANCg0KVGhpcyBsb29rcyBhIGJpdCBiZXR0ZXIuIFdlIHNob3VsZCBiZSBjYXJlZnVsIG5vdCB0byBhY2NpZGVudGFsbHkgZXhjbHVkZSBhbnkgcG90ZW50aWFsbHkgcmVsZXZhbnQgd29yZHMgYXQgdGhpcyBzdGFnZSwgYW5kIGFzIHVzdWFsIGV4cGxvcmF0aW9uIGlzIGltcG9ydGFudC4gVHJ5IG91dCBkaWZmZXJlbnQgbGlzdHMgb2Ygc3RvcHdvcmRzIGFuZCBkaWZmZXJlbnQgdmFsdWVzIG9mIG1pbl9mcmVxLCBtaW5fbiwgYW5kIG1heF9uIHRvIGdldCBhIGNsZWFyIGltcHJlc3Npb24gb2YgdGhlIGFydGljbGVzIGluIHRoZSBuYWl2ZSBzZWFyY2guDQoNCkxldOKAmXMgZmluaXNoIGJ5IGFkZGluZyB0b2dldGhlciB0aGUgc2VhcmNoIHRlcm1zIHdlIGdvdCBmcm9tIHRoZSBhcnRpY2xlIHRpdGxlcyBhbmQgdGhvc2Ugd2UgZ290IGZyb20gdGhlIGtleXdvcmRzIGVhcmxpZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXMuDQpgYGB7cn0NCnRlcm1zIDwtIHVuaXF1ZShjKGtleXdvcmRzLCB0aXRsZV90ZXJtcykpDQpgYGANCg0KDQpOZXh0d29yayBBbmF5bHNpcw0KDQpVbnJlbGF0ZWQgdG8gdGhlIG90aGVycyBhbmQgb3VyIGFyZWEgb2YgaW50ZXJlc3QsIHRoZXJlIGFyZSBkZWZpbml0ZWx5IHN0aWxsIHNvbWUgaW4gdGhlcmUuIFBlcmhhcHMgb25seSBhIGZldyBhcnRpY2xlcyB0aGF0IGRvbid0IG1lbnRpb24gbWFueSBvZiB0aGUgb3RoZXIgc2VhcmNoIHRlcm1zIGNvbnRhaW4gdGhlc2UuIFdlIGFyZSBpbnRlcmVzdGVkIGluIGEgbWV0aG9kaWNhbCBhcHByb2FjaCB0byBkaXNjb3ZlcmluZyB0aGVzZSAiaXNvbGF0ZWQiIHNlYXJjaCBwaHJhc2VzLg0KDQpUbyBkbyB0aGlzLCBvbmUgbWV0aG9kIGlzIHRvIG5ldHdvcmstYW5hbHl6ZSB0aGUgc2VhcmNoIHBocmFzZXMuIFRoaXMgaXMgYmFzZWQgb24gdGhlIG5vdGlvbiB0aGF0IGNvbmNlcHRzIGFyZSBjb25uZWN0ZWQgdG8gb25lIGFub3RoZXIgYnkgdmlydHVlIG9mIHNoYXJpbmcgYXJ0aWNsZXMuIFdlIGNhbiBpZGVudGlmeSBncm91cHMgb2YgdGVybXMgdGhhdCBhcmUgbGlrZWx5IGFsbCByZWZlcnJpbmcgdG8gdGhlIHNhbWUgaXNzdWUgaWYgd2UgY2FuIGlkZW50aWZ5IHdoaWNoIHRlcm1zIGZyZXF1ZW50bHkgYXBwZWFyIHRvZ2V0aGVyIGluIHRoZSBzYW1lIGFydGljbGUuDQoNClRoZSBjb21wbGV0ZSB0ZXh0cyBvZiB0aGUgYXJ0aWNsZXMgYXJlIG5vdCBhdmFpbGFibGUgdG8gdXMsIGFuZCBldmVuIGlmIHRoZXkgd2VyZSwgbXkgcnVkaW1lbnRhcnkgbWFjaGluZSB3b3VsZCBzdHJ1Z2dsZSB0byBzY2FuIGEgaHVnZSBudW1iZXIgb2YgZnVsbCB0ZXh0cyBmb3Igc2VhcmNoIHBocmFzZXMuIFRoZXJlZm9yZSwgd2Ugd2lsbCBjb25zaWRlciB0aGUgdGl0bGUgYW5kIGFic3RyYWN0IG9mIGVhY2ggYXJ0aWNsZSB0byByZXByZXNlbnQgdGhlIGFydGljbGUncyAiY29udGVudCwiIGFuZCB3ZSB3aWxsIGNvbnNpZGVyIGEgdGVybSB0byBoYXZlIGFwcGVhcmVkIGluIHRoZSBhcnRpY2xlIGlmIGl0IGFwcGVhcnMgaW4gZWl0aGVyIHRoZSB0aXRsZSBvciBhYnN0cmFjdC4gVG8gZG8gdGhpcywgd2UgbXVzdCBsaW5rIGVhY2ggYXJ0aWNsZSdzIHRpdGxlIGFuZCBhYnN0cmFjdC4NCg0KYGBge3J9DQpkb2NzIDwtIHBhc3RlKG5haXZlX3Jlc3VsdHNbLCAidGl0bGUiXSwgbmFpdmVfcmVzdWx0c1ssICJhYnN0cmFjdCJdKQ0KYGBgDQpMZXTigJlzIGp1c3QgY2hlY2sgdGhlIGZpcnN0IG9uZSB0byBtYWtlIHN1cmUgd2UgZGlkIHRoaXMgcmlnaHQuDQpgYGB7cn0NCmRvY3NbMV0NCmBgYA0KV2Ugbm93IGNyZWF0ZSBhIG1hdHJpeCB0aGF0IHJlY29yZHMgd2hpY2ggdGVybXMgYXBwZWFyIGluIHdoaWNoIGFydGljbGVzLiBUaGUgbGl0c2VhcmNociBmdW5jdGlvbiBjcmVhdGVfZGZtKCkgZG9lcyB0aGlzLiDigJhERk3igJkgc3RhbmRzIGZvciDigJhkb2N1bWVudC1mZWF0dXJlIG1hdHJpeOKAmSwgd2hlcmUgdGhlIOKAmGRvY3VtZW50c+KAmSBhcmUgb3VyIGFydGljbGVzIGFuZCB0aGUg4oCYZmVhdHVyZXPigJkgYXJlIHRoZSBzZWFyY2ggdGVybXMuIFRoZSBlbGVtZW50cyBhcmd1bWVudCBpcyB0aGUgbGlzdCBvZiBkb2N1bWVudHMuIFRoZSBmZWF0dXJlcyBhcmd1bWVudCBpcyB0aGUgbGlzdCBvZiB0ZXJtcyB3aG9zZSByZWxhdGlvbnNoaXBzIHdlIHdhbnQgdG8gYW5hbHl6ZSB3aXRoaW4gdGhhdCBzZXQgb2YgZG9jdW1lbnRzLg0KDQpgYGB7cn0NCmRmbSA8LSBjcmVhdGVfZGZtKGVsZW1lbnRzPWRvY3MsIGZlYXR1cmVzPXRlcm1zKQ0KYGBgDQoNClRoZSByb3dzIG9mIG91ciBtYXRyaXggcmVwcmVzZW50IHRoZSBhcnRpY2xlcyAodGhlaXIgdGl0bGVzIGFuZCBhYnN0cmFjdHMpLCBhbmQgdGhlIGNvbHVtbnMgcmVwcmVzZW50IHRoZSBzZWFyY2ggdGVybXMuIEVhY2ggZW50cnkgaW4gdGhlIG1hdHJpeCByZWNvcmRzIGhvdyBtYW55IHRpbWVzIHRoYXQgYXJ0aWNsZSBjb250YWlucyB0aGF0IHRlcm0uIEZvciBleGFtcGxlLCBpZiB3ZSBsb29rIGF0IHRoZSBmaXJzdCB0aHJlZSBhcnRpY2xlcyB3ZSBzZWUgdGhhdCBhZGhlcmVuY2UgZG9lcyBub3Qgb2NjdXIgaW4gYW55IG9mIHRoZW0sIGFkb2xlc2NlbnRzIG9jY3VycyBpbiB0aGUgdGhpcmQsIGFudGlkZXByZXNzYW50IG9jY3VycyBpbiB0aGUgZmlyc3QgdHdvLCBhbmQgYW54aWV0eSBvY2N1cnMgaW4gYWxsIG9mIHRoZW0uDQoNCmBgYHtyfQ0KZGZtWzE6MywgMTo0XQ0KYGBgDQoNCldlIGNhbiB0aGVuIHR1cm4gdGhpcyBtYXRyaXggaW50byBhIG5ldHdvcmsgb2YgbGlua2VkIHNlYXJjaCB0ZXJtcywgdXNpbmcgdGhlIGxpdHNlYXJjaHIgZnVuY3Rpb24gY3JlYXRlX25ldHdvcmsoKS4gVGhpcyBmdW5jdGlvbiBoYXMgYW4gYXJndW1lbnQgbWluX3N0dWRpZXMgdGhhdCBleGNsdWRlcyB0ZXJtcyB0aGF0IG9jY3VyIGluIGZld2VyIHRoYW4gYSBnaXZlbiBudW1iZXIgb2YgYXJ0aWNsZXMuDQoNCmBgYHtyfQ0KZyA8LSBjcmVhdGVfbmV0d29yayhkZm0sIG1pbl9zdHVkaWVzPTMpDQoNCmBgYA0KDQpUaGUgZ2dyYXBoKCkgZnVuY3Rpb24gdGFrZXMgdGhlIG5ldHdvcmsgdGhhdCB3ZSBnb3QgZnJvbSBjcmVhdGVfbmV0d29yaygpIGFzIGl0cyBhcmd1bWVudCBhbmQgZHJhd3MgaXQgYXMgYSBncmFwaC4gSW4gYWRkaXRpb24sIHdlIGNhbiBzcGVjaWZ5IGEgbGF5b3V0IGZvciB0aGUgZ3JhcGguIEhlcmUgd2UgdXNlIHRoZSDigJhLYW1hZGEgYW5kIEthd2Fp4oCZIGxheW91dC4gVG8gc3VtIGl0IHVwIHZlcnkgc2ltcGx5LCB0aGlzIGxheW91dCBkcmF3cyB0ZXJtcyB0aGF0IGFyZSBjbG9zZWx5IGxpbmtlZCBjbG9zZSB0b2dldGhlciwgYW5kIHRob3NlIHRoYXQgYXJlIGxlc3MgY2xvc2VseSBsaW5rZWQgZnVydGhlciBhd2F5IGZyb20gZWFjaCBvdGhlci4gV2UgYWRkIHNvbWUgbGFiZWxzIHNob3dpbmcgd2hhdCB0aGUgYWN0dWFsIHRlcm1zIGFyZSwgdXNpbmcgZ2VvbV9ub2RlX3RleHQoKS4gU2luY2UgdGhlcmUgYXJlIGZhciB0b28gbWFueSB0ZXJtcyB0byBzaG93IGFsbCBvZiB0aGVtIHdpdGhvdXQgY29tcGxldGVseSBjbHV0dGVyaW5nIHRoZSBmaWd1cmUsIHdlIHNob3cganVzdCBhbiBhcmJpdHJhcnkgc3Vic2V0IG9mIHRoZW0gdGhhdCBkbyBub3Qgb3ZlcmxhcCBvbiB0aGUgZmlndXJlLCB1c2luZyB0aGUgYXJndW1lbnQgY2hlY2tfb3ZlcmxhcD1UUlVFLiBGaW5hbGx5LCB3ZSBhbHNvIGFkZCBsaW5lcyBsaW5raW5nIHRoZSB0ZXJtcywgdXNpbmcgZ2VvbV9lZGdlX2xpbmsoKS4gV2UgY29sb3IgdGhlc2UgbGluZXMgc28gdGhlcmUgYXJlIG1vcmUgc29saWQgbGluZXMgbGlua2luZyB0ZXJtcyB0aGF0IGFwcGVhciBpbiBtb3JlIGFydGljbGVzIHRvZ2V0aGVyICh0aGlzIGlzIGNhbGxlZCB0aGUg4oCYd2VpZ2h04oCZIG9mIHRoZSBsaW5rKS4NCg0KYGBge3J9DQpnZ3JhcGgoZywgbGF5b3V0PSJzdHJlc3MiKSArDQogIGNvb3JkX2ZpeGVkKCkgKw0KICBleHBhbmRfbGltaXRzKHg9YygtMywgMykpICsNCiAgZ2VvbV9lZGdlX2xpbmsoYWVzKGFscGhhPXdlaWdodCkpICsNCiAgZ2VvbV9ub2RlX3BvaW50KHNoYXBlPSJjaXJjbGUgZmlsbGVkIiwgZmlsbD0id2hpdGUiKSArDQogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbD1uYW1lKSwgaGp1c3Q9Im91dHdhcmQiLCBjaGVja19vdmVybGFwPVRSVUUpICsNCiAgZ3VpZGVzKGVkZ2VfYWxwaGE9RkFMU0UpDQpgYGANCg0KUHJ1bmluZw0KDQpOb3cgbGV04oCZcyB1c2UgdGhlIG5ldHdvcmsgdG8gcmFuayBvdXIgc2VhcmNoIHRlcm1zIGJ5IGltcG9ydGFuY2UsIHdpdGggdGhlIGFpbSBvZiBwcnVuaW5nIGF3YXkgc29tZSBvZiB0aGUgbGVhc3QgaW1wb3J0YW50IG9uZXMuDQoNClRoZSDigJhzdHJlbmd0aOKAmSBvZiBlYWNoIHRlcm0gaW4gdGhlIG5ldHdvcmsgaXMgdGhlIG51bWJlciBvZiBvdGhlciB0ZXJtcyB0aGF0IGl0IGFwcGVhcnMgdG9nZXRoZXIgd2l0aC4gV2UgY2FuIGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20gb3VyIG5ldHdvcmsgdXNpbmcgdGhlIHN0cmVuZ3RoKCkgZnVuY3Rpb24gZnJvbSB0aGUgaWdyYXBoIHBhY2thZ2UgKGJlaGluZCB0aGUgc2NlbmVzLCBsaXRzZWFyY2hyIHVzZXMgaWdyYXBoIGZvciBzb21lIG9mIHRoZSB3b3JraW5ncyBvZiBpdHMgbmV0d29yayBhbmFseXNlcykuIElmIHdlIHRoZW4gYXJyYW5nZSB0aGUgdGVybXMgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHN0cmVuZ3RoIHdlIHNlZSB0aG9zZSB0aGF0IG1pZ2h0IGJlIHRoZSBsZWFzdCBpbXBvcnRhbnQuDQoNCmBgYHtyfQ0Kc3RyZW5ndGhzIDwtIHN0cmVuZ3RoKGcpDQoNCmRhdGEuZnJhbWUodGVybT1uYW1lcyhzdHJlbmd0aHMpLCBzdHJlbmd0aD1zdHJlbmd0aHMsIHJvdy5uYW1lcz1OVUxMKSAlPiUNCiAgbXV0YXRlKHJhbms9cmFuayhzdHJlbmd0aCwgdGllcy5tZXRob2Q9Im1pbiIpKSAlPiUNCiAgYXJyYW5nZShzdHJlbmd0aCkgLT4NCiAgdGVybV9zdHJlbmd0aHMNCg0KdGVybV9zdHJlbmd0aHMNCmBgYA0KQXQgdGhlIHRvcCBhcmUgdGhlIHRlcm1zIHRoYXQgYXJlIG1vc3Qgd2Vha2x5IGxpbmtlZCB0byB0aGUgb3RoZXJzLiBGb3Igc29tZSBvZiB0aGVtIHlvdSBjYW4gY29tcGFyZSB0aGlzIHdpdGggdGhlaXIgcG9zaXRpb25zIG9uIHRoZSBncmFwaCB2aXN1YWxpemF0aW9uIGFib3ZlLCB3aGVyZSB0aGV5IGFwcGVhciBuZWFyIHRoZSBtYXJnaW5zIG9mIHRoZSBmaWd1cmUuIEluIG1vc3QgY2FzZXMsIHRlcm1zIGxpa2UgdGhlc2UgYXJlIGNvbXBsZXRlbHkgaXJyZWxldmFudCBhbmQgaGF2ZSBvY2N1cnJlZCBpbiBhIGZldyBvZiB0aGUgYXJ0aWNsZXMgaW4gdGhlIG5haXZlIHNlYXJjaCBmb3IgYXJiaXRyYXJ5IHJlYXNvbnMsIGZvciBleGFtcGxlIHZpcnR1YWwgcmVhbGl0eS4gU29tZSBhcmUgcGVyaGFwcyBzdGlsbCByZWxldmFudCBidXQgYXJlIGp1c3QgdmVyeSByYXJlbHkgdXNlZC4NCg0KV2Ugd291bGQgbGlrZSB0byBkaXNjYXJkIHNvbWUgb2YgdGhlIHRlcm1zIHRoYXQgb25seSByYXJlbHkgb2NjdXIgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXJzLiBXaGF0IHJ1bGUgY2FuIHdlIHVzZSB0byBtYWtlIGEgZGVjaXNpb24gYWJvdXQgd2hpY2ggdG8gZGlzY2FyZD8gVG8gZ2V0IGFuIGlkZWEgb2YgaG93IHdlIG1pZ2h0IGFwcHJvYWNoIHRoaXMgcXVlc3Rpb24sIGxldOKAmXMgdmlzdWFsaXplIHRoZSBzdHJlbmd0aHMgb2YgdGhlIHRlcm1zLg0KDQpgYGB7cn0NCmN1dG9mZl9maWcgPC0gZ2dwbG90KHRlcm1fc3RyZW5ndGhzLCBhZXMoeD1yYW5rLCB5PXN0cmVuZ3RoLCBsYWJlbD10ZXJtKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fdGV4dChkYXRhPWZpbHRlcih0ZXJtX3N0cmVuZ3RocywgcmFuaz41KSwgaGp1c3Q9InJpZ2h0IiwgbnVkZ2VfeT0yMCwgY2hlY2tfb3ZlcmxhcD1UUlVFKQ0KDQpjdXRvZmZfZmlnDQpgYGANCg0KVGhlIGZpZ3VyZSBzaG93cyB0aGUgdGVybXMgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHN0cmVuZ3RoIGZyb20gbGVmdCB0byByaWdodC4gQWdhaW4sIG9ubHkgYW4gYXJiaXRyYXJ5IHN1YnNldCBvZiB0aGUgdGVybXMgYXJlIGxhYmVsZWQsIHNvIGFzIG5vdCB0byBjbHV0dGVyIHRoZSBmaWd1cmUuIFdlIGNhbiBzZWUgZm9yIGV4YW1wbGUgdGhhdCB0aGVyZSBhcmUgZml2ZSB0ZXJtcyAoc3RhcnRpbmcgd2l0aCBiZWhhdmlvcmFsIHRoZXJhcHkpIHRoYXQgaGF2ZSBtdWNoIGhpZ2hlciBzdHJlbmd0aHMgdGhhbiB0aGUgb3RoZXJzLg0KDQpMZXTigJlzIHVzZSB0aGlzIGZpZ3VyZSB0byB2aXN1YWxpemUgdHdvIG1ldGhvZHMgdGhhdCBsaXRzZWFyY2hyIG9mZmVycyBmb3IgcHJ1bmluZyBhd2F5IHRoZSBzZWFyY2ggdGVybXMgbGVhc3QgY2xvc2VseSBsaW5rZWQgdG8gdGhlIG90aGVycy4gQm90aCBvZiB0aGVzZSBpbnZvbHZlIGZpbmRpbmcgYSBjdXRvZmYgdmFsdWUgZm9yIHRlcm0gc3RyZW5ndGgsIHN1Y2ggdGhhdCB3ZSBkaXNjYXJkIHRlcm1zIHdpdGggYSBzdHJlbmd0aCBiZWxvdyB0aGF0IHZhbHVlLiBUaGUgZmluZF9jdXRvZmYoKSBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZXNlIG1ldGhvZHMuDQoNCkN1bXVsYXRpdmVseQ0KDQoNCk9uZSBzaW1wbGUgd2F5IHRvIGRlY2lkZSBvbiBhIGN1dG9mZiBpcyB0byBjaG9vc2UgdG8gcmV0YWluIGEgY2VydGFpbiBwcm9wb3J0aW9uIG9mIHRoZSB0b3RhbCBzdHJlbmd0aCBvZiB0aGUgbmV0d29yayBvZiBzZWFyY2ggdGVybXMsIGZvciBleGFtcGxlIDgwJS4gSWYgd2Ugc3VwcGx5IHRoZSBhcmd1bWVudCBtZXRob2Q9ImN1bXVsYXRpdmUiIHRvIHRoZSBmaW5kX2N1dG9mZigpIGZ1bmN0aW9uLCB3ZSBnZXQgdGhlIGN1dG9mZiBzdHJlbmd0aCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhpcyBtZXRob2QuIFRoZSBwZXJjZW50IGFyZ3VtZW50IHNwZWNpZmllcyB3aGF0IHByb3BvcnRpb24gb2YgdGhlIHRvdGFsIHN0cmVuZ3RoIHdlIHdvdWxkIGxpa2UgdG8gcmV0YWluLg0KDQpgYGB7cn0NCmN1dG9mZl9jdW0gPC0gZmluZF9jdXRvZmYoZywgbWV0aG9kPSJjdW11bGF0aXZlIiwgcGVyY2VudD0wLjgpDQoNCmN1dG9mZl9jdW0NCmBgYA0KTGV04oCZcyBzZWUgdGhpcyBvbiBvdXIgZmlndXJlLg0KYGBge3J9DQpjdXRvZmZfZmlnICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PWN1dG9mZl9jdW0sIGxpbmV0eXBlPSJkYXNoZWQiKQ0KYGBgDQpPbmNlIHdlIGhhdmUgZm91bmQgYSBjdXRvZmYgdmFsdWUsIHRoZSByZWR1Y2VfZ3JhcGgoKSBmdW5jdGlvbiBhcHBsaWVzIGl0IGFuZCBwcnVuZXMgYXdheSB0aGUgdGVybXMgd2l0aCBsb3cgc3RyZW5ndGguIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBvcmlnaW5hbCBuZXR3b3JrIGFuZCB0aGUgY3V0b2ZmLiBUaGUgZ2V0X2tleXdvcmRzKCkgZnVuY3Rpb24gdGhlbiBnZXRzIHRoZSByZW1haW5pbmcgdGVybXMgZnJvbSB0aGUgcmVkdWNlZCBuZXR3b3JrLg0KYGBge3J9DQpnZXRfa2V5d29yZHMocmVkdWNlX2dyYXBoKGcsIGN1dG9mZl9jdW0pKQ0KYGBgDQpDaGFuZ2Vwb2ludHMNCg0KTG9va2luZyBhdCB0aGUgZmlndXJlIGFib3ZlLCBhbm90aGVyIG1ldGhvZCBvZiBwcnVuaW5nIGF3YXkgdGVybXMgc3VnZ2VzdHMgaXRzZWxmLiBUaGVyZSBhcmUgY2VydGFpbiBwb2ludHMgYWxvbmcgdGhlIHJhbmtpbmcgb2YgdGVybXMgd2hlcmUgdGhlIHN0cmVuZ3RoIG9mIHRoZSBuZXh0IHN0cm9uZ2VzdCB0ZXJtIGlzIG11Y2ggZ3JlYXRlciB0aGFuIHRoYXQgb2YgdGhlIHByZXZpb3VzIG9uZSAocGxhY2VzIHdoZXJlIHRoZSBhc2NlbmRpbmcgbGluZSDigJhqdW1wcyB1cOKAmSkuIFdlIGNvdWxkIHVzZSB0aGVzZSBwbGFjZXMgYXMgY3V0b2Zmcywgc2luY2UgdGhlIHRlcm1zIGJlbG93IHRoZW0gaGF2ZSBtdWNoIGxvd2VyIHN0cmVuZ3RoIHRoYW4gdGhvc2UgYWJvdmUuIFRoZXJlIG1heSBvZiBjb3Vyc2UgYmUgbW9yZSB0aGFuIG9uZSBwbGFjZSB3aGVyZSB0ZXJtIHN0cmVuZ3RoIGp1bXBzIHVwIGxpa2UgdGhpcywgc28gd2Ugd2lsbCBoYXZlIG11bHRpcGxlIGNhbmRpZGF0ZXMgZm9yIGN1dG9mZnMuIFRoZSBzYW1lIGZpbmRfY3V0b2ZmKCkgZnVuY3Rpb24gd2l0aCB0aGUgYXJndW1lbnQgbWV0aG9kPSJjaGFuZ2Vwb2ludCIgd2lsbCBmaW5kIHRoZXNlIGN1dG9mZnMuIFRoZSBrbm90X251bSBhcmd1bWVudCBzcGVjaWZpZXMgaG93IG1hbnkg4oCYa25vdHPigJkgd2Ugd2lzaCB0byBzbGljZSB0aGUga2V5d29yZHMgaW50by4NCmBgYHtyfQ0KY3V0b2ZmX2NoYW5nZSA8LSBmaW5kX2N1dG9mZihnLCBtZXRob2Q9ImNoYW5nZXBvaW50Iiwga25vdF9udW09MykNCg0KY3V0b2ZmX2NoYW5nZQ0KYGBgDQpUaGlzIHRpbWUgd2UgZ2V0IHNldmVyYWwgc3VnZ2VzdGVkIGN1dG9mZnMuIExldOKAmXMgcHV0IHRoZW0gb24gb3VyIGZpZ3VyZSwgd2hlcmUgd2UgY2FuIHNlZSB0aGF0IHRoZXkgY3V0IG9mZiB0aGUgc2VhcmNoIHRlcm1zIGp1c3QgYmVmb3JlIGxhcmdlIGluY3JlYXNlcyBpbiB0ZXJtIHN0cmVuZ3RoLg0KYGBge3J9DQpjdXRvZmZfZmlnICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PWN1dG9mZl9jaGFuZ2UsIGxpbmV0eXBlPSJkYXNoZWQiKQ0KYGBgDQpBZnRlciBkb2luZyB0aGlzLCB3ZSBjYW4gYXBwbHkgdGhlIHNhbWUgcmVkdWNlX2dyYXBoKCkgZnVuY3Rpb24gdGhhdCB3ZSBkaWQgZm9yIHRoZSBjdW11bGF0aXZlIHN0cmVuZ3RoIG1ldGhvZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHdlIGhhdmUgdG8gcGljayBvbmUgb2YgdGhlIGN1dG9mZnMgaW4gb3VyIHZlY3Rvci4NCmBgYHtyfQ0KZ19yZWR1eCA8LSByZWR1Y2VfZ3JhcGgoZywgY3V0b2ZmX2NoYW5nZVsxXSkNCnNlbGVjdGVkX3Rlcm1zIDwtIGdldF9rZXl3b3JkcyhnX3JlZHV4KQ0KDQpzZWxlY3RlZF90ZXJtcw0KYGBgDQpHcm91cGluZw0KTm93IHRoYXQgd2UgaGF2ZSBnb3QgYSByZXZpc2VkIGxpc3Qgb2Ygc2VhcmNoIHRlcm1zIGZyb20gdGhlIHJlc3VsdHMgb2Ygb3VyIG5haXZlIHNlYXJjaCwgd2Ugd2FudCB0byB0dXJuIHRoZW0gaW50byBhIG5ldyBzZWFyY2ggcXVlcnkgdGhhdCB3ZSBjYW4gdXNlIHRvIGdldCBtb3JlIGFydGljbGVzIHJlbGV2YW50IHRvIHRoZSBzYW1lIHRvcGljLiBGb3IgdGhpcyBuZXcsIGhvcGVmdWxseSBtb3JlIHJpZ29yb3VzLCBzZWFyY2ggd2Ugd2lsbCBuZWVkIGEgY29tYmluYXRpb24gb2YgT1IgYW5kIEFORCBvcGVyYXRvcnMuIFRoZSBPUiBvcGVyYXRvciBzaG91bGQgY29tYmluZSBzZWFyY2ggdGVybXMgdGhhdCBhcmUgYWxsIGFib3V0IHRoZSBzYW1lIHN1YnRvcGljLCBzbyB0aGF0IHdlIGdldCBhcnRpY2xlcyB0aGF0IGNvbnRhaW4gYW55IG9uZSBvZiB0aGVtLiBUaGUgQU5EIG9wZXJhdG9yIHNob3VsZCBjb21iaW5lIHRoZXNlIGdyb3VwcyBvZiBzZWFyY2ggdGVybXMgc28gdGhhdCB3ZSBnZXQgb25seSBhcnRpY2xlcyB0aGF0IG1lbnRpb24gYXQgbGVhc3Qgb25lIHRlcm0gZnJvbSBlYWNoIG9mIHRoZSBzdWJ0b3BpY3MgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4NCg0KSW4gb3VyIHN0YXJ0aW5nIGV4YW1wbGUgd2UgaGFkIHRocmVlIHN1YnRvcGljcywgbWVkaWNhdGlvbiwgY29nbml0aXZlLWJlaGF2aW9yYWwgdGhlcmFweSwgYW5kIHBob2JpYXMuIFNvIHRoZSBmaXJzdCBzdGVwIGlzIHRvIHRha2UgdGhlIHRlcm1zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhbmQgZ3JvdXAgdGhlbSBpbnRvIGNsdXN0ZXJzIHJlbGF0ZWQgdG8gZWFjaCBvZiB0aGVzZSB0b3BpY3MuIChPciBpdCBtYXkgYmUgdGhlIGNhc2UgdGhhdCBvdXIgd29yayB3aXRoIGxpdHNlYXJjaHIgaGFzIGxlZCB1cyB0byByZXRoaW5rIG91ciBzdWJ0b3BpY3Mgb3IgdG8gYWRkIG5ldyBvbmVzLikNCg0KVGhlcmUgYXJlIG1ldGhvZHMgZm9yIGF1dG9tYXRpY2FsbHkgZ3JvdXBpbmcgbmV0d29ya3MgaW50byBjbHVzdGVycywgYnV0IHRoZXNlIGFyZSBub3QgYWx3YXlzIHNvIHJlbGlhYmxlOyBjb21wdXRlcnMgZG9u4oCZdCB1bmRlcnN0YW5kIHdoYXQgd29yZHMgbWVhbi4gQ3VycmVudGx5IHRoZSBsaXRzZWFyY2hyIGRvY3VtZW50YXRpb24gcmVjb21tZW5kcyBkb2luZyB0aGlzIHN0ZXAgbWFudWFsbHkuIFdlIGxvb2sgYXQgb3VyIHNlYXJjaCB0ZXJtcywgYW5kIHB1dCB0aGVtIGludG8gYSBsaXN0IG9mIHNlcGFyYXRlIHZlY3RvcnMsIG9uZSBmb3IgZWFjaCBzdWJ0b3BpYw0KYGBge3J9DQpncm91cGVkX3Rlcm1zIDwtbGlzdCgNCiAgZ2VuaW5kdXN0cnl0ZXJtPXNlbGVjdGVkX3Rlcm1zW2MoMSwgMzQsIDQwLCA0MywgMjgsIDMxLCA5NCwgMzQsIDM3LCA2NywgOTEsIDk3LCAxMDApXSwNCiAgYnVzaW5lc3M9c2VsZWN0ZWRfdGVybXNbYyg0LCA3LCA1NSwgMTAsIDIyLCAyNSwgMjYsIDI5LCAzMCwgNDksIDU1LCA1OCwgNjQsIDcwLCA3MywgODIsIDg1LCA4OCldLA0KICBza2lsbD1zZWxlY3RlZF90ZXJtc1tjKDEzLCAxNiwgMTIsIDE1LCAyMCwgMjEsIDIzLCAyNywgNDYsIDE5LCA2MSwgNzYsIDc5KV0pDQpncm91cGVkX3Rlcm1zDQoNCmBgYA0KV3JpdGluZyBhIG5ldyBzZWFyY2gNClRoZSB3cml0ZV9zZWFyY2goKSBmdW5jdGlvbiB0YWtlcyBvdXIgbGlzdCBvZiBncm91cGVkIHNlYXJjaCB0ZXJtcyBhbmQgd3JpdGVzIHRoZSB0ZXh0IG9mIGEgbmV3IHNlYXJjaC4gVGhlcmUgYXJlIHF1aXRlIGEgZmV3IGFyZ3VtZW50cyB0byB0YWtlIGNhcmUgb2YgZm9yIHRoaXMgZnVuY3Rpb246DQoNCmxhbmd1YWdlcyBwcm92aWRlcyBhIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIHRyYW5zbGF0ZSB0aGUgc2VhcmNoIGludG8sIGluIGNhc2Ugd2Ugd2FudCB0byBnZXQgYXJ0aWNsZXMgaW4gbXVsdGlwbGUgbGFuZ3VhZ2VzLg0KZXhhY3RwaHJhc2UgY29udHJvbHMgd2hldGhlciB0ZXJtcyB0aGF0IGNvbnNpc3Qgb2YgbW9yZSB0aGFuIG9uZSB3b3JkIHNob3VsZCBiZSBtYXRjaGVkIGV4YWN0bHkgcmF0aGVyIHRoYW4gYXMgdHdvIHNlcGFyYXRlIHdvcmRzLiBJZiB3ZSBoYXZlIHBocmFzZXMgdGhhdCBhcmUgb25seSByZWxldmFudCBhcyBhIHdob2xlIHBocmFzZSwgdGhlbiB3ZSBzaG91bGQgc2V0IHRoaXMgdG8gVFJVRSwgc28gdGhhdCBmb3IgZXhhbXBsZSBzb2NpYWwgcGhvYmlhIHdpbGwgbm90IGFsc28gY2F0Y2ggYWxsIHRoZSBhcnRpY2xlcyBjb250YWluaW5nIHRoZSB3b3JkIHNvY2lhbC4NCnN0ZW1taW5nIGNvbnRyb2xzIHdoZXRoZXIgd29yZHMgYXJlIHN0cmlwcGVkIGRvd24gdG8gdGhlIHNtYWxsZXN0IG1lYW5pbmdmdWwgcGFydCBvZiB0aGUgd29yZCAoaXRzIOKAmHN0ZW3igJkpIHNvIHRoYXQgd2UgbWFrZSBzdXJlIHRvIGNhdGNoIGFsbCB2YXJpYW50cyBvZiB0aGUgd29yZCwgZm9yIGV4YW1wbGUgY2F0Y2hpbmcgYm90aCBiZWhhdmlvciBhbmQgYmVoYXZpb3JhbC4NCmNsb3N1cmUgY29udHJvbHMgd2hldGhlciBwYXJ0aWFsIG1hdGNoZXMgYXJlIG1hdGNoZWQgYXQgdGhlIGxlZnQgZW5kIG9mIGEgd29yZCAoImxlZnQiKSwgYXQgdGhlIHJpZ2h0ICgicmlnaHQiKSwgb25seSBhcyBleGFjdCBtYXRjaGVzICgiZnVsbCIpIG9yIGFzIGFueSB3b3JkIGNvbnRhaW5pbmcgYSB0ZXJtICgibm9uZSIpLg0Kd3JpdGVzZWFyY2ggY29udHJvbHMgd2hldGhlciB3ZSB3b3VsZCBsaWtlIHRvIHdyaXRlIHRoZSBzZWFyY2ggdGV4dCB0byBhIGZpbGUuDQoNCg0KYGBge3J9DQp3cml0ZV9zZWFyY2goDQogIGdyb3VwZWRfdGVybXMsDQogIGxhbmd1YWdlcz0iRW5nbGlzaCIsDQogIGV4YWN0cGhyYXNlPVRSVUUsDQogIHN0ZW1taW5nPUZBTFNFLA0KICBjbG9zdXJlPSJsZWZ0IiwNCiAgd3JpdGVzZWFyY2g9VFJVRQ0KKQ0KYGBgDQoNCkxldOKAmXMgcmVhZCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHRleHQgZmlsZSB0aGF0IHdlIGp1c3Qgd3JvdGUsIHRvIHNlZSB3aGF0IG91ciBzZWFyY2ggdGV4dCBsb29rcyBsaWtlLg0KYGBge3J9DQpjYXQocmVhZF9maWxlKCJzZWFyY2gtaW5FbmdsaXNoLnR4dCIpKQ0KYGBgDQpXZSBjYW4gbm93IGdvIGJhY2sgdG8gdGhlIHNlYXJjaCBzaXRlIGFuZCBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGlzIHRleHQgZmlsZSBpbnRvIHRoZSBzZWFyY2ggZmllbGQgdG8gY29uZHVjdCBhIG5ldyBzZWFyY2guDQoNCkNoZWNraW5nIHRoZSBuZXcgc2VhcmNoDQoNCkkgcmFuIG91ciBuZXcgc2VhcmNoIGFuZCBkb3dubG9hZGVkIHRoZSByZXN1bHRzIHRvIGEgZmlsZSBjYWxsZWQgc2NvcHVzLiBMZXTigJlzIGxvYWQgdGhpcyBmaWxlIHdpdGggbGl0c2VhcmNoci4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudCwgYXMgdGhpcyBmaWxlIGNvbnRhaW5zIGEgbG90IG1vcmUgcmVzdWx0cyB0aGFuIHRoZSBuYWl2ZSBzZWFyY2guDQoNCg0KYGBge3J9DQpuZXdfcmVzdWx0cyA8LSBpbXBvcnRfcmVzdWx0cyhmaWxlPSJzY29wdXMuYmliIikNCmBgYA0KSG93IG1hbnkgZGlkIHdlIGdldD8gDQoNCmBgYHtyfQ0KbnJvdyhuZXdfcmVzdWx0cykNCmBgYA0KV2Ugbm93IG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgbmV3IHJlc3VsdHMgc2VlbSB0byBiZSByZWxldmFudCB0byBvdXIgY2hvc2VuIHRvcGljLiBUaGVyZSBhcmUgYSBmZXcgYmFzaWMgdGhpbmdzIHRoYXQgd2UgY2FuIGNoZWNrLg0KDQpBZ2FpbnN0IHRoZSBuYWl2ZSBzZWFyY2gNCg0KV2UgY2FuIGZpcnN0IGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSByZXN1bHRzIG9mIHRoZSBuYWl2ZSBzZWFyY2ggYXJlIGluIHRoZSBuZXcgc2VhcmNoLiBTaW5jZSB3ZSBjb25kdWN0ZWQgdGhlIG5haXZlIHNlYXJjaCB1c2luZyB0aGUgbW9zdCBpbXBvcnRhbnQgdGVybXMgdGhhdCBvY2N1cnJlZCB0byB1cyBmb3Igb3VyIHRvcGljLCBhbmQgc2luY2Ugd2UgaW5jbHVkZWQgdGhlc2Ugc2FtZSB0ZXJtcyBvciB2ZXJ5IHNpbWlsYXIgaW4gb3VyIG5ldyBzZWFyY2gsIHdlIG91Z2h0IHRvIGdldCB0aGUgc2FtZSBhcnRpY2xlcyBiYWNrIGFtb25nIG91ciBuZXcgcmVzdWx0cywgYXQgbGVhc3QgaWYgdGhleSB3ZXJlIHJlYWxseSByZWxldmFudC4NCg0KYGBge3J9DQpuYWl2ZV9yZXN1bHRzICU+JQ0KICBtdXRhdGUoaW5fbmV3X3Jlc3VsdHM9dGl0bGUgJWluJSBuZXdfcmVzdWx0c1ssICJ0aXRsZSJdKSAtPg0KICBuYWl2ZV9yZXN1bHRzDQoNCm5haXZlX3Jlc3VsdHMgJT4lDQogIGZpbHRlcighaW5fbmV3X3Jlc3VsdHMpICU+JQ0KICBzZWxlY3QodGl0bGUsIGtleXdvcmRzKQ0KDQpgYGANCg0KDQpXZSBkaWRu4oCZdCBtaXNzIGFueSBvZiB0aGUgYXJ0aWNsZXMgZnJvbSB0aGUgbmFpdmUgc2VhcmNoLiBHb29kLg0KDQpBZ2FpbnN0IGdvbGQgc3RhbmRhcmQgcmVzdWx0cw0KDQpJZiB3ZSBoYXZlIHN0YXJ0ZWQgcmV2aWV3aW5nIHRoZSBsaXRlcmF0dXJlIG9uIG91ciBjaG9zZW4gdG9waWMsIHdlIG1heSBhbHJlYWR5IGtub3cgdGhlIHRpdGxlcyBvZiBzb21lIGltcG9ydGFudCBhcnRpY2xlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIG9uIHRoZSBzdWJqZWN0LiBTbyBhbm90aGVyIHdheSBvZiBjaGVja2luZyBvdXIgbmV3IHNlYXJjaCBpcyB0byBjaGVjayB3aGV0aGVyIGl0IGluY2x1ZGVzIHNwZWNpZmljIGltcG9ydGFudCByZXN1bHRzLiBsaXRzZWFyY2hyIHByb3ZpZGVzIGEgZnVuY3Rpb24gY2FsbGVkIGNoZWNrX3JlY2FsbCgpIGZvciBzZWFyY2hpbmcgZm9yIHNwZWNpZmljIHRpdGxlcy4gV2UgZG8gbm90IGhhdmUgdG8gZ2V0IHRoZSB0aXRsZXMgb2Ygb3VyIGRlc2lyZWQgYXJ0aWNsZXMgZXhhY3RseSByaWdodC4gSWYgdGhlIGNhcGl0YWxpemF0aW9uIG9yIHB1bmN0dWF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSB2ZXJzaW9uIGluIG91ciByZXN1bHRzIGRhdGFmcmFtZSwgY2hlY2tfcmVjYWxsKCkgd2lsbCBmaW5kIHRoZSBjbG9zZXN0IG1hdGNoLg0KDQpMZXTigJlzIHRyeSBpdC4NCg0KYGBge3J9DQppbXBvcnRhbnRfdGl0bGVzIDwtIGMoDQogICJJbmR1c3RyeSA1LjA6IEEgc3VydmV5IG9uIGVuYWJsaW5nIHRlY2hub2xvZ2llcyBhbmQgcG90ZW50aWFsIGFwcGxpY2F0aW9ucyIsIkV4cGxvcmluZyB0aGUgQXBwbGljYXRpb24gU3BoZXJlIG9mIHRoZSBJbnRlcm5ldCBvZiBUaGluZ3MgaW4gSW5kdXN0cnkgNC4wOiBBIFJldmlldywgQmlibGlvbWV0cmljIGFuZCBDb250ZW50IEFuYWx5c2lzDQoiDQopDQoNCmRhdGEuZnJhbWUoY2hlY2tfcmVjYWxsKGltcG9ydGFudF90aXRsZXMsIG5ld19yZXN1bHRzWywgInRpdGxlIl0pKQ0KYGBgDQoNCkFsbCBvZiB0aGUgYmVzdCBtYXRjaGVzIGluIHRoZSBvdXRwdXQgdGFibGUgYXJlIGNsZWFybHkgdGhlIGFydGljbGVzIHRoYXQgd2Ugd2VyZSBsb29raW5nIGZvciwgc28gb3VyIG5ldyBzZWFyY2ggaGFzIGZvdW5kIHRoZXNlLg0KDQpUaGF04oCZcyB0aGUgZW5kIG9mIG91ciB0dXRvcmlhbC4gWW91IGNhbiB0cnkgdG8gcmVmaW5lIHRoZSBleGFtcGxlIHNlYXJjaCBmdXJ0aGVyLCBvciB0cnkgb25lIG9mIHlvdXIgb3duLg==