summaryrefslogtreecommitdiffstats
path: root/src/corelib
Commit message (Collapse)AuthorAgeFilesLines
* Protect all accesses to the global engine cache by a mutexLars Knoll2018-04-251-34/+32
| | | | | | | | | | Otherwise, we'll end up with corrupted memory when using QRegExp from multiple threads. Amends bbdc1b5ccbb19405f997cd67ec53b2c4860105f7. Change-Id: I9d35897629d0bc26503aa0c537c5f99013921fdd Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Support std::unique_ptr and others in Q_DECLARE_PRIVATEJüri Valdmann2018-04-251-2/+2
| | | | | | | | | | Use ptr.operator->() instead of ptr.data() for getting the raw pointer. [ChangeLog][QtCore][QtGlobal] Q_DECLARE_PRIVATE can now be used with std::unique_ptr and other smart pointer types. Change-Id: I7f3f698d7bac477f2185837681e366057d292588 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix include style in qreadwritelock_p.hJoerg Bornemann2018-04-251-1/+1
| | | | | | | ...to make that file bootstrap-compatible. Change-Id: Ic7c3b64cb27f3fd81f0140b6ee899310fa04f4c7 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-246-22/+45
|\ | | | | | | Change-Id: If950406391f79d99f0101f0b6755395accb26f34
| * doc: Make both qEnvironmentVariable() functions visible in the docsMartin Smith2018-04-231-7/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There had been a fake declaration for qEnvironmentVariable() in qglobal.h thaqt was only visible to QDoc. It was removed in favor of documenting both the actual declarations of qEnvironmentVariable(), one with a 2nd parameter for passing a defualt value and one without that parameter. But the one without the default value parameter was marked internal, so it didn't appear in the docs. When both functions were documented with a shared comment, a bug in QDoc was revealed, because these functions are global, while the shared comment functionality had only been implemented for class member functions. Now the shared comment functionality has been implemented for global functions, so these two functions are now documented with a shared comment. We can, of course, reintroduce the #ifdef QCLANG_QDOC trick, if that is pre3ferred. Change-Id: I41d85def5daa3215a995d7697d064dfae37e8b2a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
| * Doc: Mark local functions in qlogging.cpp as internalKai Koehne2018-04-231-0/+3
| | | | | | | | | | | | | | This fixes qdoc warnings introduced by 67d5f79fe6f86726eff. Change-Id: I4b199e6243d9a7706befe4bc9549c78c11026d9e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Doc: Advocate use of std::initializer_list constructor in Q[String]ListKai Koehne2018-04-234-15/+37
| | | | | | | | | | | | | | | | | | We're relying on C++11 since a while, so lets not advertise creating lists of strings with operator<<() anymore. Change-Id: I14a3442ff852ac2c106d90c63504eb9ebb737609 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io> Reviewed-by: hjk <hjk@qt.io>
* | Make it easier to use resources in plugins when using static linkingSimon Hausmann2018-04-231-1/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | RCC generates code that registers resources automatically on program startup via global constructors. When linking statically and nothing references the symbols in the .o file compiled from the RCC generated code, then the linker will discard the embedded resources and they will not get initialized. That is why for static linking it is necessary to explicitly initialize resources using the Q_INIT_RESOURCE macro. We can avoid the need for the explicit initialization in the context of plugins that are statically linked into the application. resources.prf can generate a .cpp file with a helper function that contains all the Q_INIT_RESOURCE calls for all resources in the plugin. That helper function in turn is injected into the plugin entry point, which in turn is guaranteed to be included in the final binary. Change-Id: If1abf9c85ef92935020af073b989c58c1ae6ca63 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
* | iOS: Document why we're using a runloop mode tracker in our event dispatcherTor Arne Vestbø2018-04-231-0/+18
| | | | | | | | | | Change-Id: I71093ca05988c3e1ad6d51be7363952dd3f0518e Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
* | Speed up QTimeZone::isTimeZoneIdAvailable by a factor 43David Faure2018-04-234-2/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Creating and sorting a list of bytearrays just to check if one entry is present, is really overkill. By adding a new virtual method isTimeZoneIdAvailable() in the backend classes, we can do this much more efficiently. Implemented for Utc and Tz backends, the others fall back to the slow way. The new benchmark shows, in release mode: Before: 43 msecs per iteration (total: 86, iterations: 2) After: 1.1 msecs per iteration (total: 73, iterations: 64) Change-Id: Ic0d79a41d74e2ce6aa088fa7986c41d33902c36b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-221-22/+27
|\| | | | | | | Change-Id: Id32f0ae002772444c0b61cd132ef81f96fe3b895
| * QByteArray: Use nullptr for "Safe and portable C string functions"Andre Hartmann2018-04-211-22/+23
| | | | | | | | | | | | | | | | Change the documentation to use nullptr and modify the related code also while at it. Change-Id: I6264a254828159cda54e90393835ea04e131350b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
| * QByteArray: Add a note regarding overlapping pointers to qstr(n)cpyAndre Hartmann2018-04-211-0/+4
| | | | | | | | | | | | | | Stated e.g. in http://en.cppreference.com/w/c/string/byte/strcpy Change-Id: I42fd5a5fa6a63b67a7105aa56e93e3d3f2193cf7 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | Detect C standard and try using the most recent one (take 2)Allan Sandfeld Jensen2018-04-211-1/+1
| | | | | | | | | | | | | | Fixes the default C version used with gcc < 5 Change-Id: I948dece961caed8e6b181e1c6e6b9dc43c46583e Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-202-7/+7
|\| | | | | | | Change-Id: I0bea38585382b5d9c8d7a013bf6bcb3a6008d159
| * Doc: link to QEnableSharedFromThis from QSharedPointer docsMitch Curtis2018-04-181-1/+1
| | | | | | | | | | Change-Id: I1c4a168c0581b6273b99a7ea8faa29114bda39e2 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
| * Fix runtime platform detection on Apple platformsTor Arne Vestbø2018-04-181-6/+6
| | | | | | | | | | | | | | | | | | The watchOS and tvOS platforms also define __IPHONE_OS_VERSION_MIN_REQUIRED for compatibility, so we need account for that in the ordering of the ifdefs. Task-number: QTBUG-67534 Change-Id: Id86e684137550533470370ef29c3563d677d5865 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
* | Prefer the raw data, if it specifies a locale, before shedding tagsEdward Welbourne2018-04-191-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | QLocaleData::findLocaleData() was checking its given data with likely tags filled in, but not checking it without; then it went on to blot out some of the given data with Any, checking first with likely tags then without. The lack of this second step with the full data seemed misguided. Change-Id: I58ee09f5a2a3355446333fc9985a2fb818491e2f Reviewed-by: Jason Erb (Suitable Technologies) <erb@suitabletech.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | Unicode TR 35: add likely subtags in the specified orderEdward Welbourne2018-04-191-8/+16
| | | | | | | | | | | | | | | | | | | | The Likely Subtags section (4.3) of Unicode TR 35 stipulates a quite specific order for trying the various candidate lookups; we had two of them swapped and were missing the last. Change-Id: Idcd8e7f7c9849be3ee805245e7746435e992c1db Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | QObject: Extend debug output of connectLars Schmertmann2018-04-181-1/+6
| | | | | | | | | | | | | | | | | | | | Sometimes it is hard to find the line, when the warning "QObject::connect: invalid null parameter" appears in the log. This change adds the class names of the sender and receiver to give a hint where to search for the wrong call to connect. Change-Id: I00cead7d943f96d60f198cb3f0bed34ba10285c5 Reviewed-by: André Hartmann <aha_1980@gmx.de>
* | WinRT: Add Windows UI Automation supportAndre de la Rocha2018-04-172-0/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | Adds support to accessibility tools and programmatic UI control to the WinRT platform through Windows UI Automation, using the AutomationPeer API. [ChangeLog][winrt][feature] Added support to Windows UI Automation to the WinRT QPA, allowing Qt-based UWP applications to operate with accessibility and programmatic UI control tools. Change-Id: If0a8edbebc7c16c4896d749f2d7e11809b4b37b3 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-152-15/+11
|\| | | | | | | Change-Id: I8c353b4c53e90434453c76691eac39a894d23b49
| * Improve performance of QResource::load()Lars Knoll2018-04-131-12/+8
| | | | | | | | | | | | | | | | | | | | | | Avoid creating a QDateTime in the resource that will almost never get used. Constructing the date time is expensive as we convert the time stamp to local time. Task-number: QTBUG-65713 Change-Id: I3638e108a8fbd237cd93e98aa2adc0ca2127822c Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Tuukka Turunen <tuukka.turunen@qt.io>
| * QWindowsPipeReader: fix waiting on inactive pipeAlex Trotsenko2018-04-121-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To read data from a named pipe, QWindowsPipeReader uses the ReadFileEx() function which runs asynchronously. When reading is completed and the thread is in an alertable wait state, the notified() callback is called by the system, reporting a completion status of that operation. Then the callback queues a readyRead signal and starts a new sequence. The latter is skipped if the pipe is broken or the read buffer is full. Thus, if an application does not run the event loop, the next call to QWindowsPipeReader::waitForReadyRead() should emit the queued signal and report true to the caller even if no new read operation was started. Change-Id: I37102dbb1c00191d93365bfc2e94e743d9f3962a Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devLars Knoll2018-04-121-1/+1
|\| | | | | | | Change-Id: I9f802cb9b4d9ccba77ca39428a5cb1afd2d01642
| * Doc: Fix typo in The Property System sectionKai Koehne2018-04-121-1/+1
| | | | | | | | | | Change-Id: Ie31c56369baf26f5592c95dacea60ae58fdbccfe Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devLiang Qi2018-04-111-7/+7
|\| | | | | | | | | | | | | Conflicts: src/plugins/platforms/ios/quiview.mm Change-Id: I0fd0adeca1590fffddd577873172f6d987a60412
| * Fix integer overflow (1 << (' ' - 1))Mikhail Svetkin2018-04-101-7/+7
| | | | | | | | | | | | | | | | | | On platforms where integer by default is int32(max is 2147483647) and (1 << (' ' - 1)) will be 2147483648 Change-Id: I790d33bd4e473925d6897dd87cbffdfe8dd7938f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* | QCryptographicHash: Add a static method to retrieve hash lengthMårten Nordheim2018-04-102-0/+41
| | | | | | | | | | | | | | | | | | | | | | | | It's useful when you need to check how long a hash will be without first generating one. [ChangeLog][QtCore][QCryptographicHash] Add a static method, hashLength, which returns the length of the output of a hash function in bytes. Change-Id: Id6a454016523de83d157fd95c50105c6db4bb1d9 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-102-46/+55
|\| | | | | | | Change-Id: I0120f804522c0c652e9537b6e9fe08189f071ed2
| * Doc: Update QVariant::toString description, update see also linksPaul Wicking2018-04-091-43/+48
| | | | | | | | | | | | | | | | | | | | Change the toString description to reflect that the listed types are not exclusive, and update see also link to link to the canConvert method that includes conversion table. Task-number: QTBUG-67174 Change-Id: I3ad2889c98a235995b94a2d0496a6fb8c024b7bb Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
| * QSemaphore: Fix 64-bit Linux QSemaphores initialized to non-zeroThiago Macieira2018-04-061-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The original design for the 64-bit futex had the token count replicated in the high part. But the constructor wasn't setting it. This is one of the issues I had noticed when investigating QTBUG-66875, but didn't need to address since the the fix I ended up applying in commit 081c001deb75fa38385d3ff8cbbdb4f788529133 made that unnecessary: the high part only had the number of waiters. Unfortunately, when commit f502270c0f06daba75c1da381bd1658d81aa7bba brought back the token count in the high part, I failed to correct that problem. As a consequence, every QSemaphore that was initialized in the constructor to a non-zero value would eventually deadlock. This commit fixes that oversight. Task-number: QTBUG-67481 Change-Id: I662b8f168c74440ab1a8fffd1522be6b85adb4d0 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Svenn-Arne Dragly <svenn-arne.dragly@qt.io>
* | Declare the operator| in the Qt namespace for QFlags in that namespacesOlivier Goffart2018-04-081-23/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a long overdue change so we don't break ADL of operator|. I think will not break source or binary compatibility. The problem is code like this: namespace Foo { struct MyStruct; MyStruct operator|(MyStruct, MyStruct); void someFunction() { fooLabel->setAlignement(Qt::AlignLeft | Qt::AlignTop) } } This would be an error before as ADL would find only the Foo::operator| and not the global one since the arguments are not in the global namespace. After this change, ADL works fine and this code compiles This bites people with misterious error, see questions on https://stackoverflow.com/questions/10755058/qflags-enum-type-conversion-fails-all-of-a-sudden https://stackoverflow.com/questions/39919142/broken-bitwise-or-operator-in-a-qt-project [ChangeLog][QtCore] QFlags's operator| for enum types in the Qt namespace are now declared in the Qt namespace itself. Change-Id: I021bce11ec1521b4d8795a2cf3084a0be1960804 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | QVariant: Avoid a memory allocation with custom typesOlivier Goffart2018-04-081-3/+10
| | | | | | | | | | | | | | | | | | | | Store big or un-movable custom type within the same memory region as the QVariant::PrivateShared. Makes tst_qvariant::bigClassVariantCreation 33% faster Change-Id: I60a757d1f0a9a02cf9ac36fb53a72426b2f8cfa8 Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-071-0/+2
|\| | | | | | | Change-Id: Idf2bef470663864069bbf7e41af07b534936863a
| * QMimeDatabase: fix assert when fetching data for invalid mimetypeDavid Faure2018-04-061-0/+2
| | | | | | | | | | | | | | | | | | The Q_ASSERT(mimePrivate.fromCache) at qmimedatabase.cpp:218 which I added in commit 7a5644d648, was being triggered when calling comment() for invalid mimetypes such as db.mimeTypeForName(""). Change-Id: I8037041a4b435d2a5ba24ec94b7858e38b2f0bf2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-04-061-2/+2
|\| | | | | | | Change-Id: Ic811cd444e523b904211797112bba6aaec85dddd
| * Doc: Add missing punctuation in qCritical, qFatal documentationKai Koehne2018-04-051-2/+2
| | | | | | | | | | Change-Id: If4175502f81e569f031d97da6cc7f5d46428442a Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-03-312-16/+23
|\| | | | | | | Change-Id: I33b47095efdfe0ba698c6a88ca41ec911f432208
| * doc: Improve QByteArray::fromRawData snippetSamuel Gaist2018-03-291-3/+3
| | | | | | | | | | | | | | | | | | The current snippet uses integer literals that will trigger the Wnarrowing warning with recent version of gcc. This patch replaces them with character literals to fix this warning. Change-Id: Iffad495f24cc9d4c1674a7fe3f6b45c46a625ff8 Reviewed-by: Sze Howe Koh <szehowe.koh@gmail.com>
| * QSemaphore: attempt to fix again the 64-bit Linux semaphoreThiago Macieira2018-03-291-13/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This time, the issue was that we could race a wait and a wake. A multi- token waiter would not notice that the number of tokens changed because it only performed a fetch-and-OR, then waited on the high part which did not change. That means the futex_wait() would succeed, when we wanted it to have failed. So we have to bring back a portion of what commit 081c001deb75fa38385d3ff8cbbdb4f788529133 removed: we need to keep both the token count and the waiter count in the high word. Task-number: QTBUG-67214 Change-Id: I04a43ee94975482f9e32fffd151e467a9e0030b3 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | Add wildcard-to-regexp support to QRegularExpressionSamuel Gaist2018-03-304-1/+192
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This method will make QRegularExpression on par with QRegExp and will allow to replace this class when a wildcard expression can be set through an API (e.g. QSortFilterProxyModel::setFilterWildcard). For other use cases, see QTBUG-34052. [ChangeLog][QRegularExpression] Implemented support for wildcard patterns. Warning: QRegularExpression might not give the exact same result as QRegExp as its implementation follows strictly the glob patterns definition for the wildcard expressions. Change-Id: I5ed4617ca679159430c3d46da3449f6b3100e366 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-03-302-5/+7
|\| | | | | | | Change-Id: If9cc79a7cc098104333821bc3b345f6890f01825
| * QFutureWatcher: Refer to convenience method resultAt in documentationKari Oikarinen2018-03-281-1/+1
| | | | | | | | | | | | | | | | | | The future does not actually have a result() member function that takes an int. The correct function is resultAt(). But that is also available directly in the QFutureWatcher, so refer to that instead of advising to get to the future. Change-Id: I53d267b4b48b1171bf611e11130b9dacabc059a4 Reviewed-by: Martin Smith <martin.smith@qt.io>
| * Fix MSVC2017 compilation with enabled relaxed constexpr on 32-bit targetOlivier Goffart2018-03-281-4/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The problem is that qCountLeadingZeroBits is calling qPopulationCount which is only conditionally constexpr, so qCountLeadingZeroBits can only be marked constexpr if qPopulationCount is also. On MSVC2017 64bit this is not a problem because it uses builtins function in this case. (which is not constexpr, but it works because the compiler is not forced to diagnose the problem because of the "?:" operator. The error being fixed is: qalgorithms.h(847): error C3615: constexpr function 'qCountLeadingZeroBits' cannot result in a constant expression qalgorithms.h(858): note: failure was caused by call of undefined function or one not declared 'constexpr' qalgorithms.h(858): note: see usage of 'qPopulationCount' Task-number: QTBUG-67259 Change-Id: I65a3dfae12ca49394bec14ffefdd41a07fee1c32 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | Merge remote-tracking branch 'origin/5.11' into devLiang Qi2018-03-2827-188/+181
|\| | | | | | | | | | | | | | | | | Conflicts: src/plugins/platforms/cocoa/qnsview.mm src/plugins/platforms/cocoa/qnsview_mouse.mm src/testlib/testlib.pro Change-Id: Ia0ce4243418fe6a485b0f290c67bd433b3b04ff2
| * Animation: Fix case where QEasingCurve::valueForProgress returns nanSvenn-Arne Dragly2018-03-261-21/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, we would divide by zero in BezierEase::findTForX if factorT3 was zero when solving the cubic equation. This change fixes the problem by adding solutions for the special cases where the cubic equation can be reduced to a quadratic or linear equation. This change also adds tests that cover cases where the equation becomes quadratic, linear or invalid. Task-number: QTBUG-67061 Change-Id: I2b59f7e0392eb807663c3c8927509fd8b226ebc7 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
| * Revert "Detect C standard and try using the most recent"Friedemann Kleint2018-03-261-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The change causes a crash when compiling the xkbcommon 3rdparty library and compile failures (qtimageformats on Android). This reverts commit a47cb146809e32f43449dcfe9932833c2f0ab987. Task-number: QTBUG-67326 Task-number: QTBUG-67327 Change-Id: I5ddc4eccad699e3eaec535fd6a63d11b0026b42e Reviewed-by: Sami Nurmenniemi <sami.nurmenniemi@qt.io> Reviewed-by: Liang Qi <liang.qi@qt.io> Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
| * fixup oversight in rvalue overloads of operator+=() and operator<<()Eric Lemanissier2018-03-262-4/+4
| | | | | | | | | | | | | | ammends 4dee5446bee9c7417bf6f5dc44294a0b7238a9ba Change-Id: Ia0ca27644eb71815a93d6e76681b8a9e61a4e7ab Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
| * Remove CMake code for CMake < 3.1Kevin Funk2018-03-243-79/+5
| | | | | | | | | | | | | | | | | | This removes the following functions from Qt5CoreMacros: - qt5_use_modules(...) Task-number: QTBUG-63519 Change-Id: I59769060a3a93686bf319b558c0ede55755fdb70 Reviewed-by: David Faure <david.faure@kdab.com>