SlideShare a Scribd company logo
1 of 69
Massively
Continuous Integration
From 3 days to 30 minutes
•Software   as a Service
•Project   Management
•Collaborative   Work Management
How we use Selenium
 •1,100   Selenium 1 tests
 •800   Selenium 2 tests
 •40,000    hours per month
 •Release   Acceptance + CI
Then
Scripted scenarios
Slow, brittle
Monthly Releases
3-5 days acceptance
Manual administration
Now
Tight unit-like UI tests
Fast, Robust
Daily releases
30-45 minutes
Sign-off and go
“True” Continuous Integration

       •How   often do I integrate?
       •What   tests tell me I’m integrated?
       •What   must I know to release?
Pipeline Priorities
  •Performance   (Cycle Time)
  •Scalability

  •Visibility

  •Accountability
ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Commit




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Commit
                   Build Installer

                    Build Tests




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid

                   Grid + AtTask
    Commit
                   Build Installer

                    Build Tests




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid

                   Grid + AtTask
    Commit                           Install
                   Build Installer

                    Build Tests




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid

                   Grid + AtTask
    Commit                             Install
                   Build Installer

                    Build Tests



                                           Unit


                                     Integration
                                     1/4          3/4

                                     2/4          4/4




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid                        Selenium IE

                   Grid + AtTask
    Commit                             Install          Selenium FF
                   Build Installer

                    Build Tests                         Other tests



                                           Unit


                                     Integration
                                     1/4          3/4

                                     2/4          4/4




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid                        Selenium IE

                   Grid + AtTask
    Commit                             Install          Selenium FF   Tear Down
                   Build Installer

                    Build Tests                         Other tests



                                           Unit


                                     Integration
                                     1/4          3/4

                                     2/4          4/4




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
AIRPORT SECURITY
NOBODY LIKES TO WAIT IN LINE
Selenium Grid                        Selenium IE

           Grid + AtTask
  Commit                       Install          Selenium FF   Tear Down
           Build Installer

            Build Tests                         Other tests



                                   Unit


                             Integration
                             1/4          3/4

                             2/4          4/4




SERIAL VS PARALLEL
Selenium Grid                        Selenium IE

           Grid + AtTask
  Commit                       Install          Selenium FF   Tear Down
           Build Installer

            Build Tests                         Other tests



                                   Unit


                             Integration
                             1/4          3/4

                             2/4          4/4




SERIAL VS PARALLEL
CYCLE TIME
CYCLE TIME
CYCLE TIME
JENKINS, EC2, AND ATTASK
A MATCH MADE IN HEAVEN
JENKINS, EC2, AND ATTASK
A MATCH MADE IN HEAVEN
JENKINS DYNAMIC SLAVE ALLOCATION
JENKINS DYNAMIC SLAVE ALLOCATION
SLAVE




JENKINS DYNAMIC SLAVE ALLOCATION
SLAVE

                    SLAVE

                    SLAVE

                    SLAVE


JENKINS DYNAMIC SLAVE ALLOCATION
JENKINS DYNAMIC SLAVE ALLOCATION
From 3 days to 30 minutes
with Selenium 2
SELENIUM 1 (1800 TESTS)




TESTING WITH SELENIUM 1
SELENIUM 1 (1800 TESTS)

                               4 HOURS




              SLOW



TESTING WITH SELENIUM 1
TRANSITIONING TO SELENIUM 2
TRANSITIONING TO SELENIUM 2
TRANSITIONING TO SELENIUM 2
SELENIUM 1 (1800 TESTS)

                               4 HOURS




TRANSITIONING TO SELENIUM 2
SELENIUM 1 (1800 TESTS)

                                    4 HOURS



      SELENIUM 2 (750 TESTS)

             30 MINUTES
                               WHERE DID THE
                                TESTS GO?



TRANSITIONING TO SELENIUM 2
TRANSITIONING TO SELENIUM 2
2.1 MINUTES




TRANSITIONING TO SELENIUM 2
2.1 MINUTES             34 SECONDS




TRANSITIONING TO SELENIUM 2
2.1 MINUTES                  34 SECONDS

                    WITH GRID...




TRANSITIONING TO SELENIUM 2
2.1 MINUTES                  34 SECONDS

                    WITH GRID...



       8 SECONDS



TRANSITIONING TO SELENIUM 2
2.1 MINUTES                  34 SECONDS

                    WITH GRID...



       8 SECONDS                   2.4 SECONDS



TRANSITIONING TO SELENIUM 2
Scalability
  •To   the cloud with Amazon Cloud Formations
   •Dynamic   Selenium Grids
   •Dynamic   AtTask Environments
JSON
PARTLY CLOUDY WITH A CHANCE OF RAIN
JSON
PARTLY CLOUDY WITH A CHANCE OF RAIN
Scalability

         Selenium Grid                        Selenium IE

         Grid + AtTask
Commit                       Install          Selenium FF   Tear Down
         Build Installer

          Build Tests                         Other tests



                                 Unit


                           Integration
                           1/4          3/4

                           2/4          4/4
Scalability
               Selenium Grid


               Grid + AtTask
      Commit
               Build Installer


                Build Tests
SLAVE




IT’S RAINING GRIDS
SLAVE




IT’S RAINING GRIDS
SELENIUM GRID
   SLAVE


                     SELENIUM GRID




IT’S RAINING GRIDS
SELENIUM GRID
   SLAVE


                     SELENIUM GRID




IT’S RAINING GRIDS
SELENIUM GRID
   SLAVE


                     SELENIUM GRID




IT’S RAINING GRIDS
SLAVE




               SELENIUM GRID


   SLAVE
                                  SLAVE
               SELENIUM GRID




   SLAVE                           SLAVE




IT’S RAINING GRIDS
Visibility
  •Selenium    results in Jenkins
  •Description      plugin
   •Theres   my commit!
  •View    plugin
   •All   the jobs on one line, oh the humanity!
Visibility
  •Selenium    results in Jenkins
  •Description      plugin
   •Theres   my commit!
  •View    plugin
   •All   the jobs on one line, oh the humanity!
Visibility
  •Selenium    results in Jenkins
  •Description      plugin
   •Theres   my commit!
  •View    plugin
   •All   the jobs on one line, oh the humanity!
Accountability
 •Claim   / Blame test results using AtTask
Accountability
 •Claim   / Blame test results using AtTask
Accountability
 •Claim   / Blame test results using AtTask
Gotchas
 •Watch    your integration points
 •Get   the right skill set
 •Align   process w/ tools
 •Continuous    Investment
What does it cost?
 •3   FTE
  •Two      human, one machine(s)
 •Keeping      costs down
  •Efficient    machine sizes
  •Rock-solid    tear down
  •Elasticity
Return on investment
 •5   days (40 hours) to certify one release...
  •10   engineers
  •$40   per hour
  •$20,000

 •30   minutes to certify one release...
  •10   engineers
  •$40   per hour
  •$250
To release 12 times in a year...
  $240,000 TO CERTIFY            $3000 TO TEST
                          $160,000 FOR TWO FTE
                                 $77,000 FOR CI

To release 24 times in a year...
  $480,000 TO CERTIFY            $6000 TO TEST
                          $160,000 FOR TWO FTE
                                 $77,000 FOR CI

To release 100 times in a year...
  $2,000,000 TO CERTIFY         $25000 TO TEST
                          $160,000 FOR TWO FTE
                                 $77,000 FOR CI
100 deployments annually



               $2,000,000
100 deployments annually



  $265,000     $2,000,000
100 deployments annually



     $265,000
Where to go from here
 •Continuous    Delivery
  •Thoughtworks

 •Application   Lifecycle Management
 •Infrastructure   CI
 •OpenStack
Tools Manifest
•AtTask          contributions...
 •EC2       -   wiki.jenkins-ci.org/display/JENKINS/Amazon+EC2+Plugin


 •CloudFormation                   -   wiki.jenkins-ci.org/display/JENKINS/AWS+Cloudformation+Plugin


 •Pipeline           View -     github.com/JoelJ/PipelineDashboard


 •Description              Setter -      github.com/JoelJ/DescriptionSetter


 •GIT   -       /wiki.jenkins-ci.org/display/JENKINS/Git+Plugin


 •AtTask           for Jenkins -         Coming soon...
Q&A

More Related Content

Similar to Massively Continuous Integration: From 3 days to 30 minutes

Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2
epall
 

Similar to Massively Continuous Integration: From 3 days to 30 minutes (20)

Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019
Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019
Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019
 
Rocket Fuelled Cucumbers
Rocket Fuelled CucumbersRocket Fuelled Cucumbers
Rocket Fuelled Cucumbers
 
ATDD with Behat and Selenium (LDNSE6)
ATDD with Behat and Selenium (LDNSE6)ATDD with Behat and Selenium (LDNSE6)
ATDD with Behat and Selenium (LDNSE6)
 
How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...
How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...
How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...
 
Integration testing for salt states using aws ec2 container service
Integration testing for salt states using aws ec2 container serviceIntegration testing for salt states using aws ec2 container service
Integration testing for salt states using aws ec2 container service
 
Be flexible with zalenium, a dockerized selenium grid infrastructure
Be flexible with zalenium, a dockerized selenium grid infrastructureBe flexible with zalenium, a dockerized selenium grid infrastructure
Be flexible with zalenium, a dockerized selenium grid infrastructure
 
Kubernetes your tests! automation with docker on google cloud platform
Kubernetes your tests! automation with docker on google cloud platformKubernetes your tests! automation with docker on google cloud platform
Kubernetes your tests! automation with docker on google cloud platform
 
Unit testing for Cocoa developers
Unit testing for Cocoa developersUnit testing for Cocoa developers
Unit testing for Cocoa developers
 
Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
 
The history of selenium
The history of seleniumThe history of selenium
The history of selenium
 
Taking a Test Drive: iOS Dev UK guide to TDD
Taking a Test Drive: iOS Dev UK guide to TDDTaking a Test Drive: iOS Dev UK guide to TDD
Taking a Test Drive: iOS Dev UK guide to TDD
 
Testing with Jenkins, Selenium and Continuous Deployment
Testing with Jenkins, Selenium and Continuous DeploymentTesting with Jenkins, Selenium and Continuous Deployment
Testing with Jenkins, Selenium and Continuous Deployment
 
How to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's ToolkitHow to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's Toolkit
 
The history of testing framework in Ruby
The history of testing framework in RubyThe history of testing framework in Ruby
The history of testing framework in Ruby
 
Selenium RC - Web Application Testing Tool
Selenium RC - Web Application Testing ToolSelenium RC - Web Application Testing Tool
Selenium RC - Web Application Testing Tool
 
Selenium Classroom Training
Selenium Classroom TrainingSelenium Classroom Training
Selenium Classroom Training
 
How to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's ToolkitHow to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's Toolkit
 
Selenium
SeleniumSelenium
Selenium
 
Selenium-Grid-Extras
Selenium-Grid-ExtrasSelenium-Grid-Extras
Selenium-Grid-Extras
 

More from seleniumconf

Using Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development CycleUsing Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development Cycle
seleniumconf
 
Building Quality with Foundations of Mud
Building Quality with Foundations of MudBuilding Quality with Foundations of Mud
Building Quality with Foundations of Mud
seleniumconf
 
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team HappierMore Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
seleniumconf
 
Building a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a TimeBuilding a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a Time
seleniumconf
 
Introduction to selenium_grid_workshop
Introduction to selenium_grid_workshopIntroduction to selenium_grid_workshop
Introduction to selenium_grid_workshop
seleniumconf
 
Automated Security Testing
Automated Security TestingAutomated Security Testing
Automated Security Testing
seleniumconf
 
Selenium: State of the Union
Selenium: State of the UnionSelenium: State of the Union
Selenium: State of the Union
seleniumconf
 
Introducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test DevelopmentIntroducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test Development
seleniumconf
 
Self-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriverSelf-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriver
seleniumconf
 
Automated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriverAutomated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriver
seleniumconf
 
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
seleniumconf
 
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer DriverBuilding a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
seleniumconf
 

More from seleniumconf (12)

Using Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development CycleUsing Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development Cycle
 
Building Quality with Foundations of Mud
Building Quality with Foundations of MudBuilding Quality with Foundations of Mud
Building Quality with Foundations of Mud
 
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team HappierMore Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
 
Building a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a TimeBuilding a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a Time
 
Introduction to selenium_grid_workshop
Introduction to selenium_grid_workshopIntroduction to selenium_grid_workshop
Introduction to selenium_grid_workshop
 
Automated Security Testing
Automated Security TestingAutomated Security Testing
Automated Security Testing
 
Selenium: State of the Union
Selenium: State of the UnionSelenium: State of the Union
Selenium: State of the Union
 
Introducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test DevelopmentIntroducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test Development
 
Self-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriverSelf-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriver
 
Automated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriverAutomated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriver
 
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
 
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer DriverBuilding a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 

Massively Continuous Integration: From 3 days to 30 minutes

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n