| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The initialized = true statement either went missing or it never was
there. This has zero effect on the common usage where the client does
not bother with invalidate(), but rather destroys the
QQuickRenderControl. However, more complex usages, such as in
QQuickWidget do need to invalidate for various reasons, without
destroying the entire QQuickRenderControl.
Pick-to: 6.3 6.2
Change-Id: Iaabc6309cb42cfdd624321863a5504cdeb01275d
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Check for contents of environment variable QML_PLUGIN_PATH
and add them to Qml plugin path. In some cases it would be
preferable to add additional Qml plugin paths without having
to call QQmlEngine::addPluginPath() in the application code.
Qt Android apps have already been doing this with
QT_BUNDLED_LIBS_PATH, but the naming could be a bit misleading
outside bundled Android apps.
The option to provide these additional paths with environment
variables is already commonly used, e.g. for other Qt plugins
and Qml imports.
Change-Id: Id81bb4fc6caa3c9c3adfd73be6ea45be74c5d8c4
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Both TableView and TreeView needs to be able to set and update
required properties. So move this helper function from
QQuickTreeView into QQuickTableView, so that they both can
use it. This will also make it easier to update how we deal
with required properties in TableView/TreeView once
QMetaProperty::isRequired() works.
Task-number: QTBUG-100696
Change-Id: Iff0a86fe46cecdc4db8d307787fe148c7e71bbf6
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Unfortunately when searching online for "dialog qml", the only
doc.qt.io links are for Qt Quick Dialogs and Qt Labs Platform,
which makes it difficult to find the Dialog from Qt Quick Controls.
Link to it from the detailed description to make it clearer.
Change-Id: I8874b9111be5938b4e77e4dbd397f5eace2e5242
Pick-to: 6.2 6.3
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
These were accidentally catching other links.
Pick-to: 6.2 6.3
Change-Id: Ifc2d9eeef8d4629e25c217fc39d9f01ef134538c
Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Moves the QModelIndex value types from QtQml to QtQml.Models as they
cannot otherwise be properly resolved in tooling.
Pick-to: 6.3 6.2
Fixes: QTBUG-100338
Change-Id: I30fc18b388974238ba8353e87ef09f57f8ceabd1
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
|
| |
| |
| |
| |
| |
| |
| |
| | |
Renamed the checkRestricted method in order to make it clear
what the boolean return value means.
Change-Id: I4f25b5a320779cabd53ea6091f42f60634ea3a97
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
We can get rid of the boolean member by reusing the objectDestroyed
function pointer.
Change-Id: Idb9e4d0ddfb04b109126378a6c18799018c74785
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
An investigation of uses of QQmlGuard (+ related classes) yielded the
following results:
- objectDestroyed is the only virtual method of QQmlGuard (besides the
dtor)
- we never have an owning pointer of type QQmlGuard * to one of its
subclasess
=> Therefore, we can replace the use of virtual methods with a function
pointer, which avoids the issue of duplicated vtables.
None of the objectDestroyed actually cares about the object we pass to
them, so we can leave it out in the function pointer. As everything is
private API, we could easily bring it back if the need arises in the
future.
By moving the function pointer into QQmlGuardImpl we also avoid UB in
qqmlengine.cpp, which cast any QQmlGuardImpl pointer to
QQmlGuard<QObject>. This, however, is wrong as QQmlGuard<T> does not
inherit from QQmlGuard<QObject>, even if T inherits from QObject. As we
now can sipmly access the pointer from QQmlGuardImpl, we can side-step
any casting woes alltogether.
Moreover, we use this opportunity to let QQmlStrongJSObjectReference
drectly inherit from QQmlGuardImpl. This requires duplicating some of
the QQmlGuard API, but on the other hand avoids busy-work to hide no
longer desired API.
Unfortunately, we can no longer inherit privately from QQmlGuardImpl, as
otherwise the various subclasses can no longer cast the QQmlGuardImpl we
pass to them to their own type in the objectDestroyed(Impl) methods.
QQmlGuard(Impl) still could benefit from a move ctor/assignment
operator; those will be added in a later commit.
Task-number: QTBUG-45582
Change-Id: I995148a428e541ced5c79b3a61d91c4bb7e03308
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: I801d2489e447309f25883e313cba13050fce20a4
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Documents the InputMethod singleton since it wasn't documented in the
change it was introduced.
Change-Id: I1f5bafcb69dcd65c25c8e30e20aaeeff27ce704b
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Using the dialog implicitFooterWidth in the implicitWidth binding
is causing an infinite loop. But using the implicitFooterHeight for the
implicitHeight binding is not causing any issues what so ever.
Pick-to: 6.3
Task-number: QTBUG-99103
Change-Id: I6ba70bc9871d956e3ccd54662139dd1698d656ae
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
We have to mark the required variables also in block 0. And we shouldn't
generate empty blocks.
Pick-to: 6.3
Fixes: QTBUG-101011
Change-Id: I0dd19f69f45f507cb83e2ddfba3060de48a940b4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Moves all variables that represent the lexers state into a separate struct
that can be read and modified from the outside. This is necessary in order
to enable per-line formatting in qmldom
Change-Id: Iedde139cec6380bd62fa12c5ddec2a943a3b50f9
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
We've accidentally disabled the pragma Strict check when re-designing
the logging system.
Change-Id: I74cf0d4a45742831037ec0bc0615f1f6a15b7023
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
In JavaScript we have a number of extra conversions not covered by
qvariant_cast. Therefore, add a method to perform a QVariant conversion
in JavaScript semantics to QJSEngine, and use that in the compiler.
Pick-to: 6.3
Fixes: QTBUG-100883
Change-Id: I8b0bfa0974bc6b339d2601fb373859bc710788c8
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi>
|
| |
| |
| |
| |
| |
| |
| |
| | |
Amends 97123dbe6755a787e93797f717f8ebf193352b85
Pick-to: 6.3
Change-Id: I0f13df4abff4ba2f0bb066480a157f6cfbefa3c2
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Rather, reject the code and let the engine handle it.
Pick-to: 6.2 6.3
Fixes: QTBUG-100980
Change-Id: Ibcd1249ba3550b40121622752b4ca22d1df3ed2a
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The code we're commenting could again contain block comments. You cannot
nest them.
Pick-to: 6.2 6.3
Fixes: QTBUG-100978
Change-Id: I78685bf29dd30f05e5a3b17abc43ba0b4cb6849e
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
Pick-to: 6.2 6.3
Fixes: QTBUG-100947
Change-Id: If0b05adac91f687daf697f3510e4cf48e7de4537
Reviewed-by: Maximilian Goldstein <max.goldstein@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Previously we only warned about missing property types when the lookup
was not on the current scope but only on an id, parent etc.
This change makes sure we also warn in this case and don't produce false
positives for an unqualified access.
Pick-to: 6.3
Task-number: QTBUG-100839
Change-Id: I732b8420c0c6b96dd8f93cde66a7f9813e704671
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@qt.io>
|
| |
| |
| |
| |
| |
| | |
Pick-to: 6.3 6.2 5.15
Change-Id: I6e107095a7dbd074e076ac6762f18cecf484691f
Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The extensive use of notes in overview documentation should be avoided.
All the notes are concerned with performance considerations, so
let's group them together in one section.
Pick-to: 6.2 6.3
Change-Id: I4854e078e35190726091b2ef6b7a674abda8b3b7
Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
|
| |
| |
| |
| |
| |
| |
| | |
Pick-to: 6.3 6.2
Task-number: QTBUG-65614
Change-Id: I31e2a61e3b2df2432042c8b6028df63cc9cb8d22
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This partially reverts deb238586a "QQuickIcon: Resolve URL relative to
current element." Since we've replaced the owner pointer with QUrl
resolvedSource, we can no longer leverage tagged pointer to save space.
Task-number: QTBUG-95587
Change-Id: I90c38a1d669c0175f1b694a6518997339d2c82b0
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The original attempt, deb238586a "QQuickIcon: Resolve URL relative to
current element," works fine for IconLabel itself, but not for Buttons
containing IconLabel.
// <style>/Button.qml
T.Button {
id: control
icon: // owner: control
contentItem: IconLabel {
icon: control.icon // owner: this, but should be control
}
}
// user code
Button { icon.source: "a.png" }
Since IconLabel is an implementation detail of the Button, IconLabel.icon
owner needs to point to the Button so the user-specified icon.source can
be resolved relative to the user code, not to the <style>/ directory.
This patch fixes the problem by explicitly resolving the source URL on
setIcon() and propagating the resolved icon object to the inner items.
If the relative URL has already been resolved by e.g. Button, the inner
IconLabel never resolves the URL again to itself.
The problem could be addressed by initializing icon owner only once by
Action/Button constructor, but that would lead to dangling owner pointer
as icon object could be copied anywhere. So I've added resolvedSource
data member in place of the owner pointer.
Button { id: dangling }
Button { id: victim; icon: dangling.icon } // owner: dangling
Component.onCompleted: dangling.destroy()
// ... would SEGV (or use after free) if victim.icon.source modified.
Fixes: QTBUG-95587
Pick-to: 6.2 6.3
Change-Id: Ibdd07118e79f1e1f36e1faea0289150eca734e27
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Add a function that lets you expand the tree recursively
from an index in the model, and all the way up to the root.
[ChangeLog][QtQuick] New function "expandToIndex()"
has been added to TreeView.
Change-Id: I063ef698e37f44730438e1638d3b7c1b4edaa0d0
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: I5cec24e231c9dc22d384afa5716a1758f59c0311
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
For PDF we need to pass a document object into QPdfIOHandler, but
QImageIOHandler only takes a QIODevice. A subclass of QFile is one way
to pass that extra object along.
So the plan is that a private PDF document wrapper class can inherit
QFile; and there will be a subclass of QQuickImage called PdfPageImage,
which will override QQuickImage::load() to construct the wrapper, which
will then get sent as QIODevice* into QPdfIOHandler. It will attempt to
cast that to the known private class; if it succeeds, it already will
have the FPDF_Document and will therefore not need to construct one.
Task-number: QTBUG-77506
Task-number: QTBUG-83988
Task-number: QTBUG-96574
Change-Id: I19c90a9f2c7060574720f831b3394de6c3714383
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
The group is not used anymore.
Pick-to: 6.3
Change-Id: Ieebee205f10e5b96ed7cdc1a45b6a7d34d35fa26
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
We only want to resolve the value type of the list at that point. It's
certainly curious that it may not be part of the imports, but we can
just force it to be the one we want.
Change-Id: If390b7ebd870f375c54fa9b7b7110f0b32ca4fcb
Reviewed-by: Maximilian Goldstein <max.goldstein@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Simple deferred properties occur quite often in QML (throughout
Qt Quick, for example), so qmltc should be able to deal with
them as with deferred properties
Ignore generalized group properties, PropertyChanges and similar
types for now. They require more testing and are well out of
scope of the tech preview
Pick-to: 6.3
Task-number: QTBUG-100053
Change-Id: I0f3588789d188cd6bec81de0b61d3205b665a917
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
They're in Qt Quick Controls 2, not Qt Quick Templates 2.
Change-Id: I6199c695eadb5424885a6f0e1a25e584de4178a7
Pick-to: 6.3
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Follows up on qtbase:f5762cd4b3130a650044863c5be132056f05daa5.
Use auto instead of specific QJsonValue*Ref type to avoid need for
orchtestrating with dependency update.
Change-Id: Ib47d5d8ab8373562684b42a90c97634e07869328
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
|
| |
| |
| |
| |
| |
| |
| | |
Task-number: QTBUG-98494
Change-Id: I070aa0005612d98c45923e2a97f175e9972fb849
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When compiling for iOS the linking of qmljs tool fails with:
Undefined symbols for architecture arm64 "_qt_main_wrapper"
Fixes: QTBUG-100855
Pick-to: 6.2 6.3
Change-Id: I25a3ca9fd9d5efd2d6906087f1580b2679e6745f
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
This gives slightly nicer initial UI as a result
Pick-to: 6.3
Change-Id: I112ed029d3735b7c960b7723d2aef0b6fc8e1777
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Whenever we write a register, we create a new type. This way, whenever
we determine that a different type would be a better fit at that place,
we can just change the type in place, without affecting any unrelated
code.
Task-number: QTBUG-100157
Change-Id: I70be2eb83bda5483e083f58113fdfe57224b237e
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The qtbase RHI graphics pipeline recently gained support for Polygon
Mode (Triangle Fill Mode in Metal, Fill Mode in D3D). This patch
extends support to the scenegraph.
Note - glPolygonMode not supported on OpenGL ES
[ChangeLog][QtQuick][QSGMaterialShader] Added support for polygon
rasterization mode to graphics pipeline state.
Change-Id: I6fc05bc4d38446e573687ca651d6d13a76b3e667
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: I3074b563f0cb602e8c72c3aa5b3c21e9f066b57b
Reviewed-by: Qt Submodule Update Bot <qt_submodule_update_bot@qt-project.org>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Introduce a new kind to QQmlJSRegisterContent: "conversion". This is
what we store when we merge multiple types together, or convert a
selection of types into a new one. This way we can record what the
original types were, and later figure out whether we can losslessly
convert them already at the point where we store them.
For now, only merges are implemented.
Change-Id: If4ad0b1f075199e6aa1532959cf9591ba6755709
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: I9ebb9c0946f74a14c551041bd67c65f5e349c0c3
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The generated code currently relies on transitive includes. Avoid
potential issues in the future by including the necessary headers
directly.
Pick-to: 6.3
Change-Id: I6b523d9c2cabef00bf182d139f8a0e8611d6bb9e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: Ib10fc05dead6fcba222b9ef4cabcb92491bbdac3
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
You can only change one register per instruction, and it doesn't have to
be the accumulator. We don't have to store the full register set in
every instruction annotation. It's enough to store the changed register.
This simplifies the logic around choosing the in/out accumulator types.
Now you can rely on the "in" accumulator to always be in the register
set, and the "out" accumulator to be the changed register if applicable.
There will typically be less than 10 registers active at any given
instruction. Therefore, use QFlatMap to store them, rather than QHash.
Also, rename the storage for the type conversions so that we can
actually see what they are.
Change-Id: I694ac2bce7911a4c290c1dccef34d28cde50a1d3
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Linux (at least Gnome) automatically selects the first file when
entering a directory in a file dialog, whereas other platforms do not.
In the auto test, we force the setting to true for simplicity.
Change-Id: Ic733b5133ba03b36693d2f2f2d014a0e9cca8abd
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
For example, it's not possible to customize only ScrollBar and have
ScrollView pick those changes up automatically; you must also implement
ScrollBar.
Task-number: QTBUG-99367
Pick-to: 6.2 6.3
Change-Id: Ie487b0b947fa936e56b5d8e473fbb66287b51c68
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The warning was about the delegate's parent being null in
QTBUG_48044_currentItemNotVisibleAfterTransition.
Pick-to: 6.2 6.3
Change-Id: I54198b26adea137d539f71c8aebc1ba3a18d1e97
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
Pick-to: 6.2 6.3
Task-number: QTBUG-100224
Change-Id: I548e0317f148cdedafd553a3591526c40b9b3a32
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Rename it to _qt_qml_module_follow_foreign_versioning to make it more
clear it's an internal property.
Amends 9cd3191d4eb42dbf7847ffccb178fe5402968464
Pick-to: 6.3
Fixes: QTBUG-100213
Change-Id: I7e6c45800e9e68d5837b906bf349a58330892f86
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|