Skip to content

Commit

Permalink
[core] Add documentation links to most processes / devices ; add puar…
Browse files Browse the repository at this point in the history
…a gestures
  • Loading branch information
jcelerier committed Nov 10, 2024
1 parent a02ebc7 commit 974933d
Show file tree
Hide file tree
Showing 75 changed files with 276 additions and 25 deletions.
2 changes: 1 addition & 1 deletion 3rdparty/avendish
Submodule avendish updated 48 files
+1 −0 examples/Advanced/AudioParticles/AudioParticles.hpp
+1 −0 examples/Advanced/GeoZones/GeoZones.hpp
+1 −0 examples/Advanced/MidiScaler/MidiFilter.hpp
+1 −0 examples/Advanced/MidiScaler/MidiReader.hpp
+1 −0 examples/Advanced/MidiScaler/MidiScaler.hpp
+1 −0 examples/Advanced/MidiScaler/MidiScroller.hpp
+1 −0 examples/Advanced/Patternal/Melodial.hpp
+1 −0 examples/Advanced/Patternal/Patternal.hpp
+1 −0 examples/Advanced/Utilities/ADSR.hpp
+14 −0 examples/Advanced/Utilities/AudioFilters.hpp
+1 −0 examples/Advanced/Utilities/AudioSum.hpp
+1 −0 examples/Advanced/Utilities/Automation.hpp
+2 −0 examples/Advanced/Utilities/Bitcrush.hpp
+1 −0 examples/Advanced/Utilities/Calibrator.hpp
+1 −0 examples/Advanced/Utilities/ColorAutomation.hpp
+2 −0 examples/Advanced/Utilities/Combine.hpp
+1 −1 examples/Advanced/Utilities/ControlToCV.hpp
+2 −0 examples/Advanced/Utilities/Convolver.hpp
+4 −0 examples/Advanced/Utilities/Dynamics.hpp
+1 −0 examples/Advanced/Utilities/Echo.hpp
+2 −0 examples/Advanced/Utilities/Flanger.hpp
+3 −0 examples/Advanced/Utilities/LightnessComputer.hpp
+3 −0 examples/Advanced/Utilities/LightnessSampler.hpp
+1 −0 examples/Advanced/Utilities/MapTool.hpp
+1 −0 examples/Advanced/Utilities/Mapping.hpp
+2 −0 examples/Advanced/Utilities/MonoMix.hpp
+3 −0 examples/Advanced/Utilities/RangeFilter.hpp
+3 −0 examples/Advanced/Utilities/RangeMapper.hpp
+2 −0 examples/Advanced/Utilities/Silence.hpp
+1 −0 examples/Advanced/Utilities/Soundfile.hpp
+2 −0 examples/Advanced/Utilities/Spread.hpp
+3 −0 examples/Advanced/Utilities/StereoMixer.hpp
+2 −0 examples/Advanced/Utilities/Trigger.hpp
+1 −0 examples/Advanced/Utilities/Tweener.hpp
+1 −0 examples/Advanced/Utilities/Wavecycle.hpp
+4 −0 examples/Gpu/Compute.hpp
+4 −0 examples/Gpu/SolidColor.hpp
+6 −2 examples/Helpers/AudioChannelSelector.hpp
+4 −0 examples/Helpers/FFTDisplay.hpp
+4 −0 examples/Helpers/GradientScrubber.hpp
+1 −0 examples/Helpers/Poles.hpp
+1 −0 examples/Helpers/SpriteReader.hpp
+1 −0 examples/Helpers/ValueDelay.hpp
+3 −0 examples/Midi/Arpeggiator.hpp
+2 −0 examples/Midi/MidiGlide.hpp
+2 −0 examples/Midi/MidiHiResInput.hpp
+2 −0 examples/Midi/MidiHiResOutput.hpp
+2 −0 examples/Midi/MidiPitch.hpp
5 changes: 5 additions & 0 deletions ci/common.deps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ fi
if [[ ! -d score-addon-hdf5 ]]; then
git clone --recursive -j16 https://github.com/ossia/score-addon-hdf5
fi

if [[ ! -d score-addon-puara ]]; then
git clone --recursive -j16 https://github.com/ossia/score-addon-puara
fi

)


1 change: 0 additions & 1 deletion src/addons/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ macro(SUBDIRLIST result curdir)
set(${result} ${dirlist})
endmacro()


subdirlist(SUBDIRS "${CMAKE_CURRENT_SOURCE_DIR}")
set(SCORE_ADDON True)
foreach(subdir ${SUBDIRS})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
#include "ProtocolFactoryInterface.hpp"

#include <QUrl>

#include <wobjectimpl.h>
W_OBJECT_IMPL(Device::DeviceEnumerator)

namespace Device
{
ProtocolFactory::~ProtocolFactory() = default;
Expand All @@ -18,6 +21,11 @@ int ProtocolFactory::visualPriority() const noexcept
return 0;
}

QUrl ProtocolFactory::manual() const noexcept
{
return {};
}

DeviceEnumerators
ProtocolFactory::getEnumerators(const score::DocumentContext& ctx) const
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include <score_lib_device_export.h>

class QUrl;
struct VisitorVariant;

namespace Explorer
Expand Down Expand Up @@ -39,7 +40,9 @@ class SCORE_LIB_DEVICE_EXPORT DeviceEnumerator : public QObject
void deviceRemoved(const QString& s)
E_SIGNAL(SCORE_LIB_DEVICE_EXPORT, deviceRemoved, s)
};

using DeviceEnumerators = std::vector<std::pair<QString, Device::DeviceEnumerator*>>;

class SCORE_LIB_DEVICE_EXPORT ProtocolFactory : public score::InterfaceBase
{
SCORE_INTERFACE(ProtocolFactory, "3f69d72e-318d-42dc-b48c-a806036592f1")
Expand Down Expand Up @@ -67,6 +70,7 @@ class SCORE_LIB_DEVICE_EXPORT ProtocolFactory : public score::InterfaceBase

virtual QString prettyName() const noexcept = 0;
virtual QString category() const noexcept = 0;
virtual QUrl manual() const noexcept;

/** The one with the highest priority
* will show up first in the protocol list */
Expand Down
5 changes: 5 additions & 0 deletions src/plugins/score-plugin-audio/Audio/AudioDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,11 @@ QString AudioProtocolFactory::category() const noexcept
return StandardCategories::audio;
}

QUrl AudioProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/audio-device.html");
}

Device::DeviceEnumerators
AudioProtocolFactory::getEnumerators(const score::DocumentContext& ctx) const
{
Expand Down
1 change: 1 addition & 0 deletions src/plugins/score-plugin-audio/Audio/AudioDevice.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class AudioProtocolFactory final : public Device::ProtocolFactory
SCORE_CONCRETE("2835e6da-9b55-4029-9802-e1c817acbdc1")
QString prettyName() const noexcept override;
QString category() const noexcept override;
QUrl manual() const noexcept override;
Device::DeviceEnumerators
getEnumerators(const score::DocumentContext& ctx) const override;

Expand Down
3 changes: 3 additions & 0 deletions src/plugins/score-plugin-avnd/AvndProcesses/AudioRecorder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ struct AudioRecorder
halp_meta(category, "Audio/Recording")
halp_meta(description, "Records audio to a file")
halp_meta(c_name, "avnd_audio_recorder")
halp_meta(
manual_url,
"https://ossia.io/score-docs/processes/audio-utilities.html#audio-recorder")
halp_meta(uuid, "4463dddc-6acf-4106-a680-fed67d8030da")

using audio_buffer = boost::container::vector<double>;
Expand Down
1 change: 1 addition & 0 deletions src/plugins/score-plugin-avnd/AvndProcesses/Spammer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ struct Spammer : PatternObject
halp_meta(category, "Control/Data processing")
halp_meta(description, "Send a message at a given frequency")
halp_meta(c_name, "avnd_pattern_spam")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/spammer.html")
halp_meta(uuid, "0fa9415b-dcda-4ab8-b3f5-353c5d35fc8a")

struct
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/score-plugin-avnd/AvndProcesses/Sweeper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ struct PatternSweeper : PatternObject
halp_meta(description, "Sweep a message to all nodes matching a pattern")
halp_meta(c_name, "avnd_pattern_sweep")
halp_meta(uuid, "55f4fe13-f71b-4c20-ac32-74668e82664c")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/sweeper.html#sweeper")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/sweeper.html")

struct
{
Expand Down
1 change: 1 addition & 0 deletions src/plugins/score-plugin-avnd/AvndProcesses/Teleplot.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct Teleplot : PatternObject
halp_meta(category, "Monitoring")
halp_meta(description, "Forwards a set of device explorer messages to ")
halp_meta(c_name, "avnd_teleplot")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/teleplot.html")
halp_meta(uuid, "e1d5b9a0-4df9-4281-87a6-9f427dfb6e31")

// Populated automatically from Executor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <ossia/detail/algorithms.hpp>

#include <QComboBox>
#include <QDesktopServices>
#include <QDialogButtonBox>
#include <QFormLayout>
#include <QHeaderView>
Expand Down Expand Up @@ -117,12 +118,15 @@ DeviceEditDialog::DeviceEditDialog(
m_settingsFormLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
m_main->setLayout(m_settingsFormLayout);
column3_layout->addWidget(m_main);

m_invalidLabel = new QLabel{
tr("Cannot add device.\n Try changing the name to make it unique, \nor "
"check that the ports aren't already used")};
m_invalidLabel->setAlignment(Qt::AlignRight);
m_invalidLabel->setTextFormat(Qt::PlainText);

m_buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
m_helpButton = m_buttonBox->addButton(tr("Help"), QDialogButtonBox::HelpRole);
m_okButton = m_buttonBox->addButton(tr("Add"), QDialogButtonBox::AcceptRole);
m_buttonBox->addButton(QDialogButtonBox::Cancel);
column3_layout->addStretch(1);
Expand All @@ -142,6 +146,19 @@ DeviceEditDialog::DeviceEditDialog(

connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(m_buttonBox, &QDialogButtonBox::helpRequested, [this] {
if(!this->m_protocols)
return;
auto selected_item = m_protocols->selectedItems().first();
auto key
= selected_item->data(0, Qt::UserRole).value<UuidKey<Device::ProtocolFactory>>();
if(key == UuidKey<Device::ProtocolFactory>{})
return;

if(auto* proto = m_protocolList.get(key))
if(auto manual = proto->manual(); !manual.isEmpty())
QDesktopServices::openUrl(manual);
});

initAvailableProtocols();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceEditDialog final : public QDialog
QSplitter* m_splitter{};
QDialogButtonBox* m_buttonBox{};
QPushButton* m_okButton{};
QPushButton* m_helpButton{};
QTreeWidget* m_protocols{};
QTreeWidget* m_devices{};
QWidget* m_main{};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#include <QDebug>
#include <QObject>
#include <QUrl>

namespace Device
{
class DeviceInterface;
Expand All @@ -31,6 +33,11 @@ QString LocalProtocolFactory::category() const noexcept
return StandardCategories::util;
}

QUrl LocalProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/local-device.html");
}

Device::DeviceInterface* LocalProtocolFactory::makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& plugin,
const score::DocumentContext& ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class LocalProtocolFactory final : public DefaultProtocolFactory
// Implement with OSSIA::Device
QString prettyName() const noexcept override;
QString category() const noexcept override;
QUrl manual() const noexcept override;

Device::DeviceInterface* makeDevice(
const Device::DeviceSettings& settings,
Expand Down
4 changes: 3 additions & 1 deletion src/plugins/score-plugin-fx/Fx/AngleNode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ struct Direction
halp_meta(c_name, "AngleMapper")
halp_meta(category, "Control/Mappings")
halp_meta(author, "ossia score")
halp_meta(manual_url, "")
halp_meta(
manual_url,
"https://ossia.io/score-docs/processes/mapping-utilities.html#angle-mapper")
halp_meta(description, "Map the variation of an angle")
halp_meta(uuid, "9b0e21ba-965a-4aa4-beeb-60cc5128c418")
halp_flag(time_independent);
Expand Down
4 changes: 3 additions & 1 deletion src/plugins/score-plugin-fx/Fx/Arpeggiator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ struct Node
halp_meta(c_name, "Arpeggiator")
halp_meta(category, "Midi")
halp_meta(author, "ossia score")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/midi-utilities.html#arpeggiator")
halp_meta(
manual_url,
"https://ossia.io/score-docs/processes/midi-utilities.html#arpeggiator")
halp_meta(description, "Arpeggiator")
halp_meta(uuid, "0b98c7cd-f831-468f-81e3-706d6a97d705")

Expand Down
3 changes: 1 addition & 2 deletions src/plugins/score-plugin-fx/Fx/Looper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ struct Node
halp_meta(c_name, "Looper (audio)")
halp_meta(category, "Audio/Utilities")
halp_meta(author, "ossia score")
halp_meta(
manual_url, "https://ossia.io/score-docs/processes/audio-looper.html#audio-looper")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/audio-looper.html")
halp_meta(description, "Loop audio")
halp_meta(uuid, "a0ad4227-ac3d-448b-a19b-19581ed4e2c6");
halp_meta(recommended_height, 65);
Expand Down
3 changes: 2 additions & 1 deletion src/plugins/score-plugin-fx/Fx/MicroMapping.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ struct Node
halp_meta(name, "Micromap")
halp_meta(c_name, "MicroMapping")
halp_meta(category, "Control/Mappings")
halp_meta(manual_url, "https://github.com/ossia/score-user-library/tree/master/Presets/Micromap")
halp_meta(
manual_url, "https://ossia.io/score-docs/processes/exprtk.html#exprtk-support")
halp_meta(author, "ossia score, ExprTK (Arash Partow)")
halp_meta(description, "Applies a math expression to an input.")
halp_meta(uuid, "25c64b87-a44a-4fed-9f60-0a48906fd3ec")
Expand Down
3 changes: 2 additions & 1 deletion src/plugins/score-plugin-fx/Fx/MidiHiRes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ struct Input
halp_meta(c_name, "MidiHiResIn")
halp_meta(category, "Midi")
halp_meta(author, "ossia score")
halp_meta(manual_url, "https://ossia.io/score-docs/processes/javascript.html#midi")
halp_meta(
manual_url, "https://ossia.io/score-docs/processes/midi-utilities.html#midi-hires")
halp_meta(description, "Creates a float from MSB/LSB CCs")
halp_meta(uuid, "28ca746e-c304-4ba6-bd5b-78934a1dec55")

Expand Down
5 changes: 5 additions & 0 deletions src/plugins/score-plugin-gfx/Gfx/CameraDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,11 @@ QString CameraProtocolFactory::prettyName() const noexcept
return QObject::tr("Camera input");
}

QUrl CameraProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/camera-device.html");
}

QString CameraProtocolFactory::category() const noexcept
{
return StandardCategories::video;
Expand Down
1 change: 1 addition & 0 deletions src/plugins/score-plugin-gfx/Gfx/CameraDevice.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class CameraProtocolFactory final : public Device::ProtocolFactory
SCORE_CONCRETE("d615690b-f2e2-447b-b70e-a800552db69c")
QString prettyName() const noexcept override;
QString category() const noexcept override;
QUrl manual() const noexcept override;
Device::DeviceEnumerators
getEnumerators(const score::DocumentContext& ctx) const override;

Expand Down
5 changes: 5 additions & 0 deletions src/plugins/score-plugin-gfx/Gfx/Kinect2Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,11 @@ QString ProtocolFactory::prettyName() const noexcept
return QObject::tr("Kinect Input");
}

QUrl ProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/kinect-device.html");
}

Device::DeviceEnumerators ProtocolFactory::getEnumerators(const score::DocumentContext& ctx) const
{
return {};
Expand Down
1 change: 1 addition & 0 deletions src/plugins/score-plugin-gfx/Gfx/Kinect2Device.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class ProtocolFactory final : public SharedInputProtocolFactory
SCORE_CONCRETE("1056df8a-f20c-40e4-995e-f18ffda3a16a")
public:
QString prettyName() const noexcept override;
QUrl manual() const noexcept override;
Device::DeviceEnumerators getEnumerators(const score::DocumentContext& ctx) const override;

Device::DeviceInterface* makeDevice(
Expand Down
5 changes: 5 additions & 0 deletions src/plugins/score-plugin-gfx/Gfx/Libav/LibavOutputDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,11 @@ QString LibavOutputProtocolFactory::category() const noexcept
return StandardCategories::util;
}

QUrl LibavOutputProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/libav-device.html");
}

Device::DeviceInterface* LibavOutputProtocolFactory::makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& plugin,
const score::DocumentContext& ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class LibavOutputProtocolFactory final : public Device::ProtocolFactory
SCORE_CONCRETE("16b53d87-19dc-48d4-b3ab-7174408c7ce7")
QString prettyName() const noexcept override;
QString category() const noexcept override;
QUrl manual() const noexcept override;
Device::DeviceInterface* makeDevice(
const Device::DeviceSettings& settings,
const Explorer::DeviceDocumentPlugin& plugin,
Expand Down
5 changes: 5 additions & 0 deletions src/plugins/score-plugin-gfx/Gfx/Sh4lt/Sh4ltInputDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,11 @@ QString InputFactory::prettyName() const noexcept
return QObject::tr("Sh4lt Input");
}

QUrl InputFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/sh4lt-device.html");
}

Device::DeviceInterface* InputFactory::makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& plugin,
const score::DocumentContext& ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class InputFactory final : public SharedInputProtocolFactory
SCORE_CONCRETE("7b3a7adb-af9e-4dd5-9bd7-641f4d33fa2d")
public:
QString prettyName() const noexcept override;
QUrl manual() const noexcept override;

Device::DeviceInterface* makeDevice(
const Device::DeviceSettings& settings,
Expand Down
5 changes: 5 additions & 0 deletions src/plugins/score-plugin-gfx/Gfx/Sh4lt/Sh4ltOutputDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,11 @@ QString Sh4ltOutputProtocolFactory::prettyName() const noexcept
return QObject::tr("Sh4lt Output");
}

QUrl Sh4ltOutputProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/sh4lt-device.html");
}

Device::DeviceInterface* Sh4ltOutputProtocolFactory::makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& doc,
const score::DocumentContext& ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Sh4ltOutputProtocolFactory final : public Gfx::SharedOutputProtocolFactory
SCORE_CONCRETE("41e367e1-fc36-40b2-b8c4-8aecd5dfd4fc")
public:
QString prettyName() const noexcept override;
QUrl manual() const noexcept override;

Device::DeviceInterface* makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& doc,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,11 @@ QString InputFactory::prettyName() const noexcept
return QObject::tr("Shmdata Input");
}

QUrl InputFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/shmdata-device.html");
}

Device::DeviceInterface* InputFactory::makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& plugin,
const score::DocumentContext& ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class InputFactory final : public SharedInputProtocolFactory
SCORE_CONCRETE("8062b2e5-c589-41f1-8977-96c5ba782f95")
public:
QString prettyName() const noexcept override;
QUrl manual() const noexcept override;

Device::DeviceInterface* makeDevice(
const Device::DeviceSettings& settings,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,11 @@ QString ShmdataOutputProtocolFactory::prettyName() const noexcept
return QObject::tr("Shmdata Output");
}

QUrl ShmdataOutputProtocolFactory::manual() const noexcept
{
return QUrl("https://ossia.io/score-docs/devices/shmdata-device.html");
}

Device::DeviceInterface* ShmdataOutputProtocolFactory::makeDevice(
const Device::DeviceSettings& settings, const Explorer::DeviceDocumentPlugin& doc,
const score::DocumentContext& ctx)
Expand Down
Loading

0 comments on commit 974933d

Please sign in to comment.