From c319214f919e3345f673391253f92c6bc0e2a285 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 19 May 2011 13:47:37 +0200 Subject: Fix in-process drag-n-drop of image data, image/* was not available. If we give the exact initial QMimeData to the dropEvent, we only get application/x-qt-image as available mimeType. We need to go through QDropData to call xdndObtainData, which can still do some in-process optimization, but there we can do the "saving QImage to the requested format" conversion. Task-number: QTBUG-4110 Merge-request: 860 Reviewed-by: Denis Dzyubenko --- src/gui/kernel/qdnd_x11.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/gui/kernel/qdnd_x11.cpp b/src/gui/kernel/qdnd_x11.cpp index 1c59d41..ecb9a70 100644 --- a/src/gui/kernel/qdnd_x11.cpp +++ b/src/gui/kernel/qdnd_x11.cpp @@ -1166,12 +1166,20 @@ void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive) // some XEMBEDding, so try to find the real QMimeData used // based on the timestamp for this drop. QMimeData *dropData = 0; - int at = findXdndDropTransactionByTime(qt_xdnd_target_current_time); - if (at != -1) + const int at = findXdndDropTransactionByTime(qt_xdnd_target_current_time); + if (at != -1) { dropData = QDragManager::dragPrivate(X11->dndDropTransactions.at(at).object)->data; + // Can't use the source QMimeData if we need the image conversion code from xdndObtainData + if (dropData && dropData->hasImage()) + dropData = 0; + } // if we can't find it, then use the data in the drag manager - if (!dropData) - dropData = (manager->object) ? manager->dragPrivate()->data : manager->dropData; + if (!dropData) { + if (manager->object && !manager->dragPrivate()->data->hasImage()) + dropData = manager->dragPrivate()->data; + else + dropData = manager->dropData; + } // Drop coming from another app? Update keyboard modifiers. if (!qt_xdnd_dragging) { @@ -1855,8 +1863,16 @@ static QVariant xdndObtainData(const char *format, QVariant::Type requestedType) && (!(w->windowType() == Qt::Desktop) || w->acceptDrops())) { QDragPrivate * o = QDragManager::self()->dragPrivate(); - if (o->data->hasFormat(QLatin1String(format))) - result = o->data->data(QLatin1String(format)); + const QString mimeType = QString::fromLatin1(format); + if (o->data->hasFormat(mimeType)) { + result = o->data->data(mimeType); + } else if (mimeType.startsWith(QLatin1String("image/")) && o->data->hasImage()) { + // ### duplicated from QInternalMimeData::renderDataHelper + QImage image = qvariant_cast(o->data->imageData()); + QBuffer buf(&result); + buf.open(QBuffer::WriteOnly); + image.save(&buf, mimeType.mid(mimeType.indexOf(QLatin1Char('/')) + 1).toLatin1().toUpper()); + } return result; } -- cgit v0.12 From 837f18f043b18410c1d93b9f1156acf729dad510 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 19 May 2011 14:43:53 +0200 Subject: Add QtPrivate::QEnableIf Needed for QtConcurrent. Like the new std::enable_if (in c++0x) Reviewed-by: Joao --- src/corelib/global/qglobal.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 3e1f011..b3462de 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -2770,6 +2770,12 @@ QT_LICENSED_MODULE(DBus) # define QT_NO_RAWFONT #endif +namespace QtPrivate { +//like std::enable_if +template struct QEnableIf; +template struct QEnableIf { typedef T Type; }; +} + QT_END_NAMESPACE QT_END_HEADER -- cgit v0.12 From 917f2ff617209bcc283eb3590b422bcf239c0537 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Mon, 18 Apr 2011 14:07:32 +0200 Subject: Support of lambdas in QtConcurrent::run Reviewed-by: Joao --- src/corelib/concurrent/qtconcurrentcompilertest.h | 14 +++ .../concurrent/qtconcurrentfunctionwrappers.h | 11 +-- src/corelib/concurrent/qtconcurrentrun.h | 75 ++++++++++++--- .../concurrent/qtconcurrentstoredfunctioncall.h | 105 +++++++++------------ src/corelib/global/qglobal.h | 3 + tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp | 67 +++++++++++++ 6 files changed, 194 insertions(+), 81 deletions(-) diff --git a/src/corelib/concurrent/qtconcurrentcompilertest.h b/src/corelib/concurrent/qtconcurrentcompilertest.h index fad0c35..86f01b3 100644 --- a/src/corelib/concurrent/qtconcurrentcompilertest.h +++ b/src/corelib/concurrent/qtconcurrentcompilertest.h @@ -57,6 +57,20 @@ QT_MODULE(Core) # define QT_TYPENAME typename #endif +namespace QtPrivate { + +template +class HasResultType { + typedef char Yes; + typedef void *No; + template static Yes test(int, const typename U::result_type * = 0); + template static No test(double); +public: + enum { Value = (sizeof(test(0)) == sizeof(Yes)) }; +}; + +} + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/corelib/concurrent/qtconcurrentfunctionwrappers.h b/src/corelib/concurrent/qtconcurrentfunctionwrappers.h index 98506a5..7a574f2 100644 --- a/src/corelib/concurrent/qtconcurrentfunctionwrappers.h +++ b/src/corelib/concurrent/qtconcurrentfunctionwrappers.h @@ -195,17 +195,10 @@ QtConcurrent::ConstMemberFunctionWrapper createFunctionWrapper(T (C::*func return QtConcurrent::ConstMemberFunctionWrapper(func); } - -template -void *lazyResultType_helper(int, typename T::result_type * = 0); -template -char lazyResultType_helper(double); - -template (0)) != sizeof(void*)> +template ::Value> struct LazyResultType { typedef typename Functor::result_type Type; }; template -struct LazyResultType { typedef void Type; }; - +struct LazyResultType { typedef void Type; }; template struct ReduceResultType; diff --git a/src/corelib/concurrent/qtconcurrentrun.h b/src/corelib/concurrent/qtconcurrentrun.h index 9fa8a27..9d46c61 100644 --- a/src/corelib/concurrent/qtconcurrentrun.h +++ b/src/corelib/concurrent/qtconcurrentrun.h @@ -71,63 +71,114 @@ namespace QtConcurrent { template QFuture run(T (*functionPointer)()) { - return (new QT_TYPENAME SelectStoredFunctorCall0::type(functionPointer))->start(); + return (new StoredFunctorCall0(functionPointer))->start(); } template QFuture run(T (*functionPointer)(Param1), const Arg1 &arg1) { - return (new QT_TYPENAME SelectStoredFunctorCall1::type(functionPointer, arg1))->start(); + return (new StoredFunctorCall1(functionPointer, arg1))->start(); } template QFuture run(T (*functionPointer)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2) { - return (new QT_TYPENAME SelectStoredFunctorCall2::type(functionPointer, arg1, arg2))->start(); + return (new StoredFunctorCall2(functionPointer, arg1, arg2))->start(); } template QFuture run(T (*functionPointer)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) { - return (new QT_TYPENAME SelectStoredFunctorCall3::type(functionPointer, arg1, arg2, arg3))->start(); + return (new StoredFunctorCall3(functionPointer, arg1, arg2, arg3))->start(); } template QFuture run(T (*functionPointer)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) { - return (new QT_TYPENAME SelectStoredFunctorCall4::type(functionPointer, arg1, arg2, arg3, arg4))->start(); + return (new StoredFunctorCall4(functionPointer, arg1, arg2, arg3, arg4))->start(); } template QFuture run(T (*functionPointer)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) { - return (new QT_TYPENAME SelectStoredFunctorCall5::type(functionPointer, arg1, arg2, arg3, arg4, arg5))->start(); + return (new StoredFunctorCall5(functionPointer, arg1, arg2, arg3, arg4, arg5))->start(); } +#ifdef Q_COMPILER_DECLTYPE + +template +auto run(Functor functor) -> typename QtPrivate::QEnableIf::Value, QFuture >::Type +{ + typedef decltype(functor()) result_type; + return (new StoredFunctorCall0(functor))->start(); +} + +template +auto run(Functor functor, const Arg1 &arg1) + -> typename QtPrivate::QEnableIf::Value, QFuture >::Type +{ + typedef decltype(functor(arg1)) result_type; + return (new StoredFunctorCall1(functor, arg1))->start(); +} + +template +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2) + -> typename QtPrivate::QEnableIf::Value, QFuture >::Type +{ + typedef decltype(functor(arg1, arg2)) result_type; + return (new StoredFunctorCall2(functor, arg1, arg2))->start(); +} + +template +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) + -> typename QtPrivate::QEnableIf::Value, QFuture >::Type +{ + typedef decltype(functor(arg1, arg2, arg3)) result_type; + return (new StoredFunctorCall3(functor, arg1, arg2, arg3))->start(); +} + +template +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) + -> typename QtPrivate::QEnableIf::Value, QFuture >::Type +{ + typedef decltype(functor(arg1, arg2, arg3, arg4)) result_type; + return (new StoredFunctorCall4(functor, arg1, arg2, arg3, arg4))->start(); +} + +template +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) + -> typename QtPrivate::QEnableIf::Value, QFuture >::Type +{ + typedef decltype(functor(arg1, arg2, arg3, arg4, arg5)) result_type; + return (new StoredFunctorCall5(functor, arg1, arg2, arg3, arg4, arg5))->start(); +} + +#endif + template QFuture run(FunctionObject functionObject) { - return (new QT_TYPENAME SelectStoredFunctorCall0::type(functionObject))->start(); + return (new StoredFunctorCall0(functionObject))->start(); } template QFuture run(FunctionObject functionObject, const Arg1 &arg1) { - return (new QT_TYPENAME SelectStoredFunctorCall1::type(functionObject, arg1))->start(); + return (new StoredFunctorCall1(functionObject, arg1))->start(); } template QFuture run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2) { - return (new QT_TYPENAME SelectStoredFunctorCall2::type(functionObject, arg1, arg2))->start(); + return (new StoredFunctorCall2(functionObject, arg1, arg2))->start(); } template QFuture run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) { - return (new QT_TYPENAME SelectStoredFunctorCall3::type(functionObject, arg1, arg2, arg3))->start(); + return (new StoredFunctorCall3(functionObject, arg1, arg2, arg3))->start(); } template QFuture run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) { - return (new QT_TYPENAME SelectStoredFunctorCall4::type(functionObject, arg1, arg2, arg3, arg4))->start(); + return (new StoredFunctorCall4(functionObject, arg1, arg2, arg3, arg4))->start(); } template QFuture run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) { - return (new QT_TYPENAME SelectStoredFunctorCall5::type(functionObject, arg1, arg2, arg3, arg4, arg5))->start(); + return (new StoredFunctorCall5(functionObject, arg1, arg2, arg3, arg4, arg5))->start(); } template diff --git a/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h b/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h index 82d95f6..2a90e39 100644 --- a/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h +++ b/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h @@ -66,10 +66,10 @@ struct StoredFunctorCall0: public RunFunctionTask }; -template -struct VoidStoredFunctorCall0: public RunFunctionTask +template +struct StoredFunctorCall0: public RunFunctionTask { - inline VoidStoredFunctorCall0(FunctionPointer _function) + inline StoredFunctorCall0(FunctionPointer _function) : function(_function) {} void runFunctor() { function(); } FunctionPointer function; @@ -77,13 +77,6 @@ struct VoidStoredFunctorCall0: public RunFunctionTask }; template -struct SelectStoredFunctorCall0 -{ - typedef typename SelectSpecialization::template - Type, - VoidStoredFunctorCall0 >::type type; -}; -template struct StoredFunctorPointerCall0: public RunFunctionTask { inline StoredFunctorPointerCall0(FunctionPointer * _function) @@ -276,10 +269,10 @@ struct StoredFunctorCall1: public RunFunctionTask Arg1 arg1; }; -template -struct VoidStoredFunctorCall1: public RunFunctionTask +template +struct StoredFunctorCall1: public RunFunctionTask { - inline VoidStoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1) + inline StoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1) : function(_function), arg1(_arg1) {} void runFunctor() { function(arg1); } FunctionPointer function; @@ -287,13 +280,6 @@ struct VoidStoredFunctorCall1: public RunFunctionTask }; template -struct SelectStoredFunctorCall1 -{ - typedef typename SelectSpecialization::template - Type, - VoidStoredFunctorCall1 >::type type; -}; -template struct StoredFunctorPointerCall1: public RunFunctionTask { inline StoredFunctorPointerCall1(FunctionPointer * _function, const Arg1 &_arg1) @@ -486,10 +472,10 @@ struct StoredFunctorCall2: public RunFunctionTask Arg1 arg1; Arg2 arg2; }; -template -struct VoidStoredFunctorCall2: public RunFunctionTask +template +struct StoredFunctorCall2: public RunFunctionTask { - inline VoidStoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2) + inline StoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2) : function(_function), arg1(_arg1), arg2(_arg2) {} void runFunctor() { function(arg1, arg2); } FunctionPointer function; @@ -497,13 +483,6 @@ struct VoidStoredFunctorCall2: public RunFunctionTask }; template -struct SelectStoredFunctorCall2 -{ - typedef typename SelectSpecialization::template - Type, - VoidStoredFunctorCall2 >::type type; -}; -template struct StoredFunctorPointerCall2: public RunFunctionTask { inline StoredFunctorPointerCall2(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2) @@ -696,10 +675,10 @@ struct StoredFunctorCall3: public RunFunctionTask Arg1 arg1; Arg2 arg2; Arg3 arg3; }; -template -struct VoidStoredFunctorCall3: public RunFunctionTask +template +struct StoredFunctorCall3: public RunFunctionTask { - inline VoidStoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) + inline StoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {} void runFunctor() { function(arg1, arg2, arg3); } FunctionPointer function; @@ -707,13 +686,6 @@ struct VoidStoredFunctorCall3: public RunFunctionTask }; template -struct SelectStoredFunctorCall3 -{ - typedef typename SelectSpecialization::template - Type, - VoidStoredFunctorCall3 >::type type; -}; -template struct StoredFunctorPointerCall3: public RunFunctionTask { inline StoredFunctorPointerCall3(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) @@ -906,10 +878,10 @@ struct StoredFunctorCall4: public RunFunctionTask Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; }; -template -struct VoidStoredFunctorCall4: public RunFunctionTask +template +struct StoredFunctorCall4: public RunFunctionTask { - inline VoidStoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) + inline StoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {} void runFunctor() { function(arg1, arg2, arg3, arg4); } FunctionPointer function; @@ -917,13 +889,6 @@ struct VoidStoredFunctorCall4: public RunFunctionTask }; template -struct SelectStoredFunctorCall4 -{ - typedef typename SelectSpecialization::template - Type, - VoidStoredFunctorCall4 >::type type; -}; -template struct StoredFunctorPointerCall4: public RunFunctionTask { inline StoredFunctorPointerCall4(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) @@ -1116,10 +1081,10 @@ struct StoredFunctorCall5: public RunFunctionTask Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5; }; -template -struct VoidStoredFunctorCall5: public RunFunctionTask +template +struct StoredFunctorCall5: public RunFunctionTask { - inline VoidStoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) + inline StoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {} void runFunctor() { function(arg1, arg2, arg3, arg4, arg5); } FunctionPointer function; @@ -1127,13 +1092,6 @@ struct VoidStoredFunctorCall5: public RunFunctionTask }; template -struct SelectStoredFunctorCall5 -{ - typedef typename SelectSpecialization::template - Type, - VoidStoredFunctorCall5 >::type type; -}; -template struct StoredFunctorPointerCall5: public RunFunctionTask { inline StoredFunctorPointerCall5(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) @@ -1316,6 +1274,33 @@ struct SelectStoredConstMemberFunctionPointerCall5 Type, VoidStoredConstMemberFunctionPointerCall5 >::type type; }; + +template +class StoredFunctorCall : public RunFunctionTask +{ +public: + StoredFunctorCall(const Functor &f) : functor(f) { } + void runFunctor() + { + this->result = functor(); + } +private: + Functor functor; +}; +template +class StoredFunctorCall : public RunFunctionTask +{ +public: + StoredFunctorCall(const Functor &f) : functor(f) { } + void runFunctor() + { + functor(); + } +private: + Functor functor; +}; + + } //namespace QtConcurrent #endif // qdoc diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index b3462de..f47c9a7 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -428,6 +428,7 @@ namespace QT_NAMESPACE {} # define Q_COMPILER_INITIALIZER_LISTS # define Q_COMPILER_AUTO_TYPE # define Q_COMPILER_LAMBDA +# define Q_COMPILER_DECLTYPE //# define Q_COMPILER_VARIADIC_TEMPLATES //# define Q_COMPILER_CLASS_ENUM //# define Q_COMPILER_DEFAULT_DELETE_MEMBERS @@ -524,6 +525,7 @@ namespace QT_NAMESPACE {} # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 /* C++0x features supported in GCC 4.3: */ # define Q_COMPILER_RVALUE_REFS +# define Q_COMPILER_DECLTYPE # endif # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 /* C++0x features supported in GCC 4.4: */ @@ -791,6 +793,7 @@ namespace QT_NAMESPACE {} # if __INTEL_COMPILER >= 1100 # define Q_COMPILER_RVALUE_REFS # define Q_COMPILER_EXTERN_TEMPLATES +# define Q_COMPILER_DECLTYPE # elif __INTEL_COMPILER >= 1200 # define Q_COMPILER_VARIADIC_TEMPLATES # define Q_COMPILER_AUTO_TYPE diff --git a/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp b/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp index 1069cb5..be79a13 100644 --- a/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp +++ b/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp @@ -67,6 +67,8 @@ private slots: #if 0 void createFunctor(); #endif + void functor(); + void lambda(); }; #if 0 @@ -444,6 +446,71 @@ void tst_QtConcurrentRun::createFunctor() } #endif +struct Functor { + int operator()() { return 42; } + double operator()(double a, double b) { return a/b; } + int operator()(int a, int b) { return a/b; } + void operator()(int) { } + void operator()(int, int, int) { } + void operator()(int, int, int, int) { } + void operator()(int, int, int, int, int) { } + void operator()(int, int, int, int, int, int) { } +}; + +void tst_QtConcurrentRun::functor() +{ + //this test functor without result_type, decltype need to be supported by the compiler +#ifndef Q_COMPILER_DECLTYPE + QSKIP("Compiler do not suport decltype", SkipAll); +#else + Functor f; + { + QFuture fut = QtConcurrent::run(f); + QCOMPARE(fut.result(), 42); + } + { + QFuture fut = QtConcurrent::run(f, 8.5, 1.8); + QCOMPARE(fut.result(), (8.5/1.8)); + } + { + QFuture fut = QtConcurrent::run(f, 19, 3); + QCOMPARE(fut.result(), int(19/3)); + } + { + QtConcurrent::run(f, 1).waitForFinished(); + QtConcurrent::run(f, 1,2).waitForFinished(); + QtConcurrent::run(f, 1,2,3).waitForFinished(); + QtConcurrent::run(f, 1,2,3,4).waitForFinished(); + QtConcurrent::run(f, 1,2,3,4,5).waitForFinished(); + } +#endif +} + + +void tst_QtConcurrentRun::lambda() +{ +#ifndef Q_COMPILER_LAMBDA + QSKIP("Compiler do not suport lambda", SkipAll); +#else + + QCOMPARE(QtConcurrent::run([](){ return 45; }).result(), 45); + QCOMPARE(QtConcurrent::run([](int a){ return a+15; }, 12).result(), 12+15); + QCOMPARE(QtConcurrent::run([](int a, double b){ return a + b; }, 12, 15).result(), double(12+15)); + QCOMPARE(QtConcurrent::run([](int a , int, int, int, int b){ return a + b; }, 1, 2, 3, 4, 5).result(), 1 + 5); + +#ifdef Q_COMPILER_INITIALIZER_LISTS + { + QString str { "Hello World Foo" }; + QFuture f1 = QtConcurrent::run([&](){ return str.split(' '); }); + auto r = f1.result(); + QCOMPARE(r, QStringList({"Hello", "World", "Foo"})); + } +#endif + +#endif +} + + #include "tst_qtconcurrentrun.moc" #else -- cgit v0.12 From a09f5c425079405e72078813bdb7b103c29a5221 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Wed, 20 Apr 2011 13:49:19 +0200 Subject: MSVC do not really support initilizer_list std::initializer_list exists, but it is not possible to do bracket initialisation Reviewed-by: Joao --- src/corelib/global/qglobal.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index f47c9a7..32eedc7 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -425,15 +425,11 @@ namespace QT_NAMESPACE {} #if defined(Q_CC_MSVC) && _MSC_VER >= 1600 # define Q_COMPILER_RVALUE_REFS -# define Q_COMPILER_INITIALIZER_LISTS # define Q_COMPILER_AUTO_TYPE # define Q_COMPILER_LAMBDA # define Q_COMPILER_DECLTYPE -//# define Q_COMPILER_VARIADIC_TEMPLATES -//# define Q_COMPILER_CLASS_ENUM -//# define Q_COMPILER_DEFAULT_DELETE_MEMBERS -//# define Q_COMPILER_UNICODE_STRINGS -//# define Q_COMPILER_EXTERN_TEMPLATES +// MSCV has std::initilizer_list, but do not support the braces initilization +//# define Q_COMPILER_INITIALIZER_LISTS # endif -- cgit v0.12 From 38d1b31006ecc83811bbb13e5a4182eac593a970 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Wed, 18 May 2011 17:55:43 +0200 Subject: Tests for QtConcurrent::map using lambdas Also disable tests with std::vector in c++0x as they do not compile Reviewed-by: Joao --- tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp index 2f1adb4..8814cde 100644 --- a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp +++ b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp @@ -146,6 +146,15 @@ void tst_QtConcurrentMap::map() QCOMPARE(numberList, QList() << 2 << 4 << 6); QtConcurrent::map(numberList.begin(), numberList.end(), &Number::multiplyBy2).waitForFinished(); QCOMPARE(numberList, QList() << 4 << 8 << 12); + +#ifdef Q_COMPILER_LAMBDA + // lambda + QtConcurrent::map(list, [](int &x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList() << 128 << 256 << 384); + QtConcurrent::map(list.begin(), list.end(), [](int &x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList() << 256 << 512 << 768); +#endif + } // functors don't take arguments by reference, making these no-ops @@ -170,6 +179,14 @@ void tst_QtConcurrentMap::map() QCOMPARE(list, QList() << 1 << 2 << 3); QtConcurrent::map(list.begin(), list.end(), multiplyBy2Immutable).waitForFinished(); QCOMPARE(list, QList() << 1 << 2 << 3); + +#ifdef Q_COMPILER_LAMBDA + // lambda + QtConcurrent::map(list, [](int x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList() << 1 << 2 << 3); + QtConcurrent::map(list.begin(), list.end(), [](int x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList() << 1 << 2 << 3); +#endif } // Linked lists and forward iterators @@ -2303,6 +2320,10 @@ void tst_QtConcurrentMap::stlContainers() { #ifdef QT_NO_STL QSKIP("Qt compiled without STL support", SkipAll); +#elif defined(Q_COMPILER_RVALUE_REFS) + //mapped uses &Container::push_back, but in c++0x, std::vector has two overload of it + // meaning it is not possible to take the address of that function anymore. + QSKIP("mapped do not work with c++0x stl vector", SkipAll); #else std::vector vector; vector.push_back(1); -- cgit v0.12 From c8a3c427e96ee11907592f5c7f72046795c027ed Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 20 May 2011 09:31:16 +0200 Subject: Fix typo in comment --- src/corelib/global/qglobal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 32eedc7..80d364a 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -428,7 +428,7 @@ namespace QT_NAMESPACE {} # define Q_COMPILER_AUTO_TYPE # define Q_COMPILER_LAMBDA # define Q_COMPILER_DECLTYPE -// MSCV has std::initilizer_list, but do not support the braces initilization +// MSCV has std::initilizer_list, but do not support the braces initialization //# define Q_COMPILER_INITIALIZER_LISTS # endif -- cgit v0.12 From 0ccf01368adcabbb25958a55976083f72116a2d5 Mon Sep 17 00:00:00 2001 From: Martin Petersson Date: Fri, 20 May 2011 10:04:18 +0200 Subject: tst_qhostinfo: Fix IPv6 lookup detection on Windows. Moved the QTcpServer test to init winsock before we use getaddrinfo. Reviewed-by: Shane Kearns --- tests/auto/qhostinfo/tst_qhostinfo.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp index af0631e..7657035 100644 --- a/tests/auto/qhostinfo/tst_qhostinfo.cpp +++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp @@ -213,6 +213,13 @@ void tst_QHostInfo::initTestCase() #else ipv6Available = false; ipv6LookupsAvailable = false; + + QTcpServer server; + if (server.listen(QHostAddress("::1"))) { + // We have IPv6 support + ipv6Available = true; + } + #if !defined(QT_NO_GETADDRINFO) // check if the system getaddrinfo can do IPv6 lookups struct addrinfo hint, *result = 0; @@ -235,13 +242,6 @@ void tst_QHostInfo::initTestCase() #endif #endif - QTcpServer server; - if (server.listen(QHostAddress("::1"))) { - // We have IPv6 support - ipv6Available = true; - } - - // run each testcase with and without test enabled QTest::addColumn("cache"); QTest::newRow("WithCache") << true; -- cgit v0.12 From 4e9286880fd2686e61de2c4be3c317e01f0d9989 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 20 May 2011 14:12:57 +0200 Subject: Add some autotests and benchmarks for QUuid Missing those functions for optimization. Reviewed-by: joao --- tests/auto/quuid/tst_quuid.cpp | 65 +++++++++++++++- .../benchmarks/corelib/plugin/quuid/tst_quuid.cpp | 89 ++++++++++++++++++++++ 2 files changed, 152 insertions(+), 2 deletions(-) diff --git a/tests/auto/quuid/tst_quuid.cpp b/tests/auto/quuid/tst_quuid.cpp index 50e48c9..f24c893 100644 --- a/tests/auto/quuid/tst_quuid.cpp +++ b/tests/auto/quuid/tst_quuid.cpp @@ -60,7 +60,10 @@ public: tst_QUuid(); private slots: + void fromChar(); void toString(); + void fromString(); + void check_QDataStream(); void isNull(); void equal(); void notEqual(); @@ -83,16 +86,74 @@ public: tst_QUuid::tst_QUuid() { - uuidA = "{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"; - uuidB = "{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"; + //"{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"; + uuidA = QUuid(0xfc69b59e, 0xcc34 ,0x4436 ,0xa4 ,0x3c ,0xee ,0x95 ,0xd1 ,0x28 ,0xb8 ,0xc5); + + //"{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"; + uuidB = QUuid(0x1ab6e93a ,0xb1cb ,0x4a87 ,0xba ,0x47 ,0xec ,0x7e ,0x99 ,0x03 ,0x9a ,0x7b); } +void tst_QUuid::fromChar() +{ + QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5")); + QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5")); + QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c")); + QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34")); + QCOMPARE(QUuid(), QUuid("fc69b59e-cc34-")); + QCOMPARE(QUuid(), QUuid("fc69b59e-cc34")); + QCOMPARE(QUuid(), QUuid("cc34")); + QCOMPARE(QUuid(), QUuid(NULL)); + + QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); +} void tst_QUuid::toString() { QCOMPARE(uuidA.toString(), QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + + QCOMPARE(uuidB.toString(), QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")); } +void tst_QUuid::fromString() +{ + QCOMPARE(uuidA, QUuid(QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QString("fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(uuidA, QUuid(QString("fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(QUuid(), QUuid(QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c"))); + + QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); +} + +void tst_QUuid::check_QDataStream() +{ + QUuid tmp; + QByteArray ar; + { + QDataStream out(&ar,QIODevice::WriteOnly); + out.setByteOrder(QDataStream::BigEndian); + out << uuidA; + } + { + QDataStream in(&ar,QIODevice::ReadOnly); + in.setByteOrder(QDataStream::BigEndian); + in >> tmp; + QCOMPARE(uuidA, tmp); + } + { + QDataStream out(&ar,QIODevice::WriteOnly); + out.setByteOrder(QDataStream::LittleEndian); + out << uuidA; + } + { + QDataStream in(&ar,QIODevice::ReadOnly); + in.setByteOrder(QDataStream::LittleEndian); + in >> tmp; + QCOMPARE(uuidA, tmp); + } +} void tst_QUuid::isNull() { diff --git a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp index 9e885ee..47a3d3f 100644 --- a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp +++ b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp @@ -53,6 +53,14 @@ public: private slots: void createUuid(); + void fromChar(); + void toString(); + void fromString(); + void toDataStream(); + void fromDataStream(); + void isNull(); + void operatorLess(); + void operatorMore(); }; void tst_bench_QUuid::createUuid() @@ -62,5 +70,86 @@ void tst_bench_QUuid::createUuid() } } +void tst_bench_QUuid::fromChar() +{ + QBENCHMARK { + QUuid uuid("{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"); + } +} + +void tst_bench_QUuid::toString() +{ + QUuid uuid = QUuid::createUuid(); + QBENCHMARK { + uuid.toString(); + } +} + +void tst_bench_QUuid::fromString() +{ + QString string = "{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"; + QBENCHMARK { + QUuid uuid(string); + } +} + +void tst_bench_QUuid::toDataStream() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + QByteArray ar; + { + QDataStream out(&ar,QIODevice::WriteOnly); + QBENCHMARK { + out << uuid1; + } + } +} + +void tst_bench_QUuid::fromDataStream() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + QByteArray ar; + { + QDataStream out(&ar,QIODevice::WriteOnly); + out << uuid1; + } + { + QDataStream in(&ar,QIODevice::ReadOnly); + QBENCHMARK { + in >> uuid2; + } + } +} + +void tst_bench_QUuid::isNull() +{ + QUuid uuid = QUuid(); + QBENCHMARK { + uuid.isNull(); + } +} + +void tst_bench_QUuid::operatorLess() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + uuid2 = QUuid::createUuid(); + QBENCHMARK { + uuid1 < uuid2; + } +} + +void tst_bench_QUuid::operatorMore() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + uuid2 = QUuid::createUuid(); + QBENCHMARK { + uuid1 > uuid2; + } +} + QTEST_MAIN(tst_bench_QUuid); #include "tst_quuid.moc" -- cgit v0.12 From 7ce566ed82666ac08f137f4d8590ce589d42c82a Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 20 May 2011 11:07:06 +0200 Subject: Optimize QUuid::toString() and relevant QUuid::toString() and QUuid(const QString &) are too slow now. Task-number: QTBUG-19418 Reviewed-by: joao Reviewed-by: Denis Dzyubenko Reviewed-by: Ritt Konstantin Reviewed-by: Robin Burchell Reviewed-by: Richard J. Moore --- src/corelib/plugin/quuid.cpp | 153 ++++++++++++++++++++++++++++--------------- src/corelib/plugin/quuid.h | 2 +- 2 files changed, 100 insertions(+), 55 deletions(-) diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index ba47bec..e4adf13 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -42,9 +42,97 @@ #include "quuid.h" #include "qdatastream.h" +#include "qendian.h" QT_BEGIN_NAMESPACE +#ifndef QT_NO_QUUID_STRING +template +void _q_toHex(Char *&dst, Integral value) +{ + static const char digits[] = "0123456789abcdef"; + + if (sizeof(Integral) > 1) + value = qToBigEndian(value); + + const char* p = reinterpret_cast(&value); + + for (uint i = 0; i < sizeof(Integral); ++i, dst += 2) { + uint j = (p[i] >> 4) & 0xf; + dst[0] = Char(digits[j]); + j = p[i] & 0xf; + dst[1] = Char(digits[j]); + } +} + +template +bool _q_fromHex(const Char *&src, Integral &value) +{ + value = 0; + + for (uint i = 0; i < sizeof(Integral) * 2; ++i) { + int ch = *src++; + int tmp; + if (ch >= '0' && ch <= '9') + tmp = ch - '0'; + else if (ch >= 'a' && ch <= 'f') + tmp = ch - 'a' + 10; + else if (ch >= 'A' && ch <= 'F') + tmp = ch - 'A' + 10; + else + return false; + + value = value * 16 + tmp; + } + + return true; +} + +template +void _q_uuidToHex(Char *&dst, const uint &d1, const ushort &d2, const ushort &d3, const uchar (&d4)[8]) +{ + *dst++ = Char('{'); + _q_toHex(dst, d1); + *dst++ = Char('-'); + _q_toHex(dst, d2); + *dst++ = Char('-'); + _q_toHex(dst, d3); + *dst++ = Char('-'); + for (int i = 0; i < 2; i++) + _q_toHex(dst, d4[i]); + *dst++ = Char('-'); + for (int i = 2; i < 8; i++) + _q_toHex(dst, d4[i]); + *dst = Char('}'); +} + +template +bool _q_uuidFromHex(const Char *&src, uint &d1, ushort &d2, ushort &d3, uchar (&d4)[8]) +{ + if (*src == Char('{')) + src++; + if (!_q_fromHex(src, d1) + || *src++ != Char('-') + || !_q_fromHex(src, d2) + || *src++ != Char('-') + || !_q_fromHex(src, d3) + || *src++ != Char('-') + || !_q_fromHex(src, d4[0]) + || !_q_fromHex(src, d4[1]) + || *src++ != Char('-') + || !_q_fromHex(src, d4[2]) + || !_q_fromHex(src, d4[3]) + || !_q_fromHex(src, d4[4]) + || !_q_fromHex(src, d4[5]) + || !_q_fromHex(src, d4[6]) + || !_q_fromHex(src, d4[7])) { + return false; + } + + return true; +} +#endif + /*! \class QUuid \brief The QUuid class stores a Universally Unique Identifier (UUID). @@ -231,50 +319,22 @@ QT_BEGIN_NAMESPACE */ QUuid::QUuid(const QString &text) { - bool ok; - if (text.isEmpty()) { - *this = QUuid(); - return; - } - QString temp = text.toUpper(); - if (temp[0] != QLatin1Char('{')) - temp = QLatin1Char('{') + text; - if (text[(int)text.length()-1] != QLatin1Char('}')) - temp += QLatin1Char('}'); - - data1 = temp.mid(1, 8).toULongLong(&ok, 16); - if (!ok) { + if (text.length() < 36) { *this = QUuid(); return; } - data2 = temp.mid(10, 4).toUInt(&ok, 16); - if (!ok) { - *this = QUuid(); - return; - } - data3 = temp.mid(15, 4).toUInt(&ok, 16); - if (!ok) { - *this = QUuid(); - return; - } - data4[0] = temp.mid(20, 2).toUInt(&ok, 16); - if (!ok) { + const ushort *data = reinterpret_cast(text.unicode()); + + if (*data == '{' && text.length() < 37) { *this = QUuid(); return; } - data4[1] = temp.mid(22, 2).toUInt(&ok, 16); - if (!ok) { + + if (!_q_uuidFromHex(data, data1, data2, data3, data4)) { *this = QUuid(); return; } - for (int i = 2; i<8; i++) { - data4[i] = temp.mid(25 + (i-2)*2, 2).toUShort(&ok, 16); - if (!ok) { - *this = QUuid(); - return; - } - } } /*! @@ -308,11 +368,6 @@ QUuid::QUuid(const char *text) \sa toString() */ -static QString uuidhex(uint data, int digits) -{ - return QString::number(data, 16).rightJustified(digits, QLatin1Char('0')); -} - /*! Returns the string representation of this QUuid. The string is formatted as five hex fields separated by '-' and enclosed in @@ -349,22 +404,12 @@ static QString uuidhex(uint data, int digits) */ QString QUuid::toString() const { - QString result; - - QChar dash = QLatin1Char('-'); - result = QLatin1Char('{') + uuidhex(data1,8); - result += dash; - result += uuidhex(data2,4); - result += dash; - result += uuidhex(data3,4); - result += dash; - result += uuidhex(data4[0],2); - result += uuidhex(data4[1],2); - result += dash; - for (int i = 2; i < 8; i++) - result += uuidhex(data4[i],2); + QString result(38, Qt::Uninitialized); + ushort *data = (ushort *)result.unicode(); - return result + QLatin1Char('}'); + _q_uuidToHex(data, data1, data2, data3, data4); + + return result; } #endif diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index 37bcd08..39f0179 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -108,7 +108,7 @@ struct Q_CORE_EXPORT QUuid QUuid(const QString &); QUuid(const char *); QString toString() const; - operator QString() const { return toString(); } + operator QString() const { return toString(); } // ### Qt5 remove #endif bool isNull() const; -- cgit v0.12 From 71f923f29e2c60444a85fc765fc582e06cb7eca4 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 20 May 2011 11:36:01 +0200 Subject: Add QUuid::toByteArray() and relevant Add QUuid::toByteArray() and QUuid(const QByteArray &). Same behavior with QUuid::toString() and QUuid(const QString &). Task-number: QTBUG-19419 Reviewed-by: joao --- src/corelib/plugin/quuid.cpp | 79 ++++++++++++++++++++++ src/corelib/plugin/quuid.h | 2 + tests/auto/quuid/tst_quuid.cpp | 20 ++++++ .../benchmarks/corelib/plugin/quuid/tst_quuid.cpp | 18 +++++ 4 files changed, 119 insertions(+) diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index e4adf13..c80d0f5 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -344,6 +344,39 @@ QUuid::QUuid(const char *text) { *this = QUuid(QString::fromLatin1(text)); } + +/*! + Creates a QUuid object from the QByteArray \a text, which must be + formatted as five hex fields separated by '-', e.g., + "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where 'x' is a hex + digit. The curly braces shown here are optional, but it is normal to + include them. If the conversion fails, a null UUID is created. See + toByteArray() for an explanation of how the five hex fields map to the + public data members in QUuid. + + \since 4.8 + + \sa toByteArray(), QUuid() +*/ +QUuid::QUuid(const QByteArray &text) +{ + if (text.length() < 36) { + *this = QUuid(); + return; + } + + const char *data = text.constData(); + + if (*data == '{' && text.length() < 37) { + *this = QUuid(); + return; + } + + if (!_q_uuidFromHex(data, data1, data2, data3, data4)) { + *this = QUuid(); + return; + } +} #endif /*! @@ -411,6 +444,52 @@ QString QUuid::toString() const return result; } + +/*! + Returns the binary representation of this QUuid. The byte array is + formatted as five hex fields separated by '-' and enclosed in + curly braces, i.e., "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where + 'x' is a hex digit. From left to right, the five hex fields are + obtained from the four public data members in QUuid as follows: + + \table + \header + \o Field # + \o Source + + \row + \o 1 + \o data1 + + \row + \o 2 + \o data2 + + \row + \o 3 + \o data3 + + \row + \o 4 + \o data4[0] .. data4[1] + + \row + \o 5 + \o data4[2] .. data4[7] + + \endtable + + \since 4.8 +*/ +QByteArray QUuid::toByteArray() const +{ + QByteArray result(38, Qt::Uninitialized); + char *data = result.data(); + + _q_uuidToHex(data, data1, data2, data3, data4); + + return result; +} #endif #ifndef QT_NO_DATASTREAM diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index 39f0179..ecaae48 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -109,6 +109,8 @@ struct Q_CORE_EXPORT QUuid QUuid(const char *); QString toString() const; operator QString() const { return toString(); } // ### Qt5 remove + QUuid(const QByteArray &); + QByteArray toByteArray() const; #endif bool isNull() const; diff --git a/tests/auto/quuid/tst_quuid.cpp b/tests/auto/quuid/tst_quuid.cpp index f24c893..1b65abb 100644 --- a/tests/auto/quuid/tst_quuid.cpp +++ b/tests/auto/quuid/tst_quuid.cpp @@ -63,6 +63,8 @@ private slots: void fromChar(); void toString(); void fromString(); + void toByteArray(); + void fromByteArray(); void check_QDataStream(); void isNull(); void equal(); @@ -127,6 +129,24 @@ void tst_QUuid::fromString() QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); } +void tst_QUuid::toByteArray() +{ + QCOMPARE(uuidA.toByteArray(), QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + + QCOMPARE(uuidB.toByteArray(), QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")); +} + +void tst_QUuid::fromByteArray() +{ + QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(QUuid(), QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c"))); + + QCOMPARE(uuidB, QUuid(QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); +} + void tst_QUuid::check_QDataStream() { QUuid tmp; diff --git a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp index 47a3d3f..608423a 100644 --- a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp +++ b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp @@ -56,6 +56,8 @@ private slots: void fromChar(); void toString(); void fromString(); + void toByteArray(); + void fromByteArray(); void toDataStream(); void fromDataStream(); void isNull(); @@ -93,6 +95,22 @@ void tst_bench_QUuid::fromString() } } +void tst_bench_QUuid::toByteArray() +{ + QUuid uuid = QUuid::createUuid(); + QBENCHMARK { + uuid.toByteArray(); + } +} + +void tst_bench_QUuid::fromByteArray() +{ + QByteArray string = "{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"; + QBENCHMARK { + QUuid uuid(string); + } +} + void tst_bench_QUuid::toDataStream() { QUuid uuid1, uuid2; -- cgit v0.12 From 06873e467d98ad60d827afae29500bf2ff783c03 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 20 May 2011 11:16:33 +0200 Subject: Add QUuid::toRfc4122() and fromRfc4122() Following the RFC4122, provide the interfaces between QUuid and QByteArray, they are simpler then toByteArray() and relevant. Thanks for the suggestion and brief code from Robin Burchell. Task-number: QTBUG-19420 Reviewed-by: joao --- src/corelib/plugin/quuid.cpp | 92 ++++++++++++++++++++++ src/corelib/plugin/quuid.h | 2 + tests/auto/quuid/tst_quuid.cpp | 16 ++++ .../benchmarks/corelib/plugin/quuid/tst_quuid.cpp | 18 +++++ 4 files changed, 128 insertions(+) diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index c80d0f5..4b1856d 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -380,6 +380,45 @@ QUuid::QUuid(const QByteArray &text) #endif /*! + Creates a QUuid object from the binary representation of the UUID, as + specified by RFC 4122 section 4.1.2. See toRfc4122() for a further + explanation of the order of bytes required. + + The byte array accepted is NOT a human readable format. + + If the conversion fails, a null UUID is created. + + \since 4.8 + + \sa toRfc4122(), QUuid() +*/ +QUuid QUuid::fromRfc4122(const QByteArray &bytes) +{ + if (bytes.isEmpty() || bytes.length() != 16) + return QUuid(); + + uint d1; + ushort d2, d3; + uchar d4[8]; + + const uchar *data = reinterpret_cast(bytes.constData()); + + d1 = qFromBigEndian(data); + data += sizeof(quint32); + d2 = qFromBigEndian(data); + data += sizeof(quint16); + d3 = qFromBigEndian(data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + d4[i] = *(data); + data++; + } + + return QUuid(d1, d2, d3, d4[0], d4[1], d4[2], d4[3], d4[4], d4[5], d4[6], d4[7]); +} + +/*! \fn bool QUuid::operator==(const QUuid &other) const Returns true if this QUuid and the \a other QUuid are identical; @@ -492,6 +531,59 @@ QByteArray QUuid::toByteArray() const } #endif +/*! + Returns the binary representation of this QUuid. The byte array is in big + endian format, and formatted according to RFC 4122, section 4.1.2 - + "Layout and byte order". + + The order is as follows: + + \table + \header + \o Field # + \o Source + + \row + \o 1 + \o data1 + + \row + \o 2 + \o data2 + + \row + \o 3 + \o data3 + + \row + \o 4 + \o data4[0] .. data4[7] + + \endtable + + \since 4.8 +*/ +QByteArray QUuid::toRfc4122() const +{ + // we know how many bytes a UUID has, I hope :) + QByteArray bytes(16, Qt::Uninitialized); + uchar *data = reinterpret_cast(bytes.data()); + + qToBigEndian(data1, data); + data += sizeof(quint32); + qToBigEndian(data2, data); + data += sizeof(quint16); + qToBigEndian(data3, data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + *(data) = data4[i]; + data++; + } + + return bytes; +} + #ifndef QT_NO_DATASTREAM /*! \relates QUuid diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index ecaae48..f5a2e8f 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -112,6 +112,8 @@ struct Q_CORE_EXPORT QUuid QUuid(const QByteArray &); QByteArray toByteArray() const; #endif + QByteArray toRfc4122() const; + static QUuid fromRfc4122(const QByteArray &); bool isNull() const; bool operator==(const QUuid &orig) const diff --git a/tests/auto/quuid/tst_quuid.cpp b/tests/auto/quuid/tst_quuid.cpp index 1b65abb..bedc397 100644 --- a/tests/auto/quuid/tst_quuid.cpp +++ b/tests/auto/quuid/tst_quuid.cpp @@ -65,6 +65,8 @@ private slots: void fromString(); void toByteArray(); void fromByteArray(); + void toRfc4122(); + void fromRfc4122(); void check_QDataStream(); void isNull(); void equal(); @@ -147,6 +149,20 @@ void tst_QUuid::fromByteArray() QCOMPARE(uuidB, QUuid(QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); } +void tst_QUuid::toRfc4122() +{ + QCOMPARE(uuidA.toRfc4122(), QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5")); + + QCOMPARE(uuidB.toRfc4122(), QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b")); +} + +void tst_QUuid::fromRfc4122() +{ + QCOMPARE(uuidA, QUuid::fromRfc4122(QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5"))); + + QCOMPARE(uuidB, QUuid::fromRfc4122(QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b"))); +} + void tst_QUuid::check_QDataStream() { QUuid tmp; diff --git a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp index 608423a..77a9920 100644 --- a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp +++ b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp @@ -58,6 +58,8 @@ private slots: void fromString(); void toByteArray(); void fromByteArray(); + void toRfc4122(); + void fromRfc4122(); void toDataStream(); void fromDataStream(); void isNull(); @@ -111,6 +113,22 @@ void tst_bench_QUuid::fromByteArray() } } +void tst_bench_QUuid::toRfc4122() +{ + QUuid uuid = QUuid::createUuid(); + QBENCHMARK { + uuid.toRfc4122(); + } +} + +void tst_bench_QUuid::fromRfc4122() +{ + QByteArray string = QByteArray::fromHex("67C8770B44F1410AAB9AF9B5446F13EE"); + QBENCHMARK { + QUuid uuid = QUuid::fromRfc4122(string); + } +} + void tst_bench_QUuid::toDataStream() { QUuid uuid1, uuid2; -- cgit v0.12 From d56d7f107f9d18810d742ac4d3a2e36077722cb8 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 20 May 2011 09:48:30 +0200 Subject: QDataStream: speedup steaming of QUuid. By reading and writing as a whole block, because the size of QUuid is fixed. Reviewed-by: joao --- src/corelib/plugin/quuid.cpp | 64 ++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index 4b1856d..ddc388c 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -591,11 +591,30 @@ QByteArray QUuid::toRfc4122() const */ QDataStream &operator<<(QDataStream &s, const QUuid &id) { - s << (quint32)id.data1; - s << (quint16)id.data2; - s << (quint16)id.data3; - for (int i = 0; i < 8; i++) - s << (quint8)id.data4[i]; + QByteArray bytes; + if (s.byteOrder() == QDataStream::BigEndian) { + bytes = id.toRfc4122(); + } else { + // we know how many bytes a UUID has, I hope :) + bytes = QByteArray(16, Qt::Uninitialized); + uchar *data = reinterpret_cast(bytes.data()); + + qToLittleEndian(id.data1, data); + data += sizeof(quint32); + qToLittleEndian(id.data2, data); + data += sizeof(quint16); + qToLittleEndian(id.data3, data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + *(data) = id.data4[i]; + data++; + } + } + + if (s.writeRawData(bytes.data(), 16) != 16) { + s.setStatus(QDataStream::WriteFailed); + } return s; } @@ -605,19 +624,30 @@ QDataStream &operator<<(QDataStream &s, const QUuid &id) */ QDataStream &operator>>(QDataStream &s, QUuid &id) { - quint32 u32; - quint16 u16; - quint8 u8; - s >> u32; - id.data1 = u32; - s >> u16; - id.data2 = u16; - s >> u16; - id.data3 = u16; - for (int i = 0; i < 8; i++) { - s >> u8; - id.data4[i] = u8; + QByteArray bytes(16, Qt::Uninitialized); + if (s.readRawData(bytes.data(), 16) != 16) { + s.setStatus(QDataStream::ReadPastEnd); + return s; } + + if (s.byteOrder() == QDataStream::BigEndian) { + id = QUuid::fromRfc4122(bytes); + } else { + const uchar *data = reinterpret_cast(bytes.constData()); + + id.data1 = qFromLittleEndian(data); + data += sizeof(quint32); + id.data2 = qFromLittleEndian(data); + data += sizeof(quint16); + id.data3 = qFromLittleEndian(data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + id.data4[i] = *(data); + data++; + } + } + return s; } #endif // QT_NO_DATASTREAM -- cgit v0.12 From 96d10abbb40c52ac6274f1144766f3fb27dfd726 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 20 May 2011 12:45:56 +0200 Subject: Optimize QUuid::QUuid(const char *) Reviewed-by: joao --- src/corelib/plugin/quuid.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index ddc388c..e07a1aa 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -342,7 +342,15 @@ QUuid::QUuid(const QString &text) */ QUuid::QUuid(const char *text) { - *this = QUuid(QString::fromLatin1(text)); + if (!text) { + *this = QUuid(); + return; + } + + if (!_q_uuidFromHex(text, data1, data2, data3, data4)) { + *this = QUuid(); + return; + } } /*! -- cgit v0.12 From c19ff75707621b0c5bcb832da84921a0370d72a8 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Fri, 20 May 2011 14:37:55 +0200 Subject: Improved performance of the QLocale::name() function. Task-number: QTBUG-19168 Reviewed-by: Zeno Albisser --- src/corelib/tools/qlocale.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index c8ed94b..c398a5c 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -942,19 +942,32 @@ QLocale::Country QLocale::country() const QString QLocale::name() const { - Language l = language(); + const QLocalePrivate *dd = d(); - QString result = d()->languageCode(); + if (dd->m_language_id == QLocale::AnyLanguage) + return QString(); + if (dd->m_language_id == QLocale::C) + return QLatin1String("C"); - if (l == C) - return result; + const unsigned char *c = language_code_list + 3*(uint(dd->m_language_id)); - Country c = country(); - if (c == AnyCountry) - return result; + QString result(7, Qt::Uninitialized); + ushort *data = (ushort *)result.unicode(); + const ushort *begin = data; - result.append(QLatin1Char('_')); - result.append(d()->countryCode()); + *data++ = ushort(c[0]); + *data++ = ushort(c[1]); + if (c[2] != 0) + *data++ = ushort(c[2]); + if (dd->m_country_id != AnyCountry) { + *data++ = '_'; + const unsigned char *c = country_code_list + 3*(uint(dd->m_country_id)); + *data++ = ushort(c[0]); + *data++ = ushort(c[1]); + if (c[2] != 0) + *data++ = ushort(c[2]); + } + result.resize(data - begin); return result; } -- cgit v0.12 From 32a583b575da1b387955734ccf36b0a93de37670 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Mon, 23 May 2011 09:27:23 +0200 Subject: Fix the build for QUuid Add a quint8 specialization for qbswap. Reviewed-by: Bradley T. Hughes --- src/corelib/global/qendian.h | 5 +++++ src/corelib/plugin/quuid.cpp | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 566307b..1e95b43 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -363,6 +363,11 @@ template inline void qToLittleEndian(T src, uchar *dest) #endif // Q_BYTE_ORDER == Q_BIG_ENDIAN +template <> inline quint8 qbswap(quint8 source) +{ + return source; +} + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index e07a1aa..0a1c4b5 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -52,8 +52,7 @@ void _q_toHex(Char *&dst, Integral value) { static const char digits[] = "0123456789abcdef"; - if (sizeof(Integral) > 1) - value = qToBigEndian(value); + value = qToBigEndian(value); const char* p = reinterpret_cast(&value); -- cgit v0.12 From e5d94256be2525c24a8b61edd771662b7f2b8be3 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Wed, 4 May 2011 17:40:15 +0200 Subject: Use OpenSSL X509_NAME_ENTRY API to parse UTF8 subjectName/issuerName ... to be able to display non-ASCII names from subject and issuerInfo. Task-number: QTBUG-7912 Merge-request: 922 Reviewed-by: Peter Hartmann --- src/network/ssl/qsslcertificate.cpp | 47 ++++++++------------------ src/network/ssl/qsslsocket_openssl_symbols.cpp | 12 +++++-- src/network/ssl/qsslsocket_openssl_symbols_p.h | 6 +++- 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp index a5cdf01..9887438 100644 --- a/src/network/ssl/qsslcertificate.cpp +++ b/src/network/ssl/qsslcertificate.cpp @@ -127,7 +127,7 @@ QT_BEGIN_NAMESPACE // forward declaration -static QMap _q_mapFromOnelineName(char *name); +static QMap _q_mapFromX509Name(X509_NAME *name); /*! Constructs a QSslCertificate by reading \a format encoded data @@ -324,7 +324,7 @@ QString QSslCertificate::issuerInfo(SubjectInfo info) const // lazy init if (d->issuerInfo.isEmpty() && d->x509) d->issuerInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_issuer_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_issuer_name(d->x509)); return d->issuerInfo.value(_q_SubjectInfoToString(info)); } @@ -341,7 +341,7 @@ QString QSslCertificate::issuerInfo(const QByteArray &tag) const // lazy init if (d->issuerInfo.isEmpty() && d->x509) d->issuerInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_issuer_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_issuer_name(d->x509)); return d->issuerInfo.value(QString::fromLatin1(tag)); } @@ -360,7 +360,7 @@ QString QSslCertificate::subjectInfo(SubjectInfo info) const // lazy init if (d->subjectInfo.isEmpty() && d->x509) d->subjectInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_subject_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_subject_name(d->x509)); return d->subjectInfo.value(_q_SubjectInfoToString(info)); } @@ -376,7 +376,7 @@ QString QSslCertificate::subjectInfo(const QByteArray &tag) const // lazy init if (d->subjectInfo.isEmpty() && d->x509) d->subjectInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_subject_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_subject_name(d->x509)); return d->subjectInfo.value(QString::fromLatin1(tag)); } @@ -666,37 +666,18 @@ QByteArray QSslCertificatePrivate::QByteArray_from_X509(X509 *x509, QSsl::Encodi return BEGINCERTSTRING "\n" + tmp + ENDCERTSTRING "\n"; } -static QMap _q_mapFromOnelineName(char *name) +static QMap _q_mapFromX509Name(X509_NAME *name) { QMap info; - QString infoStr = QString::fromLocal8Bit(name); - q_CRYPTO_free(name); - - // ### The right-hand encoding seems to allow hex (Regulierungsbeh\xC8orde) - //entry.replace(QLatin1String("\\x"), QLatin1String("%")); - //entry = QUrl::fromPercentEncoding(entry.toLatin1()); - // ### See RFC-4630 for more details! - - QRegExp rx(QLatin1String("/([A-Za-z]+)=(.+)")); - - int pos = 0; - while ((pos = rx.indexIn(infoStr, pos)) != -1) { - const QString name = rx.cap(1); - - QString value = rx.cap(2); - const int valuePos = rx.pos(2); - - const int next = rx.indexIn(value); - if (next == -1) { - info.insert(name, value); - break; - } - - value = value.left(next); - info.insert(name, value); - pos = valuePos + value.length(); + for( int i = 0; i < q_X509_NAME_entry_count(name); ++i ) + { + X509_NAME_ENTRY *e = q_X509_NAME_get_entry( name, i ); + const char *obj = q_OBJ_nid2sn( q_OBJ_obj2nid( q_X509_NAME_ENTRY_get_object( e ) ) ); + unsigned char *data = 0; + int size = q_ASN1_STRING_to_UTF8( &data, q_X509_NAME_ENTRY_get_data( e ) ); + info[QString::fromUtf8( obj )] = QString::fromUtf8( (char*)data, size ); + q_CRYPTO_free( data ); } - return info; } diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index b1310cc..6cb4794 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -101,6 +101,7 @@ DEFINEFUNC3(void *, ASN1_dup, i2d_of_void *a, a, d2i_of_void *b, b, char *c, c, DEFINEFUNC(long, ASN1_INTEGER_get, ASN1_INTEGER *a, a, return 0, return) DEFINEFUNC(unsigned char *, ASN1_STRING_data, ASN1_STRING *a, a, return 0, return) DEFINEFUNC(int, ASN1_STRING_length, ASN1_STRING *a, a, return 0, return) +DEFINEFUNC2(int, ASN1_STRING_to_UTF8, unsigned char **a, a, ASN1_STRING *b, b, return 0, return); DEFINEFUNC4(long, BIO_ctrl, BIO *a, a, int b, b, long c, c, void *d, d, return -1, return) DEFINEFUNC(int, BIO_free, BIO *a, a, return 0, return) DEFINEFUNC(BIO *, BIO_new, BIO_METHOD *a, a, return 0, return) @@ -248,7 +249,10 @@ DEFINEFUNC4(void *, X509_get_ext_d2i, X509 *a, a, int b, b, int *c, c, int *d, d DEFINEFUNC(X509_NAME *, X509_get_issuer_name, X509 *a, a, return 0, return) DEFINEFUNC(X509_NAME *, X509_get_subject_name, X509 *a, a, return 0, return) DEFINEFUNC(int, X509_verify_cert, X509_STORE_CTX *a, a, return -1, return) -DEFINEFUNC3(char *, X509_NAME_oneline, X509_NAME *a, a, char *b, b, int c, c, return 0, return) +DEFINEFUNC(int, X509_NAME_entry_count, X509_NAME *a, a, return 0, return) +DEFINEFUNC2(X509_NAME_ENTRY *, X509_NAME_get_entry, X509_NAME *a, a, int b, b, return 0, return) +DEFINEFUNC(ASN1_STRING *, X509_NAME_ENTRY_get_data, X509_NAME_ENTRY *a, a, return 0, return) +DEFINEFUNC(ASN1_OBJECT *, X509_NAME_ENTRY_get_object, X509_NAME_ENTRY *a, a, return 0, return) DEFINEFUNC(EVP_PKEY *, X509_PUBKEY_get, X509_PUBKEY *a, a, return 0, return) DEFINEFUNC(void, X509_STORE_free, X509_STORE *a, a, return, DUMMYARG) DEFINEFUNC(X509_STORE *, X509_STORE_new, DUMMYARG, DUMMYARG, return 0, return) @@ -647,6 +651,7 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(ASN1_INTEGER_get) RESOLVEFUNC(ASN1_STRING_data) RESOLVEFUNC(ASN1_STRING_length) + RESOLVEFUNC(ASN1_STRING_to_UTF8) RESOLVEFUNC(BIO_ctrl) RESOLVEFUNC(BIO_free) RESOLVEFUNC(BIO_new) @@ -736,7 +741,10 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(SSLv3_server_method) RESOLVEFUNC(SSLv23_server_method) RESOLVEFUNC(TLSv1_server_method) - RESOLVEFUNC(X509_NAME_oneline) + RESOLVEFUNC(X509_NAME_entry_count) + RESOLVEFUNC(X509_NAME_get_entry) + RESOLVEFUNC(X509_NAME_ENTRY_get_data) + RESOLVEFUNC(X509_NAME_ENTRY_get_object) RESOLVEFUNC(X509_PUBKEY_get) RESOLVEFUNC(X509_STORE_free) RESOLVEFUNC(X509_STORE_new) diff --git a/src/network/ssl/qsslsocket_openssl_symbols_p.h b/src/network/ssl/qsslsocket_openssl_symbols_p.h index 49830ac..ceff57d 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols_p.h +++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h @@ -204,6 +204,7 @@ bool q_resolveOpenSslSymbols(); long q_ASN1_INTEGER_get(ASN1_INTEGER *a); unsigned char * q_ASN1_STRING_data(ASN1_STRING *a); int q_ASN1_STRING_length(ASN1_STRING *a); +int q_ASN1_STRING_to_UTF8(unsigned char **a, ASN1_STRING *b); long q_BIO_ctrl(BIO *a, int b, long c, void *d); int q_BIO_free(BIO *a); BIO *q_BIO_new(BIO_METHOD *a); @@ -360,7 +361,10 @@ void *q_X509_get_ext_d2i(X509 *a, int b, int *c, int *d); X509_NAME *q_X509_get_issuer_name(X509 *a); X509_NAME *q_X509_get_subject_name(X509 *a); int q_X509_verify_cert(X509_STORE_CTX *ctx); -char *q_X509_NAME_oneline(X509_NAME *a, char *b, int c); +int q_X509_NAME_entry_count(X509_NAME *a); +X509_NAME_ENTRY *q_X509_NAME_get_entry(X509_NAME *a,int b); +ASN1_STRING *q_X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *a); +ASN1_OBJECT *q_X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *a); EVP_PKEY *q_X509_PUBKEY_get(X509_PUBKEY *a); void q_X509_STORE_free(X509_STORE *store); X509_STORE *q_X509_STORE_new(); -- cgit v0.12 From 2e8d206fd9f656cd88b797c059ef83ed3df32881 Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Tue, 1 Feb 2011 11:29:13 +0100 Subject: fix coding style for merge request re. utf8 characters in SSL certs fixes minor coding issues for "Use OpenSSL X509_NAME_ENTRY API to parse UTF8 subjectName/issuerName" Task-number: QTBUG-7912 Reviewed-by: Peter Hartmann --- src/network/ssl/qsslcertificate.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp index 9887438..3a703270 100644 --- a/src/network/ssl/qsslcertificate.cpp +++ b/src/network/ssl/qsslcertificate.cpp @@ -669,14 +669,13 @@ QByteArray QSslCertificatePrivate::QByteArray_from_X509(X509 *x509, QSsl::Encodi static QMap _q_mapFromX509Name(X509_NAME *name) { QMap info; - for( int i = 0; i < q_X509_NAME_entry_count(name); ++i ) - { - X509_NAME_ENTRY *e = q_X509_NAME_get_entry( name, i ); - const char *obj = q_OBJ_nid2sn( q_OBJ_obj2nid( q_X509_NAME_ENTRY_get_object( e ) ) ); + for (int i = 0; i < q_X509_NAME_entry_count(name); ++i) { + X509_NAME_ENTRY *e = q_X509_NAME_get_entry(name, i); + const char *obj = q_OBJ_nid2sn(q_OBJ_obj2nid(q_X509_NAME_ENTRY_get_object(e))); unsigned char *data = 0; - int size = q_ASN1_STRING_to_UTF8( &data, q_X509_NAME_ENTRY_get_data( e ) ); - info[QString::fromUtf8( obj )] = QString::fromUtf8( (char*)data, size ); - q_CRYPTO_free( data ); + int size = q_ASN1_STRING_to_UTF8(&data, q_X509_NAME_ENTRY_get_data(e)); + info[QString::fromUtf8(obj)] = QString::fromUtf8((char*)data, size); + q_CRYPTO_free(data); } return info; } -- cgit v0.12 From 19c77b5e5e5fefedafcfbd587c3fbb4114d7c641 Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Mon, 21 Mar 2011 18:15:01 +0100 Subject: add auto test for SSL certificates containing utf8 characters Task-number: QTBUG-7912 Reviewed-by: Peter Hartmann --- .../certificates/cert-ss-san-utf8.pem | 16 +++++++++++ .../certificates/cert-ss-san-utf8.pem.san | 5 ++++ .../certificates/gencertificates.sh | 10 +++++++ tests/auto/qsslcertificate/tst_qsslcertificate.cpp | 32 ++++++++++++++++++---- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem create mode 100644 tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san diff --git a/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem new file mode 100644 index 0000000..e1b731d --- /dev/null +++ b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICkTCCAfqgAwIBAgIJAL1nF+PLAF2KMA0GCSqGSIb3DQEBBQUAMGkxKzApBgNV +BAoMIkjElcSCxrLDvyDKjeG6v8qI4bq34bi7IFLDqWPDtnJkxZ0xFTATBgNVBAsM +DOOIp0HjiYHvvatCQzEWMBQGA1UEAwwNSm9obm55IEd1aXRhcjELMAkGA1UEBhMC +Tk8wHhcNMTEwNTA1MDgxMzEwWhcNMTEwNjA0MDgxMzEwWjBpMSswKQYDVQQKDCJI +xJXEgsayw78gyo3hur/KiOG6t+G4uyBSw6ljw7ZyZMWdMRUwEwYDVQQLDAzjiKdB +44mB772rQkMxFjAUBgNVBAMMDUpvaG5ueSBHdWl0YXIxCzAJBgNVBAYTAk5PMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2zSxS17I6596dJE/VAmGz+06D9S8n +3C0hnIGNVu+LwbgDJTvOw0SzNj4UP72UGgd3UI1KLBg5XWIsRNmE3COJMMh6syjI +L1Ept+tVXxGL6n4gl+0nZ7dkUyxJmeFtigYrL+qCH1yd5rmf3sC3jO4IosuAiG66 +IDkJEVo64NT8ZQIDAQABo0EwPzA9BgNVHREENjA0gQ9hcm5lQGZvb2Jhci5vcmeC +Dnd3dy5mb29iYXIub3JngRFiamFybmVAZm9vYmFyLm9yZzANBgkqhkiG9w0BAQUF +AAOBgQAqVhbC0/EUFdnKlYV3PrknwGX1dPEPGJuIQHa0KpoicvNiOhs1HxBDYbzc +F6wcAMEynq4YwGKhcQLZOs2mo0LreAjA9rU/yBnqrnUW/4gxtUUvmJKK+62IjfLp +eO1L+1NcEMJiaZf8fip4VXhXdOYUhgE8WUZ1UJRC6w3T/yAgcQ== +-----END CERTIFICATE----- diff --git a/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san new file mode 100644 index 0000000..f46a637 --- /dev/null +++ b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san @@ -0,0 +1,5 @@ +[subj_alt_name] +subjectAltName=\ + email:arne@foobar.org,\ + DNS:www.foobar.org,\ + email:bjarne@foobar.org diff --git a/tests/auto/qsslcertificate/certificates/gencertificates.sh b/tests/auto/qsslcertificate/certificates/gencertificates.sh index e705785..c8a5db6 100755 --- a/tests/auto/qsslcertificate/certificates/gencertificates.sh +++ b/tests/auto/qsslcertificate/certificates/gencertificates.sh @@ -90,5 +90,15 @@ openssl req -x509 -in req-san.pem -out $outname -key rsa-pri-1024.pem \ -config san.cnf -extensions subj_alt_name /bin/cp san.cnf $outname.san +#--- Non-ASCII Subject --------------------------------------------------------------------- +echo -e "\n generating self signed root cert. with Subject containing UTF-8 characters ..." +outname=cert-ss-san-utf8.pem +#subject="/O=HĕĂƲÿ ʍếʈặḻ Récördŝ/OU=㈧A㉁ォBC/CN=Johnny Guitar/C=NO" +subject=$'/O=H\xc4\x95\xc4\x82\xc6\xb2\xc3\xbf \xca\x8d\xe1\xba\xbf\xca\x88\xe1\xba\xb7\xe1\xb8\xbb R\xc3\xa9c\xc3\xb6rd\xc5\x9d/OU=\xe3\x88\xa7A\xe3\x89\x81\xef\xbd\xabBC/CN=Johnny Guitar/C=NO' +openssl req -out req-san.pem -new -key rsa-pri-1024.pem -utf8 -subj "$subject" +openssl req -x509 -in req-san.pem -out $outname -key rsa-pri-1024.pem \ + -config san.cnf -extensions subj_alt_name -nameopt multiline,utf8,-esc_msb +/bin/cp san.cnf $outname.san + echo -e "\n cleaning up ..." /bin/rm rsa-pri-1024.pem rsa-pub-1024.* req*.pem diff --git a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp index 57f2fa8..a91bf0f 100644 --- a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp +++ b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp @@ -96,6 +96,7 @@ private slots: void digest_data(); void digest(); void alternateSubjectNames_data(); + void utf8SubjectNames(); void alternateSubjectNames(); void publicKey_data(); void publicKey(); @@ -407,6 +408,27 @@ void tst_QSslCertificate::alternateSubjectNames() } } +void tst_QSslCertificate::utf8SubjectNames() +{ + QSslCertificate cert = QSslCertificate::fromPath("certificates/cert-ss-san-utf8.pem", QSsl::Pem, + QRegExp::FixedString).first(); + QVERIFY(!cert.isNull()); + + // O is "Heavy Metal Records" with heavy use of "decorations" like accents, umlauts etc., + // OU uses arabian / asian script letters near codepoint 64K. + // strings split where the compiler would otherwise find three-digit hex numbers + static const char *o = "H\xc4\x95\xc4\x82\xc6\xb2\xc3\xbf \xca\x8d\xe1\xba\xbf\xca\x88\xe1\xba" + "\xb7\xe1\xb8\xbb R\xc3\xa9" "c" "\xc3\xb6rd\xc5\x9d"; + static const char *ou = "\xe3\x88\xa7" "A" "\xe3\x89\x81\xef\xbd\xab" "BC"; + + // the following two tests should help find "\x"-literal encoding bugs in the test itself + QCOMPARE(cert.subjectInfo("O").length(), QString::fromUtf8(o).length()); + QCOMPARE (cert.subjectInfo("O").toUtf8().toHex(), QByteArray(o).toHex()); + + QCOMPARE(cert.subjectInfo("O"), QString::fromUtf8(o)); + QCOMPARE(cert.subjectInfo("OU"), QString::fromUtf8(ou)); +} + void tst_QSslCertificate::publicKey_data() { QTest::addColumn("certFilePath"); @@ -519,13 +541,13 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"certificates/*\" fixed der") << QString("certificates/*") << int(QRegExp::FixedString) << false << 0; QTest::newRow("\"certificates/*\" regexp pem") << QString("certificates/*") << int(QRegExp::RegExp) << true << 0; QTest::newRow("\"certificates/*\" regexp der") << QString("certificates/*") << int(QRegExp::RegExp) << false << 0; - QTest::newRow("\"certificates/*\" wildcard pem") << QString("certificates/*") << int(QRegExp::Wildcard) << true << 4; + QTest::newRow("\"certificates/*\" wildcard pem") << QString("certificates/*") << int(QRegExp::Wildcard) << true << 5; QTest::newRow("\"certificates/*\" wildcard der") << QString("certificates/*") << int(QRegExp::Wildcard) << false << 0; QTest::newRow("\"c*/c*.pem\" fixed pem") << QString("c*/c*.pem") << int(QRegExp::FixedString) << true << 0; QTest::newRow("\"c*/c*.pem\" fixed der") << QString("c*/c*.pem") << int(QRegExp::FixedString) << false << 0; QTest::newRow("\"c*/c*.pem\" regexp pem") << QString("c*/c*.pem") << int(QRegExp::RegExp) << true << 0; QTest::newRow("\"c*/c*.pem\" regexp der") << QString("c*/c*.pem") << int(QRegExp::RegExp) << false << 0; - QTest::newRow("\"c*/c*.pem\" wildcard pem") << QString("c*/c*.pem") << int(QRegExp::Wildcard) << true << 4; + QTest::newRow("\"c*/c*.pem\" wildcard pem") << QString("c*/c*.pem") << int(QRegExp::Wildcard) << true << 5; QTest::newRow("\"c*/c*.pem\" wildcard der") << QString("c*/c*.pem") << int(QRegExp::Wildcard) << false << 0; QTest::newRow("\"d*/c*.pem\" fixed pem") << QString("d*/c*.pem") << int(QRegExp::FixedString) << true << 0; QTest::newRow("\"d*/c*.pem\" fixed der") << QString("d*/c*.pem") << int(QRegExp::FixedString) << false << 0; @@ -535,7 +557,7 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"d*/c*.pem\" wildcard der") << QString("d*/c*.pem") << int(QRegExp::Wildcard) << false << 0; QTest::newRow("\"c.*/c.*.pem\" fixed pem") << QString("c.*/c.*.pem") << int(QRegExp::FixedString) << true << 0; QTest::newRow("\"c.*/c.*.pem\" fixed der") << QString("c.*/c.*.pem") << int(QRegExp::FixedString) << false << 0; - QTest::newRow("\"c.*/c.*.pem\" regexp pem") << QString("c.*/c.*.pem") << int(QRegExp::RegExp) << true << 4; + QTest::newRow("\"c.*/c.*.pem\" regexp pem") << QString("c.*/c.*.pem") << int(QRegExp::RegExp) << true << 5; QTest::newRow("\"c.*/c.*.pem\" regexp der") << QString("c.*/c.*.pem") << int(QRegExp::RegExp) << false << 0; QTest::newRow("\"c.*/c.*.pem\" wildcard pem") << QString("c.*/c.*.pem") << int(QRegExp::Wildcard) << true << 0; QTest::newRow("\"c.*/c.*.pem\" wildcard der") << QString("c.*/c.*.pem") << int(QRegExp::Wildcard) << false << 0; @@ -546,7 +568,7 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"d.*/c.*.pem\" wildcard pem") << QString("d.*/c.*.pem") << int(QRegExp::Wildcard) << true << 0; QTest::newRow("\"d.*/c.*.pem\" wildcard der") << QString("d.*/c.*.pem") << int(QRegExp::Wildcard) << false << 0; #ifdef Q_OS_LINUX - QTest::newRow("absolute path wildcard pem") << QString(QDir::currentPath() + "/certificates/*.pem") << int(QRegExp::Wildcard) << true << 4; + QTest::newRow("absolute path wildcard pem") << QString(QDir::currentPath() + "/certificates/*.pem") << int(QRegExp::Wildcard) << true << 5; #endif QTest::newRow("trailing-whitespace") << QString("more-certificates/trailing-whitespace.pem") << int(QRegExp::FixedString) << true << 1; @@ -769,7 +791,7 @@ void tst_QSslCertificate::nulInCN() QString cn = cert.subjectInfo(QSslCertificate::CommonName); QVERIFY(cn != "www.bank.com"); - static const char realCN[] = "www.bank.com\\x00.badguy.com"; + static const char realCN[] = "www.bank.com\0.badguy.com"; QCOMPARE(cn, QString::fromLatin1(realCN, sizeof realCN - 1)); } -- cgit v0.12 From 83c37059df7f23be482d4ecb2c54603a3665a33d Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Tue, 24 May 2011 10:29:01 +0200 Subject: fix Symbian ordinals for merge request re. utf8 characters in SSL certs Task-number: QTBUG-7912 --- src/network/ssl/qsslsocket_openssl_symbols.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index 6cb4794..a940fcd 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -522,6 +522,7 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(ASN1_INTEGER_get, 48, libs.second ) RESOLVEFUNC(ASN1_STRING_data, 71, libs.second ) RESOLVEFUNC(ASN1_STRING_length, 76, libs.second ) + RESOLVEFUNC(ASN1_STRING_to_UTF8, 86, libs.second ) RESOLVEFUNC(BIO_ctrl, 184, libs.second ) RESOLVEFUNC(BIO_free, 209, libs.second ) RESOLVEFUNC(BIO_new, 222, libs.second ) @@ -612,7 +613,10 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(SSLv23_server_method, 191, libs.first ) RESOLVEFUNC(TLSv1_server_method, 200, libs.first ) RESOLVEFUNC(SSL_CTX_load_verify_locations, 34, libs.first ) - RESOLVEFUNC(X509_NAME_oneline, 1830, libs.second ) + RESOLVEFUNC(X509_NAME_entry_count, 1821, libs.second ) + RESOLVEFUNC(X509_NAME_get_entry, 1823, libs.second ) + RESOLVEFUNC(X509_NAME_ENTRY_get_data, 1808, libs.second ) + RESOLVEFUNC(X509_NAME_ENTRY_get_object, 1809, libs.second ) RESOLVEFUNC(X509_PUBKEY_get, 1844, libs.second ) RESOLVEFUNC(X509_STORE_free, 1939, libs.second ) RESOLVEFUNC(X509_STORE_new, 1942, libs.second ) -- cgit v0.12 From 154402f56dcf8303a6ce601a52215226af8d31ba Mon Sep 17 00:00:00 2001 From: Robert Hogan Date: Tue, 24 May 2011 11:04:27 +0200 Subject: Add QUrl::topLevelDomain() and move TLD table from QtNetwork to QtCore Move Qt's copy of the Mozilla public suffix list from QtNetwork to QtCore and use it to expose a new API function QUrl::topLevelDomain(). This function returns the section of the url that is a registrar-controlled top level domain. QtCore now exports a couple of functions to the other Qt modules: qTopLevelDomain, a helper function for QUrl::topLevelDomain(); and qIsEffectiveTLD(), a helper function for QNetworkCookeieJar. The motivation for this new API is to allow QtWebKit implement a Third-Party Cookie blocking policy. For this QtWebKit needs to know the element of the url that is the registry-controlled TLD. Without this knowledge it would end up blocking third-party cookies per host rather than per registry-controlled domain. See also https://bugs.webkit.org/show_bug.cgi?id=45455 Merge-request: 1205 Task-number: QTBUG-13601 Reviewed-by: Peter Hartmann --- src/corelib/io/io.pri | 3 + src/corelib/io/qtldurl.cpp | 117 + src/corelib/io/qtldurl_p.h | 66 + src/corelib/io/qurl.cpp | 19 +- src/corelib/io/qurl.h | 3 + src/corelib/io/qurltlds_p.h | 6481 ++++++++++++++++++++ src/corelib/io/qurltlds_p.h.INFO | 17 + src/network/access/access.pri | 1 - src/network/access/qnetworkcookiejar.cpp | 43 +- src/network/access/qnetworkcookiejar_p.h | 3 - src/network/access/qnetworkcookiejartlds_p.h | 6481 -------------------- src/network/access/qnetworkcookiejartlds_p.h.INFO | 17 - .../qnetworkcookiejar/tst_qnetworkcookiejar.cpp | 4 +- tests/auto/qurl/tst_qurl.cpp | 26 + util/corelib/qurl-generateTLDs/main.cpp | 161 + .../qurl-generateTLDs/qurl-generateTLDs.pro | 9 + .../cookiejar-generateTLDs.pro | 9 - util/network/cookiejar-generateTLDs/main.cpp | 161 - 18 files changed, 6905 insertions(+), 6716 deletions(-) create mode 100644 src/corelib/io/qtldurl.cpp create mode 100644 src/corelib/io/qtldurl_p.h create mode 100644 src/corelib/io/qurltlds_p.h create mode 100644 src/corelib/io/qurltlds_p.h.INFO delete mode 100644 src/network/access/qnetworkcookiejartlds_p.h delete mode 100644 src/network/access/qnetworkcookiejartlds_p.h.INFO create mode 100644 util/corelib/qurl-generateTLDs/main.cpp create mode 100644 util/corelib/qurl-generateTLDs/qurl-generateTLDs.pro delete mode 100644 util/network/cookiejar-generateTLDs/cookiejar-generateTLDs.pro delete mode 100644 util/network/cookiejar-generateTLDs/main.cpp diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri index f67600d..e411f8f 100644 --- a/src/corelib/io/io.pri +++ b/src/corelib/io/io.pri @@ -24,6 +24,8 @@ HEADERS += \ io/qresource_p.h \ io/qresource_iterator_p.h \ io/qurl.h \ + io/qurltlds_p.h \ + io/qtldurl_p.h \ io/qsettings.h \ io/qsettings_p.h \ io/qfsfileengine.h \ @@ -41,6 +43,7 @@ SOURCES += \ io/qbuffer.cpp \ io/qdatastream.cpp \ io/qdataurl.cpp \ + io/qtldurl.cpp \ io/qdebug.cpp \ io/qdir.cpp \ io/qdiriterator.cpp \ diff --git a/src/corelib/io/qtldurl.cpp b/src/corelib/io/qtldurl.cpp new file mode 100644 index 0000000..7db4bbd --- /dev/null +++ b/src/corelib/io/qtldurl.cpp @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qplatformdefs.h" +#include "qurl.h" +#include "private/qurltlds_p.h" +#include "private/qtldurl_p.h" +#include "QtCore/qstringlist.h" + +QT_BEGIN_NAMESPACE + +static bool containsTLDEntry(const QString &entry) +{ + int index = qHash(entry) % tldCount; + int currentDomainIndex = tldIndices[index]; + while (currentDomainIndex < tldIndices[index+1]) { + QString currentEntry = QString::fromUtf8(tldData + currentDomainIndex); + if (currentEntry == entry) + return true; + currentDomainIndex += qstrlen(tldData + currentDomainIndex) + 1; // +1 for the ending \0 + } + return false; +} + +/*! + \internal + + Return the top-level-domain per Qt's copy of the Mozilla public suffix list of + \a domain. +*/ + +Q_CORE_EXPORT QString qTopLevelDomain(const QString &domain) +{ + QStringList sections = domain.toLower().split(QLatin1Char('.'), QString::SkipEmptyParts); + if (sections.isEmpty()) + return QString(); + + QString level, tld; + for (int j = sections.count() - 1; j >= 0; --j) { + level.prepend(QLatin1Char('.') + sections.at(j)); + if (qIsEffectiveTLD(level.right(level.size() - 1))) + tld = level; + } + return tld; +} + +/*! + \internal + + Return true if \a domain is a top-level-domain per Qt's copy of the Mozilla public suffix list. +*/ + +Q_CORE_EXPORT bool qIsEffectiveTLD(const QString &domain) +{ + // for domain 'foo.bar.com': + // 1. return if TLD table contains 'foo.bar.com' + if (containsTLDEntry(domain)) + return true; + + if (domain.contains(QLatin1Char('.'))) { + int count = domain.size() - domain.indexOf(QLatin1Char('.')); + QString wildCardDomain; + wildCardDomain.reserve(count + 1); + wildCardDomain.append(QLatin1Char('*')); + wildCardDomain.append(domain.right(count)); + // 2. if table contains '*.bar.com', + // test if table contains '!foo.bar.com' + if (containsTLDEntry(wildCardDomain)) { + QString exceptionDomain; + exceptionDomain.reserve(domain.size() + 1); + exceptionDomain.append(QLatin1Char('!')); + exceptionDomain.append(domain); + return (! containsTLDEntry(exceptionDomain)); + } + } + return false; +} + +QT_END_NAMESPACE diff --git a/src/corelib/io/qtldurl_p.h b/src/corelib/io/qtldurl_p.h new file mode 100644 index 0000000..152ffa0 --- /dev/null +++ b/src/corelib/io/qtldurl_p.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTLDURL_P_H +#define QTLDURL_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of qDecodeDataUrl. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "QtCore/qurl.h" +#include "QtCore/qstring.h" + +QT_BEGIN_NAMESPACE + +Q_CORE_EXPORT QString qTopLevelDomain(const QString &domain); +Q_CORE_EXPORT bool qIsEffectiveTLD(const QString &domain); + +QT_END_NAMESPACE + +#endif // QDATAURL_P_H diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index efd3f45..c433d35 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -192,7 +192,9 @@ #if defined QT3_SUPPORT #include "qfileinfo.h" #endif - +#ifndef QT_BOOTSTRAPPED +#include "qtldurl_p.h" +#endif #if defined(Q_OS_WINCE_WM) #pragma optimize("g", off) #endif @@ -5593,6 +5595,21 @@ bool QUrl::hasFragment() const } /*! + \since 4.8 + + Returns the TLD (Top-Level Domain) of the URL, (e.g. .co.uk, .net). + Note that the return value is prefixed with a '.' unless the + URL does not contain a valid TLD, in which case the function returns + an empty string. +*/ +#ifndef QT_BOOTSTRAPPED +QString QUrl::topLevelDomain() const +{ + return qTopLevelDomain(host()); +} +#endif + +/*! Returns the result of the merge of this URL with \a relative. This URL is used as a base to convert \a relative to an absolute URL. diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h index 7534b8d..07b0b4e 100644 --- a/src/corelib/io/qurl.h +++ b/src/corelib/io/qurl.h @@ -181,6 +181,9 @@ public: void setEncodedFragment(const QByteArray &fragment); QByteArray encodedFragment() const; bool hasFragment() const; +#ifndef QT_BOOTSTRAPPED + QString topLevelDomain() const; +#endif QUrl resolved(const QUrl &relative) const; diff --git a/src/corelib/io/qurltlds_p.h b/src/corelib/io/qurltlds_p.h new file mode 100644 index 0000000..f4f525c --- /dev/null +++ b/src/corelib/io/qurltlds_p.h @@ -0,0 +1,6481 @@ +// Version: MPL 1.1/GPL 2.0/LGPL 2.1 +// +// The contents of this file are subject to the Mozilla Public License Version +// 1.1 (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the +// License. +// +// The Original Code is the Public Suffix List. +// +// The Initial Developer of the Original Code is +// Jo Hermans . +// Portions created by the Initial Developer are Copyright (C) 2007 +// the Initial Developer. All Rights Reserved. +// +// Contributor(s): +// Ruben Arakelyan +// Gervase Markham +// Pamela Greene +// David Triendl +// Jothan Frakes +// The kind representatives of many TLD registries +// +// Alternatively, the contents of this file may be used under the terms of +// either the GNU General Public License Version 2 or later (the "GPL"), or +// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +// in which case the provisions of the GPL or the LGPL are applicable instead +// of those above. If you wish to allow use of your version of this file only +// under the terms of either the GPL or the LGPL, and not to allow others to +// use your version of this file under the terms of the MPL, indicate your +// decision by deleting the provisions above and replace them with the notice +// and other provisions required by the GPL or the LGPL. If you do not delete +// the provisions above, a recipient may use your version of this file under +// the terms of any one of the MPL, the GPL or the LGPL. +// + +#ifndef QURLTLD_P_H +#define QURLTLD_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of the Network Access and Core framework. This header file may change from +// version to version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +// note to maintainer: +// this file should be updated before each release -> +// for instructions see the program at +// util/corelib/qurl-generateTLDs + +static const quint16 tldCount = 3949; +static const quint16 tldIndices[] = { +0, +7, +14, +14, +20, +51, +61, +93, +100, +100, +116, +159, +167, +180, +180, +193, +234, +234, +234, +255, +255, +255, +280, +280, +287, +287, +295, +303, +313, +326, +326, +380, +393, +413, +419, +419, +419, +424, +438, +438, +469, +515, +515, +515, +534, +534, +557, +557, +557, +557, +572, +572, +572, +579, +587, +597, +612, +612, +624, +636, +648, +662, +687, +709, +714, +740, +766, +789, +789, +805, +805, +810, +815, +815, +824, +824, +831, +857, +869, +891, +891, +916, +916, +916, +927, +934, +964, +971, +987, +987, +987, +1008, +1008, +1016, +1016, +1030, +1030, +1052, +1075, +1075, +1082, +1087, +1115, +1135, +1135, +1135, +1172, +1178, +1178, +1178, +1202, +1207, +1220, +1220, +1266, +1266, +1266, +1266, +1272, +1290, +1316, +1316, +1332, +1332, +1339, +1339, +1352, +1352, +1389, +1389, +1408, +1415, +1437, +1444, +1489, +1489, +1502, +1502, +1512, +1518, +1539, +1555, +1562, +1584, +1598, +1607, +1607, +1607, +1632, +1652, +1652, +1658, +1658, +1675, +1682, +1709, +1733, +1748, +1776, +1783, +1783, +1790, +1797, +1826, +1850, +1850, +1856, +1880, +1887, +1901, +1921, +1947, +1961, +1967, +1967, +1967, +1972, +1986, +1986, +1986, +2009, +2029, +2029, +2047, +2061, +2075, +2075, +2075, +2075, +2075, +2075, +2082, +2082, +2124, +2124, +2129, +2162, +2162, +2162, +2236, +2256, +2263, +2276, +2283, +2313, +2313, +2347, +2380, +2387, +2387, +2387, +2431, +2438, +2445, +2452, +2459, +2459, +2469, +2490, +2516, +2527, +2540, +2540, +2586, +2610, +2630, +2630, +2653, +2660, +2669, +2693, +2693, +2710, +2710, +2719, +2719, +2734, +2740, +2740, +2753, +2753, +2763, +2770, +2775, +2782, +2789, +2802, +2820, +2827, +2827, +2841, +2855, +2855, +2865, +2872, +2884, +2884, +2919, +2937, +2955, +2962, +3012, +3042, +3073, +3083, +3083, +3100, +3105, +3112, +3131, +3131, +3166, +3180, +3187, +3194, +3211, +3218, +3223, +3233, +3249, +3259, +3268, +3314, +3314, +3324, +3324, +3336, +3336, +3336, +3336, +3350, +3363, +3376, +3398, +3416, +3445, +3464, +3488, +3488, +3497, +3545, +3552, +3552, +3552, +3566, +3573, +3573, +3573, +3581, +3581, +3603, +3603, +3615, +3621, +3621, +3683, +3683, +3710, +3710, +3716, +3716, +3748, +3770, +3791, +3803, +3810, +3817, +3833, +3846, +3846, +3852, +3876, +3876, +3882, +3903, +3910, +3939, +3939, +3939, +3947, +3962, +3962, +3981, +3994, +4021, +4030, +4042, +4085, +4085, +4096, +4096, +4104, +4123, +4123, +4123, +4143, +4154, +4164, +4194, +4194, +4194, +4205, +4205, +4222, +4238, +4301, +4309, +4322, +4331, +4331, +4331, +4331, +4331, +4347, +4365, +4375, +4375, +4385, +4398, +4412, +4430, +4430, +4437, +4447, +4463, +4472, +4472, +4472, +4484, +4484, +4484, +4484, +4484, +4490, +4490, +4511, +4511, +4522, +4522, +4522, +4522, +4528, +4528, +4534, +4551, +4551, +4551, +4564, +4583, +4583, +4611, +4611, +4611, +4622, +4622, +4649, +4668, +4677, +4692, +4692, +4692, +4705, +4723, +4723, +4723, +4729, +4729, +4743, +4743, +4750, +4750, +4763, +4770, +4776, +4776, +4776, +4793, +4811, +4811, +4811, +4821, +4821, +4841, +4857, +4891, +4897, +4903, +4903, +4903, +4919, +4935, +4942, +4958, +4958, +4975, +4975, +4975, +4985, +4985, +5020, +5032, +5032, +5040, +5053, +5068, +5079, +5079, +5101, +5115, +5115, +5135, +5154, +5161, +5161, +5168, +5168, +5184, +5210, +5210, +5238, +5255, +5278, +5285, +5308, +5318, +5327, +5327, +5333, +5333, +5340, +5348, +5355, +5366, +5377, +5384, +5408, +5415, +5422, +5435, +5442, +5482, +5482, +5482, +5482, +5498, +5527, +5534, +5541, +5572, +5572, +5572, +5579, +5591, +5602, +5602, +5621, +5621, +5646, +5664, +5671, +5671, +5681, +5696, +5707, +5716, +5716, +5723, +5723, +5732, +5742, +5742, +5763, +5770, +5776, +5790, +5790, +5797, +5806, +5816, +5832, +5882, +5882, +5882, +5882, +5893, +5934, +5934, +5965, +5965, +5980, +5980, +5980, +5980, +6007, +6017, +6034, +6051, +6065, +6075, +6075, +6091, +6097, +6097, +6109, +6109, +6109, +6122, +6147, +6168, +6168, +6191, +6191, +6191, +6191, +6191, +6198, +6217, +6224, +6224, +6231, +6245, +6252, +6252, +6270, +6270, +6284, +6305, +6315, +6322, +6322, +6322, +6329, +6329, +6329, +6353, +6361, +6361, +6375, +6391, +6405, +6405, +6415, +6431, +6431, +6431, +6431, +6458, +6475, +6475, +6475, +6482, +6489, +6496, +6496, +6503, +6520, +6520, +6520, +6527, +6527, +6544, +6561, +6573, +6573, +6580, +6580, +6587, +6587, +6592, +6592, +6592, +6592, +6599, +6599, +6612, +6633, +6649, +6649, +6669, +6676, +6683, +6683, +6713, +6720, +6727, +6736, +6736, +6746, +6770, +6807, +6814, +6827, +6846, +6846, +6864, +6864, +6864, +6864, +6881, +6888, +6888, +6888, +6914, +6935, +6935, +6935, +6953, +6959, +6966, +6983, +6983, +6983, +7013, +7023, +7023, +7023, +7023, +7037, +7044, +7058, +7079, +7086, +7123, +7134, +7155, +7168, +7178, +7203, +7227, +7236, +7258, +7265, +7274, +7274, +7303, +7303, +7314, +7314, +7345, +7352, +7367, +7377, +7388, +7388, +7402, +7402, +7409, +7421, +7421, +7467, +7484, +7484, +7484, +7491, +7532, +7532, +7539, +7546, +7546, +7553, +7573, +7573, +7573, +7580, +7587, +7594, +7594, +7594, +7606, +7606, +7637, +7637, +7637, +7664, +7664, +7664, +7677, +7684, +7701, +7723, +7723, +7723, +7723, +7734, +7734, +7734, +7748, +7748, +7748, +7748, +7759, +7759, +7775, +7775, +7782, +7789, +7817, +7824, +7831, +7836, +7865, +7865, +7876, +7901, +7901, +7908, +7918, +7938, +7945, +7945, +7957, +7964, +7979, +7986, +7994, +8007, +8007, +8014, +8021, +8061, +8061, +8071, +8088, +8131, +8138, +8153, +8160, +8160, +8160, +8175, +8183, +8197, +8211, +8211, +8211, +8243, +8243, +8243, +8243, +8259, +8259, +8259, +8259, +8259, +8266, +8275, +8281, +8281, +8281, +8281, +8288, +8288, +8309, +8309, +8309, +8330, +8330, +8330, +8330, +8337, +8343, +8343, +8360, +8370, +8370, +8380, +8380, +8386, +8386, +8397, +8415, +8415, +8428, +8454, +8460, +8475, +8492, +8526, +8554, +8554, +8583, +8583, +8583, +8598, +8607, +8617, +8617, +8642, +8652, +8652, +8652, +8662, +8688, +8688, +8704, +8704, +8747, +8765, +8775, +8783, +8811, +8835, +8835, +8835, +8850, +8859, +8884, +8910, +8919, +8952, +8978, +8978, +8991, +8991, +8991, +8999, +8999, +8999, +9030, +9030, +9030, +9030, +9030, +9041, +9048, +9048, +9054, +9054, +9054, +9086, +9108, +9108, +9119, +9119, +9130, +9144, +9152, +9161, +9174, +9194, +9207, +9207, +9207, +9232, +9242, +9242, +9271, +9290, +9308, +9308, +9308, +9308, +9320, +9333, +9343, +9356, +9379, +9379, +9379, +9395, +9395, +9406, +9419, +9419, +9419, +9419, +9450, +9485, +9485, +9497, +9497, +9505, +9517, +9528, +9528, +9551, +9564, +9586, +9586, +9608, +9608, +9626, +9626, +9626, +9653, +9653, +9681, +9681, +9681, +9698, +9698, +9698, +9714, +9729, +9737, +9737, +9765, +9765, +9765, +9765, +9765, +9825, +9844, +9866, +9880, +9880, +9880, +9880, +9886, +9895, +9895, +9895, +9895, +9895, +9913, +9913, +9924, +9958, +9958, +9967, +9975, +9975, +9975, +9981, +9998, +9998, +9998, +10012, +10036, +10036, +10066, +10079, +10097, +10121, +10133, +10142, +10142, +10142, +10156, +10173, +10173, +10173, +10196, +10205, +10205, +10205, +10205, +10218, +10234, +10240, +10240, +10240, +10264, +10273, +10286, +10286, +10286, +10286, +10299, +10299, +10309, +10309, +10339, +10358, +10358, +10374, +10374, +10390, +10390, +10413, +10413, +10439, +10461, +10467, +10467, +10467, +10492, +10492, +10501, +10528, +10528, +10528, +10539, +10583, +10583, +10583, +10613, +10613, +10619, +10628, +10645, +10645, +10645, +10650, +10671, +10687, +10709, +10709, +10709, +10709, +10709, +10727, +10727, +10727, +10727, +10733, +10733, +10768, +10768, +10773, +10780, +10788, +10788, +10797, +10797, +10835, +10835, +10845, +10852, +10861, +10861, +10861, +10861, +10861, +10861, +10861, +10875, +10888, +10907, +10907, +10907, +10920, +10920, +10932, +10946, +10977, +10977, +10997, +11008, +11037, +11059, +11059, +11059, +11067, +11067, +11067, +11067, +11067, +11077, +11091, +11102, +11102, +11112, +11125, +11129, +11129, +11154, +11154, +11154, +11164, +11164, +11189, +11189, +11189, +11189, +11189, +11196, +11196, +11227, +11238, +11247, +11256, +11265, +11265, +11286, +11307, +11330, +11337, +11378, +11378, +11389, +11413, +11454, +11469, +11475, +11475, +11475, +11475, +11503, +11503, +11503, +11503, +11534, +11534, +11550, +11550, +11557, +11557, +11557, +11557, +11574, +11585, +11585, +11603, +11626, +11643, +11643, +11643, +11643, +11663, +11663, +11682, +11696, +11696, +11696, +11696, +11706, +11706, +11706, +11706, +11723, +11723, +11757, +11757, +11773, +11795, +11813, +11836, +11836, +11883, +11903, +11952, +11965, +11965, +11984, +11997, +12008, +12008, +12008, +12024, +12043, +12065, +12071, +12099, +12129, +12140, +12140, +12146, +12161, +12161, +12161, +12161, +12167, +12167, +12180, +12186, +12208, +12226, +12243, +12243, +12252, +12252, +12274, +12289, +12302, +12302, +12313, +12313, +12313, +12313, +12358, +12358, +12358, +12369, +12375, +12391, +12391, +12391, +12391, +12405, +12410, +12416, +12416, +12436, +12436, +12436, +12443, +12443, +12462, +12477, +12492, +12492, +12503, +12519, +12525, +12531, +12571, +12571, +12591, +12591, +12601, +12641, +12641, +12641, +12657, +12657, +12657, +12699, +12699, +12699, +12712, +12728, +12744, +12761, +12769, +12782, +12793, +12823, +12836, +12851, +12863, +12890, +12900, +12900, +12900, +12910, +12910, +12924, +12924, +12924, +12924, +12924, +12952, +12984, +13003, +13038, +13038, +13056, +13056, +13056, +13056, +13074, +13081, +13093, +13103, +13103, +13112, +13119, +13132, +13132, +13132, +13141, +13151, +13183, +13193, +13206, +13206, +13206, +13236, +13252, +13267, +13267, +13294, +13307, +13307, +13307, +13343, +13349, +13349, +13349, +13375, +13375, +13375, +13384, +13384, +13384, +13393, +13393, +13393, +13402, +13414, +13425, +13445, +13467, +13485, +13499, +13509, +13528, +13528, +13549, +13549, +13559, +13570, +13570, +13570, +13570, +13598, +13637, +13647, +13647, +13661, +13673, +13682, +13687, +13694, +13694, +13720, +13733, +13742, +13748, +13771, +13795, +13795, +13814, +13821, +13821, +13855, +13862, +13862, +13862, +13874, +13874, +13897, +13909, +13909, +13947, +13947, +13952, +13952, +13970, +13979, +13979, +13979, +14008, +14049, +14049, +14049, +14049, +14049, +14049, +14060, +14083, +14083, +14091, +14101, +14101, +14101, +14101, +14118, +14136, +14195, +14195, +14195, +14213, +14213, +14232, +14232, +14253, +14253, +14258, +14275, +14275, +14304, +14311, +14311, +14318, +14318, +14318, +14318, +14318, +14318, +14325, +14325, +14345, +14345, +14379, +14389, +14422, +14422, +14422, +14422, +14435, +14441, +14441, +14460, +14460, +14471, +14471, +14481, +14495, +14495, +14495, +14502, +14502, +14502, +14502, +14524, +14533, +14541, +14552, +14552, +14552, +14552, +14563, +14563, +14568, +14568, +14585, +14595, +14602, +14628, +14628, +14645, +14672, +14678, +14697, +14697, +14734, +14757, +14764, +14771, +14771, +14771, +14796, +14815, +14822, +14845, +14861, +14861, +14861, +14873, +14873, +14873, +14902, +14920, +14920, +14926, +14926, +14926, +14941, +14949, +14949, +14949, +14949, +14949, +14960, +14960, +14971, +14971, +14998, +15003, +15003, +15003, +15013, +15013, +15027, +15027, +15027, +15043, +15053, +15063, +15074, +15083, +15093, +15093, +15121, +15121, +15128, +15128, +15144, +15144, +15144, +15144, +15165, +15170, +15170, +15170, +15170, +15170, +15170, +15170, +15186, +15206, +15206, +15206, +15224, +15236, +15236, +15252, +15258, +15258, +15258, +15258, +15264, +15277, +15288, +15307, +15307, +15318, +15328, +15328, +15334, +15334, +15363, +15399, +15399, +15422, +15438, +15447, +15447, +15456, +15456, +15456, +15495, +15495, +15495, +15495, +15511, +15511, +15530, +15557, +15566, +15582, +15590, +15590, +15604, +15604, +15625, +15635, +15655, +15655, +15655, +15655, +15655, +15665, +15675, +15675, +15675, +15675, +15675, +15682, +15682, +15682, +15694, +15719, +15749, +15749, +15794, +15794, +15837, +15854, +15854, +15861, +15861, +15861, +15861, +15884, +15900, +15911, +15931, +15931, +15931, +15931, +15931, +15963, +15963, +15996, +16006, +16013, +16024, +16034, +16049, +16049, +16049, +16059, +16059, +16059, +16059, +16059, +16059, +16059, +16064, +16075, +16104, +16104, +16117, +16124, +16124, +16124, +16124, +16130, +16145, +16159, +16190, +16193, +16196, +16210, +16224, +16243, +16255, +16261, +16280, +16283, +16292, +16295, +16295, +16301, +16304, +16322, +16325, +16328, +16349, +16355, +16382, +16408, +16414, +16414, +16414, +16458, +16477, +16480, +16485, +16488, +16514, +16520, +16530, +16530, +16546, +16562, +16597, +16603, +16622, +16622, +16646, +16669, +16672, +16715, +16715, +16715, +16718, +16718, +16727, +16733, +16752, +16770, +16787, +16794, +16810, +16827, +16840, +16850, +16876, +16901, +16901, +16901, +16916, +16919, +16926, +16943, +16972, +16978, +16978, +16978, +16981, +17008, +17008, +17016, +17053, +17053, +17053, +17053, +17072, +17086, +17105, +17139, +17153, +17162, +17162, +17177, +17177, +17177, +17177, +17195, +17218, +17221, +17221, +17237, +17276, +17276, +17300, +17319, +17339, +17357, +17370, +17383, +17400, +17407, +17419, +17439, +17439, +17449, +17465, +17475, +17504, +17527, +17527, +17534, +17548, +17564, +17564, +17598, +17598, +17601, +17630, +17649, +17669, +17669, +17679, +17686, +17757, +17776, +17796, +17810, +17840, +17840, +17877, +17884, +17884, +17911, +17936, +17970, +17980, +17995, +17995, +18008, +18011, +18036, +18075, +18097, +18097, +18104, +18115, +18115, +18129, +18134, +18141, +18141, +18157, +18180, +18190, +18217, +18224, +18252, +18284, +18284, +18296, +18299, +18312, +18322, +18338, +18348, +18348, +18363, +18372, +18387, +18387, +18390, +18402, +18445, +18445, +18445, +18466, +18479, +18479, +18498, +18508, +18511, +18511, +18511, +18511, +18511, +18526, +18558, +18586, +18622, +18643, +18670, +18686, +18710, +18720, +18739, +18739, +18742, +18745, +18771, +18774, +18777, +18791, +18813, +18816, +18822, +18839, +18845, +18851, +18854, +18878, +18881, +18896, +18896, +18899, +18926, +18937, +18940, +18953, +18963, +19010, +19010, +19017, +19046, +19060, +19060, +19087, +19095, +19101, +19101, +19128, +19146, +19157, +19157, +19188, +19198, +19205, +19223, +19230, +19255, +19280, +19280, +19283, +19292, +19301, +19320, +19323, +19323, +19341, +19341, +19365, +19378, +19381, +19394, +19423, +19433, +19440, +19466, +19490, +19490, +19490, +19497, +19504, +19511, +19511, +19518, +19545, +19568, +19575, +19575, +19583, +19586, +19592, +19592, +19609, +19622, +19629, +19641, +19641, +19656, +19673, +19700, +19723, +19733, +19746, +19759, +19769, +19782, +19789, +19795, +19831, +19834, +19841, +19851, +19854, +19880, +19895, +19898, +19898, +19911, +19922, +19950, +20020, +20030, +20059, +20062, +20089, +20107, +20151, +20154, +20175, +20205, +20208, +20229, +20229, +20255, +20261, +20261, +20283, +20335, +20362, +20385, +20392, +20392, +20392, +20392, +20418, +20418, +20418, +20418, +20443, +20446, +20446, +20452, +20452, +20467, +20467, +20489, +20489, +20498, +20525, +20554, +20560, +20575, +20589, +20589, +20589, +20614, +20652, +20659, +20659, +20668, +20679, +20679, +20679, +20685, +20685, +20685, +20685, +20685, +20685, +20696, +20733, +20760, +20766, +20769, +20792, +20792, +20792, +20792, +20813, +20813, +20813, +20813, +20826, +20826, +20846, +20862, +20880, +20887, +20901, +20908, +20933, +20938, +20958, +20969, +20978, +20978, +20978, +20985, +20985, +20985, +21000, +21010, +21010, +21014, +21026, +21033, +21041, +21041, +21051, +21051, +21064, +21071, +21113, +21120, +21120, +21127, +21134, +21142, +21164, +21164, +21164, +21188, +21195, +21208, +21215, +21226, +21226, +21226, +21238, +21249, +21255, +21255, +21265, +21279, +21296, +21301, +21315, +21321, +21331, +21331, +21331, +21337, +21343, +21343, +21351, +21351, +21361, +21368, +21383, +21383, +21389, +21413, +21437, +21449, +21462, +21478, +21506, +21534, +21546, +21546, +21557, +21580, +21595, +21595, +21595, +21595, +21626, +21626, +21646, +21670, +21676, +21688, +21688, +21716, +21731, +21762, +21762, +21762, +21762, +21762, +21783, +21789, +21799, +21828, +21828, +21837, +21845, +21868, +21874, +21874, +21880, +21880, +21889, +21901, +21910, +21941, +21941, +21959, +21959, +21959, +21966, +21966, +21972, +21972, +21995, +22011, +22043, +22043, +22051, +22051, +22060, +22060, +22060, +22074, +22086, +22086, +22099, +22099, +22120, +22120, +22134, +22144, +22150, +22158, +22164, +22164, +22171, +22199, +22210, +22210, +22210, +22220, +22228, +22228, +22239, +22261, +22304, +22304, +22312, +22349, +22349, +22349, +22357, +22381, +22381, +22390, +22390, +22390, +22390, +22402, +22413, +22413, +22422, +22422, +22445, +22445, +22445, +22456, +22456, +22469, +22479, +22501, +22512, +22528, +22528, +22528, +22528, +22528, +22528, +22528, +22540, +22540, +22546, +22546, +22546, +22546, +22569, +22591, +22591, +22591, +22591, +22610, +22655, +22655, +22667, +22667, +22677, +22677, +22692, +22692, +22702, +22702, +22702, +22717, +22736, +22750, +22755, +22780, +22785, +22822, +22844, +22859, +22871, +22909, +22949, +22962, +22973, +22979, +22988, +23007, +23027, +23035, +23072, +23082, +23082, +23109, +23116, +23130, +23158, +23166, +23166, +23172, +23177, +23189, +23219, +23219, +23250, +23273, +23281, +23281, +23281, +23281, +23281, +23287, +23287, +23299, +23305, +23315, +23315, +23321, +23328, +23334, +23355, +23355, +23355, +23355, +23355, +23366, +23390, +23396, +23396, +23396, +23396, +23402, +23418, +23424, +23424, +23438, +23446, +23446, +23446, +23500, +23525, +23569, +23592, +23592, +23592, +23605, +23614, +23614, +23614, +23627, +23633, +23657, +23673, +23673, +23673, +23689, +23689, +23701, +23701, +23701, +23713, +23713, +23713, +23738, +23758, +23775, +23775, +23794, +23794, +23803, +23803, +23803, +23803, +23813, +23826, +23845, +23845, +23845, +23845, +23872, +23872, +23872, +23888, +23888, +23900, +23900, +23906, +23906, +23906, +23906, +23906, +23924, +23924, +23924, +23930, +23930, +23939, +23949, +23971, +23971, +23971, +24000, +24012, +24042, +24042, +24042, +24042, +24042, +24070, +24076, +24094, +24094, +24094, +24123, +24123, +24123, +24134, +24150, +24150, +24150, +24150, +24150, +24150, +24155, +24179, +24179, +24189, +24189, +24189, +24198, +24198, +24218, +24218, +24218, +24234, +24251, +24257, +24276, +24305, +24321, +24321, +24321, +24334, +24334, +24334, +24349, +24356, +24361, +24372, +24372, +24372, +24388, +24396, +24396, +24402, +24410, +24410, +24428, +24428, +24450, +24450, +24467, +24485, +24495, +24495, +24495, +24507, +24507, +24514, +24531, +24531, +24531, +24531, +24531, +24537, +24537, +24558, +24572, +24584, +24584, +24601, +24601, +24607, +24615, +24615, +24632, +24632, +24632, +24632, +24661, +24676, +24676, +24724, +24751, +24751, +24774, +24774, +24783, +24793, +24793, +24793, +24813, +24819, +24819, +24826, +24826, +24842, +24858, +24872, +24872, +24890, +24890, +24890, +24890, +24890, +24890, +24890, +24890, +24890, +24906, +24906, +24917, +24928, +24947, +24947, +24947, +24947, +24947, +24947, +24947, +24947, +24947, +24963, +24983, +24991, +24991, +24991, +24991, +24991, +24991, +24991, +24991, +25007, +25007, +25007, +25007, +25007, +25007, +25007, +25030, +25040, +25040, +25040, +25040, +25040, +25059, +25097, +25132, +25149, +25159, +25169, +25169, +25169, +25192, +25192, +25192, +25192, +25205, +25205, +25216, +25221, +25221, +25233, +25233, +25240, +25250, +25256, +25273, +25273, +25303, +25321, +25321, +25321, +25333, +25333, +25333, +25333, +25370, +25370, +25402, +25418, +25418, +25439, +25439, +25454, +25454, +25454, +25463, +25477, +25526, +25526, +25526, +25526, +25545, +25562, +25572, +25572, +25582, +25582, +25582, +25597, +25610, +25634, +25641, +25641, +25641, +25668, +25668, +25675, +25707, +25727, +25727, +25741, +25756, +25756, +25779, +25811, +25811, +25811, +25817, +25817, +25817, +25827, +25827, +25827, +25827, +25827, +25836, +25836, +25836, +25836, +25850, +25850, +25860, +25884, +25901, +25922, +25936, +25946, +25969, +25969, +25969, +25969, +25975, +25975, +25987, +25987, +26065, +26065, +26065, +26084, +26084, +26103, +26128, +26141, +26151, +26169, +26169, +26169, +26180, +26191, +26191, +26191, +26197, +26197, +26205, +26211, +26235, +26235, +26235, +26235, +26235, +26235, +26245, +26245, +26259, +26259, +26259, +26259, +26284, +26284, +26325, +26325, +26355, +26364, +26364, +26402, +26418, +26418, +26425, +26432, +26432, +26454, +26504, +26513, +26525, +26525, +26525, +26525, +26525, +26545, +26545, +26571, +26590, +26597, +26597, +26597, +26597, +26597, +26639, +26648, +26659, +26666, +26672, +26672, +26672, +26672, +26672, +26694, +26701, +26701, +26701, +26724, +26724, +26746, +26753, +26774, +26774, +26774, +26774, +26806, +26824, +26824, +26830, +26852, +26882, +26882, +26889, +26889, +26889, +26889, +26889, +26889, +26903, +26911, +26918, +26918, +26928, +26948, +26948, +26970, +26970, +26985, +26996, +27045, +27045, +27058, +27058, +27068, +27068, +27104, +27155, +27155, +27155, +27155, +27155, +27172, +27172, +27172, +27172, +27189, +27195, +27195, +27223, +27223, +27223, +27223, +27244, +27290, +27322, +27332, +27364, +27371, +27371, +27371, +27401, +27401, +27417, +27417, +27431, +27470, +27470, +27470, +27470, +27484, +27484, +27484, +27484, +27484, +27496, +27496, +27515, +27515, +27543, +27560, +27576, +27604, +27622, +27631, +27631, +27638, +27649, +27672, +27682, +27682, +27682, +27707, +27717, +27724, +27732, +27755, +27755, +27755, +27768, +27768, +27783, +27789, +27799, +27799, +27799, +27818, +27826, +27838, +27848, +27848, +27848, +27855, +27862, +27862, +27896, +27921, +27921, +27943, +27954, +27954, +27976, +27976, +27976, +27985, +28002, +28012, +28019, +28034, +28034, +28046, +28068, +28097, +28122, +28122, +28131, +28137, +28151, +28151, +28172, +28190, +28196, +28211, +28211, +28264, +28273, +28286, +28324, +28324, +28324, +28354, +28354, +28361, +28397, +28417, +28417, +28424, +28435, +28461, +28461, +28470, +28483, +28483, +28483, +28483, +28483, +28483, +28483, +28515, +28531, +28531, +28549, +28575, +28575, +28575, +28582, +28599, +28615, +28630, +28630, +28672, +28711, +28723, +28723, +28731, +28752, +28752, +28752, +28763, +28763, +28775, +28775, +28775, +28775, +28775, +28775, +28805, +28814, +28830, +28861, +28882, +28882, +28902, +28918, +28937, +28952, +28959, +28998, +29009, +29009, +29009, +29009, +29019, +29019, +29019, +29019, +29019, +29057, +29069, +29076, +29076, +29076, +29076, +29076, +29082, +29082, +29082, +29117, +29117, +29117, +29117, +29134, +29134, +29159, +29159, +29185, +29185, +29196, +29196, +29242, +29248, +29256, +29280, +29301, +29307, +29307, +29307, +29314, +29314, +29338, +29356, +29367, +29367, +29381, +29391, +29399, +29399, +29414, +29434, +29434, +29441, +29473, +29484, +29503, +29520, +29520, +29548, +29565, +29572, +29572, +29572, +29572, +29572, +29597, +29597, +29620, +29655, +29660, +29660, +29660, +29667, +29674, +29688, +29698, +29705, +29728, +29740, +29740, +29761, +29761, +29767, +29780, +29787, +29794, +29794, +29807, +29820, +29820, +29820, +29820, +29832, +29844, +29855, +29855, +29855, +29867, +29867, +29867, +29867, +29881, +29881, +29905, +29905, +29905, +29923, +29923, +29948, +29948, +29948, +29976, +29986, +29996, +29996, +30030, +30030, +30054, +30054, +30070, +30070, +30070, +30077, +30077, +30087, +30107, +30107, +30115, +30141, +30178, +30178, +30201, +30201, +30201, +30207, +30229, +30239, +30254, +30268, +30277, +30311, +30323, +30323, +30331, +30331, +30331, +30331, +30331, +30353, +30365, +30374, +30374, +30374, +30380, +30380, +30380, +30380, +30410, +30410, +30410, +30443, +30443, +30453, +30462, +30472, +30472, +30472, +30472, +30472, +30472, +30489, +30500, +30500, +30500, +30532, +30532, +30553, +30577, +30599, +30599, +30609, +30640, +30640, +30640, +30664, +30676, +30676, +30676, +30692, +30719, +30728, +30728, +30742, +30742, +30749, +30749, +30760, +30770, +30770, +30783, +30783, +30783, +30804, +30847, +30847, +30847, +30847, +30857, +30857, +30857, +30857, +30875, +30875, +30895, +30895, +30921, +30926, +30926, +30926, +30945, +30945, +30945, +30945, +30959, +30959, +30959, +30959, +30972, +30972, +30984, +31011, +31011, +31048, +31056, +31056, +31070, +31077, +31077, +31110, +31110, +31115, +31122, +31139, +31159, +31159, +31165, +31171, +31171, +31197, +31204, +31211, +31211, +31221, +31228, +31228, +31245, +31245, +31245, +31252, +31265, +31265, +31265, +31265, +31294, +31305, +31320, +31333, +31333, +31333, +31343, +31350, +31357, +31369, +31369, +31379, +31385, +31391, +31407, +31407, +31407, +31423, +31423, +31423, +31434, +31454, +31470, +31511, +31521, +31521, +31521, +31542, +31582, +31582, +31597, +31597, +31597, +31614, +31623, +31645, +31645, +31661, +31661, +31669, +31669, +31676, +31676, +31706, +31720, +31726, +31743, +31785, +31804, +31817, +31817, +31835, +31846, +31863, +31885, +31885, +31896, +31907, +31907, +31907, +31922, +31922, +31929, +31929, +31929, +31936, +31943, +31949, +31949, +31949, +31959, +32006, +32024, +32031, +32031, +32038, +32063, +32095, +32095, +32105, +32105, +32105, +32105, +32105, +32125, +32134, +32140, +32176, +32185, +32195, +32195, +32195, +32195, +32202, +32202, +32218, +32236, +32259, +32294, +32300, +32305, +32305, +32305, +32323, +32337, +32352, +32359, +32374, +32381, +32388, +32388, +32388, +32402, +32402, +32402, +32402, +32418, +32428, +32428, +32428, +32450, +32450, +32450, +32462, +32467, +32480, +32480, +32480, +32487, +32502, +32509, +32525, +32560, +32570, +32583, +32597, +32623, +32637, +32644, +32667, +32707, +32725, +32725, +32747, +32747, +32751, +32758, +32789, +32807, +32824, +32824, +32824, +32824, +32843, +32843, +32850, +32876, +32908, +32915, +32946, +32965, +32965, +32982, +33002, +33009, +33029, +33064, +33084, +33098, +33098, +33098, +33098, +33110, +33110, +33151, +33158, +33180, +33198, +33205, +33227, +33227, +33237, +33237, +33253, +33258, +33277, +33292, +33315, +33315, +33333, +33348, +33348, +33348, +33348, +33348, +33348, +33348, +33355, +33355, +33355, +33390, +33408, +33423, +33437, +33452, +33458, +33465, +33480, +33480, +33487, +33494, +33504, +33511, +33551, +33551, +33558, +33589, +33595, +33595, +33602, +33627, +33644, +33668, +33668, +33668, +33676, +33676, +33716, +33728, +33747, +33747, +33769, +33775, +33789, +33803, +33803, +33810, +33810, +33810, +33820, +33820, +33820, +33820, +33843, +33843, +33843, +33879, +33889, +33889, +33889, +33903, +33917, +33931, +33959, +33993, +34000, +34014, +34037, +34043, +34055, +34055, +34077, +34083, +34090, +34099, +34099, +34115, +34115, +34133, +34140, +34167, +34172, +34184, +34221, +34245, +34252, +34252, +34259, +34318, +34318, +34325, +34325, +34352, +34400, +34415, +34422, +34422, +34431, +34438, +34445, +34445, +34473, +34473, +34489, +34489, +34489, +34489, +34499, +34499, +34499, +34516, +34536, +34551, +34564, +34580, +34580, +34580, +34589, +34589, +34589, +34613, +34648, +34648, +34648, +34655, +34664, +34681, +34681, +34698, +34698, +34720, +34736, +34749, +34749, +34765, +34778, +34785, +34795, +34819, +34819, +34829, +34841, +34848, +34854, +34854, +34854, +34878, +34894, +34894, +34900, +34917, +34934, +34940, +34970, +34998, +34998, +35004, +35004, +35012, +35012, +35012, +35020, +35020, +35032, +35038, +35062, +35062, +35062, +35068, +35068, +35082, +35092, +35096, +35107, +35118, +35134, +35155, +35155, +35166, +35178, +35178, +35195, +35201, +35201, +35201, +35226, +35226, +35226, +35226, +35256, +35262, +35272, +35280, +35299, +35332, +35354, +35354, +35354, +35370, +35386, +35417, +35417, +35460, +35473, +35478, +35495, +35504, +35504, +35518, +35552, +35589, +35624, +35624, +35637, +35637, +35643, +35643, +35669, +35682, +35695, +35702, +35709, +35709, +35726, +35739, +35749, +35756, +35756, +35778, +35803, +35810, +35829, +35883, +35899, +35905, +35911, +35911, +35923, +35947, +35954, +35980, +35987, +36034, +36052, +36063, +36095, +36106, +36106, +36113, +36120, +36140, +36140, +36153, +36160, +36160, +36167, +36203, +36203, +36218, +36218, +36225, +36253, +36259, +36284, +36296, +36310, +36324, +36331, +36344, +36367, +36367, +36367, +36412, +36412, +36422, +36463, +36463, +36463, +36479, +36490, +36513, +36520, +36520, +36527, +36527, +36527, +36540, +36574, +36594, +36594, +36605, +36621, +36621, +36641, +36641, +36641, +36659, +36682, +36682, +36682, +36682, +36705, +36705, +36705, +36720, +36720, +36755, +36755, +36771, +36771, +36771, +36788, +36806, +36835, +36845, +36875, +36875, +36903, +36921, +36928, +36928, +36940, +36940, +36940, +36966, +36966, +36973, +36983, +36998, +37004, +37014, +37024, +37024, +37032, +37038, +37038, +37061, +37074, +37074, +37091, +37098, +37105, +37105, +37133, +37141, +37141, +37148, +37191, +37191, +37197, +37197, +37210, +37224, +37224, +37231, +37250, +37257, +37273, +37273, +37280, +37287, +37294, +37300, +37307, +37330, +37348, +37348, +37359, +37359, +37359, +37377, +37392, +37398, +37412, +37431, +37469, +37486, +37508, +37517, +37535, +37535, +37542, +37542, +37549, +37549, +37549, +37549, +37556, +37576, +37576, +37583, +37590, +37597, +37604, +37604, +37621, +37635, +37676, +37676, +37704, +37711, +37728, +37728, +37737, +37737, +37737, +37750, +37757, +37778, +37785, +37785, +37819, +37826, +37833, +37843, +37850, +37869, +37914, +37921, +37935, +37942, +37949, +37982, +38013, +38013, +38013, +38023, +38057, +38077, +38097, +38110, +38117, +38123, +38133, +38133, +38133, +38140, +38140, +38148, +38159, +38179, +38192, +38205, +38218, +38218, +38218, +38218, +38218, +38218, +38218, +38218, +38218, +38218, +38218, +38218, +38225, +38225, +38230, +38246, +38258, +38280, +38287, +38294, +38294, +38294, +38301, +38318, +38318, +38340, +38371, +38371, +38384, +38420, +38440, +38453, +38481, +38506, +38522, +38534, +38559, +38559, +38559, +38564, +38564, +38581, +38604, +38604, +38611, +38620, +38626, +38635, +38635, +38635, +38666, +38674, +38688, +38693, +38710, +38722, +38722, +38722, +38729, +38734, +38752, +38792, +38818, +38825, +38861, +38902, +38934, +38949, +38949, +38960, +38969, +38985, +38985, +38996, +39013, +39024, +39024, +39032, +39061, +39074, +39089, +39123, +39123, +39123, +39140, +39161, +39180, +39206, +39215, +39254, +39261, +39277, +39284, +39314, +39314, +39330, +39340, +39340, +39371, +39371, +39392, +39430, +39430, +39437, +39444, +39461, +39468, +39468, +39485, +39517, +39524, +39538, +39543, +39548, +39555, +39581, +39588, +39588, +39609, +39609, +39616, +39652, +39670, +39677, +39677, +39684, +39691, +39702, +39717, +39717, +39717, +39724, +39749, +39760, +39766, +39775, +39791, +39791, +39814, +39827, +39827, +39837, +39859}; + +static const char tldData[] = { +"com.cn\0" +"com.co\0" +"hb.cn\0" +"med.br\0conf.lv\0wallonie.museum\0" +"namsos.no\0" +"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0farmers.museum\0rel.pl\0" +"com.cu\0" +"military.museum\0" +"*.jm\0convent.museum\0cymru.museum\0malvik.no\0" +"univ.sn\0" +"gliding.aero\0" +"wodzislaw.pl\0" +"com.dm\0!pref.iwate.jp\0tran\xc3\xb8y.no\0pila.pl\0" +"mb.it\0*.ke\0lib.ri.us\0" +"com.ec\0*.kh\0tr\xc3\xb8gstad.no\0" +"com.ee\0" +"mobi.gp\0" +"gran.no\0" +"wa.gov.au\0" +"com.dz\0kg.kr\0" +"zoological.museum\0gjerstad.no\0haugesund.no\0kharkov.ua\0" +"walbrzych.pl\0" +"civilization.museum\0" +"ha.no\0" +"*.kw\0" +"med.ec\0com.es\0" +"med.ee\0otago.museum\0svelvik.no\0" +"art.ht\0amber.museum\0elvendrell.museum\0rost.no\0" +"jx.cn\0gratangen.no\0" +"association.aero\0ca.it\0" +"zaporizhzhe.ua\0" +"com.fr\0" +"szex.hu\0" +"e-burg.ru\0" +"com.ge\0bokn.no\0" +"mordovia.ru\0" +"com.gh\0*.mm\0" +"com.gi\0z.se\0" +"cahcesuolo.no\0" +"hurdal.no\0joshkar-ola.ru\0" +"cadaques.museum\0ma.us\0" +"a.bg\0" +"com.gn\0bozen.it\0tambov.ru\0" +"*.gifu.jp\0*.tokyo.jp\0*.mt\0" +"com.gp\0travel\0cc.tx.us\0" +"com.gr\0hemne.no\0" +"*.ni\0" +"*.mz\0" +"cc.il.us\0" +"com.gy\0" +"zj.cn\0oksnes.no\0museum.tt\0" +"com.hk\0*.np\0" +"rc.it\0baseball.museum\0" +"com.hn\0exhibition.museum\0" +"h\xc3\xa1""bmer.no\0" +"com.hr\0" +"fg.it\0stathelle.no\0defense.tn\0" +"com.ht\0" +"qld.gov.au\0*.nz\0" +"davvenj\xc3\xa1rga.no\0*.om\0" +"vang.no\0" +"*.kumamoto.jp\0" +"vercelli.it\0usenet.pl\0" +"com.io\0stalbans.museum\0" +"com.iq\0" +"*.pg\0" +"com.is\0klabu.no\0skiptvet.no\0" +"med.ht\0field.museum\0" +"gr.it\0gj\xc3\xb8vik.no\0tromsa.no\0lib.mi.us\0" +"ca.na\0" +"hagebostad.no\0k12.ma.us\0" +"*.qa\0" +"*.niigata.jp\0" +"monzaebrianza.it\0com.jo\0comunica\xc3\xa7\xc3\xb5""es.museum\0" +"gr.jp\0" +"ballangen.no\0*.py\0" +"scienceandindustry.museum\0" +"nuoro.it\0com.kg\0" +"com.ki\0" +"im.it\0idv.tw\0" +"*.akita.jp\0com.km\0r\xc3\xb8ros.no\0sopot.pl\0" +"!pref.yamanashi.jp\0" +"com.kp\0" +"!pref.kochi.jp\0com.la\0" +"com.lb\0" +"com.lc\0stjordalshalsen.no\0sigdal.no\0cc.nm.us\0" +"samnanger.no\0" +"drobak.no\0" +"vt.it\0" +"catering.aero\0com.ky\0" +"com.kz\0cc.ca.us\0" +"com.lk\0" +"grosseto.it\0mosvik.no\0" +"namsskogan.no\0" +"loten.no\0" +"chirurgiens-dentistes.fr\0" +"com.lr\0bremanger.no\0" +"gs.cn\0" +"com.lv\0lib.co.us\0" +"com.mg\0" +"passenger-association.aero\0" +"com.ly\0yekaterinburg.ru\0" +"vladivostok.ru\0" +"com.mk\0beeldengeluid.museum\0" +"com.ml\0" +"art.pl\0" +"com.mo\0" +"britishcolumbia.museum\0tx.us\0" +"com.na\0sakhalin.ru\0*.sv\0" +"mc.it\0" +"amsterdam.museum\0udm.ru\0" +"com.mu\0" +"com.mv\0com.nf\0" +"com.mw\0com.ng\0il.us\0" +"geometre-expert.fr\0com.mx\0" +"med.ly\0com.my\0" +"ag.it\0" +"*.tr\0" +"!pref.oita.jp\0" +"hoyanger.no\0skedsmo.no\0" +"com.nr\0turystyka.pl\0" +"koebenhavn.museum\0" +"quebec.museum\0" +"stord.no\0*.uk\0" +"act.au\0" +"br.it\0cb.it\0gyeonggi.kr\0jobs.tt\0lib.hi.us\0" +"*.ve\0" +"*.saga.jp\0wildlife.museum\0com.pa\0" +"monzabrianza.it\0sciencehistory.museum\0stange.no\0oskol.ru\0principe.st\0*.uy\0" +"plaza.museum\0com.pe\0" +"com.pf\0" +"eigersund.no\0" +"com.ph\0" +"manx.museum\0marylhurst.museum\0" +"md.ci\0pi.it\0schweiz.museum\0com.pk\0" +"grp.lk\0fr\xc3\xb8ya.no\0com.pl\0press.se\0" +"us.com\0" +"b.bg\0cremona.it\0communication.museum\0art.sn\0" +"med.pa\0" +"com.pr\0" +"com.ps\0" +"com.pt\0" +"k12.in.us\0" +"ah.cn\0bahcavuotna.no\0" +"sondrio.it\0arkhangelsk.ru\0" +"cargo.aero\0" +"council.aero\0" +"museum.mv\0hattfjelldal.no\0spydeberg.no\0med.pl\0" +"niepce.museum\0museum.mw\0" +"anthropology.museum\0" +"pharmacien.fr\0smola.no\0" +"fin.ec\0" +"selbu.no\0" +"workinggroup.aero\0nm.us\0" +"museum.no\0com.re\0" +"cc.vt.us\0" +"village.museum\0" +"ca.us\0" +"*.sapporo.jp\0" +"teramo.it\0" +"com.ro\0" +"*.ye\0" +"com.sa\0" +"com.sb\0" +"so.it\0com.sc\0" +"jolster.no\0com.sd\0" +"com.ru\0" +"com.rw\0com.sg\0" +"sydney.museum\0" +"sa.edu.au\0" +"tom.ru\0" +"com.sl\0*.za\0" +"\xe7\xbd\x91\xe7\xb5\xa1.hk\0naturbruksgymn.se\0com.sn\0" +"assedic.fr\0com.so\0" +"!pref.mie.jp\0*.yu\0" +"med.sa\0" +"newspaper.museum\0holmestrand.no\0dnepropetrovsk.ua\0" +"christiansburg.museum\0roan.no\0" +"pesaro-urbino.it\0med.sd\0com.st\0" +"s\xc3\xb8gne.no\0" +"nuernberg.museum\0" +"*.zm\0" +"com.sy\0" +"*.nagano.jp\0com.tj\0" +"nt.gov.au\0news.hu\0paderborn.museum\0" +"boston.museum\0" +"com.tn\0" +"com.to\0" +"broadcast.museum\0" +"com.ua\0" +"*.zw\0" +"baikal.ru\0" +"bykle.no\0com.tt\0" +"verdal.no\0" +"roros.no\0" +"fi.cr\0carboniaiglesias.it\0chuvashia.ru\0com.tw\0" +"k12.ca.us\0" +"eidsvoll.no\0" +"*.ishikawa.jp\0" +"dolls.museum\0" +"naval.museum\0" +"karasjok.no\0tysvar.no\0" +"bielawa.pl\0com.vc\0" +"svalbard.no\0deatnu.no\0rnd.ru\0" +"grandrapids.museum\0" +"bauern.museum\0k12.pr.us\0" +"press.ma\0" +"*.kagawa.jp\0fribourg.museum\0przeworsk.pl\0com.vi\0" +"com.uz\0" +"babia-gora.pl\0" +"com.vn\0" +"med.pro\0" +"suedtirol.it\0kursk.ru\0" +"bonn.museum\0" +"lt.it\0" +"design.aero\0microlight.aero\0americanantiques.museum\0meland.no\0" +"insurance.aero\0aarborte.no\0" +"kh.ua\0" +"macerata.it\0architecture.museum\0" +"rovigo.it\0rawa-maz.pl\0" +"store.nf\0levanger.no\0" +"b\xc3\xa1jddar.no\0" +"not.br\0" +"com.ws\0" +"!pref.kagawa.jp\0" +"!omanpost.om\0" +"vt.us\0" +"gs.ah.no\0vladikavkaz.ru\0" +"no.it\0" +"in.na\0szkola.pl\0a.se\0" +"aid.pl\0" +"workshop.museum\0vegarshei.no\0" +"sund.no\0" +"bs.it\0flora.no\0" +"agriculture.museum\0" +"koeln.museum\0" +"minnesota.museum\0k12.il.us\0" +"froya.no\0" +"aeroport.fr\0" +"davvenjarga.no\0zgora.pl\0ivano-frankivsk.ua\0" +"*.gunma.jp\0" +"amot.no\0" +"mus.br\0chungbuk.kr\0" +"ggf.br\0lorenskog.no\0" +"jeonbuk.kr\0" +"k12.vi.us\0" +"c.bg\0sande.more-og-romsdal.no\0" +"perugia.it\0" +"massa-carrara.it\0" +"michigan.museum\0" +"archaeology.museum\0mosj\xc3\xb8""en.no\0czest.pl\0koenig.ru\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0" +"mobi.tt\0" +"kraanghke.no\0" +"cc.in.us\0" +"re.it\0lib.vt.us\0" +"dell-ogliastra.it\0" +"s\xc3\xb8mna.no\0" +"k12.wv.us\0" +"gok.pk\0fh.se\0" +"luzern.museum\0" +"fi.it\0swidnica.pl\0" +"cbg.ru\0" +"latina.it\0" +"vibovalentia.it\0" +"modum.no\0" +"safety.aero\0" +"sp.it\0" +"science.museum\0ah.no\0" +"norddal.no\0" +"cc.na\0" +"re.kr\0" +"dielddanuorri.no\0" +"force.museum\0" +"torino.it\0cc.md.us\0" +"artanddesign.museum\0pisz.pl\0" +"olsztyn.pl\0" +"unsa.ba\0rade.no\0vinnica.ua\0" +"in.rs\0astrakhan.ru\0" +"sogne.no\0" +"homebuilt.aero\0" +"polkowice.pl\0" +"hole.no\0health.vn\0" +"fj.cn\0" +"davvesiida.no\0" +"vic.au\0" +"kongsberg.no\0" +"pub.sa\0" +"vv.it\0" +"!pref.tottori.jp\0" +"*.sendai.jp\0in.th\0" +"lib.pa.us\0" +"chiropractic.museum\0" +"mobi.na\0aca.pro\0" +"konyvelo.hu\0sciencecenters.museum\0" +"he.cn\0" +"in.ua\0" +"!city.nagoya.jp\0" +"muenchen.museum\0" +"psi.br\0" +"maryland.museum\0" +"!statecouncil.om\0" +"tr\xc3\xa6na.no\0" +"!pref.yamagata.jp\0jewishart.museum\0" +"lu.it\0me.it\0" +"chel.ru\0" +"tatarstan.ru\0" +"adult.ht\0in.us\0" +"kafjord.no\0" +"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0" +"net.ac\0k12.ec\0" +"net.ae\0bashkiria.ru\0" +"net.af\0!omantel.om\0" +"net.ag\0" +"net.ai\0" +"!pref.toyama.jp\0" +"net.al\0timekeeping.museum\0" +"net.an\0design.museum\0fin.tn\0" +"ethnology.museum\0" +"perso.ht\0asker.no\0b.se\0" +"net.ba\0" +"net.bb\0flanders.museum\0" +"mincom.tn\0" +"frana.no\0" +"bt.it\0" +"net.bh\0" +"auto.pl\0" +"net.az\0" +"treviso.it\0" +"war.museum\0" +"net.bm\0" +"langevag.no\0m\xc3\xa5lselv.no\0" +"net.bo\0" +"gol.no\0" +"folkebibl.no\0" +"net.br\0" +"net.bs\0troandin.no\0saotome.st\0lib.tn.us\0" +"md.us\0k12.ut.us\0" +"d.bg\0cambridge.museum\0\xc3\xa5s.no\0" +"net.ci\0" +"net.bz\0" +"sch.ae\0undersea.museum\0odda.no\0" +"net.cn\0" +"net.co\0c.la\0" +"gliwice.pl\0" +"aurskog-h\xc3\xb8land.no\0" +"andria-trani-barletta.it\0" +"net.cu\0loab\xc3\xa1t.no\0" +"rep.kp\0" +"\xe7\xbb\x84\xe7\xb9\x94.hk\0" +"gallery.museum\0" +"\xc3\xb8rland.no\0" +"store.ro\0" +"net.dm\0" +"somna.no\0" +"hemnes.no\0" +"ringebu.no\0k12.ky.us\0" +"net.ec\0" +"dn.ua\0" +"tarnobrzeg.pl\0" +"soc.lk\0" +"romsa.no\0" +"bamble.no\0" +"net.dz\0lutsk.ua\0" +"barlettatraniandria.it\0ta.it\0countryestate.museum\0" +"kaszuby.pl\0" +"*.yamaguchi.jp\0cranbrook.museum\0store.st\0" +"southcarolina.museum\0lib.md.us\0" +"textile.museum\0" +"cheltenham.museum\0hurum.no\0" +"*.oita.jp\0" +"shop.ht\0cc.me.us\0" +"shop.hu\0turin.it\0" +"louvre.museum\0" +"k12.ar.us\0" +"consulting.aero\0" +"gv.ao\0" +"sauherad.no\0" +"gv.at\0net.ge\0" +"ostre-toten.no\0lib.ok.us\0" +"net.gg\0pilots.museum\0" +"2000.hu\0geology.museum\0" +"net.gn\0" +"mazowsze.pl\0bir.ru\0" +"net.gp\0" +"net.gr\0" +"oxford.museum\0" +"per.la\0" +"eastafrica.museum\0" +"meeres.museum\0" +"net.gy\0*.shizuoka.jp\0" +"\xe5\x95\x86\xe6\xa5\xad.tw\0" +"net.hk\0" +"net.hn\0" +"philadelphiaarea.museum\0" +"osen.no\0" +"net.ht\0net.id\0" +"fundacio.museum\0" +"j\xc3\xb8rpeland.no\0" +"\xe6\x95\x99\xe8\x82\xb2.hk\0" +"divtasvuodna.no\0" +"student.aero\0sch.gg\0net.im\0" +"\xe7\xbd\x91\xe7\xbb\x9c.cn\0net.in\0" +"net.iq\0" +"net.ir\0" +"net.is\0" +"net.je\0" +"kepno.pl\0lapy.pl\0" +"per.nf\0" +"gov\0*.shimane.jp\0" +"artcenter.museum\0" +"k\xc3\xa5""fjord.no\0" +"net.jo\0" +"eu.int\0" +"c.se\0" +"net.kg\0" +"ce.it\0net.ki\0" +"sch.id\0os.hedmark.no\0" +"columbus.museum\0" +"arteducation.museum\0" +"net.kn\0" +"kr.com\0" +"net.la\0bushey.museum\0cc.gu.us\0" +"net.lb\0" +"net.lc\0" +"gs.bu.no\0" +"e164.arpa\0" +"chieti.it\0labour.museum\0" +"sch.ir\0creation.museum\0krodsherad.no\0" +"net.ky\0" +"net.kz\0me.us\0" +"e.bg\0sch.je\0net.lk\0" +"zlg.br\0suwalki.pl\0" +"\xe5\x80\x8b\xe4\xba\xba.hk\0net.ma\0" +"net.lr\0" +"sch.jo\0notaires.km\0net.me\0" +"net.lv\0karate.museum\0" +"net.ly\0karm\xc3\xb8y.no\0" +"rg.it\0" +"net.mk\0" +"net.ml\0evenes.no\0" +"ngo.lk\0net.mo\0egyptian.museum\0" +"marine.ru\0" +"realestate.pl\0" +"net.mu\0" +"net.mv\0net.nf\0" +"net.mw\0net.ng\0gda.pl\0" +"net.mx\0" +"freemasonry.museum\0net.my\0enebakk.no\0" +"karlsoy.no\0" +"\xe7\xbd\x91\xe7\xbb\x9c.hk\0\xc3\xb8rskog.no\0" +"randaberg.no\0" +"club.aero\0" +"certification.aero\0sr.it\0" +"center.museum\0so.gov.pl\0" +"caa.aero\0" +"sch.lk\0tvedestrand.no\0" +"net.nr\0" +"luroy.no\0" +"aukra.no\0s\xc3\xa1lat.no\0lib.me.us\0" +"ddr.museum\0" +"york.museum\0stryn.no\0k12.nm.us\0" +"per.sg\0" +"judaica.museum\0" +"verona.it\0" +"agdenes.no\0" +"cng.br\0sch.ly\0" +"net.pa\0" +"author.aero\0" +"naturalhistory.museum\0steiermark.museum\0bu.no\0" +"sn\xc3\xa5sa.no\0net.pe\0" +"net.ph\0" +"savannahga.museum\0batsfjord.no\0lib.oh.us\0" +"net.pk\0" +"net.pl\0" +"net.pn\0" +"washingtondc.museum\0" +"net.pr\0" +"net.ps\0" +"net.pt\0" +"nordkapp.no\0" +"emergency.aero\0krokstadelva.no\0" +"satx.museum\0ngo.ph\0omsk.ru\0" +"texas.museum\0" +"ngo.pl\0" +"mantova.it\0gu.us\0" +"!pref.shiga.jp\0isa.us\0" +"usa.museum\0" +"gb.net\0k12.vi\0" +"iveland.no\0" +"tempio-olbia.it\0" +"net.sa\0" +"net.sb\0" +"works.aero\0net.sc\0komvux.se\0" +"net.sd\0" +"net.ru\0" +"0.bg\0" +"forlicesena.it\0net.rw\0net.sg\0" +"klodzko.pl\0" +"detroit.museum\0wegrow.pl\0" +"net.sl\0" +"glogow.pl\0" +"store.bb\0air.museum\0" +"net.so\0" +"katowice.pl\0" +"nsk.ru\0" +"pisa.it\0eid.no\0" +"net.st\0" +"film.hu\0" +"tuva.ru\0d.se\0" +"net.th\0" +"net.sy\0" +"viterbo.it\0tsaritsyn.ru\0perso.sn\0net.tj\0" +"lib.gu.us\0" +"plc.co.im\0sec.ps\0" +"r\xc3\xa1hkker\xc3\xa1vju.no\0kazimierz-dolny.pl\0net.tn\0" +"net.to\0" +"veterinaire.km\0" +"net.ua\0" +"info.ht\0net.tt\0" +"info.hu\0" +"exchange.aero\0" +"sch.sa\0net.tw\0" +"andriatranibarletta.it\0perso.tn\0" +"f.bg\0malselv.no\0" +"net.vc\0" +"trana.no\0" +"ns.ca\0" +"net.vi\0" +"lucca.it\0oristano.it\0" +"usarts.museum\0net.vn\0" +"gon.pk\0" +"pl.ua\0" +"eastcoast.museum\0" +"novara.it\0" +"k12.ks.us\0" +"dp.ua\0" +"nesseby.no\0" +"!pref.wakayama.jp\0" +"repbody.aero\0" +"jamison.museum\0lugansk.ua\0" +"ss.it\0" +"alessandria.it\0" +"hadsel.no\0net.ws\0" +"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0" +"veterinaire.fr\0leirfjord.no\0" +"massacarrara.it\0north.museum\0" +"project.museum\0" +"other.nf\0" +"k12.nh.us\0" +"mat.br\0artgallery.museum\0" +"sr.gov.pl\0" +"gamvik.no\0" +"info.ec\0lancashire.museum\0" +"fm.br\0ltd.co.im\0" +"americana.museum\0southwest.museum\0cc.ak.us\0" +"enna.it\0lunner.no\0" +"v\xc3\xa5gan.no\0" +"mari.ru\0" +"accident-investigation.aero\0" +"sor-aurdal.no\0lib.ny.us\0" +"novosibirsk.ru\0" +"bjugn.no\0" +"n\xc3\xa6r\xc3\xb8y.no\0ostrowwlkp.pl\0" +"info.bb\0foundation.museum\0" +"brand.se\0" +"info.at\0!pref.akita.jp\0l\xc3\xb8ten.no\0" +"coal.museum\0miners.museum\0" +"glass.museum\0" +"info.az\0" +"frog.museum\0szczytno.pl\0nov.ru\0" +"sunndal.no\0" +"gen.in\0" +"gx.cn\0" +"web.co\0*.mie.jp\0hobol.no\0\xe5\x8f\xb0\xe6\xb9\xbe\0" +"logistics.aero\0plo.ps\0" +"erotika.hu\0" +"torsken.no\0" +"exeter.museum\0" +"info.co\0" +"selje.no\0" +"storfjord.no\0" +"barum.no\0lind\xc3\xa5s.no\0" +"leasing.aero\0" +"championship.aero\0fst.br\0" +"lierne.no\0" +"!gobiernoelectronico.ar\0""1.bg\0" +"corporation.museum\0" +"al.it\0*.miyagi.jp\0" +"*.aomori.jp\0" +"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" +"amursk.ru\0" +"vestvagoy.no\0" +"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0cc.fl.us\0" +"os.hordaland.no\0" +"pistoia.it\0" +"tver.ru\0e.se\0" +"res.in\0*.yamagata.jp\0syzran.ru\0" +"capebreton.museum\0sandnessj\xc3\xb8""en.no\0" +"ternopil.ua\0" +"shop.pl\0" +"tank.museum\0" +"m\xc3\xa5s\xc3\xb8y.no\0" +"potenza.it\0time.museum\0" +"mjondalen.no\0" +"eng.br\0nedre-eiker.no\0" +"air-surveillance.aero\0" +"nt.au\0am.br\0pn.it\0" +"oystre-slidre.no\0ug.gov.pl\0" +"g.bg\0nesodden.no\0vologda.ru\0" +"parma.it\0tula.ru\0" +"*.nara.jp\0ak.us\0" +"nt.ca\0konin.pl\0" +"kiev.ua\0" +"skierv\xc3\xa1.no\0vestre-toten.no\0" +"ri.it\0botanical.museum\0farsund.no\0veg\xc3\xa5rshei.no\0dagestan.ru\0" +"ind.br\0k-uralsk.ru\0" +"rahkkeravju.no\0cmw.ru\0" +"canada.museum\0" +"fm.it\0" +"cc.wi.us\0" +"web.id\0aver\xc3\xb8y.no\0" +"dudinka.ru\0" +"baghdad.museum\0fitjar.no\0grane.no\0" +"gs.fm.no\0" +"sumy.ua\0" +"al.no\0" +"westfalen.museum\0" +"oregon.museum\0" +"bruxelles.museum\0elk.pl\0" +"planetarium.museum\0sn\xc3\xa5""ase.no\0" +"s\xc3\xb8rreisa.no\0" +"gs.st.no\0skien.no\0" +"bible.museum\0ivanovo.ru\0" +"avellino.it\0" +"tgory.pl\0" +"family.museum\0" +"ppg.br\0k12.as.us\0" +"trader.aero\0gorlice.pl\0" +"cc.al.us\0" +"ogliastra.it\0" +"is.it\0lib.nv.us\0" +"dr.na\0" +"media.hu\0nesna.no\0fl.us\0" +"uri.arpa\0" +"bjerkreim.no\0" +"charter.aero\0" +"genova.it\0" +"it.ao\0botany.museum\0hapmir.no\0" +"educational.museum\0" +"helsinki.museum\0" +"memorial.museum\0" +"web.lk\0pharmacy.museum\0" +"aircraft.aero\0appspot.com\0" +"ferrara.it\0beskidy.pl\0" +"hi.cn\0" +"taxi.aero\0flekkefjord.no\0" +"varoy.no\0" +"ragusa.it\0ambulance.museum\0" +"can.museum\0" +"*.osaka.jp\0isleofman.museum\0fm.no\0warmia.pl\0" +"educator.aero\0asmatart.museum\0" +"mi.it\0" +"kutno.pl\0" +"skedsmokorset.no\0" +"2.bg\0" +"*.kagoshima.jp\0km.ua\0" +"!city.sendai.jp\0" +"web.nf\0st.no\0cc.ri.us\0" +"reggiocalabria.it\0" +"wi.us\0" +"ancona.it\0newjersey.museum\0nnov.ru\0" +"f.se\0" +"ind.in\0" +"info.vn\0" +"andoy.no\0" +"ch.it\0fredrikstad.no\0guovdageaidnu.no\0" +"fjaler.no\0" +"sa.com\0" +"gs.nt.no\0" +"masfjorden.no\0" +"pordenone.it\0" +"po.it\0basel.museum\0" +"chambagri.fr\0" +"h.bg\0web.pk\0" +"london.museum\0" +"sciencecenter.museum\0\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"unbi.ba\0augustow.pl\0" +"wolomin.pl\0" +"notaires.fr\0tcm.museum\0al.us\0" +"nu.ca\0!pref.nagano.jp\0" +"info.tn\0" +"lib.wa.us\0" +"ed.ao\0info.tt\0" +"barreau.bj\0" +"k12.wy.us\0" +"pp.az\0gop.pk\0" +"int\0" +"l\xc3\xb8renskog.no\0podhale.pl\0" +"voagat.no\0" +"telekommunikation.museum\0" +"qld.au\0" +"te.it\0freiburg.museum\0snasa.no\0" +"gjemnes.no\0" +"sejny.pl\0" +"media.pl\0" +"skjak.no\0" +"watchandclock.museum\0" +"ed.ci\0pacific.museum\0" +"theater.museum\0info.ro\0" +"uk.com\0" +"campobasso.it\0aquarium.museum\0tysv\xc3\xa6r.no\0" +"kragero.no\0" +"windmill.museum\0info.sd\0" +"sologne.museum\0sande.m\xc3\xb8re-og-romsdal.no\0" +"nt.no\0cc.mi.us\0" +"ed.cr\0" +"academy.museum\0zachpomor.pl\0" +"tananger.no\0v\xc3\xa1rgg\xc3\xa1t.no\0ri.us\0" +"federation.aero\0" +"web.tj\0" +"matta-varjjat.no\0" +"steigen.no\0" +"local\0akrehamn.no\0" +"!pref.chiba.jp\0info.pk\0" +"info.pl\0""6bone.pl\0" +"klepp.no\0kherson.ua\0" +"ketrzyn.pl\0info.pr\0" +"sweden.museum\0" +"lardal.no\0" +"!retina.ar\0gz.cn\0" +"barletta-trani-andria.it\0vikna.no\0" +"bearalv\xc3\xa1hki.no\0" +"broker.aero\0gov.nc.tr\0" +"info.na\0k12.fl.us\0" +"hembygdsforbund.museum\0" +"entertainment.aero\0jerusalem.museum\0l\xc3\xa6rdal.no\0" +"hitra.no\0sogndal.no\0" +"farmequipment.museum\0info.mv\0info.nf\0\xc3\xa5lg\xc3\xa5rd.no\0" +"la-spezia.it\0" +"skanland.no\0fam.pk\0" +"skole.museum\0" +"art.museum\0" +"presidio.museum\0" +"3.bg\0public.museum\0" +"h\xc3\xb8yanger.no\0zagan.pl\0" +"an.it\0" +"philadelphia.museum\0info.nr\0" +"pesarourbino.it\0g\xc3\xa1ivuotna.no\0" +"poltava.ua\0" +"nt.ro\0" +"station.museum\0" +"mi.th\0" +"altoadige.it\0" +"nu.it\0" +"usculture.museum\0g.se\0" +"h\xc3\xa1mm\xc3\xa1rfeasta.no\0" +"daegu.kr\0info.la\0" +"dovre.no\0" +"ci.it\0horology.museum\0" +"bergbau.museum\0" +"press.museum\0" +"gangwon.kr\0" +"!city.kitakyushu.jp\0sor-varanger.no\0cc.hi.us\0" +"fuossko.no\0" +"zp.ua\0" +"american.museum\0" +"fl\xc3\xa5.no\0mi.us\0" +"i.bg\0" +"od.ua\0" +"encyclopedic.museum\0" +"ind.tn\0" +"midatlantic.museum\0" +"newyork.museum\0" +"castres.museum\0" +"act.edu.au\0" +"topology.museum\0" +"ed.jp\0" +"of.by\0" +"iris.arpa\0inf.br\0askim.no\0pyatigorsk.ru\0" +"nord-fron.no\0nsn.us\0" +"beardu.no\0" +"agrar.hu\0corvette.museum\0chtr.k12.ma.us\0" +"figueres.museum\0" +"!pref.gunma.jp\0medizinhistorisches.museum\0" +"tjeldsund.no\0" +"nebraska.museum\0" +"bellevue.museum\0" +"abo.pa\0k12.al.us\0" +"info.ki\0" +"inf.cu\0sv.it\0" +"jfk.museum\0" +"!city.osaka.jp\0swinoujscie.pl\0" +"bydgoszcz.pl\0" +"!city.kyoto.jp\0" +"uvic.museum\0" +"madrid.museum\0steinkjer.no\0" +"lib.ma.us\0" +"sirdal.no\0" +"n\xc3\xb8tter\xc3\xb8y.no\0" +"taranto.it\0starnberg.museum\0" +"vic.gov.au\0pvt.ge\0pors\xc3\xa1\xc5\x8bgu.no\0" +"naroy.no\0ris\xc3\xb8r.no\0" +"va.it\0salem.museum\0starachowice.pl\0" +"!nawrastelecom.om\0" +"town.museum\0te.ua\0" +"se.net\0" +"kemerovo.ru\0" +"lerdal.no\0" +"gs.va.no\0" +"kms.ru\0" +"consulado.st\0" +"haram.no\0" +"tysnes.no\0" +"!pref.ibaraki.jp\0hamburg.museum\0" +"\xc3\xa5rdal.no\0" +"airline.aero\0" +"crew.aero\0newhampshire.museum\0" +"muenster.museum\0" +"aerodrome.aero\0" +"heroy.nordland.no\0belau.pw\0" +"kamchatka.ru\0" +"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0lillehammer.no\0hi.us\0" +"hk.cn\0" +"!city.kobe.jp\0berlevag.no\0" +"ardal.no\0" +"askoy.no\0" +"vardo.no\0" +"fyresdal.no\0" +"sassari.it\0" +"video.hu\0drammen.no\0" +"lyngen.no\0nakhodka.ru\0" +"ip6.arpa\0games.hu\0" +"online.museum\0" +"k12.sd.us\0" +"4.bg\0sebastopol.ua\0" +"ao.it\0atlanta.museum\0" +"lebork.pl\0" +"ravenna.it\0" +"railway.museum\0songdalen.no\0" +"!pref.shimane.jp\0delaware.museum\0ed.pw\0" +"f\xc3\xb8rde.no\0" +"living.museum\0" +"juif.museum\0" +"lomza.pl\0" +"h.se\0" +"!bl.uk\0" +"portland.museum\0\xe7\xb5\x84\xe7\xb9\x94.tw\0" +"stj\xc3\xb8rdal.no\0" +"lecce.it\0" +"bz.it\0" +"farmstead.museum\0va.no\0" +"express.aero\0!nacion.ar\0" +"presse.km\0gs.of.no\0" +"\xe5\x8f\xb0\xe7\x81\xa3\0" +"og.ao\0gyeongbuk.kr\0vestv\xc3\xa5g\xc3\xb8y.no\0" +"prd.fr\0" +"pp.ru\0pp.se\0" +"forum.hu\0!pref.saga.jp\0" +"kvalsund.no\0" +"!city.kawasaki.jp\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0" +"j.bg\0" +"vlaanderen.museum\0" +"cc.va.us\0" +"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0alabama.museum\0" +"school.museum\0her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0" +"\xc3\xa5seral.no\0" +"traniandriabarletta.it\0" +"flog.br\0" +"presse.ml\0" +"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0" +"historisch.museum\0" +"farm.museum\0palmsprings.museum\0oslo.no\0dyroy.no\0stranda.no\0" +"gs.rl.no\0r\xc3\xa5""de.no\0" +"bomlo.no\0s\xc3\xb8rum.no\0" +"jan-mayen.no\0ivgu.no\0" +"coop\0" +"agr.br\0k12.ak.us\0" +"!nic.ar\0catanzaro.it\0fusa.no\0" +"hu.com\0" +"inf.mk\0" +"vet.br\0" +"k12.mt.us\0k12.nd.us\0" +"vlog.br\0\xe5\x85\xac\xe5\x8f\xb8.cn\0sandnessjoen.no\0" +"lib.az.us\0" +"nsw.edu.au\0of.no\0\xc3\xb8stre-toten.no\0" +"*.okinawa.jp\0" +"vb.it\0" +"asso.fr\0firenze.it\0" +"trieste.it\0" +"\xe5\x85\xac\xe5\x8f\xb8.hk\0" +"museet.museum\0" +"prd.km\0" +"navuotna.no\0lib.ca.us\0" +"cc.nv.us\0" +"asso.gp\0" +"meraker.no\0" +"h\xc3\xa1pmir.no\0" +"i.ph\0" +"sx.cn\0jeonnam.kr\0" +"halden.no\0" +"fed.us\0" +"medio-campidano.it\0tsk.ru\0" +"barcelona.museum\0" +"giessen.museum\0roma.museum\0" +"hl.cn\0" +"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0" +"biz.bb\0benevento.it\0rl.no\0bygland.no\0" +"port.fr\0asso.ht\0prd.mg\0" +"biz.at\0" +"tra.kp\0" +"*.aichi.jp\0khabarovsk.ru\0" +"campidano-medio.it\0" +"biz.az\0" +"newmexico.museum\0va.us\0" +"finearts.museum\0" +"murmansk.ru\0" +"\xc3\xb8rsta.no\0radom.pl\0k12.sc.us\0" +"5.bg\0kvinesdal.no\0" +"ap.it\0" +"*.fukushima.jp\0" +"asso.bj\0" +"mad.museum\0" +"lebesby.no\0" +"og.it\0glas.museum\0sauda.no\0" +"i.se\0" +"k12.tx.us\0" +"asso.ci\0mk.ua\0" +"cesena-forli.it\0" +"lowicz.pl\0" +"k12.id.us\0" +"tas.gov.au\0" +"lukow.pl\0" +"utazas.hu\0" +"maritimo.museum\0bjark\xc3\xb8y.no\0" +"adm.br\0" +"pr.it\0lib.vi.us\0" +"bergamo.it\0k12.va.us\0" +"k.bg\0" +"railroad.museum\0" +"!british-library.uk\0" +"cincinnati.museum\0" +"sorreisa.no\0" +"asso.dz\0!nel.uk\0" +"rm.it\0" +"nv.us\0" +"nx.cn\0gos.pk\0" +"vic.edu.au\0" +"biella.it\0tjome.no\0" +"r\xc3\xb8yken.no\0" +"beiarn.no\0" +"qc.ca\0" +"georgia.museum\0square.museum\0" +"labor.museum\0omasvuotna.no\0cc.la.us\0" +"br.com\0reggioemilia.it\0" +"kristiansund.no\0" +"sorum.no\0" +"orsta.no\0" +"furniture.museum\0surrey.museum\0eng.pro\0" +"asn.lv\0balat.no\0" +"lavangen.no\0sld.pa\0" +"fla.no\0k12.ms.us\0k12.nc.us\0" +"bardu.no\0" +"donostia.museum\0" +"club.tw\0" +"elburg.museum\0" +"gs.hl.no\0lodingen.no\0" +"samara.ru\0" +"vc.it\0*.nagasaki.jp\0" +"fosnes.no\0" +"fuel.aero\0" +"qc.com\0" +"skjervoy.no\0" +"bill.museum\0kv\xc3\xa6""fjord.no\0" +"skydiving.aero\0*.tokushima.jp\0" +"!congresodelalengua3.ar\0laquila.it\0k12.ct.us\0" +"gorge.museum\0linz.museum\0sherbrooke.museum\0" +"tranoy.no\0ing.pa\0" +"ptz.ru\0" +"kr.it\0prato.it\0stat.no\0" +"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0" +"cosenza.it\0" +"stj\xc3\xb8rdalshalsen.no\0" +"finland.museum\0leka.no\0cc.pr.us\0" +"historichouses.museum\0s\xc3\xa1l\xc3\xa1t.no\0" +"venice.it\0" +"biz.ki\0" +"g\xc3\xa1ls\xc3\xa1.no\0" +"\xe7\xbb\x84\xe7\xbb\x87.hk\0" +"*.yamanashi.jp\0" +"rad\xc3\xb8y.no\0" +"6.bg\0" +"fareast.ru\0" +"paragliding.aero\0ba.it\0aq.it\0" +"sk\xc3\xa5nland.no\0" +"its.me\0" +"us.na\0" +"hl.no\0cc.ga.us\0" +"ac\0granvin.no\0" +"ad\0qld.edu.au\0!city.sapporo.jp\0" +"ae\0" +"af\0" +"ag\0crotone.it\0" +"dallas.museum\0" +"ai\0brussels.museum\0" +"dali.museum\0" +"la.us\0" +"al\0salzburg.museum\0" +"am\0" +"an\0cl.it\0" +"ao\0" +"aq\0ba\0" +"bb\0" +"as\0lajolla.museum\0" +"at\0" +"be\0" +"bf\0inderoy.no\0snz.ru\0" +"aw\0bg\0" +"ax\0bh\0cim.br\0ltd.gi\0biz.mv\0" +"bi\0xz.cn\0\xe7\xb5\x84\xe7\xb9\x94.hk\0biz.mw\0" +"az\0bj\0" +"bm\0tranibarlettaandria.it\0naamesjevuemie.no\0" +"chattanooga.museum\0" +"bo\0" +"l.bg\0" +"ca\0" +"br\0stateofdelaware.museum\0" +"bs\0cc\0" +"cd\0biz.nr\0" +"cf\0berlev\xc3\xa5g.no\0" +"bw\0cg\0snaase.no\0" +"ch\0harvestcelebration.museum\0ck.ua\0" +"by\0ci\0" +"bz\0bahccavuotna.no\0" +"cl\0yuzhno-sakhalinsk.ru\0" +"cm\0halsa.no\0lyngdal.no\0" +"cn\0" +"co\0rn.it\0childrens.museum\0frankfurt.museum\0" +"cr\0" +"pskov.ru\0" +"cu\0de\0" +"cv\0fr.it\0lib.ky.us\0" +"aseral.no\0kvam.no\0" +"cx\0hellas.museum\0" +"hof.no\0" +"cz\0dj\0k12.la.us\0" +"dk\0moscow.museum\0" +"sosnowiec.pl\0" +"dm\0biz.pk\0" +"schokoladen.museum\0biz.pl\0" +"far.br\0arna.no\0tynset.no\0" +"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0" +"ec\0" +"biz.pr\0" +"ee\0celtic.museum\0" +"scientist.aero\0modern.museum\0" +"pr.us\0" +"dz\0" +"mj\xc3\xb8ndalen.no\0s\xc3\xb8r-odal.no\0" +"!nic.tr\0" +"conference.aero\0vestnes.no\0k12.mn.us\0" +"!pref.hiroshima.jp\0" +"es\0trapani.it\0" +"fermo.it\0vard\xc3\xb8.no\0" +"eu\0gs.hm.no\0r\xc3\xb8""d\xc3\xb8y.no\0stordal.no\0" +"gc.ca\0!nhs.uk\0" +"jgora.pl\0" +"fi\0stjordal.no\0" +"fm\0!mediaphone.om\0" +"kirov.ru\0pvt.k12.ma.us\0" +"fo\0" +"ga\0hyllestad.no\0" +"gov.ac\0fr\0andriabarlettatrani.it\0ga.us\0" +"gov.ae\0gd\0estate.museum\0" +"gov.af\0ge\0tolga.no\0" +"gf\0asso.re\0cc.oh.us\0" +"gg\0florida.museum\0" +"presse.ci\0gh\0" +"gi\0k12.dc.us\0" +"ltd.lk\0orland.no\0" +"gov.al\0" +"gl\0tokke.no\0" +"hanggliding.aero\0gm\0" +"hareid.no\0" +"gov.ba\0tj.cn\0gp\0" +"gov.bb\0gq\0" +"gov.as\0gr\0agrigento.it\0lc.it\0" +"gs\0kalmykia.ru\0aero.tt\0" +"gov.bf\0" +"county.museum\0" +"gov.bh\0hn.cn\0gw\0" +"gov.az\0gy\0assn.lk\0guernsey.museum\0" +"hk\0" +"gov.bm\0h\xc3\xa6gebostad.no\0biz.tj\0" +"hm\0computer.museum\0" +"gov.bo\0hn\0kl\xc3\xa6""bu.no\0" +"pulawy.pl\0" +"gov.br\0" +"trd.br\0gov.bs\0hr\0reggio-calabria.it\0historyofscience.museum\0lipetsk.ru\0" +"gov.cd\0*.nagoya.jp\0" +"ht\0id\0spjelkavik.no\0" +"hu\0ie\0aero.mv\0" +"marketplace.aero\0mn.it\0biz.tt\0" +"gov.by\0saintlouis.museum\0mer\xc3\xa5ker.no\0" +"gov.bz\0" +"7.bg\0gov.cl\0virtual.museum\0" +"gov.cm\0vennesla.no\0kr.ua\0" +"gov.cn\0im\0ar.it\0galsa.no\0rovno.ua\0" +"gov.co\0in\0" +"io\0limanowa.pl\0" +"iq\0k12.ga.us\0" +"ir\0" +"riik.ee\0is\0\xc3\xa1laheadju.no\0" +"gov.cu\0it\0hawaii.museum\0seaport.museum\0" +"je\0pubol.museum\0hm.no\0" +"gov.cx\0" +"*.chiba.jp\0" +"*.kawasaki.jp\0" +"k.se\0" +"gov.dm\0" +"aland.fi\0vik.no\0" +"yk.ca\0jo\0kobierzyce.pl\0" +"jp\0biz.vn\0" +"presse.fr\0lib.il.us\0\xe9\xa6\x99\xe6\xb8\xaf\0" +"gov.ec\0" +"transport.museum\0bronnoy.no\0" +"slg.br\0gov.ee\0asso.nc\0bievat.no\0" +"nyny.museum\0" +"kg\0" +"mo-i-rana.no\0" +"gov.dz\0ki\0" +"monmouth.museum\0" +"suldal.no\0" +"bc.ca\0km\0zt.ua\0" +"pt.it\0kn\0" +"fineart.museum\0" +"la\0" +"kr\0gulen.no\0" +"m.bg\0mo.cn\0lc\0alaheadju.no\0g\xc3\xa1\xc5\x8bgaviika.no\0" +"nowaruda.pl\0cc.ut.us\0" +"br\xc3\xb8nn\xc3\xb8y.no\0" +"ky\0li\0overhalla.no\0" +"kz\0khv.ru\0" +"lk\0" +"artdeco.museum\0" +"ma\0fortworth.museum\0kostroma.ru\0" +"ro.it\0kirkenes.no\0vestby.no\0" +"urbino-pesaro.it\0ls\0mc\0alstahaug.no\0" +"blog.br\0gov.ge\0lt\0md\0" +"lu\0me\0botanicgarden.museum\0" +"gov.gg\0lv\0oh.us\0" +"gov.gh\0mg\0valley.museum\0" +"gov.gi\0mh\0" +"ly\0sandiego.museum\0" +"mk\0" +"ml\0" +"gov.gn\0rollag.no\0naklo.pl\0" +"mn\0" +"mo\0" +"mp\0leirvik.no\0" +"gov.gr\0mq\0na\0cc.ks.us\0" +"mr\0" +"ms\0nc\0" +"valer.hedmark.no\0" +"mu\0ne\0" +"mv\0nf\0" +"mw\0" +"mx\0nord-odal.no\0jur.pro\0" +"my\0" +"gov.hk\0name.hr\0" +"nl\0" +"astronomy.museum\0lib.nm.us\0" +"catania.it\0" +"no\0" +"skjerv\xc3\xb8y.no\0" +"k12.ne.us\0" +"monza-e-della-brianza.it\0!pref.fukushima.jp\0nr\0" +"gov.ie\0" +"stuttgart.museum\0nu\0cc.mn.us\0" +"karasjohka.no\0" +"engine.aero\0bearalvahki.no\0" +"oyer.no\0" +"ve.it\0" +"gov.im\0froland.no\0cc.ar.us\0" +"gov.in\0magadan.ru\0" +"pescara.it\0" +"gov.iq\0usdecorativearts.museum\0" +"gov.ir\0pa\0" +"gov.is\0" +"gov.it\0lavagis.no\0" +"gov.je\0" +"naustdal.no\0pe\0k12.or.us\0" +"gd.cn\0carraramassa.it\0pf\0" +"ph\0" +"cc.ny.us\0" +"rissa.no\0" +"info\0pk\0pomorze.pl\0" +"pl\0" +"gov.jo\0asso.km\0pn\0" +"*.okayama.jp\0cieszyn.pl\0" +"freight.aero\0" +"pr\0" +"narvik.no\0ps\0" +"!pref.aichi.jp\0elverum.no\0pt\0" +"edunet.tn\0" +"gov.kg\0" +"flatanger.no\0marker.no\0pw\0" +"gov.ki\0nuremberg.museum\0" +"aip.ee\0" +"gov.km\0" +"gov.kn\0" +"gov.kp\0" +"rieti.it\0gov.la\0bajddar.no\0" +"gov.lb\0aviation.museum\0" +"gov.lc\0" +"asso.mc\0" +"re\0" +"ut.us\0" +"sa.gov.au\0gov.ky\0" +"mo.it\0gov.kz\0" +"gov.lk\0" +"iraq.museum\0" +"badajoz.museum\0" +"8.bg\0inder\xc3\xb8y.no\0" +"monticello.museum\0ro\0ks.ua\0" +"gov.ma\0svizzera.museum\0" +"gov.lr\0sa\0" +"matera.it\0sb\0" +"gov.lt\0rs\0sc\0" +"gov.me\0sd\0" +"gov.lv\0ru\0se\0" +"gov.mg\0" +"rw\0sg\0" +"gov.ly\0assisi.museum\0kids.museum\0sh\0" +"si\0" +"gov.mk\0" +"gov.ml\0sk\0" +"sl\0" +"gov.mn\0airguard.museum\0sm\0" +"gov.mo\0l.se\0sn\0" +"so\0" +"gov.mr\0ks.us\0" +"name.az\0sr\0" +"naturhistorisches.museum\0tc\0" +"trainer.aero\0cn.it\0urbinopesaro.it\0gov.mu\0nativeamerican.museum\0st\0td\0" +"gov.mv\0su\0" +"trentino.it\0gov.mw\0gov.ng\0tf\0" +"tg\0" +"co.ae\0venezia.it\0gov.my\0th\0" +"!pref.ehime.jp\0sy\0" +"co.ag\0lewismiller.museum\0ostrowiec.pl\0sz\0tj\0" +"tk\0" +"motorcycle.museum\0tl\0" +"birdart.museum\0trogstad.no\0tm\0" +"tn\0" +"humanities.museum\0to\0" +"pu.it\0gov.nr\0ua\0lib.ut.us\0" +"co.ao\0" +"co.ba\0trondheim.no\0tt\0" +"in-addr.arpa\0tempioolbia.it\0!city.yokohama.jp\0mn.us\0" +"n.bg\0schoenbrunn.museum\0tv\0" +"co.at\0aremark.no\0tw\0ug\0" +"jus.br\0" +"co.bi\0bialowieza.pl\0ar.us\0" +"audnedaln.no\0kustanai.ru\0" +"va\0" +"us\0vc\0" +"newport.museum\0" +"kopervik.no\0gov.ph\0vg\0" +"ny.us\0vi\0" +"co.bw\0finn\xc3\xb8y.no\0gov.pk\0uz\0" +"honefoss.no\0gov.pl\0lanbib.se\0" +"co.ci\0" +"gov.pn\0intl.tn\0" +"act.gov.au\0vn\0" +"television.museum\0gov.pr\0" +"sykkylven.no\0v\xc3\xa5ler.hedmark.no\0gov.ps\0" +"gov.pt\0" +"co.cr\0vu\0" +"legnica.pl\0" +"sa.au\0" +"bjarkoy.no\0" +"openair.museum\0birkenes.no\0lib.nj.us\0" +"fylkesbibl.no\0holt\xc3\xa5len.no\0" +"iz.hr\0" +"ws\0" +"oceanographique.museum\0" +"b\xc3\xa1id\xc3\xa1r.no\0cc.mo.us\0" +"\xc3\xb8ygarden.no\0" +"contemporary.museum\0" +"gb.com\0cc.as.us\0" +"belluno.it\0gov.sa\0" +"gov.sb\0" +"gov.rs\0gov.sc\0" +"gov.sd\0" +"!pref.nagasaki.jp\0gov.ru\0" +"asia\0" +"sa.cr\0gov.rw\0gov.sg\0" +"kuzbass.ru\0" +"gs.vf.no\0" +"gov.sl\0" +"norfolk.museum\0" +"k12.de.us\0" +"mil\0" +"rendalen.no\0" +"gov.st\0" +"agro.pl\0" +"orkdal.no\0" +"le.it\0gov.sy\0" +"gov.tj\0" +"co.gg\0nore-og-uvdal.no\0v\xc3\xa5ler.\xc3\xb8stfold.no\0" +"gov.tl\0" +"gov.tn\0" +"gov.to\0" +"kids.us\0" +"equipment.aero\0gov.ua\0" +"!city.niigata.jp\0gov.tt\0" +"sel.no\0" +"l\xc3\xa4ns.museum\0" +"gov.tw\0" +"rennebu.no\0" +"egersund.no\0" +"medecin.km\0" +"co.gy\0" +"!mecon.ar\0" +"berlin.museum\0" +"carrara-massa.it\0" +"9.bg\0" +"pri.ee\0gov.vc\0" +"at.it\0" +"muosat.no\0" +"co.id\0" +"co.hu\0" +"etne.no\0" +"\xc3\xa1lt\xc3\xa1.no\0" +"gov.vn\0" +"modelling.aero\0" +"co.im\0" +"co.in\0\xc3\xa5krehamn.no\0m.se\0" +"gouv.fr\0*.kitakyushu.jp\0" +"narviika.no\0" +"rennes\xc3\xb8y.no\0" +"co.ir\0afjord.no\0" +"lea\xc5\x8bgaviika.no\0buryatia.ru\0" +"co.it\0coastaldefence.museum\0" +"co.je\0vf.no\0" +"osteroy.no\0" +"uslivinghistory.museum\0" +"aerobatic.aero\0" +"mesaverde.museum\0mining.museum\0" +"a\xc3\xa9roport.ci\0gov.ws\0" +"co.jp\0copenhagen.museum\0" +"pv.it\0" +"r\xc3\xb8mskog.no\0" +"vossevangen.no\0porsanger.no\0" +"salat.no\0mo.us\0" +"o.bg\0imperia.it\0carrier.museum\0" +"carbonia-iglesias.it\0" +"as.us\0" +"alvdal.no\0" +"state.museum\0mandal.no\0cn.ua\0" +"cuneo.it\0" +"gouv.ht\0" +"!city.okayama.jp\0co.kr\0" +"co.lc\0" +"sa.it\0" +"donna.no\0" +"sortland.no\0" +"tomsk.ru\0" +"birthplace.museum\0l\xc3\xb8""dingen.no\0" +"ge.it\0orenburg.ru\0" +"cn.com\0" +"co.ma\0" +"co.ls\0skaun.no\0name.vn\0" +"navigation.aero\0" +"cagliari.it\0co.me\0portal.museum\0" +"gouv.bj\0" +"udine.it\0" +"engineer.aero\0" +"szczecin.pl\0" +"wales.museum\0" +"co.na\0bo.telemark.no\0" +"austin.museum\0" +"k12.mo.us\0" +"co.mu\0" +"gouv.ci\0" +"co.mw\0" +"esp.br\0" +"naturalhistorymuseum.museum\0" +"mosjoen.no\0" +"solund.no\0" +"name.tj\0" +"sand\xc3\xb8y.no\0" +"kunstunddesign.museum\0" +"cartoonart.museum\0collection.museum\0gsm.pl\0" +"aure.no\0" +"!pref.yamaguchi.jp\0historical.museum\0" +"name.tt\0" +"england.museum\0valle.no\0" +"cc.ok.us\0" +"salangen.no\0" +"gloppen.no\0" +"cc.co.us\0" +"contemporaryart.museum\0" +"tas.edu.au\0" +"trading.aero\0" +"mazury.pl\0" +"!pref.aomori.jp\0co.pl\0" +"opoczno.pl\0" +"*.kobe.jp\0co.pn\0" +"oppegard.no\0" +"co.pw\0" +"saltdal.no\0smolensk.ru\0" +"na.it\0\xc4\x8d\xc3\xa1hcesuolo.no\0" +"vgs.no\0evenassi.no\0" +"parachuting.aero\0jl.cn\0maritime.museum\0bd.se\0" +"badaddja.no\0" +"bergen.no\0" +"brussel.museum\0" +"avoues.fr\0" +"cesenaforli.it\0" +"oregontrail.museum\0" +"ullensaker.no\0" +"jobs\0" +"accident-prevention.aero\0" +"n.se\0" +"association.museum\0california.museum\0" +"cultural.museum\0co.rs\0" +"zoology.museum\0" +"pruszkow.pl\0" +"control.aero\0nt.edu.au\0net\0komforb.se\0" +"lincoln.museum\0aurland.no\0name.pr\0co.rw\0" +"ostroleka.pl\0" +"isernia.it\0" +"tm.fr\0" +"gs.ol.no\0" +"nb.ca\0marnardal.no\0" +"williamsburg.museum\0" +"!jet.uk\0" +"suisse.museum\0\xc3\xa5""fjord.no\0flakstad.no\0" +"karmoy.no\0" +"yn.cn\0chesapeakebay.museum\0" +"nsw.au\0" +"amur.ru\0co.st\0" +"imb.br\0siellak.no\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" +"name.na\0" +"co.th\0" +"p.bg\0" +"co.sz\0co.tj\0" +"name.mv\0\xc3\xa5lesund.no\0lib.in.us\0" +"lucerne.museum\0naumburg.museum\0" +"society.museum\0name.my\0" +"tinn.no\0" +"co.tt\0" +"unj\xc3\xa1rga.no\0" +"co.ug\0" +"lib.wy.us\0" +"co.tz\0" +"ass.km\0" +"ok.us\0" +"tm.hu\0kongsvinger.no\0" +"ibestad.no\0" +"juedisches.museum\0co.us\0" +"cq.cn\0" +"rs.ba\0" +"wa.edu.au\0co.vi\0" +"co.uz\0" +"health.museum\0" +"grue.no\0" +"automotive.museum\0journalism.museum\0settlement.museum\0" +"qh.cn\0interactive.museum\0" +"snillfjord.no\0!national-library-scotland.uk\0" +"balsfjord.no\0lib.nh.us\0" +"kolobrzeg.pl\0" +"gs.tm.no\0" +"h\xc3\xb8nefoss.no\0" +"ol.no\0" +"music.museum\0moareke.no\0" +"b\xc3\xb8.nordland.no\0" +"name.mk\0lier.no\0" +"eidfjord.no\0" +"sc.cn\0tm.km\0" +"jelenia-gora.pl\0sanok.pl\0" +"intelligence.museum\0" +"srv.br\0elblag.pl\0" +"judygarland.museum\0" +"padua.it\0" +"k12.co.us\0" +"lindesnes.no\0" +"name.jo\0izhevsk.ru\0" +"yorkshire.museum\0mel\xc3\xb8y.no\0" +"tm.mc\0lib.pr.us\0" +"hjartdal.no\0" +"tm.mg\0" +"bari.it\0milano.it\0" +"lg.jp\0" +"zgrad.ru\0" +"sm\xc3\xb8la.no\0" +"communications.museum\0" +"arts.co\0seoul.kr\0engerdal.no\0" +"oster\xc3\xb8y.no\0" +"\xe6\x95\x8e\xe8\x82\xb2.hk\0foggia.it\0verran.no\0" +"orskog.no\0voronezh.ru\0kv.ua\0" +"av.it\0" +"tm.no\0nissedal.no\0" +"historisches.museum\0gs.mr.no\0" +"medecin.fr\0" +"montreal.museum\0" +"o.se\0" +"!metro.tokyo.jp\0sola.no\0" +"k12.tn.us\0" +"floro.no\0" +"milan.it\0*.shiga.jp\0" +"berkeley.museum\0" +"maintenance.aero\0" +"ws.na\0" +"lindas.no\0cc.ia.us\0" +"brescia.it\0embroidery.museum\0" +"arezzo.it\0tm.pl\0" +"r\xc3\xa6lingen.no\0" +"burghof.museum\0" +"rec.br\0" +"q.bg\0" +"!nawras.om\0" +"hammarfeasta.no\0" +"moss.no\0" +"on.ca\0" +"gouv.rw\0" +"luxembourg.museum\0" +"rec.co\0british.museum\0" +"reggio-emilia.it\0" +"gouv.sn\0lib.wv.us\0" +"avocat.fr\0" +"simbirsk.ru\0" +"jar.ru\0" +"monza-brianza.it\0" +"tm.ro\0" +"imageandsound.museum\0" +"jpn.com\0mr.no\0" +"siracusa.it\0" +"norilsk.ru\0tm.se\0" +"tn.it\0" +"jeju.kr\0" +"!pref.fukuoka.jp\0" +"*.hyogo.jp\0portlligat.museum\0" +"!pref.osaka.jp\0" +"siena.it\0sc.kr\0omaha.museum\0saskatchewan.museum\0" +"phoenix.museum\0vanylven.no\0" +"botanicalgarden.museum\0" +"turek.pl\0" +"vagsoy.no\0" +"riodejaneiro.museum\0" +"vi.it\0" +"uy.com\0" +"kristiansand.no\0" +"sd.cn\0trento.it\0" +"muncie.museum\0" +"berg.no\0meldal.no\0" +"nes.buskerud.no\0" +"saratov.ru\0" +"gs.oslo.no\0" +"harstad.no\0vaga.no\0" +"research.museum\0" +"brunel.museum\0ia.us\0" +"test.tj\0" +"columbia.museum\0" +"ms.it\0stockholm.museum\0" +"reklam.hu\0" +"pomorskie.pl\0lg.ua\0" +"bg.it\0historicalsociety.museum\0rns.tn\0" +"mallorca.museum\0surgut.ru\0cc.sc.us\0" +"ushistory.museum\0" +"palana.ru\0" +"snoasa.no\0" +"naturalsciences.museum\0" +"yaroslavl.ru\0" +"unjarga.no\0" +"p.se\0" +"ingatlan.hu\0" +"irc.pl\0" +"savona.it\0" +"cr.it\0" +"test.ru\0cc.tn.us\0" +"ms.kr\0museumvereniging.museum\0" +"time.no\0k12.ia.us\0" +"vladimir.ru\0" +"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" +"gouv.km\0nationalfirearms.museum\0" +"m\xc3\xa1latvuopmi.no\0" +"aero\0yosemite.museum\0" +"r.bg\0school.na\0" +"cc.vi.us\0" +"*.wakayama.jp\0" +"beauxarts.museum\0averoy.no\0ullensvang.no\0bar.pro\0" +"!city.hiroshima.jp\0" +"b\xc3\xa1hccavuotna.no\0" +"frosta.no\0" +"gdynia.pl\0" +"medical.museum\0" +"embaixada.st\0" +"balsan.it\0vantaa.museum\0" +"za.net\0" +"!city.saitama.jp\0lib.ks.us\0" +"fnd.br\0" +"ru.com\0se.com\0hol.no\0modalen.no\0" +"gouv.ml\0chukotka.ru\0" +"malopolska.pl\0" +"mansion.museum\0" +"iki.fi\0children.museum\0" +"cyber.museum\0rec.nf\0mo\xc3\xa5reke.no\0" +"to.it\0" +"hasvik.no\0" +"\xc3\xb8yer.no\0" +"arts.ro\0sc.ug\0" +"lib.ar.us\0" +"sc.tz\0cc.ms.us\0cc.nc.us\0" +"etc.br\0poznan.pl\0" +"cnt.br\0viking.museum\0" +"*.miyazaki.jp\0" +"melhus.no\0" +"skodje.no\0vevelstad.no\0" +"sc.us\0" +"upow.gov.pl\0" +"!city.fukuoka.jp\0brandywinevalley.museum\0natuurwetenschappen.museum\0tranby.no\0" +"bahn.museum\0msk.ru\0" +"delmenhorst.museum\0" +"russia.museum\0fuoisku.no\0" +"shell.museum\0" +"r\xc3\xa1isa.no\0" +"hs.kr\0udmurtia.ru\0" +"palermo.it\0" +"pilot.aero\0" +"tn.us\0" +"priv.hu\0" +"li.it\0" +"kr\xc3\xa5""anghke.no\0mosreg.ru\0" +"lib.fl.us\0" +"plants.museum\0" +"ulsan.kr\0national.museum\0" +"mil.ac\0!pref.nara.jp\0surgeonshall.museum\0" +"mil.ae\0santacruz.museum\0vi.us\0" +"wlocl.pl\0" +"mt.it\0napoli.it\0alaska.museum\0arts.nf\0" +"missoula.museum\0" +"rec.ro\0" +"mil.al\0" +"marburg.museum\0waw.pl\0" +"pharmaciens.km\0indianapolis.museum\0larsson.museum\0" +"cc.sd.us\0" +"mil.ba\0mobi\0" +"indianmarket.museum\0" +"recreation.aero\0padova.it\0" +"varese.it\0parti.se\0" +"mil.az\0" +"mil.bo\0!pref.kagoshima.jp\0khmelnitskiy.ua\0" +"rygge.no\0" +"os\xc3\xb8yro.no\0" +"mil.br\0" +"cs.it\0" +"austevoll.no\0fjell.no\0" +"mil.by\0" +"!pref.tokushima.jp\0org\0" +"mil.cn\0gs.svalbard.no\0" +"mil.co\0" +"pz.it\0lib.va.us\0\xd1\x80\xd1\x84\0" +"\xe4\xb8\xaa\xe4\xba\xba.hk\0ms.us\0nc.us\0k12.wi.us\0" +"s.bg\0drangedal.no\0" +"en.it\0" +"culturalcenter.museum\0" +"house.museum\0divttasvuotna.no\0" +"fhs.no\0" +"circus.museum\0" +"priv.at\0" +"mil.ec\0" +"ruovat.no\0" +"midsund.no\0vagan.no\0" +"casadelamoneda.museum\0" +"bristol.museum\0" +"and.museum\0" +"ascolipiceno.it\0computerhistory.museum\0vyatka.ru\0" +"uhren.museum\0" +"lahppi.no\0" +"*.yokohama.jp\0cody.museum\0lib.al.us\0" +"colonialwilliamsburg.museum\0indian.museum\0cc.ky.us\0" +"tp.it\0biev\xc3\xa1t.no\0" +"can.br\0royken.no\0" +"id.ir\0" +"mediocampidano.it\0tromso.no\0" +"kartuzy.pl\0k12.ok.us\0" +"*.saitama.jp\0stjohn.museum\0m\xc3\xa1tta-v\xc3\xa1rjjat.no\0" +"mil.ge\0trani-barletta-andria.it\0" +"lib.as.us\0" +"swiebodzin.pl\0cc.mt.us\0cc.nd.us\0" +"mil.gh\0" +"science-fiction.museum\0\xd9\x82\xd8\xb7\xd8\xb1\0" +"airtraffic.aero\0" +"konskowola.pl\0" +"scienceandhistory.museum\0nysa.pl\0sd.us\0" +"balestrand.no\0" +"oygarden.no\0" +"her\xc3\xb8y.nordland.no\0" +"!pref.ishikawa.jp\0strand.no\0" +"\xe7\xb5\x84\xe7\xbb\x87.hk\0mil.hn\0" +"gob.bo\0volda.no\0" +"losangeles.museum\0larvik.no\0" +"university.museum\0" +"cc.dc.us\0" +"mil.id\0" +"sorfold.no\0" +"watch-and-clock.museum\0" +"flor\xc3\xb8.no\0" +"nittedal.no\0oppeg\xc3\xa5rd.no\0" +"k12.ri.us\0" +"gob.cl\0" +"komi.ru\0" +"government.aero\0mil.in\0" +"mil.iq\0id.lv\0" +"culture.museum\0" +"id.ly\0" +"raholt.no\0" +"lubin.pl\0grozny.ru\0" +"kchr.ru\0" +"nikolaev.ua\0" +"lib.sd.us\0" +"de.com\0" +"mil.jo\0" +"*.kanagawa.jp\0gaular.no\0miasta.pl\0" +"bi.it\0rnu.tn\0uzhgorod.ua\0" +"idrett.no\0v\xc3\xa5gs\xc3\xb8y.no\0" +"wroclaw.pl\0" +"res.aero\0ne.jp\0mil.kg\0" +"\xc3\xa5mli.no\0" +"education.museum\0" +"dgca.aero\0" +"mil.km\0" +"trolley.museum\0" +"cci.fr\0r.se\0" +"archaeological.museum\0" +"monzaedellabrianza.it\0mil.kr\0" +"gob.es\0kvafjord.no\0ky.us\0" +"lecco.it\0" +"ct.it\0" +"magazine.aero\0" +"operaunite.com\0ne.kr\0" +"mil.kz\0skoczow.pl\0" +"nf.ca\0" +"western.museum\0" +"kunst.museum\0gaivuotna.no\0karpacz.pl\0spb.ru\0cc.id.us\0" +"slask.pl\0" +"youth.museum\0" +"adv.br\0campidanomedio.it\0!songfest.om\0" +"geelvinck.museum\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0" +"mil.lv\0" +"fie.ee\0mil.mg\0mt.us\0nd.us\0k12.vt.us\0" +"t.bg\0ushuaia.museum\0" +"off.ai\0" +"irkutsk.ru\0" +"stor-elvdal.no\0tourism.tn\0" +"penza.ru\0" +"bj.cn\0\xe4\xb8\xad\xe5\x9b\xbd\0" +"civilwar.museum\0mil.mv\0opole.pl\0" +"nes.akershus.no\0" +"mil.my\0karelia.ru\0" +"como.it\0sande.vestfold.no\0" +"\xe4\xb8\xad\xe5\x9c\x8b\0" +"gob.hn\0lib.la.us\0" +"mil.no\0cc.wv.us\0" +"boleslawiec.pl\0" +"!pref.niigata.jp\0gs.sf.no\0dc.us\0k12.mi.us\0" +"museum\0dep.no\0kv\xc3\xa6nangen.no\0l\xc3\xa1hppi.no\0" +"film.museum\0" +"frei.no\0" +"notodden.no\0risor.no\0" +"messina.it\0" +"eidsberg.no\0" +"krakow.pl\0lib.mt.us\0lib.nd.us\0" +"rauma.no\0" +"mulhouse.museum\0" +"sibenik.museum\0grong.no\0mil.pe\0" +"budejju.no\0k12.nv.us\0" +"stavanger.no\0mil.ph\0" +"forli-cesena.it\0" +"naples.it\0cc.ne.us\0" +"s\xc3\xb8r-aurdal.no\0" +"mil.pl\0" +"vibo-valentia.it\0ski.museum\0siedlce.pl\0" +"bus.museum\0" +"tozsde.hu\0" +"!pref.shizuoka.jp\0santabarbara.museum\0" +"zhitomir.ua\0" +"pro.az\0" +"ne.pw\0" +"pro.br\0orkanger.no\0b\xc3\xb8.telemark.no\0" +"roma.it\0cc.ct.us\0" +"heritage.museum\0giske.no\0" +"!pref.kumamoto.jp\0prof.pr\0" +"*.kochi.jp\0" +"andria-barletta-trani.it\0*.toyama.jp\0sveio.no\0" +"id.us\0" +"bolt.hu\0" +"fetsund.no\0porsgrunn.no\0" +"iglesias-carbonia.it\0" +"sf.no\0" +"mil.ru\0" +"from.hr\0asnes.no\0mil.rw\0" +"alesund.no\0sos.pl\0" +"livorno.it\0" +"crafts.museum\0" +"aquila.it\0" +"vega.no\0" +"jewelry.museum\0" +"sk\xc3\xa1nit.no\0chita.ru\0" +"pro.ec\0" +"fortmissoula.museum\0j\xc3\xb8lster.no\0" +"pro\0mil.st\0" +"busan.kr\0lib.ga.us\0" +"dellogliastra.it\0" +"aosta.it\0chungnam.kr\0gob.mx\0" +"mil.sy\0k12.hi.us\0" +"mil.tj\0" +"ulan-ude.ru\0mil.to\0wv.us\0" +"luster.no\0volgograd.ru\0" +"pa.it\0kommunalforbund.se\0lib.tx.us\0" +"s.se\0" +"qsl.br\0" +"mil.tw\0" +"est.pr\0ens.tn\0" +"lib.id.us\0" +"mil.tz\0" +"uscountryestate.museum\0" +"agents.aero\0" +"\xc3\xb8vre-eiker.no\0ne.ug\0" +"pb.ao\0" +"gob.pa\0ne.tz\0" +"tur.br\0" +"mil.vc\0" +"or.at\0gob.pe\0" +"s\xc3\xb8r-fron.no\0" +"or.bi\0ne.us\0" +"u.bg\0gob.pk\0" +"stavern.no\0" +"brindisi.it\0" +"aknoluokta.no\0" +"!pref.kyoto.jp\0tydal.no\0" +"plc.ly\0muos\xc3\xa1t.no\0" +"or.ci\0hamaroy.no\0priv.pl\0" +"vestre-slidre.no\0gniezno.pl\0" +"\xe7\xae\x87\xe4\xba\xba.hk\0" +"andebu.no\0" +"nieruchomosci.pl\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" +"or.cr\0pro.ht\0bolzano.it\0" +"ct.us\0k12.md.us\0" +"za.org\0" +"!icnet.uk\0" +"localhistory.museum\0" +"firm.ht\0" +"lel.br\0tr.it\0kvanangen.no\0" +"sondre-land.no\0t\xc3\xb8nsberg.no\0vefsn.no\0" +"nature.museum\0yamal.ru\0" +"rv.ua\0" +"lans.museum\0lib.ne.us\0" +"lur\xc3\xb8y.no\0" +"eu.com\0firm.in\0" +"hjelmeland.no\0" +"gs.tr.no\0" +"casino.hu\0essex.museum\0tourism.pl\0" +"rennesoy.no\0" +"priv.no\0" +"baths.museum\0mytis.ru\0" +"tingvoll.no\0" +"cc.az.us\0" +"sh.cn\0" +"!pref.miyazaki.jp\0s\xc3\xb8rfold.no\0" +"aurskog-holand.no\0malatvuopmi.no\0" +"lib.ct.us\0" +"cc.pa.us\0" +"pa.gov.pl\0" +"firm.co\0cc.de.us\0" +"nrw.museum\0" +"daejeon.kr\0livinghistory.museum\0" +"gildeskal.no\0lund.no\0" +"\xc3\xb8ksnes.no\0stavropol.ru\0" +"b\xc3\xa6rum.no\0r\xc3\xb8yrvik.no\0" +"osoyro.no\0" +"priv.me\0sula.no\0!parliament.uk\0" +"nationalheritage.museum\0" +"jaworzno.pl\0" +"dinosaur.museum\0" +"garden.museum\0trust.museum\0" +"turen.tn\0" +"kautokeino.no\0" +"pro.na\0" +"gorizia.it\0" +"siljan.no\0" +"or.id\0pro.mv\0" +"bieszczady.pl\0www.ro\0" +"lib.ee\0antiques.museum\0brasil.museum\0tr.no\0" +"aejrie.no\0" +"!pref.hokkaido.jp\0" +"schlesisches.museum\0" +"huissier-justice.fr\0or.it\0" +"t.se\0" +"environment.museum\0" +"vindafjord.no\0" +"edu.ac\0or.jp\0" +"tree.museum\0" +"groundhandling.aero\0edu.af\0" +"rochester.museum\0sanfrancisco.museum\0" +"ebiz.tw\0" +"kirovograd.ua\0" +"edu.al\0" +"edu.an\0\xc3\xa1k\xc5\x8boluokta.no\0v\xc3\xa5g\xc3\xa5.no\0" +"v.bg\0" +"edu.ba\0" +"edu.bb\0nesset.no\0" +"hornindal.no\0pro.pr\0" +"or.kr\0" +"az.us\0" +"edu.bh\0volkenkunde.museum\0" +"edu.bi\0" +"edu.az\0" +"b\xc3\xb8mlo.no\0" +"edu.bm\0" +"edu.bo\0tyumen.ru\0" +"edu.br\0" +"edu.bs\0pa.us\0" +"alto-adige.it\0whaling.museum\0" +"*.iwate.jp\0" +"edu.ci\0law.pro\0" +"edu.bz\0de.us\0" +"lib.ak.us\0" +"edu.cn\0" +"edu.co\0" +"laspezia.it\0" +"baidar.no\0" +"ts.it\0" +"or.na\0" +"edu.cu\0hotel.lk\0" +"show.aero\0or.mu\0" +"sandnes.no\0" +"museumcenter.museum\0" +"edu.dm\0kazan.ru\0" +"biz\0caltanissetta.it\0odessa.ua\0k12.oh.us\0" +"crimea.ua\0" +"research.aero\0lom.no\0" +"edu.ec\0florence.it\0clock.museum\0sshn.se\0" +"edu.ee\0game.tw\0" +"!pref.okinawa.jp\0" +"ilawa.pl\0" +"edu.dz\0indiana.museum\0" +"gs.jan-mayen.no\0" +"publ.pt\0" +"nom.ad\0" +"skanit.no\0gdansk.pl\0k12.pa.us\0" +"nom.ag\0edu.es\0" +"if.ua\0" +"pro.tt\0lib.de.us\0" +"environmentalconservation.museum\0cc.or.us\0" +"bern.museum\0nat.tn\0" +"rubtsovsk.ru\0" +"!educ.ar\0masoy.no\0" +"bologna.it\0" +"\xc3\xa5snes.no\0fhv.se\0" +"*.tottori.jp\0radoy.no\0" +"romskog.no\0" +"malbork.pl\0" +"olbiatempio.it\0" +"edu.ge\0" +"edu.gh\0" +"edu.gi\0" +"or.pw\0" +"hob\xc3\xb8l.no\0" +"nom.br\0edu.gn\0virginia.museum\0mbone.pl\0!nls.uk\0" +"seljord.no\0pro.vn\0" +"edu.gp\0" +"edu.gr\0" +"!uba.ar\0!pref.saitama.jp\0" +"greta.fr\0gs.aa.no\0kvinnherad.no\0" +"lib.sc.us\0" +"js.cn\0nom.co\0edu.hk\0" +"lesja.no\0" +"bl.it\0" +"edu.hn\0\xc3\xb8ystre-slidre.no\0mari-el.ru\0" +"hotel.hu\0" +"rindal.no\0" +"edu.ht\0" +"!pref.miyagi.jp\0" +"midtre-gauldal.no\0" +"xj.cn\0australia.museum\0" +"ab.ca\0salvadordali.museum\0olawa.pl\0" +"pc.it\0" +"u.se\0" +"edu.in\0b\xc3\xa1l\xc3\xa1t.no\0" +"ln.cn\0alta.no\0" +"chelyabinsk.ru\0" +"edu.iq\0" +"ontario.museum\0" +"edu.is\0" +"edu.it\0" +"b\xc3\xa5tsfjord.no\0" +"trysil.no\0or.th\0" +"utsira.no\0" +"nom.es\0edu.jo\0fhsk.se\0" +"bale.museum\0" +"w.bg\0" +"lillesand.no\0" +"edu.kg\0" +"amusement.aero\0" +"edu.ki\0" +"fauske.no\0or.ug\0" +"int.az\0askvoll.no\0eidskog.no\0cv.ua\0" +"algard.no\0" +"edu.km\0or.tz\0" +"nom.fr\0edu.kn\0" +"*.ibaraki.jp\0hoylandet.no\0" +"int.bo\0edu.kp\0" +"edu.la\0" +"si.it\0edu.lb\0travel.pl\0" +"edu.lc\0mx.na\0n\xc3\xa1vuotna.no\0ovre-eiker.no\0" +"aa.no\0!siemens.om\0" +"sciences.museum\0or.us\0" +"cat\0" +"edu.ky\0" +"int.ci\0edu.kz\0firm.ro\0cc.wy.us\0" +"edu.lk\0vaapste.no\0" +"!pref.tochigi.jp\0" +"int.co\0podlasie.pl\0" +"edu.lr\0" +"karikatur.museum\0jamal.ru\0" +"gjovik.no\0krager\xc3\xb8.no\0k12.az.us\0" +"edu.me\0" +"ud.it\0edu.lv\0entomology.museum\0" +"edu.mg\0moskenes.no\0" +"\xe6\x94\xbf\xe5\xba\x9c.hk\0edu.ly\0" +"stpetersburg.museum\0" +"edu.mk\0" +"edu.ml\0nordreisa.no\0" +"!pref.fukui.jp\0lib.ms.us\0lib.nc.us\0" +"edu.mn\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" +"fot.br\0edu.mo\0" +"iron.museum\0" +"asti.it\0annefrank.museum\0stv.ru\0cc.nh.us\0" +"edu.mv\0" +"lodi.it\0edu.mw\0edu.ng\0" +"gwangju.kr\0edu.mx\0" +"edu.my\0" +"soundandvision.museum\0" +"lenvik.no\0" +"ballooning.aero\0" +"name\0" +"jogasz.hu\0frogn.no\0" +"history.museum\0" +"consultant.aero\0edu.nr\0" +"manchester.museum\0" +"*.hiroshima.jp\0" +"pol.dz\0" +"*.tochigi.jp\0heimatunduhren.museum\0" +"!pref.kanagawa.jp\0" +"firm.nf\0edu.pa\0" +"coop.ht\0pc.pl\0" +"chicago.museum\0" +"vn.ua\0" +"edu.pe\0" +"tana.no\0edu.pf\0" +"edu.ph\0" +"nom.km\0" +"travel.tt\0" +"edu.pk\0" +"experts-comptables.fr\0edu.pl\0bryansk.ru\0" +"edu.pn\0" +"evje-og-hornnes.no\0warszawa.pl\0" +"ac.ae\0" +"edu.pr\0" +"vaksdal.no\0edu.ps\0dni.us\0" +"po.gov.pl\0edu.pt\0" +"nordre-land.no\0vadso.no\0" +"rnrt.tn\0" +"sport.hu\0!pref.gifu.jp\0voss.no\0targi.pl\0" +"flesberg.no\0" +"photography.museum\0" +"modena.it\0tonsberg.no\0" +"ac.at\0" +"ac.be\0coop.br\0" +"services.aero\0" +"nom.mg\0" +"wielun.pl\0" +"jefferson.museum\0wy.us\0" +"pd.it\0ot.it\0neues.museum\0slattum.no\0" +"vdonsk.ru\0" +"ar.com\0edu.sa\0" +"\xc3\xa5l.no\0edu.sb\0" +"edu.rs\0edu.sc\0" +"ac.ci\0int.is\0edu.sd\0!tsk.tr\0" +"br\xc3\xb8nn\xc3\xb8ysund.no\0and\xc3\xb8y.no\0edu.ru\0" +"pol.ht\0" +"edu.rw\0edu.sg\0" +"gyeongnam.kr\0olecko.pl\0" +"ac.cn\0" +"graz.museum\0" +"coldwar.museum\0edu.sl\0" +"ac.cr\0" +"edu.sn\0" +"hamar.no\0" +"histoire.museum\0" +"!city.shizuoka.jp\0" +"edu.st\0" +"oceanographic.museum\0nh.us\0" +"x.bg\0" +"surnadal.no\0" +"fc.it\0costume.museum\0stalowa-wola.pl\0" +"valer.ostfold.no\0edu.sy\0" +"edu.tj\0" +"arq.br\0" +"aeroclub.aero\0odo.br\0pe.ca\0\xe7\xb6\xb2\xe7\xb5\xa1.cn\0bronnoysund.no\0nom.pa\0" +"edu.to\0" +"paleo.museum\0nom.pe\0edu.ua\0" +"int.la\0trustee.museum\0forsand.no\0krasnoyarsk.ru\0" +"!pref.hyogo.jp\0" +"edu.tt\0" +"zarow.pl\0" +"edu.tw\0" +"nom.pl\0" +"community.museum\0kvitsoy.no\0" +"int.lk\0tychy.pl\0" +"k12.me.us\0" +"jondal.no\0edu.vc\0" +"illustration.museum\0" +"clinton.museum\0" +"tas.au\0es.kr\0" +"production.aero\0" +"rodoy.no\0" +"database.museum\0bodo.no\0" +"anthro.museum\0landes.museum\0edu.vn\0" +"nom.re\0" +"altai.ru\0" +"filatelia.museum\0" +"sk.ca\0lezajsk.pl\0" +"rockart.museum\0int.mv\0" +"int.mw\0herad.no\0" +"eti.br\0ac.gn\0" +"fedje.no\0nom.ro\0" +"money.museum\0" +"\xd9\x85\xd8\xb5\xd8\xb1\0" +"horten.no\0" +"gangaviika.no\0mielec.pl\0" +"uw.gov.pl\0" +"moma.museum\0" +"edu.ws\0" +"go.ci\0" +"tv.bo\0technology.museum\0" +"s\xc3\xb8ndre-land.no\0" +"tv.br\0" +"jor.br\0lib.dc.us\0" +"arboretum.museum\0" +"go.cr\0" +"artsandcrafts.museum\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" +"psc.br\0ac.id\0!city.chiba.jp\0" +"wa.au\0" +"rome.it\0" +"amli.no\0" +"ac.im\0lo.it\0" +"ac.in\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0durham.museum\0" +"ac.ir\0" +"torino.museum\0" +"loabat.no\0" +"com\0" +"nalchik.ru\0" +"yakutia.ru\0" +"settlers.museum\0" +"!promocion.ar\0int.pt\0" +"union.aero\0" +"utah.museum\0" +"giehtavuoatna.no\0" +"ac.jp\0" +"air-traffic-control.aero\0" +"silk.museum\0usantiques.museum\0" +"bn.it\0" +"kalisz.pl\0" +"perm.ru\0" +"aoste.it\0bindal.no\0" +"coloradoplateau.museum\0k12.gu.us\0" +"frosinone.it\0forde.no\0" +"epilepsy.museum\0" +"olbia-tempio.it\0" +"journalist.aero\0ac.kr\0*.sch.uk\0" +"nic.im\0sciencesnaturelles.museum\0bedzin.pl\0" +"nic.in\0pe.it\0" +"w.se\0" +"!pref.okayama.jp\0" +"urn.arpa\0" +"cinema.museum\0" +"monza.it\0versailles.museum\0int.ru\0" +"andasuolo.no\0skj\xc3\xa5k.no\0chernovtsy.ua\0" +"nyc.museum\0int.rw\0paroch.k12.ma.us\0" +"ringerike.no\0" +"ac.ma\0" +"org.ac\0civilaviation.aero\0" +"rakkestad.no\0" +"org.ae\0ac.me\0" +"org.af\0" +"org.ag\0" +"org.ai\0stokke.no\0" +"airport.aero\0" +"finnoy.no\0" +"org.al\0" +"org.an\0y.bg\0habmer.no\0" +"stadt.museum\0holtalen.no\0" +"int.tj\0" +"org.ba\0gjerdrum.no\0" +"org.bb\0ascoli-piceno.it\0molde.no\0r\xc3\xb8st.no\0tysfjord.no\0" +"pe.kr\0rybnik.pl\0" +"go.id\0" +"ac.mu\0" +"ac.mw\0ac.ng\0" +"org.bh\0\xc3\xa5mot.no\0rana.no\0" +"org.bi\0" +"org.az\0belgorod.ru\0int.tt\0" +"ae.org\0" +"group.aero\0posts-and-telecommunications.museum\0" +"org.bm\0salerno.it\0" +"etnedal.no\0" +"org.bo\0*.hokkaido.jp\0donetsk.ua\0" +"ostroda.pl\0" +"org.br\0" +"org.bs\0" +"go.it\0h\xc3\xb8ylandet.no\0" +"zgorzelec.pl\0" +"org.bw\0" +"org.ci\0" +"org.bz\0vicenza.it\0resistance.museum\0" +"missile.museum\0" +"org.cn\0" +"org.co\0assassination.museum\0" +"go.jp\0" +"tv.it\0austrheim.no\0ac.pa\0" +"verbania.it\0" +"palace.museum\0" +"tmp.br\0int.vn\0" +"org.cu\0" +"paris.museum\0" +"media.aero\0hokksund.no\0" +"arts.museum\0gemological.museum\0hammerfest.no\0" +"k12.ny.us\0" +"org.dm\0hemsedal.no\0ringsaker.no\0sklep.pl\0" +"h\xc3\xa5.no\0cc.nj.us\0" +"rzeszow.pl\0" +"go.kr\0gjesdal.no\0ac.pr\0" +"org.ec\0" +"org.ee\0" +"media.museum\0" +"terni.it\0touch.museum\0zakopane.pl\0" +"journal.aero\0org.dz\0" +"incheon.kr\0" +"b\xc3\xa1hcavuotna.no\0" +"leksvik.no\0ulvik.no\0" +"plantation.museum\0" +"org.es\0loyalist.museum\0" +"gildesk\xc3\xa5l.no\0bytom.pl\0" +"bo.nordland.no\0" +"ambulance.aero\0iglesiascarbonia.it\0" +"tw.cn\0\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0" +"chocolate.museum\0" +"pittsburgh.museum\0" +"royrvik.no\0sor-odal.no\0ac.rs\0" +"kaluga.ru\0" +"org.ge\0erotica.hu\0ac.ru\0ac.se\0" +"org.gg\0leangaviika.no\0ac.rw\0" +"org.gh\0v\xc3\xa6r\xc3\xb8y.no\0" +"org.gi\0" +"jevnaker.no\0" +"org.gn\0tv.na\0leikanger.no\0" +"org.gp\0" +"ask\xc3\xb8y.no\0" +"org.gr\0wroc.pl\0" +"ad.jp\0" +"powiat.pl\0" +"tj\xc3\xb8me.no\0" +"coop.tt\0" +"ac.th\0" +"mragowo.pl\0ac.sz\0ac.tj\0" +"org.hk\0bo.it\0" +"philately.museum\0" +"org.hn\0" +"fet.no\0" +"axis.museum\0mansions.museum\0" +"wiki.br\0" +"org.ht\0" +"org.hu\0piacenza.it\0scotland.museum\0cpa.pro\0" +"ac.ug\0" +"coop.mv\0x.se\0" +"coop.mw\0ac.tz\0" +"bmd.br\0" +"org.im\0ralingen.no\0" +"org.in\0" +"cz.it\0lib.ia.us\0" +"org.iq\0" +"org.ir\0" +"org.is\0" +"nl.ca\0" +"org.je\0" +"childrensgarden.museum\0" +"kvits\xc3\xb8y.no\0go.pw\0" +"sokndal.no\0" +"ra.it\0grimstad.no\0" +"denmark.museum\0" +"ac.vn\0" +"ecn.br\0org.jo\0" +"bialystok.pl\0nj.us\0" +"z.bg\0bilbao.museum\0stargard.pl\0nic.tj\0" +"eisenbahn.museum\0" +"fe.it\0bryne.no\0vrn.ru\0" +"cc.wa.us\0" +"sex.hu\0skierva.no\0" +"org.kg\0" +"org.ki\0" +"org.km\0" +"org.kn\0khakassia.ru\0" +"org.kp\0" +"org.la\0" +"org.lb\0" +"org.lc\0" +"francaise.museum\0" +"panama.museum\0" +"rotorcraft.aero\0gateway.museum\0olkusz.pl\0" +"org.ky\0czeladz.pl\0ryazan.ru\0" +"org.kz\0" +"org.lk\0dyr\xc3\xb8y.no\0" +"raisa.no\0" +"dlugoleka.pl\0" +"org.ma\0" +"org.lr\0prochowice.pl\0" +"org.ls\0" +"org.me\0sandoy.no\0s\xc3\xb8r-varanger.no\0" +"org.lv\0" +"org.mg\0" +"tel\0go.th\0" +"org.ly\0" +"steam.museum\0go.tj\0" +"org.mk\0pasadena.museum\0jessheim.no\0lib.mn.us\0" +"org.ml\0" +"software.aero\0" +"org.mn\0" +"org.mo\0" +"*.fukui.jp\0decorativearts.museum\0" +"spy.museum\0org.na\0jorpeland.no\0" +"vads\xc3\xb8.no\0" +"org.mu\0building.museum\0gausdal.no\0" +"org.mv\0nannestad.no\0" +"org.mw\0org.ng\0go.ug\0" +"vr.it\0org.mx\0" +"org.my\0" +"go.tz\0" +"oppdal.no\0" +"uk.net\0" +"coop.km\0" +"*.kyoto.jp\0" +"sarpsborg.no\0org.nr\0" +"chernigov.ua\0" +"ha.cn\0no.com\0" +"space.museum\0" +"org.pa\0" +"*.ar\0" +"usgarden.museum\0" +"*.bd\0org.pe\0" +"*.au\0org.pf\0um.gov.pl\0" +"bio.br\0" +"org.ph\0" +"org.pk\0" +"fr\xc3\xa6na.no\0org.pl\0" +"nord-aurdal.no\0org.pn\0" +"*.bn\0handson.museum\0agrinet.tn\0" +"kviteseid.no\0" +"rel.ht\0virtuel.museum\0atm.pl\0org.pr\0" +"org.ps\0cherkassy.ua\0" +"org.pt\0wa.us\0" +"*.bt\0arendal.no\0magnitka.ru\0" +"depot.museum\0porsangu.no\0" +"laakesvuemie.no\0" +"sor-fron.no\0" +"heroy.more-og-romsdal.no\0" +"*.ck\0" +"!rakpetroleum.om\0" +"kr\xc3\xb8""dsherad.no\0mail.pl\0" +"mod.gi\0" +"gs.nl.no\0" +"mb.ca\0" +"pavia.it\0" +"civilisation.museum\0folldal.no\0" +"suli.hu\0" +"brumunddal.no\0" +"*.cy\0" +"pg.it\0troms\xc3\xb8.no\0" +"sex.pl\0y.se\0" +"org.ro\0" +"*.do\0" +"caserta.it\0org.sa\0" +"za.com\0halloffame.museum\0org.sb\0lviv.ua\0" +"mill.museum\0org.rs\0org.sc\0" +"org.sd\0" +"idv.hk\0!omanmobile.om\0org.ru\0org.se\0" +"langev\xc3\xa5g.no\0r\xc3\xa5holt.no\0starostwo.gov.pl\0" +"trani-andria-barletta.it\0org.sg\0" +"*.eg\0hvaler.no\0" +"*.ehime.jp\0" +"gmina.pl\0" +"bod\xc3\xb8.no\0org.sl\0" +"edu\0org.sn\0" +"org.so\0lib.wi.us\0" +"kommune.no\0" +"nome.pt\0" +"*.er\0namdalseid.no\0k12.wa.us\0" +"nm.cn\0org.st\0" +"*.et\0d\xc3\xb8nna.no\0" +"jewish.museum\0preservation.museum\0" +"slupsk.pl\0org.sy\0" +"art.br\0org.sz\0org.tj\0" +"ntr.br\0*.fj\0ski.no\0" +"*.fk\0rimini.it\0grajewo.pl\0" +"loppa.no\0" +"franziskaner.museum\0notteroy.no\0org.tn\0" +"org.to\0" +"nesoddtangen.no\0" +"org.ua\0" +"discovery.museum\0wloclawek.pl\0" +"lakas.hu\0org.tt\0" +"kurgan.ru\0" +"baltimore.museum\0nkz.ru\0org.tw\0" +"com.ac\0castle.museum\0" +"*.fukuoka.jp\0sandefjord.no\0varggat.no\0" +"com.af\0" +"com.ag\0" +"ato.br\0k12.nj.us\0" +"com.ai\0" +"city.hu\0oryol.ru\0" +"com.al\0nl.no\0mielno.pl\0cc.ma.us\0" +"org.vc\0" +"com.an\0g12.br\0" +"*.gt\0" +"*.gu\0" +"com.ba\0" +"com.bb\0americanart.museum\0" +"org.vi\0" +"kunstsammlung.museum\0" +"com.aw\0" +"flight.aero\0com.bh\0lib.mo.us\0org.vn\0" +"com.bi\0adygeya.ru\0" +"com.az\0" +"art.dz\0" +"com.bm\0" +"dr\xc3\xb8""bak.no\0" +"com.bo\0isla.pr\0" +"com.br\0" +"com.bs\0ustka.pl\0kuban.ru\0" +"press.aero\0" +"vs.it\0" +"meloy.no\0" +"*.il\0ulm.museum\0" +"com.by\0com.ci\0genoa.it\0" +"com.bz\0sn.cn\0" +"lib.or.us\0" +"santafe.museum\0org.ws\0" +}; + +QT_END_NAMESPACE + +#endif // QURLTLD_P_H diff --git a/src/corelib/io/qurltlds_p.h.INFO b/src/corelib/io/qurltlds_p.h.INFO new file mode 100644 index 0000000..57a8d0e --- /dev/null +++ b/src/corelib/io/qurltlds_p.h.INFO @@ -0,0 +1,17 @@ +The file qnetworkcookiejartlds_p.h is generated from the Public Suffix +List (see [1] and [2]), by the program residing at +util/network/cookiejar-generateTLDs in the Qt source tree. + +That program generates a character array and an index array from the +list to provide fast lookups of elements within C++. + +Those arrays in qnetworkcookiejartlds_p.h are derived from the Public +Suffix List ([2]), which was originally provided by +Jo Hermans . + +The file qnetworkcookiejartlds_p.h was last generated Friday, +November 19th 15:24 2010. + +---- +[1] list: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 +[2] homepage: http://publicsuffix.org/ diff --git a/src/network/access/access.pri b/src/network/access/access.pri index 5ead3ad..99e861e 100644 --- a/src/network/access/access.pri +++ b/src/network/access/access.pri @@ -22,7 +22,6 @@ HEADERS += \ access/qnetworkcookie_p.h \ access/qnetworkcookiejar.h \ access/qnetworkcookiejar_p.h \ - access/qnetworkcookiejartlds_p.h \ access/qnetworkrequest.h \ access/qnetworkrequest_p.h \ access/qnetworkreply.h \ diff --git a/src/network/access/qnetworkcookiejar.cpp b/src/network/access/qnetworkcookiejar.cpp index 53fab9f..f2b1714 100644 --- a/src/network/access/qnetworkcookiejar.cpp +++ b/src/network/access/qnetworkcookiejar.cpp @@ -40,12 +40,12 @@ ****************************************************************************/ #include "qnetworkcookiejar.h" -#include "qnetworkcookiejartlds_p.h" #include "qnetworkcookiejar_p.h" #include "QtNetwork/qnetworkcookie.h" #include "QtCore/qurl.h" #include "QtCore/qdatetime.h" +#include "private/qtldurl_p.h" QT_BEGIN_NAMESPACE @@ -216,7 +216,7 @@ bool QNetworkCookieJar::setCookiesFromUrl(const QList &cookieLis // the check for effective TLDs makes the "embedded dot" rule from RFC 2109 section 4.3.2 // redundant; the "leading dot" rule has been relaxed anyway, see above // we remove the leading dot for this check - if (QNetworkCookieJarPrivate::isEffectiveTLD(domain.remove(0, 1))) + if (qIsEffectiveTLD(domain.remove(0, 1))) continue; // not accepted } @@ -304,43 +304,4 @@ QList QNetworkCookieJar::cookiesForUrl(const QUrl &url) const return result; } -bool QNetworkCookieJarPrivate::isEffectiveTLD(const QString &domain) -{ - // for domain 'foo.bar.com': - // 1. return if TLD table contains 'foo.bar.com' - if (containsTLDEntry(domain)) - return true; - - if (domain.contains(QLatin1Char('.'))) { - int count = domain.size() - domain.indexOf(QLatin1Char('.')); - QString wildCardDomain; - wildCardDomain.reserve(count + 1); - wildCardDomain.append(QLatin1Char('*')); - wildCardDomain.append(domain.right(count)); - // 2. if table contains '*.bar.com', - // test if table contains '!foo.bar.com' - if (containsTLDEntry(wildCardDomain)) { - QString exceptionDomain; - exceptionDomain.reserve(domain.size() + 1); - exceptionDomain.append(QLatin1Char('!')); - exceptionDomain.append(domain); - return (! containsTLDEntry(exceptionDomain)); - } - } - return false; -} - -bool QNetworkCookieJarPrivate::containsTLDEntry(const QString &entry) -{ - int index = qHash(entry) % tldCount; - int currentDomainIndex = tldIndices[index]; - while (currentDomainIndex < tldIndices[index+1]) { - QString currentEntry = QString::fromUtf8(tldData + currentDomainIndex); - if (currentEntry == entry) - return true; - currentDomainIndex += qstrlen(tldData + currentDomainIndex) + 1; // +1 for the ending \0 - } - return false; -} - QT_END_NAMESPACE diff --git a/src/network/access/qnetworkcookiejar_p.h b/src/network/access/qnetworkcookiejar_p.h index d6dc450..ce5a87a 100644 --- a/src/network/access/qnetworkcookiejar_p.h +++ b/src/network/access/qnetworkcookiejar_p.h @@ -63,9 +63,6 @@ class QNetworkCookieJarPrivate: public QObjectPrivate public: QList allCookies; - static bool Q_AUTOTEST_EXPORT isEffectiveTLD(const QString &domain); - static bool containsTLDEntry(const QString &entry); - Q_DECLARE_PUBLIC(QNetworkCookieJar) }; diff --git a/src/network/access/qnetworkcookiejartlds_p.h b/src/network/access/qnetworkcookiejartlds_p.h deleted file mode 100644 index b06d881..0000000 --- a/src/network/access/qnetworkcookiejartlds_p.h +++ /dev/null @@ -1,6481 +0,0 @@ -// Version: MPL 1.1/GPL 2.0/LGPL 2.1 -// -// The contents of this file are subject to the Mozilla Public License Version -// 1.1 (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.mozilla.org/MPL/ -// -// Software distributed under the License is distributed on an "AS IS" basis, -// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -// for the specific language governing rights and limitations under the -// License. -// -// The Original Code is the Public Suffix List. -// -// The Initial Developer of the Original Code is -// Jo Hermans . -// Portions created by the Initial Developer are Copyright (C) 2007 -// the Initial Developer. All Rights Reserved. -// -// Contributor(s): -// Ruben Arakelyan -// Gervase Markham -// Pamela Greene -// David Triendl -// Jothan Frakes -// The kind representatives of many TLD registries -// -// Alternatively, the contents of this file may be used under the terms of -// either the GNU General Public License Version 2 or later (the "GPL"), or -// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -// in which case the provisions of the GPL or the LGPL are applicable instead -// of those above. If you wish to allow use of your version of this file only -// under the terms of either the GPL or the LGPL, and not to allow others to -// use your version of this file under the terms of the MPL, indicate your -// decision by deleting the provisions above and replace them with the notice -// and other provisions required by the GPL or the LGPL. If you do not delete -// the provisions above, a recipient may use your version of this file under -// the terms of any one of the MPL, the GPL or the LGPL. -// - -#ifndef QNETWORKCOOKIEJARTLD_P_H -#define QNETWORKCOOKIEJARTLD_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of the Network Access framework. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// - -QT_BEGIN_NAMESPACE - -// note to maintainer: -// this file should be updated before each release -> -// for instructions see the program at -// util/network/cookiejar-generateTLDs - -static const quint16 tldCount = 3949; -static const quint16 tldIndices[] = { -0, -7, -14, -14, -20, -51, -61, -93, -100, -100, -116, -159, -167, -180, -180, -193, -234, -234, -234, -255, -255, -255, -280, -280, -287, -287, -295, -303, -313, -326, -326, -380, -393, -413, -419, -419, -419, -424, -438, -438, -469, -515, -515, -515, -534, -534, -557, -557, -557, -557, -572, -572, -572, -579, -587, -597, -612, -612, -624, -636, -648, -662, -687, -709, -714, -740, -766, -789, -789, -805, -805, -810, -815, -815, -824, -824, -831, -857, -869, -891, -891, -916, -916, -916, -927, -934, -964, -971, -987, -987, -987, -1008, -1008, -1016, -1016, -1030, -1030, -1052, -1075, -1075, -1082, -1087, -1115, -1135, -1135, -1135, -1172, -1178, -1178, -1178, -1202, -1207, -1220, -1220, -1266, -1266, -1266, -1266, -1272, -1290, -1316, -1316, -1332, -1332, -1339, -1339, -1352, -1352, -1389, -1389, -1408, -1415, -1437, -1444, -1489, -1489, -1502, -1502, -1512, -1518, -1539, -1555, -1562, -1584, -1598, -1607, -1607, -1607, -1632, -1652, -1652, -1658, -1658, -1675, -1682, -1709, -1733, -1748, -1776, -1783, -1783, -1790, -1797, -1826, -1850, -1850, -1856, -1880, -1887, -1901, -1921, -1947, -1961, -1967, -1967, -1967, -1972, -1986, -1986, -1986, -2009, -2029, -2029, -2047, -2061, -2075, -2075, -2075, -2075, -2075, -2075, -2082, -2082, -2124, -2124, -2129, -2162, -2162, -2162, -2236, -2256, -2263, -2276, -2283, -2313, -2313, -2347, -2380, -2387, -2387, -2387, -2431, -2438, -2445, -2452, -2459, -2459, -2469, -2490, -2516, -2527, -2540, -2540, -2586, -2610, -2630, -2630, -2653, -2660, -2669, -2693, -2693, -2710, -2710, -2719, -2719, -2734, -2740, -2740, -2753, -2753, -2763, -2770, -2775, -2782, -2789, -2802, -2820, -2827, -2827, -2841, -2855, -2855, -2865, -2872, -2884, -2884, -2919, -2937, -2955, -2962, -3012, -3042, -3073, -3083, -3083, -3100, -3105, -3112, -3131, -3131, -3166, -3180, -3187, -3194, -3211, -3218, -3223, -3233, -3249, -3259, -3268, -3314, -3314, -3324, -3324, -3336, -3336, -3336, -3336, -3350, -3363, -3376, -3398, -3416, -3445, -3464, -3488, -3488, -3497, -3545, -3552, -3552, -3552, -3566, -3573, -3573, -3573, -3581, -3581, -3603, -3603, -3615, -3621, -3621, -3683, -3683, -3710, -3710, -3716, -3716, -3748, -3770, -3791, -3803, -3810, -3817, -3833, -3846, -3846, -3852, -3876, -3876, -3882, -3903, -3910, -3939, -3939, -3939, -3947, -3962, -3962, -3981, -3994, -4021, -4030, -4042, -4085, -4085, -4096, -4096, -4104, -4123, -4123, -4123, -4143, -4154, -4164, -4194, -4194, -4194, -4205, -4205, -4222, -4238, -4301, -4309, -4322, -4331, -4331, -4331, -4331, -4331, -4347, -4365, -4375, -4375, -4385, -4398, -4412, -4430, -4430, -4437, -4447, -4463, -4472, -4472, -4472, -4484, -4484, -4484, -4484, -4484, -4490, -4490, -4511, -4511, -4522, -4522, -4522, -4522, -4528, -4528, -4534, -4551, -4551, -4551, -4564, -4583, -4583, -4611, -4611, -4611, -4622, -4622, -4649, -4668, -4677, -4692, -4692, -4692, -4705, -4723, -4723, -4723, -4729, -4729, -4743, -4743, -4750, -4750, -4763, -4770, -4776, -4776, -4776, -4793, -4811, -4811, -4811, -4821, -4821, -4841, -4857, -4891, -4897, -4903, -4903, -4903, -4919, -4935, -4942, -4958, -4958, -4975, -4975, -4975, -4985, -4985, -5020, -5032, -5032, -5040, -5053, -5068, -5079, -5079, -5101, -5115, -5115, -5135, -5154, -5161, -5161, -5168, -5168, -5184, -5210, -5210, -5238, -5255, -5278, -5285, -5308, -5318, -5327, -5327, -5333, -5333, -5340, -5348, -5355, -5366, -5377, -5384, -5408, -5415, -5422, -5435, -5442, -5482, -5482, -5482, -5482, -5498, -5527, -5534, -5541, -5572, -5572, -5572, -5579, -5591, -5602, -5602, -5621, -5621, -5646, -5664, -5671, -5671, -5681, -5696, -5707, -5716, -5716, -5723, -5723, -5732, -5742, -5742, -5763, -5770, -5776, -5790, -5790, -5797, -5806, -5816, -5832, -5882, -5882, -5882, -5882, -5893, -5934, -5934, -5965, -5965, -5980, -5980, -5980, -5980, -6007, -6017, -6034, -6051, -6065, -6075, -6075, -6091, -6097, -6097, -6109, -6109, -6109, -6122, -6147, -6168, -6168, -6191, -6191, -6191, -6191, -6191, -6198, -6217, -6224, -6224, -6231, -6245, -6252, -6252, -6270, -6270, -6284, -6305, -6315, -6322, -6322, -6322, -6329, -6329, -6329, -6353, -6361, -6361, -6375, -6391, -6405, -6405, -6415, -6431, -6431, -6431, -6431, -6458, -6475, -6475, -6475, -6482, -6489, -6496, -6496, -6503, -6520, -6520, -6520, -6527, -6527, -6544, -6561, -6573, -6573, -6580, -6580, -6587, -6587, -6592, -6592, -6592, -6592, -6599, -6599, -6612, -6633, -6649, -6649, -6669, -6676, -6683, -6683, -6713, -6720, -6727, -6736, -6736, -6746, -6770, -6807, -6814, -6827, -6846, -6846, -6864, -6864, -6864, -6864, -6881, -6888, -6888, -6888, -6914, -6935, -6935, -6935, -6953, -6959, -6966, -6983, -6983, -6983, -7013, -7023, -7023, -7023, -7023, -7037, -7044, -7058, -7079, -7086, -7123, -7134, -7155, -7168, -7178, -7203, -7227, -7236, -7258, -7265, -7274, -7274, -7303, -7303, -7314, -7314, -7345, -7352, -7367, -7377, -7388, -7388, -7402, -7402, -7409, -7421, -7421, -7467, -7484, -7484, -7484, -7491, -7532, -7532, -7539, -7546, -7546, -7553, -7573, -7573, -7573, -7580, -7587, -7594, -7594, -7594, -7606, -7606, -7637, -7637, -7637, -7664, -7664, -7664, -7677, -7684, -7701, -7723, -7723, -7723, -7723, -7734, -7734, -7734, -7748, -7748, -7748, -7748, -7759, -7759, -7775, -7775, -7782, -7789, -7817, -7824, -7831, -7836, -7865, -7865, -7876, -7901, -7901, -7908, -7918, -7938, -7945, -7945, -7957, -7964, -7979, -7986, -7994, -8007, -8007, -8014, -8021, -8061, -8061, -8071, -8088, -8131, -8138, -8153, -8160, -8160, -8160, -8175, -8183, -8197, -8211, -8211, -8211, -8243, -8243, -8243, -8243, -8259, -8259, -8259, -8259, -8259, -8266, -8275, -8281, -8281, -8281, -8281, -8288, -8288, -8309, -8309, -8309, -8330, -8330, -8330, -8330, -8337, -8343, -8343, -8360, -8370, -8370, -8380, -8380, -8386, -8386, -8397, -8415, -8415, -8428, -8454, -8460, -8475, -8492, -8526, -8554, -8554, -8583, -8583, -8583, -8598, -8607, -8617, -8617, -8642, -8652, -8652, -8652, -8662, -8688, -8688, -8704, -8704, -8747, -8765, -8775, -8783, -8811, -8835, -8835, -8835, -8850, -8859, -8884, -8910, -8919, -8952, -8978, -8978, -8991, -8991, -8991, -8999, -8999, -8999, -9030, -9030, -9030, -9030, -9030, -9041, -9048, -9048, -9054, -9054, -9054, -9086, -9108, -9108, -9119, -9119, -9130, -9144, -9152, -9161, -9174, -9194, -9207, -9207, -9207, -9232, -9242, -9242, -9271, -9290, -9308, -9308, -9308, -9308, -9320, -9333, -9343, -9356, -9379, -9379, -9379, -9395, -9395, -9406, -9419, -9419, -9419, -9419, -9450, -9485, -9485, -9497, -9497, -9505, -9517, -9528, -9528, -9551, -9564, -9586, -9586, -9608, -9608, -9626, -9626, -9626, -9653, -9653, -9681, -9681, -9681, -9698, -9698, -9698, -9714, -9729, -9737, -9737, -9765, -9765, -9765, -9765, -9765, -9825, -9844, -9866, -9880, -9880, -9880, -9880, -9886, -9895, -9895, -9895, -9895, -9895, -9913, -9913, -9924, -9958, -9958, -9967, -9975, -9975, -9975, -9981, -9998, -9998, -9998, -10012, -10036, -10036, -10066, -10079, -10097, -10121, -10133, -10142, -10142, -10142, -10156, -10173, -10173, -10173, -10196, -10205, -10205, -10205, -10205, -10218, -10234, -10240, -10240, -10240, -10264, -10273, -10286, -10286, -10286, -10286, -10299, -10299, -10309, -10309, -10339, -10358, -10358, -10374, -10374, -10390, -10390, -10413, -10413, -10439, -10461, -10467, -10467, -10467, -10492, -10492, -10501, -10528, -10528, -10528, -10539, -10583, -10583, -10583, -10613, -10613, -10619, -10628, -10645, -10645, -10645, -10650, -10671, -10687, -10709, -10709, -10709, -10709, -10709, -10727, -10727, -10727, -10727, -10733, -10733, -10768, -10768, -10773, -10780, -10788, -10788, -10797, -10797, -10835, -10835, -10845, -10852, -10861, -10861, -10861, -10861, -10861, -10861, -10861, -10875, -10888, -10907, -10907, -10907, -10920, -10920, -10932, -10946, -10977, -10977, -10997, -11008, -11037, -11059, -11059, -11059, -11067, -11067, -11067, -11067, -11067, -11077, -11091, -11102, -11102, -11112, -11125, -11129, -11129, -11154, -11154, -11154, -11164, -11164, -11189, -11189, -11189, -11189, -11189, -11196, -11196, -11227, -11238, -11247, -11256, -11265, -11265, -11286, -11307, -11330, -11337, -11378, -11378, -11389, -11413, -11454, -11469, -11475, -11475, -11475, -11475, -11503, -11503, -11503, -11503, -11534, -11534, -11550, -11550, -11557, -11557, -11557, -11557, -11574, -11585, -11585, -11603, -11626, -11643, -11643, -11643, -11643, -11663, -11663, -11682, -11696, -11696, -11696, -11696, -11706, -11706, -11706, -11706, -11723, -11723, -11757, -11757, -11773, -11795, -11813, -11836, -11836, -11883, -11903, -11952, -11965, -11965, -11984, -11997, -12008, -12008, -12008, -12024, -12043, -12065, -12071, -12099, -12129, -12140, -12140, -12146, -12161, -12161, -12161, -12161, -12167, -12167, -12180, -12186, -12208, -12226, -12243, -12243, -12252, -12252, -12274, -12289, -12302, -12302, -12313, -12313, -12313, -12313, -12358, -12358, -12358, -12369, -12375, -12391, -12391, -12391, -12391, -12405, -12410, -12416, -12416, -12436, -12436, -12436, -12443, -12443, -12462, -12477, -12492, -12492, -12503, -12519, -12525, -12531, -12571, -12571, -12591, -12591, -12601, -12641, -12641, -12641, -12657, -12657, -12657, -12699, -12699, -12699, -12712, -12728, -12744, -12761, -12769, -12782, -12793, -12823, -12836, -12851, -12863, -12890, -12900, -12900, -12900, -12910, -12910, -12924, -12924, -12924, -12924, -12924, -12952, -12984, -13003, -13038, -13038, -13056, -13056, -13056, -13056, -13074, -13081, -13093, -13103, -13103, -13112, -13119, -13132, -13132, -13132, -13141, -13151, -13183, -13193, -13206, -13206, -13206, -13236, -13252, -13267, -13267, -13294, -13307, -13307, -13307, -13343, -13349, -13349, -13349, -13375, -13375, -13375, -13384, -13384, -13384, -13393, -13393, -13393, -13402, -13414, -13425, -13445, -13467, -13485, -13499, -13509, -13528, -13528, -13549, -13549, -13559, -13570, -13570, -13570, -13570, -13598, -13637, -13647, -13647, -13661, -13673, -13682, -13687, -13694, -13694, -13720, -13733, -13742, -13748, -13771, -13795, -13795, -13814, -13821, -13821, -13855, -13862, -13862, -13862, -13874, -13874, -13897, -13909, -13909, -13947, -13947, -13952, -13952, -13970, -13979, -13979, -13979, -14008, -14049, -14049, -14049, -14049, -14049, -14049, -14060, -14083, -14083, -14091, -14101, -14101, -14101, -14101, -14118, -14136, -14195, -14195, -14195, -14213, -14213, -14232, -14232, -14253, -14253, -14258, -14275, -14275, -14304, -14311, -14311, -14318, -14318, -14318, -14318, -14318, -14318, -14325, -14325, -14345, -14345, -14379, -14389, -14422, -14422, -14422, -14422, -14435, -14441, -14441, -14460, -14460, -14471, -14471, -14481, -14495, -14495, -14495, -14502, -14502, -14502, -14502, -14524, -14533, -14541, -14552, -14552, -14552, -14552, -14563, -14563, -14568, -14568, -14585, -14595, -14602, -14628, -14628, -14645, -14672, -14678, -14697, -14697, -14734, -14757, -14764, -14771, -14771, -14771, -14796, -14815, -14822, -14845, -14861, -14861, -14861, -14873, -14873, -14873, -14902, -14920, -14920, -14926, -14926, -14926, -14941, -14949, -14949, -14949, -14949, -14949, -14960, -14960, -14971, -14971, -14998, -15003, -15003, -15003, -15013, -15013, -15027, -15027, -15027, -15043, -15053, -15063, -15074, -15083, -15093, -15093, -15121, -15121, -15128, -15128, -15144, -15144, -15144, -15144, -15165, -15170, -15170, -15170, -15170, -15170, -15170, -15170, -15186, -15206, -15206, -15206, -15224, -15236, -15236, -15252, -15258, -15258, -15258, -15258, -15264, -15277, -15288, -15307, -15307, -15318, -15328, -15328, -15334, -15334, -15363, -15399, -15399, -15422, -15438, -15447, -15447, -15456, -15456, -15456, -15495, -15495, -15495, -15495, -15511, -15511, -15530, -15557, -15566, -15582, -15590, -15590, -15604, -15604, -15625, -15635, -15655, -15655, -15655, -15655, -15655, -15665, -15675, -15675, -15675, -15675, -15675, -15682, -15682, -15682, -15694, -15719, -15749, -15749, -15794, -15794, -15837, -15854, -15854, -15861, -15861, -15861, -15861, -15884, -15900, -15911, -15931, -15931, -15931, -15931, -15931, -15963, -15963, -15996, -16006, -16013, -16024, -16034, -16049, -16049, -16049, -16059, -16059, -16059, -16059, -16059, -16059, -16059, -16064, -16075, -16104, -16104, -16117, -16124, -16124, -16124, -16124, -16130, -16145, -16159, -16190, -16193, -16196, -16210, -16224, -16243, -16255, -16261, -16280, -16283, -16292, -16295, -16295, -16301, -16304, -16322, -16325, -16328, -16349, -16355, -16382, -16408, -16414, -16414, -16414, -16458, -16477, -16480, -16485, -16488, -16514, -16520, -16530, -16530, -16546, -16562, -16597, -16603, -16622, -16622, -16646, -16669, -16672, -16715, -16715, -16715, -16718, -16718, -16727, -16733, -16752, -16770, -16787, -16794, -16810, -16827, -16840, -16850, -16876, -16901, -16901, -16901, -16916, -16919, -16926, -16943, -16972, -16978, -16978, -16978, -16981, -17008, -17008, -17016, -17053, -17053, -17053, -17053, -17072, -17086, -17105, -17139, -17153, -17162, -17162, -17177, -17177, -17177, -17177, -17195, -17218, -17221, -17221, -17237, -17276, -17276, -17300, -17319, -17339, -17357, -17370, -17383, -17400, -17407, -17419, -17439, -17439, -17449, -17465, -17475, -17504, -17527, -17527, -17534, -17548, -17564, -17564, -17598, -17598, -17601, -17630, -17649, -17669, -17669, -17679, -17686, -17757, -17776, -17796, -17810, -17840, -17840, -17877, -17884, -17884, -17911, -17936, -17970, -17980, -17995, -17995, -18008, -18011, -18036, -18075, -18097, -18097, -18104, -18115, -18115, -18129, -18134, -18141, -18141, -18157, -18180, -18190, -18217, -18224, -18252, -18284, -18284, -18296, -18299, -18312, -18322, -18338, -18348, -18348, -18363, -18372, -18387, -18387, -18390, -18402, -18445, -18445, -18445, -18466, -18479, -18479, -18498, -18508, -18511, -18511, -18511, -18511, -18511, -18526, -18558, -18586, -18622, -18643, -18670, -18686, -18710, -18720, -18739, -18739, -18742, -18745, -18771, -18774, -18777, -18791, -18813, -18816, -18822, -18839, -18845, -18851, -18854, -18878, -18881, -18896, -18896, -18899, -18926, -18937, -18940, -18953, -18963, -19010, -19010, -19017, -19046, -19060, -19060, -19087, -19095, -19101, -19101, -19128, -19146, -19157, -19157, -19188, -19198, -19205, -19223, -19230, -19255, -19280, -19280, -19283, -19292, -19301, -19320, -19323, -19323, -19341, -19341, -19365, -19378, -19381, -19394, -19423, -19433, -19440, -19466, -19490, -19490, -19490, -19497, -19504, -19511, -19511, -19518, -19545, -19568, -19575, -19575, -19583, -19586, -19592, -19592, -19609, -19622, -19629, -19641, -19641, -19656, -19673, -19700, -19723, -19733, -19746, -19759, -19769, -19782, -19789, -19795, -19831, -19834, -19841, -19851, -19854, -19880, -19895, -19898, -19898, -19911, -19922, -19950, -20020, -20030, -20059, -20062, -20089, -20107, -20151, -20154, -20175, -20205, -20208, -20229, -20229, -20255, -20261, -20261, -20283, -20335, -20362, -20385, -20392, -20392, -20392, -20392, -20418, -20418, -20418, -20418, -20443, -20446, -20446, -20452, -20452, -20467, -20467, -20489, -20489, -20498, -20525, -20554, -20560, -20575, -20589, -20589, -20589, -20614, -20652, -20659, -20659, -20668, -20679, -20679, -20679, -20685, -20685, -20685, -20685, -20685, -20685, -20696, -20733, -20760, -20766, -20769, -20792, -20792, -20792, -20792, -20813, -20813, -20813, -20813, -20826, -20826, -20846, -20862, -20880, -20887, -20901, -20908, -20933, -20938, -20958, -20969, -20978, -20978, -20978, -20985, -20985, -20985, -21000, -21010, -21010, -21014, -21026, -21033, -21041, -21041, -21051, -21051, -21064, -21071, -21113, -21120, -21120, -21127, -21134, -21142, -21164, -21164, -21164, -21188, -21195, -21208, -21215, -21226, -21226, -21226, -21238, -21249, -21255, -21255, -21265, -21279, -21296, -21301, -21315, -21321, -21331, -21331, -21331, -21337, -21343, -21343, -21351, -21351, -21361, -21368, -21383, -21383, -21389, -21413, -21437, -21449, -21462, -21478, -21506, -21534, -21546, -21546, -21557, -21580, -21595, -21595, -21595, -21595, -21626, -21626, -21646, -21670, -21676, -21688, -21688, -21716, -21731, -21762, -21762, -21762, -21762, -21762, -21783, -21789, -21799, -21828, -21828, -21837, -21845, -21868, -21874, -21874, -21880, -21880, -21889, -21901, -21910, -21941, -21941, -21959, -21959, -21959, -21966, -21966, -21972, -21972, -21995, -22011, -22043, -22043, -22051, -22051, -22060, -22060, -22060, -22074, -22086, -22086, -22099, -22099, -22120, -22120, -22134, -22144, -22150, -22158, -22164, -22164, -22171, -22199, -22210, -22210, -22210, -22220, -22228, -22228, -22239, -22261, -22304, -22304, -22312, -22349, -22349, -22349, -22357, -22381, -22381, -22390, -22390, -22390, -22390, -22402, -22413, -22413, -22422, -22422, -22445, -22445, -22445, -22456, -22456, -22469, -22479, -22501, -22512, -22528, -22528, -22528, -22528, -22528, -22528, -22528, -22540, -22540, -22546, -22546, -22546, -22546, -22569, -22591, -22591, -22591, -22591, -22610, -22655, -22655, -22667, -22667, -22677, -22677, -22692, -22692, -22702, -22702, -22702, -22717, -22736, -22750, -22755, -22780, -22785, -22822, -22844, -22859, -22871, -22909, -22949, -22962, -22973, -22979, -22988, -23007, -23027, -23035, -23072, -23082, -23082, -23109, -23116, -23130, -23158, -23166, -23166, -23172, -23177, -23189, -23219, -23219, -23250, -23273, -23281, -23281, -23281, -23281, -23281, -23287, -23287, -23299, -23305, -23315, -23315, -23321, -23328, -23334, -23355, -23355, -23355, -23355, -23355, -23366, -23390, -23396, -23396, -23396, -23396, -23402, -23418, -23424, -23424, -23438, -23446, -23446, -23446, -23500, -23525, -23569, -23592, -23592, -23592, -23605, -23614, -23614, -23614, -23627, -23633, -23657, -23673, -23673, -23673, -23689, -23689, -23701, -23701, -23701, -23713, -23713, -23713, -23738, -23758, -23775, -23775, -23794, -23794, -23803, -23803, -23803, -23803, -23813, -23826, -23845, -23845, -23845, -23845, -23872, -23872, -23872, -23888, -23888, -23900, -23900, -23906, -23906, -23906, -23906, -23906, -23924, -23924, -23924, -23930, -23930, -23939, -23949, -23971, -23971, -23971, -24000, -24012, -24042, -24042, -24042, -24042, -24042, -24070, -24076, -24094, -24094, -24094, -24123, -24123, -24123, -24134, -24150, -24150, -24150, -24150, -24150, -24150, -24155, -24179, -24179, -24189, -24189, -24189, -24198, -24198, -24218, -24218, -24218, -24234, -24251, -24257, -24276, -24305, -24321, -24321, -24321, -24334, -24334, -24334, -24349, -24356, -24361, -24372, -24372, -24372, -24388, -24396, -24396, -24402, -24410, -24410, -24428, -24428, -24450, -24450, -24467, -24485, -24495, -24495, -24495, -24507, -24507, -24514, -24531, -24531, -24531, -24531, -24531, -24537, -24537, -24558, -24572, -24584, -24584, -24601, -24601, -24607, -24615, -24615, -24632, -24632, -24632, -24632, -24661, -24676, -24676, -24724, -24751, -24751, -24774, -24774, -24783, -24793, -24793, -24793, -24813, -24819, -24819, -24826, -24826, -24842, -24858, -24872, -24872, -24890, -24890, -24890, -24890, -24890, -24890, -24890, -24890, -24890, -24906, -24906, -24917, -24928, -24947, -24947, -24947, -24947, -24947, -24947, -24947, -24947, -24947, -24963, -24983, -24991, -24991, -24991, -24991, -24991, -24991, -24991, -24991, -25007, -25007, -25007, -25007, -25007, -25007, -25007, -25030, -25040, -25040, -25040, -25040, -25040, -25059, -25097, -25132, -25149, -25159, -25169, -25169, -25169, -25192, -25192, -25192, -25192, -25205, -25205, -25216, -25221, -25221, -25233, -25233, -25240, -25250, -25256, -25273, -25273, -25303, -25321, -25321, -25321, -25333, -25333, -25333, -25333, -25370, -25370, -25402, -25418, -25418, -25439, -25439, -25454, -25454, -25454, -25463, -25477, -25526, -25526, -25526, -25526, -25545, -25562, -25572, -25572, -25582, -25582, -25582, -25597, -25610, -25634, -25641, -25641, -25641, -25668, -25668, -25675, -25707, -25727, -25727, -25741, -25756, -25756, -25779, -25811, -25811, -25811, -25817, -25817, -25817, -25827, -25827, -25827, -25827, -25827, -25836, -25836, -25836, -25836, -25850, -25850, -25860, -25884, -25901, -25922, -25936, -25946, -25969, -25969, -25969, -25969, -25975, -25975, -25987, -25987, -26065, -26065, -26065, -26084, -26084, -26103, -26128, -26141, -26151, -26169, -26169, -26169, -26180, -26191, -26191, -26191, -26197, -26197, -26205, -26211, -26235, -26235, -26235, -26235, -26235, -26235, -26245, -26245, -26259, -26259, -26259, -26259, -26284, -26284, -26325, -26325, -26355, -26364, -26364, -26402, -26418, -26418, -26425, -26432, -26432, -26454, -26504, -26513, -26525, -26525, -26525, -26525, -26525, -26545, -26545, -26571, -26590, -26597, -26597, -26597, -26597, -26597, -26639, -26648, -26659, -26666, -26672, -26672, -26672, -26672, -26672, -26694, -26701, -26701, -26701, -26724, -26724, -26746, -26753, -26774, -26774, -26774, -26774, -26806, -26824, -26824, -26830, -26852, -26882, -26882, -26889, -26889, -26889, -26889, -26889, -26889, -26903, -26911, -26918, -26918, -26928, -26948, -26948, -26970, -26970, -26985, -26996, -27045, -27045, -27058, -27058, -27068, -27068, -27104, -27155, -27155, -27155, -27155, -27155, -27172, -27172, -27172, -27172, -27189, -27195, -27195, -27223, -27223, -27223, -27223, -27244, -27290, -27322, -27332, -27364, -27371, -27371, -27371, -27401, -27401, -27417, -27417, -27431, -27470, -27470, -27470, -27470, -27484, -27484, -27484, -27484, -27484, -27496, -27496, -27515, -27515, -27543, -27560, -27576, -27604, -27622, -27631, -27631, -27638, -27649, -27672, -27682, -27682, -27682, -27707, -27717, -27724, -27732, -27755, -27755, -27755, -27768, -27768, -27783, -27789, -27799, -27799, -27799, -27818, -27826, -27838, -27848, -27848, -27848, -27855, -27862, -27862, -27896, -27921, -27921, -27943, -27954, -27954, -27976, -27976, -27976, -27985, -28002, -28012, -28019, -28034, -28034, -28046, -28068, -28097, -28122, -28122, -28131, -28137, -28151, -28151, -28172, -28190, -28196, -28211, -28211, -28264, -28273, -28286, -28324, -28324, -28324, -28354, -28354, -28361, -28397, -28417, -28417, -28424, -28435, -28461, -28461, -28470, -28483, -28483, -28483, -28483, -28483, -28483, -28483, -28515, -28531, -28531, -28549, -28575, -28575, -28575, -28582, -28599, -28615, -28630, -28630, -28672, -28711, -28723, -28723, -28731, -28752, -28752, -28752, -28763, -28763, -28775, -28775, -28775, -28775, -28775, -28775, -28805, -28814, -28830, -28861, -28882, -28882, -28902, -28918, -28937, -28952, -28959, -28998, -29009, -29009, -29009, -29009, -29019, -29019, -29019, -29019, -29019, -29057, -29069, -29076, -29076, -29076, -29076, -29076, -29082, -29082, -29082, -29117, -29117, -29117, -29117, -29134, -29134, -29159, -29159, -29185, -29185, -29196, -29196, -29242, -29248, -29256, -29280, -29301, -29307, -29307, -29307, -29314, -29314, -29338, -29356, -29367, -29367, -29381, -29391, -29399, -29399, -29414, -29434, -29434, -29441, -29473, -29484, -29503, -29520, -29520, -29548, -29565, -29572, -29572, -29572, -29572, -29572, -29597, -29597, -29620, -29655, -29660, -29660, -29660, -29667, -29674, -29688, -29698, -29705, -29728, -29740, -29740, -29761, -29761, -29767, -29780, -29787, -29794, -29794, -29807, -29820, -29820, -29820, -29820, -29832, -29844, -29855, -29855, -29855, -29867, -29867, -29867, -29867, -29881, -29881, -29905, -29905, -29905, -29923, -29923, -29948, -29948, -29948, -29976, -29986, -29996, -29996, -30030, -30030, -30054, -30054, -30070, -30070, -30070, -30077, -30077, -30087, -30107, -30107, -30115, -30141, -30178, -30178, -30201, -30201, -30201, -30207, -30229, -30239, -30254, -30268, -30277, -30311, -30323, -30323, -30331, -30331, -30331, -30331, -30331, -30353, -30365, -30374, -30374, -30374, -30380, -30380, -30380, -30380, -30410, -30410, -30410, -30443, -30443, -30453, -30462, -30472, -30472, -30472, -30472, -30472, -30472, -30489, -30500, -30500, -30500, -30532, -30532, -30553, -30577, -30599, -30599, -30609, -30640, -30640, -30640, -30664, -30676, -30676, -30676, -30692, -30719, -30728, -30728, -30742, -30742, -30749, -30749, -30760, -30770, -30770, -30783, -30783, -30783, -30804, -30847, -30847, -30847, -30847, -30857, -30857, -30857, -30857, -30875, -30875, -30895, -30895, -30921, -30926, -30926, -30926, -30945, -30945, -30945, -30945, -30959, -30959, -30959, -30959, -30972, -30972, -30984, -31011, -31011, -31048, -31056, -31056, -31070, -31077, -31077, -31110, -31110, -31115, -31122, -31139, -31159, -31159, -31165, -31171, -31171, -31197, -31204, -31211, -31211, -31221, -31228, -31228, -31245, -31245, -31245, -31252, -31265, -31265, -31265, -31265, -31294, -31305, -31320, -31333, -31333, -31333, -31343, -31350, -31357, -31369, -31369, -31379, -31385, -31391, -31407, -31407, -31407, -31423, -31423, -31423, -31434, -31454, -31470, -31511, -31521, -31521, -31521, -31542, -31582, -31582, -31597, -31597, -31597, -31614, -31623, -31645, -31645, -31661, -31661, -31669, -31669, -31676, -31676, -31706, -31720, -31726, -31743, -31785, -31804, -31817, -31817, -31835, -31846, -31863, -31885, -31885, -31896, -31907, -31907, -31907, -31922, -31922, -31929, -31929, -31929, -31936, -31943, -31949, -31949, -31949, -31959, -32006, -32024, -32031, -32031, -32038, -32063, -32095, -32095, -32105, -32105, -32105, -32105, -32105, -32125, -32134, -32140, -32176, -32185, -32195, -32195, -32195, -32195, -32202, -32202, -32218, -32236, -32259, -32294, -32300, -32305, -32305, -32305, -32323, -32337, -32352, -32359, -32374, -32381, -32388, -32388, -32388, -32402, -32402, -32402, -32402, -32418, -32428, -32428, -32428, -32450, -32450, -32450, -32462, -32467, -32480, -32480, -32480, -32487, -32502, -32509, -32525, -32560, -32570, -32583, -32597, -32623, -32637, -32644, -32667, -32707, -32725, -32725, -32747, -32747, -32751, -32758, -32789, -32807, -32824, -32824, -32824, -32824, -32843, -32843, -32850, -32876, -32908, -32915, -32946, -32965, -32965, -32982, -33002, -33009, -33029, -33064, -33084, -33098, -33098, -33098, -33098, -33110, -33110, -33151, -33158, -33180, -33198, -33205, -33227, -33227, -33237, -33237, -33253, -33258, -33277, -33292, -33315, -33315, -33333, -33348, -33348, -33348, -33348, -33348, -33348, -33348, -33355, -33355, -33355, -33390, -33408, -33423, -33437, -33452, -33458, -33465, -33480, -33480, -33487, -33494, -33504, -33511, -33551, -33551, -33558, -33589, -33595, -33595, -33602, -33627, -33644, -33668, -33668, -33668, -33676, -33676, -33716, -33728, -33747, -33747, -33769, -33775, -33789, -33803, -33803, -33810, -33810, -33810, -33820, -33820, -33820, -33820, -33843, -33843, -33843, -33879, -33889, -33889, -33889, -33903, -33917, -33931, -33959, -33993, -34000, -34014, -34037, -34043, -34055, -34055, -34077, -34083, -34090, -34099, -34099, -34115, -34115, -34133, -34140, -34167, -34172, -34184, -34221, -34245, -34252, -34252, -34259, -34318, -34318, -34325, -34325, -34352, -34400, -34415, -34422, -34422, -34431, -34438, -34445, -34445, -34473, -34473, -34489, -34489, -34489, -34489, -34499, -34499, -34499, -34516, -34536, -34551, -34564, -34580, -34580, -34580, -34589, -34589, -34589, -34613, -34648, -34648, -34648, -34655, -34664, -34681, -34681, -34698, -34698, -34720, -34736, -34749, -34749, -34765, -34778, -34785, -34795, -34819, -34819, -34829, -34841, -34848, -34854, -34854, -34854, -34878, -34894, -34894, -34900, -34917, -34934, -34940, -34970, -34998, -34998, -35004, -35004, -35012, -35012, -35012, -35020, -35020, -35032, -35038, -35062, -35062, -35062, -35068, -35068, -35082, -35092, -35096, -35107, -35118, -35134, -35155, -35155, -35166, -35178, -35178, -35195, -35201, -35201, -35201, -35226, -35226, -35226, -35226, -35256, -35262, -35272, -35280, -35299, -35332, -35354, -35354, -35354, -35370, -35386, -35417, -35417, -35460, -35473, -35478, -35495, -35504, -35504, -35518, -35552, -35589, -35624, -35624, -35637, -35637, -35643, -35643, -35669, -35682, -35695, -35702, -35709, -35709, -35726, -35739, -35749, -35756, -35756, -35778, -35803, -35810, -35829, -35883, -35899, -35905, -35911, -35911, -35923, -35947, -35954, -35980, -35987, -36034, -36052, -36063, -36095, -36106, -36106, -36113, -36120, -36140, -36140, -36153, -36160, -36160, -36167, -36203, -36203, -36218, -36218, -36225, -36253, -36259, -36284, -36296, -36310, -36324, -36331, -36344, -36367, -36367, -36367, -36412, -36412, -36422, -36463, -36463, -36463, -36479, -36490, -36513, -36520, -36520, -36527, -36527, -36527, -36540, -36574, -36594, -36594, -36605, -36621, -36621, -36641, -36641, -36641, -36659, -36682, -36682, -36682, -36682, -36705, -36705, -36705, -36720, -36720, -36755, -36755, -36771, -36771, -36771, -36788, -36806, -36835, -36845, -36875, -36875, -36903, -36921, -36928, -36928, -36940, -36940, -36940, -36966, -36966, -36973, -36983, -36998, -37004, -37014, -37024, -37024, -37032, -37038, -37038, -37061, -37074, -37074, -37091, -37098, -37105, -37105, -37133, -37141, -37141, -37148, -37191, -37191, -37197, -37197, -37210, -37224, -37224, -37231, -37250, -37257, -37273, -37273, -37280, -37287, -37294, -37300, -37307, -37330, -37348, -37348, -37359, -37359, -37359, -37377, -37392, -37398, -37412, -37431, -37469, -37486, -37508, -37517, -37535, -37535, -37542, -37542, -37549, -37549, -37549, -37549, -37556, -37576, -37576, -37583, -37590, -37597, -37604, -37604, -37621, -37635, -37676, -37676, -37704, -37711, -37728, -37728, -37737, -37737, -37737, -37750, -37757, -37778, -37785, -37785, -37819, -37826, -37833, -37843, -37850, -37869, -37914, -37921, -37935, -37942, -37949, -37982, -38013, -38013, -38013, -38023, -38057, -38077, -38097, -38110, -38117, -38123, -38133, -38133, -38133, -38140, -38140, -38148, -38159, -38179, -38192, -38205, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38225, -38225, -38230, -38246, -38258, -38280, -38287, -38294, -38294, -38294, -38301, -38318, -38318, -38340, -38371, -38371, -38384, -38420, -38440, -38453, -38481, -38506, -38522, -38534, -38559, -38559, -38559, -38564, -38564, -38581, -38604, -38604, -38611, -38620, -38626, -38635, -38635, -38635, -38666, -38674, -38688, -38693, -38710, -38722, -38722, -38722, -38729, -38734, -38752, -38792, -38818, -38825, -38861, -38902, -38934, -38949, -38949, -38960, -38969, -38985, -38985, -38996, -39013, -39024, -39024, -39032, -39061, -39074, -39089, -39123, -39123, -39123, -39140, -39161, -39180, -39206, -39215, -39254, -39261, -39277, -39284, -39314, -39314, -39330, -39340, -39340, -39371, -39371, -39392, -39430, -39430, -39437, -39444, -39461, -39468, -39468, -39485, -39517, -39524, -39538, -39543, -39548, -39555, -39581, -39588, -39588, -39609, -39609, -39616, -39652, -39670, -39677, -39677, -39684, -39691, -39702, -39717, -39717, -39717, -39724, -39749, -39760, -39766, -39775, -39791, -39791, -39814, -39827, -39827, -39837, -39859}; - -static const char tldData[] = { -"com.cn\0" -"com.co\0" -"hb.cn\0" -"med.br\0conf.lv\0wallonie.museum\0" -"namsos.no\0" -"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0farmers.museum\0rel.pl\0" -"com.cu\0" -"military.museum\0" -"*.jm\0convent.museum\0cymru.museum\0malvik.no\0" -"univ.sn\0" -"gliding.aero\0" -"wodzislaw.pl\0" -"com.dm\0!pref.iwate.jp\0tran\xc3\xb8y.no\0pila.pl\0" -"mb.it\0*.ke\0lib.ri.us\0" -"com.ec\0*.kh\0tr\xc3\xb8gstad.no\0" -"com.ee\0" -"mobi.gp\0" -"gran.no\0" -"wa.gov.au\0" -"com.dz\0kg.kr\0" -"zoological.museum\0gjerstad.no\0haugesund.no\0kharkov.ua\0" -"walbrzych.pl\0" -"civilization.museum\0" -"ha.no\0" -"*.kw\0" -"med.ec\0com.es\0" -"med.ee\0otago.museum\0svelvik.no\0" -"art.ht\0amber.museum\0elvendrell.museum\0rost.no\0" -"jx.cn\0gratangen.no\0" -"association.aero\0ca.it\0" -"zaporizhzhe.ua\0" -"com.fr\0" -"szex.hu\0" -"e-burg.ru\0" -"com.ge\0bokn.no\0" -"mordovia.ru\0" -"com.gh\0*.mm\0" -"com.gi\0z.se\0" -"cahcesuolo.no\0" -"hurdal.no\0joshkar-ola.ru\0" -"cadaques.museum\0ma.us\0" -"a.bg\0" -"com.gn\0bozen.it\0tambov.ru\0" -"*.gifu.jp\0*.tokyo.jp\0*.mt\0" -"com.gp\0travel\0cc.tx.us\0" -"com.gr\0hemne.no\0" -"*.ni\0" -"*.mz\0" -"cc.il.us\0" -"com.gy\0" -"zj.cn\0oksnes.no\0museum.tt\0" -"com.hk\0*.np\0" -"rc.it\0baseball.museum\0" -"com.hn\0exhibition.museum\0" -"h\xc3\xa1""bmer.no\0" -"com.hr\0" -"fg.it\0stathelle.no\0defense.tn\0" -"com.ht\0" -"qld.gov.au\0*.nz\0" -"davvenj\xc3\xa1rga.no\0*.om\0" -"vang.no\0" -"*.kumamoto.jp\0" -"vercelli.it\0usenet.pl\0" -"com.io\0stalbans.museum\0" -"com.iq\0" -"*.pg\0" -"com.is\0klabu.no\0skiptvet.no\0" -"med.ht\0field.museum\0" -"gr.it\0gj\xc3\xb8vik.no\0tromsa.no\0lib.mi.us\0" -"ca.na\0" -"hagebostad.no\0k12.ma.us\0" -"*.qa\0" -"*.niigata.jp\0" -"monzaebrianza.it\0com.jo\0comunica\xc3\xa7\xc3\xb5""es.museum\0" -"gr.jp\0" -"ballangen.no\0*.py\0" -"scienceandindustry.museum\0" -"nuoro.it\0com.kg\0" -"com.ki\0" -"im.it\0idv.tw\0" -"*.akita.jp\0com.km\0r\xc3\xb8ros.no\0sopot.pl\0" -"!pref.yamanashi.jp\0" -"com.kp\0" -"!pref.kochi.jp\0com.la\0" -"com.lb\0" -"com.lc\0stjordalshalsen.no\0sigdal.no\0cc.nm.us\0" -"samnanger.no\0" -"drobak.no\0" -"vt.it\0" -"catering.aero\0com.ky\0" -"com.kz\0cc.ca.us\0" -"com.lk\0" -"grosseto.it\0mosvik.no\0" -"namsskogan.no\0" -"loten.no\0" -"chirurgiens-dentistes.fr\0" -"com.lr\0bremanger.no\0" -"gs.cn\0" -"com.lv\0lib.co.us\0" -"com.mg\0" -"passenger-association.aero\0" -"com.ly\0yekaterinburg.ru\0" -"vladivostok.ru\0" -"com.mk\0beeldengeluid.museum\0" -"com.ml\0" -"art.pl\0" -"com.mo\0" -"britishcolumbia.museum\0tx.us\0" -"com.na\0sakhalin.ru\0*.sv\0" -"mc.it\0" -"amsterdam.museum\0udm.ru\0" -"com.mu\0" -"com.mv\0com.nf\0" -"com.mw\0com.ng\0il.us\0" -"geometre-expert.fr\0com.mx\0" -"med.ly\0com.my\0" -"ag.it\0" -"*.tr\0" -"!pref.oita.jp\0" -"hoyanger.no\0skedsmo.no\0" -"com.nr\0turystyka.pl\0" -"koebenhavn.museum\0" -"quebec.museum\0" -"stord.no\0*.uk\0" -"act.au\0" -"br.it\0cb.it\0gyeonggi.kr\0jobs.tt\0lib.hi.us\0" -"*.ve\0" -"*.saga.jp\0wildlife.museum\0com.pa\0" -"monzabrianza.it\0sciencehistory.museum\0stange.no\0oskol.ru\0principe.st\0*.uy\0" -"plaza.museum\0com.pe\0" -"com.pf\0" -"eigersund.no\0" -"com.ph\0" -"manx.museum\0marylhurst.museum\0" -"md.ci\0pi.it\0schweiz.museum\0com.pk\0" -"grp.lk\0fr\xc3\xb8ya.no\0com.pl\0press.se\0" -"us.com\0" -"b.bg\0cremona.it\0communication.museum\0art.sn\0" -"med.pa\0" -"com.pr\0" -"com.ps\0" -"com.pt\0" -"k12.in.us\0" -"ah.cn\0bahcavuotna.no\0" -"sondrio.it\0arkhangelsk.ru\0" -"cargo.aero\0" -"council.aero\0" -"museum.mv\0hattfjelldal.no\0spydeberg.no\0med.pl\0" -"niepce.museum\0museum.mw\0" -"anthropology.museum\0" -"pharmacien.fr\0smola.no\0" -"fin.ec\0" -"selbu.no\0" -"workinggroup.aero\0nm.us\0" -"museum.no\0com.re\0" -"cc.vt.us\0" -"village.museum\0" -"ca.us\0" -"*.sapporo.jp\0" -"teramo.it\0" -"com.ro\0" -"*.ye\0" -"com.sa\0" -"com.sb\0" -"so.it\0com.sc\0" -"jolster.no\0com.sd\0" -"com.ru\0" -"com.rw\0com.sg\0" -"sydney.museum\0" -"sa.edu.au\0" -"tom.ru\0" -"com.sl\0*.za\0" -"\xe7\xbd\x91\xe7\xb5\xa1.hk\0naturbruksgymn.se\0com.sn\0" -"assedic.fr\0com.so\0" -"!pref.mie.jp\0*.yu\0" -"med.sa\0" -"newspaper.museum\0holmestrand.no\0dnepropetrovsk.ua\0" -"christiansburg.museum\0roan.no\0" -"pesaro-urbino.it\0med.sd\0com.st\0" -"s\xc3\xb8gne.no\0" -"nuernberg.museum\0" -"*.zm\0" -"com.sy\0" -"*.nagano.jp\0com.tj\0" -"nt.gov.au\0news.hu\0paderborn.museum\0" -"boston.museum\0" -"com.tn\0" -"com.to\0" -"broadcast.museum\0" -"com.ua\0" -"*.zw\0" -"baikal.ru\0" -"bykle.no\0com.tt\0" -"verdal.no\0" -"roros.no\0" -"fi.cr\0carboniaiglesias.it\0chuvashia.ru\0com.tw\0" -"k12.ca.us\0" -"eidsvoll.no\0" -"*.ishikawa.jp\0" -"dolls.museum\0" -"naval.museum\0" -"karasjok.no\0tysvar.no\0" -"bielawa.pl\0com.vc\0" -"svalbard.no\0deatnu.no\0rnd.ru\0" -"grandrapids.museum\0" -"bauern.museum\0k12.pr.us\0" -"press.ma\0" -"*.kagawa.jp\0fribourg.museum\0przeworsk.pl\0com.vi\0" -"com.uz\0" -"babia-gora.pl\0" -"com.vn\0" -"med.pro\0" -"suedtirol.it\0kursk.ru\0" -"bonn.museum\0" -"lt.it\0" -"design.aero\0microlight.aero\0americanantiques.museum\0meland.no\0" -"insurance.aero\0aarborte.no\0" -"kh.ua\0" -"macerata.it\0architecture.museum\0" -"rovigo.it\0rawa-maz.pl\0" -"store.nf\0levanger.no\0" -"b\xc3\xa1jddar.no\0" -"not.br\0" -"com.ws\0" -"!pref.kagawa.jp\0" -"!omanpost.om\0" -"vt.us\0" -"gs.ah.no\0vladikavkaz.ru\0" -"no.it\0" -"in.na\0szkola.pl\0a.se\0" -"aid.pl\0" -"workshop.museum\0vegarshei.no\0" -"sund.no\0" -"bs.it\0flora.no\0" -"agriculture.museum\0" -"koeln.museum\0" -"minnesota.museum\0k12.il.us\0" -"froya.no\0" -"aeroport.fr\0" -"davvenjarga.no\0zgora.pl\0ivano-frankivsk.ua\0" -"*.gunma.jp\0" -"amot.no\0" -"mus.br\0chungbuk.kr\0" -"ggf.br\0lorenskog.no\0" -"jeonbuk.kr\0" -"k12.vi.us\0" -"c.bg\0sande.more-og-romsdal.no\0" -"perugia.it\0" -"massa-carrara.it\0" -"michigan.museum\0" -"archaeology.museum\0mosj\xc3\xb8""en.no\0czest.pl\0koenig.ru\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0" -"mobi.tt\0" -"kraanghke.no\0" -"cc.in.us\0" -"re.it\0lib.vt.us\0" -"dell-ogliastra.it\0" -"s\xc3\xb8mna.no\0" -"k12.wv.us\0" -"gok.pk\0fh.se\0" -"luzern.museum\0" -"fi.it\0swidnica.pl\0" -"cbg.ru\0" -"latina.it\0" -"vibovalentia.it\0" -"modum.no\0" -"safety.aero\0" -"sp.it\0" -"science.museum\0ah.no\0" -"norddal.no\0" -"cc.na\0" -"re.kr\0" -"dielddanuorri.no\0" -"force.museum\0" -"torino.it\0cc.md.us\0" -"artanddesign.museum\0pisz.pl\0" -"olsztyn.pl\0" -"unsa.ba\0rade.no\0vinnica.ua\0" -"in.rs\0astrakhan.ru\0" -"sogne.no\0" -"homebuilt.aero\0" -"polkowice.pl\0" -"hole.no\0health.vn\0" -"fj.cn\0" -"davvesiida.no\0" -"vic.au\0" -"kongsberg.no\0" -"pub.sa\0" -"vv.it\0" -"!pref.tottori.jp\0" -"*.sendai.jp\0in.th\0" -"lib.pa.us\0" -"chiropractic.museum\0" -"mobi.na\0aca.pro\0" -"konyvelo.hu\0sciencecenters.museum\0" -"he.cn\0" -"in.ua\0" -"!city.nagoya.jp\0" -"muenchen.museum\0" -"psi.br\0" -"maryland.museum\0" -"!statecouncil.om\0" -"tr\xc3\xa6na.no\0" -"!pref.yamagata.jp\0jewishart.museum\0" -"lu.it\0me.it\0" -"chel.ru\0" -"tatarstan.ru\0" -"adult.ht\0in.us\0" -"kafjord.no\0" -"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0" -"net.ac\0k12.ec\0" -"net.ae\0bashkiria.ru\0" -"net.af\0!omantel.om\0" -"net.ag\0" -"net.ai\0" -"!pref.toyama.jp\0" -"net.al\0timekeeping.museum\0" -"net.an\0design.museum\0fin.tn\0" -"ethnology.museum\0" -"perso.ht\0asker.no\0b.se\0" -"net.ba\0" -"net.bb\0flanders.museum\0" -"mincom.tn\0" -"frana.no\0" -"bt.it\0" -"net.bh\0" -"auto.pl\0" -"net.az\0" -"treviso.it\0" -"war.museum\0" -"net.bm\0" -"langevag.no\0m\xc3\xa5lselv.no\0" -"net.bo\0" -"gol.no\0" -"folkebibl.no\0" -"net.br\0" -"net.bs\0troandin.no\0saotome.st\0lib.tn.us\0" -"md.us\0k12.ut.us\0" -"d.bg\0cambridge.museum\0\xc3\xa5s.no\0" -"net.ci\0" -"net.bz\0" -"sch.ae\0undersea.museum\0odda.no\0" -"net.cn\0" -"net.co\0c.la\0" -"gliwice.pl\0" -"aurskog-h\xc3\xb8land.no\0" -"andria-trani-barletta.it\0" -"net.cu\0loab\xc3\xa1t.no\0" -"rep.kp\0" -"\xe7\xbb\x84\xe7\xb9\x94.hk\0" -"gallery.museum\0" -"\xc3\xb8rland.no\0" -"store.ro\0" -"net.dm\0" -"somna.no\0" -"hemnes.no\0" -"ringebu.no\0k12.ky.us\0" -"net.ec\0" -"dn.ua\0" -"tarnobrzeg.pl\0" -"soc.lk\0" -"romsa.no\0" -"bamble.no\0" -"net.dz\0lutsk.ua\0" -"barlettatraniandria.it\0ta.it\0countryestate.museum\0" -"kaszuby.pl\0" -"*.yamaguchi.jp\0cranbrook.museum\0store.st\0" -"southcarolina.museum\0lib.md.us\0" -"textile.museum\0" -"cheltenham.museum\0hurum.no\0" -"*.oita.jp\0" -"shop.ht\0cc.me.us\0" -"shop.hu\0turin.it\0" -"louvre.museum\0" -"k12.ar.us\0" -"consulting.aero\0" -"gv.ao\0" -"sauherad.no\0" -"gv.at\0net.ge\0" -"ostre-toten.no\0lib.ok.us\0" -"net.gg\0pilots.museum\0" -"2000.hu\0geology.museum\0" -"net.gn\0" -"mazowsze.pl\0bir.ru\0" -"net.gp\0" -"net.gr\0" -"oxford.museum\0" -"per.la\0" -"eastafrica.museum\0" -"meeres.museum\0" -"net.gy\0*.shizuoka.jp\0" -"\xe5\x95\x86\xe6\xa5\xad.tw\0" -"net.hk\0" -"net.hn\0" -"philadelphiaarea.museum\0" -"osen.no\0" -"net.ht\0net.id\0" -"fundacio.museum\0" -"j\xc3\xb8rpeland.no\0" -"\xe6\x95\x99\xe8\x82\xb2.hk\0" -"divtasvuodna.no\0" -"student.aero\0sch.gg\0net.im\0" -"\xe7\xbd\x91\xe7\xbb\x9c.cn\0net.in\0" -"net.iq\0" -"net.ir\0" -"net.is\0" -"net.je\0" -"kepno.pl\0lapy.pl\0" -"per.nf\0" -"gov\0*.shimane.jp\0" -"artcenter.museum\0" -"k\xc3\xa5""fjord.no\0" -"net.jo\0" -"eu.int\0" -"c.se\0" -"net.kg\0" -"ce.it\0net.ki\0" -"sch.id\0os.hedmark.no\0" -"columbus.museum\0" -"arteducation.museum\0" -"net.kn\0" -"kr.com\0" -"net.la\0bushey.museum\0cc.gu.us\0" -"net.lb\0" -"net.lc\0" -"gs.bu.no\0" -"e164.arpa\0" -"chieti.it\0labour.museum\0" -"sch.ir\0creation.museum\0krodsherad.no\0" -"net.ky\0" -"net.kz\0me.us\0" -"e.bg\0sch.je\0net.lk\0" -"zlg.br\0suwalki.pl\0" -"\xe5\x80\x8b\xe4\xba\xba.hk\0net.ma\0" -"net.lr\0" -"sch.jo\0notaires.km\0net.me\0" -"net.lv\0karate.museum\0" -"net.ly\0karm\xc3\xb8y.no\0" -"rg.it\0" -"net.mk\0" -"net.ml\0evenes.no\0" -"ngo.lk\0net.mo\0egyptian.museum\0" -"marine.ru\0" -"realestate.pl\0" -"net.mu\0" -"net.mv\0net.nf\0" -"net.mw\0net.ng\0gda.pl\0" -"net.mx\0" -"freemasonry.museum\0net.my\0enebakk.no\0" -"karlsoy.no\0" -"\xe7\xbd\x91\xe7\xbb\x9c.hk\0\xc3\xb8rskog.no\0" -"randaberg.no\0" -"club.aero\0" -"certification.aero\0sr.it\0" -"center.museum\0so.gov.pl\0" -"caa.aero\0" -"sch.lk\0tvedestrand.no\0" -"net.nr\0" -"luroy.no\0" -"aukra.no\0s\xc3\xa1lat.no\0lib.me.us\0" -"ddr.museum\0" -"york.museum\0stryn.no\0k12.nm.us\0" -"per.sg\0" -"judaica.museum\0" -"verona.it\0" -"agdenes.no\0" -"cng.br\0sch.ly\0" -"net.pa\0" -"author.aero\0" -"naturalhistory.museum\0steiermark.museum\0bu.no\0" -"sn\xc3\xa5sa.no\0net.pe\0" -"net.ph\0" -"savannahga.museum\0batsfjord.no\0lib.oh.us\0" -"net.pk\0" -"net.pl\0" -"net.pn\0" -"washingtondc.museum\0" -"net.pr\0" -"net.ps\0" -"net.pt\0" -"nordkapp.no\0" -"emergency.aero\0krokstadelva.no\0" -"satx.museum\0ngo.ph\0omsk.ru\0" -"texas.museum\0" -"ngo.pl\0" -"mantova.it\0gu.us\0" -"!pref.shiga.jp\0isa.us\0" -"usa.museum\0" -"gb.net\0k12.vi\0" -"iveland.no\0" -"tempio-olbia.it\0" -"net.sa\0" -"net.sb\0" -"works.aero\0net.sc\0komvux.se\0" -"net.sd\0" -"net.ru\0" -"0.bg\0" -"forlicesena.it\0net.rw\0net.sg\0" -"klodzko.pl\0" -"detroit.museum\0wegrow.pl\0" -"net.sl\0" -"glogow.pl\0" -"store.bb\0air.museum\0" -"net.so\0" -"katowice.pl\0" -"nsk.ru\0" -"pisa.it\0eid.no\0" -"net.st\0" -"film.hu\0" -"tuva.ru\0d.se\0" -"net.th\0" -"net.sy\0" -"viterbo.it\0tsaritsyn.ru\0perso.sn\0net.tj\0" -"lib.gu.us\0" -"plc.co.im\0sec.ps\0" -"r\xc3\xa1hkker\xc3\xa1vju.no\0kazimierz-dolny.pl\0net.tn\0" -"net.to\0" -"veterinaire.km\0" -"net.ua\0" -"info.ht\0net.tt\0" -"info.hu\0" -"exchange.aero\0" -"sch.sa\0net.tw\0" -"andriatranibarletta.it\0perso.tn\0" -"f.bg\0malselv.no\0" -"net.vc\0" -"trana.no\0" -"ns.ca\0" -"net.vi\0" -"lucca.it\0oristano.it\0" -"usarts.museum\0net.vn\0" -"gon.pk\0" -"pl.ua\0" -"eastcoast.museum\0" -"novara.it\0" -"k12.ks.us\0" -"dp.ua\0" -"nesseby.no\0" -"!pref.wakayama.jp\0" -"repbody.aero\0" -"jamison.museum\0lugansk.ua\0" -"ss.it\0" -"alessandria.it\0" -"hadsel.no\0net.ws\0" -"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0" -"veterinaire.fr\0leirfjord.no\0" -"massacarrara.it\0north.museum\0" -"project.museum\0" -"other.nf\0" -"k12.nh.us\0" -"mat.br\0artgallery.museum\0" -"sr.gov.pl\0" -"gamvik.no\0" -"info.ec\0lancashire.museum\0" -"fm.br\0ltd.co.im\0" -"americana.museum\0southwest.museum\0cc.ak.us\0" -"enna.it\0lunner.no\0" -"v\xc3\xa5gan.no\0" -"mari.ru\0" -"accident-investigation.aero\0" -"sor-aurdal.no\0lib.ny.us\0" -"novosibirsk.ru\0" -"bjugn.no\0" -"n\xc3\xa6r\xc3\xb8y.no\0ostrowwlkp.pl\0" -"info.bb\0foundation.museum\0" -"brand.se\0" -"info.at\0!pref.akita.jp\0l\xc3\xb8ten.no\0" -"coal.museum\0miners.museum\0" -"glass.museum\0" -"info.az\0" -"frog.museum\0szczytno.pl\0nov.ru\0" -"sunndal.no\0" -"gen.in\0" -"gx.cn\0" -"web.co\0*.mie.jp\0hobol.no\0\xe5\x8f\xb0\xe6\xb9\xbe\0" -"logistics.aero\0plo.ps\0" -"erotika.hu\0" -"torsken.no\0" -"exeter.museum\0" -"info.co\0" -"selje.no\0" -"storfjord.no\0" -"barum.no\0lind\xc3\xa5s.no\0" -"leasing.aero\0" -"championship.aero\0fst.br\0" -"lierne.no\0" -"!gobiernoelectronico.ar\0""1.bg\0" -"corporation.museum\0" -"al.it\0*.miyagi.jp\0" -"*.aomori.jp\0" -"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" -"amursk.ru\0" -"vestvagoy.no\0" -"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0cc.fl.us\0" -"os.hordaland.no\0" -"pistoia.it\0" -"tver.ru\0e.se\0" -"res.in\0*.yamagata.jp\0syzran.ru\0" -"capebreton.museum\0sandnessj\xc3\xb8""en.no\0" -"ternopil.ua\0" -"shop.pl\0" -"tank.museum\0" -"m\xc3\xa5s\xc3\xb8y.no\0" -"potenza.it\0time.museum\0" -"mjondalen.no\0" -"eng.br\0nedre-eiker.no\0" -"air-surveillance.aero\0" -"nt.au\0am.br\0pn.it\0" -"oystre-slidre.no\0ug.gov.pl\0" -"g.bg\0nesodden.no\0vologda.ru\0" -"parma.it\0tula.ru\0" -"*.nara.jp\0ak.us\0" -"nt.ca\0konin.pl\0" -"kiev.ua\0" -"skierv\xc3\xa1.no\0vestre-toten.no\0" -"ri.it\0botanical.museum\0farsund.no\0veg\xc3\xa5rshei.no\0dagestan.ru\0" -"ind.br\0k-uralsk.ru\0" -"rahkkeravju.no\0cmw.ru\0" -"canada.museum\0" -"fm.it\0" -"cc.wi.us\0" -"web.id\0aver\xc3\xb8y.no\0" -"dudinka.ru\0" -"baghdad.museum\0fitjar.no\0grane.no\0" -"gs.fm.no\0" -"sumy.ua\0" -"al.no\0" -"westfalen.museum\0" -"oregon.museum\0" -"bruxelles.museum\0elk.pl\0" -"planetarium.museum\0sn\xc3\xa5""ase.no\0" -"s\xc3\xb8rreisa.no\0" -"gs.st.no\0skien.no\0" -"bible.museum\0ivanovo.ru\0" -"avellino.it\0" -"tgory.pl\0" -"family.museum\0" -"ppg.br\0k12.as.us\0" -"trader.aero\0gorlice.pl\0" -"cc.al.us\0" -"ogliastra.it\0" -"is.it\0lib.nv.us\0" -"dr.na\0" -"media.hu\0nesna.no\0fl.us\0" -"uri.arpa\0" -"bjerkreim.no\0" -"charter.aero\0" -"genova.it\0" -"it.ao\0botany.museum\0hapmir.no\0" -"educational.museum\0" -"helsinki.museum\0" -"memorial.museum\0" -"web.lk\0pharmacy.museum\0" -"aircraft.aero\0appspot.com\0" -"ferrara.it\0beskidy.pl\0" -"hi.cn\0" -"taxi.aero\0flekkefjord.no\0" -"varoy.no\0" -"ragusa.it\0ambulance.museum\0" -"can.museum\0" -"*.osaka.jp\0isleofman.museum\0fm.no\0warmia.pl\0" -"educator.aero\0asmatart.museum\0" -"mi.it\0" -"kutno.pl\0" -"skedsmokorset.no\0" -"2.bg\0" -"*.kagoshima.jp\0km.ua\0" -"!city.sendai.jp\0" -"web.nf\0st.no\0cc.ri.us\0" -"reggiocalabria.it\0" -"wi.us\0" -"ancona.it\0newjersey.museum\0nnov.ru\0" -"f.se\0" -"ind.in\0" -"info.vn\0" -"andoy.no\0" -"ch.it\0fredrikstad.no\0guovdageaidnu.no\0" -"fjaler.no\0" -"sa.com\0" -"gs.nt.no\0" -"masfjorden.no\0" -"pordenone.it\0" -"po.it\0basel.museum\0" -"chambagri.fr\0" -"h.bg\0web.pk\0" -"london.museum\0" -"sciencecenter.museum\0\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"unbi.ba\0augustow.pl\0" -"wolomin.pl\0" -"notaires.fr\0tcm.museum\0al.us\0" -"nu.ca\0!pref.nagano.jp\0" -"info.tn\0" -"lib.wa.us\0" -"ed.ao\0info.tt\0" -"barreau.bj\0" -"k12.wy.us\0" -"pp.az\0gop.pk\0" -"int\0" -"l\xc3\xb8renskog.no\0podhale.pl\0" -"voagat.no\0" -"telekommunikation.museum\0" -"qld.au\0" -"te.it\0freiburg.museum\0snasa.no\0" -"gjemnes.no\0" -"sejny.pl\0" -"media.pl\0" -"skjak.no\0" -"watchandclock.museum\0" -"ed.ci\0pacific.museum\0" -"theater.museum\0info.ro\0" -"uk.com\0" -"campobasso.it\0aquarium.museum\0tysv\xc3\xa6r.no\0" -"kragero.no\0" -"windmill.museum\0info.sd\0" -"sologne.museum\0sande.m\xc3\xb8re-og-romsdal.no\0" -"nt.no\0cc.mi.us\0" -"ed.cr\0" -"academy.museum\0zachpomor.pl\0" -"tananger.no\0v\xc3\xa1rgg\xc3\xa1t.no\0ri.us\0" -"federation.aero\0" -"web.tj\0" -"matta-varjjat.no\0" -"steigen.no\0" -"local\0akrehamn.no\0" -"!pref.chiba.jp\0info.pk\0" -"info.pl\0""6bone.pl\0" -"klepp.no\0kherson.ua\0" -"ketrzyn.pl\0info.pr\0" -"sweden.museum\0" -"lardal.no\0" -"!retina.ar\0gz.cn\0" -"barletta-trani-andria.it\0vikna.no\0" -"bearalv\xc3\xa1hki.no\0" -"broker.aero\0gov.nc.tr\0" -"info.na\0k12.fl.us\0" -"hembygdsforbund.museum\0" -"entertainment.aero\0jerusalem.museum\0l\xc3\xa6rdal.no\0" -"hitra.no\0sogndal.no\0" -"farmequipment.museum\0info.mv\0info.nf\0\xc3\xa5lg\xc3\xa5rd.no\0" -"la-spezia.it\0" -"skanland.no\0fam.pk\0" -"skole.museum\0" -"art.museum\0" -"presidio.museum\0" -"3.bg\0public.museum\0" -"h\xc3\xb8yanger.no\0zagan.pl\0" -"an.it\0" -"philadelphia.museum\0info.nr\0" -"pesarourbino.it\0g\xc3\xa1ivuotna.no\0" -"poltava.ua\0" -"nt.ro\0" -"station.museum\0" -"mi.th\0" -"altoadige.it\0" -"nu.it\0" -"usculture.museum\0g.se\0" -"h\xc3\xa1mm\xc3\xa1rfeasta.no\0" -"daegu.kr\0info.la\0" -"dovre.no\0" -"ci.it\0horology.museum\0" -"bergbau.museum\0" -"press.museum\0" -"gangwon.kr\0" -"!city.kitakyushu.jp\0sor-varanger.no\0cc.hi.us\0" -"fuossko.no\0" -"zp.ua\0" -"american.museum\0" -"fl\xc3\xa5.no\0mi.us\0" -"i.bg\0" -"od.ua\0" -"encyclopedic.museum\0" -"ind.tn\0" -"midatlantic.museum\0" -"newyork.museum\0" -"castres.museum\0" -"act.edu.au\0" -"topology.museum\0" -"ed.jp\0" -"of.by\0" -"iris.arpa\0inf.br\0askim.no\0pyatigorsk.ru\0" -"nord-fron.no\0nsn.us\0" -"beardu.no\0" -"agrar.hu\0corvette.museum\0chtr.k12.ma.us\0" -"figueres.museum\0" -"!pref.gunma.jp\0medizinhistorisches.museum\0" -"tjeldsund.no\0" -"nebraska.museum\0" -"bellevue.museum\0" -"abo.pa\0k12.al.us\0" -"info.ki\0" -"inf.cu\0sv.it\0" -"jfk.museum\0" -"!city.osaka.jp\0swinoujscie.pl\0" -"bydgoszcz.pl\0" -"!city.kyoto.jp\0" -"uvic.museum\0" -"madrid.museum\0steinkjer.no\0" -"lib.ma.us\0" -"sirdal.no\0" -"n\xc3\xb8tter\xc3\xb8y.no\0" -"taranto.it\0starnberg.museum\0" -"vic.gov.au\0pvt.ge\0pors\xc3\xa1\xc5\x8bgu.no\0" -"naroy.no\0ris\xc3\xb8r.no\0" -"va.it\0salem.museum\0starachowice.pl\0" -"!nawrastelecom.om\0" -"town.museum\0te.ua\0" -"se.net\0" -"kemerovo.ru\0" -"lerdal.no\0" -"gs.va.no\0" -"kms.ru\0" -"consulado.st\0" -"haram.no\0" -"tysnes.no\0" -"!pref.ibaraki.jp\0hamburg.museum\0" -"\xc3\xa5rdal.no\0" -"airline.aero\0" -"crew.aero\0newhampshire.museum\0" -"muenster.museum\0" -"aerodrome.aero\0" -"heroy.nordland.no\0belau.pw\0" -"kamchatka.ru\0" -"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0lillehammer.no\0hi.us\0" -"hk.cn\0" -"!city.kobe.jp\0berlevag.no\0" -"ardal.no\0" -"askoy.no\0" -"vardo.no\0" -"fyresdal.no\0" -"sassari.it\0" -"video.hu\0drammen.no\0" -"lyngen.no\0nakhodka.ru\0" -"ip6.arpa\0games.hu\0" -"online.museum\0" -"k12.sd.us\0" -"4.bg\0sebastopol.ua\0" -"ao.it\0atlanta.museum\0" -"lebork.pl\0" -"ravenna.it\0" -"railway.museum\0songdalen.no\0" -"!pref.shimane.jp\0delaware.museum\0ed.pw\0" -"f\xc3\xb8rde.no\0" -"living.museum\0" -"juif.museum\0" -"lomza.pl\0" -"h.se\0" -"!bl.uk\0" -"portland.museum\0\xe7\xb5\x84\xe7\xb9\x94.tw\0" -"stj\xc3\xb8rdal.no\0" -"lecce.it\0" -"bz.it\0" -"farmstead.museum\0va.no\0" -"express.aero\0!nacion.ar\0" -"presse.km\0gs.of.no\0" -"\xe5\x8f\xb0\xe7\x81\xa3\0" -"og.ao\0gyeongbuk.kr\0vestv\xc3\xa5g\xc3\xb8y.no\0" -"prd.fr\0" -"pp.ru\0pp.se\0" -"forum.hu\0!pref.saga.jp\0" -"kvalsund.no\0" -"!city.kawasaki.jp\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0" -"j.bg\0" -"vlaanderen.museum\0" -"cc.va.us\0" -"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0alabama.museum\0" -"school.museum\0her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0" -"\xc3\xa5seral.no\0" -"traniandriabarletta.it\0" -"flog.br\0" -"presse.ml\0" -"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0" -"historisch.museum\0" -"farm.museum\0palmsprings.museum\0oslo.no\0dyroy.no\0stranda.no\0" -"gs.rl.no\0r\xc3\xa5""de.no\0" -"bomlo.no\0s\xc3\xb8rum.no\0" -"jan-mayen.no\0ivgu.no\0" -"coop\0" -"agr.br\0k12.ak.us\0" -"!nic.ar\0catanzaro.it\0fusa.no\0" -"hu.com\0" -"inf.mk\0" -"vet.br\0" -"k12.mt.us\0k12.nd.us\0" -"vlog.br\0\xe5\x85\xac\xe5\x8f\xb8.cn\0sandnessjoen.no\0" -"lib.az.us\0" -"nsw.edu.au\0of.no\0\xc3\xb8stre-toten.no\0" -"*.okinawa.jp\0" -"vb.it\0" -"asso.fr\0firenze.it\0" -"trieste.it\0" -"\xe5\x85\xac\xe5\x8f\xb8.hk\0" -"museet.museum\0" -"prd.km\0" -"navuotna.no\0lib.ca.us\0" -"cc.nv.us\0" -"asso.gp\0" -"meraker.no\0" -"h\xc3\xa1pmir.no\0" -"i.ph\0" -"sx.cn\0jeonnam.kr\0" -"halden.no\0" -"fed.us\0" -"medio-campidano.it\0tsk.ru\0" -"barcelona.museum\0" -"giessen.museum\0roma.museum\0" -"hl.cn\0" -"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0" -"biz.bb\0benevento.it\0rl.no\0bygland.no\0" -"port.fr\0asso.ht\0prd.mg\0" -"biz.at\0" -"tra.kp\0" -"*.aichi.jp\0khabarovsk.ru\0" -"campidano-medio.it\0" -"biz.az\0" -"newmexico.museum\0va.us\0" -"finearts.museum\0" -"murmansk.ru\0" -"\xc3\xb8rsta.no\0radom.pl\0k12.sc.us\0" -"5.bg\0kvinesdal.no\0" -"ap.it\0" -"*.fukushima.jp\0" -"asso.bj\0" -"mad.museum\0" -"lebesby.no\0" -"og.it\0glas.museum\0sauda.no\0" -"i.se\0" -"k12.tx.us\0" -"asso.ci\0mk.ua\0" -"cesena-forli.it\0" -"lowicz.pl\0" -"k12.id.us\0" -"tas.gov.au\0" -"lukow.pl\0" -"utazas.hu\0" -"maritimo.museum\0bjark\xc3\xb8y.no\0" -"adm.br\0" -"pr.it\0lib.vi.us\0" -"bergamo.it\0k12.va.us\0" -"k.bg\0" -"railroad.museum\0" -"!british-library.uk\0" -"cincinnati.museum\0" -"sorreisa.no\0" -"asso.dz\0!nel.uk\0" -"rm.it\0" -"nv.us\0" -"nx.cn\0gos.pk\0" -"vic.edu.au\0" -"biella.it\0tjome.no\0" -"r\xc3\xb8yken.no\0" -"beiarn.no\0" -"qc.ca\0" -"georgia.museum\0square.museum\0" -"labor.museum\0omasvuotna.no\0cc.la.us\0" -"br.com\0reggioemilia.it\0" -"kristiansund.no\0" -"sorum.no\0" -"orsta.no\0" -"furniture.museum\0surrey.museum\0eng.pro\0" -"asn.lv\0balat.no\0" -"lavangen.no\0sld.pa\0" -"fla.no\0k12.ms.us\0k12.nc.us\0" -"bardu.no\0" -"donostia.museum\0" -"club.tw\0" -"elburg.museum\0" -"gs.hl.no\0lodingen.no\0" -"samara.ru\0" -"vc.it\0*.nagasaki.jp\0" -"fosnes.no\0" -"fuel.aero\0" -"qc.com\0" -"skjervoy.no\0" -"bill.museum\0kv\xc3\xa6""fjord.no\0" -"skydiving.aero\0*.tokushima.jp\0" -"!congresodelalengua3.ar\0laquila.it\0k12.ct.us\0" -"gorge.museum\0linz.museum\0sherbrooke.museum\0" -"tranoy.no\0ing.pa\0" -"ptz.ru\0" -"kr.it\0prato.it\0stat.no\0" -"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0" -"cosenza.it\0" -"stj\xc3\xb8rdalshalsen.no\0" -"finland.museum\0leka.no\0cc.pr.us\0" -"historichouses.museum\0s\xc3\xa1l\xc3\xa1t.no\0" -"venice.it\0" -"biz.ki\0" -"g\xc3\xa1ls\xc3\xa1.no\0" -"\xe7\xbb\x84\xe7\xbb\x87.hk\0" -"*.yamanashi.jp\0" -"rad\xc3\xb8y.no\0" -"6.bg\0" -"fareast.ru\0" -"paragliding.aero\0ba.it\0aq.it\0" -"sk\xc3\xa5nland.no\0" -"its.me\0" -"us.na\0" -"hl.no\0cc.ga.us\0" -"ac\0granvin.no\0" -"ad\0qld.edu.au\0!city.sapporo.jp\0" -"ae\0" -"af\0" -"ag\0crotone.it\0" -"dallas.museum\0" -"ai\0brussels.museum\0" -"dali.museum\0" -"la.us\0" -"al\0salzburg.museum\0" -"am\0" -"an\0cl.it\0" -"ao\0" -"aq\0ba\0" -"bb\0" -"as\0lajolla.museum\0" -"at\0" -"be\0" -"bf\0inderoy.no\0snz.ru\0" -"aw\0bg\0" -"ax\0bh\0cim.br\0ltd.gi\0biz.mv\0" -"bi\0xz.cn\0\xe7\xb5\x84\xe7\xb9\x94.hk\0biz.mw\0" -"az\0bj\0" -"bm\0tranibarlettaandria.it\0naamesjevuemie.no\0" -"chattanooga.museum\0" -"bo\0" -"l.bg\0" -"ca\0" -"br\0stateofdelaware.museum\0" -"bs\0cc\0" -"cd\0biz.nr\0" -"cf\0berlev\xc3\xa5g.no\0" -"bw\0cg\0snaase.no\0" -"ch\0harvestcelebration.museum\0ck.ua\0" -"by\0ci\0" -"bz\0bahccavuotna.no\0" -"cl\0yuzhno-sakhalinsk.ru\0" -"cm\0halsa.no\0lyngdal.no\0" -"cn\0" -"co\0rn.it\0childrens.museum\0frankfurt.museum\0" -"cr\0" -"pskov.ru\0" -"cu\0de\0" -"cv\0fr.it\0lib.ky.us\0" -"aseral.no\0kvam.no\0" -"cx\0hellas.museum\0" -"hof.no\0" -"cz\0dj\0k12.la.us\0" -"dk\0moscow.museum\0" -"sosnowiec.pl\0" -"dm\0biz.pk\0" -"schokoladen.museum\0biz.pl\0" -"far.br\0arna.no\0tynset.no\0" -"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0" -"ec\0" -"biz.pr\0" -"ee\0celtic.museum\0" -"scientist.aero\0modern.museum\0" -"pr.us\0" -"dz\0" -"mj\xc3\xb8ndalen.no\0s\xc3\xb8r-odal.no\0" -"!nic.tr\0" -"conference.aero\0vestnes.no\0k12.mn.us\0" -"!pref.hiroshima.jp\0" -"es\0trapani.it\0" -"fermo.it\0vard\xc3\xb8.no\0" -"eu\0gs.hm.no\0r\xc3\xb8""d\xc3\xb8y.no\0stordal.no\0" -"gc.ca\0!nhs.uk\0" -"jgora.pl\0" -"fi\0stjordal.no\0" -"fm\0!mediaphone.om\0" -"kirov.ru\0pvt.k12.ma.us\0" -"fo\0" -"ga\0hyllestad.no\0" -"gov.ac\0fr\0andriabarlettatrani.it\0ga.us\0" -"gov.ae\0gd\0estate.museum\0" -"gov.af\0ge\0tolga.no\0" -"gf\0asso.re\0cc.oh.us\0" -"gg\0florida.museum\0" -"presse.ci\0gh\0" -"gi\0k12.dc.us\0" -"ltd.lk\0orland.no\0" -"gov.al\0" -"gl\0tokke.no\0" -"hanggliding.aero\0gm\0" -"hareid.no\0" -"gov.ba\0tj.cn\0gp\0" -"gov.bb\0gq\0" -"gov.as\0gr\0agrigento.it\0lc.it\0" -"gs\0kalmykia.ru\0aero.tt\0" -"gov.bf\0" -"county.museum\0" -"gov.bh\0hn.cn\0gw\0" -"gov.az\0gy\0assn.lk\0guernsey.museum\0" -"hk\0" -"gov.bm\0h\xc3\xa6gebostad.no\0biz.tj\0" -"hm\0computer.museum\0" -"gov.bo\0hn\0kl\xc3\xa6""bu.no\0" -"pulawy.pl\0" -"gov.br\0" -"trd.br\0gov.bs\0hr\0reggio-calabria.it\0historyofscience.museum\0lipetsk.ru\0" -"gov.cd\0*.nagoya.jp\0" -"ht\0id\0spjelkavik.no\0" -"hu\0ie\0aero.mv\0" -"marketplace.aero\0mn.it\0biz.tt\0" -"gov.by\0saintlouis.museum\0mer\xc3\xa5ker.no\0" -"gov.bz\0" -"7.bg\0gov.cl\0virtual.museum\0" -"gov.cm\0vennesla.no\0kr.ua\0" -"gov.cn\0im\0ar.it\0galsa.no\0rovno.ua\0" -"gov.co\0in\0" -"io\0limanowa.pl\0" -"iq\0k12.ga.us\0" -"ir\0" -"riik.ee\0is\0\xc3\xa1laheadju.no\0" -"gov.cu\0it\0hawaii.museum\0seaport.museum\0" -"je\0pubol.museum\0hm.no\0" -"gov.cx\0" -"*.chiba.jp\0" -"*.kawasaki.jp\0" -"k.se\0" -"gov.dm\0" -"aland.fi\0vik.no\0" -"yk.ca\0jo\0kobierzyce.pl\0" -"jp\0biz.vn\0" -"presse.fr\0lib.il.us\0\xe9\xa6\x99\xe6\xb8\xaf\0" -"gov.ec\0" -"transport.museum\0bronnoy.no\0" -"slg.br\0gov.ee\0asso.nc\0bievat.no\0" -"nyny.museum\0" -"kg\0" -"mo-i-rana.no\0" -"gov.dz\0ki\0" -"monmouth.museum\0" -"suldal.no\0" -"bc.ca\0km\0zt.ua\0" -"pt.it\0kn\0" -"fineart.museum\0" -"la\0" -"kr\0gulen.no\0" -"m.bg\0mo.cn\0lc\0alaheadju.no\0g\xc3\xa1\xc5\x8bgaviika.no\0" -"nowaruda.pl\0cc.ut.us\0" -"br\xc3\xb8nn\xc3\xb8y.no\0" -"ky\0li\0overhalla.no\0" -"kz\0khv.ru\0" -"lk\0" -"artdeco.museum\0" -"ma\0fortworth.museum\0kostroma.ru\0" -"ro.it\0kirkenes.no\0vestby.no\0" -"urbino-pesaro.it\0ls\0mc\0alstahaug.no\0" -"blog.br\0gov.ge\0lt\0md\0" -"lu\0me\0botanicgarden.museum\0" -"gov.gg\0lv\0oh.us\0" -"gov.gh\0mg\0valley.museum\0" -"gov.gi\0mh\0" -"ly\0sandiego.museum\0" -"mk\0" -"ml\0" -"gov.gn\0rollag.no\0naklo.pl\0" -"mn\0" -"mo\0" -"mp\0leirvik.no\0" -"gov.gr\0mq\0na\0cc.ks.us\0" -"mr\0" -"ms\0nc\0" -"valer.hedmark.no\0" -"mu\0ne\0" -"mv\0nf\0" -"mw\0" -"mx\0nord-odal.no\0jur.pro\0" -"my\0" -"gov.hk\0name.hr\0" -"nl\0" -"astronomy.museum\0lib.nm.us\0" -"catania.it\0" -"no\0" -"skjerv\xc3\xb8y.no\0" -"k12.ne.us\0" -"monza-e-della-brianza.it\0!pref.fukushima.jp\0nr\0" -"gov.ie\0" -"stuttgart.museum\0nu\0cc.mn.us\0" -"karasjohka.no\0" -"engine.aero\0bearalvahki.no\0" -"oyer.no\0" -"ve.it\0" -"gov.im\0froland.no\0cc.ar.us\0" -"gov.in\0magadan.ru\0" -"pescara.it\0" -"gov.iq\0usdecorativearts.museum\0" -"gov.ir\0pa\0" -"gov.is\0" -"gov.it\0lavagis.no\0" -"gov.je\0" -"naustdal.no\0pe\0k12.or.us\0" -"gd.cn\0carraramassa.it\0pf\0" -"ph\0" -"cc.ny.us\0" -"rissa.no\0" -"info\0pk\0pomorze.pl\0" -"pl\0" -"gov.jo\0asso.km\0pn\0" -"*.okayama.jp\0cieszyn.pl\0" -"freight.aero\0" -"pr\0" -"narvik.no\0ps\0" -"!pref.aichi.jp\0elverum.no\0pt\0" -"edunet.tn\0" -"gov.kg\0" -"flatanger.no\0marker.no\0pw\0" -"gov.ki\0nuremberg.museum\0" -"aip.ee\0" -"gov.km\0" -"gov.kn\0" -"gov.kp\0" -"rieti.it\0gov.la\0bajddar.no\0" -"gov.lb\0aviation.museum\0" -"gov.lc\0" -"asso.mc\0" -"re\0" -"ut.us\0" -"sa.gov.au\0gov.ky\0" -"mo.it\0gov.kz\0" -"gov.lk\0" -"iraq.museum\0" -"badajoz.museum\0" -"8.bg\0inder\xc3\xb8y.no\0" -"monticello.museum\0ro\0ks.ua\0" -"gov.ma\0svizzera.museum\0" -"gov.lr\0sa\0" -"matera.it\0sb\0" -"gov.lt\0rs\0sc\0" -"gov.me\0sd\0" -"gov.lv\0ru\0se\0" -"gov.mg\0" -"rw\0sg\0" -"gov.ly\0assisi.museum\0kids.museum\0sh\0" -"si\0" -"gov.mk\0" -"gov.ml\0sk\0" -"sl\0" -"gov.mn\0airguard.museum\0sm\0" -"gov.mo\0l.se\0sn\0" -"so\0" -"gov.mr\0ks.us\0" -"name.az\0sr\0" -"naturhistorisches.museum\0tc\0" -"trainer.aero\0cn.it\0urbinopesaro.it\0gov.mu\0nativeamerican.museum\0st\0td\0" -"gov.mv\0su\0" -"trentino.it\0gov.mw\0gov.ng\0tf\0" -"tg\0" -"co.ae\0venezia.it\0gov.my\0th\0" -"!pref.ehime.jp\0sy\0" -"co.ag\0lewismiller.museum\0ostrowiec.pl\0sz\0tj\0" -"tk\0" -"motorcycle.museum\0tl\0" -"birdart.museum\0trogstad.no\0tm\0" -"tn\0" -"humanities.museum\0to\0" -"pu.it\0gov.nr\0ua\0lib.ut.us\0" -"co.ao\0" -"co.ba\0trondheim.no\0tt\0" -"in-addr.arpa\0tempioolbia.it\0!city.yokohama.jp\0mn.us\0" -"n.bg\0schoenbrunn.museum\0tv\0" -"co.at\0aremark.no\0tw\0ug\0" -"jus.br\0" -"co.bi\0bialowieza.pl\0ar.us\0" -"audnedaln.no\0kustanai.ru\0" -"va\0" -"us\0vc\0" -"newport.museum\0" -"kopervik.no\0gov.ph\0vg\0" -"ny.us\0vi\0" -"co.bw\0finn\xc3\xb8y.no\0gov.pk\0uz\0" -"honefoss.no\0gov.pl\0lanbib.se\0" -"co.ci\0" -"gov.pn\0intl.tn\0" -"act.gov.au\0vn\0" -"television.museum\0gov.pr\0" -"sykkylven.no\0v\xc3\xa5ler.hedmark.no\0gov.ps\0" -"gov.pt\0" -"co.cr\0vu\0" -"legnica.pl\0" -"sa.au\0" -"bjarkoy.no\0" -"openair.museum\0birkenes.no\0lib.nj.us\0" -"fylkesbibl.no\0holt\xc3\xa5len.no\0" -"iz.hr\0" -"ws\0" -"oceanographique.museum\0" -"b\xc3\xa1id\xc3\xa1r.no\0cc.mo.us\0" -"\xc3\xb8ygarden.no\0" -"contemporary.museum\0" -"gb.com\0cc.as.us\0" -"belluno.it\0gov.sa\0" -"gov.sb\0" -"gov.rs\0gov.sc\0" -"gov.sd\0" -"!pref.nagasaki.jp\0gov.ru\0" -"asia\0" -"sa.cr\0gov.rw\0gov.sg\0" -"kuzbass.ru\0" -"gs.vf.no\0" -"gov.sl\0" -"norfolk.museum\0" -"k12.de.us\0" -"mil\0" -"rendalen.no\0" -"gov.st\0" -"agro.pl\0" -"orkdal.no\0" -"le.it\0gov.sy\0" -"gov.tj\0" -"co.gg\0nore-og-uvdal.no\0v\xc3\xa5ler.\xc3\xb8stfold.no\0" -"gov.tl\0" -"gov.tn\0" -"gov.to\0" -"kids.us\0" -"equipment.aero\0gov.ua\0" -"!city.niigata.jp\0gov.tt\0" -"sel.no\0" -"l\xc3\xa4ns.museum\0" -"gov.tw\0" -"rennebu.no\0" -"egersund.no\0" -"medecin.km\0" -"co.gy\0" -"!mecon.ar\0" -"berlin.museum\0" -"carrara-massa.it\0" -"9.bg\0" -"pri.ee\0gov.vc\0" -"at.it\0" -"muosat.no\0" -"co.id\0" -"co.hu\0" -"etne.no\0" -"\xc3\xa1lt\xc3\xa1.no\0" -"gov.vn\0" -"modelling.aero\0" -"co.im\0" -"co.in\0\xc3\xa5krehamn.no\0m.se\0" -"gouv.fr\0*.kitakyushu.jp\0" -"narviika.no\0" -"rennes\xc3\xb8y.no\0" -"co.ir\0afjord.no\0" -"lea\xc5\x8bgaviika.no\0buryatia.ru\0" -"co.it\0coastaldefence.museum\0" -"co.je\0vf.no\0" -"osteroy.no\0" -"uslivinghistory.museum\0" -"aerobatic.aero\0" -"mesaverde.museum\0mining.museum\0" -"a\xc3\xa9roport.ci\0gov.ws\0" -"co.jp\0copenhagen.museum\0" -"pv.it\0" -"r\xc3\xb8mskog.no\0" -"vossevangen.no\0porsanger.no\0" -"salat.no\0mo.us\0" -"o.bg\0imperia.it\0carrier.museum\0" -"carbonia-iglesias.it\0" -"as.us\0" -"alvdal.no\0" -"state.museum\0mandal.no\0cn.ua\0" -"cuneo.it\0" -"gouv.ht\0" -"!city.okayama.jp\0co.kr\0" -"co.lc\0" -"sa.it\0" -"donna.no\0" -"sortland.no\0" -"tomsk.ru\0" -"birthplace.museum\0l\xc3\xb8""dingen.no\0" -"ge.it\0orenburg.ru\0" -"cn.com\0" -"co.ma\0" -"co.ls\0skaun.no\0name.vn\0" -"navigation.aero\0" -"cagliari.it\0co.me\0portal.museum\0" -"gouv.bj\0" -"udine.it\0" -"engineer.aero\0" -"szczecin.pl\0" -"wales.museum\0" -"co.na\0bo.telemark.no\0" -"austin.museum\0" -"k12.mo.us\0" -"co.mu\0" -"gouv.ci\0" -"co.mw\0" -"esp.br\0" -"naturalhistorymuseum.museum\0" -"mosjoen.no\0" -"solund.no\0" -"name.tj\0" -"sand\xc3\xb8y.no\0" -"kunstunddesign.museum\0" -"cartoonart.museum\0collection.museum\0gsm.pl\0" -"aure.no\0" -"!pref.yamaguchi.jp\0historical.museum\0" -"name.tt\0" -"england.museum\0valle.no\0" -"cc.ok.us\0" -"salangen.no\0" -"gloppen.no\0" -"cc.co.us\0" -"contemporaryart.museum\0" -"tas.edu.au\0" -"trading.aero\0" -"mazury.pl\0" -"!pref.aomori.jp\0co.pl\0" -"opoczno.pl\0" -"*.kobe.jp\0co.pn\0" -"oppegard.no\0" -"co.pw\0" -"saltdal.no\0smolensk.ru\0" -"na.it\0\xc4\x8d\xc3\xa1hcesuolo.no\0" -"vgs.no\0evenassi.no\0" -"parachuting.aero\0jl.cn\0maritime.museum\0bd.se\0" -"badaddja.no\0" -"bergen.no\0" -"brussel.museum\0" -"avoues.fr\0" -"cesenaforli.it\0" -"oregontrail.museum\0" -"ullensaker.no\0" -"jobs\0" -"accident-prevention.aero\0" -"n.se\0" -"association.museum\0california.museum\0" -"cultural.museum\0co.rs\0" -"zoology.museum\0" -"pruszkow.pl\0" -"control.aero\0nt.edu.au\0net\0komforb.se\0" -"lincoln.museum\0aurland.no\0name.pr\0co.rw\0" -"ostroleka.pl\0" -"isernia.it\0" -"tm.fr\0" -"gs.ol.no\0" -"nb.ca\0marnardal.no\0" -"williamsburg.museum\0" -"!jet.uk\0" -"suisse.museum\0\xc3\xa5""fjord.no\0flakstad.no\0" -"karmoy.no\0" -"yn.cn\0chesapeakebay.museum\0" -"nsw.au\0" -"amur.ru\0co.st\0" -"imb.br\0siellak.no\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" -"name.na\0" -"co.th\0" -"p.bg\0" -"co.sz\0co.tj\0" -"name.mv\0\xc3\xa5lesund.no\0lib.in.us\0" -"lucerne.museum\0naumburg.museum\0" -"society.museum\0name.my\0" -"tinn.no\0" -"co.tt\0" -"unj\xc3\xa1rga.no\0" -"co.ug\0" -"lib.wy.us\0" -"co.tz\0" -"ass.km\0" -"ok.us\0" -"tm.hu\0kongsvinger.no\0" -"ibestad.no\0" -"juedisches.museum\0co.us\0" -"cq.cn\0" -"rs.ba\0" -"wa.edu.au\0co.vi\0" -"co.uz\0" -"health.museum\0" -"grue.no\0" -"automotive.museum\0journalism.museum\0settlement.museum\0" -"qh.cn\0interactive.museum\0" -"snillfjord.no\0!national-library-scotland.uk\0" -"balsfjord.no\0lib.nh.us\0" -"kolobrzeg.pl\0" -"gs.tm.no\0" -"h\xc3\xb8nefoss.no\0" -"ol.no\0" -"music.museum\0moareke.no\0" -"b\xc3\xb8.nordland.no\0" -"name.mk\0lier.no\0" -"eidfjord.no\0" -"sc.cn\0tm.km\0" -"jelenia-gora.pl\0sanok.pl\0" -"intelligence.museum\0" -"srv.br\0elblag.pl\0" -"judygarland.museum\0" -"padua.it\0" -"k12.co.us\0" -"lindesnes.no\0" -"name.jo\0izhevsk.ru\0" -"yorkshire.museum\0mel\xc3\xb8y.no\0" -"tm.mc\0lib.pr.us\0" -"hjartdal.no\0" -"tm.mg\0" -"bari.it\0milano.it\0" -"lg.jp\0" -"zgrad.ru\0" -"sm\xc3\xb8la.no\0" -"communications.museum\0" -"arts.co\0seoul.kr\0engerdal.no\0" -"oster\xc3\xb8y.no\0" -"\xe6\x95\x8e\xe8\x82\xb2.hk\0foggia.it\0verran.no\0" -"orskog.no\0voronezh.ru\0kv.ua\0" -"av.it\0" -"tm.no\0nissedal.no\0" -"historisches.museum\0gs.mr.no\0" -"medecin.fr\0" -"montreal.museum\0" -"o.se\0" -"!metro.tokyo.jp\0sola.no\0" -"k12.tn.us\0" -"floro.no\0" -"milan.it\0*.shiga.jp\0" -"berkeley.museum\0" -"maintenance.aero\0" -"ws.na\0" -"lindas.no\0cc.ia.us\0" -"brescia.it\0embroidery.museum\0" -"arezzo.it\0tm.pl\0" -"r\xc3\xa6lingen.no\0" -"burghof.museum\0" -"rec.br\0" -"q.bg\0" -"!nawras.om\0" -"hammarfeasta.no\0" -"moss.no\0" -"on.ca\0" -"gouv.rw\0" -"luxembourg.museum\0" -"rec.co\0british.museum\0" -"reggio-emilia.it\0" -"gouv.sn\0lib.wv.us\0" -"avocat.fr\0" -"simbirsk.ru\0" -"jar.ru\0" -"monza-brianza.it\0" -"tm.ro\0" -"imageandsound.museum\0" -"jpn.com\0mr.no\0" -"siracusa.it\0" -"norilsk.ru\0tm.se\0" -"tn.it\0" -"jeju.kr\0" -"!pref.fukuoka.jp\0" -"*.hyogo.jp\0portlligat.museum\0" -"!pref.osaka.jp\0" -"siena.it\0sc.kr\0omaha.museum\0saskatchewan.museum\0" -"phoenix.museum\0vanylven.no\0" -"botanicalgarden.museum\0" -"turek.pl\0" -"vagsoy.no\0" -"riodejaneiro.museum\0" -"vi.it\0" -"uy.com\0" -"kristiansand.no\0" -"sd.cn\0trento.it\0" -"muncie.museum\0" -"berg.no\0meldal.no\0" -"nes.buskerud.no\0" -"saratov.ru\0" -"gs.oslo.no\0" -"harstad.no\0vaga.no\0" -"research.museum\0" -"brunel.museum\0ia.us\0" -"test.tj\0" -"columbia.museum\0" -"ms.it\0stockholm.museum\0" -"reklam.hu\0" -"pomorskie.pl\0lg.ua\0" -"bg.it\0historicalsociety.museum\0rns.tn\0" -"mallorca.museum\0surgut.ru\0cc.sc.us\0" -"ushistory.museum\0" -"palana.ru\0" -"snoasa.no\0" -"naturalsciences.museum\0" -"yaroslavl.ru\0" -"unjarga.no\0" -"p.se\0" -"ingatlan.hu\0" -"irc.pl\0" -"savona.it\0" -"cr.it\0" -"test.ru\0cc.tn.us\0" -"ms.kr\0museumvereniging.museum\0" -"time.no\0k12.ia.us\0" -"vladimir.ru\0" -"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" -"gouv.km\0nationalfirearms.museum\0" -"m\xc3\xa1latvuopmi.no\0" -"aero\0yosemite.museum\0" -"r.bg\0school.na\0" -"cc.vi.us\0" -"*.wakayama.jp\0" -"beauxarts.museum\0averoy.no\0ullensvang.no\0bar.pro\0" -"!city.hiroshima.jp\0" -"b\xc3\xa1hccavuotna.no\0" -"frosta.no\0" -"gdynia.pl\0" -"medical.museum\0" -"embaixada.st\0" -"balsan.it\0vantaa.museum\0" -"za.net\0" -"!city.saitama.jp\0lib.ks.us\0" -"fnd.br\0" -"ru.com\0se.com\0hol.no\0modalen.no\0" -"gouv.ml\0chukotka.ru\0" -"malopolska.pl\0" -"mansion.museum\0" -"iki.fi\0children.museum\0" -"cyber.museum\0rec.nf\0mo\xc3\xa5reke.no\0" -"to.it\0" -"hasvik.no\0" -"\xc3\xb8yer.no\0" -"arts.ro\0sc.ug\0" -"lib.ar.us\0" -"sc.tz\0cc.ms.us\0cc.nc.us\0" -"etc.br\0poznan.pl\0" -"cnt.br\0viking.museum\0" -"*.miyazaki.jp\0" -"melhus.no\0" -"skodje.no\0vevelstad.no\0" -"sc.us\0" -"upow.gov.pl\0" -"!city.fukuoka.jp\0brandywinevalley.museum\0natuurwetenschappen.museum\0tranby.no\0" -"bahn.museum\0msk.ru\0" -"delmenhorst.museum\0" -"russia.museum\0fuoisku.no\0" -"shell.museum\0" -"r\xc3\xa1isa.no\0" -"hs.kr\0udmurtia.ru\0" -"palermo.it\0" -"pilot.aero\0" -"tn.us\0" -"priv.hu\0" -"li.it\0" -"kr\xc3\xa5""anghke.no\0mosreg.ru\0" -"lib.fl.us\0" -"plants.museum\0" -"ulsan.kr\0national.museum\0" -"mil.ac\0!pref.nara.jp\0surgeonshall.museum\0" -"mil.ae\0santacruz.museum\0vi.us\0" -"wlocl.pl\0" -"mt.it\0napoli.it\0alaska.museum\0arts.nf\0" -"missoula.museum\0" -"rec.ro\0" -"mil.al\0" -"marburg.museum\0waw.pl\0" -"pharmaciens.km\0indianapolis.museum\0larsson.museum\0" -"cc.sd.us\0" -"mil.ba\0mobi\0" -"indianmarket.museum\0" -"recreation.aero\0padova.it\0" -"varese.it\0parti.se\0" -"mil.az\0" -"mil.bo\0!pref.kagoshima.jp\0khmelnitskiy.ua\0" -"rygge.no\0" -"os\xc3\xb8yro.no\0" -"mil.br\0" -"cs.it\0" -"austevoll.no\0fjell.no\0" -"mil.by\0" -"!pref.tokushima.jp\0org\0" -"mil.cn\0gs.svalbard.no\0" -"mil.co\0" -"pz.it\0lib.va.us\0\xd1\x80\xd1\x84\0" -"\xe4\xb8\xaa\xe4\xba\xba.hk\0ms.us\0nc.us\0k12.wi.us\0" -"s.bg\0drangedal.no\0" -"en.it\0" -"culturalcenter.museum\0" -"house.museum\0divttasvuotna.no\0" -"fhs.no\0" -"circus.museum\0" -"priv.at\0" -"mil.ec\0" -"ruovat.no\0" -"midsund.no\0vagan.no\0" -"casadelamoneda.museum\0" -"bristol.museum\0" -"and.museum\0" -"ascolipiceno.it\0computerhistory.museum\0vyatka.ru\0" -"uhren.museum\0" -"lahppi.no\0" -"*.yokohama.jp\0cody.museum\0lib.al.us\0" -"colonialwilliamsburg.museum\0indian.museum\0cc.ky.us\0" -"tp.it\0biev\xc3\xa1t.no\0" -"can.br\0royken.no\0" -"id.ir\0" -"mediocampidano.it\0tromso.no\0" -"kartuzy.pl\0k12.ok.us\0" -"*.saitama.jp\0stjohn.museum\0m\xc3\xa1tta-v\xc3\xa1rjjat.no\0" -"mil.ge\0trani-barletta-andria.it\0" -"lib.as.us\0" -"swiebodzin.pl\0cc.mt.us\0cc.nd.us\0" -"mil.gh\0" -"science-fiction.museum\0\xd9\x82\xd8\xb7\xd8\xb1\0" -"airtraffic.aero\0" -"konskowola.pl\0" -"scienceandhistory.museum\0nysa.pl\0sd.us\0" -"balestrand.no\0" -"oygarden.no\0" -"her\xc3\xb8y.nordland.no\0" -"!pref.ishikawa.jp\0strand.no\0" -"\xe7\xb5\x84\xe7\xbb\x87.hk\0mil.hn\0" -"gob.bo\0volda.no\0" -"losangeles.museum\0larvik.no\0" -"university.museum\0" -"cc.dc.us\0" -"mil.id\0" -"sorfold.no\0" -"watch-and-clock.museum\0" -"flor\xc3\xb8.no\0" -"nittedal.no\0oppeg\xc3\xa5rd.no\0" -"k12.ri.us\0" -"gob.cl\0" -"komi.ru\0" -"government.aero\0mil.in\0" -"mil.iq\0id.lv\0" -"culture.museum\0" -"id.ly\0" -"raholt.no\0" -"lubin.pl\0grozny.ru\0" -"kchr.ru\0" -"nikolaev.ua\0" -"lib.sd.us\0" -"de.com\0" -"mil.jo\0" -"*.kanagawa.jp\0gaular.no\0miasta.pl\0" -"bi.it\0rnu.tn\0uzhgorod.ua\0" -"idrett.no\0v\xc3\xa5gs\xc3\xb8y.no\0" -"wroclaw.pl\0" -"res.aero\0ne.jp\0mil.kg\0" -"\xc3\xa5mli.no\0" -"education.museum\0" -"dgca.aero\0" -"mil.km\0" -"trolley.museum\0" -"cci.fr\0r.se\0" -"archaeological.museum\0" -"monzaedellabrianza.it\0mil.kr\0" -"gob.es\0kvafjord.no\0ky.us\0" -"lecco.it\0" -"ct.it\0" -"magazine.aero\0" -"operaunite.com\0ne.kr\0" -"mil.kz\0skoczow.pl\0" -"nf.ca\0" -"western.museum\0" -"kunst.museum\0gaivuotna.no\0karpacz.pl\0spb.ru\0cc.id.us\0" -"slask.pl\0" -"youth.museum\0" -"adv.br\0campidanomedio.it\0!songfest.om\0" -"geelvinck.museum\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0" -"mil.lv\0" -"fie.ee\0mil.mg\0mt.us\0nd.us\0k12.vt.us\0" -"t.bg\0ushuaia.museum\0" -"off.ai\0" -"irkutsk.ru\0" -"stor-elvdal.no\0tourism.tn\0" -"penza.ru\0" -"bj.cn\0\xe4\xb8\xad\xe5\x9b\xbd\0" -"civilwar.museum\0mil.mv\0opole.pl\0" -"nes.akershus.no\0" -"mil.my\0karelia.ru\0" -"como.it\0sande.vestfold.no\0" -"\xe4\xb8\xad\xe5\x9c\x8b\0" -"gob.hn\0lib.la.us\0" -"mil.no\0cc.wv.us\0" -"boleslawiec.pl\0" -"!pref.niigata.jp\0gs.sf.no\0dc.us\0k12.mi.us\0" -"museum\0dep.no\0kv\xc3\xa6nangen.no\0l\xc3\xa1hppi.no\0" -"film.museum\0" -"frei.no\0" -"notodden.no\0risor.no\0" -"messina.it\0" -"eidsberg.no\0" -"krakow.pl\0lib.mt.us\0lib.nd.us\0" -"rauma.no\0" -"mulhouse.museum\0" -"sibenik.museum\0grong.no\0mil.pe\0" -"budejju.no\0k12.nv.us\0" -"stavanger.no\0mil.ph\0" -"forli-cesena.it\0" -"naples.it\0cc.ne.us\0" -"s\xc3\xb8r-aurdal.no\0" -"mil.pl\0" -"vibo-valentia.it\0ski.museum\0siedlce.pl\0" -"bus.museum\0" -"tozsde.hu\0" -"!pref.shizuoka.jp\0santabarbara.museum\0" -"zhitomir.ua\0" -"pro.az\0" -"ne.pw\0" -"pro.br\0orkanger.no\0b\xc3\xb8.telemark.no\0" -"roma.it\0cc.ct.us\0" -"heritage.museum\0giske.no\0" -"!pref.kumamoto.jp\0prof.pr\0" -"*.kochi.jp\0" -"andria-barletta-trani.it\0*.toyama.jp\0sveio.no\0" -"id.us\0" -"bolt.hu\0" -"fetsund.no\0porsgrunn.no\0" -"iglesias-carbonia.it\0" -"sf.no\0" -"mil.ru\0" -"from.hr\0asnes.no\0mil.rw\0" -"alesund.no\0sos.pl\0" -"livorno.it\0" -"crafts.museum\0" -"aquila.it\0" -"vega.no\0" -"jewelry.museum\0" -"sk\xc3\xa1nit.no\0chita.ru\0" -"pro.ec\0" -"fortmissoula.museum\0j\xc3\xb8lster.no\0" -"pro\0mil.st\0" -"busan.kr\0lib.ga.us\0" -"dellogliastra.it\0" -"aosta.it\0chungnam.kr\0gob.mx\0" -"mil.sy\0k12.hi.us\0" -"mil.tj\0" -"ulan-ude.ru\0mil.to\0wv.us\0" -"luster.no\0volgograd.ru\0" -"pa.it\0kommunalforbund.se\0lib.tx.us\0" -"s.se\0" -"qsl.br\0" -"mil.tw\0" -"est.pr\0ens.tn\0" -"lib.id.us\0" -"mil.tz\0" -"uscountryestate.museum\0" -"agents.aero\0" -"\xc3\xb8vre-eiker.no\0ne.ug\0" -"pb.ao\0" -"gob.pa\0ne.tz\0" -"tur.br\0" -"mil.vc\0" -"or.at\0gob.pe\0" -"s\xc3\xb8r-fron.no\0" -"or.bi\0ne.us\0" -"u.bg\0gob.pk\0" -"stavern.no\0" -"brindisi.it\0" -"aknoluokta.no\0" -"!pref.kyoto.jp\0tydal.no\0" -"plc.ly\0muos\xc3\xa1t.no\0" -"or.ci\0hamaroy.no\0priv.pl\0" -"vestre-slidre.no\0gniezno.pl\0" -"\xe7\xae\x87\xe4\xba\xba.hk\0" -"andebu.no\0" -"nieruchomosci.pl\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" -"or.cr\0pro.ht\0bolzano.it\0" -"ct.us\0k12.md.us\0" -"za.org\0" -"!icnet.uk\0" -"localhistory.museum\0" -"firm.ht\0" -"lel.br\0tr.it\0kvanangen.no\0" -"sondre-land.no\0t\xc3\xb8nsberg.no\0vefsn.no\0" -"nature.museum\0yamal.ru\0" -"rv.ua\0" -"lans.museum\0lib.ne.us\0" -"lur\xc3\xb8y.no\0" -"eu.com\0firm.in\0" -"hjelmeland.no\0" -"gs.tr.no\0" -"casino.hu\0essex.museum\0tourism.pl\0" -"rennesoy.no\0" -"priv.no\0" -"baths.museum\0mytis.ru\0" -"tingvoll.no\0" -"cc.az.us\0" -"sh.cn\0" -"!pref.miyazaki.jp\0s\xc3\xb8rfold.no\0" -"aurskog-holand.no\0malatvuopmi.no\0" -"lib.ct.us\0" -"cc.pa.us\0" -"pa.gov.pl\0" -"firm.co\0cc.de.us\0" -"nrw.museum\0" -"daejeon.kr\0livinghistory.museum\0" -"gildeskal.no\0lund.no\0" -"\xc3\xb8ksnes.no\0stavropol.ru\0" -"b\xc3\xa6rum.no\0r\xc3\xb8yrvik.no\0" -"osoyro.no\0" -"priv.me\0sula.no\0!parliament.uk\0" -"nationalheritage.museum\0" -"jaworzno.pl\0" -"dinosaur.museum\0" -"garden.museum\0trust.museum\0" -"turen.tn\0" -"kautokeino.no\0" -"pro.na\0" -"gorizia.it\0" -"siljan.no\0" -"or.id\0pro.mv\0" -"bieszczady.pl\0www.ro\0" -"lib.ee\0antiques.museum\0brasil.museum\0tr.no\0" -"aejrie.no\0" -"!pref.hokkaido.jp\0" -"schlesisches.museum\0" -"huissier-justice.fr\0or.it\0" -"t.se\0" -"environment.museum\0" -"vindafjord.no\0" -"edu.ac\0or.jp\0" -"tree.museum\0" -"groundhandling.aero\0edu.af\0" -"rochester.museum\0sanfrancisco.museum\0" -"ebiz.tw\0" -"kirovograd.ua\0" -"edu.al\0" -"edu.an\0\xc3\xa1k\xc5\x8boluokta.no\0v\xc3\xa5g\xc3\xa5.no\0" -"v.bg\0" -"edu.ba\0" -"edu.bb\0nesset.no\0" -"hornindal.no\0pro.pr\0" -"or.kr\0" -"az.us\0" -"edu.bh\0volkenkunde.museum\0" -"edu.bi\0" -"edu.az\0" -"b\xc3\xb8mlo.no\0" -"edu.bm\0" -"edu.bo\0tyumen.ru\0" -"edu.br\0" -"edu.bs\0pa.us\0" -"alto-adige.it\0whaling.museum\0" -"*.iwate.jp\0" -"edu.ci\0law.pro\0" -"edu.bz\0de.us\0" -"lib.ak.us\0" -"edu.cn\0" -"edu.co\0" -"laspezia.it\0" -"baidar.no\0" -"ts.it\0" -"or.na\0" -"edu.cu\0hotel.lk\0" -"show.aero\0or.mu\0" -"sandnes.no\0" -"museumcenter.museum\0" -"edu.dm\0kazan.ru\0" -"biz\0caltanissetta.it\0odessa.ua\0k12.oh.us\0" -"crimea.ua\0" -"research.aero\0lom.no\0" -"edu.ec\0florence.it\0clock.museum\0sshn.se\0" -"edu.ee\0game.tw\0" -"!pref.okinawa.jp\0" -"ilawa.pl\0" -"edu.dz\0indiana.museum\0" -"gs.jan-mayen.no\0" -"publ.pt\0" -"nom.ad\0" -"skanit.no\0gdansk.pl\0k12.pa.us\0" -"nom.ag\0edu.es\0" -"if.ua\0" -"pro.tt\0lib.de.us\0" -"environmentalconservation.museum\0cc.or.us\0" -"bern.museum\0nat.tn\0" -"rubtsovsk.ru\0" -"!educ.ar\0masoy.no\0" -"bologna.it\0" -"\xc3\xa5snes.no\0fhv.se\0" -"*.tottori.jp\0radoy.no\0" -"romskog.no\0" -"malbork.pl\0" -"olbiatempio.it\0" -"edu.ge\0" -"edu.gh\0" -"edu.gi\0" -"or.pw\0" -"hob\xc3\xb8l.no\0" -"nom.br\0edu.gn\0virginia.museum\0mbone.pl\0!nls.uk\0" -"seljord.no\0pro.vn\0" -"edu.gp\0" -"edu.gr\0" -"!uba.ar\0!pref.saitama.jp\0" -"greta.fr\0gs.aa.no\0kvinnherad.no\0" -"lib.sc.us\0" -"js.cn\0nom.co\0edu.hk\0" -"lesja.no\0" -"bl.it\0" -"edu.hn\0\xc3\xb8ystre-slidre.no\0mari-el.ru\0" -"hotel.hu\0" -"rindal.no\0" -"edu.ht\0" -"!pref.miyagi.jp\0" -"midtre-gauldal.no\0" -"xj.cn\0australia.museum\0" -"ab.ca\0salvadordali.museum\0olawa.pl\0" -"pc.it\0" -"u.se\0" -"edu.in\0b\xc3\xa1l\xc3\xa1t.no\0" -"ln.cn\0alta.no\0" -"chelyabinsk.ru\0" -"edu.iq\0" -"ontario.museum\0" -"edu.is\0" -"edu.it\0" -"b\xc3\xa5tsfjord.no\0" -"trysil.no\0or.th\0" -"utsira.no\0" -"nom.es\0edu.jo\0fhsk.se\0" -"bale.museum\0" -"w.bg\0" -"lillesand.no\0" -"edu.kg\0" -"amusement.aero\0" -"edu.ki\0" -"fauske.no\0or.ug\0" -"int.az\0askvoll.no\0eidskog.no\0cv.ua\0" -"algard.no\0" -"edu.km\0or.tz\0" -"nom.fr\0edu.kn\0" -"*.ibaraki.jp\0hoylandet.no\0" -"int.bo\0edu.kp\0" -"edu.la\0" -"si.it\0edu.lb\0travel.pl\0" -"edu.lc\0mx.na\0n\xc3\xa1vuotna.no\0ovre-eiker.no\0" -"aa.no\0!siemens.om\0" -"sciences.museum\0or.us\0" -"cat\0" -"edu.ky\0" -"int.ci\0edu.kz\0firm.ro\0cc.wy.us\0" -"edu.lk\0vaapste.no\0" -"!pref.tochigi.jp\0" -"int.co\0podlasie.pl\0" -"edu.lr\0" -"karikatur.museum\0jamal.ru\0" -"gjovik.no\0krager\xc3\xb8.no\0k12.az.us\0" -"edu.me\0" -"ud.it\0edu.lv\0entomology.museum\0" -"edu.mg\0moskenes.no\0" -"\xe6\x94\xbf\xe5\xba\x9c.hk\0edu.ly\0" -"stpetersburg.museum\0" -"edu.mk\0" -"edu.ml\0nordreisa.no\0" -"!pref.fukui.jp\0lib.ms.us\0lib.nc.us\0" -"edu.mn\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" -"fot.br\0edu.mo\0" -"iron.museum\0" -"asti.it\0annefrank.museum\0stv.ru\0cc.nh.us\0" -"edu.mv\0" -"lodi.it\0edu.mw\0edu.ng\0" -"gwangju.kr\0edu.mx\0" -"edu.my\0" -"soundandvision.museum\0" -"lenvik.no\0" -"ballooning.aero\0" -"name\0" -"jogasz.hu\0frogn.no\0" -"history.museum\0" -"consultant.aero\0edu.nr\0" -"manchester.museum\0" -"*.hiroshima.jp\0" -"pol.dz\0" -"*.tochigi.jp\0heimatunduhren.museum\0" -"!pref.kanagawa.jp\0" -"firm.nf\0edu.pa\0" -"coop.ht\0pc.pl\0" -"chicago.museum\0" -"vn.ua\0" -"edu.pe\0" -"tana.no\0edu.pf\0" -"edu.ph\0" -"nom.km\0" -"travel.tt\0" -"edu.pk\0" -"experts-comptables.fr\0edu.pl\0bryansk.ru\0" -"edu.pn\0" -"evje-og-hornnes.no\0warszawa.pl\0" -"ac.ae\0" -"edu.pr\0" -"vaksdal.no\0edu.ps\0dni.us\0" -"po.gov.pl\0edu.pt\0" -"nordre-land.no\0vadso.no\0" -"rnrt.tn\0" -"sport.hu\0!pref.gifu.jp\0voss.no\0targi.pl\0" -"flesberg.no\0" -"photography.museum\0" -"modena.it\0tonsberg.no\0" -"ac.at\0" -"ac.be\0coop.br\0" -"services.aero\0" -"nom.mg\0" -"wielun.pl\0" -"jefferson.museum\0wy.us\0" -"pd.it\0ot.it\0neues.museum\0slattum.no\0" -"vdonsk.ru\0" -"ar.com\0edu.sa\0" -"\xc3\xa5l.no\0edu.sb\0" -"edu.rs\0edu.sc\0" -"ac.ci\0int.is\0edu.sd\0!tsk.tr\0" -"br\xc3\xb8nn\xc3\xb8ysund.no\0and\xc3\xb8y.no\0edu.ru\0" -"pol.ht\0" -"edu.rw\0edu.sg\0" -"gyeongnam.kr\0olecko.pl\0" -"ac.cn\0" -"graz.museum\0" -"coldwar.museum\0edu.sl\0" -"ac.cr\0" -"edu.sn\0" -"hamar.no\0" -"histoire.museum\0" -"!city.shizuoka.jp\0" -"edu.st\0" -"oceanographic.museum\0nh.us\0" -"x.bg\0" -"surnadal.no\0" -"fc.it\0costume.museum\0stalowa-wola.pl\0" -"valer.ostfold.no\0edu.sy\0" -"edu.tj\0" -"arq.br\0" -"aeroclub.aero\0odo.br\0pe.ca\0\xe7\xb6\xb2\xe7\xb5\xa1.cn\0bronnoysund.no\0nom.pa\0" -"edu.to\0" -"paleo.museum\0nom.pe\0edu.ua\0" -"int.la\0trustee.museum\0forsand.no\0krasnoyarsk.ru\0" -"!pref.hyogo.jp\0" -"edu.tt\0" -"zarow.pl\0" -"edu.tw\0" -"nom.pl\0" -"community.museum\0kvitsoy.no\0" -"int.lk\0tychy.pl\0" -"k12.me.us\0" -"jondal.no\0edu.vc\0" -"illustration.museum\0" -"clinton.museum\0" -"tas.au\0es.kr\0" -"production.aero\0" -"rodoy.no\0" -"database.museum\0bodo.no\0" -"anthro.museum\0landes.museum\0edu.vn\0" -"nom.re\0" -"altai.ru\0" -"filatelia.museum\0" -"sk.ca\0lezajsk.pl\0" -"rockart.museum\0int.mv\0" -"int.mw\0herad.no\0" -"eti.br\0ac.gn\0" -"fedje.no\0nom.ro\0" -"money.museum\0" -"\xd9\x85\xd8\xb5\xd8\xb1\0" -"horten.no\0" -"gangaviika.no\0mielec.pl\0" -"uw.gov.pl\0" -"moma.museum\0" -"edu.ws\0" -"go.ci\0" -"tv.bo\0technology.museum\0" -"s\xc3\xb8ndre-land.no\0" -"tv.br\0" -"jor.br\0lib.dc.us\0" -"arboretum.museum\0" -"go.cr\0" -"artsandcrafts.museum\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" -"psc.br\0ac.id\0!city.chiba.jp\0" -"wa.au\0" -"rome.it\0" -"amli.no\0" -"ac.im\0lo.it\0" -"ac.in\0" -"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0durham.museum\0" -"ac.ir\0" -"torino.museum\0" -"loabat.no\0" -"com\0" -"nalchik.ru\0" -"yakutia.ru\0" -"settlers.museum\0" -"!promocion.ar\0int.pt\0" -"union.aero\0" -"utah.museum\0" -"giehtavuoatna.no\0" -"ac.jp\0" -"air-traffic-control.aero\0" -"silk.museum\0usantiques.museum\0" -"bn.it\0" -"kalisz.pl\0" -"perm.ru\0" -"aoste.it\0bindal.no\0" -"coloradoplateau.museum\0k12.gu.us\0" -"frosinone.it\0forde.no\0" -"epilepsy.museum\0" -"olbia-tempio.it\0" -"journalist.aero\0ac.kr\0*.sch.uk\0" -"nic.im\0sciencesnaturelles.museum\0bedzin.pl\0" -"nic.in\0pe.it\0" -"w.se\0" -"!pref.okayama.jp\0" -"urn.arpa\0" -"cinema.museum\0" -"monza.it\0versailles.museum\0int.ru\0" -"andasuolo.no\0skj\xc3\xa5k.no\0chernovtsy.ua\0" -"nyc.museum\0int.rw\0paroch.k12.ma.us\0" -"ringerike.no\0" -"ac.ma\0" -"org.ac\0civilaviation.aero\0" -"rakkestad.no\0" -"org.ae\0ac.me\0" -"org.af\0" -"org.ag\0" -"org.ai\0stokke.no\0" -"airport.aero\0" -"finnoy.no\0" -"org.al\0" -"org.an\0y.bg\0habmer.no\0" -"stadt.museum\0holtalen.no\0" -"int.tj\0" -"org.ba\0gjerdrum.no\0" -"org.bb\0ascoli-piceno.it\0molde.no\0r\xc3\xb8st.no\0tysfjord.no\0" -"pe.kr\0rybnik.pl\0" -"go.id\0" -"ac.mu\0" -"ac.mw\0ac.ng\0" -"org.bh\0\xc3\xa5mot.no\0rana.no\0" -"org.bi\0" -"org.az\0belgorod.ru\0int.tt\0" -"ae.org\0" -"group.aero\0posts-and-telecommunications.museum\0" -"org.bm\0salerno.it\0" -"etnedal.no\0" -"org.bo\0*.hokkaido.jp\0donetsk.ua\0" -"ostroda.pl\0" -"org.br\0" -"org.bs\0" -"go.it\0h\xc3\xb8ylandet.no\0" -"zgorzelec.pl\0" -"org.bw\0" -"org.ci\0" -"org.bz\0vicenza.it\0resistance.museum\0" -"missile.museum\0" -"org.cn\0" -"org.co\0assassination.museum\0" -"go.jp\0" -"tv.it\0austrheim.no\0ac.pa\0" -"verbania.it\0" -"palace.museum\0" -"tmp.br\0int.vn\0" -"org.cu\0" -"paris.museum\0" -"media.aero\0hokksund.no\0" -"arts.museum\0gemological.museum\0hammerfest.no\0" -"k12.ny.us\0" -"org.dm\0hemsedal.no\0ringsaker.no\0sklep.pl\0" -"h\xc3\xa5.no\0cc.nj.us\0" -"rzeszow.pl\0" -"go.kr\0gjesdal.no\0ac.pr\0" -"org.ec\0" -"org.ee\0" -"media.museum\0" -"terni.it\0touch.museum\0zakopane.pl\0" -"journal.aero\0org.dz\0" -"incheon.kr\0" -"b\xc3\xa1hcavuotna.no\0" -"leksvik.no\0ulvik.no\0" -"plantation.museum\0" -"org.es\0loyalist.museum\0" -"gildesk\xc3\xa5l.no\0bytom.pl\0" -"bo.nordland.no\0" -"ambulance.aero\0iglesiascarbonia.it\0" -"tw.cn\0\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0" -"chocolate.museum\0" -"pittsburgh.museum\0" -"royrvik.no\0sor-odal.no\0ac.rs\0" -"kaluga.ru\0" -"org.ge\0erotica.hu\0ac.ru\0ac.se\0" -"org.gg\0leangaviika.no\0ac.rw\0" -"org.gh\0v\xc3\xa6r\xc3\xb8y.no\0" -"org.gi\0" -"jevnaker.no\0" -"org.gn\0tv.na\0leikanger.no\0" -"org.gp\0" -"ask\xc3\xb8y.no\0" -"org.gr\0wroc.pl\0" -"ad.jp\0" -"powiat.pl\0" -"tj\xc3\xb8me.no\0" -"coop.tt\0" -"ac.th\0" -"mragowo.pl\0ac.sz\0ac.tj\0" -"org.hk\0bo.it\0" -"philately.museum\0" -"org.hn\0" -"fet.no\0" -"axis.museum\0mansions.museum\0" -"wiki.br\0" -"org.ht\0" -"org.hu\0piacenza.it\0scotland.museum\0cpa.pro\0" -"ac.ug\0" -"coop.mv\0x.se\0" -"coop.mw\0ac.tz\0" -"bmd.br\0" -"org.im\0ralingen.no\0" -"org.in\0" -"cz.it\0lib.ia.us\0" -"org.iq\0" -"org.ir\0" -"org.is\0" -"nl.ca\0" -"org.je\0" -"childrensgarden.museum\0" -"kvits\xc3\xb8y.no\0go.pw\0" -"sokndal.no\0" -"ra.it\0grimstad.no\0" -"denmark.museum\0" -"ac.vn\0" -"ecn.br\0org.jo\0" -"bialystok.pl\0nj.us\0" -"z.bg\0bilbao.museum\0stargard.pl\0nic.tj\0" -"eisenbahn.museum\0" -"fe.it\0bryne.no\0vrn.ru\0" -"cc.wa.us\0" -"sex.hu\0skierva.no\0" -"org.kg\0" -"org.ki\0" -"org.km\0" -"org.kn\0khakassia.ru\0" -"org.kp\0" -"org.la\0" -"org.lb\0" -"org.lc\0" -"francaise.museum\0" -"panama.museum\0" -"rotorcraft.aero\0gateway.museum\0olkusz.pl\0" -"org.ky\0czeladz.pl\0ryazan.ru\0" -"org.kz\0" -"org.lk\0dyr\xc3\xb8y.no\0" -"raisa.no\0" -"dlugoleka.pl\0" -"org.ma\0" -"org.lr\0prochowice.pl\0" -"org.ls\0" -"org.me\0sandoy.no\0s\xc3\xb8r-varanger.no\0" -"org.lv\0" -"org.mg\0" -"tel\0go.th\0" -"org.ly\0" -"steam.museum\0go.tj\0" -"org.mk\0pasadena.museum\0jessheim.no\0lib.mn.us\0" -"org.ml\0" -"software.aero\0" -"org.mn\0" -"org.mo\0" -"*.fukui.jp\0decorativearts.museum\0" -"spy.museum\0org.na\0jorpeland.no\0" -"vads\xc3\xb8.no\0" -"org.mu\0building.museum\0gausdal.no\0" -"org.mv\0nannestad.no\0" -"org.mw\0org.ng\0go.ug\0" -"vr.it\0org.mx\0" -"org.my\0" -"go.tz\0" -"oppdal.no\0" -"uk.net\0" -"coop.km\0" -"*.kyoto.jp\0" -"sarpsborg.no\0org.nr\0" -"chernigov.ua\0" -"ha.cn\0no.com\0" -"space.museum\0" -"org.pa\0" -"*.ar\0" -"usgarden.museum\0" -"*.bd\0org.pe\0" -"*.au\0org.pf\0um.gov.pl\0" -"bio.br\0" -"org.ph\0" -"org.pk\0" -"fr\xc3\xa6na.no\0org.pl\0" -"nord-aurdal.no\0org.pn\0" -"*.bn\0handson.museum\0agrinet.tn\0" -"kviteseid.no\0" -"rel.ht\0virtuel.museum\0atm.pl\0org.pr\0" -"org.ps\0cherkassy.ua\0" -"org.pt\0wa.us\0" -"*.bt\0arendal.no\0magnitka.ru\0" -"depot.museum\0porsangu.no\0" -"laakesvuemie.no\0" -"sor-fron.no\0" -"heroy.more-og-romsdal.no\0" -"*.ck\0" -"!rakpetroleum.om\0" -"kr\xc3\xb8""dsherad.no\0mail.pl\0" -"mod.gi\0" -"gs.nl.no\0" -"mb.ca\0" -"pavia.it\0" -"civilisation.museum\0folldal.no\0" -"suli.hu\0" -"brumunddal.no\0" -"*.cy\0" -"pg.it\0troms\xc3\xb8.no\0" -"sex.pl\0y.se\0" -"org.ro\0" -"*.do\0" -"caserta.it\0org.sa\0" -"za.com\0halloffame.museum\0org.sb\0lviv.ua\0" -"mill.museum\0org.rs\0org.sc\0" -"org.sd\0" -"idv.hk\0!omanmobile.om\0org.ru\0org.se\0" -"langev\xc3\xa5g.no\0r\xc3\xa5holt.no\0starostwo.gov.pl\0" -"trani-andria-barletta.it\0org.sg\0" -"*.eg\0hvaler.no\0" -"*.ehime.jp\0" -"gmina.pl\0" -"bod\xc3\xb8.no\0org.sl\0" -"edu\0org.sn\0" -"org.so\0lib.wi.us\0" -"kommune.no\0" -"nome.pt\0" -"*.er\0namdalseid.no\0k12.wa.us\0" -"nm.cn\0org.st\0" -"*.et\0d\xc3\xb8nna.no\0" -"jewish.museum\0preservation.museum\0" -"slupsk.pl\0org.sy\0" -"art.br\0org.sz\0org.tj\0" -"ntr.br\0*.fj\0ski.no\0" -"*.fk\0rimini.it\0grajewo.pl\0" -"loppa.no\0" -"franziskaner.museum\0notteroy.no\0org.tn\0" -"org.to\0" -"nesoddtangen.no\0" -"org.ua\0" -"discovery.museum\0wloclawek.pl\0" -"lakas.hu\0org.tt\0" -"kurgan.ru\0" -"baltimore.museum\0nkz.ru\0org.tw\0" -"com.ac\0castle.museum\0" -"*.fukuoka.jp\0sandefjord.no\0varggat.no\0" -"com.af\0" -"com.ag\0" -"ato.br\0k12.nj.us\0" -"com.ai\0" -"city.hu\0oryol.ru\0" -"com.al\0nl.no\0mielno.pl\0cc.ma.us\0" -"org.vc\0" -"com.an\0g12.br\0" -"*.gt\0" -"*.gu\0" -"com.ba\0" -"com.bb\0americanart.museum\0" -"org.vi\0" -"kunstsammlung.museum\0" -"com.aw\0" -"flight.aero\0com.bh\0lib.mo.us\0org.vn\0" -"com.bi\0adygeya.ru\0" -"com.az\0" -"art.dz\0" -"com.bm\0" -"dr\xc3\xb8""bak.no\0" -"com.bo\0isla.pr\0" -"com.br\0" -"com.bs\0ustka.pl\0kuban.ru\0" -"press.aero\0" -"vs.it\0" -"meloy.no\0" -"*.il\0ulm.museum\0" -"com.by\0com.ci\0genoa.it\0" -"com.bz\0sn.cn\0" -"lib.or.us\0" -"santafe.museum\0org.ws\0" -}; - -QT_END_NAMESPACE - -#endif // QNETWORKCOOKIEJARTLD_P_H diff --git a/src/network/access/qnetworkcookiejartlds_p.h.INFO b/src/network/access/qnetworkcookiejartlds_p.h.INFO deleted file mode 100644 index 57a8d0e..0000000 --- a/src/network/access/qnetworkcookiejartlds_p.h.INFO +++ /dev/null @@ -1,17 +0,0 @@ -The file qnetworkcookiejartlds_p.h is generated from the Public Suffix -List (see [1] and [2]), by the program residing at -util/network/cookiejar-generateTLDs in the Qt source tree. - -That program generates a character array and an index array from the -list to provide fast lookups of elements within C++. - -Those arrays in qnetworkcookiejartlds_p.h are derived from the Public -Suffix List ([2]), which was originally provided by -Jo Hermans . - -The file qnetworkcookiejartlds_p.h was last generated Friday, -November 19th 15:24 2010. - ----- -[1] list: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 -[2] homepage: http://publicsuffix.org/ diff --git a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp index 178f6d8..1f7c269 100644 --- a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp +++ b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp @@ -42,7 +42,7 @@ #include #include -#include "private/qnetworkcookiejar_p.h" +#include "private/qtldurl_p.h" class tst_QNetworkCookieJar: public QObject { @@ -438,7 +438,7 @@ void tst_QNetworkCookieJar::effectiveTLDs() #endif QFETCH(QString, domain); QFETCH(bool, isTLD); - QCOMPARE(QNetworkCookieJarPrivate::isEffectiveTLD(domain), isTLD); + QCOMPARE(qIsEffectiveTLD(domain), isTLD); } QTEST_MAIN(tst_QNetworkCookieJar) diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp index 336ee36..85aae1f 100644 --- a/tests/auto/qurl/tst_qurl.cpp +++ b/tests/auto/qurl/tst_qurl.cpp @@ -49,6 +49,7 @@ #include #include #include +#include "private/qtldurl_p.h" // For testsuites #define IDNA_ACE_PREFIX "xn--" @@ -88,6 +89,8 @@ public slots: void init(); void cleanup(); private slots: + void effectiveTLDs_data(); + void effectiveTLDs(); void getSetCheck(); void constructing(); void assignment(); @@ -4005,5 +4008,28 @@ void tst_QUrl::taskQTBUG_8701() QCOMPARE(foo_uni_bar, QUrl(foo_uni_bar, QUrl::StrictMode).toString()); } +void tst_QUrl::effectiveTLDs_data() +{ + QTest::addColumn("domain"); + QTest::addColumn("TLD"); + + QTest::newRow("yes0") << QUrl::fromEncoded("http://test.co.uk") << ".co.uk"; + QTest::newRow("yes1") << QUrl::fromEncoded("http://test.com") << ".com"; + QTest::newRow("yes2") << QUrl::fromEncoded("http://www.test.de") << ".de"; + QTest::newRow("yes3") << QUrl::fromEncoded("http://test.ulm.museum") << ".ulm.museum"; + QTest::newRow("yes4") << QUrl::fromEncoded("http://www.com.krodsherad.no") << ".krodsherad.no"; + QTest::newRow("yes5") << QUrl::fromEncoded("http://www.co.uk.1.bg") << ".1.bg"; + QTest::newRow("yes6") << QUrl::fromEncoded("http://www.com.com.cn") << ".com.cn"; + QTest::newRow("yes7") << QUrl::fromEncoded("http://www.test.org.ws") << ".org.ws"; + QTest::newRow("yes9") << QUrl::fromEncoded("http://www.com.co.uk.wallonie.museum") << ".wallonie.museum"; +} + +void tst_QUrl::effectiveTLDs() +{ + QFETCH(QUrl, domain); + QFETCH(QString, TLD); + QCOMPARE(domain.topLevelDomain(), TLD); +} + QTEST_MAIN(tst_QUrl) #include "tst_qurl.moc" diff --git a/util/corelib/qurl-generateTLDs/main.cpp b/util/corelib/qurl-generateTLDs/main.cpp new file mode 100644 index 0000000..baaf256 --- /dev/null +++ b/util/corelib/qurl-generateTLDs/main.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the utils of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +static QString utf8encode(const QByteArray &array) // turns e.g. tranøy.no to tran\xc3\xb8y.no +{ + QString result; + result.reserve(array.length() + array.length() / 3); + for (int i = 0; i < array.length(); ++i) { + char c = array.at(i); + // if char is non-ascii, escape it + if (c < 0x20 || uchar(c) >= 0x7f) { + result += "\\x" + QString::number(uchar(c), 16); + } else { + // if previous char was escaped, we need to make sure the next char is not + // interpreted as part of the hex value, e.g. "äc.com" -> "\xabc.com"; this + // should be "\xab""c.com" + QRegExp hexEscape("\\\\x[a-fA-F0-9][a-fA-F0-9]$"); + bool isHexChar = ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F')); + if (result.contains(hexEscape) && isHexChar) + result += "\"\""; + result += c; + } + } + return result; +} + +int main(int argc, char **argv) { + + QCoreApplication app(argc, argv); + if (argc < 3) { + printf("\nusage: %s inputFile outputFile\n\n", argv[0]); + printf("'inputFile' should be a list of effective TLDs, one per line,\n"); + printf("as obtained from http://publicsuffix.org . To create indices and data file\n"); + printf("file, do the following:\n\n"); + printf(" wget http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 -O effective_tld_names.dat\n"); + printf(" grep '^[^\\/\\/]' effective_tld_names.dat > effective_tld_names.dat.trimmed\n"); + printf(" %s effective_tld_names.dat.trimmed effective_tld_names.dat.qt\n\n", argv[0]); + printf("Now copy the data from effective_tld_names.dat.qt to the file src/corelib/io/qurltlds_p.h in your Qt repo\n\n"); + exit(1); + } + QFile file(argv[1]); + QFile outFile(argv[2]); + file.open(QIODevice::ReadOnly); + outFile.open(QIODevice::WriteOnly); + + QByteArray outIndicesBufferBA; + QBuffer outIndicesBuffer(&outIndicesBufferBA); + outIndicesBuffer.open(QIODevice::WriteOnly); + + QByteArray outDataBufferBA; + QBuffer outDataBuffer(&outDataBufferBA); + outDataBuffer.open(QIODevice::WriteOnly); + + int lineCount = 0; + while (!file.atEnd()) { + file.readLine(); + lineCount++; + } + file.reset(); + QVector strings(lineCount); + while (!file.atEnd()) { + QString s = QString::fromUtf8(file.readLine()); + QString st = s.trimmed(); + int num = qHash(st) % lineCount; + + QString utf8String = utf8encode(st.toUtf8()); + + // for domain 1.com, we could get something like + // a.com\01.com, which would be interpreted as octal 01, + // so we need to separate those strings with quotes + QRegExp regexpOctalEscape(QLatin1String("^[0-9]")); + if (!strings.at(num).isEmpty() && st.contains(regexpOctalEscape)) + strings[num].append("\"\""); + + strings[num].append(utf8String); + strings[num].append("\\0"); + } + + outIndicesBuffer.write("static const quint16 tldCount = "); + outIndicesBuffer.write(QByteArray::number(lineCount)); + outIndicesBuffer.write(";\n"); + outIndicesBuffer.write("static const quint16 tldIndices["); +// outIndicesBuffer.write(QByteArray::number(lineCount+1)); // not needed + outIndicesBuffer.write("] = {\n"); + + int utf8Size = 0; +// int charSize = 0; + for (int a = 0; a < lineCount; a++) { + bool lineIsEmpty = strings.at(a).isEmpty(); + if (!lineIsEmpty) { + strings[a].prepend("\""); + strings[a].append("\""); + } + int zeroCount = strings.at(a).count(QLatin1String("\\0")); + int utf8CharsCount = strings.at(a).count(QLatin1String("\\x")); + int quoteCount = strings.at(a).count('"'); + outDataBuffer.write(strings.at(a).toUtf8()); + if (!lineIsEmpty) + outDataBuffer.write("\n"); + outIndicesBuffer.write(QByteArray::number(utf8Size)); + outIndicesBuffer.write(",\n"); + utf8Size += strings.at(a).count() - (zeroCount + quoteCount + utf8CharsCount * 3); +// charSize += strings.at(a).count(); + } + outIndicesBuffer.write(QByteArray::number(utf8Size)); + outIndicesBuffer.write("};\n"); + outIndicesBuffer.close(); + outFile.write(outIndicesBufferBA); + + outDataBuffer.close(); + outFile.write("\nstatic const char tldData["); +// outFile.write(QByteArray::number(charSize)); // not needed + outFile.write("] = {\n"); + outFile.write(outDataBufferBA); + outFile.write("};\n"); + outFile.close(); + printf("data generated to %s . Now copy the data from this file to src/corelib/io/qurltlds_p.h in your Qt repo\n", argv[2]); + exit(0); +} diff --git a/util/corelib/qurl-generateTLDs/qurl-generateTLDs.pro b/util/corelib/qurl-generateTLDs/qurl-generateTLDs.pro new file mode 100644 index 0000000..9d5f1cf --- /dev/null +++ b/util/corelib/qurl-generateTLDs/qurl-generateTLDs.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = +DEPENDPATH += . +INCLUDEPATH += . + +QT = core + +# Input +SOURCES += main.cpp diff --git a/util/network/cookiejar-generateTLDs/cookiejar-generateTLDs.pro b/util/network/cookiejar-generateTLDs/cookiejar-generateTLDs.pro deleted file mode 100644 index 9d5f1cf..0000000 --- a/util/network/cookiejar-generateTLDs/cookiejar-generateTLDs.pro +++ /dev/null @@ -1,9 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . - -QT = core - -# Input -SOURCES += main.cpp diff --git a/util/network/cookiejar-generateTLDs/main.cpp b/util/network/cookiejar-generateTLDs/main.cpp deleted file mode 100644 index 5cdc97c..0000000 --- a/util/network/cookiejar-generateTLDs/main.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -static QString utf8encode(const QByteArray &array) // turns e.g. tranøy.no to tran\xc3\xb8y.no -{ - QString result; - result.reserve(array.length() + array.length() / 3); - for (int i = 0; i < array.length(); ++i) { - char c = array.at(i); - // if char is non-ascii, escape it - if (c < 0x20 || uchar(c) >= 0x7f) { - result += "\\x" + QString::number(uchar(c), 16); - } else { - // if previous char was escaped, we need to make sure the next char is not - // interpreted as part of the hex value, e.g. "äc.com" -> "\xabc.com"; this - // should be "\xab""c.com" - QRegExp hexEscape("\\\\x[a-fA-F0-9][a-fA-F0-9]$"); - bool isHexChar = ((c >= '0' && c <= '9') || - (c >= 'a' && c <= 'f') || - (c >= 'A' && c <= 'F')); - if (result.contains(hexEscape) && isHexChar) - result += "\"\""; - result += c; - } - } - return result; -} - -int main(int argc, char **argv) { - - QCoreApplication app(argc, argv); - if (argc < 3) { - printf("\nusage: %s inputFile outputFile\n\n", argv[0]); - printf("'inputFile' should be a list of effective TLDs, one per line,\n"); - printf("as obtained from http://publicsuffix.org . To create indices and data file\n"); - printf("file, do the following:\n\n"); - printf(" wget http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 -O effective_tld_names.dat\n"); - printf(" grep '^[^\\/\\/]' effective_tld_names.dat > effective_tld_names.dat.trimmed\n"); - printf(" %s effective_tld_names.dat.trimmed effective_tld_names.dat.qt\n\n", argv[0]); - printf("Now copy the data from effective_tld_names.dat.qt to the file src/network/access/qnetworkcookiejartlds_p.h in your Qt repo\n\n"); - exit(1); - } - QFile file(argv[1]); - QFile outFile(argv[2]); - file.open(QIODevice::ReadOnly); - outFile.open(QIODevice::WriteOnly); - - QByteArray outIndicesBufferBA; - QBuffer outIndicesBuffer(&outIndicesBufferBA); - outIndicesBuffer.open(QIODevice::WriteOnly); - - QByteArray outDataBufferBA; - QBuffer outDataBuffer(&outDataBufferBA); - outDataBuffer.open(QIODevice::WriteOnly); - - int lineCount = 0; - while (!file.atEnd()) { - file.readLine(); - lineCount++; - } - file.reset(); - QVector strings(lineCount); - while (!file.atEnd()) { - QString s = QString::fromUtf8(file.readLine()); - QString st = s.trimmed(); - int num = qHash(st) % lineCount; - - QString utf8String = utf8encode(st.toUtf8()); - - // for domain 1.com, we could get something like - // a.com\01.com, which would be interpreted as octal 01, - // so we need to separate those strings with quotes - QRegExp regexpOctalEscape(QLatin1String("^[0-9]")); - if (!strings.at(num).isEmpty() && st.contains(regexpOctalEscape)) - strings[num].append("\"\""); - - strings[num].append(utf8String); - strings[num].append("\\0"); - } - - outIndicesBuffer.write("static const quint16 tldCount = "); - outIndicesBuffer.write(QByteArray::number(lineCount)); - outIndicesBuffer.write(";\n"); - outIndicesBuffer.write("static const quint16 tldIndices["); -// outIndicesBuffer.write(QByteArray::number(lineCount+1)); // not needed - outIndicesBuffer.write("] = {\n"); - - int utf8Size = 0; -// int charSize = 0; - for (int a = 0; a < lineCount; a++) { - bool lineIsEmpty = strings.at(a).isEmpty(); - if (!lineIsEmpty) { - strings[a].prepend("\""); - strings[a].append("\""); - } - int zeroCount = strings.at(a).count(QLatin1String("\\0")); - int utf8CharsCount = strings.at(a).count(QLatin1String("\\x")); - int quoteCount = strings.at(a).count('"'); - outDataBuffer.write(strings.at(a).toUtf8()); - if (!lineIsEmpty) - outDataBuffer.write("\n"); - outIndicesBuffer.write(QByteArray::number(utf8Size)); - outIndicesBuffer.write(",\n"); - utf8Size += strings.at(a).count() - (zeroCount + quoteCount + utf8CharsCount * 3); -// charSize += strings.at(a).count(); - } - outIndicesBuffer.write(QByteArray::number(utf8Size)); - outIndicesBuffer.write("};\n"); - outIndicesBuffer.close(); - outFile.write(outIndicesBufferBA); - - outDataBuffer.close(); - outFile.write("\nstatic const char tldData["); -// outFile.write(QByteArray::number(charSize)); // not needed - outFile.write("] = {\n"); - outFile.write(outDataBufferBA); - outFile.write("};\n"); - outFile.close(); - printf("data generated to %s . Now copy the data from this file to src/network/access/qnetworkcookiejartlds_p.h in your Qt repo\n", argv[2]); - exit(0); -} -- cgit v0.12 From 9face4b88de2db6f552149d2f96257620e971a59 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Tue, 24 May 2011 12:05:10 +0200 Subject: QUrl TLD: fix documentation file for "Add QUrl::topLevelDomain() ..." see previous commit Task-number: QTBUG-13601 --- src/corelib/io/qurltlds_p.h.INFO | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/corelib/io/qurltlds_p.h.INFO b/src/corelib/io/qurltlds_p.h.INFO index 57a8d0e..5781c2c 100644 --- a/src/corelib/io/qurltlds_p.h.INFO +++ b/src/corelib/io/qurltlds_p.h.INFO @@ -1,15 +1,15 @@ -The file qnetworkcookiejartlds_p.h is generated from the Public Suffix +The file qurltlds_p.h is generated from the Public Suffix List (see [1] and [2]), by the program residing at -util/network/cookiejar-generateTLDs in the Qt source tree. +util/corelib/qurl-generateTLDs in the Qt source tree. That program generates a character array and an index array from the list to provide fast lookups of elements within C++. -Those arrays in qnetworkcookiejartlds_p.h are derived from the Public +Those arrays in qurltlds_p.h are derived from the Public Suffix List ([2]), which was originally provided by Jo Hermans . -The file qnetworkcookiejartlds_p.h was last generated Friday, +The file qurltlds_p.h was last generated Friday, November 19th 15:24 2010. ---- -- cgit v0.12 From 3dcfbdc67b79944950ba7b24749e9d1642178bb1 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Wed, 25 May 2011 10:51:57 +0200 Subject: license header check: fix exception for URL TLD table the file was renamed and moved to corelib Task-number: QTBUG-13601 --- tests/auto/headers/tst_headers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/headers/tst_headers.cpp b/tests/auto/headers/tst_headers.cpp index 2686a00..335e832 100644 --- a/tests/auto/headers/tst_headers.cpp +++ b/tests/auto/headers/tst_headers.cpp @@ -177,7 +177,7 @@ void tst_Headers::allSourceFilesData() || sourceFile.endsWith("/src/corelib/global/qconfig.h") || sourceFile.endsWith("/src/corelib/global/qconfig.cpp") || sourceFile.endsWith("/src/tools/uic/qclass_lib_map.h") - || sourceFile.endsWith("src/network/access/qnetworkcookiejartlds_p.h") + || sourceFile.endsWith("src/corelib/io/qurltlds_p.h") ) continue; -- cgit v0.12 From e0bc5834ce26f91e60d8ca839f8a80ffd6f11c90 Mon Sep 17 00:00:00 2001 From: Shane Kearns Date: Wed, 18 May 2011 15:33:56 +0100 Subject: symbian socket engine: share ip address conversion code The helper function for converting TInetAddr -> QHostAddress is now used in qhostinfo_symbian.cpp as well. This should slightly improve performance by avoiding conversion to/from strings, and also remove some duplicated code. Reviewed-by: Markus Goetz --- src/network/kernel/qhostaddress_p.h | 5 +++++ src/network/kernel/qhostinfo_symbian.cpp | 21 ++++++--------------- src/network/kernel/qnetworkinterface_symbian.cpp | 4 +--- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/network/kernel/qhostaddress_p.h b/src/network/kernel/qhostaddress_p.h index 255d706..0349ff3 100644 --- a/src/network/kernel/qhostaddress_p.h +++ b/src/network/kernel/qhostaddress_p.h @@ -71,6 +71,11 @@ public: void setPrefixLength(QAbstractSocket::NetworkLayerProtocol proto, int len); }; +#ifdef Q_OS_SYMBIAN +class TInetAddr; +QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr); +#endif + QT_END_NAMESPACE #endif diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp index 042899d..86c157c 100644 --- a/src/network/kernel/qhostinfo_symbian.cpp +++ b/src/network/kernel/qhostinfo_symbian.cpp @@ -52,6 +52,7 @@ #include #include #include +#include // Header does not exist in the S60 5.0 SDK //#include @@ -152,23 +153,17 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer hostAddresses; TInetAddr hostAdd = nameResult().iAddr; - // 39 is the maximum length of an IPv6 address. - TBuf<39> ipAddr; - // Fill ipAddr with the IP address from hostAdd - hostAdd.Output(ipAddr); - if (ipAddr.Length() > 0) - hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr))); + if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) + hostAddresses.append(qt_QHostAddressFromTInetAddr(hostAdd)); // Check if there's more than one IP address linkd to this name while (hostResolver.Next(nameResult) == KErrNone) { hostAdd = nameResult().iAddr; - hostAdd.Output(ipAddr); // Ensure that record is valid (not an alias and with length greater than 0) - if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) { - hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr))); - } + if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) + hostAddresses.append(qt_QHostAddressFromTInetAddr(hostAdd)); } hostResolver.Close(); @@ -414,14 +409,10 @@ void QSymbianHostResolver::processNameResult() { if (iStatus.Int() == KErrNone) { TInetAddr hostAdd = iNameResult().iAddr; - // 39 is the maximum length of an IPv6 address. - TBuf<39> ipAddr; - - hostAdd.Output(ipAddr); // Ensure that record is valid (not an alias and with length greater than 0) if (!(iNameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) { - iHostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr))); + iHostAddresses.append(qt_QHostAddressFromTInetAddr(hostAdd)); } iState = EGetByName; diff --git a/src/network/kernel/qnetworkinterface_symbian.cpp b/src/network/kernel/qnetworkinterface_symbian.cpp index e7d3ca9..dca6cf4 100644 --- a/src/network/kernel/qnetworkinterface_symbian.cpp +++ b/src/network/kernel/qnetworkinterface_symbian.cpp @@ -67,10 +67,8 @@ static QNetworkInterface::InterfaceFlags convertFlags(const TSoInetInterfaceInfo return flags; } -//TODO: share this, at least QHostInfo needs to do the same thing -static QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr) +QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr) { - //TODO: do we want to call v4 mapped addresses v4 or v6 outside of this file? if (addr.IsV4Mapped() || addr.Family() == KAfInet) { //convert v4 host address return QHostAddress(addr.Address()); -- cgit v0.12 From a7cf6e27c9e31833991d61685d4dc5b8b5f777b7 Mon Sep 17 00:00:00 2001 From: Shane Kearns Date: Wed, 25 May 2011 14:46:01 +0100 Subject: Update bearer startup code in network autotests The bearer startup code I added to some of the network autotests to ensure the network was up before testing caused test failures on some linux configurations due to there being no default network defined. I've changed it to follow these steps: 1. update the configuration list & wait for update completed signal - due to the polling engines not having any config defined on the first run before the initial poll happens 2. check default configuration is valid before attempting to start it 3a. for valid configuration, start it and wait for started as before 3b. for invalid configuration, fail if bearer is mandatory, otherwise ignore - on symbian bearer use is "mandatory", on desktop platforms it is optional Reviewed-by: Markus Goetz --- tests/auto/networkselftest/tst_networkselftest.cpp | 15 +++++++++++---- .../tst_qabstractnetworkcache.cpp | 15 +++++++++++---- tests/auto/qftp/tst_qftp.cpp | 21 +++++++++++++++++---- tests/auto/qhostinfo/tst_qhostinfo.cpp | 16 +++++++++++----- .../qnetworkinterface/tst_qnetworkinterface.cpp | 15 +++++++++++---- tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 15 +++++++++++---- tests/auto/qtcpserver/tst_qtcpserver.cpp | 19 +++++++++++++++---- tests/auto/qudpsocket/tst_qudpsocket.cpp | 15 +++++++++++---- 8 files changed, 98 insertions(+), 33 deletions(-) diff --git a/tests/auto/networkselftest/tst_networkselftest.cpp b/tests/auto/networkselftest/tst_networkselftest.cpp index c21fd03..b2ce5ca 100644 --- a/tests/auto/networkselftest/tst_networkselftest.cpp +++ b/tests/auto/networkselftest/tst_networkselftest.cpp @@ -371,11 +371,18 @@ void tst_NetworkSelfTest::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp index e4372c5..aefe0b9 100644 --- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp +++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp @@ -141,11 +141,18 @@ void tst_QAbstractNetworkCache::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qftp/tst_qftp.cpp b/tests/auto/qftp/tst_qftp.cpp index 1fa0787..7e431cf 100644 --- a/tests/auto/qftp/tst_qftp.cpp +++ b/tests/auto/qftp/tst_qftp.cpp @@ -155,6 +155,7 @@ private: QFtp *ftp; #ifndef QT_NO_BEARERMANAGEMENT + QNetworkConfigurationManager *netConfMan; QSharedPointer networkSessionExplicit; QSharedPointer networkSessionImplicit; #endif @@ -225,10 +226,20 @@ void tst_QFtp::initTestCase_data() void tst_QFtp::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT - QNetworkConfigurationManager manager; - networkSessionImplicit = QSharedPointer(new QNetworkSession(manager.defaultConfiguration())); - networkSessionImplicit->open(); - QVERIFY(networkSessionImplicit->waitForOpened(60000)); //there may be user prompt on 1st connect + netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QNetworkConfiguration networkConfiguration = netConfMan->defaultConfiguration(); + if (networkConfiguration.isValid()) { + networkSessionImplicit = QSharedPointer(new QNetworkSession(networkConfiguration)); + if (!networkSessionImplicit->isOpen()) { + networkSessionImplicit->open(); + QVERIFY(networkSessionImplicit->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); + } #endif } @@ -254,6 +265,8 @@ void tst_QFtp::init() } #ifndef QT_NO_BEARERMANAGEMENT if (setSession) { + if (!networkSessionImplicit) + QSKIP("test requires a valid default network configuration", SkipSingle); networkSessionExplicit = networkSessionImplicit; if (!networkSessionExplicit->isOpen()) { networkSessionExplicit->open(); diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp index 93c08cd..2fa5e76 100644 --- a/tests/auto/qhostinfo/tst_qhostinfo.cpp +++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp @@ -197,13 +197,19 @@ tst_QHostInfo::~tst_QHostInfo() void tst_QHostInfo::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT - //start the default network netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif diff --git a/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp b/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp index ae3436d..2077717 100644 --- a/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp +++ b/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp @@ -89,11 +89,18 @@ void tst_QNetworkInterface::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index c70075f..97ffead 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -1283,11 +1283,18 @@ void tst_QNetworkReply::initTestCase() #endif #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qtcpserver/tst_qtcpserver.cpp b/tests/auto/qtcpserver/tst_qtcpserver.cpp index 3416a7c..a7c2604 100644 --- a/tests/auto/qtcpserver/tst_qtcpserver.cpp +++ b/tests/auto/qtcpserver/tst_qtcpserver.cpp @@ -116,6 +116,7 @@ private slots: private: #ifndef QT_NO_BEARERMANAGEMENT QNetworkSession *networkSession; + QNetworkConfigurationManager *netConfMan; #endif }; @@ -154,10 +155,20 @@ void tst_QTcpServer::initTestCase_data() void tst_QTcpServer::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT - QNetworkConfigurationManager man; - networkSession = new QNetworkSession(man.defaultConfiguration(), this); - networkSession->open(); - QVERIFY(networkSession->waitForOpened()); + netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QNetworkConfiguration networkConfiguration = netConfMan->defaultConfiguration(); + if (networkConfiguration.isValid()) { + networkSession = new QNetworkSession(networkConfiguration); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); + } #endif } diff --git a/tests/auto/qudpsocket/tst_qudpsocket.cpp b/tests/auto/qudpsocket/tst_qudpsocket.cpp index 9ca049b..a38082e 100644 --- a/tests/auto/qudpsocket/tst_qudpsocket.cpp +++ b/tests/auto/qudpsocket/tst_qudpsocket.cpp @@ -148,11 +148,18 @@ void tst_QUdpSocket::initTestCase_data() #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession = QSharedPointer(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession = QSharedPointer(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } -- cgit v0.12 From dd33e048451ffc5420adbca9f30dba65f5dcf5e2 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Wed, 25 May 2011 15:05:35 +0200 Subject: Added some of my Qt 4.8 changes to the changelog Change-Id: I8913c88e5bd68145e0587d51ee9896fd5d21054a Reviewed-on: http://codereview.qt.nokia.com/140 Reviewed-by: Olivier Goffart (cherry picked from commit bc7ea289ea84dcff22aeea78c01a5447ccf076f7) --- dist/changes-4.8.0 | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/dist/changes-4.8.0 b/dist/changes-4.8.0 index b8cc626..1703633 100644 --- a/dist/changes-4.8.0 +++ b/dist/changes-4.8.0 @@ -39,12 +39,29 @@ QtCore - Removed support for QT_NO_THREAD define for QHostInfo. - Optimized plugin loading on ELF platforms. Print failure reason at runtime with QT_DEBUG_PLUGINS=1 in environment. + - QMutexLocker: improved performence of the non contended case by inlining some function + - QThreadStorage: Added possibility to store object by value instead of by pointer [QTBUG-15033] + - QThread: fixed few race conditions [QTBUG-17257, QTBUG-15030] + - QtConcurrent: added support for c++0x lambda in few functions + - QObject: Improved performence of the signal activation + - QObject: added ways to connect signals using QMetaMethod + - QObject: deprecated qFindChild and qFindChildren + - QObject: optimize constructions and destruction of objects + - QObject: Qt::BlockingQueuedConnection can handle the return value [QTBUG-10440] + - QList/QVector/QStringList: added C++0x initilizer lists constructors. + - QVarLenghtArray: added method for consistency with QVector + - QStringBuilder: added support for QByteArray + - qSwap now uses std::swap, specialized std::swap for our container to work better with stl algoritms + - QVariant: deprecated global function qVariantSetValue, qVariantValue, qVariantCanConvert, qVariantFromValue QtGui ----- - QTabBar: reduced minimumSizeHint if ElideMode is set. - QComboBox: Fixed a color propagation issue with the lineedit. [QTBUG-5950] + - Deprecate qGenericMatrixFromMatrix4x4 and qGenericMatrixToMatrix4x4 + - QListView diverses optimisations [QTBUG-11438] + - QTreeWidget/QListWidget: use localeAwareCompare for string comparisons [QTBUG-10839] QtOpenGL -------- @@ -54,6 +71,10 @@ QtGui - Including will not work in combination with GLEW, as QGLFunctions will undefine GLEW's defines. +QtScript +-------- + - Deprecated qScriptValueFromQMetaObject, qScriptValueToValue, qScriptValueFromValue + **************************************************************************** * Database Drivers * @@ -136,6 +157,7 @@ Qt for Windows CE - qtconfig + * removed Qt3support dependency - qt3to4 -- cgit v0.12