--- /dev/null	2019-03-19 11:03:33.121000004 +1100
+++ rstudio-1.1.463/src/cpp/core/include/core/BoostSignals.hpp	2018-11-17 21:24:35.285976284 +1100
@@ -0,0 +1,40 @@
+/*
+ * BoostSignals.hpp
+ *
+ * Copyright (C) 2009-18 by RStudio, Inc.
+ *
+ * Unless you have received this program directly from RStudio pursuant
+ * to the terms of a commercial license agreement with RStudio, then
+ * this program is licensed to you under the terms of version 3 of the
+ * GNU Affero General Public License. This program is distributed WITHOUT
+ * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
+ * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
+ *
+ */
+
+#ifndef CORE_RSTUDIO_BOOST_SIGNALS_HPP
+#define CORE_RSTUDIO_BOOST_SIGNALS_HPP
+
+#if RSTUDIO_BOOST_SIGNALS_VERSION == 1
+
+# include <boost/signals.hpp>
+# define RSTUDIO_BOOST_SIGNAL boost::signal
+# define RSTUDIO_BOOST_CONNECTION boost::signals::connection
+# define RSTUDIO_BOOST_SCOPED_CONNECTION boost::signals::scoped_connection
+# define RSTUDIO_BOOST_LAST_VALUE boost::last_value
+
+#elif RSTUDIO_BOOST_SIGNALS_VERSION == 2
+
+# include <boost/signals2.hpp>
+# define RSTUDIO_BOOST_SIGNAL boost::signals2::signal
+# define RSTUDIO_BOOST_CONNECTION boost::signals2::connection
+# define RSTUDIO_BOOST_SCOPED_CONNECTION boost::signals2::scoped_connection
+# define RSTUDIO_BOOST_LAST_VALUE boost::signals2::last_value
+
+#else
+# error "Unrecognized RSTUDIO_BOOST_SIGNALS_VERSION"
+#endif
+
+#endif // CORE_RSTUDIO_BOOST_SIGNALS_HPP
+
--- rstudio-1.1.463-orig/src/cpp/CMakeLists.txt	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/CMakeLists.txt	2018-11-17 21:24:35.285976284 +1100
@@ -208,6 +208,18 @@
    message(STATUS "Using RStudio-provided Boost ${BOOST_VERSION}")
 endif()
 
+# allow opt-in to using Boost.Signals2
+# TODO: remove this in RStudio v1.3 and port to signals2
+if(NOT RSTUDIO_BOOST_SIGNALS_VERSION)
+   if (BOOST_VERSION VERSION_LESS 1.69.0)
+      set(RSTUDIO_BOOST_SIGNALS_VERSION 1)
+   else()
+      set(RSTUDIO_BOOST_SIGNALS_VERSION 2)
+   endif()
+endif()
+
+message(STATUS "Using Booost.Signals version ${RSTUDIO_BOOST_SIGNALS_VERSION}")
+add_definitions(-DRSTUDIO_BOOST_SIGNALS_VERSION=${RSTUDIO_BOOST_SIGNALS_VERSION})
 
 # add boost as system include directory
 include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
--- rstudio-1.1.463-orig/src/cpp/r/include/r/session/RConsoleHistory.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/r/include/r/session/RConsoleHistory.hpp	2018-11-17 21:24:35.285976284 +1100
@@ -20,8 +20,8 @@
 
 #include <boost/utility.hpp>
 #include <boost/circular_buffer.hpp>
-#include <boost/signal.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/json/Json.hpp>
 
 namespace rstudio {
@@ -44,7 +44,7 @@
 public:
    typedef boost::circular_buffer<std::string>::value_type value_type;
    typedef boost::circular_buffer<std::string>::const_iterator const_iterator;
-   typedef boost::signal<void (const std::string&)> AddSignal;
+   typedef RSTUDIO_BOOST_SIGNAL<void (const std::string&)> AddSignal;
 
 private:
    ConsoleHistory();
@@ -86,8 +86,7 @@
    core::Error loadFromFile(const core::FilePath& filePath, bool verifyFile);
    core::Error saveToFile(const core::FilePath& filePath) const;
    
-   boost::signals::connection connectOnAdd(
-                                 const AddSignal::slot_function_type& slot)
+   RSTUDIO_BOOST_CONNECTION connectOnAdd(const AddSignal::slot_function_type& slot)
    {
       return onAdd_.connect(slot);
    }
--- rstudio-1.1.463-orig/src/cpp/r/include/r/session/RGraphics.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/r/include/r/session/RGraphics.hpp	2018-11-17 21:24:35.286976293 +1100
@@ -19,6 +19,8 @@
 #include <boost/system/error_code.hpp>
 #include <boost/date_time/posix_time/ptime.hpp>
 
+#include <core/BoostSignals.hpp>
+
 namespace rstudio {
 namespace r {
 namespace session {
@@ -56,8 +58,8 @@
 #include <vector>
 
 #include <boost/function.hpp>
-#include <boost/signal.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/Error.hpp>
 #include <core/json/Json.hpp>
 
@@ -162,7 +164,7 @@
    virtual void clear() = 0;
 
    // subscribe to showManipulator event
-   virtual boost::signal<void ()>& onShowManipulator() = 0;
+   virtual RSTUDIO_BOOST_SIGNAL<void ()>& onShowManipulator() = 0;
 
    // set manipulator values
    virtual void setPlotManipulatorValues(const core::json::Object& values) = 0;
--- rstudio-1.1.463-orig/src/cpp/r/session/graphics/RGraphicsPlotManager.cpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/r/session/graphics/RGraphicsPlotManager.cpp	2018-11-17 21:24:35.286976293 +1100
@@ -540,7 +540,7 @@
 
 
 
-boost::signal<void ()>& PlotManager::onShowManipulator()
+RSTUDIO_BOOST_SIGNAL<void ()>& PlotManager::onShowManipulator()
 {
    return plotManipulatorManager().onShowManipulator();
 }
--- rstudio-1.1.463-orig/src/cpp/r/session/graphics/RGraphicsPlotManager.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/r/session/graphics/RGraphicsPlotManager.hpp	2018-11-17 21:24:35.287976303 +1100
@@ -22,10 +22,10 @@
 #include <boost/utility.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/function.hpp>
-#include <boost/signal.hpp>
 #include <boost/regex.hpp>
 #include <boost/circular_buffer.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/Error.hpp>
 #include <core/FilePath.hpp>
 
@@ -45,10 +45,10 @@
 
 struct GraphicsDeviceEvents
 {
-   boost::signal<void (SEXP)> onNewPage; 
-   boost::signal<void ()> onDrawing;
-   boost::signal<void ()> onResized;
-   boost::signal<void ()> onClosed;
+   RSTUDIO_BOOST_SIGNAL<void (SEXP)> onNewPage; 
+   RSTUDIO_BOOST_SIGNAL<void ()> onDrawing;
+   RSTUDIO_BOOST_SIGNAL<void ()> onResized;
+   RSTUDIO_BOOST_SIGNAL<void ()> onClosed;
 };
 
 class PlotManipulatorManager;
@@ -110,7 +110,7 @@
    
    virtual void clear();
 
-   virtual boost::signal<void ()>& onShowManipulator() ;
+   virtual RSTUDIO_BOOST_SIGNAL<void ()>& onShowManipulator() ;
    virtual void setPlotManipulatorValues(const core::json::Object& values);
    virtual void manipulatorPlotClicked(int x, int y);
 
--- rstudio-1.1.463-orig/src/cpp/r/session/graphics/RGraphicsPlotManipulatorManager.cpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/r/session/graphics/RGraphicsPlotManipulatorManager.cpp	2018-11-17 21:24:35.287976303 +1100
@@ -184,7 +184,7 @@
 }
 
 
-boost::signal<void ()>& PlotManipulatorManager::onShowManipulator()
+RSTUDIO_BOOST_SIGNAL<void ()>& PlotManipulatorManager::onShowManipulator()
 {
    return onShowManipulator_;
 }
--- rstudio-1.1.463-orig/src/cpp/r/session/graphics/RGraphicsPlotManipulatorManager.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/r/session/graphics/RGraphicsPlotManipulatorManager.hpp	2018-11-17 21:24:35.287976303 +1100
@@ -16,8 +16,7 @@
 #ifndef R_SESSION_GRAPHICS_PLOT_MANIPULATOR_MANAGER_HPP
 #define R_SESSION_GRAPHICS_PLOT_MANIPULATOR_MANAGER_HPP
 
-#include <boost/signal.hpp>
-
+#include <core/BoostSignals.hpp>
 #include <core/Error.hpp>
 #include <core/json/Json.hpp>
 
@@ -53,7 +52,7 @@
 public:
    core::Error initialize(const UnitConversionFunctions& convert);
 
-   boost::signal<void ()>& onShowManipulator() ;
+   RSTUDIO_BOOST_SIGNAL<void ()>& onShowManipulator() ;
    void setPlotManipulatorValues(const core::json::Object& values);
    void manipulatorPlotClicked(int x, int y);
    
@@ -85,7 +84,7 @@
    bool replayingManipulator_;
 
    // manipulator event hook
-   boost::signal<void ()> onShowManipulator_;
+   RSTUDIO_BOOST_SIGNAL<void ()> onShowManipulator_;
 
    // unit conversion function
    UnitConversionFunctions convert_;
--- rstudio-1.1.463-orig/src/cpp/server/include/server/ServerSessionManager.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/server/include/server/ServerSessionManager.hpp	2018-11-17 21:27:05.255436316 +1100
@@ -20,9 +20,9 @@
 #include <vector>
 #include <map>
 
-#include <boost/signals.hpp>
 #include <boost/asio/io_service.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/Thread.hpp>
 
 #include <core/system/PosixSystem.hpp>
--- rstudio-1.1.463-orig/src/cpp/session/SessionMain.cpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/SessionMain.cpp	2018-11-17 21:24:35.288976313 +1100
@@ -33,12 +33,12 @@
 #include <boost/lexical_cast.hpp>
 #include <boost/format.hpp>
 
-#include <boost/signals.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/join.hpp>
 
 #include <core/Error.hpp>
+#include <core/BoostSignals.hpp>
 #include <core/BoostThread.hpp>
 #include <core/ConfigUtils.hpp>
 #include <core/FilePath.hpp>
--- rstudio-1.1.463-orig/src/cpp/session/SessionModuleContext.cpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/SessionModuleContext.cpp	2018-11-17 21:24:35.289976322 +1100
@@ -19,10 +19,10 @@
 
 #include <boost/assert.hpp>
 #include <boost/utility.hpp>
-#include <boost/signal.hpp>
 #include <boost/format.hpp>
 #include <boost/numeric/conversion/cast.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/BoostThread.hpp>
 #include <core/Error.hpp>
 #include <core/FilePath.hpp>
@@ -586,13 +586,13 @@
    
    int nextGroup_; 
    
-   boost::signal<void(const r::session::RSuspendOptions&,Settings*),
-                 boost::last_value<void>,
+   RSTUDIO_BOOST_SIGNAL<void(const r::session::RSuspendOptions&,Settings*),
+                 RSTUDIO_BOOST_LAST_VALUE<void>,
                  int,
                  std::less<int> > suspendSignal_;
                   
-   boost::signal<void(const Settings&),
-                 boost::last_value<void>,
+   RSTUDIO_BOOST_SIGNAL<void(const Settings&),
+                 RSTUDIO_BOOST_LAST_VALUE<void>,
                  int,
                  std::greater<int> > resumeSignal_;
 };
--- rstudio-1.1.463-orig/src/cpp/session/include/session/SessionConsoleProcess.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/include/session/SessionConsoleProcess.hpp	2018-11-17 21:24:35.290976332 +1100
@@ -20,10 +20,10 @@
 #include <deque>
 
 #include <boost/regex.hpp>
-#include <boost/signals.hpp>
 #include <boost/circular_buffer.hpp>
 #include <boost/enable_shared_from_this.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/system/Process.hpp>
 #include <core/terminal/PrivateCommand.hpp>
 
@@ -146,7 +146,7 @@
    void setPromptHandler(
          const boost::function<bool(const std::string&, Input*)>& onPrompt);
 
-   boost::signal<void(int)>& onExit() { return onExit_; }
+   RSTUDIO_BOOST_SIGNAL<void(int)>& onExit() { return onExit_; }
 
    std::string handle() const { return procInfo_->getHandle(); }
    InteractionMode interactionMode() const { return procInfo_->getInteractionMode(); }
@@ -264,7 +264,7 @@
    boost::mutex inputOutputQueueMutex_;
 
    boost::function<bool(const std::string&, Input*)> onPrompt_;
-   boost::signal<void(int)> onExit_;
+   RSTUDIO_BOOST_SIGNAL<void(int)> onExit_;
 
    // regex for prompt detection
    boost::regex controlCharsPattern_;
--- rstudio-1.1.463-orig/src/cpp/session/include/session/SessionModuleContext.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/include/session/SessionModuleContext.hpp	2018-11-17 21:28:25.019212857 +1100
@@ -21,9 +21,9 @@
 
 #include <boost/utility.hpp>
 #include <boost/function.hpp>
-#include <boost/signals.hpp>
 #include <boost/shared_ptr.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/HtmlUtils.hpp>
 #include <core/system/System.hpp>
 #include <core/system/ShellUtils.hpp>
@@ -315,35 +315,35 @@
 // session events
 struct Events : boost::noncopyable
 {
-   boost::signal<void (core::json::Object*)> onSessionInfo;
-   boost::signal<void ()>                    onClientInit;
-   boost::signal<void ()>                    onBeforeExecute;
-   boost::signal<void(const std::string&)>   onConsolePrompt;
-   boost::signal<void(const std::string&)>   onConsoleInput;
-   boost::signal<void(const std::string&, const std::string&)>  
+   RSTUDIO_BOOST_SIGNAL<void (core::json::Object*)> onSessionInfo;
+   RSTUDIO_BOOST_SIGNAL<void ()>                    onClientInit;
+   RSTUDIO_BOOST_SIGNAL<void ()>                    onBeforeExecute;
+   RSTUDIO_BOOST_SIGNAL<void(const std::string&)>   onConsolePrompt;
+   RSTUDIO_BOOST_SIGNAL<void(const std::string&)>   onConsoleInput;
+   RSTUDIO_BOOST_SIGNAL<void(const std::string&, const std::string&)>  
                                              onActiveConsoleChanged;
-   boost::signal<void (ConsoleOutputType, const std::string&)>
+   RSTUDIO_BOOST_SIGNAL<void (ConsoleOutputType, const std::string&)>
                                              onConsoleOutput;
-   boost::signal<void()>                     onUserInterrupt;
-   boost::signal<void (ChangeSource)>        onDetectChanges;
-   boost::signal<void (core::FilePath)>      onSourceEditorFileSaved;
-   boost::signal<void(bool)>                 onDeferredInit;
-   boost::signal<void(bool)>                 afterSessionInitHook;
-   boost::signal<void(bool)>                 onBackgroundProcessing;
-   boost::signal<void(bool)>                 onShutdown;
-   boost::signal<void ()>                    onQuit;
-   boost::signal<void ()>                    onDestroyed;
-   boost::signal<void (const std::vector<std::string>&)>
+   RSTUDIO_BOOST_SIGNAL<void()>                     onUserInterrupt;
+   RSTUDIO_BOOST_SIGNAL<void (ChangeSource)>        onDetectChanges;
+   RSTUDIO_BOOST_SIGNAL<void (core::FilePath)>      onSourceEditorFileSaved;
+   RSTUDIO_BOOST_SIGNAL<void(bool)>                 onDeferredInit;
+   RSTUDIO_BOOST_SIGNAL<void(bool)>                 afterSessionInitHook;
+   RSTUDIO_BOOST_SIGNAL<void(bool)>                 onBackgroundProcessing;
+   RSTUDIO_BOOST_SIGNAL<void(bool)>                 onShutdown;
+   RSTUDIO_BOOST_SIGNAL<void ()>                    onQuit;
+   RSTUDIO_BOOST_SIGNAL<void ()>                    onDestroyed;
+   RSTUDIO_BOOST_SIGNAL<void (const std::vector<std::string>&)>
                                              onLibPathsChanged;
-   boost::signal<void (const std::string&)>  onPackageLoaded;
-   boost::signal<void ()>                    onPackageLibraryMutated;
-   boost::signal<void ()>                    onPreferencesSaved;
-   boost::signal<void (const core::DistributedEvent&)>
+   RSTUDIO_BOOST_SIGNAL<void (const std::string&)>  onPackageLoaded;
+   RSTUDIO_BOOST_SIGNAL<void ()>                    onPackageLibraryMutated;
+   RSTUDIO_BOOST_SIGNAL<void ()>                    onPreferencesSaved;
+   RSTUDIO_BOOST_SIGNAL<void (const core::DistributedEvent&)>
                                              onDistributedEvent;
-   boost::signal<void (core::FilePath)>      onPermissionsChanged;
+   RSTUDIO_BOOST_SIGNAL<void (core::FilePath)>      onPermissionsChanged;
 
    // signal for detecting extended type of documents
-   boost::signal<std::string(boost::shared_ptr<source_database::SourceDocument>),
+   RSTUDIO_BOOST_SIGNAL<std::string(boost::shared_ptr<source_database::SourceDocument>),
                  firstNonEmpty<std::string> > onDetectSourceExtendedType;
 };
 
--- rstudio-1.1.463-orig/src/cpp/session/include/session/SessionSourceDatabase.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/include/session/SessionSourceDatabase.hpp	2018-11-17 21:24:35.291976342 +1100
@@ -21,8 +21,8 @@
 
 #include <boost/utility.hpp>
 #include <boost/shared_ptr.hpp>
-#include <boost/signals.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/FilePath.hpp>
 #include <core/json/Json.hpp>
 
@@ -204,14 +204,14 @@
 // source database events
 struct Events : boost::noncopyable
 {
-   boost::signal<void(boost::shared_ptr<SourceDocument>)>      onDocUpdated;
-   boost::signal<void(const std::string&,
+   RSTUDIO_BOOST_SIGNAL<void(boost::shared_ptr<SourceDocument>)>      onDocUpdated;
+   RSTUDIO_BOOST_SIGNAL<void(const std::string&,
                       boost::shared_ptr<SourceDocument>)>      onDocRenamed;
-   boost::signal<void(const std::string&)>                     onDocAdded;
-   boost::signal<void(
+   RSTUDIO_BOOST_SIGNAL<void(const std::string&)>                     onDocAdded;
+   RSTUDIO_BOOST_SIGNAL<void(
       boost::shared_ptr<source_database::SourceDocument>)>     onDocPendingRemove;
-   boost::signal<void(const std::string&, const std::string&)> onDocRemoved;
-   boost::signal<void()>                                       onRemoveAll;
+   RSTUDIO_BOOST_SIGNAL<void(const std::string&, const std::string&)> onDocRemoved;
+   RSTUDIO_BOOST_SIGNAL<void()>                                       onRemoveAll;
 };
 
 Events& events();
--- rstudio-1.1.463-orig/src/cpp/session/include/session/SessionUserSettings.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/include/session/SessionUserSettings.hpp	2018-11-17 21:24:35.291976342 +1100
@@ -20,8 +20,8 @@
 
 #include <boost/utility.hpp>
 #include <boost/scoped_ptr.hpp>
-#include <boost/signal.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/Settings.hpp>
 #include <core/FilePath.hpp>
 #include <core/StringUtils.hpp>
@@ -62,7 +62,7 @@
    friend UserSettings& userSettings();
 
 public:
-   boost::signal<void()> onChanged;
+   RSTUDIO_BOOST_SIGNAL<void()> onChanged;
 
 public:
    // COPYING: boost::noncopyable
--- rstudio-1.1.463-orig/src/cpp/session/include/session/projects/SessionProjects.hpp	2018-10-25 09:42:55.000000000 +1100
+++ rstudio-1.1.463/src/cpp/session/include/session/projects/SessionProjects.hpp	2018-11-17 21:24:35.291976342 +1100
@@ -22,8 +22,8 @@
 #include <boost/utility.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/foreach.hpp>
-#include <boost/signals.hpp>
 
+#include <core/BoostSignals.hpp>
 #include <core/FileInfo.hpp>
 #include <core/FilePath.hpp>
 #include <core/Settings.hpp>
@@ -220,10 +220,10 @@
 
    bool hasFileMonitor_;
    std::vector<std::string> monitorSubscribers_;
-   boost::signal<void(const tree<core::FileInfo>&)> onMonitoringEnabled_;
-   boost::signal<void(const std::vector<core::system::FileChangeEvent>&)>
+   RSTUDIO_BOOST_SIGNAL<void(const tree<core::FileInfo>&)> onMonitoringEnabled_;
+   RSTUDIO_BOOST_SIGNAL<void(const std::vector<core::system::FileChangeEvent>&)>
                                                             onFilesChanged_;
-   boost::signal<void()> onMonitoringDisabled_;
+   RSTUDIO_BOOST_SIGNAL<void()> onMonitoringDisabled_;
 };
 
 ProjectContext& projectContext();
