| Commit message (Collapse) | Author | Age | Files | Lines |
|\
| |
| |
| | |
Change-Id: I3f76bc2b1d401d901d6ac5bc74874b0894bf3df9
|
| |
| |
| |
| |
| | |
Change-Id: Id1eddc70d95b12299678ab08b7de6b4fb9fc0fea
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
setuptools v45 removed support for Python 2, so this will
unlock the current 5.15 CI status.
Change-Id: I87fce4d80ca656412aa5682c07f8b453bac430d1
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: I3edb414046dc46c5f55c6b3a9980644ba2d0235a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This allows to access the doc attribute from Properties
when set:
>>> p = Property(int, doc="some doc")
>>> p.__doc__
some doc
>>> p = Property(int)
>>> p.__doc__
None
Fixes: PYSIDE-135
Change-Id: Idf3e6c6632c775a50cfc8ecf03de3d2dc485f9f4
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When using clear on an item with children,
we rely on the childCount() function so when children
with only a parent and no local reference were inside,
they ended up being removed, altering the behavior of the loop.
Change-Id: I111a600cd2e805eeb7110082437e666f88ff65a5
Fixes: PYSIDE-1251
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Check using the init limits in the QVariant long long conversion
and create an int if possible. This works more smoothly with
Qt and for example ensures that the correct editor is created in
item views.
Change-Id: I0ca2e5e7b91f309deaa81a25e70a5f894f43f841
Fixes: PYSIDE-1250
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Fix indentation, shorten lines where possible.
Fix documentation URL.
Amends 90c1c767095e583d0315e87c0592597020858246.
Change-Id: I9b61cb27c7c336b706b418d4cd1ed1d3b80c7be3
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Provide them as user-added functions using C++ lambdas.
Fixes: PYSIDE-946
Task-number: PYSIDE-1241
Change-Id: I9733bc98b3fc8b3bcf40ab4ce91ffdb84e385b93
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Add a search for flags entries to
translateType(AddedFunction::TypeInfo).
Task-number: PYSIDE-946
Task-number: PYSIDE-1241
Change-Id: I8f0092ad2dd546fdf8678864e49ad2940e7bb8dc
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Change translateType() to pass up the error instead of aborting so
that the error is printed in traverseFunction() along with the name.
The abort in case of failure will then occur in fillAddedFunctions().
Task-number: PYSIDE-946
Task-number: PYSIDE-1241
Change-Id: Iee9ca478b28c8f82d9c4b6c5165f3028bf1e0d08
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Wheel_tester forces installation of "shiboken2_generator".
This is not needed for compile_using_pyinstaller, but building
modules with cmake. This was not clear.
In effect, just the log messages were made a bit more verbose
and a clarifying comment was added.
Change-Id: I7d7d9ce1e9911461d087d685ab5c1cb66c94aa27
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Previously, the polymorphic attribute was set in
AbstractMetaClass::addFunction() depending on hasVirtualDestructor().
This does not work when the destructor is the last function traversed.
Modify setHasVirtualDestructor() to set the hasVirtuals and
polymorphic attributes, too.
Fixes: PYSIDE-1246
Change-Id: If7b32a05110f96b5c4befde5f1d37475c9a5f240
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Regular expressions which can evaluate to an empty string
result in a warning in Python 3.6 if you try to re.split() on
that pattern.
The generated pattern for the signature parser was enhanced
to avoid the unintended empty pattern.
This change was not very large, actually only a single bit
(but the right one). :-)
>>> bin(ord("*"))
'0b101010'
>>> bin(ord("+"))
'0b101011'
Change-Id: I15ba6ef6f108c51afba59b4004261bede26c4a74
Fixes: PYSIDE-1247
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Amends 5d34d60418b15d4d6837d0a1333f2b57631309eb,
d579912b31d7cfa7b0b216916fbbf3eb632a9d9d.
Task-number: PYSIDE-571
Change-Id: I214d7bf1770667eaa9abaea0f96b5e507b4c32f7
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
| |
| |
| |
| |
| | |
Change-Id: I06edd224896ef82fe20480469a67e34b49045333
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|/
|
|
|
|
|
|
|
|
|
| |
Amends 5d34d60418b15d4d6837d0a1333f2b57631309eb,
d579912b31d7cfa7b0b216916fbbf3eb632a9d9d.
Task-number: PYSIDE-571
Change-Id: I214d7bf1770667eaa9abaea0f96b5e507b4c32f7
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit cf059117c3926081bee79d9223017147613649a4)
Reviewed-by: Simo Fält <simo.falt@qt.io>
|
|
|
|
|
| |
Change-Id: I74212eeaf28285beb3a6bb1ea34b80129d4725e7
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This process introduced many unnecessary calls to
the Py_BEGIN/END_ALLOW_THREAD macro to PySide,
which had a negative impact on the overall behavior
when studying the responsiveness of UIs with threads.
Some tests were adapted to include the new allow-thread
behavior.
[ChangeLog][shiboken] The default of the "allow-thread" attribute
has been changed to false as it was observed to cause performance
issues when using threads.
Task-number: PYSIDE-803
Change-Id: I2cd67c86340f7bf7a2c5694869d17fe2027a0abb
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Tismer <tismer@stackless.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This adds and remove the usage of:
allow-thread="yes"
in some typesystem entries.
This also adapt the usage of the Py_BEGIN/END_ALLOW_THREAD
macro inside the snippets used by other typesystem entries.
The main reason is that in some cases not the whole snippet
requires to be inside such state, but only when calling the
C++ equivalent function.
Task-number: PYSIDE-803
Change-Id: Ifa9c8cee2713c453e4d5c624aaa862e75559180c
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
| |
Amends d1604053e9ae354963a2b2447b3d196fc5dda73e.
Task-number: PYSIDE-1240
Change-Id: I27882de3077fcd11fc98b10b8ddbd469990b77c4
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
After massive GIL savings in the generated code, there still
exists a place where a lot of repeated GIL acquirements are
done. It was observed that up to 24 consecutive calls to
retrieveMetaObject(self) were made, all with the same value
for 'self'.
The code in question was:
(1) Shiboken::GilState gil;
(2) MetaObjectBuilder *builder = metaBuilderFromDict( \
reinterpret_cast<SbkObject *>(self)->ob_dict);
(3) if (!builder)
(4) builder = &(retrieveTypeUserData(self)->mo);
(5)
(6) return builder->update();
An exact analysis of the code showed that the GIL usage (1) could
be moved out of the function into a deeper function that does
updates in a branch (6).
Function retrieveTypeUserData does not involve the Python
interpreter at all (4).
It took some time until it was proven that access to some
special Python dictionary cannot reach the Python interpreter
and therefore does not need the GIL as well (2).
This replaces the abandoned effort to write a "Lazy GIL".
It worked great for the example program, but had problems
with some never finishing tests.
After all, this solution is much simpler and works perfectly
well. More effort seems not to be necessary to handle the GIL.
Task-number: PYSIDE-803
Change-Id: I439009ff933fc6f498beb0c7f1523b6f985afda8
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The class will replace timeout parameters in Qt 5.15 as
introduced by qtbase/72f57cc84244633ca69ede9a1fd510b9b1881c1d,
causing warnings like:
Stripping argument #1 of bool QThread::wait(QDeadlineTimer) due to unmatched type "QDeadlineTimer" with default expression "QDeadlineTimer(QDeadlineTimer::Forever)".
Stripping argument #2 of bool QWaitCondition::wait(QMutex*,QDeadlineTimer) due to unmatched type "QDeadlineTimer" with default expression "QDeadlineTimer(QDeadlineTimer::Forever)".
Stripping argument #2 of bool QWaitCondition::wait(QReadWriteLock*,QDeadlineTimer) due to unmatched type "QDeadlineTimer" with default expression "QDeadlineTimer(QDeadlineTimer::Forever)".
Change-Id: I51655ef19d8276b95c2a759d5ba44287a4b6d91b
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
| |
Make the previously existing debug output an option
and output typesystem XML by default.
Change-Id: I3d95bdb56446097377880e1ca0b54d3b8b93ea24
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
| |
Change-Id: I275e776248bd55c3c38f5fedd83088bf475a1cf9
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Including a check for Python EnumMeta types to not consider them
as a normal PySequence allows the decision to use the default
PyObject wrapper case.
Using the 'object' type is currently the workaround,
so this allow the users to use the Enum class instead of declaring
the signal with 'object'.
class A(Enum):
a = 1
b = 1
# Workaround
# signal = Signal(object)
# With this patch
signal = Signal(A)
A test case was added.
Fixes: PYSIDE-239
Change-Id: Ib593dba5a988eceb8b1bfae097768e9ec02be6d5
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
| |
As of Python 3.8, Python is no longer is able to run stand-alone
in a virtualenv due to missing libraries. Add the path to the
modules instead.
Task-number: PYSIDE-1236
Change-Id: I4ef1f02925d11900d35cc4e5fcc9f50a5e123c2f
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
|
|
|
|
| |
Scan the commit messages for entries like
[ChangeLog][shiboken2] description...
and prepend them to the task list.
Change-Id: I4cc8599eefb18c0b2c1892b8f23682b15815d1ec
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
| |
sources/shiboken2/generator/shiboken2/cppgenerator.cpp:1480:95: warning: 'QStringList QString::split(const QString&, QString::SplitBehavior, Qt::CaseSensitivity) const' is deprecated: Use Qt::SplitBehavior variant instead [-Wdeprecated-declarations]
sources/shiboken2/generator/shiboken2/cppgenerator.cpp:1483:96: warning: 'QStringList QString::split(const QString&, QString::SplitBehavior, Qt::CaseSensitivity) const' is deprecated: Use Qt::SplitBehavior variant instead [-Wdeprecated-declarations]
sources/shiboken2/generator/shiboken2/cppgenerator.cpp:1931:95: warning: 'QStringList QString::split(const QString&, QString::SplitBehavior, Qt::CaseSensitivity) const' is deprecated: Use Qt::SplitBehavior variant instead [-Wdeprecated-declarations]
sources/shiboken2/generator/shiboken2/cppgenerator.cpp:5774:110: warning: 'QStringList QString::split(const QString&, QString::SplitBehavior, Qt::CaseSensitivity) const' is deprecated: Use Qt::SplitBehavior variant instead [-Wdeprecated-declarations]
sources/shiboken2/generator/main.cpp:373:67: warning: 'QStringList QString::split(QChar, QString::SplitBehavior, Qt::CaseSensitivity) const' is deprecated: Use Qt::SplitBehavior variant instead [-Wdeprecated-declarations]
sources/shiboken2/generator/shiboken2/shibokengenerator.cpp:99:88: warning: 'QStringList QString::split(const QString&, QString::SplitBehavior, Qt::CaseSensitivity) const' is deprecated: Use Qt::SplitBehavior variant instead [-Wdeprecated-declarations]
Change-Id: Iadddcc74679a71ebf803b6a2942d9a50dbeeb05e
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
| |
Task-number: PYSIDE-803
Change-Id: I0ba80cea5804e1b83cc55ee32163ca9d021ccd26
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In order to get better performance, we try to avoid allocating the
GIL when methods have no override with a Python function.
Every class gets an associated bool array that records functions
where no override was found. On second call of a function,
the GIL is avoided by this flag.
Update 2020-02-06:
The result is very promising when combined with a drastic
reduction of Py_(BEGIN|END)_ALLOW_THREAD macro calls.
So this could become the solution when combined with a good
reduction!
The Python 2 bug was circumvented by not generating the
additional Py_tp_setattro functions for class QQuickItem.
Task-number: PYSIDE-803
Change-Id: I0fe36edc5610b2d51bbb05f1b7507beee5088c83
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On Windows, DLL directories can no longer be specified
via the PATH environment variable. They need to be added
via os.add_dll_directory().
In order to fix this, move the entire environment setup
from CMake to a python helper and set the environment
variables BUILD_DIR and QT_DIR pointing to the build
directory and Qt directory, respectively, from CMake.
In addition, this has a huge advantage: The tests can
also be executed much more easily without ctest from the
command line by just setting BUILD_DIR and QT_DIR instead
of a complex manipulation of PATH/LD_LIBRARY_PATH.
Change-Id: I7d518ccab19ca184c3112a126c779d4a6d7c6c5e
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Tismer <tismer@stackless.com>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
| |
Updated to the new simple builtin variable.
Change-Id: I918ce7bc9aea6451439a8306d5bbd325c04e8136
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
| |
Put everything into a single file and mark them as copies.
Change-Id: I782247520d6976695a14f762e8247e5c4eb46aac
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
| |
Change-Id: I25bcb0da55860da08644872467dbc5e80a71633c
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
| |
Change-Id: I1d814b72359e188ba8263b0cb583ccb43af5e4b4
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
| |
Task-number: PYSIDE-1112
Change-Id: Ice3e8efb7b75bd14ee73c20310f722c4e0b07b3b
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
| |
This is useful for mimicking the COIN test environment.
Change-Id: I9a4567be171d940d6574c4135fabb2a8721bbd79
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
|
| |
Amends d579912b31d7cfa7b0b216916fbbf3eb632a9d9d.
Task-number: PYSIDE-571
Change-Id: Ide49ef2c9f99335b5019daea7d27cd1d86e896a4
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
| |
Change-Id: I682fb765fc3f69f0ca3c4d6717d415d0bff0517e
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Introduce a flag to distinguish timeouts from successful loading.
Register the scheme properly and set "Path" syntax, fixing the warning:
Please register the custom scheme 'testpy' via QWebEngineUrlScheme::registerScheme() before installing the custom scheme handler.
Add required initializations of QWebEngine and embed
the view into a top level widget, as using a QWebEngineView as a top
level on Windows hangs.
Change-Id: Id39a6b14606795216994928ad82f60435f4caaca
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
After a long odyssey of more or less unpythonic compromizes,
the qApp "macro" would finally be moved into a normal
variable without surprizes.
This was only possible since we removed qApp from QtWidgets
and other modules. Otherwise,
from PySide2.QtWidgets import *
would pull qApp, being the constant "None", into main and
shadow the true qApp variable in the builtins.
By inserting qApp into the builtins, only, we make sure that
this variable is always freshly looked up, without making it
change its contents.
DONE...
+ change the singleton code to normal
+ rename to MakeQAppWrapper
+ simplify the implementation
+ fix new bug concerning duplicate applications
+ check very much for refcounting bugs
+ review the rest of the implementation and further simplify
Note... The Q*Application variable will not be turned back into
a GC variable. This is not worth the effort.
Fixes: PYSIDE-571
Change-Id: Idbd158c083318e6b0dfe48d62485c68c90e944de
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
|
|
|
| |
The classes of the helper module were defined in the __init__.py
file with complicated logic to test for presence of the modules.
Split the classes apart and empty the __init__.py file (still
required for Python2).
Change-Id: I4f4971f9a48e2961233da5585aa0df53bfbb9c7a
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
I happened to try out the "cling" C++ interpreter. That forced
me to install XCode. I did not run XCode because cling worked
immediately.
But then, building PySide always failed with an error in qtinfo.
This is a rare trap into which I fall every other year, so here is a
fix that returns the intended error message.
Change-Id: I9ec5774c49b8a186d6b4247150dac6b252e7cc64
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Windows inserts extra newlines into the error log when certain
errors occur like
"Exit code 0xc0000409\n***Exception:"
and that newline caused the parser match to fail.
Note that this is the normal stdout. CMake does not use stderr.
It makes no sense to fix the pipe structure of the script.
Instead, the only fix needed was recognition of line breaks
in the error log. You can see this also in the failure listing
The following tests FAILED:
1 - pysidetest_constructor_properties_test (Exit code 0xc0000409
)
The following improvements were done:
- add an extra pass that checks for broken lines in the error log
- add ad extra plausibility check or consecutive test numbers
- improve the output, program structure and add some documentation
When there should still an unforeseen bug occurs, it will be recognized
by the plausi-check and the test repetitions are immediately cancelled.
We could also fix the output not to contain the line breaks, but
that breaks the principle of keeping the original output and needs
discussion by the developers.
Fixes: PYSIDE-1229
Change-Id: Ib71f3361e78eb59f3469da172c74c719e9f08706
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
|
|
|
| |
Add the relative import path to locate the modules "helper"
and "py3kcompat". The tests can then be launched from the
command line without the ctest environment.
Change-Id: Ia50663d7381b52cb248de3e4d23002a195ca9139
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
| |
Available as of version v0.96.74, it speeds up things considerably.
Change-Id: I5d8312b2d59adcce0881d3485af966bebf69317b
Reviewed-by: Christian Tismer <tismer@stackless.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
There are two funny glitches that happen with Python 2.7, only.
One was the smartpointer test which only failed because
Python 2.7 has no list.clear method.
This test could be simplified since the tested object is a true list.
The other one appeared after the introduction of the BUILD_DIR
variable. Python 2.7 failed the enum_test.py because it now
needs an import of shiboken2 to do initialization of the signature
module. That is a timing problem that we did not have before
we had BUILD_DIR.
It makes me curious why this bug could slip through the COIN tests!
Change-Id: I9b509e9998ad9f40431a8b148892429c0e865393
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
|
|
|
|
|
|
| |
Run the test redirected into a log file with time stamp.
Change-Id: Id9a5047e0b6594760d0329f9a15450c688a585f8
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
|
|
|
|
|
|
|
|
| |
Extract an API to start the timer of ReportHandler without
actually installing the message handler and use that from testutil.
Change-Id: I28166b9f9b8d5b0f00cda38389a1009416dac933
Reviewed-by: Christian Tismer <tismer@stackless.com>
|