[QtQuick3d, Ecliptica Play test ] We usually work in QtQuick3d, so stop working and start playing! I'm excited to announce the launch of a public playtest on Steam. Feedback is welcome.
https://store.steampowered.com/app/3723390/Ecliptica/
https://redd.it/1nog9g4
@qt_reddit
https://store.steampowered.com/app/3723390/Ecliptica/
https://redd.it/1nog9g4
@qt_reddit
Steampowered
Ecliptica on Steam
Ecliptica is a first-person open-world colony survival simulator with a fully dynamic economy. Set on a hostile alien planet, you'll found corporations, fight for resources, and build a sustainable future—or be wiped out by ruthless nature, politics, and…
Inherited a Qt "Big Ball of Mud" - Need a sanity check on my refactoring strategy.
Hey r/QtFramework,
I've recently taken over a large, older C++/Qt desktop application, and after digging in, I've realized it's a classic "Big Ball of Mud." I'm hoping to get some advice and perspective from veterans who've been in a similar situation.
The "Horror Story"
The codebase is extremely tangled. Here are the main issues:
Unsafe Cross-Thread Calls: This is the scariest part. Worker threads and even raw `std::thread`s are getting pointers to global UI objects and calling methods on them directly (e.g., `g_mainWindow->do_something_non_ui("hello from worker")`). It's a miracle the app doesn't crash more often.
Global Singletons Everywhere: The app is deeply coupled to a handful of global singleton objects that hold all the important state. They are used and modified from all over the codebase.
One Giant Signal Hub: There's one massive singleton that acts as a central signal bus for everything in non-qt threads. It has a huge number of unrelated signals and feels like a giant "junk drawer" where every new feature's signals have been added over the years.
Impossible to Test: Because of all the globals and tangled connections, it's nearly impossible to test any single piece of the application in isolation.
My Plan to Fix It (Without a Full Rewrite)
A full rewrite is not an option. I have to deliver new features while trying to pay down this technical debt. I've come up with a 3-step strategy and I'd love to know if it makes sense, or if I'm walking into a trap.
Step 1: Stabilize. My absolute first priority is to fix the unsafe cross-thread calls. My plan is to use the existing giant signal bus as a temporary tool. I want to find every direct call like
Step 2: Contain (Stop the problem from getting worse). Once the app is stable, I want to establish a hard rule for the team: "Background threads do NOT talk to UI threads directly. Use a signal bus." This at least prevents us from digging the hole deeper.
Step 3: Refactor (Build a cleaner future, one piece at a time). For any new feature we build, we will NOT add to the giant global bus. Instead, we'll create a new, small, feature-specific event bus (like
So, my main question is: Does this strategy make sense?
Is using the existing "God Bus" as a temporary crutch to fix the threading issues a good first step? Or am I just trading one bad pattern for another? For those who've had to untangle a mess like this, what worked for you?
https://redd.it/1noishe
@qt_reddit
Hey r/QtFramework,
I've recently taken over a large, older C++/Qt desktop application, and after digging in, I've realized it's a classic "Big Ball of Mud." I'm hoping to get some advice and perspective from veterans who've been in a similar situation.
The "Horror Story"
The codebase is extremely tangled. Here are the main issues:
Unsafe Cross-Thread Calls: This is the scariest part. Worker threads and even raw `std::thread`s are getting pointers to global UI objects and calling methods on them directly (e.g., `g_mainWindow->do_something_non_ui("hello from worker")`). It's a miracle the app doesn't crash more often.
Global Singletons Everywhere: The app is deeply coupled to a handful of global singleton objects that hold all the important state. They are used and modified from all over the codebase.
One Giant Signal Hub: There's one massive singleton that acts as a central signal bus for everything in non-qt threads. It has a huge number of unrelated signals and feels like a giant "junk drawer" where every new feature's signals have been added over the years.
Impossible to Test: Because of all the globals and tangled connections, it's nearly impossible to test any single piece of the application in isolation.
My Plan to Fix It (Without a Full Rewrite)
A full rewrite is not an option. I have to deliver new features while trying to pay down this technical debt. I've come up with a 3-step strategy and I'd love to know if it makes sense, or if I'm walking into a trap.
Step 1: Stabilize. My absolute first priority is to fix the unsafe cross-thread calls. My plan is to use the existing giant signal bus as a temporary tool. I want to find every direct call like
g_mainWindow->do_something() and replace it with a thread-safe, queued signal from the bus, like GlobalBus::getInstance()->postStatusUpdate(). My hope is this will stop the immediate bleeding.Step 2: Contain (Stop the problem from getting worse). Once the app is stable, I want to establish a hard rule for the team: "Background threads do NOT talk to UI threads directly. Use a signal bus." This at least prevents us from digging the hole deeper.
Step 3: Refactor (Build a cleaner future, one piece at a time). For any new feature we build, we will NOT add to the giant global bus. Instead, we'll create a new, small, feature-specific event bus (like
AuthenticationBus). This new bus will be passed into the classes that need it through their constructor (Dependency Injection), not accessed as a global. This will create "islands" of clean, modern, and testable code within the old structure.So, my main question is: Does this strategy make sense?
Is using the existing "God Bus" as a temporary crutch to fix the threading issues a good first step? Or am I just trading one bad pattern for another? For those who've had to untangle a mess like this, what worked for you?
https://redd.it/1noishe
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Proper wording for a QT project?
I worked on a personal project involving QT out of curiosity to learn QT and to work on my C++ skills. It's a thin client communicating with a Django REST API. What would be the proper wording for such a project? I'm reluctant to use the term full-stack, because it's not a traditional web-application, so what is the proper term? Client-server application? Or is it fair to use the term full-stack to refer to my application? What would you think if you saw the term used on a resume? Thanks
https://redd.it/1noxyl4
@qt_reddit
I worked on a personal project involving QT out of curiosity to learn QT and to work on my C++ skills. It's a thin client communicating with a Django REST API. What would be the proper wording for such a project? I'm reluctant to use the term full-stack, because it's not a traditional web-application, so what is the proper term? Client-server application? Or is it fair to use the term full-stack to refer to my application? What would you think if you saw the term used on a resume? Thanks
https://redd.it/1noxyl4
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Crash when using default assignment operator of my class
Hello all!
I have run into a problem, more precisely a crash regarding Qt5 and C++11 and I want to ask for some help.
TL;DR: I have a struct with several members, some of them are Qt classes like QString, QMap, etc. When I instantiate this struct in a function and fill it with data, then at the end of the function I use the assignment operator to create a new instance of this struct from the filled one, the program crashes.
I have a normal struct(MyDataStruct), which has several members, some of them are Qt classes like QString, QMap, etc. In the code, at the start of a function, I instantiate this struct and throughout the function I fill it with data. Then at the end of the function, I use the assignment operator to create a new instance of this class and this is the line where the crash happens.
Because it's just a simple struct, the compiler creates a default assignment operator for it and the default constructors. However, I'm not too experienced with C++ neither with Qt so when the two used together I'm not sure how these are created.
When I debug the code, at the end of the function, before the assignment, I check the values of the struct member and they are all correct. It looks completely normal and that why the strange part starts from here. But when I step into the assignment operator, I see that in the new instance some members, mostly the QString at the start, are already corrupted, they have strange values like ??? and the program crashes.
However, if I clear every member before the assignment, like calling clear() on the QStrings and QMaps, then the assignment works and the program doesn't crash.
Moreover, if I move the first uint32_t member(m_signature) to the end of the struct(not using clears this time), then the assignment still works correctly without a crash. (If i'm keeping it at the start, there was a usecase when the second member, the QString contained ??? value after/in the assignment before the crash)
Therefore I suspect some kind of memory corruption, maybe the integer overflows and corrupts the string or something similar, but as I mentioned I'm not too experienced in this field.
So I would really appreciate if someone could help me understand what is happening here and how to fix it.
Thanks in advance!
Here is a minimal example that shows the problem:
class MyFolder
{
public:
QString mname;
QString mFolderName;
QString mFolderValue;
int32t mlevel;
};
class MyBLock
{
public:
QString mname;
QString mBlockName;
QString mBlockValue;
QString mblockDescription;
};
class MyDataStruct
{
public:
uint32t msignature = 0;
QString mcurrentValue;
QString mexpectedValue;
QString mspecificValue;
QString mblockValue;
QString melementName;
QString mversion;
QString mlevel;
QString mmachineValue;
QString muserValue;
QString mfileValue;
QString mdescription;
QString mdateValue;
QMap<QString, MyFolder> mfolderMap;
QStringList mlevelList;
QStringList mnameList;
QStringList mvalueList;
QStringList mdateList;
QList<MyBBlock> mblockList;
QMap<QString, MyBlock> mblockMap;
long mfirstError = 0;
long msecondError = 0;
};
long MyClass::myFunction()
{
MyDataStruct data;
// Fill the 'data' struct with values
// Lot of things happen here to acquire and fill the
Hello all!
I have run into a problem, more precisely a crash regarding Qt5 and C++11 and I want to ask for some help.
TL;DR: I have a struct with several members, some of them are Qt classes like QString, QMap, etc. When I instantiate this struct in a function and fill it with data, then at the end of the function I use the assignment operator to create a new instance of this struct from the filled one, the program crashes.
I have a normal struct(MyDataStruct), which has several members, some of them are Qt classes like QString, QMap, etc. In the code, at the start of a function, I instantiate this struct and throughout the function I fill it with data. Then at the end of the function, I use the assignment operator to create a new instance of this class and this is the line where the crash happens.
Because it's just a simple struct, the compiler creates a default assignment operator for it and the default constructors. However, I'm not too experienced with C++ neither with Qt so when the two used together I'm not sure how these are created.
When I debug the code, at the end of the function, before the assignment, I check the values of the struct member and they are all correct. It looks completely normal and that why the strange part starts from here. But when I step into the assignment operator, I see that in the new instance some members, mostly the QString at the start, are already corrupted, they have strange values like ??? and the program crashes.
However, if I clear every member before the assignment, like calling clear() on the QStrings and QMaps, then the assignment works and the program doesn't crash.
Moreover, if I move the first uint32_t member(m_signature) to the end of the struct(not using clears this time), then the assignment still works correctly without a crash. (If i'm keeping it at the start, there was a usecase when the second member, the QString contained ??? value after/in the assignment before the crash)
Therefore I suspect some kind of memory corruption, maybe the integer overflows and corrupts the string or something similar, but as I mentioned I'm not too experienced in this field.
So I would really appreciate if someone could help me understand what is happening here and how to fix it.
Thanks in advance!
Here is a minimal example that shows the problem:
class MyFolder
{
public:
QString mname;
QString mFolderName;
QString mFolderValue;
int32t mlevel;
};
class MyBLock
{
public:
QString mname;
QString mBlockName;
QString mBlockValue;
QString mblockDescription;
};
class MyDataStruct
{
public:
uint32t msignature = 0;
QString mcurrentValue;
QString mexpectedValue;
QString mspecificValue;
QString mblockValue;
QString melementName;
QString mversion;
QString mlevel;
QString mmachineValue;
QString muserValue;
QString mfileValue;
QString mdescription;
QString mdateValue;
QMap<QString, MyFolder> mfolderMap;
QStringList mlevelList;
QStringList mnameList;
QStringList mvalueList;
QStringList mdateList;
QList<MyBBlock> mblockList;
QMap<QString, MyBlock> mblockMap;
long mfirstError = 0;
long msecondError = 0;
};
long MyClass::myFunction()
{
MyDataStruct data;
// Fill the 'data' struct with values
// Lot of things happen here to acquire and fill the
data
...
// At this point, after the struct is filled with data, all members of 'data' are correctly filled.
// The crash happens here during assignment
MyDataStruct newData = data; // Crash occurs here
return 0;
}
https://redd.it/1npf9dg
@qt_reddit
...
// At this point, after the struct is filled with data, all members of 'data' are correctly filled.
// The crash happens here during assignment
MyDataStruct newData = data; // Crash occurs here
return 0;
}
https://redd.it/1npf9dg
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Qt 6.9.2: Can't find Bluetooth module in Maintenance Tool
I'm working with Qt 6.9.2 on Windows and trying to build a project that uses
>error C1083: Cannot open include file: 'QLowEnergyController': No such file or directory
https://redd.it/1npghol
@qt_reddit
I'm working with Qt 6.9.2 on Windows and trying to build a project that uses
QLowEnergyController, but I'm getting this error:>error C1083: Cannot open include file: 'QLowEnergyController': No such file or directory
https://redd.it/1npghol
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Method to synchronize views (while scrolling and editing) of Markdown and its rendering in HTML ?
I'm working on a Markdown editor application. It has 2 side by side views. The left view is a Markdown editor where markup code is edited. The right view is the HTML rendering of the markup content.
I would like the views synchronized such that when one is editing the Markdown in the left view the right view is scrolled such that it shows the corresponding html rendering. If one scrolls to a different part of the markup file the html view scrolls as well.
The Markdown editor view uses QPlainTextEdit. The Markdown view (rendering) side uses QWebEngineView to display the HTML rendering.
Any and all ideas and advice on doing this would be greatly appreciated.
https://redd.it/1npu0mq
@qt_reddit
I'm working on a Markdown editor application. It has 2 side by side views. The left view is a Markdown editor where markup code is edited. The right view is the HTML rendering of the markup content.
I would like the views synchronized such that when one is editing the Markdown in the left view the right view is scrolled such that it shows the corresponding html rendering. If one scrolls to a different part of the markup file the html view scrolls as well.
The Markdown editor view uses QPlainTextEdit. The Markdown view (rendering) side uses QWebEngineView to display the HTML rendering.
Any and all ideas and advice on doing this would be greatly appreciated.
https://redd.it/1npu0mq
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Program suddently prints tons of errors, font related
I wrote a small program last year. It worked fine. Haven't touched or compiled it recently, but now my binary is printing infinite loop of lines that look like this:
>qt.text.font.db: OpenType support missing for "", script 10
>qt.text.font.db: OpenType support missing for "Hack", script 9
>qt.text.font.db: OpenType support missing for "Hack", script 17
I'm guessing the problem is some QT setup and fonts, and has nothing to do with my app.
Program still works, but output is very disturbing. I tried
I'm on Arch Linux (EndeavourOS). Up to date system. Noticed the issue yesterday.
My code is at: https://github.com/fluxrider/vault/blob/main/qt.cpp
https://redd.it/1nqg8au
@qt_reddit
I wrote a small program last year. It worked fine. Haven't touched or compiled it recently, but now my binary is printing infinite loop of lines that look like this:
>qt.text.font.db: OpenType support missing for "", script 10
>qt.text.font.db: OpenType support missing for "Hack", script 9
>qt.text.font.db: OpenType support missing for "Hack", script 17
I'm guessing the problem is some QT setup and fonts, and has nothing to do with my app.
Program still works, but output is very disturbing. I tried
./my_qt_program 2> log.txt to see the head of the prints but even though the error prints are gone when I do that, the file is 0 bytes.I'm on Arch Linux (EndeavourOS). Up to date system. Noticed the issue yesterday.
My code is at: https://github.com/fluxrider/vault/blob/main/qt.cpp
https://redd.it/1nqg8au
@qt_reddit
GitHub
vault/qt.cpp at main · fluxrider/vault
A simple vault for passwords and stuff. KeePassXC corrupted the file I've been using for many years without warning. This simpler program should keep me going for a while. - fluxrider/vault
Is it still worth using Qt3D in 2025?
I'm looking for an OpenGL rendering engine to use in my Qt C++/QML application. I see that Qt3D has been deprecated, but the Qt Quick alternative seems unsuitable considering the nature of the project. Is it still worth using Qt3D, or should I explore other rendering frameworks like Magnum?
https://redd.it/1nqk35w
@qt_reddit
I'm looking for an OpenGL rendering engine to use in my Qt C++/QML application. I see that Qt3D has been deprecated, but the Qt Quick alternative seems unsuitable considering the nature of the project. Is it still worth using Qt3D, or should I explore other rendering frameworks like Magnum?
https://redd.it/1nqk35w
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Best way to debug PySide + QML?
I’ve been building a python + qml app that is launched as a script from a desktop app. I’m able to attach the python debugger to the process via vs code in order to debug the python, but I was wondering if there’s a way to also utilize breakpoint and stack traces in the QML? I have been throwing in console.log and trace around but would like to use the actual qml debugger if possible.
https://redd.it/1nraq9z
@qt_reddit
I’ve been building a python + qml app that is launched as a script from a desktop app. I’m able to attach the python debugger to the process via vs code in order to debug the python, but I was wondering if there’s a way to also utilize breakpoint and stack traces in the QML? I have been throwing in console.log and trace around but would like to use the actual qml debugger if possible.
https://redd.it/1nraq9z
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
PyQt6 setWindowIcon works, PySide6 does not...
With the exact same code, except for imports obviously, my `setWindowIcon` is not working.
I am on Ubuntu 22.04. And I am running the app manually from the terminal.
Example:
class Window(QWidget):
def init(self):
super().init()
self.resize(250, 150)
self.setWindowTitle('Window Icon')
path = Path(file).resolve().parent
self.setWindowIcon(QIcon(os.path.join(path, 'web.png')))
def main():
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
Any help would be appreciated.
https://redd.it/1nrfwtu
@qt_reddit
With the exact same code, except for imports obviously, my `setWindowIcon` is not working.
I am on Ubuntu 22.04. And I am running the app manually from the terminal.
Example:
class Window(QWidget):
def init(self):
super().init()
self.resize(250, 150)
self.setWindowTitle('Window Icon')
path = Path(file).resolve().parent
self.setWindowIcon(QIcon(os.path.join(path, 'web.png')))
def main():
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
Any help would be appreciated.
https://redd.it/1nrfwtu
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
I designed a modern Hospital Dashboard UI with Qt/C++ (Free Source Code for you to learn from!)
https://preview.redd.it/zudfz2648nrf1.png?width=1903&format=png&auto=webp&s=91f529ddd45127cf1c65193ea172ef762fadb04f
Hey everyone,
For anyone who, like me, finds it challenging to create modern and elegant user interfaces in Qt, I wanted to share a project focused purely on that.
This is a clean and stylish dashboard UI for a fictional hospital management system, built with Qt/C++. The main goal was to create a good-looking interface, not a fully functional backend.
I'm sharing the full source code, hoping it can be a useful reference or an inspiration for your own projects.
You can download the source code here: GitHub Link:https://github.com/wwentuma-ship-it/Qt-Gui-Hospital
And here's a quick demo of the UI in action: YouTube Link:http://www.youtube.com/watch?v=qkF8-8vZ6CM
Any feedback on the design itself is very welcome!
https://redd.it/1nrmgvs
@qt_reddit
https://preview.redd.it/zudfz2648nrf1.png?width=1903&format=png&auto=webp&s=91f529ddd45127cf1c65193ea172ef762fadb04f
Hey everyone,
For anyone who, like me, finds it challenging to create modern and elegant user interfaces in Qt, I wanted to share a project focused purely on that.
This is a clean and stylish dashboard UI for a fictional hospital management system, built with Qt/C++. The main goal was to create a good-looking interface, not a fully functional backend.
I'm sharing the full source code, hoping it can be a useful reference or an inspiration for your own projects.
You can download the source code here: GitHub Link:https://github.com/wwentuma-ship-it/Qt-Gui-Hospital
And here's a quick demo of the UI in action: YouTube Link:http://www.youtube.com/watch?v=qkF8-8vZ6CM
Any feedback on the design itself is very welcome!
https://redd.it/1nrmgvs
@qt_reddit
I designed a modern Hospital Dashboard UI with Qt/C++ (Free Source Code for you to learn from!)
https://redd.it/1nrncf0
@qt_reddit
https://redd.it/1nrncf0
@qt_reddit
Parsing only portion of Json
Hello,
I am attempting to implement a relatively efficient json parsing behaviour.
My application is capatble of creating and editing Dungeons & Dragons tiled (hex) levels. When the level is to be saved, I split it into two structs - the FileMetadata and FileData - which get serialized into the Json as two separate children of the 'root' JsonObject. The Data contains the information about the positions of the tiles and such, while the metadata describes general information about the file, like creation date, the name of the map or a path to an icon.
The reason fo this, is that when the application is opened, I list all the recently opened levels by the information in their FileMetadata, so I don't need to load all the heavy data about the particular level yet, and only once the user selects the level, then the FileData gets loaded.
I wonder if my approach is sound in Qt - that is saving both of these JsonObjects (FileData and FileMetadata) into the same file (name_of_save.json), then iterating through all the recent files by only parsing the Metadata, before selecting the particular level and loading the rest of the data. Does Json even allow for this 'partial' processing of the top-level JsonObjects, which I specifically choose, or does it always parse everything at once anyways?
E.g:
QJsonDocument json = QJsonDocument::fromJson(file.readAll())
Does this call load everything anyways, or does it allow me to parse only what I need as:
auto levelName = json.object()"metadata".toObject()"levelName";
auto levelDataArray = json.object()"data".toObject()"tileArray".toArray();
...
// Process each tile in levelDataArray
...
Thank you for any insights!
https://redd.it/1ns6hll
@qt_reddit
Hello,
I am attempting to implement a relatively efficient json parsing behaviour.
My application is capatble of creating and editing Dungeons & Dragons tiled (hex) levels. When the level is to be saved, I split it into two structs - the FileMetadata and FileData - which get serialized into the Json as two separate children of the 'root' JsonObject. The Data contains the information about the positions of the tiles and such, while the metadata describes general information about the file, like creation date, the name of the map or a path to an icon.
The reason fo this, is that when the application is opened, I list all the recently opened levels by the information in their FileMetadata, so I don't need to load all the heavy data about the particular level yet, and only once the user selects the level, then the FileData gets loaded.
I wonder if my approach is sound in Qt - that is saving both of these JsonObjects (FileData and FileMetadata) into the same file (name_of_save.json), then iterating through all the recent files by only parsing the Metadata, before selecting the particular level and loading the rest of the data. Does Json even allow for this 'partial' processing of the top-level JsonObjects, which I specifically choose, or does it always parse everything at once anyways?
E.g:
QJsonDocument json = QJsonDocument::fromJson(file.readAll())
Does this call load everything anyways, or does it allow me to parse only what I need as:
auto levelName = json.object()"metadata".toObject()"levelName";
auto levelDataArray = json.object()"data".toObject()"tileArray".toArray();
...
// Process each tile in levelDataArray
...
Thank you for any insights!
https://redd.it/1ns6hll
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
Population Analysis Plugin
Hi,
I’m looking for a QGIS expert to help me develop a QGIS/Python plugin.
Here’s the core idea:
- I have a CSV file that I currently process using Python (pandas).
- I also have a shapefile layer in QGIS containing population polygons.
- I’d like to build a form-based interface in QGIS that allows me to update population values in the CSV file (individually or in groups).
- Once the CSV is updated, the plugin should automatically rerun my Python code.
- The Python code will then update another column in the CSV file.
- That updated column will be linked to the symbology of the polygon layer, so the map dynamically updates (like a heat map) as values change.
If this sounds like something you can assist with, please send me a DM with your rates. 😁
Thanks!
https://redd.it/1nshkda
@qt_reddit
Hi,
I’m looking for a QGIS expert to help me develop a QGIS/Python plugin.
Here’s the core idea:
- I have a CSV file that I currently process using Python (pandas).
- I also have a shapefile layer in QGIS containing population polygons.
- I’d like to build a form-based interface in QGIS that allows me to update population values in the CSV file (individually or in groups).
- Once the CSV is updated, the plugin should automatically rerun my Python code.
- The Python code will then update another column in the CSV file.
- That updated column will be linked to the symbology of the polygon layer, so the map dynamically updates (like a heat map) as values change.
If this sounds like something you can assist with, please send me a DM with your rates. 😁
Thanks!
https://redd.it/1nshkda
@qt_reddit
Reddit
From the QtFramework community on Reddit
Explore this post and more from the QtFramework community
