Cyclistic Customer Usage Trends in 2022

Ask

The Marketing Department of Cyclistic has asked the Analytics team to deliver actionable insights into the usage characteristics of Cyclistic’s customer base to determine how to convert existing Casual users into Membership holders, which represents a more profitable customer demographic.

Setup

                      library(tidyverse)
library(lubridate)
                    

Prepare

The data for this product was imported from the company’s records in the form of 12 zip compressed CSV files. These were imported from the server using a bash script to gather all files pertaining to calendar year 2022 and stored locally in an rstudio project folder and managed on the teams local server as a Git repository. Only members of the team were given access to the source data. The CSV were created as read-only to maintain the integrity of the source data. After the csv files were reviewed the Zip files were removed from the repository.

The individual datasets were concatenated using the rbind() function with the following script:

The complete dataset was was wriiten to the file 2202-all-divvy-tripdata.csv which was also set to Read Only. The dataset was then assigned to the object “df”.

                   [1] "...1"               "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [7] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"          "end_lat"           
[13] "end_lng"            "member_casual"     
                

Process

Upon inspection of the data the naming conventions were found to be acceptable for the analysis and it was determined that there was no obvious concern regarding bias in the population. The team chose to create new variables to gain clearer insight into the dataset such as trip_duration, day_of_week, day_of_year, and month_of_year. It was determined that observations of docked_bike were in need of cleaning as this value was not pertinent to the business task.

                   [1] "id"                 "ride_id"            "rideable_type"      "started_at"         "ended_at"           "start_station_name"
 [7] "start_station_id"   "end_station_name"   "end_station_id"     "start_lat"          "start_lng"          "end_lat"           
[13] "end_lng"            "member_casual"      "day_of_week"        "trip_duration"      "day_of_year"        "month_of_year"     
                

An initial summary was run on the numeric variable trip_duration to determine the distribution of data across the dataset and generated the following boxplot.

                       Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-172.5558    0.0969    0.1714    0.3241    0.3078  689.7875 
                

A table comparing the categorical variables member_casual and rideable_type showed a disparity in the docked_bike value in relation to subscriber types.

                          
         classic_bike docked_bike electric_bike
  casual       891459      177474       1253099
  member      1709755           0       1635930
                

This showed notable outliers above the third Quartile and revealed that there were ride duration values of zero or less. The following Histogram gave further insight of the trends regarding trip duration.

Since the vast majority of rides had a ride limit under 1 hour the data was filtered to more accurately reflect trends including any negative trip value. Also any observations that referenced docked_bike in rideable_type were filtered out as well.

Analyze

Tables were generated from the categorical variables member_casual, rideable_type, trip_duration, day_of_week, and month_of_year.

                          
               1       2       3       4       5       6       7       8       9      10      11      12     Sum
  casual   16995   19266   76575  108087  236938  320073  354181  316799  265353  189089   92633   42249 2038238
  member   84686   93690  192893  243453  351689  396756  413990  423723  401602  347358  235676  136165 3321681
  Sum     101681  112956  269468  351540  588627  716829  768171  740522  666955  536447  328309  178414 5359919
                
                          
               1       2       3       4       5       6       7     Sum
  casual  330201  241640  236151  247859  278413  298235  405739 2038238
  member  383094  470266  515720  521024  529003  463922  438652 3321681
  Sum     713295  711906  751871  768883  807416  762157  844391 5359919
                
                          
                1        2        3        4        5        6        7
  casual 46.29235 33.94268 31.40845 32.23624 34.48198 39.13039 48.05108
  member 53.70765 66.05732 68.59155 67.76376 65.51802 60.86961 51.94892
                
                          
                1        2        3        4        5        6        7        8        9       10       11       12
  casual 16.71404 17.05620 28.41710 30.74671 40.25266 44.65123 46.10705 42.78050 39.78574 35.24840 28.21519 23.68032
  member 83.28596 82.94380 71.58290 69.25329 59.74734 55.34877 53.89295 57.21950 60.21426 64.75160 71.78481 76.31968
                
                          
         classic_bike electric_bike
  casual     32.64091      42.80911
  member     67.35909      57.19089
                

The tables show that in all monthly and weekly observations members make up the majority usage of total rides. This difference is not as marked on the weekends. Casual riders also prefer the electric bikes to a higher degree than the classic, while the opposite trend is true for members. It is not surprising that ridership for both groups increases in late spring and peaks during the summer months.

Share

Act

The Analysis team has determined that there are clearly defined differences in the way that the two subscriber groups utilize the services of Cyclistic.

Since the goal of this project was to determine how Casual Subscribers could be encouraged to become more profitable Member subscribers key characteristics of their behaviors should be considered. To a greater degree Casual subscribers tend to be positively effected by the onset of moderate weather so a marketing campaign to existing Casual members in late Winter to early spring would be most effective as they are preparing for the time of year they are anticipating getting out and more actively utilizing Cyclistic’s services, wheras existing members appear to be less effective by weather changes as they tend to rely on the service for their daily commute.

The campaign should point out the likely cost savings of a Member subscription as Casual riders actually trend towards slightly longer ride durations. If they will save money per ride by committing to a Member subscriptions and not having to be as concerned about the length of their ride duration they may find the new arrangement more appealing and thus hold more personal value . Casual subscribers also tend to prefer the electric bikes even though they cost more per minute than the classic bikes. Offering a 30 day discount on electric bike shares for new Member subscribers would likely be an incentive to sign up for an Annual Member subscription.

LS0tCnRpdGxlOiAiQ3ljbGlzdGljIEN1c3RvbWVyIFVzYWdlIFRyZW5kcyBpbiAyMDIyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMgQXNrCgpUaGUgTWFya2V0aW5nIERlcGFydG1lbnQgb2YgQ3ljbGlzdGljIGhhcyBhc2tlZCB0aGUgQW5hbHl0aWNzIHRlYW0gdG8gZGVsaXZlciBhY3Rpb25hYmxlIGluc2lnaHRzIGludG8gdGhlIHVzYWdlIGNoYXJhY3RlcmlzdGljcyBvZiBDeWNsaXN0aWMncyBjdXN0b21lciBiYXNlIHRvIGRldGVybWluZSBob3cgdG8gY29udmVydCBleGlzdGluZyBDYXN1YWwgdXNlcnMgaW50byBNZW1iZXJzaGlwIGhvbGRlcnMsIHdoaWNoIHJlcHJlc2VudHMgYSBtb3JlIHByb2ZpdGFibGUgY3VzdG9tZXIgZGVtb2dyYXBoaWMuCgojIyMgU2V0dXAKCmBgYHtyIFNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsdWJyaWRhdGUpCmBgYAoKIyMjIFByZXBhcmUKClRoZSBkYXRhIGZvciB0aGlzIHByb2R1Y3Qgd2FzIGltcG9ydGVkIGZyb20gdGhlIGNvbXBhbnkncyByZWNvcmRzIGluIHRoZSBmb3JtIG9mIDEyIHppcCBjb21wcmVzc2VkIENTViBmaWxlcy4gVGhlc2Ugd2VyZSBpbXBvcnRlZCBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgYSBiYXNoIHNjcmlwdCB0byBnYXRoZXIgYWxsIGZpbGVzIHBlcnRhaW5pbmcgdG8gY2FsZW5kYXIgeWVhciAyMDIyIGFuZCBzdG9yZWQgbG9jYWxseSBpbiBhbiByc3R1ZGlvIHByb2plY3QgZm9sZGVyIGFuZCBtYW5hZ2VkIG9uIHRoZSB0ZWFtcyBsb2NhbCBzZXJ2ZXIgYXMgYSBHaXQgcmVwb3NpdG9yeS4gT25seSBtZW1iZXJzIG9mIHRoZSB0ZWFtIHdlcmUgZ2l2ZW4gYWNjZXNzIHRvIHRoZSBzb3VyY2UgZGF0YS4gVGhlIENTViB3ZXJlIGNyZWF0ZWQgYXMgcmVhZC1vbmx5IHRvIG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHNvdXJjZSBkYXRhLiBBZnRlciB0aGUgY3N2IGZpbGVzIHdlcmUgcmV2aWV3ZWQgdGhlIFppcCBmaWxlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeS4KCmBgYHtyIGVuZ2luZT0nYmFzaCd9CiNJbXBvcnQgRGF0YSBmcm9tIHNvdXJjZQojU291cmNlIFVSTDogaHR0cHM6Ly9kaXZ2eS10cmlwZGF0YS5zMy5hbWF6b25hd3MuY29tL2luZGV4Lmh0bWwKCiMhL2Jpbi9iYXNoCgojIFNldCB0aGUgYmFzZSBVUkwgZm9yIHRoZSB6aXAgZmlsZXMKYmFzZV91cmw9Imh0dHBzOi8vZGl2dnktdHJpcGRhdGEuczMuYW1hem9uYXdzLmNvbS8iCgoKIyBJdGVyYXRlIHRocm91Z2ggbW9udGhzIDEgdG8gMTIKZm9yIG1vbnRoIGluIHsxLi4xMn07IGRvCiAgICAjIEFkZCBsZWFkaW5nIHplcm8gaWYgdGhlIG1vbnRoIGlzIHNpbmdsZSBkaWdpdAogICAgaWYgKChtb250aCA8IDEwKSk7IHRoZW4KICAgICAgICBtb250aD0iMCR7bW9udGh9IgogICAgZmkKCiAgICAjIENvbnN0cnVjdCB0aGUgZmlsZSBVUkwKICAgIGZpbGVfdXJsPSIke2Jhc2VfdXJsfTIwMjIke21vbnRofS1kaXZ2eS10cmlwZGF0YS56aXAiCgogICAgIyBEb3dubG9hZCB0aGUgZmlsZSB1c2luZyBjdXJsCiAgICBjdXJsIC1PICIkZmlsZV91cmwiCmRvbmUKYGBgCgpUaGUgaW5kaXZpZHVhbCBkYXRhc2V0cyB3ZXJlIGNvbmNhdGVuYXRlZCB1c2luZyB0aGUgcmJpbmQoKSBmdW5jdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgc2NyaXB0OgoKYGBge3IgaW1wb3J0fQojIFNldCB0aGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgdGhlIENTViBmaWxlcyBhcmUgbG9jYXRlZApkaXJlY3RvcnkgPC0gIn4vRGVza3RvcC9nZGFjX2NzXzEvc291cmNlIgoKIyBHZXQgYSBsaXN0IG9mIGFsbCBDU1YgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeQpjc3ZfZmlsZXMgPC0gbGlzdC5maWxlcyhkaXJlY3RvcnksIHBhdHRlcm4gPSAiXFwuY3N2JCIsIGZ1bGwubmFtZXMgPSBUUlVFKQoKIyBJbml0aWFsaXplIGFuIGVtcHR5IGRhdGEgZnJhbWUgdG8gc3RvcmUgdGhlIGNvbmNhdGVuYXRlZCBkYXRhCmNvbWJpbmVkX2RhdGEgPC0gZGF0YS5mcmFtZSgpCgojIExvb3AgdGhyb3VnaCBlYWNoIENTViBmaWxlIGFuZCBjb25jYXRlbmF0ZSB0aGUgZGF0YQpmb3IgKGZpbGUgaW4gY3N2X2ZpbGVzKSB7CiAgIyBSZWFkIHRoZSBDU1YgZmlsZQogIGRhdGEgPC0gcmVhZC5jc3YoZmlsZSkKICAKICAjIENvbmNhdGVuYXRlIHRoZSBkYXRhIHVzaW5nIHJiaW5kCiAgY29tYmluZWRfZGF0YSA8LSByYmluZChjb21iaW5lZF9kYXRhLCBkYXRhKQp9CmBgYAoKVGhlIGNvbXBsZXRlIGRhdGFzZXQgd2FzIHdhcyB3cmlpdGVuIHRvIHRoZSBmaWxlIDIyMDItYWxsLWRpdnZ5LXRyaXBkYXRhLmNzdiB3aGljaCB3YXMgYWxzbyBzZXQgdG8gUmVhZCBPbmx5LiBUaGUgZGF0YXNldCB3YXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgb2JqZWN0ICJkZiIuCgpgYGB7cn0KZGYgPC0gcmVhZC5jc3YoIn4vUi9nZGFjX2NzXzEvc291cmNlLzIwMjItYWxsLWRpdnZ5LXRyaXBkYXRhLmNzdiIpCmBgYAoKYGBge3J9Cm5hbWVzKGRmKQpgYGAKCiMjIyBQcm9jZXNzCgpVcG9uIGluc3BlY3Rpb24gb2YgdGhlIGRhdGEgdGhlIG5hbWluZyBjb252ZW50aW9ucyB3ZXJlIGZvdW5kIHRvIGJlIGFjY2VwdGFibGUgZm9yIHRoZSBhbmFseXNpcyBhbmQgaXQgd2FzIGRldGVybWluZWQgdGhhdCB0aGVyZSB3YXMgbm8gb2J2aW91cyBjb25jZXJuIHJlZ2FyZGluZyBiaWFzIGluIHRoZSBwb3B1bGF0aW9uLiBUaGUgdGVhbSBjaG9zZSB0byBjcmVhdGUgbmV3IHZhcmlhYmxlcyB0byBnYWluIGNsZWFyZXIgaW5zaWdodCBpbnRvIHRoZSBkYXRhc2V0IHN1Y2ggYXMgdHJpcF9kdXJhdGlvbiwgZGF5X29mX3dlZWssIGRheV9vZl95ZWFyLCBhbmQgbW9udGhfb2ZfeWVhci4gSXQgd2FzIGRldGVybWluZWQgdGhhdCBvYnNlcnZhdGlvbnMgb2YgYGRvY2tlZF9iaWtlYCB3ZXJlIGluIG5lZWQgb2YgY2xlYW5pbmcgYXMgdGhpcyB2YWx1ZSB3YXMgbm90IHBlcnRpbmVudCB0byB0aGUgYnVzaW5lc3MgdGFzay4KCmBgYHtyIFByb2Nlc3N9CmNvbG5hbWVzKGRmKVsxXSA8LSAiaWQiCmRmJHRyaXBfZHVyYXRpb24gPC0gYXMubnVtZXJpYyhkaWZmdGltZShkZiRlbmRlZF9hdCwgZGYkc3RhcnRlZF9hdCwgdW5pdHMgPSAiaG91cnMiKSkKZGYkZGF5X29mX3dlZWsgPC0gd2RheShkZiRzdGFydGVkX2F0KQpkZiRkYXlfb2ZfeWVhciA8LSB5ZGF5KGRmJHN0YXJ0ZWRfYXQpCmRmJG1vbnRoX29mX3llYXIgPC0gbW9udGgoZGYkc3RhcnRlZF9hdCkKbmFtZXMoZGYpCmBgYAoKQW4gaW5pdGlhbCBzdW1tYXJ5IHdhcyBydW4gb24gdGhlIG51bWVyaWMgdmFyaWFibGUgYHRyaXBfZHVyYXRpb25gIHRvIGRldGVybWluZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGRhdGEgYWNyb3NzIHRoZSBkYXRhc2V0IGFuZCBnZW5lcmF0ZWQgdGhlIGZvbGxvd2luZyBib3hwbG90LgoKYGBge3Igc3VtbWFyeSBvZiB0cmlwX2R1cmF0aW9ufQpzdW1tYXJ5KGRmJHRyaXBfZHVyYXRpb24pCmBgYAoKQSB0YWJsZSBjb21wYXJpbmcgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBgbWVtYmVyX2Nhc3VhbGAgYW5kIGByaWRlYWJsZV90eXBlYCBzaG93ZWQgYSBkaXNwYXJpdHkgaW4gdGhlIGBkb2NrZWRfYmlrZWAgdmFsdWUgaW4gcmVsYXRpb24gdG8gc3Vic2NyaWJlciB0eXBlcy4KCmBgYHtyIGVjaG89VFJVRX0KIyBQcm9wIHRhYmxlIGZvciBtZW1iZXJfY2FzdWFsIHYuIHRyaXBfZHVyYXRpb24KdGFibGUoZGYkbWVtYmVyX2Nhc3VhbCwgZGYkcmlkZWFibGVfdHlwZSkKYGBgCgpgYGB7cn0KYm94cGxvdChkZiR0cmlwX2R1cmF0aW9uKQpgYGAKClRoaXMgc2hvd2VkIG5vdGFibGUgb3V0bGllcnMgYWJvdmUgdGhlIHRoaXJkIFF1YXJ0aWxlIGFuZCByZXZlYWxlZCB0aGF0IHRoZXJlIHdlcmUgcmlkZSBkdXJhdGlvbiB2YWx1ZXMgb2YgemVybyBvciBsZXNzLiBUaGUgZm9sbG93aW5nIEhpc3RvZ3JhbSBnYXZlIGZ1cnRoZXIgaW5zaWdodCBvZiB0aGUgdHJlbmRzIHJlZ2FyZGluZyB0cmlwIGR1cmF0aW9uLgoKYGBge3J9CmRmICU+JQogIGZpbHRlcighdHJpcF9kdXJhdGlvbiA+IDUsCiAgICAgICAgICF0cmlwX2R1cmF0aW9uIDw9IDApICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB0cmlwX2R1cmF0aW9uKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwKSsKICBsYWJzKHggPSAiUmlkZSBEdXJhdGlvbiBpbiBIb3VycyIsIHkgPSAiQ291bnQiLCB0aXRsZSA9ICJIaXN0b2dyYW0gb2YgUmlkZSBEdXJhdGlvbnMiKQpgYGAKClNpbmNlIHRoZSB2YXN0IG1ham9yaXR5IG9mIHJpZGVzIGhhZCBhIHJpZGUgbGltaXQgdW5kZXIgMSBob3VyIHRoZSBkYXRhIHdhcyBmaWx0ZXJlZCB0byBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdCB0cmVuZHMgaW5jbHVkaW5nIGFueSBuZWdhdGl2ZSB0cmlwIHZhbHVlLiBBbHNvIGFueSBvYnNlcnZhdGlvbnMgdGhhdCByZWZlcmVuY2VkIGBkb2NrZWRfYmlrZWAgaW4gYHJpZGVhYmxlX3R5cGVgIHdlcmUgZmlsdGVyZWQgb3V0IGFzIHdlbGwuCgpgYGB7cn0KI0ZpbHRlciBvdXQgZG9ja2VkIGJpa2VzIGFuZCBsaW1pdCByaWRlIGR1cmF0aW9uIHRvIHRhcmdldCB2YWx1ZXMgYW5kIHJlc2V0IGRhdGFmcmFtZQpkZiA8LSBkZiAlPiUKICBmaWx0ZXIodHJpcF9kdXJhdGlvbiA+IDAsCiAgICAgICAgIHRyaXBfZHVyYXRpb24gPD0gMSwKICAgICAgICAgIXJpZGVhYmxlX3R5cGUgPT0gImRvY2tlZF9iaWtlIikgCmBgYAoKYGBge3J9CmRmICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB0cmlwX2R1cmF0aW9uKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwKSsKICBsYWJzKHggPSAiUmlkZSBEdXJhdGlvbiBpbiBIb3VycyIsIHkgPSAiQ291bnQiLCB0aXRsZSA9ICJIaXN0b2dyYW0gb2YgUmlkZSBEdXJhdGlvbiIpCmBgYAoKIyMjIEFuYWx5emUKClRhYmxlcyB3ZXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgYG1lbWJlcl9jYXN1YWxgLCBgcmlkZWFibGVfdHlwZWAsIGB0cmlwX2R1cmF0aW9uYCwgYGRheV9vZl93ZWVrYCwgYW5kIGBtb250aF9vZl95ZWFyYC4KCmBgYHtyfQojIFRhYmxlIGZvciBtZW1iZXJfY2FzdWFsIHYuIG1vbnRoX29mX3llYXIKYWRkbWFyZ2lucyh0YWJsZShkZiRtZW1iZXJfY2FzdWFsLCBkZiRtb250aF9vZl95ZWFyKSkKYGBgCgpgYGB7cn0KIyBUYWJsZSBmb3IgbWVtYmVyX2Nhc3VhbCB2LiBkYXlfb2Zfd2VlawphZGRtYXJnaW5zKHRhYmxlKGRmJG1lbWJlcl9jYXN1YWwsIGRmJGRheV9vZl93ZWVrKSkKYGBgCgpgYGB7cn0KIyBQcm9wIHRhYmxlIGZvciBtZW1iZXJfY2FzdWFsIHYuIGRheV9vZl93ZWVrCnByb3AudGFibGUodGFibGUoZGYkbWVtYmVyX2Nhc3VhbCwgZGYkZGF5X29mX3dlZWspLDIpKjEwMApgYGAKCmBgYHtyfQojIFByb3AgdGFibGUgZm9yIG1lbWJlcl9jYXN1YWwgdi4gbW9udGhfb2ZfeWVhcgpwcm9wLnRhYmxlKHRhYmxlKGRmJG1lbWJlcl9jYXN1YWwsIGRmJG1vbnRoX29mX3llYXIpLDIpKjEwMApgYGAKCmBgYHtyfQojIFByb3AgdGFibGUgZm9yIG1lbWJlcl9jYXN1YWwgdi4gcmlkZWFibGVfdHlwZQpwcm9wLnRhYmxlKHRhYmxlKGRmJG1lbWJlcl9jYXN1YWwsIGRmJHJpZGVhYmxlX3R5cGUpLDIpKjEwMApgYGAKClRoZSB0YWJsZXMgc2hvdyB0aGF0IGluIGFsbCBtb250aGx5IGFuZCB3ZWVrbHkgb2JzZXJ2YXRpb25zIG1lbWJlcnMgbWFrZSB1cCB0aGUgbWFqb3JpdHkgdXNhZ2Ugb2YgdG90YWwgcmlkZXMuIFRoaXMgZGlmZmVyZW5jZSBpcyBub3QgYXMgbWFya2VkIG9uIHRoZSB3ZWVrZW5kcy4gQ2FzdWFsIHJpZGVycyBhbHNvIHByZWZlciB0aGUgZWxlY3RyaWMgYmlrZXMgdG8gYSBoaWdoZXIgZGVncmVlIHRoYW4gdGhlIGNsYXNzaWMsIHdoaWxlIHRoZSBvcHBvc2l0ZSB0cmVuZCBpcyB0cnVlIGZvciBtZW1iZXJzLiBJdCBpcyBub3Qgc3VycHJpc2luZyB0aGF0IHJpZGVyc2hpcCBmb3IgYm90aCBncm91cHMgaW5jcmVhc2VzIGluIGxhdGUgc3ByaW5nIGFuZCBwZWFrcyBkdXJpbmcgdGhlIHN1bW1lciBtb250aHMuCgojIyMgU2hhcmUKCmBgYHtyIGVjaG89VFJVRX0KI0F2ZXJhZ2UgdHJpcCBkdXJhdGlvbiB2LiB1c2VyIHR5cGUKICBkZiAlPiUgCiAgZ3JvdXBfYnkobWVtYmVyX2Nhc3VhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX3RyaXBfZHVyID0gbWVhbih0cmlwX2R1cmF0aW9uKSo2MCkgJT4lIAogIGdncGxvdChhZXMobWVtYmVyX2Nhc3VhbCwgbWVhbl90cmlwX2R1ciwgZmlsbCA9IG1lbWJlcl9jYXN1YWwpKSsKICBnZW9tX2NvbCgpKwogIGxhYnMoeCA9ICJTdWJzY3JpYmVyIFR5cGUiLCB5ID0gIk1pbnV0ZXMiLCB0aXRsZSA9ICJVc2VyIFR5cGUgdi4gTWVhbiBUcmlwIER1cmF0aW9uIGluIE1pbnV0ZXMiLCBmaWxsID0gIlN1YnNjcmliZXIgVHlwZSIpCmBgYAoKYGBge3IgZWNobz1UUlVFfQojIE1lZGlhbiB0cmlwIGR1cmF0aW9uIHYuIG1lbWJlciB0eXBlCmRmICU+JSAKICBncm91cF9ieShtZW1iZXJfY2FzdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl90cmlwX2R1ciA9IG1lZGlhbih0cmlwX2R1cmF0aW9uKSo2MCkgJT4lIAogIGdncGxvdChhZXMobWVtYmVyX2Nhc3VhbCwgbWVkaWFuX3RyaXBfZHVyLCBmaWxsID0gbWVtYmVyX2Nhc3VhbCkpKwogIGdlb21fY29sKCkrCiAgbGFicyh4ID0gIlN1YnNjcmliZXIgVHlwZSIsIHkgPSAiTWludXRlcyIsIHRpdGxlID0gIlVzZXIgVHlwZSB2LiBNZWRpYW4gVHJpcCBEdXJhdGlvbiBpbiBNaW51dGVzIiwgZmlsbCA9ICJTdWJzY3JpYmVyIFR5cGUiKQpgYGAKCmBgYHtyfQojIFBsb3RzIG9mIHJlc3VsdGluZyB0YWJsZXMKZGYgJT4lCiAgY291bnQobWVtYmVyX2Nhc3VhbCwgcmlkZWFibGVfdHlwZSkgJT4lIAogIGdyb3VwX2J5KHJpZGVhYmxlX3R5cGUpICU+JSAKICBnZ3Bsb3QoYWVzKHJpZGVhYmxlX3R5cGUsIG4sIGZpbGwgPSBtZW1iZXJfY2FzdWFsKSkrCiAgZ2VvbV9jb2woKSsKICBsYWJzKHggPSAiU3Vic2NyaWJlciBUeXBlIiwgeSA9ICJUb3RhbCBSaWRlcyIsIHRpdGxlID0gIlRvdGFsIE51bWJlciBvZiBSaWRlcyBpbiAyMDIyIHBlciBCaWN5bGUgYW5kIFN1YnNjcmliZXIgVHlwZXMiLCBmaWxsID0gIlN1YnNjaWJlciIpCiAgCmBgYAoKYGBge3J9CmRmICU+JQogICBmaWx0ZXIoIXJpZGVhYmxlX3R5cGUgPT0gImRvY2tlZF9iaWtlIikgJT4lIAogICBjb3VudChtZW1iZXJfY2FzdWFsLCByaWRlYWJsZV90eXBlKSAlPiUKICAgZ3JvdXBfYnkocmlkZWFibGVfdHlwZSkgJT4lCiAgIG11dGF0ZShwcm9wID0gbiAvIChzdW0obikpKjEwMCkgJT4lIAogICBnZ3Bsb3QoYWVzKHJpZGVhYmxlX3R5cGUsIHByb3AsIGZpbGwgPSBtZW1iZXJfY2FzdWFsKSkrCiAgIGdlb21fY29sKCkrCiAgbGFicyh0aXRsZSA9ICJTdWJzY3JpYmVyIFByZWZlcmVuY2Ugb2YgQmljeWNsZSBUeXBlIGFzIFBlcmNlbnRhZ2UiLCB4ID0gIkJpY3ljbGUgVHlwZSIsIHkgPSAiUGVyY2VudGFnZSIsIGZpbGwgPSAiU3Vic2NyaWJlciBUeXBlIikKYGBgCgpgYGB7cn0KICMgUGxvdHMgb2YgcmVzdWx0aW5nIHRhYmxlcwpkZiAlPiUKICBjb3VudChtZW1iZXJfY2FzdWFsLCByaWRlYWJsZV90eXBlKSAlPiUgCiAgZ3JvdXBfYnkobWVtYmVyX2Nhc3VhbCkgJT4lIAogIG11dGF0ZShwcm9wID0gbiAvIChzdW0obikpKjEwMCkgJT4lIAogIGdncGxvdChhZXMobWVtYmVyX2Nhc3VhbCwgcHJvcCwgZmlsbCA9IHJpZGVhYmxlX3R5cGUpKSsKICBnZW9tX2NvbCgpKwogIGxhYnMoeCA9ICJTdWJzY3JpYmVyIFR5cGUiLCB5ID0gIlBlcmNlbnRhZ2Ugb2ZUb3RhbCBSaWRlcyIsIHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgVG90YWwgTnVtYmVyIG9mIFJpZGVzIGluIDIwMjIgcGVyIFN1YnNjcmliZXIgVHlwZSIsIGZpbGwgPSAiQmljeWNsZSBUeXBlIikKYGBgCgpgYGB7cn0KICMgUGxvdCBvZiBUb3RhbCBBbm51YWwgUmlkZXMgcGVyIERheSBvZiB0aGUgV2VlayAKZGYgJT4lCiAgY291bnQobWVtYmVyX2Nhc3VhbCwgZGF5X29mX3dlZWspICU+JSAKICBncm91cF9ieShkYXlfb2Zfd2VlaykgJT4lIAogIGdncGxvdChhZXMoZGF5X29mX3dlZWssIG4sIGZpbGwgPSBtZW1iZXJfY2FzdWFsKSkrCiAgZ2VvbV9jb2woKSsKICBsYWJzKHggPSAiRGF5IG9mIHRoZSBXZWVrIiwgeSA9ICJUb3RhbCBSaWRlcyIsIHRpdGxlID0gIlRvdGFsIEFubnVhbCBSaWRlcyBwZXIgRGF5IG9mIHRoZSBXZWVrIiwgZmlsbCA9ICJTdWJzY3JpYmVyIFR5cGUiKQpgYGAKCmBgYHtyfQogIyBQbG90cyBvZiBQcm9wb3J0aW9uIG9mIFN1YnNjcmliZXIgVHlwZSBVc2FnZSB2LiBEYXkgb2YgdGhlIFdlZWsKZGYgJT4lCiAgY291bnQobWVtYmVyX2Nhc3VhbCwgZGF5X29mX3dlZWspICU+JSAKICBncm91cF9ieShkYXlfb2Zfd2VlaykgJT4lIAogIG11dGF0ZShwcm9wID0gbiAvIChzdW0obikpKjEwMCkgJT4lIAogIGdncGxvdChhZXMoZGF5X29mX3dlZWssIHByb3AsIGZpbGwgPSBtZW1iZXJfY2FzdWFsKSkrCiAgZ2VvbV9jb2woKSsKICBsYWJzKHggPSAiRGF5IG9mIHRoZSBXZWVrIiwgeSA9ICJQZXJjZW50YWdlIiwgdGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBTdWJzY3JpYmVyIFR5cGUgVXNhZ2Ugdi4gRGF5IG9mIHRoZSBXZWVrIiwgZmlsbCA9ICJTdWJzY3JpYmVyIFR5cGUiKQpgYGAKCmBgYHtyfQogIyBQbG90IG9mIFRvdGFsIEFubnVhbCBSaWRlcyBwZXIgRGF5IG9mIHRoZSBXZWVrIApkZiAlPiUKICBjb3VudChtZW1iZXJfY2FzdWFsLCBtb250aF9vZl95ZWFyKSAlPiUgCiAgZ3JvdXBfYnkobW9udGhfb2ZfeWVhcikgJT4lIAogIGdncGxvdChhZXMobW9udGhfb2ZfeWVhciwgbiwgZmlsbCA9IG1lbWJlcl9jYXN1YWwpKSsKICBnZW9tX2NvbCgpKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiVG90YWwgUmlkZXMiLCB0aXRsZSA9ICJUb3RhbCBBbm51YWwgUmlkZXMgcGVyIE1vbnRoIG9mIFllYXIiLCBmaWxsID0gIlN1YnNjcmliZXIgVHlwZSIpCmBgYAoKIyMjIyBBY3QKVGhlIEFuYWx5c2lzIHRlYW0gaGFzIGRldGVybWluZWQgdGhhdCB0aGVyZSBhcmUgY2xlYXJseSBkZWZpbmVkIGRpZmZlcmVuY2VzIGluIHRoZSB3YXkgdGhhdCB0aGUgdHdvIHN1YnNjcmliZXIgZ3JvdXBzIHV0aWxpemUgdGhlIHNlcnZpY2VzIG9mIEN5Y2xpc3RpYy4gIAoKU2luY2UgdGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IHdhcyB0byBkZXRlcm1pbmUgaG93IENhc3VhbCBTdWJzY3JpYmVycyBjb3VsZCBiZSBlbmNvdXJhZ2VkIHRvIGJlY29tZSBtb3JlIHByb2ZpdGFibGUgTWVtYmVyIHN1YnNjcmliZXJzIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlaXIgYmVoYXZpb3JzIHNob3VsZCBiZSBjb25zaWRlcmVkLiAgVG8gYSBncmVhdGVyIGRlZ3JlZSBDYXN1YWwgc3Vic2NyaWJlcnMgdGVuZCB0byBiZSBwb3NpdGl2ZWx5IGVmZmVjdGVkIGJ5IHRoZSBvbnNldCBvZiBtb2RlcmF0ZSB3ZWF0aGVyIHNvIGEgbWFya2V0aW5nIGNhbXBhaWduIHRvIGV4aXN0aW5nIENhc3VhbCBtZW1iZXJzIGluIGxhdGUgV2ludGVyIHRvIGVhcmx5IHNwcmluZyB3b3VsZCBiZSBtb3N0IGVmZmVjdGl2ZSBhcyB0aGV5IGFyZSBwcmVwYXJpbmcgZm9yIHRoZSB0aW1lIG9mIHllYXIgdGhleSBhcmUgYW50aWNpcGF0aW5nIGdldHRpbmcgb3V0IGFuZCBtb3JlIGFjdGl2ZWx5IHV0aWxpemluZyBDeWNsaXN0aWMncyBzZXJ2aWNlcywgd2hlcmFzIGV4aXN0aW5nIG1lbWJlcnMgYXBwZWFyIHRvIGJlIGxlc3MgZWZmZWN0aXZlIGJ5IHdlYXRoZXIgY2hhbmdlcyBhcyB0aGV5IHRlbmQgdG8gcmVseSBvbiB0aGUgc2VydmljZSBmb3IgdGhlaXIgZGFpbHkgY29tbXV0ZS4KClRoZSBjYW1wYWlnbiBzaG91bGQgcG9pbnQgb3V0IHRoZSBsaWtlbHkgY29zdCBzYXZpbmdzIG9mIGEgTWVtYmVyIHN1YnNjcmlwdGlvbiBhcyBDYXN1YWwgcmlkZXJzIGFjdHVhbGx5IHRyZW5kIHRvd2FyZHMgc2xpZ2h0bHkgbG9uZ2VyIHJpZGUgZHVyYXRpb25zLiAgSWYgdGhleSB3aWxsIHNhdmUgbW9uZXkgcGVyIHJpZGUgYnkgY29tbWl0dGluZyB0byBhIE1lbWJlciBzdWJzY3JpcHRpb25zIGFuZCBub3QgaGF2aW5nIHRvIGJlIGFzIGNvbmNlcm5lZCBhYm91dCB0aGUgbGVuZ3RoIG9mIHRoZWlyIHJpZGUgZHVyYXRpb24gdGhleSBtYXkgZmluZCB0aGUgbmV3IGFycmFuZ2VtZW50IG1vcmUgYXBwZWFsaW5nIGFuZCB0aHVzIGhvbGQgbW9yZSBwZXJzb25hbCB2YWx1ZSAuICBDYXN1YWwgc3Vic2NyaWJlcnMgYWxzbyB0ZW5kIHRvIHByZWZlciB0aGUgZWxlY3RyaWMgYmlrZXMgZXZlbiB0aG91Z2ggdGhleSBjb3N0IG1vcmUgcGVyIG1pbnV0ZSB0aGFuIHRoZSBjbGFzc2ljIGJpa2VzLiAgT2ZmZXJpbmcgYSAzMCBkYXkgZGlzY291bnQgb24gZWxlY3RyaWMgYmlrZSBzaGFyZXMgZm9yIG5ldyBNZW1iZXIgc3Vic2NyaWJlcnMgd291bGQgbGlrZWx5IGJlIGFuIGluY2VudGl2ZSB0byBzaWduIHVwIGZvciBhbiBBbm51YWwgTWVtYmVyIHN1YnNjcmlwdGlvbi4KCg==